<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[ghostlpx的博客]]></title><description><![CDATA[爱智求真]]></description><link>https://blog.youkuaiyun.com/ghostlpx</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; ghostlpx]]></copyright><item><title><![CDATA[系统日志方案调研]]></title><link>https://blog.youkuaiyun.com/ghostlpx/article/details/123089380</link><guid>https://blog.youkuaiyun.com/ghostlpx/article/details/123089380</guid><author>ghostlpx</author><pubDate>Wed, 23 Feb 2022 14:31:22 +0800</pubDate><description><![CDATA[1.日志的价值

首先，要明确为什么要保留日志，有了清晰的价值目标，就是有了统一的行动纲领。

如同记账本，记录每天开销，以备日后查阅统计。

记录系统日志，可以帮助我们记录应用每时每刻的运行情况，方便系统在产生故障时快速定位问题；

以及更进一步，把零散的日志收集起来，数据量大了，就能发现日志数据的规律和价值。

2. 日志基本要素

日志分级
	日志分类
	日志落盘
还是拿记账举例：

大额支出，如买房买车；小额支出，如买菜买彩票。支出额度不同，意义不同。日志也一样，「debug」、「warn」和「er]]></description><category></category></item><item><title><![CDATA[js 的异步并发控制]]></title><link>https://blog.youkuaiyun.com/ghostlpx/article/details/106431837</link><guid>https://blog.youkuaiyun.com/ghostlpx/article/details/106431837</guid><author>ghostlpx</author><pubDate>Fri, 29 May 2020 19:51:51 +0800</pubDate><description><![CDATA[一个极端业务场景引发的思考
在业务开发过程中，我们经常会遇到多个异步任务并发执行的情况，待所有异步任务结束之后再执行我们的业务逻辑。
通常情况下，我们会采用 ES6 标准下的Promise.all([promise1, promise2, promise3,...]).then( )方法来应对这样的场景需求，
Promise.all 可以保证，promises 数组中所有 promise 对象都达到 resolve 状态，才执行 then 回调。
这样的 promise 对象可能是你发出的 http 请求，]]></description><category></category></item><item><title><![CDATA[你知道JavaScript的继承有几种写法吗？]]></title><link>https://blog.youkuaiyun.com/ghostlpx/article/details/81428168</link><guid>https://blog.youkuaiyun.com/ghostlpx/article/details/81428168</guid><author>ghostlpx</author><pubDate>Sun, 05 Aug 2018 11:26:23 +0800</pubDate><description><![CDATA[标题的灵感来源于鲁迅的小说《孔乙己》中孔乙己和小伙计的一段对话：“茴香豆的茴字，怎样写的？......回字有四样写法，你知道么？”

这里我们并不探讨封建制度下穷苦潦倒的读书人的迂腐，回字的几种写法留给汉语言的同学去研究吧，今天我们讨论JavaScript继承的几种写法，由浅入深，一层层剥开她的面纱，最后给出一个最佳实践。

一、通过构造函数实现继承


function Parent() {
 ...]]></description><category></category></item><item><title><![CDATA[flex布局中flex属性初探]]></title><link>https://blog.youkuaiyun.com/ghostlpx/article/details/81157456</link><guid>https://blog.youkuaiyun.com/ghostlpx/article/details/81157456</guid><author>ghostlpx</author><pubDate>Sun, 22 Jul 2018 20:58:00 +0800</pubDate><description><![CDATA[终于有了一个闲暇的周末，仔细研究了一下阮大神的两篇关于flex的文章。虽然之前对flex也有使用，但都浮于实现简单业务层面，内心始终对flex怀有敬畏。下面就粗陋地聊一聊今天的收获。

这里想单独说说flex属性，这是一个复合属性，包括flex-grow flex-shrink flex-basis，

1、flex: auto，即flex: 1 1 auto

2、flex: none，即fle...]]></description><category></category></item><item><title><![CDATA[JS找出数组中唯一不同的数]]></title><link>https://blog.youkuaiyun.com/ghostlpx/article/details/80242932</link><guid>https://blog.youkuaiyun.com/ghostlpx/article/details/80242932</guid><author>ghostlpx</author><pubDate>Tue, 08 May 2018 17:29:27 +0800</pubDate><description><![CDATA[一个数组中只有一个数是唯一的，其他数都是成对出现，找出这个唯一的数。

分析：由于位运算符异或运算的特点，即两个相同的数进行异或运算时，其结果为0，所以当将数组中所有的元素进行异或运算时，其结果必定为那个唯一的数。代码如下：


// 判断数组中是否有唯一值
function findOnly(arr) {
  let result = 0;
  arr.forEach((i) =&amp;gt; {
 ...]]></description><category></category></item><item><title><![CDATA[如何形象地解释 JavaScript 中 map、foreach、reduce 间的区别？]]></title><link>https://blog.youkuaiyun.com/ghostlpx/article/details/79374364</link><guid>https://blog.youkuaiyun.com/ghostlpx/article/details/79374364</guid><author>ghostlpx</author><pubDate>Mon, 26 Feb 2018 10:47:27 +0800</pubDate><description><![CDATA[本答案来自于知乎高赞回答@水乙，原帖地址。对我启发很大，特摘录至此，以作备忘和分享。如下：]]></description><category></category></item><item><title><![CDATA[Windows7下MongoDB的下载、安装与配置详解]]></title><link>https://blog.youkuaiyun.com/ghostlpx/article/details/78710429</link><guid>https://blog.youkuaiyun.com/ghostlpx/article/details/78710429</guid><author>ghostlpx</author><pubDate>Mon, 04 Dec 2017 17:15:31 +0800</pubDate><description><![CDATA[最近在写一个项目，想用MongoDB做后台数据库，却不想在安装和启动MongoDB的过程中遇到了小困难，在此贴出遇到的问题和解决方法，以作备忘和分享。我使用的是64位的Windows7旗舰版系统，所以以下都是关于Windows下的经验，使用Linux和Mac的朋友可以撤了。


一、Windows7下的运行库问题
虽然这个问题属于个例，但我觉得也有必要拿出来说说，保不齐你新装的系统就存在运]]></description><category></category></item><item><title><![CDATA[JavaScript 风格指南（4）]]></title><link>https://blog.youkuaiyun.com/ghostlpx/article/details/76585784</link><guid>https://blog.youkuaiyun.com/ghostlpx/article/details/76585784</guid><author>ghostlpx</author><pubDate>Wed, 02 Aug 2017 18:36:57 +0800</pubDate><description><![CDATA[-- 接 JavaScript 风格指南（3） --


八、Arrow Functions


· 8.1 当你必须使用函数表达式（如传递匿名函数时），请使用箭头函数表示法。



理由：this 的执行上下文不会改变，写法也更简洁。

// bad
[1, 2, 3].map(function (x) {
  const y = x + 1;
  return x *]]></description><category></category></item><item><title><![CDATA[JavaScript 风格指南（3）]]></title><link>https://blog.youkuaiyun.com/ghostlpx/article/details/76461000</link><guid>https://blog.youkuaiyun.com/ghostlpx/article/details/76461000</guid><author>ghostlpx</author><pubDate>Mon, 31 Jul 2017 19:08:16 +0800</pubDate><description><![CDATA[-- 接 JavaScript 风格指南（2） --


七、Functions


· 7.1 使用命名函数表达式，而不是函数声明




理由：函数声明提升会导致在函数定义之前就已经可以引用该函数了，这会损害可读性和可维护性。如果想要定义的函数很复杂，复杂到会干扰理解代码的其余部分，应该考虑将其解压缩到自己的模块中了！不要忘记给表达式命名——匿名函数不利于错误的定位。
]]></description><category></category></item><item><title><![CDATA[JavaScript 风格指南（2）]]></title><link>https://blog.youkuaiyun.com/ghostlpx/article/details/76271028</link><guid>https://blog.youkuaiyun.com/ghostlpx/article/details/76271028</guid><author>ghostlpx</author><pubDate>Fri, 28 Jul 2017 18:26:46 +0800</pubDate><description><![CDATA[--接 JavaScript风格指南（1） --


四、Arrays


· 4.1 使用字面量的方式创建数组
// bad
const items = new Array();

// good
const items = [];
· 4.2 不要使用直接赋值的方式为数组添加新成员，而是使用 push() 方法
const someStack = [];

// bad
so]]></description><category></category></item><item><title><![CDATA[SVN分支/合并原理及最佳实践]]></title><link>https://blog.youkuaiyun.com/ghostlpx/article/details/75411038</link><guid>https://blog.youkuaiyun.com/ghostlpx/article/details/75411038</guid><author>ghostlpx</author><pubDate>Wed, 19 Jul 2017 16:36:19 +0800</pubDate><description><![CDATA[使用svn几年了，一直对分支和合并敬而远之，一来是因为分支的管理不该我操心，二来即使涉及到分支的管理，也不敢贸然使用合并功能，生怕合并出了问题对团队造成不良影响，最主要的原因是，自己对分支的目的和合并的方法不甚了解，这才是硬伤。


最近由于适配机型的需要（本人从事手机客户端的开发），需要经常接触分支和合并两项工作，突然发现这玩意整不明白很难开展工作，遂这两天着重研究了一下，有点收获，怕以后]]></description><category></category></item><item><title><![CDATA[JavaScript 风格指南（1）]]></title><link>https://blog.youkuaiyun.com/ghostlpx/article/details/74981738</link><guid>https://blog.youkuaiyun.com/ghostlpx/article/details/74981738</guid><author>ghostlpx</author><pubDate>Tue, 11 Jul 2017 17:34:05 +0800</pubDate><description><![CDATA[一、Types


· 1-1 基本类型：当你使用基本类型的数据时，只关注它的值就可以了


stringnumberbooleanundefinednull
const foo = 1;
let bar = foo;

bar = 9;

console.log(foo, bar); // => 1, 9
· 1-2 复杂类型：当使用复杂类型的数据时，需要关注对值的引用]]></description><category></category></item><item><title><![CDATA[图解CommonJS、AMD、CMD规范]]></title><link>https://blog.youkuaiyun.com/ghostlpx/article/details/73921989</link><guid>https://blog.youkuaiyun.com/ghostlpx/article/details/73921989</guid><author>ghostlpx</author><pubDate>Thu, 29 Jun 2017 18:19:34 +0800</pubDate><description><![CDATA[捋一捋JavaScript开发中的模块规范，为了方便描述和理解，作图说明：






参考文章：
阮一峰博客：Javascript模块化编程
简书：浅析JS模块规范：AMD，CMD，CommonJS]]></description><category></category></item><item><title><![CDATA[利用CSS3画三角形（另附百度笔试题）]]></title><link>https://blog.youkuaiyun.com/ghostlpx/article/details/73468860</link><guid>https://blog.youkuaiyun.com/ghostlpx/article/details/73468860</guid><author>ghostlpx</author><pubDate>Mon, 19 Jun 2017 17:12:14 +0800</pubDate><description><![CDATA[一、原理
CSS3画三角形的原理十分简单，利用到的属性无非几种：width、height、content、border。
拿一个矩形举例：



	
	Document
	
		#pentagon {
			width: 0;
			height: 0;
			content: '';
			border: 50px solid red;
		}
	


	

显示效果：


问题来了]]></description><category></category></item><item><title><![CDATA[git+gerrit开发配置方法入门]]></title><link>https://blog.youkuaiyun.com/ghostlpx/article/details/53515619</link><guid>https://blog.youkuaiyun.com/ghostlpx/article/details/53515619</guid><author>ghostlpx</author><pubDate>Thu, 08 Dec 2016 11:12:09 +0800</pubDate><description><![CDATA[一、利用git生成ssh密钥



1、首先配置用户名和邮箱地址

git config --global user.name your_name
git config --global user.email your_email

2、查看是否已经生成了ssh密钥
cd ~/.ssh
如果没有密钥则不会有此文件，若是有密钥则删除，等待下一步重新生成密钥


3、生成密钥]]></description><category></category></item><item><title><![CDATA[window下history对象备忘]]></title><link>https://blog.youkuaiyun.com/ghostlpx/article/details/52807796</link><guid>https://blog.youkuaiyun.com/ghostlpx/article/details/52807796</guid><author>ghostlpx</author><pubDate>Thu, 13 Oct 2016 16:17:01 +0800</pubDate><description><![CDATA[history是window对象的属性，它保存着用户上网的历史记录，出于安全方面的考虑，开发人员无法得知用户浏览过的URL。不过，借助用户访问过的页面列表，同样可以在不知道实际URL的情况下实现后退和前进。
一、HTML5 之间的 history 
history有如下方法：


history.go()history.forward()history.back()
    除了上述几]]></description><category></category></item><item><title><![CDATA[如何理解AngularJS中的依赖注入]]></title><link>https://blog.youkuaiyun.com/ghostlpx/article/details/52751344</link><guid>https://blog.youkuaiyun.com/ghostlpx/article/details/52751344</guid><author>ghostlpx</author><pubDate>Fri, 07 Oct 2016 19:31:06 +0800</pubDate><description><![CDATA[AngularJS最容易引起混淆的特性之一就是依赖注入（DI）。可能很难理解到底什么是依赖注入，它如何工作，以及为什么它是有用的。
    先从理解依赖注入打算要解决的问题开始。一个AngularJS应用程序中的一些组件可能会依赖于其它组件，例如，控制器需要使用 $scope 组件，使得控制器可以向视图传递数据，即控制器依赖于 $scope 组件来执行工作。

	...
	myApp.cont]]></description><category></category></item><item><title><![CDATA[图解animation-fill-mode属性]]></title><link>https://blog.youkuaiyun.com/ghostlpx/article/details/52734422</link><guid>https://blog.youkuaiyun.com/ghostlpx/article/details/52734422</guid><author>ghostlpx</author><pubDate>Tue, 04 Oct 2016 16:45:18 +0800</pubDate><description><![CDATA[animation-fill-mode用来规定对象在动画时间之外的状态，它有4个值：


none 不改变默认行为backwords 在animation-delay时间内，在动画开始之前，应用开始属性值（在第一个关键帧中定义的那个值）forwords 当动画完成后，保持最后一个属性值（在最后一个关键帧中定义的那个值）both 向前和向后填充模式都被使用
    举例说明：]]></description><category></category></item><item><title><![CDATA[再次深入理解闭包]]></title><link>https://blog.youkuaiyun.com/ghostlpx/article/details/52727611</link><guid>https://blog.youkuaiyun.com/ghostlpx/article/details/52727611</guid><author>ghostlpx</author><pubDate>Mon, 03 Oct 2016 12:14:47 +0800</pubDate><description><![CDATA[之前写过一篇关于闭包的文字，当时觉得对闭包已经掌握到目无全牛的程度——直到我看到这篇博文：大部分人都会做错的经典JS闭包面试题。
    我觉得我应该重新审视闭包这个概念，以及一些之前了解不够细致的JavaScript细节。下面是我抽取出来的一些容易被忽略的概念以及我的思考。


1.JS中有几种函数
    首先，在此之前需要了解的是，在JS中函数可以分为两种，具名函数（命名函数）和匿]]></description><category></category></item><item><title><![CDATA[浏览器兼容性问题备忘]]></title><link>https://blog.youkuaiyun.com/ghostlpx/article/details/52608738</link><guid>https://blog.youkuaiyun.com/ghostlpx/article/details/52608738</guid><author>ghostlpx</author><pubDate>Wed, 21 Sep 2016 15:36:22 +0800</pubDate><description><![CDATA[关于要不要兼容IE678，其实这就看业务需求了。比如有的企业，像电商类的，他们不想流失掉使用老版本IE的用户，因为流失用户就代表着流失金钱，所以他们必须要兼容IE678。我个人认为，从一个前端开发者的角度出发，掌握浏览器间的兼容性问题解决办法是生存所需，没啥可说的。    
    由于刚刚IETester崩溃（如果不想折腾IETester，而已用VirtualBox装个虚拟机，在接近原生的环境]]></description><category></category></item></channel></rss>