Archive for 七月, 2007

Youtube Video Downloader in Ruby

#Written by Cheng Meng
#Created on 2007-7-27

requireopen-uri‘

url_video = ""
youtube = "http://www.youtube.com/"
ARGV[0] =~ /(?:#{youtube}(?:watch\\?v=|v\\/))?(.*)$/
video_id = $1
open("#{youtube}watch\\?v=#{video_id}") do |f|
  f.each_line do |line|
    if line =~ /SWFObject\\("\\/player2.swf\\?([^"]+)"/
      url_video << "#{youtube}get_video?#{$1}"
      break
    end
  end
end
#puts "video:#{url_video}"
video = File.new("video_#{video_id}.flv","wb")
open(url_video) do |f|
  f.each_byte { |c| video.putc c }
end

This program is based on the idea explained in Peteris Krumins’s article Downloading Youtube videos with gawk.But I don’t know any gawk(巨拗口,in Chinese),and I just learn a little Ruby.So I decided to hack my own.

usage:save the above code as .rb file.This program accepts one argument to specify the url of the youtube video page.Three forms of urls are all permitted:the watch page,such as http://www.youtube.com/watch?v=En0A8KGMgq8,or http://www.youtube.com/v/En0A8KGMgq8,which usually contained in embedded code;even just the ID,En0A8KGMgq8,is OK.Then the script parses the argument,finds the actual url of video,and saves video to a “video_ID.flv” file.

Note:Linux users may need to change the mode option “wb” to “w”(I’m not sure about this,for I have not a linux system in my laptop).Only DOS/Windows needs this “b” to prevent Ruby from converting ‘\a’ to ‘\d\a’.I waste a lot of time in this problem.

Update:according to Corsair,the task of downloading should be given to more professional tools,such as wget.Just remove the last 3 lines and add “puts url_video”.Use pipe to connect my script to wget,like this:

wget -O output_filename `video_downloader.rb url`

video_downloader.rb is the modified script.

阅读(1109 次)

Comments (10)

Creating library with GCC

A Short Definition

A static library is basically a collection of object files.During the linking phase of compilation,the static library,or the object files in it, will be simply copied into the target executable file.Static libraries usually ends with a “.a” suffix in UNIX variants(including MinGW) and “.lib” in Windows.

A shared library,also called dynamic library(on Windows,they are the familiar dlls,the origin of “DLL Hell”) is “dynamically” linked into program in runtime.Why I use “dynamically” here is that during compilation the object files contained in shared library are not inserted into the final executable file;instead, when the program is started, a program in the system (called a dynamic loader) checks out which shared libraries were linked with the program, loads them to memory, and attaches them to the copy of the program in memory.

Creating Static Library

Suppose you have some object files with the name util1.o,util2.o,….Then then following command will create a static library “libutil.a” and puts all the objs into it:

ar rcs libutil.a util1.o util2.o ...

Note that the static library must start with “lib” and have the suffix “.a

ar can be used to creating,modifying and checking static libraries.
Read the rest of this entry »

阅读(662 次)

Comments (1)

Ising Model and Blog

Wordpress和Wikipedia阵发性解封;blogspot依然在小黑屋中。F**k GFW。

刘俊明老师在科学网上开了博客(貌似已经很久了……),上有精彩科普文章(主要关于Ising Model),强烈推荐。但是科学网的博客卖相很一般,排版乱七八糟,真是影响阅读体验。此外还有张志东老师(不知道是哪里的……汗,刚刚google了一下,发现是南大校友)的博客,张志东老师也写了一系列关于Ising模型解析解的文章,虽然排版极差(基本不分段)但内容一点也不含糊。关于Onsager如何得到他那永垂不朽的二维Ising模型严格解的八卦尤其精彩,学物理的同学一定要看。以后就算不搞物理,也还有八卦可以吹牛。当然,张老师最后用很大篇幅介绍了他关于三维Ising模型严格解的工作,充满技术细节,他自己说这还是一个猜想。以前看过一篇文章,据说证明了三维Ising模型是个NP-Hard Problem,不知后事如何。

Read the rest of this entry »

阅读(1092 次)

Comments (8)

归根结底,一场闹剧

大家一看着标题,就应该知道我说什么了,同时脸上会露出一种很神秘很暧昧的微笑。所有看中国足球的人,哪怕看一场,不管是头球队大胜马来,抑或打平就出线然后惨败乌兹别克,都能体会到真真切切的荒诞感。

中国有很多奇怪的事,按照一种不是逻辑的逻辑走,走得红旗飘飘,最后走向莫名其妙。朱广沪在赛前喊出刀架在脖子上,足协主席谢亚龙会在输球后跑进更衣室高唱抗日诗歌……凡此种种,无不光怪陆离,你还能说什么?只好虚无主义,说这些哥们早就习惯了,一场闹剧而已。换个主教练,正常一点的,世界杯预选赛失利;次一点或背一点或两者兼而有之的如朱广沪,亚洲杯小组不出线。再往上点,换个足协主席,口号照喊,官僚依旧,就这样一次次的轮回,从失败走向失败,从深渊走向深渊。李大眼说得好,连悲剧都不是,只是一场闹剧,一地鸡毛,一声叹息。

Read the rest of this entry »

阅读(1038 次)

Comments (2)

Tip:Code Layout

用一个很原始的办法解决了代码显示的问题:把代码放在pre标签里头,就能正常显示空格了。这个技术在其他一些blog上也不很管用,比如blogger,似乎可视化的HTML编辑器会对输入内容动很多手脚,把空格什么的都删除了,解决办法是关掉可视化编辑器,直接写html。所幸在Scinese上pre标签还能正确显示,这样只要把代码在Vim里转成html再贴过来就行了。剩下的问题是字体大小,因为页面宽度比较小,一旦有较长的行就只能显示一部分,变成了残缺美。更可恨的是,代码在firefox下和IE下显示的字体大小居然大不相同!我不是很懂html和css,碰到这种情况只能哀叹一下并坚定以后找时间学css的决心,别无他法了。

贴一个煞笔然而无处不在的Hello World:

#include <stdio.h>

int main(int argc,char **argv) {
    printf(“hello,world!n);
    return 0;
}

按照corsair的意见,color这种史前文物不符合xhtml标准,应该毫不留情地抛弃……但是wordpress又不让inline css,两难之下,还是觉得高亮效果比符合xhtml标准更重要,继续使用color。

阅读(879 次)

Comments (1)

How GCC Divide

While I’m working on the module of my project which translating arithmetic operations into machine code,I think I should take a look at how gcc does it,especially (one of)the most wierd operation in i386 instruction set,div.After examining gcc’s output(using -S option when compiling),I find something interesting.When divisor is a constant integer,for example,an expression like x/3 (assuming x is a local variable with type int)in C source code,gcc will translate it into a seemingly strange sequence of instructions:

movl  $1431655766, %eax
imull x
movl  %edx, %ecx
movl  x, %eax
sarl  $31, %eax
subl  %eax, %ecx

(the result is stored in %ecx)

Read the rest of this entry »

阅读(847 次)

Comments (2)

Age of Abundance

装逼文字一篇,厚颜地blog出来:

现在,每天相当于有1000G的数据被传输到互联网上。这相当于5万个视频短片,2.5亿个杂志故事,或者5亿个博客。重点不在于供给,而变成了选择的智慧。

是的,现在的问题是:太多了。信息不断的被制造出来,然后被遗忘在网络的某个不知名角落,呆在某块磁盘的一条不起眼的磁道上,直到某天一条delete命令扫过,重新归于零。五年前——甚至两年前——虽然网络已经是个庞然大物,但仍然可以掌握,除了几个大的门户网站和论坛,别的什么个人主页之类的,自生自灭,和传统媒体世界在结构上,或者说拓扑上没有太大的区别——我们可以说两者是同构的,同胚的(在这里我卖弄了两个数学词汇)。慢慢的情况有了变化,信息的积累到了一定程度,就需要有更高一层进行处理的工具出现:筛选,过滤,组织。这就是搜索引擎。在我的字典里Search Engine就等于Google,Baidu只是用来找找mp3。好了,就算这样,“太多了“问题仍然没有解决:Google原则上让我们能够找到网络上的一条狗,同时会找出无数条差不多的狗。虽然Google有伟大的PageRank算法,但仍然只是机器,还不能和人肉搜索相比。那么只好人多出一点力,先把信息组织一下。当然,这样的努力早就有了,比如Yahoo,比如新浪。

但是新时代的特征是“You”,是slashdot,digg,wiki,flickr,youtube,……,是blog,是长尾理论,是三个臭皮匠。让所有人都成为信息生产者(本来他们只是被动的消费),这就把原来星形的信息传播方式——从少数拥有者向多数消费者,变成了一个复杂的连通图。这个想法似曾相识,仿佛就是自由贸易和市场经济,看不见的手。我每天在网上的主要活动之一就是在reddit,slashdot(及它的中国后裔solidot),cnbeta上刷新,在Google Reader上看blog(rss真是伟大的发明)。这些聚合类站点的基础是民主,从某种意义上和人民代表大会一个性质。我认为本质上,它们就是事实上的人肉搜索引擎。当然民主有它的缺点,那就是多数人打压少数人,学究点叫多数人的暴政。必须承认,阳春白雪,曲高和寡是存在的;好东西往往不被大众所认知;大众肯定的不一定就好,等等很多”往往“,“不一定”,大量的例外。但是没有办法,完美是不存在的,我们需要的是一个可行解,并不一定最优。

我想这个变化可以称得上是革命性的。我们找到了一种办法,来解决“太多了”这个难题。这个办法并不陌生,几百年来已经成为人类社会的基础。我准备了几个神秘的说法,比如:在系统包含足够多的成员时,自组织就可以实现。相互作用导致了复杂结构。等等。总之,我们处在一个信息的暴涨时代,一个age of abundance,一个age of uncertainty。

p.s. 昨天把自己一些乱七八糟的想法写上来之后,看到一篇专业人士的文章,The Role of Humans in Google Search by Matt Cutts,比我从一个用户的角度泛泛而谈要深入的多。Google黑板报上有中文翻译

阅读(802 次)

Comments (3)

华丽的插件

这两天去上海了,事情没办成,灰溜溜地回来。登上Scinese一看,一个震撼性的消息震撼了我:LaTeXRender!可以在post里写数学公式了!我认为,Scinese很有可能是第一家支持LaTeX的Blog服务(那些个人搭的Blog不算),或者再加一个范围上(中国)的限定。

再看了一下,发现不少新插件,CoolCode(好像早就有了,但是插件列表里没显示……)、Douban等等,兽血沸腾了。

CoolCode还是没达到我的期望,到底怎么样才能正确的在code里面显示缩进呢?郁闷

阅读(1087 次)

Comments (3)

Garbage Collection Algorithm

Quick Taxonomy:

  • Reference Counting
  • Tracing Collector - traverse live objects
    • Mark-and-Sweep Collectors
    • Copying Collectors
    • Hybrids

Other collector characteristics:

  • Conservative Tracing
  • Generational Tracing
  • Real or Incremental

上面这个大纲基本上概括了目前的主流垃圾收集算法。一般来说,工业产品级的实现,通常是在标记-清扫算法和复制算法的基础上,引入分代式或渐进式(也叫增量式)策略。对像我这样单枪匹马实现语言的人来说,暂时可以把分代式和渐进式仍在一边,先把标记-清扫算法和复制算法弄清楚再说。至于古老的,最通俗易懂容易实现的引用计数,我想已经成为边缘算法了。据说Python用的还是RC,反正Python这么慢,也不差这一点了……

说到垃圾收集,最重要的莫过于性能问题。垃圾收集和人肉回收哪个比较快?标记-清扫算法和复制算法哪个比较好?就算是标记-清扫算法,在这个名下也有许多变种,哪个最好?在下结论之前,不妨先问一问:好的标准是什么?衡量垃圾收集算法的指标在哪里?垃圾收集界老大之一,Hans-J.Bohem做过一个lecture,题为Memory Allocation Myths and Half-Truths,前半部分集中谈内存分配算法,后半部分讲垃圾收集,很值得一读,作为进一步研究前扫除知识垃圾之用,充分凸显了内存管理这一问题的复杂性,让我们养成一种小心谨慎的态度。Bohem的演讲可以概括成一句话:具体问题具体分析,实事求是(这是我党的重要思想,可以应用于世上一切已解决与未解决的问题……)

下面简单的列举一下gc算法需要考虑的几个方面:

  • 时间,包括垃圾收集本身的时间,以及内存分配的时间
  • 空间,主要是内存的使用量
  • 局部性,碎片问题以及缓存性能

上面三点,每一点展开都洋洋洒洒,并且三者相互影响,错综复杂。特别是最后一点,很容易被人忽视但实际上非常重要——也非常难搞。把这些内容全部弄清楚不是像我这样的门外汉力所能及;就算是专家,面对这样复杂的问题也不敢妄言自己都明白了,并且本身这里面还有许多未解决的问题。我的目标,就是学习一下基本的Mark-Sweep Algorithm和Copying Algorithm,并实现一个Garbage Collector来用在我自己的语言上。

阅读(832 次)

Comments (2)

GFW

中国网,封天下

功夫网(GFW)

每次提到GFW都让人一肚子邪火,至今blogspot,wordpress和flickr都不能通过正常渠道访问。中国的网民在使用代理这一项上毫无疑问得处于世界领先水平——都是逼出来的。前不久GFW莫名其妙的把Google Page Creator干掉了,这两天又赦免了,不知道能保持多久。

很明显,GFW要封锁的目标都是那些能够让用户自由传播信息(文字、图片等等)的服务,而这种用户参与的模式正是所谓Web 2.0的特征,从Wiki到Blog到Flickr这样的图片社区,都为广大人民群众提供了一个难得的平台——自由、平等、公开的交流,共享。自由经济有多么大的能量我们就不说了,而思想、文化、知识的交流,其重要性必须上升到人类社会进步的高度去衡量。 这就是先进文化的发展方向,政府把三个代表挂在嘴边(估计也挂不了多久了,如今社会最红的词是河蟹),却不敢面对现实,实在是一种很不自信的表现。

说完GFW,再来骂通信服务的硬件设施。中国的宽带,就其提供的服务质量和其收费的对比而言,在世界上估计也是高处不胜寒。我曾经看过一张触目惊心的截图,是在米国上网下载东西,就用IE的弱智下载工具,速度也能飚到2M/s(这里有个单位的问题)。米国人民身在福中不知福,觉得网络速度还不行。这是因为有个更狠的作对比,那就是我们一衣带水的近邻,日本。前不久看到消息,称印度政府准备在N年内实现免费宽带,并且逐步把国有的电信产业放开。虽然现阶段我国的国情极其复杂,但迄今没有看到任何在这方面提高的努力,只有开倒车的努力。或许中国真是太复杂了。

阅读(612 次)

Comments

« Previous entries