存档

‘GAE和编程’分类的存档

Datetime--Python的基本日期时间类型

七月 5th, 2010 39 条评论

最近在学习Google App Engine日期时间属性时,尝试对Micolog这个基于Google App Engine的Blog后台的评论做了一个简单的修改页面,这样就可以使我们省下了去App Engine的后台去搜寻相关数据库再做修改的时间。编辑代码的过程倒是基本简单,新建一个编辑评论的页面(comment.html),再到admin.py中加入相关代码就可以了。不过,这个过程中倒是遇到一个小问题,python提交时间更新时会抛出一个异常来:

BadValueError: Property date must be a datetime

解决办法倒是很简单,将时间格式化成Datetime类型即可。

比如说:我在模板中对时间格式化为{{comment.date|datetz:"Y-m-d H:i:s"}}(如:2010-07-05-20:00:12这样的形式),那么在程序代码中可以这样写做:

comment.date=datetime.strptime(commentdate,"%Y-%m-%d %H:%M:%S")

当然其他类型的格式化都是可取的。由于Python中对时间进行格式化的相关字符与Django模板中time过滤器所用的格式字符串略有区别,下面就分别对其进行简单介绍,希望对你有所帮助。

(..More)

Using Google App Engine DoS Protection Service

六月 1st, 2010 13 条评论

 

经过我近一段时间的观察,发现自己的网站经常有人使用扫描工具进行漏洞检查,一天下来错误日志都好几十次,我实在是看不下某人的这种行为了!好吧,今天就屏蔽掉你的访问,让我在日志中再也看不到你吧!

幸好某人这个漏洞扫描是使用google 二级域名来访问的,这样就让我有机会使用app engine自带的防dos攻击的方法来屏蔽了。

按照Google文档的帮助,直接在应用的根目录下建立dos.yaml文件,在里面填写如下类似的信息即可

blacklist:
- subnet: 1.2.3.4
  description: a single IP address
- subnet: 1.2.3.4/24
  description: an IPv4 subnet
- subnet: abcd::123:4567
  description: an IPv6 address
- subnet: abcd::123:4567/48
  description: an IPv6 subnet

这种方法还是很有效果的,其中的subnet项可以指定任意合法的IPv4和IPv6地址格式,你既可以使用特定的单IP,也可以指定一个IP段,description项为你在appengine后台管理项看到的内容。

上传方法很简单,你可以使用appcfg.py update直接上传整个项目,这是dos.yaml也会一同上传更新。或者直接使用appcfg.py update_dos命令来单独上传这一文件。

下面是某一IP扫描本站的部分日志:

(..More)

Appstats for Python

四月 25th, 2010 16 条评论

前段时间在Google App Engine官方博客上看到app_engine更新了关于“Application profile with python & java appengine  and Appstats”的文章 Easy Performance Profiling with Appstats ,目前Google App Engine文档中已有英文原文。

注:Appstats是一个可视化的性能分析工具,是大名鼎鼎的Python作者Guido写的,具体内容请参考Appstats

Python的SDK包含了一套叫做Appstats的用于衡量你的应用程序性能的工具。 Appstats与您的Web应用框架集成以记录事件,并提供一个基于Web的管理界面用于浏览统计.

安装事件记录器(Event Recorder)

为记录Web请求的数据,每个请求句柄必须调用Appstats。这里有两种很容易的方法来将Appstats添加到你的处理程序代码中。

  • 一个工作在任何WSGI web应用框架(包括webapp)下的run_wsgi_app()函数(在google.appengine.ext.webapp.util包中)扩展
  • 一个Django的Web应用框架的“中间件”类

通过run_wsgi_app()函数使用Appstats

为了在一个WSGI兼容的框架(如webapp应用),你必须使用run_wsgi_app()函数来调用您的请求处理程序的脚本应用。举个例子:你可以使用类似于下面代码创建一个Webapp应用的应用实例,并运行它:

from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app

application = webapp.WSGIApplication([('/', MainPage),
                                      ('/newentry', NewEntry),
                                      ('/editentry', EditEntry),
                                      ('/deleteentry', DeleteEntry),
                                     ],
                                     debug=True)

def main():
    run_wsgi_app(application)

if __name__ == '__main__':
    main()

如果你使用另外一种方法来调用WSGI应用程序,(如wsgiref.handlers.CGIHandler),你必须修改你的处理程序都使用run_wsgi_app()来使用Appstats。

(..More)

Google App Engine后台增加新的警告提示语

四月 21st, 2010 3 条评论
This request caused a new process to be started for your application, and thus caused your application code to be loaded for the first time. This request may thus take longer and use more CPU than a typical request for your application.

这个提醒可真长啊,想让人看完logs,得花多大时间呢?

操作系统并发和互斥:哲学家进餐问题

三月 24th, 2010 4 条评论

设有5个哲学家,共享一张放有5把椅子的桌子,每人分得一把椅子,但是,桌子上共有5只筷子,在每人两边各放一只,哲学家们在肚子饥饿时才试图分两次从两边拿起筷子就餐。 条件: 1)拿到两只筷子时哲学家才开始吃饭。 2)如果筷子已在他人手上,则该哲学家必须等他人吃完之后才能拿到筷子。 3)任一哲学家在自己未拿到两只筷子前却不放下自己手中的筷子。

(..More)

Micolog使用Windows Live Writer自定义发布时间

三月 16th, 2010 7 条评论

       利用Windows Live Writer发表文章时,我们可以在发布栏上看到有自定义发布时间的按钮,但是在一般情况下,我们自定义的时间并不能产生效果,因为这个自定义的时间序列并没有传递。如果我们在RPC传递中增加发布时间的属性,那么自定义发布时间就能成功。这个自定义的时间就会覆盖掉自动生成的当前时间。传递给api_rpc.py的struct里就有一个dateCreated的值,它是这样的格式:YYYYMMDDTHH:mm:ssZ,如20091118T12:44:46Z 。在api_rpc.py里面处理一下这个值并赋值给entry里的date即可。代码如下,有中文注释的即为修改的行,很容易找到在哪里加入:

(..More)

Java中线程方法实现

十一月 25th, 2009 6 条评论

Java中每一个对象都有一把独占锁。独占锁只限制线程对它的同步方法的访问,对非同步方法,独占锁没有意义。
  synchronized是java中解决同步问题的一个方法。synchronized可以用来修饰方法,这样的方法就是同步方法。一个对象里可以有任意多个同步方法。任意时间里只能有一个线程访问这些同步方法。例如,线程T1在访问同步方法M1,此时还有一个同步方法M2无人访问,但是由于已经有一个线程正在访问这个对象的同步方法M1,所以试图访问M2的线程将被阻塞。直到T1对M1的访问结束。

(..More)

JAVA中static静态变量的适用小结

十一月 4th, 2009 0 条评论

最近一段时间我开始在学校学习JAVA基本编程技术,在学习之余,抽点时间来分享一点基础知识。 Java类中的静态变量在程序运行期间,其内存空间对所有该类的对象实例而言是共享的,有些时候可以认为是全局变量。因此在某些时候为了节省系统内存开销、共享资源,可以将类中的一些变量声明为静态变量,通过下面的例子,你可以发现合理应用静态变量带来的好处:

(..More)

Micolog 0.6测试版出炉

十月 13th, 2009 5 条评论

刚到徐明的博客上逛了一趟,发现了好久不变的公告栏出现了如下语言:

博客公告

    micolog 0.6 beta测试

micolog在经过近一年的时间后又要向前进一步了,希望这个版本的micolog能够带来新的功能和安全性,让micolog尽量的接近wordpress风格(貌似其网站主题添加了评论分页插件),有兴趣的朋友可以去徐明的博客上打听喽!

jQuery选择符-总结

九月 19th, 2009 1 条评论

CSS选择符,如:
$('#title1 > li')为取得ID为title1(#title)的子元素(>)中所有的列表项(li)。
$('#title1 li:not(.class1)')为取得ID为title的后代元素中没有(not)class1类的所有列表项。
jQuery库支持XPath选择符。如:
$('a[@title]')为取得所有带title属性的链接。

(..More)

IE下使用firebug

九月 17th, 2009 1 条评论

在IE浏览器调试代码,我们可以选择使用 IE WebDeveloper ,
但是我个人用惯了ff浏览器下的firebug,所以在网上搜了一下,如果你也想在IE下使用firebug进行调试,可以进行如下改动:

将需要调试的页面加入以下JS代码:

需要调试的页面加入以下JS代码:

  • <script type='text/javascript' 
  • src='http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js'>
  • </script>
  • 然后就可以按照firebug在ff下的方法操作了

    js代码--限制文本字数

    九月 16th, 2009 0 条评论
    <style type="text/css">
    .progress{
     width: 1px;
     height: 14px;
     color: white;
     font-size: 12px;
        overflow: hidden;
     background-color: navy;
     padding-left: 5px;
    }
    ... ...

    (..More)

    python用xmlrpc更新wordpress的一个实例

    九月 12th, 2009 1 条评论
    import xmlrpclib
    blog_username = 'user'
    blog_password = 'passwd'
    blog_url = 'http://example.com/xmlrpc.php'
    have_tags = True
    server = xmlrpclib.ServerProxy(blog_url)
    push=0
    post['title'] = 'Subject'
    post['wp_slug'] = 'Slug'

    (..More)

    最短路径只Dijkstra算法python实现

    九月 12th, 2009 0 条评论
    # coding: utf-8

    #shortest_path.py

    ## 最短路径

    ## 使用Dijkstra算法找给定结点到图上其它各点的最短路径

    ##

    ##参数g是被遍历的图, A是给定结点的名字

    ##Dijkstra算法的思想是:

    ##起初,只有一个结点A,此结点到自己的最短路径确定,值为0

    ##下一步,扩展此结点的所有相邻结点,形成集合{}。

    (..More)

    Google App Engine:如何修改网站的数据模型

    九月 11th, 2009 0 条评论
    如果你有一个成功的GAE应用, 不可避免的你会要修改你的数据库架构. 本文通过一个小例子介绍了修改数据库架构的两个基本步骤: 更新数据模型类定义 更新Datastore中的已有数据实体(这一步并不是总是必要的, 下面会讲什么时候你需要这样做)。 开始之前 在更新你的数据模型时,你可能需要暂时禁止用户在你的应用中更新数据。 是否确实需要取决于你的应用, 但是在某些情况下, 暂时禁止用户输入会大大便于你更新已有数据。

    (..More)

    Windows Launcher for Google App Engine(GAE SDK 1.2.5 Update)

    九月 9th, 2009 0 条评论
    前几天发现,GAE SDK for Windows 更新了版本1.2.5,昨天我就去google appengine网站上,更新了版本,发现其把命令行式的对话框改成了Windows对话框,看起来很亲切啊,虽然功能和外表还是很简陋,但仍是GAE SDK for Windows的一大进步啊,希望以后能更好发展! 使用后感受:/font>

    (..More)

    给Micolog导航栏增加外链功能

    九月 5th, 2009 4 条评论

    Micolog的导航栏条目是通过page实现的,默认情况下不能添加外链。

    可以通过下面方法增加外链功能:

    1. 建一个go.py档案,内容如下:

    import cgi
    import wsgiref.handlers
    from google.appengine.ext import webapp
    class MainPage(webapp.RequestHandler):
    def get(self):
      site = self.request.get('site')
      self.redirect(site)

    application = webapp.WSGIApplication([('/go', MainPage)], debug=True)

    def main():
    wsgiref.handlers.CGIHandler().run(application)

    if __name__ == "__main__":
    main()

    2. 编辑app.yaml

    增加

    - url: /go
      script: go.py

    3. 登录后台,新建page,slug填上 go?site=http://www.wer.pp.ru

    完成,很简单,这样就在导航栏增加一个wer.org.ru的外链了,比直接编辑模板来的方便

    转自 axiang

    传说中的GAE应用程序大全,很多啊

    九月 2nd, 2009 0 条评论

    这些是一些牛人从网上搜集的,我给大家搬上来分享了,有时间去拜访他们吧,一定不错的! appspot技术站点

    (..More)

    如何在Google App Engine上运行PHP

    九月 1st, 2009 0 条评论
    谷歌在一年前推出Google App Engine。这个免费的应用程序托管引擎可以为你分配500 MB的持久存储和足够的CPU以及一个能支持每月约500万页面浏览的带宽。另外,如果你想得到更多支持,可以查看增值计划。Google App Engine将支持Java继续向前发展。不幸的是Google App Engine上,PHP仍然是最希望被Google App Engine支持的。因此直到谷歌宣布其官方发布对PHP支持之前,我们可以通过Quercus这一方案来运行PHP。 Quercus可以说是100%的在Java上执行PHP语言的工具(需要的JDK 1.5 )。由于Google App Engine现在支持Java,这意味着我们可以通过Quercus来运行PHP脚本。

    (..More)

    如何用Google Appengine上传应用程序

    九月 1st, 2009 1 条评论
    App Engine SDK 包括用于上传应用程序文件的命令。与 SDK 的其余部分一样,appcfg.py 可在装有 Python 2.5(或其它) 的任何计算机上运行。

    要上传应用程序文件,请通过 update 操作和应用程序根目录的名称运行 appcfg.py 命令。根目录应包含应用程序的 app.yaml 文件。

    (..More)