WordPress网站迁移方案

我的博客最近就要过期了,不知不觉这个小站已经到了400M左右大小(基本都是图片占用的资源),服务器空间续费的话需要升级更高配置的套餐了,当然也要花更多的钱。但是不选择续费,而重新购买一次空间的话,就可以便宜一百左右。动动手指麻烦一下,省下一百块,还是蛮值得的。网站迁移的方法记录一下,以后可能有用。

我的网站迁移过一共三次,第一次是从新浪博客(广告实在太多了,一点都不好用)搬到了一个独立的小站。这次迁移没有什么好说的,因为新浪没有提供导出的功能,只好一篇一篇地复制过来,幸好那时候写的东西还不是很多。不过新浪的图片还有防盗链,整篇复制过来之后,图片是无法显示的,只能再下载到本地,然后上传到新的博客,太坑了啊!

然后用了Godaddy的主机,很便宜,但是速度在国内访问实在是太慢了啊!于是我又换了一家国内的空间服务商,经历了一段惨痛的备案经历之后,选择了港台服务器。就是现在用的这样,速度还凑活吧。从Godaddy换到港台服务器的经历也很痛苦,使用的Wordpress的导入导出功能,步骤如下:

  1. 从旧的Wordpress导出xml文件。
  2. 在新的空间安装好Wordpress,然后导入xml。
  3. 导入xml。
  4. 从源站的content/uploads中down下来所有的图片,上传到新的站点。
  5. 布置新的站点,更换主题,做googlefont替换成国内的等等。

这种方式缺点很明显,基本是重新建一个站,只是文章一样。而且我上传图片的时候,由于是用一台Windows下载,然后再上传的,导致了图片名字的编码出现了问题,所有图片名字含中文的都无法显示了。(这也提醒我们,在往Wordpress传图片的时候最好使用英文文件名字)。

现在这一次还是同一家服务商,不过因为折扣的原因没有续费而是新开一个空间。吃了以前的亏,这一次使用的方案就简单得多,只花了十几分钟吧。

  1. 将旧站Wordpress的根目录(注意不是所有目录,注意不公开的隐私文件的安全性)使用ftp下载然后上传到新站。最好使用和网站相同的操作系统,否则可能出现编码不一致的问题。如果新网站的panel上提供了类似ftp或者网站搬家的功能,就在方便不过了,只要输入旧站的ftp用户名和密码,就可以直接拷到新网站。我的空间就有,而且速度很快,400M不到一分钟。
  2. 这时候数据库的配置文件还是旧站的,不能正常连接。解决方法是:删除Wordpress根目录下地config.php,打开主页,这时候就和第一次安装Wordpress一样,要求输入数据库的信息,配置完毕后,主页可以正常打开了。
  3. 将旧站的数据库数据迁移过来。使用PHPmyadmin或者空间提供商提供的MySQL备份导出源数据,再进行导入就可以了。
  4. 最后一步,不要忘了将域名指向新的空间地址。

好了,本站的迁移也已经完成了。话说一年的空间又花了好多钱,还因为国内坑爹的备案制度不能用大陆的服务器多掏了几百块,好心疼……

还是好好写博客吧,不能浪费了这些钱。

 

动听的代码:音乐编程语言Alda

什么是Alda?

Alda是一种强大灵活的音乐编程语言,只需要在编辑器中写一些代码,然后通过软件将其编译成声音,就可以产生各种风格的音乐。它的作者Dave竭尽所能来让这门语言简单易用,对初学者友好。Alda的目标之一就是让编程经验不多甚至没有编程经验的人试用其进行创作。通过它的口号——为音乐家设计的一门音乐编程语言——也能看出它传达出的对无编程经验者友好的价值理念。

尽管Alda语法的目标是至简易用,但是扩展性依然很好,提供给用户的自由度很高。通过音乐编程的方式来带给作曲家最少的限制,或许可以激发创作潜能,这也是作者的一个心愿。

目前,Alda可以使用通用乐器数字接口中的所有乐器来创作曲谱。在不久的将来,Alda将会支持从基本声波、音乐文件中的片段或者其他形式的声音来合成音乐。Dave的初衷是,让所有的程序员和非程序员都可以轻松地创作各种形式的音乐,从古典乐到8位音乐到实验音景——只需要通过一个编辑器和Alda解释器。

这篇文章将会介绍如何安装并使用Alda写一些基本的乐谱。但开始之前,我们要先来了解一些历史。

UNC和MML

Alda的起源可以追溯到2004年。那时Dave在北卡罗来纳大学学习作曲和电子乐的创作方式。他尝试了FruityLoops但是没有什么进展。后来,开始沉迷于音乐编程的世界。敲门砖就是MML,在当时(可能现在依然是)那是创作任天堂的8位数字音乐最佳的方式。读了NullsleepMML指南并开始学习如何创作基本的任天堂音乐之后,Dave就沉迷于凭直觉创作音乐当中。但那时候一颗音乐编程的种子也在他的心里悄悄埋下了。

MML对Alda的影响很大。Dave很痴迷在文本编辑器中创作音乐的过程,但是他想将音乐变成扩展到更广泛地领域中去,他想取代通过MML创作音乐的方式并将其应用到音乐合成、电子乐甚至是古典音乐中去。

古典音乐?

Dave在成为一个职业的程序员之前,他所受的音乐教育使他对各种各样创作音乐的形式产生了兴趣。生活在计算机文化氛围浓厚的环境中,Dave也尝试过使用图形界面的程序来作曲,比如用过Guitar Pro来写吉他谱,对于传统的音乐谱子,他还尝试过CakewalkNoteworthy ComposerFinaleSibelusMuseScore等等。

其中,Sibelius用的比较多,这款软件可以生成乐谱的数字版本,从而得到每一种乐器的乐谱,不同的音乐家就可以方便地了解自己所负责演奏的部分。这个功能非常实用。

像Sibelius这样的音乐谱曲软件对专业的作曲家来说是一种重要的工具。然而对于同样是作曲家和程序员的Dave来说,这种GUI音乐谱曲软件存在很多局限性:

容易使人分心

在软件普及之前音乐是写出来的,所有的科技就是纸和笔。乐谱的布局、音符等等各种东西都是产生自大脑而流于笔尖。但是使用图形界面程序的时候,要选择一个音符就要在一层一层的菜单中查找,注意力就这样被转移了: 1. 找到你想要的东西很不便捷,当你找到的时候,灵感已经走了; 2. 所有的音符都列出来供你查找同样让人分心,Dave使用Sibelius的时候就常常在长时间寻找音符的时候走神。

相比之下,使用文本编辑器编程来创作音乐的方式可以更让人集中尽力。

限制太多

Dave认为作曲家所需要的创作环境应该回归根本——从一张白纸开始。还要可以借助于21世纪科技的力量,电脑应该可以解释乐谱并转化成音频以查看效果。如果可以方便地转化成传统的乐谱供音乐家阅读就更好啦。

图形化的作曲软件在当下已经做得不错了,不过他们走了捷径——跳过了“从白纸开始”。当然,如果你用Sibelius从头开始创作,看起来也像是从白纸开始,但是却比物理上的手稿纸差的多。你不能拿起笔来就开始写下心中的灵感,那些图形界面背后隐藏的数字限制住了你。

所有图形化的音乐编辑器都走了这种捷径。为了将你心中的音符表现出来,这些限制是必须的。音乐编程语言同样有这种限制(从某种意义上说这是所有的软件都避免不了的),但是因为它的可视化需求不高,也不需要维持一个图形用户界面,这种限制就小得多,降到了可以接受的范围之内。Dave作为一个作曲家,觉得这恰到好处,令人鼓舞。

安装

注意:由于Alda还在开发中,所以必须按照下面的过程来安装和运行,Dave尽可能将这些步骤设计的直观,如果发生问题可以通过电子邮件来联系他。相信在将来,Alda一定会更加简单易用。

开始安装之前,你需要两个工具:

  • Clojure的编译工具Boot。如果你的操作系统是Mac OS X,可以选择使用Homebrew安装,命令是brew install boot-clj。其他平台的安装方式可以查看这里
  • Alda执行文件,可以将下面的代码复制到终端运行安装:

现在alda命令行工具就已经安装好了。它可以解释和播放Alda文件,或者接收一行Alda代码来作为命令的参数。你也可以通过Alda的REPL(Read-Evaluate-Play Loop,阅读、评估、播放循环)来迭代创作乐曲。

Alda 101

我们先来通过Alda的REPL来体验一下Alda的语法吧,通过下面这个命令可以在命令行启动REPL:

注意:Alda使用了一个叫做FluidR3的音色库使MIDI听起来更舒服,首次启动的时候需要花几分钟下载一个125M的文件,如果不愿意下载这个文件可以使用alda repl --stock命令使用Java虚拟机内建的MIDI合成器(效果很糟糕)。

FluidR3下载完成之后,你将会看到下面这样的界面:

现在你就可以尝试在REPL中输入一些Alda代码了,按下回车就可以立刻听见效果。

上文已经提到,MML和LilyPond对Alda的影响很大,尤其是它们简单的语法。下面将会描述它们像MarkDown一样简单的语法,基本上可以达到所见即所得的效果。

音符

先从简单的开始,将下面这个形式的乐谱改写成Alda代码:

一共有四个音符:C,D,E,F.相应地Alda代码是:

试着在REPL中输入然后按下回车……什么都没发生对不对?因为没有指定乐器呀!先用钢琴来试试:

这次你应该听到钢琴弹奏的这四个音符了。你会发现提示符从>变成了p>ppiano的缩写,表示目前的乐器是钢琴,除非做出更改,否则接下来的代码都会以钢琴播放。

音阶

让我们来试试更多的音符。

你应该注意到了钢琴声从C大调持续上升。>在Alda语法中表示下一个音阶上升。在科学音调符号中音阶从C大调开始上升至B,一旦超过B,就在一个新的音阶上重新从C开始。在Alda中,每一种乐器都从音阶4开始,知道你告诉它改变音阶它才会变。改变音阶有两种方式:使用><来提高或降低音阶;或者使用o接一个数字直接指定一个音阶。如下例:

变音记号

音调升高或降低可以在后面加+或者-号。

连续使用两个升/降调也可以:

事实上,音符和升/降调在Alda中可以随意组合,虽然两个以上的升/降调没有什么用,但是语法中也没有强制制止这种行为:

上面是代替E调的不必要且笨拙的做法。

音符长度

Adla中音符的默认长度是1/4,可以通过在音符后面接数字来改变,数字代表音符长度类型,例如4代表1/4音符,8代表1/8音符,16代表1/16音符等。当你指定了一个音符的长度之后,接下来的音符都会默认使用这个长度。

上例中使用了|符号。这个符号用来分隔两段音乐,在Alda语言中是可选的,编译器会忽略这个符号。|的作用是让程序可读性更高。

休止符

休止符在Alda中和音符差不多,类似于“听不见”的音符。休止符用r表示。

附点音符

Alda也支持附点音符,使用方法是在音符长度后面加.,可以加一个或多个。

连接符

通过连接符可以将两个音符连接在一起,Alda中的符号是~

和弦

在同一时间用一种乐器演奏不同的音符,这就是和弦。在Alda中,和弦用/分隔多个音符来表示。

注意,就像连续的音符一样,指定了一个和弦的音符会影响后面的音符的长度。

在Alda里一个和弦中不需要所有的音符都用一个长度,这个特性使创作音乐时和弦的使用非常方便。

在和弦中也可以使用><来改变音阶,这样描述和弦的升降音就很方便了。

声部

Alda中多音符同时演奏的另一种表现方式是声部。上面用和弦表达的例子也可以组合和弦和声部来表现:

退出REPL,只需要键入bye然后回车。

写一章乐谱

刚刚,我们已经在Alda里尝试了一些代码,并且听到了效果。这种方式在确认一段音乐之前测试片段非常有用,当确认了曲调的时候,就该把它们写成乐谱了。

在Alda中,乐谱就是文本文件,你可以使用任何你喜欢的文本编辑器来写。按照约定,文件名应该使用.alda结尾。在终端的当前文件夹下建立一个新文件,并命名为test.alda来试一下吧。

然后在文本中键入以下内容:

运行alda play --file test.alda,你将会听到优美的巴松管曲调。

属性

你可能会发现在这里用到了新的语法,下面就解释以下这部分。(quant XX)(XX的范围是0-99)是改变音符的长度,但是不改变它的持续时间。数值表示的是听到的音符长度的百分点。当你听到上面的音乐的时候,F音符和G音符(调整至30%)很短而且是间断的,最后的A音符(调整至99%)就很长而且是连续的。

quant(quantization的缩写)是一种可以在Alda中设置的属性。volume也是一种属性,可以设置音符的声音。像大多数的属性一样,volume(也可以写作vol)的取值也是0-100.可以通过逗号分隔多种属性。

试一下编辑test.alda如下:

运行alda play --file test.alda你将会听到前两个音符和后三个音符的不同。

说句题外话,你可能会发现每次运行alda命令都会等上一段时间。这是选择使用Clojure的一个坏处:Clojure有一个众所周知的毛病就是启动很慢。你也可以通过REPL来测试——只要启动一次,之后的使用中就不会受到影响了。

在不久的将来,Alda会实现提前编译,单独运行,速度将会得到提升。

乐器合奏

终于,到了最好玩的地方了:写多个乐器合奏的乐谱。

Alda乐谱支持无限多的乐器同时合奏,可以在test.alda文件中尝试下面的代码:

在这里两种乐器是单独谱曲,小号和长号,但是当播放乐谱的时候,两种乐器会同时和谐地一起演奏。

也可以一次只写一部分,像下面这样:

这段代码和上面的例子效果完全一样。值得一提的是,当你切换成另一种乐器的时候,之前使用的乐器部分依然存在,只不过处于一种“暂停”的状态,当你切换回来的时候,可以从上次的地方继续写。

全局属性

上文中介绍了改变volume属性,tempo(节奏)是另一个可以改变的属性,下面就来试一下:

听见了吗?小号的声音变成了200bpm的速度,但是长号依然没有变,是默认的120bpm。这不是bug,而是一项特性。Alda中tempo是基于每一项乐器来设置的,这样就可以给两件乐器设置不同的节奏。

设置全局属性可以更改所有的乐器设定,方法如下:

tempo!属性通过加一个!改变全局乐器的节奏,可以试一下(tempo! 200)等。

标记

接下来要介绍的是Alda的特殊功能——它可以使乐器完美的互相配合。

标记的概念是,给一个音乐段标注一个名字。名字可以包含数字、字母、撇号、破折号、加号、圆括号,前两个符号必须是字母。下面是一些合法的例子:

  • chorus
  • voiceIn
  • last-note
  • verse(2)
  • bass+drums

使用标记功能需要两步。第一步,在一个名字的开头加一个%给音乐段命名;第二步,使用@接名字来将乐器插入这个音乐段。如下例,可以将大号(tuba)插入到小号(trumpet)的last-note部分。

到这里,目前Alda的所有功能就介绍完了,如果有任何问题和建议通过邮件来和Dave联系。这个项目是开源的,如果你是一个Clojure程序员,可以通过PR来贡献代码

 

Python的哲学

PEP20是一条很有意思的命令:

执行之后,你将会看到一首名为「Python之禅」的诗,原文及翻译如下:

The Zen of Python,by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren’t special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one– and preferably only one –obvious way to do it.
Although that way may not be obvious at first unless you’re Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it’s a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea — let’s do more of those!

Python之禅,作者Tim Peters

优美胜于丑陋
明了胜于晦涩
简单胜于复杂
复杂胜于杂乱
扁平胜于嵌套
间隔胜于紧凑
可读性很重要
特例不足以特殊到违背这些原则
不要忽视错误,除非程序需要这样做
面对模棱两可,拒绝猜测
解决问题最直接的方法应该有一种,最好只有一种
可能这种方法一开始不够直接,因为你不是范罗苏姆
做也许好过不做,但不想就做还不如不做
如果方案难以描述明白,那么一定是个糟糕的方案
如果容易描述,那么可能是个好方案
命名空间是一种绝妙的理念,多加利用

 

Python 3.5的新特性

Python 3.5.0在9月13号正式发布,与3.4相比,有哪些让人期待的新特性呢?(Note:本文首发在CSDN,禁止任何形式的转载)

  • PEP441优化Python对zip压缩包的支持。从2.6版本开始,Python支持将文件或zip形式的压缩包作为脚本执行,对于有必要作为一个文件发布又复杂到要分模块管理的应用来说,这个功能很实用。但是这个功能却鲜有人知,原因之一是当时没有很好地宣传,只在What’s New中提到,没有写到文档中;原因之二是Windows没有为这种形式的文件(.zip)提供相应地Python扩展名(类似.py)。所以这一次的版本中重新发布了这个特性,并且,定义.pyz.pyzw作为“Python的zip应用”和“Windows下Python Zip应用”的扩展名,并提供了一个简单的管理工具。
  • PEP448解包操作更加方便。*作为可迭代的解包操作符,**作为字典的解包操作符。list,tuple等数据结构通过解包操作会得到分散的对象,例如,*range(4), 4结果得到(0, 1, 2, 3, 4)
  • PEP461%操作符支持对字节和字节数组的格式化。
  • PEP465新增矩阵乘法运算符’@’。 a @ b表示矩阵a乘矩阵b,也支持a @= b
  • PEP471新增os.scandir(),能够快速遍历目录。
  • PEP475提供系统调用中断时自动重试的支持。
  • PEP479StopIteration异常改在生成器内部处理。现在如果生成器raise一个StopIteration,将会替换为RuntimeError。因为这个特性不能向前兼容,所以最初是以__future__的形式发布的。
  • PEP484新增typing模块,类型注释的新标准。支持通过def greeting(name: str) -> str:这种形式声明函数,来注释输入和输出地数据类型。
  • PEP485新增math.isclose(),来判断近似相等。
  • PEP486优化Windows平台对virtualenv的支持。在Windows中Python如果安装了virtualenv或者多版本共存的话,需要配置解释器的路径来指定一个解释器执行,但是并不会区分虚拟环境还是系统环境,如果使用pip等命令行,影响的还是系统环境。本PEP使系统能感受到“虚拟环境的存在”,也就说如果没有特别指定解释器,Windows中运行Python命令的时候会影响活跃的virtualenv,如果没有,再调用默认的Python。
  • PEP488不再使用.pyo文件名。扩展.pyc,如果添加优化参数,字节码文件同目录下生成.pyc将会使优化后的版本,文件中会保存优化级别。
  • PEP489优化内置模块和扩展模块的加载。
  • PEP492支持async/await语法的协程。优化了Python的异步,添加了awaitable object协程函数异步迭代异步上下文管理器等。

其他CPython的优化

  • LC_TYPE localePOSIX locale(C locale)时,sys.stdinsys.stdoutsurrogateescape错误处理器,不再使用strict错误处理器。

标准库重要优化

安全优化

  • 标准库禁用SSLv3.
  • HTTP cookie,解析更加严格,以阻止潜在的注入攻击。

Windows优化

  • Windows新安装器,替换MSI.
  • Windows构建以及扩展模块现在使用Microsoft Visual C++ 14.0。

反馈

  • redsymbol说,Python3变得越来越好了,他使用3比2多三年,并深深地爱上了Python3.有时候不得不用2.7,就会感觉从第五代工具回到了二代。 对此有人反驳说,是“从二代回到五代”吧,Python3没有参数列表自解(parameter tuple unpacking by itself),用起来感觉非常不友好。orf对此回应:我用了7年多Python都不知道这玩意是什么,也没在代码中见过,移除难用的feature是一大进步,如果你接受不了的话,我很抱歉。Py3 is awesome.(跟帖中有一大堆关于这个feature的讨论)
  • “你们搞的这个typing模块啊,excited!”ricw提到,这个模块解决了Python最大的软肋,以后Python会变得越来越专业化。
  • ceronman说这是他最喜欢的3.X版本,Typing注释模块,async/await,解包广泛应用,这些功能都很赞,遗憾是PEP0498没有赶上这个版本,期待3.6(原帖又是长长的对这一feature的讨论).
  • 如果所有的东西都兼容Py3,这个世界就完美了 :)。
 

学校不教的计算机课

最近HN上有一篇讨论较火的文章Computer Science Courses that Don’t Exist, But Should,翻译了一下。注意,这篇文章首先发布在csdn,禁止任何形式的转载。

CSCI 2100:忘掉面向对象编程

思考如何创建、使用不属于任何对象的变量。学习“函数(functions)”,它跟方法(methods)很像但是更有用的多。前提是你已经学过一门使用了“抽象基类的课程”。

CSCI 3300:像经典软件学习

讨论并剖析具有划时代意义的软件产品,比如VisiCalc、AppleWorks、Robot Odyssey、Zork、和MacPaint等。学习的重点,在于用户界面,以及由硬件限制激发出的创造力。

CSCI 4020:用低效语言编写高效代码

对性能进行深度分析,用解释型的Python语言来写出能与传统的编译型C++匹敌的代码。而且代码还会更加健壮,写起来也很有意思。

CSCI 2170:用户体验之”命令行工具”

提高用户体验的原则也同样适用于命令行工具的设计,要专注于输出信息的相关性,可读性,最简化。UNIX的“ls”命令就是值得好好学习的一个例子。

PSYC 4410(心理学高年级课程):程序员内心强迫症

能辨别和理解那些无关紧要,但是程序员偏偏会去较真的事情:代码格式、如何分类、类型系统,非要将项目分解成很多个。还包括接触到不熟悉的系统时下意识的批评的细节。


HN精彩评论

  • 我能再加一个吗?“网络不像你想的那么简单:分布式系统生存指南”。作为一个在职业生涯中花了很多精力建设高性能网络,也和这个领域里地人公事了很长时间的一个程序员来说,我对现在从名校毕业的学生在这方面的知识之匮乏感到震惊。很多基本的东西,像是应用的无线传输,系统如何处理数据包,等待对应用的影响等等,对于一些程序员来说简直一窍不通。现在看来,网络连接的实质问题,确实被严重忽略了。
  • 程序员分为两种:一种被训练成能在熟悉的环境中称职地编码;另一种则像是《黑客帝国》中选择了红色药丸的人——他们知道事物的本质。
  • 再加一些:
    • 在白板上写翻转二叉树
    • 用COBOL实现Monads
    • 如何正确地纠正网络上的评论
    • 上一条中的槽点可能有哪些
    • 对Twitter的多项式机器人算法有多糟糕的介绍
    • 用Haskell学习函数式编程
    • 上一门课的实际用途
  • 亲爱的机算计学院:请不要再拿“算法导论”课来愚弄你们的学生了,这门课应该改为“组合算法导论”,因为这才是你们教的东西。你们完全忽视了“数字算法”,这是许多其他计算机学科分支的基础(计算机物理、计算机化学、计算机生物学等),同时这也是机器学习和数据科学毕业生薄弱之处。或者也可以保留“算法导论”的名字,但是教50%的算法和数据结构,50%的数字计算方法和科学计算。
  • “建立端对端软件解决方案”如何?让这门课贯穿所有软件开发流程(想法-设计-原型-公测-发布-迭代)。我最好的朋友马上毕业了,可他对软件开发一无所知,根本不了解现在的市场需求。
  • “Debug”:严肃地讲,这是门完整、系统的课程,而且越早开设越好。这是其他学科/工程不可缺少的技能。
  • 计算机科学和软件工程应该分成两门完全不同的学科。