Fork me on GitHub
Google

火影完结了

火影在第700话迎来完结,想来想去还是决定写点什么,毕竟是追了十年的漫画。

初中的时候周围所有人都在看火影。那时大家基本上都是先看的动画,随后学校旁边的店里开始卖漫画了,于是就有人买漫画带到班上来。当时动画放到中忍考试那段,我只看过为数不多的几集。买到的漫画进度则已经到了小樱+千代婆婆vs蝎,好几本漫画在班里传来传去,一个同学看完一本之后就会到处打听下一本在谁手上,不过往往下一本已经被预定了。

之后生活环境有了一些变化,假期里只有我一人在家。那段日子里我如饥似渴地把火影的漫画追到最新,动画也补了不少,尤其是鸣人、宁次、丁次、牙和音忍五人众的战斗,至今我都觉得那是火影里最煽情的战斗。

之后我就开始追连载漫画和动画。本来每周还会看动画,但是后来原创剧情越来越多,就觉得没意思了,索性完全放弃动画。现在想起来,也不知道动画当时看到哪里了,但是我非常确定是在某一段原创剧情中放弃掉的。。。

再往后就是主角们一路升级,阿斯玛,自来也也在战斗中阵亡,最后终于几个国家决定联合起来。五影会谈前鸣人被揍但是不还手的那段剧情让我一度认为火影有希望在立意方面超越以前的热血漫画,写出比靠拳头说话用力量打倒敌人更有内涵的剧情,至少要做到不一样。不过从第四次忍界大战开始,剧情里基本就全是战斗,我的期望也落空了。

火影一个有意思的地方是可供猜测的地方很多。大一大二的时候我很喜欢看火影的分析文章,每一话我都要找好几篇分析来看才能满足。还有一些针对特定主题的分析,其中被写得最多的,就是面具男的身份和第六具棺材里放的是谁的问题。基本上宇智波家族的人都被猜了个遍,甚至还有些不是宇智波家的人都被挖掘出来。每篇分析都会从漫画中的各种细节找出蛛丝马迹,再结合自己的推理,最后得出一个漂亮的结论。看了好多分析之后,其实那时我已经确信面具男一定不是带土了,结果呢,岸本说他是带土,那就只能是咯。

回顾过去,我真正中二的冲动全部来自火影。小强们在战斗,我们却只能日复一日过着平凡的生活,这种落差感每次都导致我在看完几集火影之后情绪低落。严格来讲,当时的自己远远谈不上中二,但是对忍者世界的向往,却是实实在在的。

火影完结了,无论它最终是否有达到人们的预期,它都已经横跨了我、以及许多人完整的青春。十年之后,当我们忘记火影的剧情,忘记曾让我们热血喷张的战斗,忘记少年时代中二的幻想,我们唯一能说的就是:当年,我追过《火影忍者》。

Google

RSS介绍和简单实现

现在用RSS的人已经很少了,估计网民中不超过5%,这些人中大部分从事IT行业,小部分则是上个时代遗留下来的网民。

RSS 是一种xml规范, 最新版本是2.01。一个网站提供RSS, 本质上就是把网站希望推送给读者的内容按照 RSS 规范写入一个xml, 并且在一个页面(比如/blog/rss)提供这个 xml 的访问。然后 feedburner 或者别的 rss 工具会读取这个页面,检查更新,提供推送。

RSS标准格式如下,下面只列出需要关注的标签

<title>Lift Off News</title>
<link>http://liftoff.msfc.nasa.gov/</link>
<description>Liftoff to Space Exploration.</description>
<item>
    <title>Star City</title>
    <link>http://liftoff.msfc.nasa.gov/news/2003/news-starcity.asp</link>
    <description>
        How do Americans get ready to work with Russians aboard the
        International Space Station? They take a crash course in culture, language
        and protocol at Russia's Star City.
    </description>
</item>
<item>
    another item
</item>

rss 有总的 title, link, description, 有一堆 item, 每一个 item 自己也有 title, link, description 属性,description 就是正文, 例如一篇博客文章的内容。有这些内容就够了。

那么如何给自己的网站加上 rss 呢?很简单,只要照着这个格式生成一个页面就好了。这里还是以 Django 和我自己的博客为例。我的博客的 rss 地址是 http://www.laike9m.com/blog/rss/

虽说是自己实现,但是 Django 已经把大部分事情都做好了。
首先我们要用 Django 提供的 Feed 类派生出一个子类

from .models import BlogPost
from django.contrib.syndication.views import Feed

exclude_posts = ("about", "projects", "talks")

class BlogPostFeed(Feed):
     title = "laike9m's blog"
     link = "/blog/rss"
     description = "Update on laike9m blog's articles."

     def items(self):
          return BlogPost.objects.exclude(title__in=exclude_posts).filter(category="programming")[:5]

     def item_title(self, item):
          return item.title

     def item_link(self, item):
          return item.get_absolute_url()

     def item_description(self, item):
          html = item.display_html()
          import re
          html = re.sub(r"/media/", r"http://laike9m.com/media/", html)
          return html

     def item_pubdate(self, item):
          return item.pub_date

这个子类可能有两种写法,这里只看这一种。需要提供的方法有 items, item_title, item_link, item_descriptionitem_pubdate 并非必须。可以看到这几个方法对应了之前列出的 rss 元素,所以这个类干的事情,就是告诉 Django 要如何填充 rss 中必须的元素,比如说构造 <title></title> 的时候,就通过 get_title 这个方法,获取到 item.title,而每个 item 是在 items 中定义的,可以看到,item 实际上就是 BlogPost 这个 Model 的实例,也就是一篇文章。
这里我作了一些筛选,没有把所有文章都放到 rss 里面,这句话

BlogPost.objects.exclude(title__in=exclude_posts).filter(category="programming")[:5]

做的事情是把标题属于 exclude_posts 的文章排除,这些文章是我不想放进 rss 的,有 "about", "projects", "talks" 这三篇(因为它们并不是真正的文章,只是以和文章同样的形式保存用来构成博客的一些页面的),然后又通过 filter 选出那些属于编程类的文章。其实派生类的 items 方法不一定要返回 Model Objects,但是这么做的确有一些好处,这里的筛选功能就是因为使用了 Model Objects 而变得非常简单。

然后只要在 urls.py 里面加上下面这句话就行了

url('^rss/$', BlogPostFeed())

通常 url() 的第二个参数是 views 里的某个函数,但是这里我们只要把刚才写的 Feed 类的派生的填进来就好了。

这就是为博客提供 rss 所要做的全部工作。Django 大大简化了步骤,不过使用其它框架,亦或是自己从 html 级开始写出 rss 页面,原理是一样的。简单来讲就是:写一个页面,填上 rss 必须的元素,仅此而已。

如果使用 feedburner 来提供 rss 服务,去注册一个账号,然后把自己的 rss 页面地址填进去,就OK了

feed


top