<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Programming &#8211; 悠然居</title>
	<atom:link href="https://wordpress.youran.me/category/programming/feed/" rel="self" type="application/rss+xml" />
	<link>https://wordpress.youran.me</link>
	<description>极客技术博客</description>
	<lastBuildDate>Wed, 26 Oct 2016 05:14:07 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.4.8</generator>
	<item>
		<title>Javascript作用域及变量提升</title>
		<link>https://wordpress.youran.me/javascript-scoping-and-hoisting/</link>
					<comments>https://wordpress.youran.me/javascript-scoping-and-hoisting/#respond</comments>
		
		<dc:creator><![CDATA[youran]]></dc:creator>
		<pubDate>Mon, 24 Oct 2016 17:15:48 +0000</pubDate>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[hoisting]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[scoping]]></category>
		<guid isPermaLink="false">https://wordpress.youran.me/?p=673</guid>

					<description><![CDATA[因为javascript没有块级作用域（即if, for包裹的区域）的概念，在函数和变量的定义和使用中，可能会出现令人迷惑的结果。本文就js作用域和变量提升这两个话题，做一番讲解。 PS: ES6标准引入了let关键字，用它声明的变量，具有块级作用域。并且在ES6中，花括号{}内部就是一个块级作用域。 在Javascript中，名称(变量或函数)进入作用域的基本方式有以下4种： 1. 所有作用域内，都存在 this 和 arguments 这两个变量 2. 给函数指定的参数，参数名会自动包含在函数的作用域内 3. 函数的声明。如 function X() {} 4. 变量的声明。如 var Y; 重点来了，这4种类型的名称，会按照上述的优先级，被javascript引擎移动到它们所在的作用域（如函数内）的顶端。这就是所谓的“变量提升”。 下面让我们用实例讲解上面这段话的含义。 首先是变量声明。下面的函数A()其实会被js引擎解释为函数B()的形式： function A() { bar(); var x = 1; } function &#8230;]]></description>
		
					<wfw:commentRss>https://wordpress.youran.me/javascript-scoping-and-hoisting/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>z-index和event bubbling</title>
		<link>https://wordpress.youran.me/z-index-and-event-bubbling/</link>
					<comments>https://wordpress.youran.me/z-index-and-event-bubbling/#respond</comments>
		
		<dc:creator><![CDATA[youran]]></dc:creator>
		<pubDate>Mon, 17 Oct 2016 15:48:15 +0000</pubDate>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[event bubbling]]></category>
		<category><![CDATA[z-index]]></category>
		<guid isPermaLink="false">https://wordpress.youran.me/?p=664</guid>

					<description><![CDATA[前几天调查一个前端的bug，最终结果是和z-index及event bubbling有关，正好有段时间没写博客了，就此机会将问题的分析和解决过程记录下来，顺便回顾一下这两个知识点吧！ 先贴参考资料: [1] https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context [2] https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Positioning/Understanding_z_index/Stacking_and_float [3] http://www.quirksmode.org/js/events_order.html 1、bug的背景和现象 某设备的远程web访问页面，用户在载入页面或者进行操作后，会先出现如下图所示的&#8221;动作进行中&#8221;的画面——一个全屏的modal window覆盖在下方的画面上，中间的圆圈转啊转： 页面载入完成、或动作完成后，modal window消失，下方的页面显示出来： 发现的问题是，当用户在转圈页面闲着无聊不停点击右上角的&#8221;Login&#8221;按钮时，有时候会发现浏览器报javascript错误，位置是在按钮的mouseup事件处理函数里，错误内容是访问了一个null变量，但此变量理论上应该在之前的mousedown事件里已经初始化了。而且此问题不是100%重现，有时候报错有时候却不报。 2、问题分析和解决 凭直觉认为是右上角那个button的mousedown事件没有被触发，变量没有初始化，因此后面的mouseup事件处理函数里，访问到了null变量。那么为什么现象不是100%重现呢？此时怀疑只有modal window尚在表示的时候按下鼠标左键，modal window消失后松开鼠标左键的时候，才会报错。因为这种情况下，mouseup事件有可能被modal window捕获到，并且没有传到button处，所以前者只触发了mousedown，后者只触发了mouseup。 为了验证这个猜想，特地给modal window和button的鼠标事件打了event.timeStamp的log，确定事件的发生次序和目标元素。结果果然不出所料： 在js出错前，modal window只有mousedown，button(上图中的contextmenu)只有mouseup！ 另外还发现在modal window表示期间按下鼠标，消失后松开鼠标，100%会报js错误，这也从侧面证明了猜想的正确。 知道问题就好解决了，只要在button的mouseup事件处理函数里，判一下那个变量是否为null，是的话赋个初值即可。 3.知其然，知其所以然 如果为了应付工作，做到上面已经足够了。但是作为一个有追求的程序员，这里肯定是要知道为什么button的mousedown事件没有被触发。因此，下面一起重温一下与此有关的z-index和event bubbling（事件冒泡）知识吧！ 先轮到z-index出场。根据MDN上的资料[1]，满足下述任一条件的DOM元素，都会在它们的所在位置形成一个&#8221;stacking context (层叠上下文)&#8221;： ○ html标签 &#8230;]]></description>
		
					<wfw:commentRss>https://wordpress.youran.me/z-index-and-event-bubbling/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>几段黄牛脚本</title>
		<link>https://wordpress.youran.me/scripts-for-yellowbull/</link>
					<comments>https://wordpress.youran.me/scripts-for-yellowbull/#respond</comments>
		
		<dc:creator><![CDATA[youran]]></dc:creator>
		<pubDate>Sat, 20 Aug 2016 16:56:05 +0000</pubDate>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[nodejs]]></category>
		<category><![CDATA[yellowbull]]></category>
		<guid isPermaLink="false">https://wordpress.youran.me/?p=650</guid>

					<description><![CDATA[剁手族有一个共同特点，就是爱贪便宜，看到性价比高的东西就忍不住买买买。因此最痛苦的莫过于错过了期待已久的促销活动。黄牛也是一样，不搞个自动化脚本抢货，怎么能算是合格的黄牛？前段时间抢Kimsufi独服的时候，使用了第三方的监视网站，尝到了点甜头，加之自己在其他网站也有类似的需求，因此自己写了两段脚本，实现有货时实时推送手机通知，从此站在黄牛第一线！ 先给脚本地址： https://github.com/youran/yellowbull 分别实现了get和post方式的轮询。对应的服务是Kimsufi的独服和BudgetNode的VPS，很容易改造成对应其他服务。 因为使用了ES6语法，需要Nodejs 6.x以上版本才可运行。 脚本很简单，不再分析代码了。只说几点使用事项。 GET版本适用于最简单的场景，即不停地刷订单页面，直至出现特定文字。这里选择了Kimsufi有货时候的&#8221;I would appreciate delivery&#8221;，如下图： GET请求里的那些header数据，可以事先使用浏览器访问一下那个url后取得。 POST版本则是用于测试优惠码是否可用。 这里以最近BudgetNode的双倍硬盘空间优惠为例，首先通过他们的订购链接到达shopping cart页面，在这里可以应用优惠码。这时先打开浏览器的F12工具，然后填入DOUBLEDISK这个优惠码，点击Validate Code按钮后，可以看到优惠码正常生效了： 看看刚才的POST请求： 主要关注&#8221;cookie&#8221;，&#8221;origin&#8221;，&#8221;referer&#8221;这些http header，以及post body。在我们的黄牛代码里也要复制这些数据，以模拟浏览器刚才的请求。 最后，这里使用了pushbullet这个多平台推送软件。它提供了一个API，可以通过这个api将数据实时推送到你的设备上。 为此需要先登录到pushbullet，在后台设置选项里，创建自己的access token： 然后将生成的值拷贝到代码里的token变量中。 检测到有货时候的手机通知如下图： Todo: 自动下单功能。这个因为每个服务都不一样，没有通用性，等有兴致的时候再说吧。 本文为悠然居(https://wordpress.youran.me/)的原创文章，转载请注明出处！]]></description>
		
					<wfw:commentRss>https://wordpress.youran.me/scripts-for-yellowbull/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>A simple RESTful web service in nodejs (3)</title>
		<link>https://wordpress.youran.me/a-simple-restful-web-service-in-nodejs-3/</link>
					<comments>https://wordpress.youran.me/a-simple-restful-web-service-in-nodejs-3/#respond</comments>
		
		<dc:creator><![CDATA[youran]]></dc:creator>
		<pubDate>Sat, 02 Apr 2016 15:50:37 +0000</pubDate>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[ffmpeg]]></category>
		<category><![CDATA[nodejs]]></category>
		<guid isPermaLink="false">https://wordpress.youran.me/?p=623</guid>

					<description><![CDATA[wget.js完成后，只剩下最后一步了：视频文件的转码与合并。ffmpeg的安装就不赘述了，我是根据ffmpeg官网上的教程一步步编译安装的。用yum或者apt-get方式应该也行，就是版本可能没有那么新。 这个进程的主要功能是把flv等格式的视频，转换成标准mp4视频，并且合并成一个文件。一般来说，flv的视频编码和mp4同是h264,而音频编码往往不一致。所以flv转mp4大部分情况下可以直接copy视频流，只需要转换音频流。像B站那种，经常flv连音频流也是aac的，那就更简单了，只换个container就行。 可以借用下面两张图片直观地说明一下： 一开始其实想用exec()直接通过linux命令行执行ffmpeg各种命令的，但是不好处理执行结果的返回以及和主进程的状态通信，所以还是用了一个叫node-fluent-ffmpeg的module，它提供了一层API方便调用(但是用下来感觉并不方便&#8230;)，最重要的是可以从主进程fork()了。 注意fluent-ffmpeg有个问题，即当你没有使用ffmpeg默认的audio encoder，而是使用libfdk_aac这种的话，输出音频质量设定的参数名是不一样的！这样就造成了.audioQuality()方法不起作用，因为那里是写死了用&#8221;-aq&#8221;的。详情见一则Github的issue。 解决方案有两个，一是把fluent-ffmpeg代码中lib/options/audio.js的下面这行 this._currentOutput.audio('-aq', quality); 改成 this._currentOutput.audio('-vbr', quality); 或者不用.audioQuality()，直接用.outputOptions()来指定相应参数。我这里选择前者。 下面开始正题。首先还是从server.js取得参数，这次是已下载的视频文件路径信息(server.js向ffmpeg.js传递了俩参数，id和视频数量)。 var ffmpeg = require('fluent-ffmpeg'); var myArgs = process.argv.slice(2); var taskId = myArgs[0]; var num = myArgs[1]; var curDir = './tasks/' + &#8230;]]></description>
		
					<wfw:commentRss>https://wordpress.youran.me/a-simple-restful-web-service-in-nodejs-3/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>A simple RESTful web service in nodejs (2)</title>
		<link>https://wordpress.youran.me/a-simple-restful-web-service-in-nodejs-2/</link>
					<comments>https://wordpress.youran.me/a-simple-restful-web-service-in-nodejs-2/#respond</comments>
		
		<dc:creator><![CDATA[youran]]></dc:creator>
		<pubDate>Sat, 02 Apr 2016 15:50:30 +0000</pubDate>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[nodejs]]></category>
		<category><![CDATA[wget]]></category>
		<guid isPermaLink="false">https://wordpress.youran.me/?p=622</guid>

					<description><![CDATA[书接上回。完成了server.js，这次轮到子进程wget.js了。wget.js比较简单，只是调用wget-improved module的方法，处理下message就行了。 var wget = require('wget-improved'); // retrieve arguments from parent process var myArgs = process.argv.slice(2); var url = myArgs[0]; var path = './tasks/' + myArgs[1] + '-' + myArgs[2] + '.tmp'; var options = &#8230;]]></description>
		
					<wfw:commentRss>https://wordpress.youran.me/a-simple-restful-web-service-in-nodejs-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>A simple RESTful web service in nodejs (1)</title>
		<link>https://wordpress.youran.me/a-simple-restful-web-service-in-nodejs-1/</link>
					<comments>https://wordpress.youran.me/a-simple-restful-web-service-in-nodejs-1/#respond</comments>
		
		<dc:creator><![CDATA[youran]]></dc:creator>
		<pubDate>Sat, 02 Apr 2016 15:50:20 +0000</pubDate>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[nodejs]]></category>
		<category><![CDATA[restful]]></category>
		<category><![CDATA[videomerger]]></category>
		<guid isPermaLink="false">https://wordpress.youran.me/?p=620</guid>

					<description><![CDATA[这段时间突然对nodejs有点兴趣，虽然之前完全没有接触过，不过本着实践出真知的精神，四处查阅资料，做出了一个小轮子——videomerger，接收数个视频文件的url，在服务器端下载后合并(以及可能的转码)，然后把合并后文件的链接返回给用户下载。配合分析各种视频网站真实下载地址的脚本，可以实现用户输入视频播放地址后，得到合并后的单文件视频下载(类似clipconverter.cc)。 做的东西时间长了容易忘掉，于是写个文章帮助记忆，也分享一下思路。 代码已开源： https://github.com/youran/videomerger 代码写得很随意，基本功能实现了就好，等我有兴致了再整整。轮子再破也是轮子嘛，哈哈。 如果有什么问题、建议或者发现bug，可以在Github上发issue讨论。 首先是服务器环境的搭建： 安装nodejs。这里选择从官网直接下载二进制包安装： # wget http://nodejs.org/dist/latest-v0.12.x/node-v0.12.12-linux-x64.tar.gz # tar --strip-components 1 -xzvf node-v* -C /usr/local 安装MongoDB： # rpm --import https://www.mongodb.org/static/pgp/server-3.2.asc # vim /etc/yum.repos.d/mongodb-org-3.2.repo [mongodb-org-3.2] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/3.2/x86_64/ gpgcheck=1 enabled=1 # yum &#8230;]]></description>
		
					<wfw:commentRss>https://wordpress.youran.me/a-simple-restful-web-service-in-nodejs-1/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/

Object Caching 32/124 objects using Disk
Page Caching using Disk: Enhanced 
Database Caching 4/16 queries in 0.003 seconds using Disk

Served from: wordpress.youran.me @ 2026-05-10 22:53:54 by W3 Total Cache
-->