时雨小径 May the Spirit be with you

完整

因此,人要离开父母,与妻子联合,二人成为一体。— 创世纪2:24

就是那种每一个拍子似乎都可以和上的感觉,像是两个相契的零件结合在一起,自然地让人有点不敢相信。

感谢神的计划与成就。

新坑: 时雨

地址在此
欢迎把玩.

眼看着数据库里的歌的数据也有3万首了, 所以想玩点新花样出来.

第一个是想要实现按歌手搜索歌曲. 要做这个的前提是需要把歌手的信息稍微标准化一下, 在现在的数据库里, 只是在每首歌的记录下有一个歌手的名字, 然而这里会出现的情况就是一个歌手的名字可以有好几种形式, 最简单的一个例子就是简繁体, 一个'张国荣', 另外一首歌下面的记录是'張國榮', 会被识别成两个歌手. 直接的想法就是建立另外一个表, 里面储存所有歌手的信息, 使每一个歌手都被分配到一个单独的ID, 再利用这个ID与歌曲的记录关联起来. 这样一来也解决了一首歌有两个歌手的情况.

实现这一步的时候, 人肉/暴力是不能接受的, 没那么多精力. 所以呢, 首先设定的目标就是在一定的错误容许范围内尽量地产生可接受的数据, 之后可以在这个基础上人肉校对.

在这里利用了musicbrainz这个音乐数据库, 借用其提供的API, 可以通过名字搜索歌手, 这是一个XML结果例子:

 <artist id="d780609b-eca5-4277-a0c2-801cc0404764" type="Person" ext:score="100">
         <name>張國榮</name>
         <sort-name>Cheung, Leslie</sort-name>
         <gender>male</gender>
         <country>HK</country>
         <area id="0373cdff-eac8-3fbc-92dc-36a607da06d1">
            <name>Hong Kong</name>
            <sort-name>Hong Kong</sort-name>
         </area>
         <life-span>
            <begin>1956-09-12</begin>
            <end>2003-04-01</end>
            <ended>true</ended>
         </life-span>
         <alias-list>
            <alias sort-name="±i°êºa" type="Search hint">±i°êºa</alias>
            <alias locale="en" sort-name="Cheung, Leslie" type="Artist name" primary="primary">Leslie Cheung</alias>
            <alias sort-name="Zhang Guo Rong">Zhang Guo Rong</alias>
            <alias locale="zh_Hans" sort-name="张国荣" type="Artist name" primary="primary">张国荣</alias>
         </alias-list>
         <tag-list>
            <tag count="1">
               <name>chinese</name>
            </tag>
            <tag count="1">
               <name>cantonese</name>
            </tag>
         </tag-list>
      </artist>

其中包括了一个MBID, 就是这个数据库的为每个歌手分配的独一的ID, 并且可以看到在alias里可以找到该歌手其他形式的名字.
所以, 我在脚本里处理一个歌手的名字的过程就是:

  1. 调用musicbrainz的API, 传入歌手名字
  2. 在结果中寻找是否有匹配
  3. 如果在结果中找到匹配, 得到MBID, 在本地数据库歌手的表中中按MBID搜索, 如果已经有了, 则说明该歌手已经被记录, 如果没有, 则把歌手已经MBID添加到歌手的表里.
  4. 关于歌手头像, 我是用的LAST.FM的API, 还是挺好用的, 很多不知名小歌手的头像也能找到.

中间也有很多问题, 比如说同名歌手问题, 或者有些小众歌手没有被musicbrainz收录, 或者收录了但是Alias里提供的没有匹配到. 我觉得这个要靠脚本解决会把脚本写得很臭很长, 花在测试以及debug上的时间还不如我人肉去把歌手名字改一改, 所以花了一点功夫在考虑脚本过程中的如何产生log来方便之后的人肉校正, 比如说通过匹配Alias过程来为已有的歌手姓名提供一些"改名建议"以方便标准化脚本的运行, 目前看来这个决定还是明智的.

做了一个找相似歌手的功能, 比较粗糙, 用的算法还是以前的, 可以参考以前写的这个简单推荐系统算法.

然后是在播放资源上的一个"改进", 之前因为豆瓣防盗链的缘故, 会检查header里的referer, 如果不符合规则就会返回403, 因为Javascript不能实现修改header的功能, 所以之前的办法是利用chrome的插件来修改web request里的header来骗一下豆瓣的服务器, 但是这个, 总之还是觉得不够方便, 首先, 换个浏览器就听不了, 然后移动端用手机平板就听不了, 再者, 要demo给别人看的时候还非得让他用chrome再装个插件, 太不专业.

所以这次借着新坑顺便也把这个给解决了, 方法就是相当于把我的服务器当成一个代理来用, 在服务器上通过解析出来的URL读取豆瓣服务器上的文件, 同时把内容输出到前段.
其实有个很不厚道的想法, 现在美国这边CDN也便宜, 想租一个然后写个脚本把现在能拿到的资源都传到CDN上…这样就不用走博客所在服务器的流量了. 不过想想好像有点过分了, 便也作罢.

音乐播放器是用的SoundManager2, 这是个挺牛逼的库.

其实到目前为止, 做出来的都不是些能继续深入玩的东西. 我想做的其实是要更炫酷饥渴极客一点的.
我用的是MySQL, 在数据日益增多之后, 搜索的速度成了一个问题. 我也知道其实通过建立合理的表结构以及用好合适的SQL语句, 是能大大地优化速度的. 但是我想在这个项目里, 对于这样一种比较特定的关系结构已经询问的需求, 是不是可以用一种自定义的方法来建立索引以实现更好的搜索结果呢? 这个靠YY真的是很难有头绪, 这几天去看了数据库索引之类的基础知识, 主要是一些有关B树的论文.
想要设计一个针对音乐数据库的scalable的索引, 想想都是件很令人兴奋的事情呢.

最后声明一下: 以上及该项目纯粹为了个人学习研究目的. 再次感谢豆瓣的资源.

PS: 太久不写文章, 中文真的写不溜了, 尽量不夹英文单词真是别扭啊, 读者见谅. 我语文不是体育老师教的.. = =

收听豆瓣电台抽风解决办法

我猜是DNS老是找不到稳定的资源,

防抽风简单粗暴的办法就是修改host, 碰到一个稳定的合适自己的IP地址记下来.

windows下:
打开 C:\windows\System32\drivers\etc\hosts

加两行:

 8.37.235.10 mr3.douban.com  
 211.147.4.31 douban.fm

我从烟雨, 回到江南

当飞机降落在杭州的时候, 我感觉到了一份粘稠的热情, 这情绪好像就在告诉我说, 嘿, 在那儿没怎么下过雨吧.
所以当我拉着行李走出萧山国际机场的时候, 天上开始下起毛毛雨来, 以一种小清新的节奏飘洒着, 抵消了一丝闭闷. 万万没想到的是, 数天之后的此时此刻, 我会无奈地对着窗外毫无停下意思的大雨一声叹息.

在杭州待了一晚上之后, 前往上海签证.

在回到国内之后, 不知不觉地产生了一种作为观察者的奇怪的感觉. 产生这种感觉的原因, 我分析了一下, 似乎是因为身边路过的人都在以我1.5倍的速度运动着, 或者其实是因为我对周围环境的反应退化成了原来的2/3. 我观察着人们'匆忙'地往前赶着, 有时候索性停下来, 左顾右盼起来, 看见好看的姑娘就停着多看几秒钟.

我不紧不慢地向目的地移动着, 一站一站, 仿佛平缓的进度条.
当我来到美国领事馆的大楼下时, 还有一个多小时的空余. 等待的时候我开始回忆上一次来这里的情形.
在飞机上重温"失控"的时候, 看到一句话:

记忆, 是高度重建的. 在记忆中进行搜索, 需要从数目庞大的事件中挑选出什么是重要的, 什么是不重要的, 强调重要的东西, 忽略不重要的东西.

对我来说, 第一次签证时最重要的事情, 就是我过了.
我很有信心, 排队的时候悠哉地看着前面的那个女生在练习面试的题目, 直到我闲着无聊拿出DS160确认信检查的时候, 发现上面的名字打错了.
不知道是怎么回事, 把GAN打称了GAM, 顿时有了一种哭笑不得的感觉, 要是跪在这儿的话就有意思了.
所以我开始想对策, 我想万一问起来, 我就说: Sorry, it's Gan, not Gam, nor Gum, don't eat too much it's actually not good for teeth. 再配合一个天真无邪的二货式的傻笑.
但是可惜的是, 没有一个人发现这个打错了的名字, 让我的冷笑话没派上用场.

在家的这几天, 电视上在热播谍战剧, 我去知乎上搜为什么谍战剧流行, 没有找到满意的答案, 于是自己YY了一下:

人们对谍战剧的兴趣, 其实源自于人类内心深处欺骗与背叛的本性. 当亚当吃了知识善恶树的果实, 便是背叛了创造出他的神, 接着更有该隐杀害亲人亚伯. 所有的人皆出自亚当, 背叛的天性从一出生就在身体里面潜伏着, 有时候, 当你感觉这事我不能做, 不应该做, 做了不好的时候, 恰恰是人属亚当的天性在催促你试着去做. 现代人受着社会道德以及律法的束缚, 将背叛视为可耻的, 然而内心对其却是有种不由自主的向往, 在这里, 谍战剧, 作为一个背叛与道德制衡的复合物, 不但满足了人对背叛的原始的渴望, 又在道德上有一个不错的落脚点(毕竟是为了'信仰'), 所以我觉得, 谍战剧中吸引人的或许不是其悬疑的部分, 而是那发生在好友至亲之间的背叛.

我信的那一位是施怜悯的神, 在遭背叛之后仍然保留着对人的爱, 并依着计划将爱分赐给祂的敌人.
话说自从信主之后, 对爱这种感情又有了许多新的理解.

外面的雨终于停了, 准备出去逛一圈.

我从烟雨, 回到江南.
你在盛夏, 轻了罗衫.

廻梦锁

我在大峡谷里面附近的印第安人遗址看到这么一个小玩意儿, 叫做dream catcher, 据说是会把好梦给抓住然后下次可以继续梦到, 把噩梦抓住烧掉.
当时突然想到标题的这个名字, 觉得很合适, 以前玩仙剑的时候, 赵灵儿就是用廻梦这招回到了过去. 这是个多好的技能啊…

清酒催人醉
问君何所为
予子廻梦锁
御剑乘风归