存档

‘GAE和编程’分类的存档

GAE Prerelease SDK 1.4.0 is out!

November 19th, 2010 18 条评论

Google App Engine prerelease SDK 1.4.0 is out! You can get it from the Google Code project:

http://code.google.com/p/googleappengine/downloads/list

We're still working on the docs and will have them ready for the final
release, so if there are any questions about how to use the new features,
feel free to ask on this thread and I'll do my best to clarify them. The
release notes are below. This is an EXCITING release:

(..More)

Python实现字符串全角半角转换

October 18th, 2010 15 条评论

全角字符unicode编码范围65281~65374 (十六进制 0xFF01 ~ 0xFF5E),半角字符unicode编码范围33~126 (十六进制 0x21~ 0x7E)。空格比较特殊,全角为 12288(0x3000),半角为 32 (0x20)

而且除空格外,全角/半角按unicode编码排序在顺序上是对应的所以可以直接通过用+-法来处理非空格数据,对空格单独处理。

全角转半角

def strQ2B(ustring):
    """把字符串全角转半角"""
    rstring = ""
    for uchar in ustring:
        inside_code=ord(uchar)
        if inside_code==0x3000:
            inside_code=0x0020
        else:
            inside_code-=0xfee0
        if inside_code<0x0020 or inside_code>0x7e:      #转完之后不是半角字符则返回原来的字符
            rstring += uchar
        rstring += unichr(inside_code)
    return rstring

(..More)

Google App Engine对查询的限制

October 1st, 2010 35 条评论

今天我在GAE进行数据查询时遇到了这样一个异常:First ordering property must be the same as inequality filter property, if specified for this query; received date, expected ctype 。到网络上搜索一下,发现这是Google App Engine对查询上的一个限制。经过一会儿时间的查找,我终于在在Google App Engine上查到该查询限制及其解决办法,办法就是“必须在采用其他排序顺序之前对不等式过滤器中的属性进行排序”。

下面记录一些Google App Engine查询机制的限制,以方便后期参考。索引查询机制的本质是对查询功能强加一些限制。

对一个属性进行过滤或排序需要确认该属性确实存在

属性的查询过滤条件或排序顺序也暗含了一个条件,即实体必须具有该属性的值。

数据存储区实体不需具有其他同类实体所具有的属性值。属性上的过滤器只能与具有该属性的值的实体相匹配。过滤器或排序顺序中所使用的不具有属性值的实体会从为该查询创建的索引中删除。

没有可与不具有属性的实体相匹配的过滤器

无法为缺少指定属性的实体执行查询。一种解决方法是创建一个固定的(已建模的)属性,默认值为 None,然后为实体创建一个过滤条件,属性值为 None

(..More)

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

July 5th, 2010 43 条评论

最近在学习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

June 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

April 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后台增加新的警告提示语

April 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,得花多大时间呢?

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

March 24th, 2010 4 条评论

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

(..More)

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

March 16th, 2010 40 条评论

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

(..More)

Java中线程方法实现

November 25th, 2009 6 条评论

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

(..More)

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

November 4th, 2009 0 条评论

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

(..More)

Micolog 0.6测试版出炉

October 13th, 2009 5 条评论

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

博客公告

    micolog 0.6 beta测试

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

IE下使用firebug

September 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代码--限制文本字数

    September 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的一个实例

    September 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实现

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

    #shortest_path.py

    ## 最短路径

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

    ##

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

    ##Dijkstra算法的思想是:

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

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

    (..More)

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

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

    (..More)

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

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

    (..More)

    给Micolog导航栏增加外链功能

    September 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应用程序大全,很多啊

    September 2nd, 2009 1 条评论

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

    (..More)