Category: Programming Language

0

使用curl下载中国好声音官方网站选手歌曲

最近一段时间,《中国好声音》真是火了大半个中国。大家茶余饭后,都在谈论选手、导师以及好声音的各种消息。每到周五晚上,大家也都尽早赶回家,守候在电视旁,观看新一期的好声音。 好声音如此火爆,选手们的歌曲如此好听,我们怎样才能拿到呢?我仅从技术层面上分析一下。 我们知道好声音的官方网站上有所有歌手的视听:http://voice.5ige.cn/ilmusic/voice/song.do?tagId=421,可以从这里直接下载,而且质量真心不错,320Kbps,48000Hz,完全满足日常听歌的需求。 如果我们直接看源代码,抓取声音的url,会发现无法直接下载。其原因是因为服务器端加上了对于referer的判断。我们使用curl,并添加对播放器flash的referer地址,便可以顺利下载了。 以下是下载中国好声音的bash脚本,仅供学习交流用,请勿用到非正常用途。 1 2 3 4 5 6 7 8 9 10 #!/bin/bash   songId=‘echo $1 | sed “s/.*songId=//“‘ currTime=‘date +%s‘ waveContent=‘curl -s “http://voice.5ige.cn/ilmusic/voice/getWave.do?time?=$currTime&sid=$songId“‘ singer=‘echo $wave­Con­tent | sed “s/.*singer\”:\”//;s/\”,\“songName.*//“‘ songName=‘echo $wave­Con­tent…

0

Program in Interview — Newline Break

Coding Requi­re­ment: The­re is a long sen­ten­ce compo­sed with letters and blank spa­ces, no other cha­ra­cters or symbo­ls. Assu­me line width is 20 cha­ra­cters (varia­ble) When line ends, if a word can­not be enti­re­ly…

“8020 Distributed Dental Management System” Milestone 1 Code Complete"> <span class=“8020 Distributed Dental Management System” Milestone 1 Code Complete" data-hu-post-id="5b2a068d19d2a" /> 1

“8020 Distributed Dental Management System” Milestone 1 Code Complete">8020 Distributed Dental Management System” Milestone 1 Code Complete

8020 Dist­ri­bu­ted Den­tal Mana­ge­ment System” is a pro­je­ct and a pro­g­ram based on .NET Fra­me­wo­rk 3.5 and WCF (Win­do­ws Commu­ni­ca­tion Foun­da­tion) Tech­ni­que. It is also a pro­je­ct for my postg­ra­dua­tion the­sis. It is desi­g­ned…

NumPy学习笔记(二) 0

NumPy学习笔记(二)

nda­r­ra­y的几个常用属性: sha­pe: 代表一个array的形态,是一个向量还是一个矩阵,抑或是一个更复杂的向量组。 ndim: 代表这个a­r­ra­y的维度 size: 在ar­ra­y中拥有的元素数量 ite­msi­ze: 这个a­r­ra­y中每一个元素所需要占的字节数 nbytes: 这个array的总字节数(=itemsize*size) real: 代表一个a­r­ra­y中所有元素的实数部分 imag: 同理,代表一个array中所有元素的虚数部分 flat: 将这个array整理成一维的,可以索引的一系列的元素组合。它实际上是通过iterator实现的,我们可以通过for x in array.flat来取得到所有的元素 T: 矩阵转置,同transpose()方法 一些比较有用的方法: toli­st(): 将ar­ra­y转化成一个Python中的li­st对象 item(*args): 取得某一位置的元素 dump(file): 将这个对象序列化至文件。同cPickle中的dump作用 dumps(): 将序列化的结果通过字符串加以输出 一些关于A­r­ra­y的形态操作: resha­pe(): 改变a­r­ra­y的形态…

0

Python Challenge Level 6

感觉变态程度越来越高了…… 入口地址:http://www.pythonchallenge.com/pc/def/channel.html 进去之后,一支巨大的拉链映入眼帘。根据以往经验,查看源代码。分析了一下,只有一个内容有用: <!– <– zip –> 根据那个拉链,再根据这个zip,看起来这道题跟zip关系十分之大。关键问题是怎么利用zip呢?百思不得其解。后来经过若干尝试,终于发现了原来隐藏的内容在channel.zip中。下载了这个文件,发现了一堆文件,里面又是指向下一个文件名的编号。和前几次中urllib的那回有异曲同工之处。打开readme文件: welco­me to my zipped list. hint1: sta­rt from 90052 hint2: answer is insi­de the zip 给了初始值,也给了暗示,答案在zip文件中。。按照当时写urllib的样子,写了这个循环的程序。 这里用到了python中的zip处理模块:zipfile。调用一个zip文件,可以通过zipfile.ZipFile()来打开;然后可以使用namelist()取得到所有zip文件中的文件名。infolist()可以得到关于zip的一些信息,另外通过read/write函数,可以读取、写入zip文件中的内容。 impo­rt re impo­rt zipfi­le value,n = 90052,1 print “ini­tial…

NumPy学习笔记(一) 1

NumPy学习笔记(一)

最近在学习scipy。在理解scipy之前,numpy作为scipy基本的模块之一,是不得不去理解掌握的。先总结一下numpy部分的内容吧。接下来学习scipy,最后是pylab和Matplotlib。 介绍 Numpy是一个Python的扩展模块,通过使用NumPy,我们可以进行科学计算。NumPy提供了矩阵、线性代数、傅里叶变换等的解决方法。 NumPy包含: N维矩阵对象 线性代数运算功能 傅里叶变换 For­t­ran代码集成的工具 C++代码集成的工具 NumPy提供了两种基本的对象:ndarray(N-dimensional array object)和 ufunc(universal fun­ction object)。前者为一个n维的矩阵在Python中的存储对象,它是一类同类型的对象(如int、bool、unicode、str等等)的集合。 下载 为了使用NumPy,首先要有Python。然后下载NumPy的包,即可。 Python 2.5: http://www.python.org/download/releases/2.5.2/ NumPy: http://numpy.scipy.org/ 使用 安装好后,首先引入模块: »> from numpy impo­rt * 创建一个矩阵 »> a=array([[1,2,3],[4,5,6]]) »> a.shape…

0

Python Challenge Level 5

r颇为变态的一道题。。 程序入口:http://www.pythonchallenge.com/pc/def/peak.html 文中强调:pronounce it… 把它发音读出来。通过观察源代码,发现它大量提到了 Peak hell 这个词。原来并没有接触过pickle,所以在这里费了半天劲,后来还是通过观察banner.p这个文件,发现很多存储的内容,很像序列化的东西。通过搜索后才确定是这个模块。 pickle是一个python的标准模块,几乎可以将任何一个Python对象作为字符串存储。在编程的时候我们经常管它叫做Serialization,也就是序列化。但Python里面将其称之为封装(pickle)。 例如,我们可以通过如下一段代码将一个tuple存入硬盘中: impo­rt cPi­ckle as picklex=(1,2,3,4,5)f=open(‘c:\\1.txt’,‘w’)pickle.dump(x,f)f.close() 而1.txt中是如下形式的一段内容: (I1I2I3I4I5tp1. 我们没有必要理解这段文档具体的存储方式,只是知道pickle可以存储内容就好了。接下来对banner.p解包。发现结果是一个list。 然后可以求出这个list的长度是23,而且list里面还嵌套list。拍拍脑袋想想这到底是做什么用的,想不出来……又仔细观察了一下,发现这个list的深度没有超过2,看起来像个矩阵。所以想到是不是图形? 后来实验了一下,成功了,呵呵。 附上源代码: from urllib2 impo­rt urlo­penimpo­rt cPi­ckle as picklef=urlopen(‘http://www.pythonchallenge.com/pc/def/banner.p’)result=pickle.Unpickler(f).load()print len(result) buf = ”for line in resu­lt:   …

VBA of Excel Programming"> Find different data between two columns in <span class=VBA of Excel Programming" data-hu-post-id="5b2a068e4ffc8" /> 0

VBA of Excel Programming">Find different data between two columns in VBA of Excel Programming

In some cases, you mig­ht want to find diffe­rent data between two colu­mns. In ano­ther word, you may want to cut some fie­ld from one colu­mn if it exi­sts on ano­ther colu­mn. Today I…

BJTU 2008-11-30"> 0

BJTU 2008-11-30">SMSVote @ BJTU 2008-11-30

昨天回到了母校交大,参与了一次交大校级的“百科知识竞赛”。由于这次竞赛上使用了本科时候和邱振生、王正韬一起开发的短信投票平台,所以倍感亲切。 交大没什么变化,虽然已经过去一年多了,这座有着百年历史的老校依然在这里默默地哺育着一代又一代的年轻人。唯一不同的是,在我看来,校园内稚嫩的面孔多了很多。自己当时也是那样子吧,每天生活无忧无虑的,不会太考虑自己今后所要承受的磨砺,而是享受校园悠然而快节奏的生活。 回到主题,谈谈自己的短信投票平台吧。去年在北大软院举办的十佳歌手大赛时候也使用了这样的平台,但不同的是,在北软当时只是使用了一块幻灯幕布,展示区域较小,没有体现出应有的效果;而在交大的天佑会堂里面,直接将投票幻灯投向大墙壁,效果很不错。   关于程序,是我们仨(软三工作室)在大三时候开发的。这其中还有一个小插曲: 最开始写的这个程序做了很多复杂的功能,比如一条短信可以分别给几个人投几票,一个手机号可以给几个选手投票,而这些投票的数量是可以接受控制的;另外系统也可以通过同一手机号同时接收短信短信投票与现场评论,最后还可以提供抽奖环节。这样一个系统,在开始的时候,我们做的并不好。每个30秒钟进行一次定时结果统计;同时如果收到短信以后也会自动刷新统计结果。这样,统计这个函数被大量调用。但一个可怕的问题是,我们的统计函数的时间复杂度是O(n3)……最开始票数少的时候还好,有一次组织方定了一个非常宽松的要求,每个人可以投十票。虽然只是一个院级的活动,但是收到了将近10000票。10000的三次方……每隔半秒钟不到(接收一条短信的时间间隔)就要刷新这么一下次,系统当时就崩溃了。 后来我们改进了算法,利用空间换取时间,把已经收到的进入了数据库的统计都存在内存中,每次投票统计只是刷新新进入的投票。这样,问题就迎刃而解,时间复杂度也降到了O(1)。压力测试后,接受20万条短信没问题(再大的就没有测试过了)。 面对自己亲手做成功的产品,心里还是很高兴的,毕竟所学的东西没有白学。设计模式、算法与程序设计、.NET应用程序设计……不得不说,交大的很多本科课程开的非常好。赞一下。 下一次回交大,不知啥时候了。但心情都不会平静,这是我的母校,这里有我很多最好的朋友。

Program: 多个相机的照片合并 0

Program: 多个相机的照片合并

今天从广西回来了。为了合并路途上三个照相机(我的、大姑父的和摄像机照的)的照片,将它们按照时间顺序排列,便于今后的剪辑,所以编写了如下的小程序。简陋得很,但是完成任务了,呵呵。 基本思想是先找出三个照相机的时间差,然后统一他们的时间。接着按照自己定义好的格式进行重命名。一共两千多张的照片(5个多G),五分钟内复制完毕。搞定。 程序使用C#写的,这个速度快呀。其实应该用Python,但考虑到还不是特别熟悉。要速度嘛,就没有质量了。 如果您也需要进行文件批量的有条件性重命名,可以考虑看看我的这个程序。^_^ using System; using System.Collections.Generic; using System.Text; using System.IO; name­spa­ce File­Re­na­mer {     cla­ss Pro­g­ram     {         sta­tic void Main(string[] args)         {             Date­Ti­me dt1 = DateTime.Parse(“2008–11–10  10:35:38”);            …