行者无疆 始于足下 - 行走,思考,在路上

新鲜热乎刚出炉的网易笔经

投了网易招聘的两个职位,都是系统运维工程师,一封据信一封笔试邀请函……今天晚上6点早早离开公司,坐车到玉泉正门代售点买了回家的火车票,结果脑子进水了,本来要买9月30号的票,硬说成了买10月1号晚上到北京的票……还是无座…… 算了,怎样都要回家看看的。跟公司请了假,在家可以待到10月10号。然后可以继续实习,保证每天三天就行,剩下的时间可以边实习边找别的工作——如果想留在公司,非常欢迎。老婆说公司对我太好了,要是她的话就感动的留下来了。算了,废话少说,说说今天的网易笔试吧。快七点才到场,等了5分钟才拿到卷子,笔试卷子分为两部分:基础部分和专业部分。其中基础部分是所有人技术类岗位必做的试题,专业部分则是根据你报的岗位出的题目。考试时间是两个小时,大概有30道题目左右吧。我报的是系统运维工程师,临交卷的时候在草稿纸上记了一下题目,现在写出来供大家参考。

基础部分
一、计算机基础知识部分

  1. 下列哪些可以用作并发控制(多选) A、信号量   B、原子操作     C、自旋锁   D、管道 【AB】
  2. 快排和堆排序的最差情况下的复杂度是多少【O(n^2), O(n\lg{n})
  3. 关于设计模式【不会、蒙的……】
  4. 简述TCP建立连接的过程【三次握手……】
  5. 简述RAID1和RAID5【依稀记得当初查过百度百科,胡侃了一通】
  6. 最大子段和写代码【这个应该没啥问题,就是那个O(n)的算法】

二、Java部分

  1. Java,abstract,finally等【凭感觉】
  2. Java……【凭感觉】
  3. Java……【凭感觉】
  4. equals()方法和hashCode()方法区别【是不是类似于PHP中的==和===两个运算符之间的区别?】

三、数据库部分

  1. 列举至少三种形式的数据库索引【不会……】
  2. 给两个表:
    1. 写SQL查询语句【SQL,还涉及到子查询和排序,比较复杂,只写出了基本样子】
    2. 问这种情况下的表应该怎样建索引才能提高效率【不会……】

四、C++部分

  1. STL,map<int, string> m,问m.insert(map<int, string>::value_of())方法和map m[1] = "test"有何区别【不太会……】
  2. const pointer【char *p、const char *p、char const *p、const char const *p的区别】
  3. c++【忘了……】
  4. c++【虚函数代码、蒙的】

专业部分

  1. Linux系统中如何查看CPU、内存、硬盘、网卡型号【cat /proc/cpuinfo,cat/proc/meminfo……】
  2. Linux中如何查看某个分区的大小,如何查看某个目录的大小【df -h | grep sda、du -h --max-depth=0 .】
  3. Linux中如何查看网卡的工作模式、速度、IP地址、路由信息【ifconfig、route、/etc/network/interfaces?……】
  4. 写出DNS、FTP、Http、Https、POP3、SMTP、SNMP、SSH、TELNET等应用层协议的底层传输层协议和端口号【能写多少写多少】
  5. 给定三个终端截图,问你这三张图分别是那个命令的运行结果。(第一个应该是free命令,第二个是top命令,第三个不知道……)【free、top、还有一个不知道……】
  6. 给你一段apache的日志,让你用Shell Script、Python、Perl和Ruby写脚本,求出哪个资源如(... GET \apache.gif ...中的apache.gif)被请求的次数最多。【Shell Script基本写出,Python给出了思路、Perl和Ruby不会……】
  7. 正则表达式提取URL地址中的站点名称和资源名称【参见正则表达式30分钟入门
  8. 给出几种服务器之间拷贝文件的解决方案【NTF、Samba、ssh(scp)、rsync、ftp等】
  9. 给出几种web server并简述其特点。【MS IIS、Apache、Lighttpd、nginx】
  10. 写出你所知道的web框架并简述其特点。【Java SSH、Python Django、RoR(其实都不会……)】
  11. 写出你所知道的几个自由软件开发者并简评。【RMS、Linux、Eric Raymond、Knuth……胡侃】
  12. 写出你最拿手的三项计算机技能。【胡侃】

【answer】是自己的答案,感觉总体上答的很一般,整套笔试题考的还是非常广泛的,也暴露了自己基础部牢靠的弱点和一些知识盲点。我想我应该买一本考研题册做一做了。继续加油吧。Fighting!

流水帐

4、5号从上海回来后,我自己的cpu就一直在以100%的负载在运行,每天平均睡不到7个小时,两周不到经历了各种事情,需要做个总结,否则下次再做总结恐怕写不下了。总结的风格依然是流水帐,技术加生活。

6号上班做了一个30+页的ppt,对自己两个月的实习成果做一个总结,系统描述了整个视频生产系统的设计、编程实现、工具使用细节等等,晚上部门会议做了报告,效果还不错。7、8两天写出了自己人生的第一个Python脚本,脚本的功能是分析nginx访问日志,提取用户信息,判断某个用户是否完整看完了某个视频等等,形象化一点,就是把类似于下面的log:

172.24.106.236 - - [01/Sep/2010:17:57:54 +0800] "-" 400 0 "-" "-" "-"
172.24.106.237 - - [01/Sep/2010:17:57:56 +0800] "-" 400 0 "-" "-" "-"
116.247.116.238 - - [01/Sep/2010:17:58:11 +0800] "GET /video/super_mpg_video/demo/taohua.f4v HTTP/1.1" 200 867480 "http://110.75.2.195/player/thvp/thVideoPlayer.swf?video=http://110.75.2.195/video/super_mpg_video/demo/taohua.f4v" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Tablet PC 2.0)" "-"
172.24.106.236 - - [01/Sep/2010:17:58:24 +0800] "-" 400 0 "-" "-" "-"
172.24.106.237 - - [01/Sep/2010:17:58:26 +0800] "-" 400 0 "-" "-" "-"
116.247.116.238 - - [01/Sep/2010:17:58:53 +0800] "GET /video/super_mpg_video/demo/taohua.f4v HTTP/1.1" 200 2097152 "http://110.75.2.195/player/thvp/thVideoPlayer.swf?video=http://110.75.2.195/video/super_mpg_video/demo/taohua.f4v" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Tablet PC 2.0)" "-"
172.24.106.236 - - [01/Sep/2010:17:58:55 +0800] "-" 400 0 "-" "-" "-"
172.24.106.237 - - [01/Sep/2010:17:58:56 +0800] "-" 400 0 "-" "-" "-"
172.24.106.236 - - [01/Sep/2010:17:59:25 +0800] "-" 400 0 "-" "-" "-"
172.24.106.237 - - [01/Sep/2010:17:59:26 +0800] "-" 400 0 "-" "-" "-"
172.24.106.236 - - [01/Sep/2010:17:59:55 +0800] "-" 400 0 "-" "-" "-"
172.24.106.237 - - [01/Sep/2010:17:59:56 +0800] "-" 400 0 "-" "-" "-"
172.24.106.236 - - [01/Sep/2010:18:00:25 +0800] "-" 400 0 "-" "-" "-"
172.24.106.237 - - [01/Sep/2010:18:00:26 +0800] "-" 400 0 "-" "-" "-"
59.42.126.48 - - [01/Sep/2010:18:00:51 +0800] "GET /video/super_mpg_video/20100826/moribingdu/moribingdu.f4v?th_key=4c7e3d82;1a7b6ebe;8292192f571cb7bbed3024e3998b5631&start=46582231&end=67158965 HTTP/1.1" 200 771638 "http://110.75.2.195/player/thvp/thVideoPlayer.swf?video=http://110.75.2.195/video/super_mpg_video/20100826/moribingdu/moribingdu.f4v&th_key=" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)" "-"
172.24.106.236 - - [01/Sep/2010:18:00:55 +0800] "-" 400 0 "-" "-" "-"
172.24.106.237 - - [01/Sep/2010:18:00:56 +0800] "-" 400 0 "-" "-" "-"
172.24.106.236 - - [01/Sep/2010:18:01:25 +0800] "-" 400 0 "-" "-" "-"
172.24.106.237 - - [01/Sep/2010:18:01:26 +0800] "-" 400 0 "-" "-" "-"
116.247.116.238 - - [01/Sep/2010:18:01:43 +0800] "GET /video/super_mpg_video/demo/taohua.f4v?start=20998492&end=41622742 HTTP/1.1" 200 20624263 "http://110.75.2.195/player/thvp/thVideoPlayer.swf?video=http://110.75.2.195/video/super_mpg_video/demo/taohua.f4v" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Tablet PC 2.0)" "-"
172.24.106.236 - - [01/Sep/2010:18:01:55 +0800] "-" 400 0 "-" "-" "-"
172.24.106.237 - - [01/Sep/2010:18:01:56 +0800] "-" 400 0 "-" "-" "-"

转换成相应形象化的显示:



整个Python Script大概170多行,同时封装了几十行的Shell Script,算法是自己拍脑袋想出来的,具体描述可以另外写一篇技术文章了。脚本成形的过程渐渐体会到了Python的方便,结合了脚本语言的便捷性和高级语言的强大性,实乃居家旅行打家劫舍养家糊口之利器也。

9、10两天请假。9号睡了个小懒觉,然后去了趟校医院又开了一个星期的药,花掉100大洋左右,午饭后和同学会首,三人打车去西溪北园,准备CUMCM 2010。到了那边也没什么事情,下午3点半左右又走回玉泉,拿了实习记录本,去找导师签字。到了导师公司又等了半个小时,跟导师汇报下暑假实习的情况和自己要找工作的打算,简单谈了谈,骗了个90分回来。晚饭在西溪北园食堂吃的,饭后想到布袋也住在北园,约好去看她,巧的是碰到了哈哈、小包、破船一行,他们前脚刚要走,我后脚就跟过来了。由于布袋还要导尿,不太方便,我就一个人在北园里面转了几圈,买了个大西瓜和几桶泡面——西瓜给布袋,泡面是自己的。与布袋聊了有两个小时吧,听了她在千岛湖训练的很多故事,以及体制内运动员训练的一些内幕,加上他们从千岛湖逃窜的惊险一幕,走之前和布袋掰了手腕——当然我是不会输的,不过布袋的力气已经非常出色了,我敢说一般的男生不是她的对手;享受了阿姨自制的酸奶,一袋乳酸菌,放入保温瓶,自然发酵,有点西藏酸奶的味道,赞的。

11号早晨8点多拿到了CUMCM 2010的题目,A题是一道看似简单但非常复杂的几何计算题,B题就一句话——让你评估一下上海世博会的影响力。我倾向于选B题,因为看起来A题不太难——事实证明这个看起来不太难的结论是错误的,而且发挥余地有限;而B题的话只要找准一个切入点,成功的概率非常的大,即便不济,结果也总能忽悠出来的,不会太差。但是另外两名队友经过深思熟虑还是倾向于A题,于是少数服从多数,开始搞A题。第一天还是比较顺利的,我们顺利地解决了第一问,而第二问显然也是基于第一问的,这让我们每个人都面带笑容进入了梦乡——如此下去,第二天晚上就可以搞定第二问,第三天就有一整天的时间来写论文。

三人的分工基本上是这样,解题思路由三人共同商讨,然后lyf负责算积分表达式,ly负责matlab编程和主要的数据拟合,我对LaTeX比较熟,所以除了解题思路和简单的数据处理,主要是看文档、写文档。

第一天的乐观到了第二天的傍晚就变成了焦虑——第二问的积分表达式由于过于复杂以致无法积出来,ly和lyf用matlab算这个符号积分会卡住,我说matlab的符号计算比较弱,于是我在linux平台上找到了著名的符号运算软件maxima,简单配置了Emacs+imaxima,来算这个积分,maxima比较智能,会给你一些提示,比如提示你某个变量是positive, negative or zero? 因为这个变量值不同积分结果也不同。总之积分表达式很复杂,我用maxima算,不同的条件算出来也不一样,有时候算出来竟然是个复数!探索良久,符号积分的方法宣告失败,于是我们转而研究能否用数值积分的方法来算出一部分数据,打表拟合,然后根据拟合的结果判定拟合曲线和实际数据的相似性,确定最后的方程参数。但数值积分是一个比较棘手的东西,除了调用已有数学软件的方法,我们没有能力自己去写。ly和lyf研究matlab,我则找到了maxima的数值积分方法romberg,但是最后也宣告失败,至此,已经是第二天晚上10点多了……士气开始变的低落,ly躺在床上,lyf上网看看别的东西,我也在打酱油般地继续着一些无谓的探索——对于A题,我们已经黔驴技穷,换B题,还剩一天一夜,但是也有些来不及了——更重要的是大家都不太想做下去了。

12号早晨大家都睡到自然醒,心情也不是太好——毕竟没有做出题目是件挺没面子的事情。我提议我们上午再按照打表的方法重新计算一下,然后大家随便算算,到中午基本上就彻底放弃了……于是乎我们就解脱了——ly开始玩一些网页小游戏,lyf上网或者单机游戏,我呢,看完了《当幸福来窍门》,修改了一下午自己的简历,找Ouka帮忙挑了挑刺,投了华为、网易等四五家公司。

13号早晨老师打来电话,问我们论文咋么还不交,我们就坦白交代了说自己没有做出来,论文也没有写,于是我们的CUMCM 2010打酱油之旅就这样结束了。顺便提下这里提供的盒饭还是很不错的,虽然题目没有做出来,但还是赚了三天的伙食——太邪恶了……

离开西溪后冒着小雨骑车到了公司,刚好赶上早会。然后就开始了工作——看,角色转换如此之快。晚上google的宣讲会加现场笔试,七点半到达现场,果然人山人海。8点挤到了位子,开始笔试。笔试总共10道选择和3道编程算法题目,时间是90分钟。选择题大概记得的几道:

  1. 以下各种排序种哪几种是稳定排序?
  2. 二叉树的前序、中序和后序遍历中,已知哪两种可以唯一却确定一棵二叉树?
  3. {1, 2, 3, ..., 20}集合中,挑选出3个数字,使得这3个数字不完全相邻,如{1, 2, 3}, {4, 5, 6},有多少种挑法?
  4. 32位机器表示的有符号数最小值是多少?
  5. Unix文件的一道题目?
  6. 1024!的结尾有多少个零?
  7. c语言指针的一道题?
  8. 数组中寻找中位数的算法复杂度是多少?
  9. 访问内存性能的一道题目。
  10. 忘了……

剩下的3道编程题目,第一道题目是编程求两个数组集合A[m], B[n]的交集;第二道是离散事件模拟,内容和严老那本经典的《数据结构——c语言版》第3章栈和队列的最后一节一样;第三道应该是桶排序,就是给定n个数,大小均在[1, n^2-1],在保证时间最优的前提下尽可能地优化空间。

google笔试的结果就是我理所当然的被bs了,虽然我觉得答得还算凑合吧,不过连面试的机会都不给,这个招聘也显得有点酱油的味道了——当然,比如像今年的百度之星冠军hh,据说连google的面试官都称之为大牛了,这是另类。

剩下的时间主要是借工作的时间学习,修炼秘密武器,看完了w3c school上的大部分教程,重点是关于XML的,XSL、XPath、XQuery、DTD、Schema等等,研究了Unicode编码的基本知识(UTF-8、UTF-16、UTF-32,Big-Endian,Little-Endian等),研究了python读写excel文件的几个模块(xlrd, xlwt, xlutils, pyexcelerator)和python有关xml的一些模块(lxml, jaxml等),基本完成了《Learning Python》,除了Class看得比较少,剩下的就是熟悉一些常用的mobule,多写写Python脚本,有时间再了解了解Python知名的开发框架,差不多了,剩下的按需学习。

14号是好友Ouka同志的22岁生日,四年前的今日我拿到了化学竞赛的一等奖,收到Ouka祝福短信和亲切指导若干,四年后的今日,我在公司实习,趁午休时间简单改了个小程序,一程序员间独特的方式送出我的生日祝福。Happy Ouka, Fight Ouka。

17号中午回到玉泉,参加了网易有道搜索的机试,两道题,两个小时,zoj平台,20个测试点,总分270,有点类似于NOI,是按照score排名的。结果还是不错的,许久为碰c++,还是拿下了260分,整场50人排名15%左右吧。两道题目如下:

 
奇偶矩阵

Time Limit: 1 Second      Memory Limit: 32768 KB



给定一个N行,M列的正整数组成的矩阵,求其中的一个子矩阵,使得奇数的个数与偶数的个数差值的绝对值最大

Input

每个文件包含一个测试数据。第一行是两个整数,N,M 表示矩阵的大小 1<=N,M<=100。 接下来N行,每行M个正整数,对应为矩阵中的元素,所有的数不超过2^30。

Output

输出包含一行,为子矩阵中奇数个数与偶数个数差值绝对值的最大值。

Sample Input
				3 3
1 2 3
3 2 1
1 1 1
Sample Output
				5
最大和

Time Limit: 5 Seconds      Memory Limit: 32768 KB



给定两个整数数组分别为A,B。你可以从A,B中分别挑选一个数,将他们的乘积作为你的得分。你可以挑选任意次,但是每个数只能被挑选一次。 求你最后所能得到的分值和的最大值,你的初始分数为0

Input

每个文件包含一个测试数据。 第一行是一个正整数N,为数组A的长度。 第二行为N个整数,分别为A中的元素。 第三行是一个正整数M,为数组B的长度。 第四行为M个整数,分别为B中的元素。 1<=M,N<=10^6

Output

输出结果包含一行,为你所能得到的最大的分之和。A,B中的数及最后的结果均不超过2^30

Sample Input
				4
3 2 6 1
3 
2 6 3
Sample Output
				49

第一提看上去比较悬,但仔细一想其实是个最大子段和的问题,核心算法可以参考ZOJ 1074——我就是这么干的……应用之前需要预处理,就是扫描下整个矩阵,然后用1表示奇数而用-1表示偶数,最后算“矩阵的最大子段和”,这样做下来基本上可以通过4-5个测试点,弥补的方法就是对称性,考虑到奇数和偶数的平等性,用-1表示奇数而用1表示偶数再算一下。整个程序如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#define size 102

int DP(int a[],int n);

int main(void)
{
    int m, n;
	int i, j, k;
	int he;
	int max1, max2;

    int a[size][size];
	int b[size][size];
    int sum1[size];
	int sum2[size];

    scanf("%d%d",&m, &n);

    for(i = 1; i <= m; i++)
        for(j = 1; j <= n; j++)
		{
            scanf("%d",&a[i][j]);
    		
			if (a[i][j] % 2 == 0)
			{
				a[i][j] = -1;
				b[i][j] = 1;
			}
			else
			{
				a[i][j] = 1;
				b[i][j] = -1;
			}
		}

    max1 = max2 = -200000000;

    for(i = 1; i <= m; i++)
    {
        memset(sum1, 0, sizeof(sum1));

        for(j = i; j <= m; j++)
        {
            for(k = 1 ; k <= n ; k++)
                sum1[k] += a[j][k];

            he = DP(sum1, n);

            if(he > max1) 
				max1 = he;
        }
    }
    
	for(i = 1; i <= m; i++)
    {
        memset(sum2, 0, sizeof(sum2));

        for(j = i; j <= m; j++)
        {
            for(k = 1 ; k <= n ; k++)
                sum2[k] += b[j][k];

            he = DP(sum2, n);

            if(he > max2) 
				max2 = he;
        }
    }

	if (max1 > max2)
		printf("%d\n",max1);
	else
		printf("%d\n", max2);
    return 0;
}

int DP(int a[],int n)               
{
    int i, f[101];
    int max = -200000000; 
	
    for(i = 2, f[1] = a[1]; i <= n; i++)
    {
        if (f[i - 1] > 0)         
            f[i] = f[i - 1] + a[i];         
        else
            f[i] = a[i];              
    
        if (f[i] > max)               
            max = f[i];
    }

    return max;
}

第二题的思路比较清晰了,需要注意的是负数的情况,考虑四个正数a \leq b, c \leq d,显然ac + bd \geq ad + bc,就是要得到最大值,大大相乘优先。如果遇到负数,负负为正是可以考虑的,正负相乘则需要舍弃。按照这个原则进行排序、分割,在处理下去就不难了。有一个Test Case是Segmentation Fault,最后找到原因了,可惜没有时间了,程序如下:

#include <iostream>
#include <algorithm>
#include <vector>
#include <functional>
using namespace std;

int main()
{
	int m, n;
	vector<int> a;
	vector<int> b;

	int i, j;
	int item;
	int s, sum;
	int ai, bi;

	cin >> m;
	for (i = 0; i < m; i++)
	{
		cin >> item;
		a.push_back(item);
	}

	cin >> n;
	for (j = 0; j < n; j++)
	{
		cin >> item;
		b.push_back(item);
	}

	sort(a.begin(), a.end());
	sort(b.begin(), b.end());
	
	for(i = 0; i < a.size(); i++)
	{
		if (a[i] >= 0)
		{
			ai = i;
			break;
		}
	}

	for(i = 0; i < b.size(); i++)
	{
		if (b[i] >= 0)
		{
			bi = i;
			break;
		}
	}

	sum = 0;
	for(i = 0, j = 0; (i < ai) && (j < bi); i++, j++)
	{
		sum += a[i] * b[j];
	}

	for(i = a.size() - 1, j = b.size() - 1; (i >= ai) && (j >= bi); i--, j--)
	{
		sum += a[i] * b[j];
	}

	cout << sum << endl;

	return 0;
}

最后的结果还是不错的,这也让我感到惊喜,好久都没有如此开心过了,期待面试通知。

另外,现在所在的实习公司已经有了口头上的offer,给我一个月的时间考虑,在实习结束之前给答复,待遇和淘宝应届是差不多的,而且创业阶段,发展空间还是非常大的,我在部门也受到重视,我相信继续实习一年,毕业后我会处于一个比较高的起点,这样的结果,对于我这么一个挂科达到两位数的刚毕业的本科来说,应该算很不多的了,但是我还是在犹豫。老实说我还是想去大的公司体验两年,体验下大的平台和大的气质;妈妈每次打电话都让我回北京,家近、方便。所以我还在继续投简历。

18号下去2:00-3:00,百度大牛徐串的技术讲座;19号下午2:00,百度内推小型见面会;20号晚6:30,MSTC主席pluskid大神的小课堂,各种大牛,膜拜。

除了这些,印度宝莱坞的电影《三个傻瓜》前前后后看了4遍,哭笑中带来人生的思考;看了《当幸福来敲门》,我喜欢那种“He must have a nice pants”的自信;看了柴静的《面对面》——李连杰“壹基金危机”,“侠之大者,为国为民”,李连杰当之无愧;“方向对了,就不怕路远”,加油吧,Lox!

8月的总结

忙碌充实的一个月。第一周研究ffmpeg,转码脚本初步完成,转交给QA测试;4、5号两天周末去了上海;第二周回来研究继续DVDrip和蓝光DVD的初步研究,确立了转码标准,初步研究了字幕合并的问题;第三周听了taobao的一个性能测试培训,优化脚本的转换速度到原来的3倍,周四晚上奔上海呆了三天–睡了两天地铺……见了见几年没见的老同学dx(比我高一头却经常被我扁的小弟),lwc(挺投缘的朋友,这么久没见,我的第一句话是“是不是每个女生大学里的第一件事情就是把头发养长啊?“,然后就听见了L爽朗的笑声);第四周主要在研究字幕合并问题,接触了mencoder工具,由于首批收费视频要上线,所以几乎每天都加班,为运营提供技术支持–周三00:30离开公司、周四9:30离开、周五00:10离开公司、周六早9:00-12:00来加班,忙碌崩溃的一周,成果是http://hua.taobao.com/shop/shop_home.htm?sellerid=60&inshop=yes ,感觉一是做产品真的很不容易,二是念了这么多年书,终于能做出一些东西来,还是小有成就感的wink。上周日约了一批人去植物园游泳,四米深的池子,九个大老爷们集体跳水的景观还是挺壮观的;天色黑的时候,水底的灯光粼粼闪动、非常漂亮,虽然四米的水压压的我耳朵有些痛,我还是不断地潜下去体验–;我想到了Le grand bleu

技术上还是接触了很多新鲜的概念和名词,"I don't know I don't know" ==> "I know I don't know",在此一并罗列出来:

  • 视频转码方面:
  • Linux
  • Concepts
  • Networking
  • Software Performance Testing
    • 流程:评估、资源申请、计划、准备(环境+数据)、执行验证、调优、报告
    • 指标:虚拟用户和并发、TPS、PV(Page Viewer)、响应时间、CPU利用率、Load(Linux)、TPS波动值、JVM内存走势、FGC
    • 执行方案:单场景、混合场景、用户行为
    • 通过标准:超时概率、错误概率、TPS、TPS波动模型、CPU(大于75%不通过)、Load(每核CPU Load大于1不通过)、JVM、Full GC
    • 工具:Jconsole、Jprofile、Jstat、profiler、Jmap、Nmon、Valgrind、Vmap、VisualVM
  • Others
  • Delicious

翻完潦草不堪的Notebook,想想这一个月看的东西还真挺杂的。除了以上这些,中途走神看了看《大话设计模式》的前面几章;看了《Learning Python》的大部分–但是还没有动手写过程序……感觉书比较啰嗦,一个知识点反反复复的说来说去;看了w3cschool.cn的部分在线教程,重点看了JavaScript,边看边用Emacs Org-mode做笔记,还是挺好用的;阿里内网也有非常多宝贵的资源,上班时间没事,我自己下载了历年来各种培训资料、内部试题、新人手册大概300M左右,看了一半左右,留了个大概印象;看的过程中走神,不知道怎么就点到了Qcon Beijing 2009的网站,又发现了一个宝库,流着口水下载了所有能下的pdf–虽然大部分还看不懂……

除了以上,还有一些IT名人的反思、成长经历也给了我很大的启发:

代码看累了就会走神,偶尔拾到几个贝壳,抄录在本子上–一些话:

  • 我总希望有人在什么地方等我,你也总希望有人在什么地方等你吧(几米《照相本子》)。
  • 幸福的步道,总是那么短,我们可不可以赖着不走。
  • 这是八月初的一个早晨,美国南部的阳光舒迟而透明,流溢着一种久经忧虑的让人鼻酸的、古老而宁静的幸福(张晓风)。
  • 得意时便生失意之悲。
  • 其实不是时间在流失、流逝的是我们自己。
  • 不论怎么样,大家总是一年一年地来到这个路口,然后各自去闯荡(好像来自pluskid的diary)。
  • We had job, we had fun, we had seasons in the sun. But the hills that we climbed, were just seasons out of time.
  • 我的征途是星辰大海。
  • Do not spend all your time on training or studying - this way you will probably become very exhausted and unwilling to compete more. Whatever you do - have fun. Once you find programming is no fun anymore – drop it. Play soccer, find a girlfriend, study something not related to programming, just live a life - programming contests are only programming contests, and nothing more. Don't let them become your life - for your life is much more interesting and colorful.

另外一件小事就是最近总是肚子隐痛,去校医院查了查,做了个涕泪肆流的胃镜,诊断结果是浅表性胃炎,病因应该是幽门螺旋杆菌发炎。开了七八盒药,先吃着看吧。没敢告诉家里,怕家里担心。今天老妈还给我发短信说“我们在提车.东风日产.天籁2.0黑色.自动档.都下来奖金20万“,“在北京.如果你上班需要借给你开呵呵“–心头不自主地酸了一下:这么多年的风风雨雨,从前的老瓦房、大锅土炕、猪圈地窖,到自己的一套房子,到我考上唐山一中保送到浙大,到今天买上了自己的车,我那只有小学文化的母亲,何等不易!

肚子又开始痛了,也是,这么晚了,还不睡,伤身体的。

“宠辱不惊,闲看庭前花开花落; 去留无意,漫随天外云卷云舒“

我想人到最后追求的应该是一种淡定祥和的心态。风雨彩虹、日晒雨淋、雪山草地、高山大河、青灯古寺,或许我们本来就不需要手机,不需要SNS,不需要E-mail,不需要这种高速快节奏的生活。这种速度让人窒息、如同龙卷风一样,瞬息万变,让我们无法掌控自己。人与人之间的交流“贵在心诚,幸在投缘“,整天挂着QQ,好友遍地,却不知道什么时间该找谁说些什么话。我们再也没有提笔书信时的那种思考、没有等待书信时的那种期盼。信息泛滥,手机滴滴嗒嗒,我们在这头时刻准备着–接受别人的审判。这或许是对网络通讯世界的一种讽刺?

road

接下来的安排:9月第一周数模国家赛,三天三夜的拼搏;看完Python和JavaScript,重点看C++算法和Networking;关注各种校园招聘;10月第一周回家呆几天修整,学车考驾照;十一回来结束实习,全面投入找工作事宜,争取在年底搞定;如果有时间出去走走,可选地东北或者东南亚。Over,暂时这样。安。

w3cschool javascript 笔记(1)

Javascript 教程

1 简介

 

1.1 什么是Javascript

  • JavaScript被设计用来向HTML页面添加交互行为。
  • JavaScript是一种脚本语言(脚本语言是一种轻量级的编程语言)。
  • JavaScript由数行可执行计算机代码组成。
  • JavaScript通常被直接嵌入 HTML 页面。
  • JavaScript是一种解释性语言(就是说,代码执行不进行预编译)。
  • 所有的人无需购买许可证均可使用JavaScript。

1.2 真实的名称是ECMAScript

  • JavaScript的正式名称是"ECMAScript"。这个标准由ECMA组织发展和维护。
  • ECMA-262是正式的JavaScript标准。这个标准基于JavaScript(Netscape)和JScript(Microsoft)。
  • Netscape(Navigator 2.0)的Brendan Eich发明了这门语言,从1996年开始,已经出现在所有的Netscape和Microsoft浏览器中。
  • ECMA-262的开发始于1996年,在1997年7月,ECMA会员大会采纳了它的首个版本。
  • 在1998年,该标准成为了国际ISO标准(ISO/IEC 16262)。
  • 这个标准仍然处于发展之中。

2 如何实现JavaScript

  • <script>标签嵌入JavaScript
  • 与老的浏览器打交道:
    <html>
    <body>
    <script type="text/javascript">
    <!--
    document.write("Hello World!");
    //-->
    </script>
    </body>
    </html>
    

3 把JavaScript放置到何处

  • 位于 head 部分的脚本:当脚本被调用时,或者当事件被触发时,脚本就会被执行。当你把脚本放置到 head 部分后,就可以确保在需要使用脚本之前,它已经被载入了。
    <html>
    <head>
    <script type="text/javascript">
    ....
    </script>
    </head>
    ....
    
  • 位于 body 部分的脚本:在页面载入时脚本就会被执行。当你把脚本放置于 body 部分后,它就会生成页面的内容。
    <html>
    <head>
    </head>
    
    <body>
    <script type="text/javascript">
    ....
    </script>
    </body>
    </html>
    
  • 使用外部JavaScript
    • <script src="javascript.js">….<script>
    • 您可以把 .js 文件放到网站目录中通常存放脚本的子目录中,这样更容易管理和维护。

4 JavaScript语句

 

4.1 JavaScript语句

  • 浏览器把行末作为语句的结尾
  • 分号是可选的,通过使用分号,可以在一行中写多条语句。

5 JavaScript注释

  • 单行注释://comments
  • 多行注释:/*comments*/

6 JavaScript变量

  • 变量对大小写敏感(y和Y是两个不同的变量)
  • 变量必须以字母或下划线开始
  • 可以通过var语句来声明JavaScript变量
  • 可以在声明它们时向变量赋值
  • 如果您所赋值的变量还未进行过声明,该变量会自动声明
    • 这些语句:
      x=5;
      carname="Volvo"; 
      
    • 与这些语句的效果相同:
      var x=5;
      var carname="Volvo"; 
      
  • 如果您再次声明了JavaScript变量,该变量也不会丢失其原始值。

7 JavaScript运算符

  • 如果把数字与字符串相加,结果将成为字符串。

8 JavaScript比较和逻辑运算符

  • ==:等于
  • ===:全等

9 JavaScript If…Else语句

  • if
  • if … else
  • if … else if … else
  • switch

10 JavaScript消息框

 

10.1 警告框

  • 警告框经常用于确保用户可以得到某些信息。
  • 当警告框出现后,用户需要点击确定按钮才能继续进行操作。
  • alert("文本")

10.2 确认框

  • 确认框用于使用户可以验证或者接受某些信息。
  • 当确认框出现后,用户需要点击确定或者取消按钮才能继续进行操作。
  • 如果用户点击确认,那么返回值为true。如果用户点击取消,那么返回值为false。
  • confirm("文本")

10.3 提示框

  • 提示框经常用于提示用户在进入页面前输入某个值。
  • 当提示框出现后,用户需要输入某个值,然后点击确认或取消按钮才能继续操纵。
  • 如果用户点击确认,那么返回值为输入的值。如果用户点击取消,那么返回值为null。
  • prompt("文本", "默认值")

11 JavaScript函数

 

11.1 JavaScript函数

  • 将脚本编写为函数,就可以避免页面载入时执行该脚本。
  • 函数包含着一些代码,这些代码只能被事件激活,或者在函数被调用时才会执行。
  • 函数在页面起始位置定义,即 <head> 部分。

11.2 如何定义函数

 

11.2.1 创建函数的语法:

function func(var1, var2, ...)
{
    \\statements
}

11.2.2 JavaScript变量的生存期

  • 全局变量
  • 局部变量

12 JavaScript For循环

<html>
<body>

<script type="text/javascript">
var i=0
for (i=0;i<=10;i++)
{
    document.write("The number is " + i)
    document.write("<br />")
}
</script>

</body>
</html>

13 JavaScript While循环

<html>
<body>
<script type="text/javascript">
var i=0
while (i<=10)
{
    document.write("The number is " + i)
    document.write("<br />")
    i=i+1
}
</script>
</body>
</html>

14 JavaScript Break和Continue语句

  • break语句:使用break语句来终止循环。
  • continue语句:使用continue语句来终止当前的循环,然后从下一个值继续执行。

JavaScript For…In声明

<html>
<body>

<script type="text/javascript">
var x
var mycars = new Array()
mycars[0] = "Saab"
mycars[1] = "Volvo"
mycars[2] = "BMW"

for (x in mycars)
{
    document.write(mycars[x] + "<br />")
}
</script>

</body>
</html>

15 JavaScript事件

  • 事件是可以被JavaScript侦测到的行为。
  • 事件举例:
    • 鼠标点击
    • 页面或图像载入
    • 鼠标悬浮于页面的某个热点之上
    • 在表单中选取输入框
    • 确认表单
    • 键盘按键
  • JavaScript事件参考
    属性 当以下情况发生时,出现此事件 FF N IE
    onabort 图像加载被中断 1 3 4
    onblur 元素失去焦点 1 2 3
    onchange 用户改变域的内容 1 2 3
    onclick 鼠标点击某个对象 1 2 3
    ondblclick 鼠标双击某个对象 1 4 4
    onerror 当加载文档或图像时发生某个错误 1 3 4
    onfocus 元素获得焦点 1 2 3
    onkeydown 某个键盘的键被按下 1 4 3
    onkeypress 某个键盘的键被按下或按住 1 4 3
    onkeyup 某个键盘的键被松开 1 4 3
    onload 某个页面或图像被完成加载 1 2 3
    onmousedown 某个鼠标按键被按下 1 4 4
    onmousemove 鼠标被移动 1 6 3
    onmouseout 鼠标从某元素移开 1 4 4
    onmouseover 鼠标被移到某元素之上 1 2 3
    onmouseup 某个鼠标按键被松开 1 4 4
    onreset 重置按钮被点击 1 3 4
    onresize 窗口或框架被调整尺寸 1 4 4
    onselect 文本被选定 1 2 3
    onsubmit 提交按钮被点击 1 2 3
    onunload 用户退出页面 1 2 3

16 JavaScript Try…Catch语句

 

17 JavaScript特殊字符

代码 输出
\' 单引号
\" 双引号
\& 和号
\\ 反斜杠
\n 换行符
\r 回车符
\t 制表符
\b 退格符
\f 换页符

18 JavaScript指导方针

  • JavaScript对大小写敏感
  • JavaScript会忽略多余的空格
  • 您可以在文本字符串内部使用反斜杠对代码进行折行

19 JavaScript对象简介

  • JavaScript是面向对象的编程语言(OOP)。
  • 对象拥有属性和方法。
    • 属性:属性指与对象有关的值。
    • 方法:方法指对象可以执行的行为(或者可以完成的功能)。

20 JavaScript字符串(String)对象

  • 计算字符串的长度
    <html>
    <body>
    
    <script type="text/javascript">
    
    var txt="Hello World!"
    document.write(txt.length)
    
    </script>
    
    </body>
    </html>
    
  • indexOf()方法
    <html>
    <body>
    
    <script type="text/javascript">
    
    var str="Hello world!"
    document.write(str.indexOf("Hello") + "<br />")
    document.write(str.indexOf("World") + "<br />")
    document.write(str.indexOf("world"))
    
    </script>
    
    </body>
    </html>
    
  • match()方法
    <html>
    <body>
    
    <script type="text/javascript">
    
    var str="Hello world!"
    document.write(str.match("world") + "<br />")
    document.write(str.match("World") + "<br />")
    document.write(str.match("worlld") + "<br />")
    document.write(str.match("world!"))
    
    </script>
    
    </body>
    </html>
    
  • replace()方法
    <html>
    <body>
    
    <script type="text/javascript">
    
    var str="Visit Microsoft!"
    document.write(str.replace(/Microsoft/,"W3School"))
    
    </script>
    </body>
    </html>
    

20.1 String对象的方法

  • JavaScript的字符串是不可变的
  • String类定义的方法都不能改变字符串的内容
    方法 描述 FF N IE
    anchor() 创建 HTML 锚。 1 2 3
    big() 用大号字体显示字符串。 1 2 3
    blink() 显示闪动字符串。 1 2  
    bold() 使用粗体显示字符串。 1 2 3
    charAt() 返回在指定位置的字符。 1 2 3
    charCodeAt() 返回在指定的位置的字符的 Unicode 编码。 1 4 4
    concat() 连接字符串。 1 4 4
    fixed() 以打字机文本显示字符串。 1 2 3
    fontcolor() 使用指定的颜色来显示字符串。 1 2 3
    fontsize() 使用指定的尺寸来显示字符串。 1 2 3
    fromCharCode() 从字符编码创建一个字符串。 1 4 4
    indexOf() 检索字符串。 1 2 3
    italics() 使用斜体显示字符串。 1 2 3
    lastIndexOf() 从后向前搜索字符串。 1 2 3
    link() 将字符串显示为链接。 1 2 3
    localeCompare() 用本地特定的顺序来比较两个字符串。 1 4 4
    match() 找到一个或多个正在表达式的匹配。 1 4 4
    replace() 替换与正则表达式匹配的子串。 1 4 4
    search() 检索与正则表达式相匹配的值。 1 4 4
    slice() 提取字符串的片断,并在新的字符串中返回被提取的部分。 1 4 4
    small() 使用小字号来显示字符串。 1 2 3
    split() 把字符串分割为字符串数组。 1 4 4
    strike() 使用删除线来显示字符串。 1 2 3
    sub() 把字符串显示为下标。 1 2 3
    substr() 从起始索引号提取字符串中指定数目的字符。 1 4 4
    substring() 提取字符串中两个指定的索引号之间的字符。 1 2 3
    sup() 把字符串显示为上标。 1 2 3
    toLocaleLowerCase() 把字符串转换为小写。 - - -
    toLocaleUpperCase() 把字符串转换为大写。 - - -
    toLowerCase() 把字符串转换为小写。 1 2 3
    toUpperCase() 把字符串转换为大写。 1 2 3
    toSource() 代表对象的源代码。 1 4 -
    toString() 返回字符串。 - - -
    valueOf() 返回某个字符串对象的原始值 1 2 4

20.2 String对象的属性

属性 描述 FF N IE
constructor 对创建该对象的函数的引用 1 4 4
length 字符串的长度 1 2 3
prototype 允许您向对象添加属性和方法 1 2 4

21 JavaScript Date(日期)对象

  • 返回当日的日期和时间
    <html>
    <body>
    
    <script type="text/javascript">
    
    document.write(Date())
    
    </script>
    
    </body>
    </html>
    
  • getTime()
    <html>
    <body>
    
    <script type="text/javascript">
    
    var minutes = 1000*60
    var hours = minutes*60
    var days = hours*24
    var years = days*365
    var d = new Date()
    var t = d.getTime()
    var y = t/years
    
    document.write("It's been: " + y + " years since 1970/01/01!")
    
    </script>
    
    </body>
    
  • setFullYear()
    <html>
    <body>
    
    <script type="text/javascript">
    
    var d = new Date()
    d.setFullYear(1992,10,3)
    document.write(d)
    
    </script>
    
    </body>
    </html>
    
  • toUTCString()
    <html>
    <body>
    
    <script type="text/javascript">
    
    var d = new Date()
    document.write (d.toUTCString())
    
    </script>
    
    </body>
    </html>
    
  • 时钟
    <html>
    <head>
    <script type="text/javascript">
    function startTime()
    {
        var today=new Date()
        var h=today.getHours()
        var m=today.getMinutes()
        var s=today.getSeconds()
    
        // add a zero in front of numbers<10
        m=checkTime(m)
        s=checkTime(s)
        document.getElementById('txt').innerHTML=h+":"+m+":"+s
        t=setTimeout('startTime()',500)
    }
    
    function checkTime(i)
    {
        if (i<10) 
        {
            i="0" + i
        }
        return i
    }
    </script>
    </head>
    
    <body onload="startTime()">
    <div id="txt"></div>
    </body>
    </html>
    

21.1 Date对象的方法

方法 描述 FF N IE
Date() 返回当日的日期和时间 1 2 3
getDate() 从Date对象返回一个月中的某一天 (1 ~ 31) 1 2 3
getDay() 从Date对象返回一周中的某一天 (0 ~ 6) 1 2 3
getMonth() 从Date对象返回月份 (0 ~ 11) 1 2 3
getFullYear() 从Date对象以四位数字返回年份 1 4 4
getYear() 从Date对象以两位或四位数字返回年份。 1 2 3
getHours() 返回Date对象的小时 (0 ~ 23) 1 2 3
getMinutes() 返回Date对象的分钟 (0 ~ 59) 1 2 3
getSeconds() 返回Date对象的秒数 (0 ~ 59)) 1 2 3
getMilliseconds() 返回Date对象的毫秒(0 ~ 999) 1 4 4
getTime() 返回 1970 年 1 月 1 日至今的毫秒数 1 2 3
getTimezoneOffset() 返回本地时间与格林威治标准时间的分钟差 (GMT) 1 2 3
getUTCDate() 根据世界时从Date对象返回月中的一天 (1 ~ 31) 1 4 4
getUTCDay() 根据世界时从Date对象返回周中的一天 (0 ~ 6) 1 4 4
getUTCMonth() 根据世界时从Date对象返回月份 (0 ~ 11) 1 4 4
getUTCFullYear() 根据世界时从Date对象返回四位数的年份 1 4 4
getUTCHours() 根据世界时返回Date对象的小时 (0 ~ 23) 1 4 4
getUTCMinutes() 根据世界时返回Date对象的分钟 (0 ~ 59) 1 4 4
getUTCSeconds() 根据世界时返回Date对象的秒钟 (0 ~ 59) 1 4 4
getUTCMilliseconds() 根据世界时返回Date对象的毫秒(0 ~ 999) 1 4 4
parse() 返回1970年1月1日午夜到指定日期(字符串)的毫秒数 1 2 3
setDate() 设置Date对象中月的某一天 (1 ~ 31)) 1 2 3
setMonth() 设置Date对象中月份 (0 ~ 11)) 1 2 3
setFullYear() 设置Date对象中的年份(四位数字) 1 4 4
setYear() 设置Date对象中的年份(两位或四位数字)。 1 2 3
setHours() 设置Date对象中的小时 (0 ~ 23) 1 2 3
setMinutes() 设置Date对象中的分钟 (0 ~ 59) 1 2 3
setSeconds() 设置Date对象中的秒钟 (0 ~ 59) 1 2 3
setMilliseconds() 设置Date对象中的毫秒 (0 ~ 999) 1 4 4
setTime() 通过向或从1970年1月1日午夜添加或减去指定数目的毫秒来计算日期和时间 1 2 3
setUTCDate() 根据世界时设置Date对象中月份的一天 (1 ~ 31) 1 4 4
setUTCMonth() 根据世界时设置Date对象中的月份 (0 ~ 11) 1 4 4
setUTCFullYear() 根据世界时设置Date对象中年份(四位数字) 1 4 4
setUTCHours() 根据世界时设置Date对象中小时 (0 ~ 23) 1 4 4
setUTCMinutes() 根据世界时设置Date对象中分钟 (0 ~ 59) 1 4 4
setUTCSeconds() 根据世界时设置Date对象中秒钟 (0 ~ 59) 1 4 4
setUTCMilliseconds() 根据世界时设置Date对象中毫秒S(0 ~ 999) 1 4 4
toSource() 代表对象的源代码 1 4 -
toString() 把Date对象转换为字符串。 1 2 4
toTimeString() 把Date对象的时间部分转换为字符串。 1 2 4
toDateString() 把Date对象的日期部分转换为字符串。 1 2 4
toGMTString() 根据格林威治时间,把Date对象转换为字符串。 1 2 3
toUTCString() 根据世界时,把Date对象转换为字符串。 1 4 4
toLocaleString() 根据本地时间格式,把Date对象转换为字符串。 1 2 3
toLocaleTimeString() 根据本地时间格式,把Date对象的时间部分转换为字符串 1 2 3
toLocaleDateString() 根据本地时间格式,把Date对象的日期部分转换为字符串 1 2 3
UTC() 根据世界时,获得一个日期,然后返回1970年1月1日午夜到该日期的毫秒数。 1 2 3
valueOf() 返回Date对象的原始值。 1 2 4

22 JavaScript数组

  • 创建数组
    <html>
    <body>
    
    <script type="text/javascript">
    var mycars = new Array()
    mycars[0] = "Saab"
    mycars[1] = "Volvo"
    mycars[2] = "BMW"
    
    for (i=0;i<mycars.length;i++)
    {
        document.write(mycars[i] + "<br />")
    }
    </script>
    
    </body>
    </html>
    
  • For…In声明
    <html>
    <body>
    <script type="text/javascript">
    var x
    var mycars = new Array()
    mycars[0] = "Saab"
    mycars[1] = "Volvo"
    mycars[2] = "BMW"
    
    for (x in mycars)
    {
    document.write(mycars[x] + "<br />")
    }
    </script>
    </body>
    </html>
    

22.1 Array对象的方法

方法 描述 FF N IE
concat() 连接两个或更多的数组,并返回结果。 1 4 4
join() 把数组的所有元素放入一个字符串。元素通过指定的分隔符进行分隔。 1 3 4
pop() 删除并返回数组的最后一个元素 1 4 5.5
push() 向数组的末尾添加一个或更多元素,并返回新的长度。 1 4 5.5
reverse() 颠倒数组中元素的顺序。 1 3 4
shift() 删除并返回数组的第一个元素 1 4 5.5
slice() 从某个已有的数组返回选定的元素 1 4 4
sort() 对数组的元素进行排序 1 3 4
splice() 删除元素,并向数组添加新元素。 1 4 5.5
toSource() 代表对象的源代码 1 4 -
toString() 把数组转换为字符串,并返回结果。 1 3 4
toLocaleString() 把数组转换为本地数组,并返回结果。 1 3 4
unshift() 向数组的开头添加一个或更多元素,并返回新的长度。 1 4 6
valueOf() 返回数组对象的原始值 1 2 4

23 JavaScript Boolean(逻辑)对象

  • Boolean 对象是 JavaScript 的一种基本数据类型。
  • Boolean 对象是一个把布尔值打包的布尔对象。

23.1 Boolean对象的方法

方法 描述 FF N IE
toSource() 代表对象的源代码 1 4 -
toString() 把逻辑值转换为字符串,并返回结果。 1 4 4
valueOf() 返回Boolean对象的原始值 1 4 4

24 JavaScript Math(算数)对象

  • JavaScript提供8种可被Math对象访问的算数值:
    含义 算数值
    常数 Math.E
    圆周率 Math.PI
    2的平方根 Math.SQRT2
    1/2的平方根 Math.SQRT12
    2的自然对数 Math.LN2
    10的自然对数 Math.LN10
    以2为底的e的对数 Math.LOG2E
    以10为底的e的对数 Math.LOG10E

25 JavaScript HTML DOM对象

25.1 HTML DOM对象

对象 描述
Window JavaScript层级中的顶层对象。Window对象表示浏览器窗口。
Navigator 包含客户端浏览器的信息。
Screen 包含客户端显示屏的信息。
History 包含了浏览器窗口访问过的 URL。
Location 包含了当前URL的信息。
 

DVD视频提取转换初步研究

1 关于DVD格式

  • Digital Versatile Disc
  • DVD五种格式
    • DVD-VIDEO: 可达17G
    • DVD-ROM:
    • DVD-R: 4.7G
    • DVD-RAM: 可以作为虚拟硬盘
    • DVD-AUDIO: 比CD的音频品质好一倍
  • DVD区域码
    • DVD联盟将全世界依地理区域分为1-6区,而每一部DVD播放机及每一片DVD都会被锁定只能在某一区中播放(依产品贩卖的地区锁上相对应的区域码)。
    • 影片的锁码必须配合播放机的锁码(第1区的影片配合第1区的播放机,第2区的影片配合第2区的播放机.)你才能顺利的观赏影片!
    • 后来产的DVD播放机一般可以播放全区域的DVD
  • DVD版权保护
    • CSS(Content Scrambling System, 内容乱码系统)
    • 防类比设备翻录
    • 区码限制

2 关于VOB格式

  • vob文件用来保存所有MPEG-2格式的音频和视频数据,这些数据不仅包含影片本身,而且还有供菜单和按钮用的画面以及多种字幕的子画面流。
  • .ifo文件用于控制VOB文件的播放,在这个文件中可以找到如何控制.vob文件中数据播放的信息。
  • 有时候.ifo文件保存了一份副本,即同名的.bup文件。
  • 每个DVD光盘中都有视频管理器(VMG),它存放在VIDEOTS.ifo文件中,保存了光盘的全局信息,如光盘可以在哪个地区播放等。
  • 光盘还将用于显示菜单的数据保存在VIDEOTS.vob文件中,当光盘插入到光驱中时播放器会首先显示这个菜单,大多数菜单可让观众指定场景、选择语言字幕等。

3 关于TS流和PS流

3.1 TS流

  • DVD节目中的MPEG2格式,TS的全称则是Transport Stream。
  • MPEG-TS主要应用于实时传送的节目,比如实时广播的电视节目。
  • TS码流由于采用了固定长度的包结构,当传输误 码破坏了某一TS包的同步信息时,接收机可在固定的位置检测它后面包中的同步信息,从而恢复同步,避免了信息丢失。
  • 信道环境较为恶劣,传输误码较高时,一般采用TS码流
  • TS流(DVB-T,DMB-TH等)如果断了码流,后面的随时可以再开始解码怎么看都行。

3.2 PS流

  • DVD节目中的MPEG2格式,是MPEG2-PS,全称是Program Stream。
  • PS包由于长度是变化的,一旦某一 PS包的同步信息丢失,接收机无法确定下一包的同步位置,就会造成失步,导致严重的信息丢失。
  • 在信道环境较好,传输误码较低时,一般采用PS码流 如DVD等等。
  • ps流(主要用在DVD上)如是中间丢了一断码流,后面的都没法播了。

4 关于DVD格式转换

4.1 几个概念

  • angle: 高级的DVD支持同一段场景的不同视角(angle), 一般的DVD只有一个视角
  • Title Set: 基本上一个Title Set的视频为一组内容, 有的DVD会有好几个Title Set, 第一个Title Set往往是最长的, 包含了主体影片的内容; 其余的Title Set往往是一些影片花絮啥的.
  • chapter: 应该是DVD字幕上用于选择章节的东西.

4.2 GUI抓取转换工具

4.2.1 Windows

4.2.2 Linux

5 CLI工具, 自动化(脚本形式)的抓取转换工具

5.1 基本工具

  • lsdvd, 读取dvd信息, 可以得到title set, duration信息等等
  • dvdbackup, rip video DVDs from the command line, 同样可以读取dvd信息, 有时需要libdvdcss的支持, ubuntu上的安装方法可以参考Ubuntu Wiki.
  • h264enc, 交互式的抓取工具, bash脚本, 整个脚本将近一万行(支持非常多的配置选项)
  • ffmpeg and mencoder, linux下两款主要的音频和视频格式转换工具, 绝大多数的GUI工具都是这两个命令行工具的封装. 很多Windows播放器底层也是这两个. ffmpeg还有个有趣的Hall of Shame
  • mplayer and vlc, linux下两款非常有名的播放器, 功能非常qiangda, 支持framebuffer和ascii lib的输出, 很有趣.

5.2 土法炼钢提取vob视频文件并合成一整个视频文件

  • 原理: vob文件可以直接拼接(cat file1.vob file2.vob >> new_file.vob), 拼接出来的vob文件可以正常播放(测试了两个拼接的文件和拼接后转换的f4v文件, 网页和本地播放器均正常播放到结尾)
  • 思路:
    • 先将整个的DVD内容拷贝到硬盘(比较节省光驱资源)
    • 进入DVD视频文件目录(一般为VIDEO_TS)
    • 用lsdvd或者dvdbackup工具找出duration最长的title set, 提取出这个title set里面的vob文件
    • cat命令拼接这些vob成一个新的vob文件
    • 利用ffmpeg转换脚本转换成新的格式

5.3 h264enc交互式脚本合并

  • 原理: 给予mencoder的转换工具, 可以自动化的设置码率, 滤镜, crop参数, 提取vob文件合并到一个文件中(输出格式可以指定)
  • 思路:
    • 多做实验, 将每次做实验的结果进行对比, 选出最好的一组参数写成配置文件, 调用h264enc做自动化的处理

6 Todo list

  • 深入研究下mencoder的使用方法, 以及mencoder和ffmpeg的不同和关联
  • 深入了解分析下h264enc工具的脚本, 了解下h264enc的配置文件




Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee