昨个看了黄舒骏
不想用什么煽情的标题,诸如“祭奠我们的青春”啥的。客观的描述就是我昨天带老婆去看了黄舒骏在上海的演唱会。
我们到的比较早,进去大概估了一下,也就 2000 个座吧。座位不好就不多说了,反正教训是如果还想看啥演唱会的话,买票一定要趁早。我买的是 380 的票,准确地说在 380 里也是靠后的。坐我那片的,还有后面 180 的,都是我们这样年纪大些的大叔和御姐(要照顾我老婆的情绪)们。一帮拿着专业的道具的小粉丝有组织地冲到了最前面。后来才知道,那些是在某个 BBS 某个讨论版里看某个选秀节目的。为此老婆还嘲笑了我,因为在很多年前,互联网泡沫破灭之前,我也是混那个 BBS 的。
原定 19:30 开始的演唱会拖了十几分钟才开始。黄舒骏上来就把我们定性为“坐在后面的”“年纪比较大的”朋友,还说他非常为那些年纪比他还大却自称听他的歌长大的人担心。我跟老婆说,我们周围的这些人不光是大叔,估计还多是宅大叔。的的确确,我们这些宅大叔们就是来听在我们(更)年轻时打动我们的那些歌曲。今天还看见有进步后生写 Blog ,说去看演唱会的宅大叔就是有钱,个个都攥着大炮筒,让他一个器材控很是眼红。
每个宅大叔都有自己心中盼望着的那几首歌吧,我左后方的一个宅大叔就一直念叨《那一年那一夜》。其实我也很想听到这首歌,不过的确不指望黄舒骏会在这场演唱会上唱别人的歌。毫无疑问,《改变1995》一定是很多人期待的,现场也在这首歌中到了第一次高潮。歌词改了,老实说,大叔们期待更犀利些的。好吧,告诉你们一个小秘密,我一直期望在我的葬礼上放这首歌。
江苏卫视的那两个姑娘实在让人不敢恭维。要说带徒弟,还是应该看看陈升带来的。不过没办法,这么场不赚钱的演唱会,要不是那几个黄舒骏混评委的电视台帮忙,还真办不成。大叔们很有礼貌,没把小姑娘轰下去。前面有组织的萝莉也挺招人烦,荧光棒、LED 板、横幅一样不拉,可总得考虑一下这些玩意和“你走以后没几天,邓丽君也跟我们说再见”很不搭吧。
黄舒骏自爆《两岸》中的人物乃是虚构,颇让我吃惊:这都是有名有姓的呢。唱完这首,他就谢幕退场了。
要说大叔御姐们就是太 nice ,居然有人就往外走了。(有个小插曲,我前面的御姐,估计是有事提前走了,走之前还小心地把座位后面贴的号取下带走了。)我那个急啊,就带头喊起了 Encore 。大叔御姐们就是 nice ,虽然一直在鼓掌,但喊 Encore 的还是不多。过了几分钟,估计黄舒骏对大叔们的耐心也没有太大把握,就上来了,说:其实我也有准备,如果没人喊 encore ,大家就这么安静的走了。还说:其实,我真的没有准备 ...... 太多的 encore 曲。
Encore 第一首是献给他的父母的。第二首,是大家盼望的《恋爱症候群》。黄舒骏说唱这首歌不能分心,戴上墨镜,说:“你们开心你们的,我唱我的。” 800 多字,一气唱下来,没错!副歌是大家一起和着的。唱到结尾,黄舒骏摘下墨镜;大家起立鼓掌,看他走到后场,继续 encore !
大叔们还是不习惯喊 encore ,最后还是喊黄舒骏的名字比较有气势。喊了几分钟,黄舒骏跑上来说,这次是真的没有准备了。后来还是唱了《听不懂的话》。我们这些 nice 的大叔看准备没准备的 encore 都上了,也终于可以满意地回家了。
PS: 为了诸位大叔们心中的小小幻想,俺就不透露那个 BBS 那个版了。
Labels: popmusic, 黄舒骏
令人发指视频搜索 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: greasemonkey, video
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?
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: google
CeBIT 2009 : 宏碁两款改版 easyStore NAS 亲眼看很象我计划中的 NAS. 就差几点:
* 再多个 5 寸仓位装DVD-RW driver
* OS 改 Linux, 不过这不是大问题, 自己能搞定
* 价格?
Labels: linux
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: appengine, django, Wiki
Zoho Creator AppEngine Extension
Zoho Creator is a powerful Web application development tool. It can export project to Google AppEngine also. But you will be disappointed if you want to do any real task with the exported code, because there are some IMPORTANT LIMITS besides the
ones mentioned officially:
* Some important actions against records are removed, including DELETE, UPDATE and SEARCH
* Data access is executed in a very expensive way, and has a limitation of 1000 record for each table
* No support for 1:N mapping between tables
There are some minor issues also:
* Values of input fields are not escaped
But as a developer without good skill of UI, I still prefer to create prototypes with Zoho Creator for RAD. It's not difficult to hack the exported code with Python, HTML and Javascript. But, the interacted development with Zoho Creator and local development tools is still a big challenge. So I started to develop a toolkit with can be used with this type of project:
* One-way update from Zoho Creator to local project
* Minimized changes to code generated by Zoho Creator
* Implementations of the missed features and fixes of known bugs of generated code
* A framework for further development
Following are some tools and skills I will use:
* jQuery powered JS library for Web page hack(minimizing the changes to generated source code)
* Regexp based code converting tools to apply changes to the generated code
* Diff for one-way update
Of cause, Zoho won't like my hacks, they want to keep user playing with their hosting service rather than exporting projects to Google AppEngine. But, we all know there will be some RAD tools for AppEngine soon or later. So, why don't Zoho take the chances of becoming a leader of this trend?
Update: Now, I don't think the AppEngine code generated with Zoho Creator is a serious implementation. I prefer to hang it up before it can handle a real task.
Labels: appengine, zoho