再也不会听不完电台了——萌否电台播放列表

一直不爽萌否电台的播放器,跳歌一首首跳太慢,mp3加载不了直接挂掉。想听个一百多首歌的电台不是时间不够,就是听到一半挂掉了。

于是,我有一个愿望,听完一次这个电台!。于是就有了这货

screenshot

代码依旧在github上,这里有一个书签,在播放页点一下即可使用:

javascript:void((function(){var d=document;var s=d.createElement('script');s.src='https://raw.github.com/gist/4087765/playlist.js';s.id='binux_js';d.body.appendChild(s)})())

#google你个sb

由于 #google你个sb 的原因,我的整个账号被disable了。任何与这个账号相关的包括但不限于:

  • 各种方式登陆
  • 各种服务
  • 各种同步失效
  • 向此邮箱发信=>被退信

都无法使用,能用的:

  • google code、chrome store上的项目能访问
  • app engine上的程序在运行

这已经是一周之前的事情了,期间无数次发信,论坛求助,没有收到任何回复。不过鉴于一年前起,所有账号都开始使用@binux.me进行注册,所有密码都使用lastpass接管,并且还是有挺多服务是允许修改邮箱的。一周之内竟然没有太大影响,只要我不忘记邮箱密码,应该就没问题。

###永远不要相信免费(包括google)
这是我领悟到的第一个道理。在disable的开始几天,我每天都发信,每天都幻想google会如何回复,会不会直接拒绝恢复账号。一个周末过去了,我发现我错了,非常严重的错了。那个“与我们联系”页面完全如同一个静态页面,无论你提交什么,它都会杉杉有礼地告诉你,“您的信息已收到”。然后,就没有然后了。

永远不要相信有什么免费的东西,即使他是google提供的。一个产品如果对你来说是免费的,这意味着你根本不是他们的客户,你只是他们的商品。他们从你这里拿走他们想要的隐私,然后卖给他们的客户。他们在乎的是大数量的用户,在乎的是他们的客户,一两个的用户他们根本不在乎。一旦你变得和其他用户不一样,他们会做的不过是抛弃你,就像那些残次的商品一样。

当有一天,他们终止了你的服务,没有警告,不负责任(这已经写在协议里了哦,亲)。然后,什么都没有了。你原以为所有的,创造的,购买的。没有了,都没有了。假如你用着chromebook,16G硬盘,云。。呵呵(有比“呵呵”更好的词吗?!)

###鸡蛋不要放在一个篮子里
这个google账号我已经用了7年,我注册时gmail还没有开始内测(这有另一个悲剧:因为我的账号早于gmail注册,开通gmail时,我惊讶的发现我的用户名不能用于gmail,必须另取一个。于是,我一开始注册的用户名占用了我的常用用户名,得到一个永远收不到任何信件的地址。这个问题直到7年之后的今天,也没有人想要去解决。)。我所有的服务都和它绑定在一起:

  • 我不再能收到gmail信件
  • 无法取回google+上都加了谁
  • 与原来的联系人聊天还要重新发送邀请
  • 不能看到自己网站的统计数据
  • 不能访问docs上的文档
  • chrome strore上的插件不再更新
  • app engine上的代码拿不下来
  • reader里面30w的阅读记录
  • 手机同步,购买的应用
  • chrome数据同步,openid登陆的网站

都是一个账号。好吧,不过是再也不能贴出2005年的搜索记录罢了。

###少于三个备份的数据是不存在的
云同步,云备份安全吗?这就是一个活生生的例子。云服务不过是使用权而已,什么你的还是你的,这仅限于它存在的情况下,不存在于你自己控制的,拥有所有权的永久存储设备上的数据都是不存在的!而且,为了防止存储设备损坏,至少要三个备份,分别存放于大于1千米范围外的地方。

云同步,云备份看起来多么美好。自家的硬盘有可能:

  • 使用时间过长,挂
  • 不小心清空,挂
  • 高空坠落,挂
  • 产品品质,挂

但是,比起不知道谁执行了rm /,不知道哪个机房电力供应故障,不知道什么时候倒闭。自家的硬盘至少挂得清清白白,挂也挂在自己手上,挂了也是自家的坏硬盘


总之,google你个sb,我跟你没玩!

我已经在考虑写一个自动提交与我们联系的脚本,每天一发,直到google玩完,要么我玩完。

从wordpress迁移到jekyll

又到月末了,这一个月还没写blog呢。。虽然这段时间发生了很多事

  • 做了一个外包
  • 回了一趟家
  • 公司要搬家了

不过因为沉迷了半个月的D3,一个月的WOW,人变懒了。再加上wordpress的html写作方式搞得我非常没有写blog的欲望,一直想迁移到jekyll用markdown来写。为了每个月写一篇blog的目标,于是下决心迁移。。

由于jekyll太简单了,工具又少,不能立即使用,于是用jekyllbootstrap作为基础。另一个热门的选择是Octopress

不过这两都太jekyll了,于是把原来wordpress的主题以前迁移了过来。

迁移准备

首先,迁移评论,在使用wordpress时就开始准备,把评论导入disqus,然后用disqus替换wordpress的评论系统,工作了一周没有问题之后开始迁移。

安装

安装jekyll本地环境,参照https://github.com/mojombo/jekyll/wiki/install即可。为了语法高亮,把Pygments也装上

安装JB,跟着jekyllbootstrap首页上的Zero to Hosted Jekyll Blog in 3 Minutes做就好了

迁移

将wordpress内容导出成xml文件

将xml变成markdown:https://github.com/thomasf/exitwp

开始使用

jekyll --server 然后访问本地 http://localhost:4000/ 看看效果。
因为用了jekyllbootstrap,可以去 http://themes.jekyllbootstrap.com/ 选择主题安装

rake post title="asdfasdf" 新建文章

rake page name="adsfasdf/asdf" 新建页面

然后就是用任何编辑器开始编写了

对了,发现maruku对于解析有中文的list,比如开头的那个,有bug,而且github的效果和本地是不完全一样的。。即使是markdown也问题多多啊。。

上传github

把整个git项目push上去就好,不过后来发现_site文件夹是不需要的,github会自己重新生成一遍。这样就不需要每次都几千行改动了。

运行于百度云平台的Python网页代理

最近看到好多求BAE邀请的帖子,至少现在免费,于是也去求了一个,然后顺带开了python权限。
随便看了下python环境,版本够新,该有的库和框架也比较齐全,fetchurl接口完全封装在内置库中,至少比起GAE来说,迁移成本低多了。沙盒也是恰到好处的感觉,初步感觉不错。
提供的服务也涉及各个方面,云存储,数据库,cache,队列该有的都有了。
fetch taskqueue能fetchurl和离线下载(支持最大4G,10小时下载)体现了百度的特色吧,感觉眼前一亮,虽然已经有百度网盘提供类似服务,但是作为开发平台,也能作出一些有意思的应用。
消息服务自带1000条短信1W封邮件每月。

不过,百度依然体现了没有设计师的特色,界面和各个服务的开发包各不相同。。

由于BAE政策和稳定性尚不明朗,不打算在上面做能够保存数据的应用。
于是,做一个网页代理吧

http://pyproxy.duapp.com/https://github.com/binux

其他API:

http://pyproxy.duapp.com/rewrite/http://www.baidu.com/
使用这个地址访问会将页面上的url都加上代理的前缀

http://pyproxy.duapp.com/allow_origin/http://httpbin.duapp.com/ip
用于ajax跨域读取,比如这样:
您的IP是: 请自行查看源码

不得不说,百度网速也太不怎么样了吧。。
第一次写网页代理,地址改写还真麻烦,xmlhttprequest好歹是拦截了,js动态加载的元素就算了。。

附上rewrite代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# vim: set et sw=4 ts=4 sts=4 ff=unix fenc=utf8:
# Author: Binux<[email protected]>
# http://binux.me
# Created on 2012-09-06 22:22:21

import urlparse
import re

xmlhttprequest = '''XMLHttpRequest.prototype._open=XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function(m,u,a,us,p) {
var proxyurl='%s', baseurl='%s', a=document.createElement('a');
a.href=u;u=a.href.replace(proxyurl,'');u=proxyurl+(u.indexOf('http')==0?u:baseurl+u);
if(console&&console.log){console.log("XMLHTTPRequest:",u);}
return this._open(m,u,a,us,p);
}'''
http_re = re.compile("https?://", re.I)
href_re1 = re.compile("((href|src|action)\s*=\s*\"([^\"<>]+)\")", re.I)
href_re2 = re.compile("((href|src|action)\s*=\s*\'([^\'<>]+)\')", re.I)
href_re3 = re.compile("((href|src|action)\s*=\s*([^\'\"\s<>]+))", re.I)
xmlhttprequest_re = re.compile("<script", re.I)
def rewrite(proxyurl, baseurl, content):
#content = http_re.sub(proxyurl+"\g<0>", content)
for all, href, url in href_re1.findall(content):
rewrited_url = urlparse.urljoin(baseurl, url)
if not rewrited_url.startswith(proxyurl) and rewrited_url.startswith("http"):
content = content.replace(all, '%s="%s%s"' % (href, proxyurl, rewrited_url))
for all, href, url in href_re2.findall(content):
rewrited_url = urlparse.urljoin(baseurl, url)
if not rewrited_url.startswith(proxyurl) and rewrited_url.startswith("http"):
content = content.replace(all, '%s=\'%s%s\'' % (href, proxyurl, rewrited_url))
for all, href, url in href_re3.findall(content):
rewrited_url = urlparse.urljoin(baseurl, url)
if not rewrited_url.startswith(proxyurl) and rewrited_url.startswith("http"):
content = content.replace(all, '%s="%s%s"' % (href, proxyurl, rewrited_url))
content = content.replace("</title>", "</title><script>%s</script>" % xmlhttprequest % (proxyurl, urlparse.urljoin(baseurl, "/")), 1)
return content

https://gist.github.com/3663115

迅雷离线地址导出器——ThunderLixianExporter

按照计划,将loli.lu的导出功能带到官方原生界面上了。毕竟无论什么工具,都不如官方的稳定,方便。
虽然有一个Userscript的油猴脚本,但是实际上主要代码是直接插入到页面中的。。等稳定了,有时间了再做成完全的本地版吧。

功能特性:

* 迅雷离线原生界面

* 链接导出,aria2/wget下载命令导出,下载器导出文件,aria2 JSON-RPC支持

* 可以关闭不用的功能

* 统一的接口方便添加更多的下载方式

油猴脚本: ThunderLixianExporter.user.js

项目地址: http://binux.github.com/ThunderLixianExporter/

从LOLI.LU直接添加资源到ARIA2

loli.lu已关闭!
如需使用迅雷会员功能,请购买迅雷会员服务
如需在OSX,Linux环境下下载迅雷离线,请参阅ThunderLixianExporter

首先参照YAAW以RPC模式启动ARIA2,保证YAAW能正常工作。

在LOLI.LU中随便点开一个一个资源 > 批量下载。右键点击 自定义,填入以下脚本(注意需要替换JSONRPC_PATH,和YAAW中的一样):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function to_aria2(taskname, links, cookie) {
$.getScript("https://raw.github.com/gist/3116833/aria2jsonrpc.js", function() {
var aria2 = new ARIA2("<your rpc path>");
$.each(links, function(i, n) {
aria2.addUri(n.url, {out: n.title, header: 'Cookie: '+cookie});
});
});

var str = "";
str += "taskname = "+taskname+"\n";
str += "cookie = "+cookie+"\n";
str += "==========================\n";
$.each(links, function(i, n) {
str += "links["+i+"].title = "+n.title+"\n";
});
return str;
}

点击保存,点自定义,到YAAW中看是否添加成功了吧。

aria2 + web前端 部署指南

更新了openwrt的固件版本之后,我的wr703n上的aria2终于可以开启rpc模式了。然后就是WNR3500L到货,虽然不能装openwrt,但是有optware一样ok。
虽然他们的平台各不相同,但是因为YAAW是没有依赖的,实际上都是分为三步:

  1. 挂载U盘
  1. 安装aria2
  1. 打开YAAW

非常简单没有压力。

=============================================

第一步:挂载U盘

openwrt: http://wiki.openwrt.org/zh-cn/doc/howto/usb.storage

dd-wrt: 刷一个带USB的固件,固件中自动mount到/opt

tomato: 刷一个带USB的固件,固件中自动mount到/opt

第二步:安装aria2

openwrt: opkg update && opkg install aria2

dd-wrt: wget http://www.3iii.dk/linux/optware/optware-install-ddwrt.sh -O - | tr -d '\r' > /tmp/optware-install.sh && sh /tmp/optware-install.sh && ipkg-opt update && ipkg-opt install aria2

tomato: http://tomatousb.org/tut:optware-installation

启动命令: aria2c --enable-rpc --rpc-listen-all=true --rpc-allow-origin-all -c

如果没有问题的话,可以将 aria2c --enable-rpc --rpc-listen-all=true --rpc-allow-origin-all -c -D 加入开机启动

如果有问题的话,看输出的提示,有可能要加入--event-poll=select什么的参数

第三步:打开YAAW

点击demo,在扳手处填入path: http://<ip_of_your_route>:6800/jsonrpc, 保存

=============================================
一些有用的aria2参数

-i <file> 导入从loli.lu导出的aria2文件

-j <num> 同时下载数限制,由于路由和总带宽限制,建议设为3(默认5)

-x <num> 同一个服务器的同时链接数,建议为5-10(默认1)

-k <size> 文件最小分片,文件最多的线程数取决于能分出多少片,当文件小于最小分片大小时,只能开出一个线程,建议为2M(默认20M)

-s <num> 一个文件最多用几个线程下载,建议为8-10(默认5)

–file-allocation <none,prealloc,falloc> 文件预分配,如果USB设备是U盘,SD卡,预分配浪费时间,建议为none(默认prealloc)

更多参数请访问 Aria2 Manual

fancybox xss漏洞导致html转义无效

从老的1.3.4到新的2.0.7都有影响

验证:
如果对以下地址使用fancybox,当fancybox打开时会触发脚本。
xss

原理:
fancybox在取title的时候取的是$(obj).attr(‘title’),没有进行转义就拼接进结果中。导致即使原代码进行了转义,在使用了fancybox时依旧会产生xss

解决方法:
1、停止使用title特性
2、修改_format_title函数,将title进行转义

Yet Another Aria2 Web Frontend

aria2是个好软件,多线程,HTTP/FTP/BT通吃,参数设置丰富,功能强大。在我的TL-WR703n上比transmission快多了。

看了官网上的3个web前端,两个是php的,一个是c的。先不说c的那个界面。。php我尝试在路由上跑,依赖实在太多。
简单man了一下aria2,这货明明可以JSON-RPC的啊,根本就用不着后端啊! 于是,就有了这个坑——YAAW。

YAAW简介

YAAW - Yet Another Aria2 Web Frontend
是一个纯前端实现的Aria2 Web前端界面。无需架设任何服务器,只需要在浏览器中打开即刻使用。

链接

首页/demo: http://binux.github.com/yaaw/
GitHub: https://github.com/binux/yaaw