<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10titles.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemtitles.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:gd="http://schemas.google.com/g/2005" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DkIAQ3o5eCp7ImA9Wx5TE0k.&quot;"><id>tag:blogger.com,1999:blog-28371165</id><updated>2010-07-29T03:15:42.420+08:00</updated><title type="text">Shadow Logs</title><subtitle type="html">A blog by a Information Communication Technology student from PETRONAS Technology University about what he discovered and learned. Mainly focuses on guides, howtos, and news related to Fedora, Linux, OpenSource and computing in general + some misc stuff.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.kagesenshi.org/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.kagesenshi.org/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/28371165/posts/default?start-index=6&amp;max-results=5&amp;redirect=false&amp;v=2" /><author><name>KageSenshi</name><uri>http://www.blogger.com/profile/00019993555432609309</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>310</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>5</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/KageSenshi" /><feedburner:info uri="kagesenshi" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><logo>http://bp0.blogger.com/_0DENAyCRujw/R4bhJxwdC_I/AAAAAAAAAIA/_qzdlgAknCM/s1600-h/hackergotchi.png</logo><feedburner:emailServiceId>KageSenshi</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry gd:etag="W/&quot;CE8MQHY_cSp7ImA9WxFVGUw.&quot;"><id>tag:blogger.com,1999:blog-28371165.post-9004808249593980482</id><published>2010-06-19T09:05:00.004+08:00</published><updated>2010-06-19T10:01:21.849+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-19T10:01:21.849+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Zope" /><category scheme="http://www.blogger.com/atom/ns#" term="repoze.bfg" /><category scheme="http://www.blogger.com/atom/ns#" term="Hacks" /><category scheme="http://www.blogger.com/atom/ns#" term="Python" /><category scheme="http://www.blogger.com/atom/ns#" term="HOWTO" /><title>Integrating hurry.resource into BFG</title><content type="html">Back in PyCon APAC last week I was introduced to &lt;a href="http://pypi.python.org/pypi/hurry.resource/"&gt;hurry.resource&lt;/a&gt; by its author, which is also one of the founder behind &lt;a href="http://grok.org"&gt;Grok&lt;/a&gt;, &lt;a href="http://www.startifact.com/"&gt;Martijn Faassen.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;So, what does it do?.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pypi.python.org/pypi/hurry.resource/"&gt;Read Here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Lets go to the fun part&lt;br /&gt;&lt;br /&gt;&lt;b&gt; Setting Up&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Assuming you are using one of the default &lt;a href="http://bfg.repoze.org"&gt;BFG&lt;/a&gt; templates&lt;br /&gt;&lt;br /&gt;First, &lt;a href="http://docs.repoze.org/bfg/current/narr/zca.html#enabling-the-zca-global-api-by-using-hook-zca"&gt;enable ZCA&lt;/a&gt;. (or just do this in &lt;code&gt;run.py&lt;/code&gt;):&lt;br /&gt;&lt;pre&gt;...&lt;br /&gt;    config = Configurator(root_factory=get_root, settings=settings)&lt;br /&gt;    config.hook_zca()&lt;br /&gt;    config.begin()&lt;br /&gt;...&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Do this little modification on the &lt;code&gt;get_root&lt;/code&gt; function in model.py:&lt;br /&gt;&lt;pre&gt;from repoze.bfg.interfaces import IRequest&lt;br /&gt;&lt;br /&gt;def get_root(request):&lt;br /&gt;    request.registry.registerUtility(request,provided=IRequest)&lt;br /&gt;    return root&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Add some component codes, name the file &lt;code&gt;resource.py&lt;/code&gt;&lt;br /&gt;&lt;pre&gt;from hurry.resource.interfaces import ICurrentNeededInclusions&lt;br /&gt;from hurry.resource.interfaces import ILibraryUrl&lt;br /&gt;from zope.interface import implements,implementer&lt;br /&gt;from zope.component import getUtility,adapter&lt;br /&gt;from hurry.resource import NeededInclusions&lt;br /&gt;from repoze.bfg.interfaces import IRequest&lt;br /&gt;from hurry.resource.core import Library&lt;br /&gt;&lt;br /&gt;class NeededInclusion(object):&lt;br /&gt;   implements(ICurrentNeededInclusions)&lt;br /&gt;&lt;br /&gt;   def __call__(self):&lt;br /&gt;       request = getUtility(IRequest)&lt;br /&gt;       if not hasattr(request,'needed'):&lt;br /&gt;          request.needed = NeededInclusions()&lt;br /&gt;       return request.needed&lt;br /&gt;&lt;br /&gt;@implementer(ILibraryUrl)&lt;br /&gt;@adapter(Library)&lt;br /&gt;def LibraryUrl(library):&lt;br /&gt;    request = getUtility(IRequest)&lt;br /&gt;    return "%s/hurry/%s" % (request.application_url,library.name)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;and hook them into ZCA by adding these into &lt;code&gt;configure.zcml&lt;/code&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;utility factory=".resource.NeededInclusion"/&amp;gt;&lt;br /&gt;  &amp;lt;adapter factory=".resource.LibraryUrl"/&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Adding into template&lt;/b&gt;&lt;br /&gt;In your main template head section, add:&lt;pre&gt;&amp;lt;tal:cond condition="getattr(request,'needed',None)"&amp;gt;&lt;br /&gt;   &amp;lt;tal:res replace="structure request.needed.render()"/&amp;gt;&lt;br /&gt;&amp;lt;/tal:cond&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Using it&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Lets take &lt;a href="http://pypi.python.org/pypi/hurry.jquery"&gt;hurry.jquery&lt;/a&gt; for example:&lt;br /&gt;&lt;br /&gt;First, register the static files, add these into &lt;code&gt;configure.zcml&lt;/code&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;static&lt;br /&gt;     name="hurry/jquery"&lt;br /&gt;     path="hurry.jquery:jquery-build"&lt;br /&gt;     /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;If you want to include Jquery js into your current view, just do this in the view code:&lt;br /&gt;&lt;pre&gt;from hurry.jquery import jquery&lt;br /&gt;def my_view(request):&lt;br /&gt;    jquery.need()&lt;br /&gt;    return {'project':'helloworld'}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;If you did the stuff above correctly, with luck , your view should have this in place of the &lt;code&gt;tal&lt;/code&gt; block.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;script type="text/javascript" &lt;br /&gt;     src="http://localhost:6543/hurry/jquery/jquery-1.4.2.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Custom Resource Libraries&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;You can create your own custom resource libraries and share/reuse it. To create your own resource, read the &lt;a href="http://pypi.python.org/pypi/hurry.resource/"&gt;documentation of hurry.resource&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Considering hurry.resource is also used in Grok and probably several other ZCA based frameworks, your resource library can also be reused on these frameworks with little to no modifications.&lt;br /&gt;&lt;br /&gt;Credits to Martijn for this awesome component.&lt;br /&gt;&lt;br /&gt;Happy hacking :D&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;
&lt;br/&gt;
&lt;br/&gt;
- Izhar Firdaus -&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28371165-9004808249593980482?l=blog.kagesenshi.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/amP8JBVSnqKln1xqDBPKSP6fyDg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/amP8JBVSnqKln1xqDBPKSP6fyDg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/amP8JBVSnqKln1xqDBPKSP6fyDg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/amP8JBVSnqKln1xqDBPKSP6fyDg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/KageSenshi?a=K4yTSkZCAy0:e4j1ln-veKM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/KageSenshi?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/KageSenshi?a=K4yTSkZCAy0:e4j1ln-veKM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/KageSenshi?i=K4yTSkZCAy0:e4j1ln-veKM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/KageSenshi?a=K4yTSkZCAy0:e4j1ln-veKM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/KageSenshi?i=K4yTSkZCAy0:e4j1ln-veKM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/KageSenshi?a=K4yTSkZCAy0:e4j1ln-veKM:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/KageSenshi?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/KageSenshi?a=K4yTSkZCAy0:e4j1ln-veKM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/KageSenshi?i=K4yTSkZCAy0:e4j1ln-veKM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/KageSenshi/~4/K4yTSkZCAy0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.kagesenshi.org/feeds/9004808249593980482/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=28371165&amp;postID=9004808249593980482" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28371165/posts/default/9004808249593980482?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28371165/posts/default/9004808249593980482?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/KageSenshi/~3/K4yTSkZCAy0/integrating-hurryresource-into-bfg.html" title="Integrating hurry.resource into BFG" /><author><name>KageSenshi</name><uri>http://www.blogger.com/profile/00019993555432609309</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00088522125475112927" /></author><thr:total>3</thr:total><feedburner:origLink>http://blog.kagesenshi.org/2010/06/integrating-hurryresource-into-bfg.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08GSXs6eCp7ImA9WxFWFUo.&quot;"><id>tag:blogger.com,1999:blog-28371165.post-4118022316033551967</id><published>2010-06-03T21:53:00.007+08:00</published><updated>2010-06-03T23:43:48.510+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-03T23:43:48.510+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Philosophy" /><title>"They'll realize that they're different."</title><content type="html">Quote from JDrama &lt;a href="http://en.wikipedia.org/wiki/Change_%28TV_series%29"&gt;CHANGE&lt;/a&gt;. Episode 5&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;b&gt;Keita Asakura&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;    I'm sorry for being arrogant. &lt;br /&gt;    I used to be a grade school teacher.&lt;br /&gt;    Last year,&lt;br /&gt;    I was in charge of the fifth graders.&lt;br /&gt;    Anyway, they fight quite often.&lt;br /&gt;    But some of them become spiteful&lt;br /&gt;    and then sometimes it leads to bullying.&lt;br /&gt;    When those problems arise,&lt;br /&gt;    I would tell them,&lt;br /&gt;    "Let's think."&lt;br /&gt;    "You're in the same class,&lt;br /&gt;    so when there's something you don't like or you're not satisfied of, then tell them properly,&lt;br /&gt;    and listen to them properly."&lt;br /&gt;    "Then let's think thoroughly. Then..."&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Gunji&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;    They'll understand each other.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Keita Asakura&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;    No.&lt;br /&gt;    They'll realize that they're different.&lt;br /&gt;&lt;br /&gt;    Since we think we're all alike,&lt;br /&gt;    we get mad when we get contradicted.&lt;br /&gt;    When someone acts different, we think "What the heck?"&lt;br /&gt;    That's when fights and bullying begin.&lt;br /&gt;    But no two people are alike.&lt;br /&gt;    Everyone thinks differently and has different situations.&lt;br /&gt;    That's why I wanted them to understand&lt;br /&gt;    that they're different from each other.&lt;br /&gt;    After that, think of what words to use so that their feelings will reach each other&lt;br /&gt;    and so that they can convince each other.&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;^.^&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;O mankind, We have created you male and female, and appointed you races and tribes, that you may know one another. Surely the noblest among you in the sight of God is the most righteous of you. God is All-knowing, All-aware. (49:13)&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;
&lt;br/&gt;
&lt;br/&gt;
- Izhar Firdaus -&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28371165-4118022316033551967?l=blog.kagesenshi.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/e5-VQ29xep1niagcLoGeVchUlak/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/e5-VQ29xep1niagcLoGeVchUlak/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/e5-VQ29xep1niagcLoGeVchUlak/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/e5-VQ29xep1niagcLoGeVchUlak/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/KageSenshi?a=IIHmRtvicC0:MtQt68gpNsc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/KageSenshi?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/KageSenshi?a=IIHmRtvicC0:MtQt68gpNsc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/KageSenshi?i=IIHmRtvicC0:MtQt68gpNsc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/KageSenshi?a=IIHmRtvicC0:MtQt68gpNsc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/KageSenshi?i=IIHmRtvicC0:MtQt68gpNsc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/KageSenshi?a=IIHmRtvicC0:MtQt68gpNsc:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/KageSenshi?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/KageSenshi?a=IIHmRtvicC0:MtQt68gpNsc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/KageSenshi?i=IIHmRtvicC0:MtQt68gpNsc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/KageSenshi/~4/IIHmRtvicC0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.kagesenshi.org/feeds/4118022316033551967/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=28371165&amp;postID=4118022316033551967" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28371165/posts/default/4118022316033551967?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28371165/posts/default/4118022316033551967?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/KageSenshi/~3/IIHmRtvicC0/theyll-realize-that-theyre-different.html" title="&quot;They'll realize that they're different.&quot;" /><author><name>KageSenshi</name><uri>http://www.blogger.com/profile/00019993555432609309</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00088522125475112927" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.kagesenshi.org/2010/06/theyll-realize-that-theyre-different.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkIMRHozfip7ImA9WxFQFkg.&quot;"><id>tag:blogger.com,1999:blog-28371165.post-2522199574445001692</id><published>2010-05-12T15:12:00.011+08:00</published><updated>2010-05-12T15:49:45.486+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-12T15:49:45.486+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tips" /><category scheme="http://www.blogger.com/atom/ns#" term="Fedora" /><category scheme="http://www.blogger.com/atom/ns#" term="Inigo" /><category scheme="http://www.blogger.com/atom/ns#" term="Python" /><title>list as default value in class __init__() - watchout for surprise</title><content type="html">&lt;b&gt;Note to self: don't use list as a default value in class methods if its going to be modified later, as it might cause some trouble.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Just realized something:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;In [1]: class MyClass(object):&lt;br /&gt;   ...:     def __init__(self,data=[]):&lt;br /&gt;   ...:         self.data = data&lt;br /&gt;   ...:         &lt;br /&gt;   ...:     def addData(self,value):&lt;br /&gt;   ...:         self.data.append(value)&lt;br /&gt;   ...:         &lt;br /&gt;   ...:         &lt;br /&gt;&lt;br /&gt;In [2]: obj = MyClass()&lt;br /&gt;&lt;br /&gt;In [3]: obj.addData('hello')&lt;br /&gt;&lt;br /&gt;In [4]: obj.data&lt;br /&gt;Out[4]: ['hello']&lt;br /&gt;&lt;br /&gt;In [5]: obj2 = MyClass()&lt;br /&gt;&lt;br /&gt;In [6]: obj2.data&lt;br /&gt;Out[6]: ['hello']&lt;br /&gt;&lt;br /&gt;In [7]: obj3 = MyClass([])&lt;br /&gt;&lt;br /&gt;In [8]: obj3.data&lt;br /&gt;Out[8]: []&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;In [12]: def myfunc(val,data=[]):&lt;br /&gt;   ....:     data.append(val)&lt;br /&gt;   ....:     return data&lt;br /&gt;   ....: &lt;br /&gt;&lt;br /&gt;In [13]: myfunc(1)&lt;br /&gt;Out[13]: [1]&lt;br /&gt;&lt;br /&gt;In [14]: myfunc(2)&lt;br /&gt;Out[14]: [1, 2]&lt;br /&gt;&lt;br /&gt;In [15]: myfunc(3)&lt;br /&gt;Out[15]: [1, 2, 3]&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;At first i thought its a bug/weirdness, but after banging my head a bit to wall and a long stare at the ceiling, it made sense.&lt;br /&gt;&lt;br /&gt;During class definition, the list object already instantiated. Therefore, the default value of &lt;code&gt;data&lt;/code&gt; variable is a reference to a list object, rather than a new list on each instantiation.&lt;br /&gt;&lt;br /&gt;Not quite sure how to explain this in words .. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;In [1]: class MyClass(object):&lt;br /&gt;   ...:     def __init__(self,data=[]): # data-&amp;gt;List object at 0x0001&lt;br /&gt;   ...:         self.data = data        # self.data-&amp;gt;List object at 0x0001&lt;br /&gt;   ...:         &lt;br /&gt;   ...:     def addData(self,value):&lt;br /&gt;   ...:         self.data.append(value) # self.data-&amp;gt;List object at 0x0001&lt;br /&gt;   ...:         &lt;br /&gt;   ...:         &lt;br /&gt;&lt;br /&gt;In [2]: obj = MyClass()&lt;br /&gt;&lt;br /&gt;In [3]: obj.addData('hello')&lt;br /&gt;&lt;br /&gt;In [4]: obj.data           # obj.data-&amp;gt;List object at 0x0001&lt;br /&gt;Out[4]: ['hello']&lt;br /&gt;&lt;br /&gt;In [5]: obj2 = MyClass()&lt;br /&gt;&lt;br /&gt;In [6]: obj2.data          # obj2.data-&amp;gt;List object at 0x0001&lt;br /&gt;Out[6]: ['hello']&lt;br /&gt;&lt;br /&gt;In [7]: obj3 = MyClass([]) # []-&amp;gt;List object at 0x0002&lt;br /&gt;&lt;br /&gt;In [8]: obj3.data          # obj3.data-&amp;gt;List object at 0x0002&lt;br /&gt;Out[8]: []&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I think you got the idea.&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;
&lt;br/&gt;
&lt;br/&gt;
- Izhar Firdaus -&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28371165-2522199574445001692?l=blog.kagesenshi.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/R1SBueB3ZLszGdr0qPxRmTa6ZoE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/R1SBueB3ZLszGdr0qPxRmTa6ZoE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/R1SBueB3ZLszGdr0qPxRmTa6ZoE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/R1SBueB3ZLszGdr0qPxRmTa6ZoE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/KageSenshi?a=WYabVzDMs4E:EIjcZ7RupEI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/KageSenshi?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/KageSenshi?a=WYabVzDMs4E:EIjcZ7RupEI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/KageSenshi?i=WYabVzDMs4E:EIjcZ7RupEI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/KageSenshi?a=WYabVzDMs4E:EIjcZ7RupEI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/KageSenshi?i=WYabVzDMs4E:EIjcZ7RupEI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/KageSenshi?a=WYabVzDMs4E:EIjcZ7RupEI:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/KageSenshi?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/KageSenshi?a=WYabVzDMs4E:EIjcZ7RupEI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/KageSenshi?i=WYabVzDMs4E:EIjcZ7RupEI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/KageSenshi/~4/WYabVzDMs4E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.kagesenshi.org/feeds/2522199574445001692/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=28371165&amp;postID=2522199574445001692" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28371165/posts/default/2522199574445001692?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28371165/posts/default/2522199574445001692?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/KageSenshi/~3/WYabVzDMs4E/list-as-default-value-in-class-init.html" title="list as default value in class __init__() - watchout for surprise" /><author><name>KageSenshi</name><uri>http://www.blogger.com/profile/00019993555432609309</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00088522125475112927" /></author><thr:total>4</thr:total><feedburner:origLink>http://blog.kagesenshi.org/2010/05/list-as-default-value-in-class-init.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D08EQ3c7fCp7ImA9WxFQE04.&quot;"><id>tag:blogger.com,1999:blog-28371165.post-6356385781542575121</id><published>2010-05-08T22:28:00.004+08:00</published><updated>2010-05-09T00:23:22.904+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-09T00:23:22.904+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Plone" /><category scheme="http://www.blogger.com/atom/ns#" term="Buildout" /><category scheme="http://www.blogger.com/atom/ns#" term="Tips" /><category scheme="http://www.blogger.com/atom/ns#" term="Fedora" /><category scheme="http://www.blogger.com/atom/ns#" term="Zope" /><category scheme="http://www.blogger.com/atom/ns#" term="repoze.bfg" /><category scheme="http://www.blogger.com/atom/ns#" term="Hacks" /><category scheme="http://www.blogger.com/atom/ns#" term="Python" /><title>Using deliverance as WSGI pipeline to elegantly theme a repoze.bfg project</title><content type="html">I was looking around for template inheritance solution for repoze.bfg, as it seems like by default, BFG does not have context view traversal support to acquire template macros. &lt;br /&gt;&lt;br /&gt;In Plone/Grok template inheritance can be done by registering main_template as a view, and using a template that fill the slots in main_template such as this:&lt;br /&gt;&lt;pre&gt;&amp;lt;html xmlns:tal="http://xml.zope.org/namespaces/tal"&lt;br /&gt;      xmlns:metal="http://xml.zope.org/namespaces/metal"&lt;br /&gt;      metal:use-macro="context/main_template/macros/master"&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&amp;lt/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;  &amp;lt;div metal:fill-slot="main"&amp;gt;&lt;br /&gt;     Some content&lt;br /&gt;  &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;However, by default, repoze.bfg does not support getting view macro from a context. So a PageTemplate object need to by passed by a view in order to use the macro from the template. Eg:&lt;br /&gt;&lt;pre&gt;from repoze.bfg.chameleon_zpt import get_template&lt;br /&gt;&lt;br /&gt;def my_view(context,request):&lt;br /&gt;    main_template = get_template('templates/main_template.pt')&lt;br /&gt;    return dict(main_template=main_template)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So the view would be using:&lt;br /&gt;&lt;pre&gt;&amp;lt;html xmlns:tal="http://xml.zope.org/namespaces/tal"&lt;br /&gt;      xmlns:metal="http://xml.zope.org/namespaces/metal"&lt;br /&gt;      metal:use-macro="main_template.macros['master']"&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Simple enough, but something came up my mind. "How about I theme this using Deliverance?"&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What is Deliverance?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In simple terms, its a theming proxy which also available as a WSGI middleware. It allow developers to theme different systems without the need to know the internal of the systems. &lt;a href="http://deliveranceproject.org/"&gt;More information here.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Setting up Deliverance in repoze.bfg buildout&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;So lets get to the fun stuff.&lt;br /&gt;&lt;br /&gt;I'm assuming that repoze.bfg is installed in a buildout, and a project called 'helloworld' is installed in the buildout, similar to the one I've shown in &lt;a href="http://blog.kagesenshi.org/2010/05/repozebfg-introduction-and.html"&gt;my previous post&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;First, add the egg:&lt;br /&gt;&lt;pre&gt;[buildout]&lt;br /&gt;...&lt;br /&gt;[repoze]&lt;br /&gt;...&lt;br /&gt;eggs = &lt;br /&gt;  ...&lt;br /&gt;  Deliverance&lt;br /&gt;...&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;and run &lt;code&gt;./bin/buildout -vvv&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Now, configure the Deliverance filter.&lt;br /&gt;&lt;br /&gt;Open &lt;code&gt;src/helloworld/helloworld.ini&lt;/code&gt; , rename &lt;code&gt;[app:main]&lt;/code&gt; to &lt;code&gt;[app:helloworld]&lt;/code&gt; and add these:&lt;br /&gt;&lt;pre&gt;[filter:deliverance]&lt;br /&gt;use = egg:Deliverance#main&lt;br /&gt;theme_uri = /static/layout.html&lt;br /&gt;rule_uri = /static/rules.xml&lt;br /&gt;&lt;br /&gt;[pipeline:main]&lt;br /&gt;pipeline = &lt;br /&gt;   deliverance&lt;br /&gt;   helloworld&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Afterward, create a layout.html and a rules.xml in &lt;code&gt;helloworld/templates/static&lt;/code&gt; with these contents:&lt;br /&gt;&lt;br /&gt;layout.html&lt;br /&gt;&lt;pre&gt;&amp;lt;html&amp;gt;&lt;br /&gt;  &amp;lt;head&amp;gt;&lt;br /&gt;  &amp;lt;title&amp;gt;The Theme&amp;lt;/title&amp;gt;&lt;br /&gt;  &amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;  &amp;lt;h1&amp;gt;A theme&amp;lt;/h1&amp;gt;&lt;br /&gt;  &amp;lt;div id="content"&amp;gt;&lt;br /&gt;  &amp;lt;/div&amp;gt;&lt;br /&gt;  &amp;lt;hr&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt; &lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;rules.xml&lt;br /&gt;&lt;pre&gt;&amp;lt;ruleset&amp;gt;&lt;br /&gt;  &amp;lt;rule&amp;gt;&lt;br /&gt;    &amp;lt;replace content="children:body" theme="children:#content" if-content="not:#content"/&amp;gt;&lt;br /&gt;    &amp;lt;replace content="children:#content" theme="children:#content"/&amp;gt;&lt;br /&gt;  &amp;lt;/rule&amp;gt;&lt;br /&gt;&amp;lt;/ruleset&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Documentation of the rules markup are here: &lt;a href="http://packages.python.org/Deliverance/configuration.html#rule"&gt;http://packages.python.org/Deliverance/configuration.html#rule&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now you're ready for profit :D&lt;br /&gt;&lt;br /&gt;Start the server using &lt;code&gt;./bin/paster serve src/helloworld/helloworld.ini&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Happy Hacking!&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;
&lt;br/&gt;
&lt;br/&gt;
- Izhar Firdaus -&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28371165-6356385781542575121?l=blog.kagesenshi.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/B1MMPR1Dagf_8BZoyiO_iCRqR3w/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/B1MMPR1Dagf_8BZoyiO_iCRqR3w/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/B1MMPR1Dagf_8BZoyiO_iCRqR3w/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/B1MMPR1Dagf_8BZoyiO_iCRqR3w/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/KageSenshi?a=9yCmGsimvTk:YD9MyCI-EQg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/KageSenshi?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/KageSenshi?a=9yCmGsimvTk:YD9MyCI-EQg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/KageSenshi?i=9yCmGsimvTk:YD9MyCI-EQg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/KageSenshi?a=9yCmGsimvTk:YD9MyCI-EQg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/KageSenshi?i=9yCmGsimvTk:YD9MyCI-EQg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/KageSenshi?a=9yCmGsimvTk:YD9MyCI-EQg:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/KageSenshi?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/KageSenshi?a=9yCmGsimvTk:YD9MyCI-EQg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/KageSenshi?i=9yCmGsimvTk:YD9MyCI-EQg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/KageSenshi/~4/9yCmGsimvTk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.kagesenshi.org/feeds/6356385781542575121/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=28371165&amp;postID=6356385781542575121" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28371165/posts/default/6356385781542575121?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28371165/posts/default/6356385781542575121?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/KageSenshi/~3/9yCmGsimvTk/using-deliverance-as-wsgi-pipeline-to.html" title="Using deliverance as WSGI pipeline to elegantly theme a repoze.bfg project" /><author><name>KageSenshi</name><uri>http://www.blogger.com/profile/00019993555432609309</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00088522125475112927" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.kagesenshi.org/2010/05/using-deliverance-as-wsgi-pipeline-to.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEcHQ34zfyp7ImA9WxFQEkQ.&quot;"><id>tag:blogger.com,1999:blog-28371165.post-106184388464637444</id><published>2010-05-08T01:10:00.009+08:00</published><updated>2010-05-08T13:20:32.087+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-08T13:20:32.087+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Buildout" /><category scheme="http://www.blogger.com/atom/ns#" term="Programming" /><category scheme="http://www.blogger.com/atom/ns#" term="Fedora" /><category scheme="http://www.blogger.com/atom/ns#" term="repoze.bfg" /><category scheme="http://www.blogger.com/atom/ns#" term="Framework" /><category scheme="http://www.blogger.com/atom/ns#" term="Guide" /><category scheme="http://www.blogger.com/atom/ns#" term="Python" /><category scheme="http://www.blogger.com/atom/ns#" term="HOWTO" /><title>repoze.bfg - Introduction and bootstrapping it on buildout</title><content type="html">2 months without a post here .. T_T ... must .. restart .. blogging ...&lt;br /&gt;&lt;br /&gt;Anyway, I've been poking around with &lt;a href="http://bfg.repoze.org"&gt;repoze.bfg&lt;/a&gt; since last week and growing to love it by the days. Been thinking to post a blog on getting started on it but was a bit lazy .. until I saw &lt;a href="http://blog.lowkster.com/2010/05/repoze-bfg.html"&gt;lowkster's post&lt;/a&gt; about bfg at &lt;a href="http://planet.foss.org.my"&gt;planet.foss.org.my&lt;/a&gt; a few days ago. &lt;br /&gt;&lt;br /&gt;Full documentation at &lt;a href="http://docs.repoze.org/bfg"&gt;http://docs.repoze.org/bfg&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;A little review&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I love &lt;a href="http://wiki.zope.org/zope3/ComponentArchitecture"&gt;Zope Component Architecture&lt;/a&gt; because the modularity/reusability it offers, but &lt;a href="http://bluebream.zope.org"&gt;Bluebream&lt;/a&gt;, &lt;a href="http://grok.zope.org"&gt;Grok&lt;/a&gt; and &lt;a href="http://zope2.zope.org"&gt;Zope2&lt;/a&gt; feels a bit big for simple web apps or for introducing ZCA to new people. Then I saw BFG.&lt;br /&gt;&lt;br /&gt;BFG simplifies many concepts which I'm familiar with in Zope2/Zope3, and it does it without overwhelming developers with other parts of the framework. Not endorsing any type of storage backend, and giving an option between URL routing and traversal or a mix of both is a plus.&lt;br /&gt;&lt;br /&gt;The initial base code is simple and straightforward, and there are no need to subclass any parent class when you want to create your initial project. &lt;br /&gt;&lt;br /&gt;The starter project is as simple as:&lt;br /&gt;&lt;br /&gt;models.py:&lt;br /&gt;&lt;pre&gt;class MyModel(object):&lt;br /&gt;    pass&lt;br /&gt;&lt;br /&gt;root = MyModel()&lt;br /&gt;&lt;br /&gt;def get_root(request):&lt;br /&gt;    return root&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;views.py:&lt;br /&gt;&lt;pre&gt;def my_view(request):&lt;br /&gt;    return {'project':'helloworld'}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A registration of the view in configure.zcml:&lt;br /&gt;&lt;pre&gt;  &amp;lt;view&lt;br /&gt;     context=".models.MyModel"&lt;br /&gt;     view=".views.my_view"&lt;br /&gt;     renderer="templates/mytemplate.pt"&lt;br /&gt;     /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And its template file which uses &lt;a href="http://wiki.zope.org/ZPT/TAL"&gt;TAL&lt;/a&gt; compatible markup.&lt;br /&gt;&lt;br /&gt;As the initial requirement is simple, and theres close to no enforcement on how developers supposed to write something on it, it made it easy for new people to quickly learn it and start being productive. BFG too, being something that uses many Zope concepts, can utilize many existing Zope/Z3C components out there, and if a developer know how to utilize ZCA well, what developed on a BFG project may also be componentized and reused in other frameworks.&lt;br /&gt;&lt;br /&gt;What to know more on whats cool with BFG? .. read their &lt;a href="http://bfg.repoze.org/trac/wiki/SalesPitch"&gt;Sales Pitch&lt;/a&gt; ;)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Installation on Buildout&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Depending on your distribution, BFG might be available in your distro repository (Fedora have it). However, being a Zope/Plone developer as my main job, whenever it comes to installing python applications from pypi, I tend to prefer to use &lt;a href="http://www.buildout.org/"&gt;buildout&lt;/a&gt; to create a self-contained environment. So I'll use buildout here too.&lt;br /&gt;&lt;br /&gt;First, if you don't have zc.buildout yet, install it using:&lt;br /&gt;&lt;pre&gt;$ easy_install zc.buildout&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now lets create the contained environment&lt;br /&gt;&lt;pre&gt;$ mkdir -p ~/repozebuildout/src&lt;br /&gt;$ cd ~/repozebuildout&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Then create a buildout.cfg file in the directory with this config:&lt;br /&gt;&lt;pre&gt;[buildout]&lt;br /&gt;parts = &lt;br /&gt;    repoze&lt;br /&gt;develop =&lt;br /&gt;    src/*&lt;br /&gt;versions = versions&lt;br /&gt;&lt;br /&gt;[repoze]&lt;br /&gt;recipe = zc.recipe.egg&lt;br /&gt;eggs = &lt;br /&gt;   repoze.bfg&lt;br /&gt;interpreter = python&lt;br /&gt;entry-points = paster=paste.script.command:run&lt;br /&gt;&lt;br /&gt;[versions]&lt;br /&gt;repoze.bfg = 1.2.1&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;What the buildout config will do is, it will create a buildout with repoze.bfg framework and its dependencies installed, with an interpreter script configured for the buildout environment, and a paster script.&lt;br /&gt;&lt;br /&gt;Now initialize the buildout&lt;br /&gt;&lt;pre&gt;$ buildout init&lt;br /&gt;$ ./bin/buildout -vv&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;After the buildout initialization is done, you may start creating the project skeleton.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Creating your first project&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;There are several templates to choose from: bfg_starter, bfg_routesalchemy, bfg_alchemy, and bfg_zodb.&lt;br /&gt;&lt;br /&gt;bfg_starter template simply give a very basic bfg skeleton to get started. Those who are familiar with Pylons/Django might want to look at bfg_routesalchemy and those who are familiar with Zope might want to look at bfg_alchemy and bfg_zodb.&lt;br /&gt;&lt;br /&gt;For this example, i'll just create a simple project using bfg_starter template.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;cd src/&lt;br /&gt;../bin/paster create -t bfg_starter helloworld&lt;br /&gt;cd ..&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;then , edit buildout.cfg and add helloworld into the eggs section:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;[buildout]&lt;br /&gt;...&lt;br /&gt;[repoze]&lt;br /&gt;...&lt;br /&gt;eggs = &lt;br /&gt;   ...&lt;br /&gt;   helloworld&lt;br /&gt;...&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;afterward, rerun buildout&lt;br /&gt;&lt;pre&gt;./bin/buildout -vvv&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Once that is done, you may start the server using:&lt;br /&gt;&lt;pre&gt;./bin/paster serve src/helloworld/helloworld.ini&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now you can start developing on BFG!. Read &lt;a href="http://docs.repoze.org/bfg/1.2/"&gt;the documentation&lt;/a&gt; to get you started in developing on BFG.&lt;br /&gt;&lt;br /&gt;Happy hacking :D&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;
&lt;br/&gt;
&lt;br/&gt;
- Izhar Firdaus -&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28371165-106184388464637444?l=blog.kagesenshi.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/fqtW9WU9bkXa9CV28LIjMrDPHmk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fqtW9WU9bkXa9CV28LIjMrDPHmk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/fqtW9WU9bkXa9CV28LIjMrDPHmk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fqtW9WU9bkXa9CV28LIjMrDPHmk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/KageSenshi?a=GlcMlMXJriQ:CMVtvKCo3aw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/KageSenshi?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/KageSenshi?a=GlcMlMXJriQ:CMVtvKCo3aw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/KageSenshi?i=GlcMlMXJriQ:CMVtvKCo3aw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/KageSenshi?a=GlcMlMXJriQ:CMVtvKCo3aw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/KageSenshi?i=GlcMlMXJriQ:CMVtvKCo3aw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/KageSenshi?a=GlcMlMXJriQ:CMVtvKCo3aw:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/KageSenshi?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/KageSenshi?a=GlcMlMXJriQ:CMVtvKCo3aw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/KageSenshi?i=GlcMlMXJriQ:CMVtvKCo3aw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/KageSenshi/~4/GlcMlMXJriQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.kagesenshi.org/feeds/106184388464637444/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=28371165&amp;postID=106184388464637444" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28371165/posts/default/106184388464637444?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28371165/posts/default/106184388464637444?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/KageSenshi/~3/GlcMlMXJriQ/repozebfg-introduction-and.html" title="repoze.bfg - Introduction and bootstrapping it on buildout" /><author><name>KageSenshi</name><uri>http://www.blogger.com/profile/00019993555432609309</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00088522125475112927" /></author><thr:total>4</thr:total><feedburner:origLink>http://blog.kagesenshi.org/2010/05/repozebfg-introduction-and.html</feedburner:origLink></entry></feed>
