行者无疆 始于足下 - 行走,思考,在路上
新鲜热乎刚出炉的网易笔经
投了网易招聘的两个职位,都是系统运维工程师,一封据信一封笔试邀请函……今天晚上6点早早离开公司,坐车到玉泉正门代售点买了回家的火车票,结果脑子进水了,本来要买9月30号的票,硬说成了买10月1号晚上到北京的票……还是无座…… 算了,怎样都要回家看看的。跟公司请了假,在家可以待到10月10号。然后可以继续实习,保证每天三天就行,剩下的时间可以边实习边找别的工作——如果想留在公司,非常欢迎。老婆说公司对我太好了,要是她的话就感动的留下来了。算了,废话少说,说说今天的网易笔试吧。快七点才到场,等了5分钟才拿到卷子,笔试卷子分为两部分:基础部分和专业部分。其中基础部分是所有人技术类岗位必做的试题,专业部分则是根据你报的岗位出的题目。考试时间是两个小时,大概有30道题目左右吧。我报的是系统运维工程师,临交卷的时候在草稿纸上记了一下题目,现在写出来供大家参考。
基础部分
一、计算机基础知识部分
- 下列哪些可以用作并发控制(多选) A、信号量 B、原子操作 C、自旋锁 D、管道 【AB】
- 快排和堆排序的最差情况下的复杂度是多少【】
- 关于设计模式【不会、蒙的……】
- 简述TCP建立连接的过程【三次握手……】
- 简述RAID1和RAID5【依稀记得当初查过百度百科,胡侃了一通】
- 最大子段和写代码【这个应该没啥问题,就是那个的算法】
二、Java部分
- Java,abstract,finally等【凭感觉】
- Java……【凭感觉】
- Java……【凭感觉】
- equals()方法和hashCode()方法区别【是不是类似于PHP中的==和===两个运算符之间的区别?】
三、数据库部分
- 列举至少三种形式的数据库索引【不会……】
-
给两个表:
- 写SQL查询语句【SQL,还涉及到子查询和排序,比较复杂,只写出了基本样子】
- 问这种情况下的表应该怎样建索引才能提高效率【不会……】
四、C++部分
- STL,map<int, string> m,问m.insert(map<int, string>::value_of())方法和map m[1] = "test"有何区别【不太会……】
- const pointer【char *p、const char *p、char const *p、const char const *p的区别】
- c++【忘了……】
- c++【虚函数代码、蒙的】
专业部分
- Linux系统中如何查看CPU、内存、硬盘、网卡型号【cat /proc/cpuinfo,cat/proc/meminfo……】
- Linux中如何查看某个分区的大小,如何查看某个目录的大小【df -h | grep sda、du -h --max-depth=0 .】
- Linux中如何查看网卡的工作模式、速度、IP地址、路由信息【ifconfig、route、/etc/network/interfaces?……】
- 写出DNS、FTP、Http、Https、POP3、SMTP、SNMP、SSH、TELNET等应用层协议的底层传输层协议和端口号【能写多少写多少】
- 给定三个终端截图,问你这三张图分别是那个命令的运行结果。(第一个应该是free命令,第二个是top命令,第三个不知道……)【free、top、还有一个不知道……】
- 给你一段apache的日志,让你用Shell Script、Python、Perl和Ruby写脚本,求出哪个资源如(... GET \apache.gif ...中的apache.gif)被请求的次数最多。【Shell Script基本写出,Python给出了思路、Perl和Ruby不会……】
- 正则表达式提取URL地址中的站点名称和资源名称【参见正则表达式30分钟入门】
- 给出几种服务器之间拷贝文件的解决方案【NTF、Samba、ssh(scp)、rsync、ftp等】
- 给出几种web server并简述其特点。【MS IIS、Apache、Lighttpd、nginx】
- 写出你所知道的web框架并简述其特点。【Java SSH、Python Django、RoR(其实都不会……)】
- 写出你所知道的几个自由软件开发者并简评。【RMS、Linux、Eric Raymond、Knuth……胡侃】
- 写出你最拿手的三项计算机技能。【胡侃】
【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, ..., 20}集合中,挑选出3个数字,使得这3个数字不完全相邻,如{1, 2, 3}, {4, 5, 6},有多少种挑法?
- 32位机器表示的有符号数最小值是多少?
- Unix文件的一道题目?
- 1024!的结尾有多少个零?
- c语言指针的一道题?
- 数组中寻找中位数的算法复杂度是多少?
- 访问内存性能的一道题目。
- 忘了……
剩下的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%左右吧。两道题目如下:
给定一个N行,M列的正整数组成的矩阵,求其中的一个子矩阵,使得奇数的个数与偶数的个数差值的绝对值最大 Input 每个文件包含一个测试数据。第一行是两个整数,N,M 表示矩阵的大小 1<=N,M<=100。 接下来N行,每行M个正整数,对应为矩阵中的元素,所有的数不超过2^30。 Output 输出包含一行,为子矩阵中奇数个数与偶数个数差值绝对值的最大值。 Sample Input3 3 1 2 3 3 2 1 1 1 1Sample Output 5 |
给定两个整数数组分别为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 Input4 3 2 6 1 3 2 6 3Sample 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; }
第二题的思路比较清晰了,需要注意的是负数的情况,考虑四个正数,显然,就是要得到最大值,大大相乘优先。如果遇到负数,负负为正是可以考虑的,正负相乘则需要舍弃。按照这个原则进行排序、分割,在处理下去就不难了。有一个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 ,感觉一是做产品真的很不容易,二是念了这么多年书,终于能做出一些东西来,还是小有成就感的。上周日约了一批人去植物园游泳,四米深的池子,九个大老爷们集体跳水的景观还是挺壮观的;天色黑的时候,水底的灯光粼粼闪动、非常漂亮,虽然四米的水压压的我耳朵有些痛,我还是不断地潜下去体验–;我想到了Le grand bleu。
技术上还是接触了很多新鲜的概念和名词,"I don't know I don't know" ==> "I know I don't know",在此一并罗列出来:
- 视频转码方面:
-
Linux
- Shell Script
- Graphics Magick
- zgrep, zcat
- 多重定向工具tee
- ssh系列, ssh-keygen, ssh-copy-id, scp, sftp
- charset convertion tools: iconv, enca
-
samba初步系列:windows和linux之间的文件共享
- smbmount的参数之间不能有空格,iocharset一般设置为utf8即可
- story about CR && LF
- patch && diff
- How to Become a Hacker
- Concepts
-
Networking
- Planet Lab
- 带宽测速
- rsync协议
- NAT
- 八秒定律
-
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名人的反思、成长经历也给了我很大的启发:
-
雷军的“反思”
- 人欲?天理?
- 什么是运气?
- 互联网的精神?
-
一个人的豆瓣
- 星巴克……
- Python!!
- Gentoo!!!
- 十几个人的精英团队!!!!
- 我理想的雇主???
-
六间房百日记
- 团队的力量
- 创业前的历炼
- 人脉!
代码看累了就会走神,偶尔拾到几个贝壳,抄录在本子上–一些话:
- 我总希望有人在什么地方等我,你也总希望有人在什么地方等你吧(几米《照相本子》)。
- 幸福的步道,总是那么短,我们可不可以赖着不走。
- 这是八月初的一个早晨,美国南部的阳光舒迟而透明,流溢着一种久经忧虑的让人鼻酸的、古老而宁静的幸福(张晓风)。
- 得意时便生失意之悲。
- 其实不是时间在流失、流逝的是我们自己。
- 不论怎么样,大家总是一年一年地来到这个路口,然后各自去闯荡(好像来自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,好友遍地,却不知道什么时间该找谁说些什么话。我们再也没有提笔书信时的那种思考、没有等待书信时的那种期盼。信息泛滥,手机滴滴嗒嗒,我们在这头时刻准备着–接受别人的审判。这或许是对网络通讯世界的一种讽刺?
接下来的安排:9月第一周数模国家赛,三天三夜的拼搏;看完Python和JavaScript,重点看C++算法和Networking;关注各种校园招聘;10月第一周回家呆几天修整,学车考驾照;十一回来结束实习,全面投入找工作事宜,争取在年底搞定;如果有时间出去走走,可选地东北或者东南亚。Over,暂时这样。安。
w3cschool javascript 笔记(1)
Javascript 教程
Table of Contents
- 1 简介
- 2 如何实现JavaScript
- 3 把JavaScript放置到何处
- 4 JavaScript语句
- 5 JavaScript注释
- 6 JavaScript变量
- 7 JavaScript运算符
- 8 JavaScript比较和逻辑运算符
- 9 JavaScript If…Else语句
- 10 JavaScript消息框
- 11 JavaScript函数
- 12 JavaScript For循环
- 13 JavaScript While循环
- 14 JavaScript Break和Continue语句
- 15 JavaScript事件
- 16 JavaScript Try…Catch语句
- 17 JavaScript特殊字符
- 18 JavaScript指导方针
- 19 JavaScript对象简介
- 20 JavaScript字符串(String)对象
- 21 JavaScript Date(日期)对象
- 22 JavaScript数组
- 23 JavaScript Boolean(逻辑)对象
- 24 JavaScript Math(算数)对象
- 25 JavaScript HTML DOM对象
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视频提取转换初步研究
Table of Contents
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字幕上用于选择章节的东西.
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的配置文件