Sep 1, 2014

JavaScript Object Prototypes

  • JavaScript
  • Object
  • Prototype

有这样的需求,比如要把 “Hello World” 这个字符串变成 “H e l l o W o r l d” 这个,在每个字母间增加一个空格。

一般的做法,比如这样: “Hello World”.split(‘’).join(‘ ‘); 先将字符串切割成数组,然后再用空格连接。

为了实现通用,也许我们要定义为一个函数:

function spacify(str){
  return str.split('').join(' ');
}

如果我们希望这个函数直接可以更简单一点使用,这样用 “Hello World”.spacify() ,那我们需要将这个方法放到 String 对象上,如:

String.prototype.spacify = function(){
  return this.split('').join(' ');
}

prototype 表示 Object 的原型对象,在 JavaString 中所有对象都由 Object 继承而来,通过 probotype 可以给对象增加方法和属性。

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype

Aug 26, 2014

流媒体札记

  • 流媒体
  • HTTP渐进下载
  • RTSP/RTP
  • HTTP Live Streaming
  • TS流
  • m3u8
  • H.246
  • MPEG-2

目前移动互联网较为广泛的三种流媒体协议为:HTTP渐进下载流媒体协议,基于RTSP/RTP的实时流媒体协议栈,以及HTTP Live Streaming协议(苹果提出)。

HTTP渐进下载

该协议公是在完全下载模式上做了一些小的改进。在客户端播放前仅需等待一段短时间 用于下载和缓冲媒体文件最前面的一部分数据,之后便可以一边下载一边播放。HTTP渐进下载流媒体播放采用标准HTTP协议在Web服务器和客户端之间递送媒体数据,客户端需要在硬盘上缓存所有前面已经下载的媒体数据,播放过程中只能在已经下载的媒体数据时间范围内进行快进、快退等操作。HTTP渐进下载流媒体播放仅支持点播,而不能支持直播。

RTSP/RTP流媒体协议

RTSP/RTP是目前业界最为流行和广为采用的 实时流媒体协议。它实际上由一组在IETF中标准化 的协议所组成,包括RTSP(实时流媒体会话协议), SDP(会话描述协议),RTP(实时传输协议),以及针 对不同编解码标准的RTP净载格式等,共同协作来构成一个流媒体协议栈。

RTSP是用来建立和控制一个或多个时间同步的 连续音视频媒体流的会话协议。通过在客户机和服务 器之间传递RTSP会话命令,可以完成诸如请求播放、 开始、暂停、查找、快进和快退等VCR控制操作。

RTP又称为实时传输协议,用于实际承载媒体数 据并为具有实时特性的媒体数据交互提供端到端的传输 服务。

RTSP/RTP流媒体协议栈的使用需要专门的流媒 体服务器进行参与。

HTTP Live Streaming协议

HTTP Live Streaming最初是苹果公司针对其 信息通信技术 iPhone、iPod、iTouch和iPad等移动设备而开发的流 媒体协议,后来在桌面QuickTime播放器中也得到了应用。

HTTP Live Streaming允许内容提供者通过普通 Web服务器向上述客户端提供接近实时的音视频流媒 体服务,包括直播和点播。

HTTP Live Streaming支 持将同一节目编码为不同码率的多个替换流,客户端软 件可以根据网络带宽的变化在这些不同码率的替换流之间进行智能切换。还支 持通过媒体加密和用户认证等方式来达到媒体版权保护。

一个典型的HTTP Live Streaming流媒体系统由 内容准备、内容分发和客户端软件三部分组成 HTTP Live Streaming Overview HTTP Live Streaming Overview #### 内容准备 内容准备部分负责将输入的音视频媒体内容转换成 为适合于内容分发组件进行递送的格式。 对于视频直播,编码器首先将摄像机实时采集的音 视频数据压缩编码为符合特定标准的音视频基本流(目 前苹果的系统仅支持H.264视频和AAC音频),然后再 复用和封装成为符合MPEG-2系统层标准的传输流 (TS)格式进行输出。

流分割器(Stream Segmenter)负责将编码器输出的 MPEG-2 TS流分割为一系列连续的、长度均等的小TS文件(后缀名为.ts),并依次发送至内容分发组件中的 Web服务器进行存储。流分割器还创建了一个含有指向这些小TS文件指针的索引文件(后缀名为 .m3u8),同样放置于Web服务器之中。这个索引文件可以看作是一个连续媒体流中的播放列表滑动窗口,每当流分割器生成一个新的TS文件时,这个索引文件的内容也被更新,新的文 件URI(统一资源定位符)加入到滑动窗口的末尾,老的 文件URI则被移去,这样索引文件中将始终包含最新的 固定数量的x个分段。流分割器还可以对 其生成的每个小TS文件进行加密,并生成相应的密钥文件。

采用MPEG-2 TS格式来对编码后的媒体流 进行统一封装,是因为它能够将音视频媒体流严格按时 序进行交织复用,任意截取和分段后,每一个分段都可 能不依赖于之前的分段而独立进行解码和播放。

内容分发

内容分发系统用于通过HTTP协议将分割后的小媒 体文件及其索引文件递送至客户端播放器,它既可以 是一个普通的Web服务器,也可以是一个Web缓存系统。几乎不需要对Web服务器做任何特殊的配置,以及 增加其他定制的模块。 对.m3u8文件 和.ts文件的MIME类型关联分别推荐为:

.m3u8 : application/x-mpegURL或vnd.apple.mpegURL
.ts : video/MP2T

由于索引文件需要频繁更新和下载,因此在Web cache的配置中有必要对.m3u8文件的TTL(time-to-live)值进行微调以保证客户端每次请求该文件时都能够 下载到它的最新版本。

客户端软件

通常情况下,客户端软件通过访问Web网页中的 URL链接来获取和下载一个流媒体会话的索引文件。 这个索引文件进一步指定了服务器上当前可用的TS格式媒体文件、解密密钥和其他替换流的位置。

对于选定的媒体流,客户端依次下载索引文件中 列出的每一个可用媒体文件。当这些媒体文件缓冲够一定数量后,客户端将它们按顺序重新拼装成一个连贯的 TS流,然后发送至播放器进行解码和呈现。

对于加密的媒体文件,客户端还负责根据索引文件的指引来获取解密密钥,提供用户认证接口,并按需进行解密。

对于视频点播,上述过程不断持续下去,直到客户 端碰到索引文件中的#EXT-X-ENDLIST标签。

对于视频直播,索引文件中不存在#EXT-X- ENDLIST标签,客户端将周期性地向Web服务器重新 请求获取该索引文件的更新版本,然后在这个更新版的 索引文件中查找新的媒体文件和解密密钥,并将它们的 URI添加至下载队列的末尾。

HTTP Live Streaming并不是一个真正实时的流媒体系统,这是因为对应于媒体分段的大小和持续时间有一定潜在的时间延迟。在客户端中,至少在一个分段媒体文件被完全下载之后才能够开始播放,而 通常要求下载完成两个分段媒体文件之后才开始播放以保证不同分段音视频之间的无缝连接。此外,在客户端开始下载之前,必须等待服务器端的编码器和流分割器 至少生成一个TS文件,这也会带来潜在的时延。在推荐配置下,HTTP Live Streaming系统的典型时延约在30s左右。

###流媒体协议比较 —— | 渐进下载播放| RTSP/RTP | HTTP Live Streaming —|———–|———–|——————– 服务器端实现 | 普通Web服务器 | 流媒体服务器 | 普通Web服务器 客户端实现 |容易 | 较难 | 容易 系统安装、配置 |简单 |复杂 | 简单 支持业务类型 |点播 |直播、点播 | 直播、点播 实时性(起始时延) |>30s | <2s | 约30s(推荐配置下) 客户端缓冲区 |硬盘,文件大小 |内存,小 | 内存,较小 VCR支持 | 部分支持 | 支持,定位精度高 | 支持,定位精度略差 网络带宽适应 | 不支持 | 部分服务器支持 | 支持(灵活流间切换) 服务器故障保护 | 不支持 | 不支持 | 支持 DRM支持 | 差 | 较好 | 好 防火墙穿透性 | 好 | 差 | 好 网络层多播 | 不支持 | 支持 | 不支持 适用范围 | 低码率短视频(如广告、片花等) | 大规模、低延迟实时流媒体系统 | 嵌入式移动流媒体(实时性要求不是太高)

Aug 20, 2014

Every ending is a new beginning

距离上次写blog有一年了,2009年12月1日来这家公司上班,员工编号:02,九个人的团队。昨天最后一次跟BOSS谈话结束后,交接完毕离开公司,走在路上,心中感觉有些失落。这是我工作以来待得最久的一家公司,在此期间,公司从陆家嘴搬至世纪公园,技术团队成员逐渐离开,最后我接管了所有的技术开发,以及项目的管理工作。很可惜的是虽有几个产品上线,却没有花精力与资源去运营,其主要原因并不是因为技术,而在于错误的去追求完美与大而全的框架。就像一个实验室一样,不断的去尝试着各种新的想法。而忽略了很重要的一点一个‘半成品’抵不过‘半个产品’。这也是促使我离开的原因之一,随时间推移,价值观产生分歧,离开也许是更好的选择。

这些年一直尝试把一些小想法独立的去实现,后面的时间是要更好的计划与安排了。

Jul 29, 2013

JavaScript number array summation

eg.


var array = [1,2,3,4,5];

// sum = 1 + 2 + 3 + 4 + 5 = 15;

// join array

var array_join = array.join('+'); // => "1+2+3+4+5"

// eval string

var array_sum = eval(array_join); // => 15

eg.


//sum jQuery selector element values

var elements = $('input:checked')

var values = elements.map(function(){return $(this).val() - 0}).get();

var sum = eval(values.join('+'));

Jun 16, 2013

Raspberry Pi Watchdog

参考文档:http://pi.gadgetoid.com/post/001-who-watches-the-watcher

树莓派的CPU是保护有硬件看门狗的,可以通过安装模块和值守程序来实现看门狗,防止树莓派死机!

  1. 加载看门狗模块, vim /etc/modules文件, 添加一行

    ```

    bcm2708_wdog

    ```

  2. 安装

    ```

    sudo apt-get install watchdog chkconfig

    ```

  3. 配置

    ```

    sudo vim /etc/watchdog.conf

    ```

    去掉max-load-1 = 24 前的#号,当1分钟load进程超过24个的时候(一般5个就是超高负载了,再高可以认为是死机,这在遭遇DDOS攻击的时候很容易遇到)就会触发重启

    设置高温复位:温度超过80度就会引起重启,保护CPU

    ```

    temperature-device = /sys/class/thermal/thermal_zone0/temp

    max-temperature = 80000

    ```

  4. 配置看门狗程序,开机自动运行

    ```

    chkconfig watchdog on

    ```

  5. 启动看门狗


sudo /etc/init.d/watchdog start

  1. 测试:输入下面的符号,这个符号可以引起树莓派死机,如果看门狗正常的话,等一会就能复位了

    ```
    (){ : :& };:

    ```

Jun 16, 2013

Ruby On Raspberry Pi

Install RVM stable with ruby:

  • http://rvm.io/rvm/install

  • ```

$ \curl -L https://get.rvm.io bash -s stable –ruby

**注**:这个过程大概需要耗费`2小时`以上!编译ruby源代码,以及安装需要花相当长的时间,CPU一直会在90%以上,所以在安装过程中不要让你的Raspberry Pi做别的事情,不要打开`startx`界面。也许你可以在睡觉之前运行这个命令,rvm会帮你搞定一切!

ruby安装好后,会执行`importing default gemsets`这一步也会很耗费时间,不过到这里时如果不想等可以`control + c`中止。

source ~/.profile




- 查询已经安装的ruby

```rvm list```



- 设置默认版本

```rvm use 2.0.0 --default```



- 测试是否正确



- ```

pi@raspberrypi ~ $ ruby -v

ruby 2.0.0p195 (2013-05-14 revision 40734) [armv6l-linux-eabihf]

pi@raspberrypi ~ $ gem -v

2.0.3

pi@raspberrypi:~ $ gem source -r https://rubygems.org/

https://rubygems.org/ removed from sources

pi@raspberrypi:~ $ gem source -a http://ruby.taobao.org

http://ruby.taobao.org added to sources

pi@raspberrypi:~ $ gem install bundler --no-rdoc --no-ri -V

  • http://www.sinatrarb.com/

pi@raspberrypi:~ $ gem install sinatra --no-rdoc --no-ri -V

Jun 13, 2013

Online Markdown Editor (GitHub Flavored)

在重构自己Blog时,一直想要做一个实时的Markdown预览功能,类似于Mou http://mouapp.com/ 的效果,但不想通过后台解析,那样效率太低,最合适的方式当然是用JavaScript在客户端解析.

初步效果如下:http://markdown.miclle.com/

代码地址:https://github.com/miclle/Markdown-Editor

PS. CodeMirror 3.x在自动换行时对中文支持不太好,测试过2.x表现正常,3.x与2.x两个版本API有很大区别,个人Blog是用的2.38版本,这里使用版本为: 3.11 +版本

May 30, 2013

增大肌肉块的14大秘诀

@健美杂志 “增大肌肉块的14大秘诀:大重量、低次数、多组数、长位移、慢速度、高密度、念动一致、顶峰收缩、持续紧张、组间放松、多练大肌群、训练后进食蛋白质、休息48小时、锻炼肌肉宁轻勿假。”

May 16, 2013

运动心率

为了使锻炼具有良好的效果,首先应该知道自己的最大心率(FCmax),这是以分钟心跳为单位(bpm)

FCmax最大心率计算方法: FC max = 220 - Age

根据运动的强烈程度,来自糖份和脂肪消耗的能源比例亦随之改变:

% FC max Desc

————- | ———— |

50%-60% 适量运动(步行)
60%-70% 体重调节(心率训练,跑步,滑轮)
70%-80% 增氧区(耐力训练,10公里)
80%-90% 速度训练(400米)

例如:40岁的运动员进行训练以维持他的竞技水平和控制他的体重。他应该最有效的利用消耗脂肪的热能。他的优先训练领域是他FCmax最大心率的60%至70%

目标区的下限和上限是将FCmax乘以所选训练区的限度百分比来计算。这里需要知道休息时的心率(FC repos),可以在早晨起床时用心率计测量。

目标区限度 = FC repos + 强度% x (FC max - FC repos)

FC max = 220 - 28 = 192

FC repos = 63次/分

目标区上限为: 63 + 70% * (192 - 63) = 153.3次/分

目标区下限为: 63 + 60% * (192 - 63) = 140.4次/分

Mar 22, 2013

配置Raspberry Pi无线上网

  • Raspberry

入手Raspberry Pi有几天了,一直插根网络连到MAC上通过共享网络来连接网络,不是很方便。

网上有说可以用TP-LINK TL-WN725N迷你路由器来连接网络,便从京东上买了一个,然后悲剧的折腾开始。首先TL-WN725N在Raspberry Pi上并没有自带驱动,当然网上有解决方案,有人在drobox上提供了一个安装驱动的脚本,好吧,各种折腾后把脚本弄到了Raspberry Pi上,可惜运行失败,让我这Linux文盲很受挫,google到很多资料,找到一个大牛折腾的过程,更加迷茫了… 不过在文章结尾的时候看到一句:

年后进了一个Tenda W311MI(主控是Ralink RT5370),RPi的固件中直接提供了驱动,省了手工编译安装驱动的麻烦。

第二天我又在京东上入了一个 腾达(TENDA)W311MI 超级Mini无线USB网卡 好吧,我比较败家!

买回来插到Raspberry Pi上启动后运行 lsusb

pi@raspberrypi:~$ lsusb

Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.

Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.

Bus 001 Device 004: ID 148f:5370 Ralink Technology, Corp. RT5370 Wireless Adapter

Bus 001 Device 005: ID 03eb:0902 Atmel Corp. 4-Port Hub

Bus 001 Device 006: ID 062a:0000 Creative Labs Optical mouse

Bus 001 Device 007: ID 413c:2003 Dell Computer Corp. Keyboard

其中Bus 001 Device 004: ID 148f:5370 Ralink Technology, Corp. RT5370 Wireless Adapter并是W311MI路由器,真好真省事早买这个就不会学浪费之前折腾的几个小时了

运行 iwconfig

pi@raspberrypi:~$ iwconfig

wlan0     IEEE 802.11bgn  ESSID:"TP-LINK_Z"

      Mode:Managed  Frequency:2.437 GHz  Access Point: 00:27:19:78:B2:E8

      Bit Rate=54 Mb/s   Tx-Power=20 dBm

      Retry  long limit:7   RTS thr:off   Fragment thr:off

      Power Management:on

      Link Quality=43/70  Signal level=-67 dBm

      Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0

      Tx excessive retries:22  Invalid misc:6   Missed beacon:0



lo        no wireless extensions.



eth0      no wireless extensions.

wlan0 就是你的无线网卡信息了

####接下来步骤:配置网络

修改/etc/network/interfaces

auto lo



iface lo inet loopback

iface eth0 inet dhcp



allow-hotplug wlan0

iface wlan0 inet manual

wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf



iface default inet dhcp

网上说可以设置静态IP,我尝试了下可惜失败了:(

修改 /etc/wpa_supplicant/wpa_supplicant.conf

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev

update_config=1



network={

  ssid="无线名称"

  psk="无线密码"

  proto=WPA

  key_mgmt=WPA-PSK

  pairwise=TKIP

  auth_alg=OPEN

}

proto key_mgmt与pairwise的值与你无线网络的设置对应上即可

最后 sudo reboot 重启

运行ifconfig -a

@raspberrypi:~$ ifconfig -a

eth0      Link encap:Ethernet  HWaddr b8:27:eb:f8:c5:7f

      UP BROADCAST MULTICAST  MTU:1500  Metric:1

      RX packets:0 errors:0 dropped:0 overruns:0 frame:0

      TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

      collisions:0 txqueuelen:1000

      RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)



lo        Link encap:Local Loopback

      inet addr:127.0.0.1  Mask:255.0.0.0

      UP LOOPBACK RUNNING  MTU:16436  Metric:1

      RX packets:8 errors:0 dropped:0 overruns:0 frame:0

      TX packets:8 errors:0 dropped:0 overruns:0 carrier:0

      collisions:0 txqueuelen:0

      RX bytes:1104 (1.0 KiB)  TX bytes:1104 (1.0 KiB)



wlan0     Link encap:Ethernet  HWaddr c8:3a:35:c5:cc:6b

      inet addr:192.168.2.104  Bcast:255.255.255.255  Mask:255.255.255.0

      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

      RX packets:958 errors:0 dropped:0 overruns:0 frame:0

      TX packets:368 errors:0 dropped:0 overruns:0 carrier:0

      collisions:0 txqueuelen:1000

      RX bytes:172315 (168.2 KiB)  TX bytes:47919 (46.7 KiB)

Raspberry Pi的局域网IP为 192.168.2.104 然后我在MAC上就可以ssh远程登录了

####参考文章: