一个纯粹的JavaScript blog

REWORK上说有了灵感就立刻去做,所以我花了两天时间实现了自己的一个想法--一个纯粹的JavaScript blog。
前后端都是由javascript驱动。
前端仅仅是一个静态的html文件,后端数据保存在google spreadsheets中,逻辑部分由google apps script来处理(就是一段javascript脚本)。
零成本,你只需要有一个能存放单个html文件的地方就能搭建整个blog.
我把这个blog取名为 purejsblog (pure javascript blog)
关于 PureJsBlog
http://purejsblog.cuoluo.net/index.html?p=3
PureJsBlog demo
http://purejsblog.cuoluo.net/index.html
标签: Uncategorized

在App Engine上使用OpenID验证登陆

Google App Engine最新发布的SDK 1.3.4提供了对OpenID的原生支持。下面我们就来演示在app engine上的应用如何使用OpenID来登陆。
首先你需要登陆到App Engine的管理控制台中,在你应用的"Application Settings"中选择"Authentication Options"为 "(Experimental) Federated Login"并保存。

一旦你设置好了上面这一步,App Engine的Users API就能够提供对OpenID的支持了。在使用Users API之前,我们先看看OpenID的登陆流程,我按照自己的理解画了一个示意图。


  1. 用户访问web app


  2. web app返回一个登陆表单,提供OpenID identifier的输入框


  3. 用户输入OpenID identifier,提交表单


  4. web app根据用户输入的OpenID identifier用create_login_url()函数生成并重定向到OpenID登陆页面


  5. 用户在OpenID provider处登陆,并授权web app获取用户的OpenID信息


  6. OpenID provider把用户重定向到web app(重定向的url包含了用户的OpenID信息)


  7. web app通过get_current_user()函数获取到用户信息,登陆完成



上面的流程省略掉了一些步骤和细节,比如web app和OpenID provider的交互,web app对重放攻击的处理等等。这些步骤和细节App Engine全都帮我们做了,所以对web开发者来说是透明的,我们不用去关心。我们需要做的就是第2,4,7步。
提供一个用户登陆页面
准备一个简单login.html文件内容如下,主要就是提供一个能够接收用户OpenID标识的表单。

<html>
<head>
  <title>Log in with OpenID</title>
</head>
<body>
  <h1>Log in with OpenID</h1>
  <form method="get" action="/testopenid">
    <input type="text" name="openid" />
    <input type="submit" value="Log In" />
  </form>
</body>
</html>




修改app.yaml,让用户访问 http://your-app.appspot.com/testopenid 时能显示上面的login.html

- url: /testopenid
  script: testopenid.py




添加testopenid.py文件,内容如下。

import os
from google.appengine.ext import webapp
from google.appengine.ext.webapp import template
from google.appengine.api import users
from google.appengine.ext.webapp.util import run_wsgi_app
class UsersHandler(webapp.RequestHandler):
  def get(self):
    path = os.path.join(os.path.dirname(__file__), 'templates', 'login.html')
    self.response.out.write(template.render(path,{}))
application = webapp.WSGIApplication(
             [('/', MainPage),
             ('/testopenid',UsersHandler)],
             debug=True)
def main():
  run_wsgi_app(application)
if __name__ == "__main__":
  main()




生成OpenID登陆url并重定向
当用户提交OpenID identifier后,我们用Users API中的create_login_url()函数生成需要跳转的url。具体的函数定义见这里.
修改testopenid.py中的UsersHandler类

class UsersHandler(webapp.RequestHandler):
  def get(self):
    openid_url = self.request.GET.get('openid')
    if not openid_url:
      path = os.path.join(os.path.dirname(__file__), 'templates', 'login.html')
      self.response.out.write(template.render(path,{}))
    else:
      self.redirect(users.create_login_url('/testopenid', None, openid_url))




验证用户登陆,并取得OpenID信息
当用户在OpenID Provider处登陆并跳转到我们的web app时,我们用Users API中的get_current_user()函数验证用户是否登陆并返回一个User对象,这个对象中就保存着登陆用户的OpenID信息.
继续修改我们的UsersHandler类

class UsersHandler(webapp.RequestHandler):
  def get(self):
    user = users.get_current_user()
    openid_url = self.request.GET.get('openid')
    if user:
      greeting = ("Welcome, %s! %s(sign out)" %
                    (user.__dict__, user.nickname(), 
                     users.create_logout_url("/testopenid")))
      self.response.out.write(greeting)
    else:
      if not openid_url:
        path = os.path.join(os.path.dirname(__file__), 'templates', 'login.html')
        self.response.out.write(template.render(path,{}))
      else:
        self.redirect(users.create_login_url('/testopenid', None, openid_url))



到目前为止我们的web app已经能够支持OpenID登陆了。可以看到我们所需要做的工作非常简单,App Engine给我们处理了大量的细节,生活顿时变的非常美好。
还有一点需要注意。如果你在app.yaml中针对某个url设置成必须要先登录(login: required),那么当你未登录访问那个url时,App Engine会把你重定向到 http://your-app.appspot.com/_ah/login_required 对于这种情况你需要做的就是针对"/_ah/login_required"这个地址创建一个登陆页面。
demo在这里
参考文章 Using OpenID authentication on App Engine


把你的google电子表格打造成twitter客户端

前天学了一下 Google Apps Script觉得这玩意儿很好玩儿(我很早以前就觉得 google spreadsheet潜力很大),所以就想做点什么来练练手。经过短暂的思考,想到了一个点子--把google电子表格打造成twitter客户端。谁知google后发现早就有人想到这样做了,不由得有些小小的遗憾。不过继续搜索后发现,大家有的似乎都只是一个想法,我还没有找到一个真正可用的apps script.既然没有一个成型的脚本,那正好自己把它实现。
这里简单的介绍一下google apps script,它能让你用一种很简单的方式来自动处理电子表格中的数据。就像是office excel中的宏,但比宏强大很多倍。google apps script使用标准的javascript语言, 提供相当直观的API,可以很容易就上手。最最重要的是,你写好的javascript脚本是在google的服务器上运行的,这为我们利用google电子表格来翻墙提供了可能,当然你要先保证自己的电子表格不被墙。比如我下面要介绍的这个脚本就能让你在不翻墙的情况下使用twitter(当然只是一部分内容:查看timeline和更新消息).
我的spreadsheet twitter client就是下面这个样子的。

你可以按照下面的步骤使用这个脚本:
1.登陆你的 google文档
2.打开这个 google电子表格(由于我的脚本很多都是硬编码,所以需要有一个模板)
3.点击菜单中的"File > Make a copy",然后输入你想保存的文件名,确定。
4.第一次打开你保存的这个电子表格后,你需要按照提示输入你的twitter用户名和密码.如果输入错误或者想更换twitter用户,你可以点击电子表格下面的"config"工作表,然后在里面更改。
http://screensnapr.com/u/sa2l2m.png
5.如果想发推,你可以在"home"工作表左上角那个白色的大框框(就是cell A2)中输入内容,然后按回车确认输入完毕(输完内容后一定要按回车,这点很重要,不然脚本获取不到你的推),然后点击菜单 "Twitter action > Update status."就可以了。
6.至于更新时间线,同样也是点击菜单"Twitter action"然后寻找相应的操作就可以了。
7.对了,不管是发推还是更新时间线,在你第一次运行脚本的时候电子表格会询问你是否同意脚本更改你的数据,你选择同意然后再次点击菜单运行就可以了。
好了,就是这么简单。如果你想Geek一把,尝试一下用电子表格浏览twitter吧。
如前所述,写这个脚本只是为了熟悉一下google apps script,所以这个电子表格客户端还很简陋,很多功能都没有。但也不排除那天有时间的话更新一些新功能。如果有了新功能你只需要打开 这个文件重复上面的操作就可以了。当然,如果你对google apps script有兴趣,可以在"Tools > Scripts > Script editor..."查看源码,然后自行完善。
ps.在google 电子表格被墙的情况下可以试试用https打开。
标签: Uncategorized

How to send a private tweet

习惯了用twitter记录自己的一些想法.但有时候想法很不成熟或者只想写下一些私事,所以并不是所有的tweets都适合公开。可是twitter并不支持private tweet,要么全部公开,要么全部私密。为了解决这个问题,我以前的做法是重新申请一个twitter账号,把tweets设为保护状态,然后所有不想公开的tweets就用那个账号发布。这样做起来并不方便,我只想用一个账号来保存我所有公开和不公开的tweets。于是便有了private tweet这个小工具。它的原理很简单,所谓的private tweet就是自己给自己发的私信,但是这在twitter的web页面上是无法做到的,只能通过api,所以我需要写一个小工具。如果有时间的话,下一步要完善的就是提供显示自己所有private tweets的功能.
update:花了一个多小时,view my private tweets功能已经完成。


http://privatetweet.appspot.com

标签: Uncategorized

gmail style html editor

正在做一个google风格的web应用,前端需要用到富文本编辑器,于是在KindEditor的基础上山寨了一个gmail风格的html editor.山寨到了一半,Closure Library横空出世,有了官方的版本,我也就没有必要自己做了。不过我想也许有人用的着,还是贡献出来吧。下面就是这个做了一半的gmail html editor,代码都是开源的如需完善请自行修改。


demo

标签: Uncategorized

在Linode VPS上安装pptp VPN


apple4.us之邀介绍一下如何在Linode VPS上安装VPN server.我自己的VPS装的是Ubuntu 9.10,所以以下操作全都是针对Ubuntu 9.10操作系统的。
首先,你要确保自己的vps已经按照 Getting Started With Linode这篇文章做好了初步的准备工作。对安装VPN而言,需要注意的就是设置好更新源。编辑你的/etc/apt/sources.list文件,去掉"##universe repositories"之后所有行的注释,让文件变成和下面的一样。当然,这一步需要用sudo或者在root下来完成,后面所有的命令都是如此。
## main & restricted repositories
deb http://us.archive.ubuntu.com/ubuntu/ karmic main restricted
deb-src http://us.archive.ubuntu.com/ubuntu/ karmic main restricted
deb http://security.ubuntu.com/ubuntu karmic-security main restricted
deb-src http://security.ubuntu.com/ubuntu karmic-security main restricted
## universe repositories
deb http://us.archive.ubuntu.com/ubuntu/ karmic universe
deb-src http://us.archive.ubuntu.com/ubuntu/ karmic universe
deb http://us.archive.ubuntu.com/ubuntu/ karmic-updates universe
deb-src http://us.archive.ubuntu.com/ubuntu/ karmic-updates universe
deb http://security.ubuntu.com/ubuntu karmic-security universe
deb-src http://security.ubuntu.com/ubuntu karmic-security universe

接着用下面的命令更新你的软件包数据库
apt-get update

现在我们可以正式安装VPN server了。这里我们选择pptp(vpn 协议的一种),因为简单,一条命令搞定。剩下的无非是一些配置。
apt-get install pptpd

pptpd安装完成后,编辑/etc/pptpd.conf文件,去掉下面两行的注释或者直接添加这两行(在文件的最后).这一步是配置ip地址的范围。
localip 192.168.0.1
remoteip 192.168.0.234-238,192.168.0.245

然后在/etc/ppp/chap-secrets文件中添加vpn用户,按照下面的格式,每个用户一行。
username pptpd password *

为了让你的用户连上VPN后能够正常地解析域名,我们需要手动设置DNS. 编辑/etc/ppp/options,找到ms-dns这一项,设置你的DNS.这里我推荐的是Google 最近发布的 Public DNS,原因是因为好记。
ms-dns 8.8.8.8
ms-dns 8.8.4.4

编辑/etc/sysctl.conf文件,找到"net.ipv4.ip_forward=1"这一行,去掉前面的注释。
net.ipv4.ip_forward=1

运行下面的命令让配置生效。
sysctl -p

重启pptpd服务
/etc/init.d/pptpd restart

最后开启iptables转发
/sbin/iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE

ok,安装完毕。赶快用上你的VPN,让GFW见鬼去吧。
标签: Uncategorized

Search Tweets By Date Range

我在 上一篇blog(似乎是很久很久以前的事了)中谈到,如果twitter想要当做云,能够记录各种log,那么首先要提供的一个功能就是特定时间段的信息搜索。但是twitter似乎并不想往这个方向努力,虽然提供了搜索服务但却不能满足那个小小的要求。你要是想查看某个话痨在上个月某一天的推,那要"more"的多么痛苦。
既然twitter不提供,那我们自己把他实现出来。这就是 searchTweetsByDate.com的由来。目前功能还很有限并且必须要翻墙才能正常使用。下一步就是慢慢的完成这些todolist,如果有时间的话。
to do list

  • 支持墙内用户使用

  • 增大可搜索的时间范围(目前只支持从2009/11/02开始的范围内搜索)

  • 支持用户home timeline的搜索(目前只支持用户的user timeline)

  • API

  • 让可搜索的时间范围精确到秒

  • ...


@ Lamengao

twitter发展的一种可能性

我眼中的twitter就是一个半实时的动态信息发布和接收平台。从这个角度考虑,任何能够产生动态信息的地方都可以使用twitter。所以每一个twitter账号背后不一定是human,可以是服务器的系统日志,可以是个人交易的支付记录,当然也可以是blog的更新(只要你愿意,甚至可以把twitter当做rss阅读器。)。为如此众多的动态信息都创建一个twitter账号实在太麻烦。我希望twitter能够创建子账号,或者是给信息做标签,让信息能够更新到特定标签下。用户也可以只follow特定标签下的信息。这些概念都不新鲜,但如果twitter都实现出来潜力还是惊人的。
如果只要一个点击就能为任意一种动态信息创建一个twitter“账号”,那twitter的众多定义都将被改写。我可以创建自己网站的访问日志的twitter,我可以把自己商店的收银机连上twitter,让她记录我的每一笔营收。像这样把不同种类的信息集中放在twitter的好处在于,你可以在任意时间任意地点查看任意的一种记录,关键是你还可以分享出去还可以发布出去,只要你愿意。也许某一天FBI会要求twitter提供那个用户的账号信息来查看他是否偷税漏税。我就不相信twitter到了那一天还找不到自己的盈利模式。
twitter上的信息偏重于当前时间,而日历上的活动提醒之类的属于未来时间。如果twitter真要起到记录各种“日志”的作用,首先要提供的一个功能就是特定时间段的信息搜索。
我是个技术上的乐观主义者,什么服务都可以想得很美好,具体怎么走就看twitter自己了。

Fuck The GFW

昨天(6月2日),GFW相继屏蔽了twitter,live.com,bing.com,hotmail,flickr等一大批国外网站。为的是提醒我们那个快要到来的日子。生在这个局域网内,每天都在猜测下一个倒下的是谁,这种感觉很坏。面对互联网上众多优秀的免费的或不免费的服务,我们要么不能用,要么不敢用。我还能说什么呢?Fuck The GFW
我希望有一天,国内能实现真正的言论自由,互联网能够真正的互联。