<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>vifix.cn &#187; GAE</title>
	<atom:link href="http://vifix.cn/blog/tag/gae/feed" rel="self" type="application/rss+xml" />
	<link>http://vifix.cn/blog</link>
	<description>compile the dream, compile tomorrow</description>
	<lastBuildDate>Sat, 04 Feb 2012 03:15:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>用nginx给ghs做了个反向代理</title>
		<link>http://vifix.cn/blog/nginx-reverse-proxy-to-ghs-google.html</link>
		<comments>http://vifix.cn/blog/nginx-reverse-proxy-to-ghs-google.html#comments</comments>
		<pubDate>Wed, 25 Nov 2009 03:19:07 +0000</pubDate>
		<dc:creator>Mac</dc:creator>
				<category><![CDATA[Website]]></category>
		<category><![CDATA[GAE]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[nginx]]></category>

		<guid isPermaLink="false">http://vifix.cn/blog/?p=1275</guid>
		<description><![CDATA[有段时间没有关注Google App Engine，最近发现对GAE至关重要的ghs.google.com又被功夫网了，因此自己的那个vxtodo（地址是vxtodo.ihfs.net）也无法访问了……唉。不管怎样，决定开始寻找一个一劳永逸的方法，免得经常去修改vxtodo.ihfs.net的CNAME，太麻烦了。 google一番之后，发现一个也是在VPS（并且还是邻居，都运行在rashost的服务上）用nginx的负载均衡给ghs.google.com做反向代理的方法，地址是：http://www.littz.cn/viewnews-340.html，研究之后觉得可行，因此马上给自己的nginx配置了起来，下面是我自己的配置： upstream ghs { ip_hash; server ghs.google.com; server 72.14.203.121; server 72.14.207.121; server 74.125.43.121; server 74.125.47.121; server 74.125.53.121; server 74.125.77.121; server 74.125.93.121; server 74.125.95.121; server 74.125.113.121; server 216.239.32.21; server 216.239.34.21; server 216.239.36.21; server 216.239.38.21; } server { listen 80; server_name ghs.ihfs.net vxtodo.ihfs.net; access_log /var/log/nginx/ihfs_ghs_proxy.access.log; location / { proxy_redirect off; proxy_set_header Host $host; proxy_pass [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://vifix.cn/blog/wp-content/uploads/2009/11/nslookup.jpg" rel="shadowbox[sbpost-1275];player=img;" title="nslookup"><img class="alignnone size-medium wp-image-1277" title="nslookup" src="http://vifix.cn/blog/wp-content/uploads/2009/11/nslookup-300x274.jpg" alt="nslookup" width="300" height="274" /></a></p>
<p>有段时间没有关注Google App Engine，最近发现对GAE至关重要的ghs.google.com又被功夫网了，因此自己的那个<a href="http://vifix.cn/blog/vxtodo.html" target="_self">vxtodo</a>（地址是<a href="http://vxtodo.ihfs.net" target="_blank" onclick="pageTracker._trackPageview('/outgoing/vxtodo.ihfs.net?referer=');">vxtodo.ihfs.net</a>）也无法访问了……唉。不管怎样，决定开始寻找一个一劳永逸的方法，免得经常去修改vxtodo.ihfs.net的CNAME，太麻烦了。</p>
<p>google一番之后，发现一个也是在VPS（并且还是邻居，都运行在<a href="http://www.rashost.com" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.rashost.com?referer=');">rashost</a>的服务上）用nginx的负载均衡给ghs.google.com做反向代理的方法，地址是：<a href="http://www.littz.cn/viewnews-340.html" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.littz.cn/viewnews-340.html?referer=');">http://www.littz.cn/viewnews-340.html</a>，研究之后觉得可行，因此马上给自己的nginx配置了起来，下面是我自己的配置：</p>
<p><span id="more-1275"></span></p>
<pre>upstream ghs {
        ip_hash;
        server ghs.google.com;
        server 72.14.203.121;
        server 72.14.207.121;
        server 74.125.43.121;
        server 74.125.47.121;
        server 74.125.53.121;
        server 74.125.77.121;
        server 74.125.93.121;
        server 74.125.95.121;
        server 74.125.113.121;
        server 216.239.32.21;
        server 216.239.34.21;
        server 216.239.36.21;
        server 216.239.38.21;
}

server {
        listen       80;
        server_name  ghs.ihfs.net vxtodo.ihfs.net;
        access_log  /var/log/nginx/ihfs_ghs_proxy.access.log;

        location / {
                proxy_redirect off;
                proxy_set_header Host $host;
                proxy_pass http://ghs;
                proxy_set_header  X-Real-IP  $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_redirect false;
        }

}</pre>
<p>因为暂时觉得没有https的需求，所以并没有设置https的部分。对https的部分的配置有兴趣的朋友可以去上面给出的原文链接查看～</p>
<p>总体效果还不错，在dnspod修改了CNAME之后立马就生效了。</p>
]]></content:encoded>
			<wfw:commentRss>http://vifix.cn/blog/nginx-reverse-proxy-to-ghs-google.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Google App Engine中datastore的Key</title>
		<link>http://vifix.cn/blog/google-app-engine-datastore-key.html</link>
		<comments>http://vifix.cn/blog/google-app-engine-datastore-key.html#comments</comments>
		<pubDate>Thu, 14 May 2009 14:56:03 +0000</pubDate>
		<dc:creator>Mac</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[GAE]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://vifix.cn/blog/?p=898</guid>
		<description><![CDATA[Google App Engine使用了一种与关系数据库完全不同的数据库，称为分布式键-值数据库（Key-Value-Database），所有的&#8221;条目&#8221;，都是一个对象。这种数据库拥有代码简单，开发效率高，高并发访问效率等特性，但同时也有不支持模糊查询等缺点。 在使用上，键-值数据库和之前熟悉的MySQL等所有的关系数据库都有点不太一样，因此在开发vxtodo时走了一些弯路，比如这个等同于关系数据库的&#8221;主键&#8221;的问题就让我奇怪了很久（当然，对于这种的键-值数据库中，是否能以主键来称呼应该值得商榷），刚才终于摸索清楚了，记录下来。 Google App Engine的datastore的每个条目的唯一的键是自动生成的，无需人工干预。因为一开始并不清楚这一点，所以定义&#8221;表&#8221;的结构时找不到类似于自动索引的功能，结果开始写vxtodo时我用的是时间戳 + 用户名邮箱地址然后Hash再取绝对值出来的一个唯一值的诡异方法，虽然也能用，但是毕竟不够优雅（这样的Hash值实在是太长了）。仔细翻阅文档后，终于把ID/Name部分给看明白了。 首先，定义一个数据类型： class Task&#40;db.Model&#41;: user = db.UserProperty&#40;&#41; title = db.StringProperty&#40;&#41; content = db.TextProperty&#40;&#41; 这个就不用多说了，一目了然，GAE的入门教程里面也说的很清楚。一个&#8221;字段&#8221;一个属性，Google提供了一批数据类型可以使用。 获取某个条目的ID： query = Task.all&#40;&#41; tasks = query.fetch&#40;50&#41; for task in tasks: print task.key&#40;&#41;.id&#40;&#41; 与别的&#8221;字段&#8221;不同的是，无法直接以task.id来获取它，而是通过调用它的key()方法返回一个Key对象然后再执行这个Key对象的id()方法来获取到这个id。 用一个给定的ID来进行查找： key = Key.from_path&#40;&#34;Task&#34;, 3&#41; #Task类别里面的ID3的对象的键 —— 翻译成关系数据库的话，就是Task表里面的主键为3的项目的主键 query = Task.all&#40;&#41; query.ancestor&#40;key&#41; task = query.get&#40;&#41; #获取对象 id这个&#8221;字段&#8221;和别的属性不一样，是用Query类专门的ancestor()的方法来处理的，虽然一开始看文档的时候就注意到了这个方法，但是由于并不知道如何给定key的值（因为不知道上面的这个获取方法）所以不明如何使用。在看了Key的文档的from_path()方法恍然大悟。 去年在Java上接触到过一种对象数据库db4o其实差不多就是这样的类型，当时也花了一些时间来研究，然而当时这个db4o并不是很成熟（印象中存储中文似乎有乱码问题），最终不了了之，最近在Google App [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://vifix.cn/blog/wp-content/uploads/2009/05/google_appengine.png" rel="shadowbox[sbpost-898];player=img;" title="google_appengine"><img class="alignnone size-thumbnail wp-image-899" title="google_appengine" src="http://vifix.cn/blog/wp-content/uploads/2009/05/google_appengine-150x150.png" alt="google_appengine" width="150" height="150" /></a></p>
<p>Google App Engine使用了一种与关系数据库完全不同的数据库，称为分布式键-值数据库（Key-Value-Database），所有的&#8221;条目&#8221;，都是一个对象。这种数据库拥有代码简单，开发效率高，高并发访问效率等特性，但同时也有不支持模糊查询等缺点。</p>
<p>在使用上，键-值数据库和之前熟悉的MySQL等所有的关系数据库都有点不太一样，因此在开发<a href="http://vifix.cn/blog/vxtodo.html">vxtodo</a>时走了一些弯路，比如这个等同于关系数据库的&#8221;主键&#8221;的问题就让我奇怪了很久（当然，对于这种的键-值数据库中，是否能以主键来称呼应该值得商榷），刚才终于摸索清楚了，记录下来。</p>
<p>Google App Engine的datastore的每个条目的唯一的键是自动生成的，无需人工干预。因为一开始并不清楚这一点，所以定义&#8221;表&#8221;的结构时找不到类似于自动索引的功能，结果开始写vxtodo时我用的是时间戳 + 用户名邮箱地址然后Hash再取绝对值出来的一个唯一值的诡异方法，虽然也能用，但是毕竟不够优雅（这样的Hash值实在是太长了）。仔细翻阅文档后，终于把ID/Name部分给看明白了。</p>
<p><span id="more-898"></span></p>
<p>首先，定义一个数据类型：</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> Task<span style="color: black;">&#40;</span>db.<span style="color: black;">Model</span><span style="color: black;">&#41;</span>:
    <span style="color: #dc143c;">user</span> = db.<span style="color: black;">UserProperty</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    title = db.<span style="color: black;">StringProperty</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    content = db.<span style="color: black;">TextProperty</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>这个就不用多说了，一目了然，GAE的入门教程里面也说的很清楚。一个&#8221;字段&#8221;一个属性，Google提供了一批数据类型可以使用。</p>
<p>获取某个条目的ID：</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">query = Task.<span style="color: #008000;">all</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
tasks = query.<span style="color: black;">fetch</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">50</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">for</span> task <span style="color: #ff7700;font-weight:bold;">in</span> tasks:
    <span style="color: #ff7700;font-weight:bold;">print</span> task.<span style="color: black;">key</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: #008000;">id</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>与别的&#8221;字段&#8221;不同的是，无法直接以task.id来获取它，而是通过调用它的key()方法返回一个Key对象然后再执行这个Key对象的id()方法来获取到这个id。</p>
<p>用一个给定的ID来进行查找：</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">key = Key.<span style="color: black;">from_path</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Task&quot;</span>, <span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>  <span style="color: #808080; font-style: italic;">#Task类别里面的ID3的对象的键 —— 翻译成关系数据库的话，就是Task表里面的主键为3的项目的主键</span>
query = Task.<span style="color: #008000;">all</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
query.<span style="color: black;">ancestor</span><span style="color: black;">&#40;</span>key<span style="color: black;">&#41;</span>
task = query.<span style="color: black;">get</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;">#获取对象</span></pre></div></div>

<p>id这个&#8221;字段&#8221;和别的属性不一样，是用Query类专门的ancestor()的方法来处理的，虽然一开始看文档的时候就注意到了这个方法，但是由于并不知道如何给定key的值（因为不知道上面的这个获取方法）所以不明如何使用。在看了Key的文档的from_path()方法恍然大悟。</p>
<p>去年在Java上接触到过一种对象数据库<a href="http://www.db4o.com/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.db4o.com/?referer=');">db4o</a>其实差不多就是这样的类型，当时也花了一些时间来研究，然而当时这个db4o并不是很成熟（印象中存储中文似乎有乱码问题），最终不了了之，最近在Google App Engine重新碰到这样的数据库类型，算是对这种键-值数据库的重新认识了吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://vifix.cn/blog/google-app-engine-datastore-key.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>vxtodo</title>
		<link>http://vifix.cn/blog/vxtodo.html</link>
		<comments>http://vifix.cn/blog/vxtodo.html#comments</comments>
		<pubDate>Tue, 12 May 2009 14:39:28 +0000</pubDate>
		<dc:creator>Mac</dc:creator>
				<category><![CDATA[Atelier]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[GAE]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://vifix.cn/blog/?p=895</guid>
		<description><![CDATA[这段时间研究Google App Engine的成果，今天发布。 一个个人TODO-List管理程序，支持邮件提醒。 服务器端是Python，客户端自然还是 HTML + CSS + JS，话说Javascript的代码比Python还多一倍，没jQuery的话代码量应该会更加冗长……不过用Google App Engine来写程序还是挺幸福的。 欢迎各位使用（会有人用么？），以及帮忙测试和报告Bug 在GPL第二版协议下开源。 地址： http://vxtodo.ihfs.net/ http://vxtodo.appspot.com/ 获取源代码前往： http://code.google.com/p/vxtodo/ PS.I: google app engine还无法支持.cn域名，因此只好用这个ihfs.net来进行绑定了…… PS.II: 话说appspot偶尔会被GFW掉，无奈…… PS.III: 于是咱也玩了把云计算了啊～ 更新@2009-05-14: 修正了无法输入\和回车的bug 加入Prism的说明 制作了LOGO 更新@2009-05-15: 修改了数据模型，删除了一些无用的测试数据（没办法的选择，这种键-值数据库无法修改“表结构”，只能清空数据库然后重新添加 更新@2009-05-17: 对状态图标加上了事件，点击可以直接转换状态 将代码导入Google Code，以GPLv2开源 更新@2010-01-17: 解决一个换行的问题]]></description>
			<content:encoded><![CDATA[<p><a rel="attachment wp-att-896" href="http://vifix.cn/blog/vxtodo.html/vxtodo" title="vxtodo"><img class="alignnone size-medium wp-image-896" title="vxtodo" src="http://vifix.cn/blog/wp-content/uploads/2009/05/vxtodo-290x300.png" alt="vxtodo" width="290" height="300" /></a></p>
<p>这段时间研究Google App Engine的成果，今天发布。</p>
<p>一个个人TODO-List管理程序，支持邮件提醒。</p>
<p>服务器端是Python，客户端自然还是 HTML + CSS + JS，话说Javascript的代码比Python还多一倍，没jQuery的话代码量应该会更加冗长……不过用Google App Engine来写程序还是挺幸福的。</p>
<p>欢迎各位使用（会有人用么？），以及帮忙测试和报告Bug</p>
<p>在GPL第二版协议下开源。</p>
<p>地址：<br />
<a href="http://vxtodo.ihfs.net/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/vxtodo.ihfs.net/?referer=');">http://vxtodo.ihfs.net/</a><br />
<a href="http://vxtodo.appspot.com/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/vxtodo.appspot.com/?referer=');">http://vxtodo.appspot.com/</a></p>
<p>获取源代码前往：<br />
<a href="http://code.google.com/p/vxtodo/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/code.google.com/p/vxtodo/?referer=');">http://code.google.com/p/vxtodo/</a></p>
<p>PS.I: google app engine还无法支持.cn域名，因此只好用这个ihfs.net来进行绑定了……<br />
PS.II: 话说appspot偶尔会被GFW掉，无奈……<br />
PS.III: 于是咱也玩了把云计算了啊～</p>
<h3>更新@2009-05-14:</h3>
<ol>
<li>修正了无法输入\和回车的bug</li>
<li>加入Prism的说明</li>
<li>制作了LOGO</li>
</ol>
<h3>更新@2009-05-15:</h3>
<ol>
<li>修改了数据模型，删除了一些无用的测试数据（没办法的选择，这种键-值数据库无法修改“表结构”，只能清空数据库然后重新添加</li>
</ol>
<h3>更新@2009-05-17:</h3>
<ol>
<li>对状态图标加上了事件，点击可以直接转换状态</li>
<li>将代码导入Google Code，以GPLv2开源</li>
</ol>
<h3>更新@2010-01-17:</h3>
<ol>
<li>解决一个换行的问题</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://vifix.cn/blog/vxtodo.html/feed</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
	</channel>
</rss>

