2010年9月15日星期三

SImages

协助用户保存当前页面图片的Firefox扩展。用处的话,你们懂的。

好吧,其实就是Imagez在Firefox上的实现。嗯,初步的。

至于写这个东西的理由,马桶2愈加老旧,遨游却把少得可怜的开发力量都扔到了马桶3上面。而Chrome的API是相当有限的,SImages的功能在Chrome内无法实现。

我之前其实根本没怎么用过Firefox,主要是对Firefox当初的恐吓式营销(安全,安全,像不像如今360的措辞?)相当不感冒,这自然也是我第一次写Firefox扩展。

感觉嘛,Firefox的扩展系统的确蛮强大,不过莫名其妙的小毛病也不少。(打开代码看看我写的那一大堆注释就知道了。)

有问题欢迎留言。

http://www.boxcn.net/shared/tpizij8ea2

v0.1 - 2010-9-15

  • 实现基本功能
  • 不会JS的话,设置内的东西就表乱改了

v0.2 - 2010-9-16

  • 修正工具栏图标相关问题
  • 添加右键菜单项
  • 修改设置项内的函数签名

2010年7月6日星期二

手贱

前两天试了试Blogger的导入和导出功能,今天才发现就这么一试导致链接地址全变了。PR什么的我倒是不在乎,可看着也挺不舒服的。Blogger后端没有修改POST URL的功能,API里也没有。等空了找找看有没有什么办法吧,不过暂时只能这么放着了。

要是有人链到我这儿,对不起先。

Update:

折腾了一下,总算是解决了这个问题,部分解决。

首先,打开导出的XML文件,检查每一个entry元素的link子元素,确保href是你想要的。接着写一个脚本,将entry的title子元素改成链接的文件名部分。这里跟直接发帖一样,不改的话Blogger会根据entry的title给你自动生成一个

# coding: UTF-8
require 'rexml/document'

doc = REXML::Document.new(File.open(ARGV[0], 'r'))

posts = {}
doc.root.elements.each('/feed/entry') do |entry|
  # 有5个link的元素才是blog文章
  next if entry.get_elements('link').length != 5
  
  link = entry.elements['link[@rel="alternate"]']
  url = link.attribute('href').value
  posts[url] = entry.elements['title'].text
  url = url[url.rindex('/')+1..-6]
  entry.elements['title'].text = url
end

doc.write(File.open(ARGV[1], 'w'))
File.open(ARGV[2], 'w') { |f| f.write(posts.to_s) }

其次,在Blogger控制台新建一个blog,名字照旧,域名换一个如otnthnew。选择好模板之后,切忌按照向导的提示立刻导入旧帖子。先去设置中,将所有设置改成跟原blog一样。尤其需要注意的是“格式设置”中的“转换断行”选择为“否”,还有“基本”中的“选择帖子编辑器”选择为“旧编辑器”。

最后,导入备份的XML。把原blog的域名改成otnthold,再把otnthnew改成otnth。再然后还是写一个脚本,把帖子标题给改回来。

# coding: UTF-8
require 'gdata'

GMAIL = ''
PWD = ''
BLOGID = 'xxxxxxxxxxxxxxxxxxx'

=begin
因为墙的问题,gdata需要一点小hack。打开lib/gdata/http/default_service.rb,将:

http = Net::HTTP.new(url.host, url.port)

修改为:

http = Net::HTTP::Proxy(ENV['PROXY_ADD'], ENV['PROXY_PORT']).new(url.host, url.port)
=end
ENV['PROXY_ADD'] = '127.0.0.1'
ENV['PROXY_PORT'] = '8118'


posts = eval(File.open(ARGV[0], 'r:utf-8') { |f| f.read })

client = GData::Client::Blogger.new
client.clientlogin(GMAIL, PWD)

url = 'http://www.blogger.com/feeds/#{BLOGID}/posts/default?max-results=10'
idx = 1
while true
  feed = client.get(url + '&start-index=' + idx.to_s).to_xml
  feed.elements.each('entry') do |entry|
    entry.elements.each('link') do |link|
      link = entry.elements['link[@rel="alternate"]']
      entry.elements['title'].text = posts[link.attribute('href').value]

      entry.add_namespace('http://www.w3.org/2005/Atom')
      entry.add_namespace('gd','http://schemas.google.com/g/2005')
      entry.delete_element('thr:total')

      edit_uri = entry.elements['link[@rel="edit"]'].attributes['href']
      response = client.put(edit_uri, entry.to_s)
    end
  end
  
  idx += 10
  break if idx >= feed.elements['openSearch:totalResults'].text.to_i
end

因为blogid已经变了,对于Blogger来说这就是一个全新的blog,会不会有什么严重的后遗症还有待观察。

2010年3月18日星期四

Opera Mini翻墙笔记

一直在用的某一个Opera Mini 4.2修改版突然不能爬墙了。本不想折腾,可实在是被各种“优化”过的皮肤刺激得不轻,于是花了点时间,有了这一篇笔记。

自从Opera Mini国际版服务器封掉所有来自大陆IP的请求后,要用OPM翻墙就需要解决两个问题:首先是找一个,或者自己搭一个中继服务器;其次是将OPM程序中原来的服务器地址改掉。

网上别人搭好的中继服务器很多,几乎全用的是opm-server-mirror。验证一个中继服务器是否可用很简单,只要在服务器地址最后加上“/?test=1”(例如:http://xx.oo.com/opm/?test=1)并用浏览器访问,如显示“Hello Opera Mini Server! Fuck GFW!” 则表示中继服务器工作正常。

要求不高的话,用别人搭好的中继服务器也没啥,可这样会存在一个严重的安全隐患。因为OPM所有的请求和回应都要从中继服务器绕一圈,假若搭建服务器的人心怀不轨,获取用户的各种账号及密码是非常容易的事情。可能的话还是自己弄一个吧,随便找一个国外的支持PHP和cURL的免费空间就成,程序及教程opm-server-mirror都有。

搞定服务器的问题后,接下来则是修改OPM的服务器地址。如果更喜欢官方原版,opm-server-mirror提供了一个OPM服务器地址修改器。这种修改方式的问题在于,一旦中继服务器不再可用,需要用计算机再次修改并重新安装,未免有些麻烦,所以我个人更喜欢使用可自定义中继服务器的修改版。

可自定义服务器的修改版很多,个人推荐如下三个版本:

某些版本如安装出现问题,可尝试寻找一个可用的Socket服务器。比如用JD-GUI反编译这个版本

如需要测试某个修改版或某个服务器,可以用PC上的J2ME模拟器,如MicroEmulator