Thursday, March 12, 2009

令人发指视频搜索 for Greasemonkey

令人发指视频搜索 for Greasemonkey: "令人发指视频搜索"

把我原来豆瓣和MDBChina的两个视频搜索 user scripts 合并了,并且用我的动态 GM JS 调用改造了一下。现在只要我在数据库里加记录,安装了 user script 的 Firefox 就可以在新影评站点进行搜索了。

已支持的影评网站:

更多的影评和视频分享网站添加中...

Update(Apr 27, 2009):

支持的视频搜索和分享网站:

  • Gougou
  • Youku video
  • Youku playlist
  • Ku6 Video Search
  • 56 Video
  • Youtube Video
  • Google CN video
  • Tudou video
  • Tudou playlist
  • Gougou BT
  • Ku6 Playlist
  • 56 Playlist
  • Youtube Channel
  • Youtube Playlist
  • VeryCD
  • isoHunt
  • OpenV
  • The Pirate Bay

Labels: ,

Monday, March 9, 2009

Online Backup, Data Backup, & Online Storage Service for Windows, Mac, and Linux from Spideroak.com

Online Backup, Data Backup, & Online Storage Service for Windows, Mac, and Linux from Spideroak.com: "SpiderOak provides an easy, secure and consolidated free online backup, storage, access, sharing & sync* tool for Windows, Mac OS X, and Linux (Ubuntu & Debian)"

I'm using SpiderOak for backing up my CVS root now. It's the simplest way I can find for online Linux desktop backup. Ubuntu Hardy AMD64 is well supported. But it requires a property client, which make it hard to use with server or low-end devices.

I registered drivehq.com also, which supports FTP. But I'm still looking for tools or scripts which can keep versions of backups with FTP: I don't want to program it by myself.

Update(3/11/09): the latest news, SpiderOak hung up hours after it was installed. Now, there are lot of files with status 0.00% and queued, but no change anymore. So, shall I switch back to backupninja, and programing a script for FTP?

Google Notebook: Still Available For New Users?

Official Google Notebook Blog: Stopping development on Google Notebook: "Starting next week, we plan to stop active development on Google Notebook. This means we'll no longer be adding features or offer Notebook for new users."

I signed up a new Google account with a domain of my own (secutum.com), and accessed Google notebook successfully. It's a good news. I do take a lot of notes.

Labels:

Sunday, March 8, 2009

CeBIT 2009 : 宏碁两款改版 easyStore NAS 亲眼看

CeBIT 2009 : 宏碁两款改版 easyStore NAS 亲眼看

很象我计划中的 NAS. 就差几点:

* 再多个 5 寸仓位装DVD-RW driver
* OS 改 Linux, 不过这不是大问题, 自己能搞定
* 价格?

Labels:

Thursday, March 5, 2009

Django-wiki For AppEngine

Django-wiki is a very basic Wiki based on Django. It costed me a few minutes to port it to AppEngine. The patch against http://github.com/sneeu/django-wiki/tree/master current repository:


diff -ruN wiki/admin.py appengine-wiki/admin.py
--- wiki/admin.py 2008-12-08 10:58:24.000000000 +0800
+++ appengine-wiki/admin.py 2009-03-06 14:24:06.000000000 +0800
@@ -2,5 +2,10 @@

from models import Page

+#admin.site.register(Page)
+
+class PageAdmin(admin.ModelAdmin):
+ model = Page
+
+admin.site.register(Page, PageAdmin)

-admin.site.register(Page)
diff -ruN wiki/models.py appengine-wiki/models.py
--- wiki/models.py 2008-12-08 10:58:24.000000000 +0800
+++ appengine-wiki/models.py 2009-03-06 14:16:21.000000000 +0800
@@ -1,18 +1,22 @@
from django.db import models
+from google.appengine.ext import db

from templatetags.wiki import wikify


-class Page(models.Model):
- name = models.CharField(max_length=255, unique=True)
- content = models.TextField()
- rendered = models.TextField()
+class Page(db.Model):
+# name = models.CharField(max_length=255, unique=True)
+# content = models.TextField()
+# rendered = models.TextField()
+ name = db.StringProperty(required=True)
+ content = db.TextProperty(default='')
+ rendered = db.TextProperty(default='')

- class Meta:
- ordering = ('name', )
+# class Meta:
+# ordering = ('name', )

def __unicode__(self):
- return self.name
+ return u'%s' % self.name

def save(self, *args, **kwargs):
self.rendered = wikify(self.content)
diff -ruN wiki/views.py appengine-wiki/views.py
--- wiki/views.py 2008-12-08 10:58:24.000000000 +0800
+++ appengine-wiki/views.py 2009-03-06 14:17:55.000000000 +0800
@@ -8,14 +8,16 @@

def index(request):
"""Lists all pages stored in the wiki."""
- pages = Page.objects.all()
+# pages = Page.objects.all()
+ pages = Page.all()
return render_to_response('wiki/index.html', {'pages': pages})


def view(request, name):
"""Shows a single wiki page."""
try:
- page = Page.objects.get(name=name)
+# page = Page.objects.get(name=name)
+ page = Page.gql("WHERE name = :1", name).get()
except Page.DoesNotExist:
page = Page(name=name)

@@ -25,7 +27,8 @@
def edit(request, name):
"""Allows users to edit wiki pages."""
try:
- page = Page.objects.get(name=name)
+# page = Page.objects.get(name=name)
+ page = Page.gql("WHERE name = :1", name).get()
except Page.DoesNotExist:
page = None

@@ -33,9 +36,8 @@
form = PageForm(request.POST)
if form.is_valid():
if not page:
- page = Page()
- page.name = form.cleaned_data['name']
- page.content = form.cleaned_data['content']
+ page = Page(name = form.cleaned_data['name'],
+ content = form.cleaned_data['content'])

page.save()
return HttpResponseRedirect('../../%s/' % page.name)

Labels: , ,