<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DkIHQ3o4cSp7ImA9WhBbGUQ.&quot;"><id>tag:blogger.com,1999:blog-8550962</id><updated>2013-05-19T13:15:32.439-07:00</updated><category term="pydev" /><category term="google app engine" /><category term="templates" /><category term="update site" /><category term="pydev 1.2.7 eclipse debugger pylint" /><category term="1.4.4" /><category term="python 2.6" /><category term="unittest" /><category term="debugger" /><category term="Pydev 1.2.6 eclipse release refactoring" /><category term="iron python" /><category term="Pydev 1.5.2" /><category term="import" /><category term="pydev 1.4.6" /><category term="pydev 1.5.7" /><category term="preferences" /><category term="pydev 1.4.3" /><category term="export" /><category term="extended vs presentation" /><category term="appcelerator" /><category term="Pydev 1.5.5" /><category term="pydev debugger psyco" /><category term="python 3.0" /><category term="tvtk" /><category term="pydev 1.3.14 release" /><category term="TDD" /><category term="jython scripting" /><category term="per-project interpreters" /><category term="winmerge" /><category term="code coverage" /><category term="git" /><category term="PyCon" /><category term="reindex" /><category term="environment variables" /><category term="pydev 1.4" /><category term="pydev homepage" /><category term="performance" /><category term="PyQt4 crashing on pydev" /><category term="eclipse" /><category term="virtualenv" /><category term="usability" /><category term="pydev 1.4.7" /><category term="debug eclipse" /><category term="run as unit-test" /><category term="mirrors" /><category term="pydev 1.4.1" /><category term="Pydev Extensions open sourced" /><category term="eclipse 3.3" /><category term="code formatter" /><category term="nightly build" /><category term="IPython" /><category term="large files performance" /><category term="live coding" /><category term="refactoring" /><category term="pydev 2.0" /><category term="pyunit" /><category term="Pydev 1.5.0" /><category term="error handling" /><category term="pydev 1.4.5" /><category term="pydev 1.3.18 spaces in install" /><category term="pydev 1.6.4" /><category term="pydev 1.4.8" /><category term="mercurial pydev distributed scm" /><category term="memory" /><category term="django" /><category term="python 2toAny" /><category term="ast rewriter" /><category term="analyze open editors" /><category term="Pydev 1.5.3" /><category term="jump" /><category term="pydev extensions zope remote debugging" /><category term="dark theme" /><category term="django templates" /><category term="testers" /><category term="pydev 1.3.4" /><category term="eclipse skin" /><category term="twitter" /><category term="eclipse awards" /><category term="python 3k" /><category term="pydev jdt eclipse platform dependency" /><category term="pydev bug builtins release 1.3.6" /><category term="pydev interactive console" /><category term="forced builtins" /><category term="release" /><category term="pydev 1.3.22" /><category term="pydev 1.4.2" /><category term="debugger pydev 1.3.3" /><category term="aptana" /><category term="pydev nightly build" /><category term="subversion" /><category term="python 2to3" /><category term="pydev 1.6.5" /><title>PyDev adventures</title><subtitle type="html">Posting about venturing (and creating) PyDev.&lt;br&gt;
&lt;p&gt;&lt;strong&gt;LINKS:    &lt;a href="http://pydev.org"&gt;PyDev.org&lt;/a&gt;       &lt;a href="http://pydev.blogspot.com/atom.xml"&gt;Blog RSS&lt;/a&gt;       &lt;a href="http://twitter.com/statuses/user_timeline/57455092.rss"&gt;Twitter RSS&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://pydev.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://pydev.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Fabio Zadrozny</name><uri>http://www.blogger.com/profile/04202246218394712738</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>245</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/blogspot/pydev" /><feedburner:info uri="blogspot/pydev" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;CEIDRX08cCp7ImA9WhBbFUs.&quot;"><id>tag:blogger.com,1999:blog-8550962.post-7164160283654248628</id><published>2013-05-14T13:16:00.000-07:00</published><updated>2013-05-14T13:16:14.378-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-14T13:16:14.378-07:00</app:edited><title>PyDev crowdfunding finished</title><content type="html">Ok, the PyDev crowdfunding has just finished -- and it reached its basic goal :).&lt;br /&gt;
&lt;br /&gt;
The funding was divided in a series of perks, 610 people contributed and the final distribution for them (monetary-wise) was:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Altruist: &lt;b&gt;1.5%&lt;/b&gt; (Thank you)&lt;/li&gt;
&lt;li&gt;Early adopter: &lt;b&gt;17.95%&lt;/b&gt; (LiClipse regular license -- no access to betas)&lt;/li&gt;
&lt;li&gt;Believer: &lt;b&gt;11.92%&lt;/b&gt; (LiClipse regular license -- access to tracker and betas)&lt;/li&gt;
&lt;li&gt;PyDev Knight: &lt;b&gt;23.48%&lt;/b&gt; (Get a vote in the PyDev tracker and contribute only to PyDev itself)&lt;/li&gt;
&lt;li&gt;Oracle: &lt;b&gt;22.61%&lt;/b&gt; (LiClipse perpetual license)&lt;/li&gt;
&lt;li&gt;Bronze Sponsor: &lt;b&gt;2.86%&lt;/b&gt; (10 regular licenses)&lt;/li&gt;
&lt;li&gt;Silver Sponsor: &lt;b&gt;19.68% &lt;/b&gt;(10 perpetual licenses)&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
I must say that the funding changed quite a bit. Initially there was no PyDev Knight perk (which is a perk targeted only towards PyDev, whereas the others are targeted at PyDev and LiClipse). So, this was the result of listening to feedback and adjusting the campaign (also, initially I didn't put enough details on PyDev and added to much emphasis on LiClipse -- which is something adjusted during the campaign).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
There is also one thing I failed to check properly before : Paypal fees are not the same everywhere. Here in Brazil it's 7.4% + 0.3US$ (whereas in US it's 2.9%+0.3US$). So, in the end, 12% &amp;nbsp;went to Paypal/Indiegogo, whereas I was planning something around 8% (and there are still taxes to pay, but this is something to be expected anyways, so, in the end the net result for me will be something as 73% -- but just because I have a company setup for that, had I done it as a person it'd be around 63% here in Brazil -- I just hope the government does use it's share properly -- grin).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I still think it was worth as a way for a one time funding as everything is already setup and to know if there's interest before starting it -- which I think is the main point of a crowdfunding campaign: discover if something is viable before delving into it (not that failing on a crowdfunding is always a sure sign that something won't work, but in this specific case, with a product that is already mature, and with an existing community, I think it's how I'd see it).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Also, during that process I've set up a new tracker at&amp;nbsp;&lt;a href="https://sw-brainwy.rhcloud.com/"&gt;https://sw-brainwy.rhcloud.com&lt;/a&gt;&amp;nbsp;for both PyDev and LiClipse. It's a tracker I had done for fun some time ago (and yes, I know it's one of the seven sins of a programmer), but as I'd have to customize any solution for what I want, I think it's nice. The idea is that anyone will be able to create tickets and comment on those, but for voting which tickets will be done next you'll have to become a PyDev Knight (I still haven't sent the access for existing PyDev Knights to vote, but I'll do it during the upcoming month -- as you can see, I still have some things to set up).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
A note on the tracker: it's hosted on RedHat's OpenShift, and it's called Brainwy because that's the company I created to keep PyDev going :)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Mainly it's a Javascript-based tracker where it's easy to see the whole picture and move things around. If you're curious, you can use an offline version at&amp;nbsp;&lt;a href="https://sw-brainwy.rhcloud.com/demo/"&gt;https://sw-brainwy.rhcloud.com/demo/&lt;/a&gt;, because as a user in the PyDev/LiClipse trackers you won't really be able to move things around, just add ticket, comment on existing ones and vote (once you have a vote) -- you can use it as much as you want, but note that I don't plan on adding support to it or actually distributing it differently -- I've already enough supporting PyDev and LiClipse :)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
All in all, it was definitely a good outcome and it was nice having so much support from so many people!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Thank you everyone!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Fabio&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/blogspot/pydev/~4/50A3RBcRApM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pydev.blogspot.com/feeds/7164160283654248628/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8550962&amp;postID=7164160283654248628" title="8 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/7164160283654248628?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/7164160283654248628?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/pydev/~3/50A3RBcRApM/pydev-crowdfunding-finished.html" title="PyDev crowdfunding finished" /><author><name>Fabio Zadrozny</name><uri>http://www.blogger.com/profile/04202246218394712738</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>8</thr:total><feedburner:origLink>http://pydev.blogspot.com/2013/05/pydev-crowdfunding-finished.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0ANSHg-fSp7ImA9WhBUE04.&quot;"><id>tag:blogger.com,1999:blog-8550962.post-2289561547403511314</id><published>2013-04-30T08:29:00.001-07:00</published><updated>2013-04-30T08:29:59.655-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-04-30T08:29:59.655-07:00</app:edited><title>PyDev crowdfunding basic funding reached!</title><content type="html">The initial target of the crowdfunding for PyDev has been reached. Thank you everyone who helped in reaching that target!&lt;br /&gt;
&lt;br /&gt;
Now, please don't stop sharing and helping it get to the higher proposal levels (having more there will enable more things to be done).&lt;br /&gt;
&lt;br /&gt;
Also, I've had some people ask me privately on how things will proceed afterwards... well, with this funding, I'll be able to work in PyDev for the upcoming year, so, during that time I'll create a structure so that people that like it can keep supporting it so that it can move forward year after year.&lt;br /&gt;
&lt;br /&gt;
Also, I hope LiClipse itself turns out to be successful, as the idea is that earnings in LiClipse will also help in getting PyDev going on -- if things turn out pretty well, I'll probably be able to get more people to help there too :)&lt;img src="http://feeds.feedburner.com/~r/blogspot/pydev/~4/UUGgfGyG8VI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pydev.blogspot.com/feeds/2289561547403511314/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8550962&amp;postID=2289561547403511314" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/2289561547403511314?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/2289561547403511314?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/pydev/~3/UUGgfGyG8VI/pydev-crowdfunding-basic-funding-reached.html" title="PyDev crowdfunding basic funding reached!" /><author><name>Fabio Zadrozny</name><uri>http://www.blogger.com/profile/04202246218394712738</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total><feedburner:origLink>http://pydev.blogspot.com/2013/04/pydev-crowdfunding-basic-funding-reached.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcCQXgzeSp7ImA9WhBVEUw.&quot;"><id>tag:blogger.com,1999:blog-8550962.post-7968508179744429809</id><published>2013-04-16T04:34:00.000-07:00</published><updated>2013-04-16T04:34:20.681-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-04-16T04:34:20.681-07:00</app:edited><title>PyDev crowdfunding / LiClipse initially supported languages</title><content type="html">&lt;br /&gt;
Right now (30+ days elapsed on the funding), things are looking good, the PyDev/LiClipse funding already got to 70% of its target (with 354 supporters). Thank you everyone! Please keep sharing about it ;) (&lt;a href="http://igg.me/at/liclipse"&gt;http://igg.me/at/liclipse&lt;/a&gt;)&lt;br /&gt;
&lt;br /&gt;
On the PyDev side, the new tracker is still not up, but I'm working on it (so, please buffer your requests until the tracker is up... I'll provide proper links once that's done).&lt;br /&gt;
&lt;br /&gt;
Regarding the initial languages to be supported in LiClipse, I'm sharing below the results of the poll so far (note: only languages with more than 15 answers are shown).&lt;br /&gt;
&lt;br /&gt;
python 152&lt;br /&gt;
javascript 106&lt;br /&gt;
html 98&lt;br /&gt;
css 93&lt;br /&gt;
django templates 70&lt;br /&gt;
cython 53&lt;br /&gt;
c++ 47&lt;br /&gt;
c 39&lt;br /&gt;
jinja2 37&lt;br /&gt;
java 33&lt;br /&gt;
coffescript 27&lt;br /&gt;
&lt;br /&gt;
On the total there were 50 languages voted. There was one I didn't even know about (the Ren'Py language&amp;nbsp;&lt;a href="http://www.renpy.org/"&gt;http://www.renpy.org/&lt;/a&gt;&amp;nbsp;).&lt;br /&gt;
&lt;br /&gt;
I'll still leave the poll there until the end of the funding (&lt;a href="https://docs.google.com/forms/d/1pzoaG_Nz1b17kMupIjGo75nV4tAIQpiCDldX5taxX8U/viewform"&gt;vote on poll&lt;/a&gt;) to decide on the initial supported languages, but note that even if a language is not initially there, I'll put up proper docs and provide support so that anyone should be able to easily add a language there ;)&lt;br /&gt;
&lt;img src="http://feeds.feedburner.com/~r/blogspot/pydev/~4/VBd1agNz2sk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pydev.blogspot.com/feeds/7968508179744429809/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8550962&amp;postID=7968508179744429809" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/7968508179744429809?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/7968508179744429809?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/pydev/~3/VBd1agNz2sk/pydev-crowdfunding-liclipse-initially.html" title="PyDev crowdfunding / LiClipse initially supported languages" /><author><name>Fabio Zadrozny</name><uri>http://www.blogger.com/profile/04202246218394712738</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>3</thr:total><feedburner:origLink>http://pydev.blogspot.com/2013/04/pydev-crowdfunding-liclipse-initially.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkMESXs7fSp7ImA9WhBWEUw.&quot;"><id>tag:blogger.com,1999:blog-8550962.post-212489381102811545</id><published>2013-04-04T14:20:00.000-07:00</published><updated>2013-04-04T14:20:08.505-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-04-04T14:20:08.505-07:00</app:edited><title>PyDev / LiClipse funding (and initially supported languages)</title><content type="html">Ok, 20 days on the crowdfunding elapsed and the funding is already at 57% (with 258 funders)! So, the funding is going pretty well so far. Thank you everyone!&lt;br /&gt;
&lt;br /&gt;
Also, I'd like to give special thanks for the current Silver sponsors (&lt;a href="http://holdenweb.com/"&gt;http://holdenweb.com&lt;/a&gt;&amp;nbsp;-&amp;nbsp;&lt;a href="http://kichwacoders.com/"&gt;http://kichwacoders.com&lt;/a&gt;) and the Bronze sponsor (&lt;a href="http://wobe-systems.com/"&gt;http://wobe-systems.com&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;
Still seeking Gold and Platinum sponsors though... so, if there's a company that is a heavy user of PyDev -- or maybe the future LiClipse -- and would like some space in the PyDev / LiClipse homepage...&lt;br /&gt;
&lt;br /&gt;
Also, I've put up a poll on google docs to help in deciding which will be the languages supported initially in LiClipse. You can vote at:&amp;nbsp;&lt;a href="https://docs.google.com/forms/d/1pzoaG_Nz1b17kMupIjGo75nV4tAIQpiCDldX5taxX8U/viewform"&gt;LiClipse Languages Poll&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Note that I still have not put up a new tracker for PyDev itself (but I'm working on that).&lt;img src="http://feeds.feedburner.com/~r/blogspot/pydev/~4/xS3WN5JYop8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pydev.blogspot.com/feeds/212489381102811545/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8550962&amp;postID=212489381102811545" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/212489381102811545?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/212489381102811545?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/pydev/~3/xS3WN5JYop8/pydev-liclipse-funding-and-initially.html" title="PyDev / LiClipse funding (and initially supported languages)" /><author><name>Fabio Zadrozny</name><uri>http://www.blogger.com/profile/04202246218394712738</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>6</thr:total><feedburner:origLink>http://pydev.blogspot.com/2013/04/pydev-liclipse-funding-and-initially.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQMSHo9fCp7ImA9WhBXEk8.&quot;"><id>tag:blogger.com,1999:blog-8550962.post-4695701700800576701</id><published>2013-03-25T09:19:00.002-07:00</published><updated>2013-03-25T09:19:49.464-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-25T09:19:49.464-07:00</app:edited><title>Crowdfunding PyDev / LiClipse status</title><content type="html">So far, the experience on the crowdfunding has been really positive. In 10 days of funding, there are already 168 funders and 41% of the basic funding goals have been reached!&lt;br /&gt;
&lt;br /&gt;
Also, it was nice to gather feedback and talk to many PyDev users out there.&lt;br /&gt;
&lt;br /&gt;
Regarding PyDev, reactions were pretty positive, but regarding LiClipse, they were initially a bit mixed.&lt;br /&gt;
&lt;br /&gt;
On the dark theme, it was either a love or hate reaction, but just to note, although that's one of the major points of LiClipse, it will definitely not force you to use a dark theme -- it'll be an opt in, not opt out -- and I &amp;nbsp;expect that part to be the easy / fast part in the proposal :)&lt;br /&gt;
&lt;br /&gt;
As for the languages support, initially it was a bit more neutral (with some ups and downs), and I think initially I did a bad job on explaining why I think that was needed, so, I've updated&amp;nbsp;&lt;a href="http://igg.me/at/liclipse"&gt;http://igg.me/at/liclipse&lt;/a&gt; to explain the 'why' part too :)&lt;br /&gt;
&lt;br /&gt;
Note that as a result of talking to PyDev users, I did change the funding a bit too: there's now a special perk (named PyDev Knight) which empowers users who enjoy PyDev and only really care about a better Python support and not a dark theme or other languages (even if related to Python, such as Django Templates, Mako, etc).&lt;br /&gt;
&lt;br /&gt;
So, I can only thank everyone so far for contributing and spreading the word on the funding!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/pydev/~4/CeEoalIyLfY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pydev.blogspot.com/feeds/4695701700800576701/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8550962&amp;postID=4695701700800576701" title="9 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/4695701700800576701?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/4695701700800576701?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/pydev/~3/CeEoalIyLfY/crowdfunding-pydev-liclipse-status.html" title="Crowdfunding PyDev / LiClipse status" /><author><name>Fabio Zadrozny</name><uri>http://www.blogger.com/profile/04202246218394712738</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>9</thr:total><feedburner:origLink>http://pydev.blogspot.com/2013/03/crowdfunding-pydev-liclipse-status.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEINR3s7cCp7ImA9WhBXGE8.&quot;"><id>tag:blogger.com,1999:blog-8550962.post-2756453559605150789</id><published>2013-03-16T04:35:00.005-07:00</published><updated>2013-04-01T06:23:16.508-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-04-01T06:23:16.508-07:00</app:edited><title>PyDev funding and LiClipse?</title><content type="html">I got some feedback related to the creation of LiClipse and its relation with PyDev in the current crowdfunding proposal (&lt;a href="http://igg.me/at/liclipse/"&gt;http://igg.me/at/liclipse/&lt;/a&gt;), so, I'd like to explain how I believe things fit together.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
1. So, is LiClipse a fork of Eclipse?&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Definitely not. The idea behind LiClipse is having 2 things:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;A way to theme Eclipse itself better and have some other UI improvements (I'm truly annoyed by not having what I'd consider a professional dark theme in Eclipse right now, so, I'd like to take those matters in my own hands).&lt;/li&gt;
&lt;li&gt;An editor which should be able to support lots of languages out of the box. Think something closer to other all-purpose editors -- as opposed to IDEs -- such as Notepad++, Vi, TextMate, Sublime, etc. i.e.: the idea is supporting lots of languages out of the box, so, the idea is having it resembling formats such as ultraedit wordfiles or TextMate language files.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
To be clear, the idea is not to replace the more advanced editors inside Eclipse for each language, but to provide a lightweight way to deal with any language -- usually you work with 1 or 2 main languages, for which you'll have the plugins you need, but sometimes, when you just want to open a file in a language &amp;nbsp;you work seldomly and may not need/want to install a bulkier plugin, LiClipse would be a good addition to your toolbox (LiClipse is a short for "Lightweight Eclipse" BTW), and for me, not having this is a major shortcoming of Eclipse itself (and it may be an alternative for people who want less features and more speed).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Also, that should be doable without having to create a fork of Eclipse (although some theming issues may need to be resolved at Eclipse itself -- but on those parts, things should be fixed at that level, not on LiClipse).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
2. How does that relate to PyDev?&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Well, PyDev is very tightly bound to the environment it works on (Eclipse), and I'd like to solve some of the issues I see in it to improve its ecosystem as a whole, which IMHO is something I see needed for PyDev and Eclipse itself to keep moving forward.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
3. But won't that divert too many resources out of PyDev itself?&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
For this proposal, my plan is spending my time 50/50 (I don't think LiClipse is a major undertaking -- all the pieces are out there, it's mostly a matter of stitching them together), although during that time, yes, it'll divert some resources from PyDev, but as I think that having it is very important for PyDev itself (as well as other language), I see the issues being tackled as very serious shortcomings of Eclipse which hinder the adoption of Eclipse itself (thus affecting PyDev directly).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
4. I still think LiClipse is not a good idea and would like to support only PyDev.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Please e-mail me with those thoughts. I really believe LiClipse is needed for PyDev to keep getting traction, but if you feel that's not the case, please, please share your thoughts with me.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Also, just to make things clear, if the funding at&amp;nbsp;&lt;a href="http://igg.me/at/liclipse/"&gt;http://igg.me/at/liclipse/&lt;/a&gt;&amp;nbsp;does not succeed, I won't really be able to support PyDev itself anymore (personally, I really want it to succeed, but I see the funding as the community speaking, so, if after 10 years working on it the PyDev community doesn't see it as a worthy goal or doesn't trust me enough to support me on LiClipse while properly maintaining PyDev, well, I really need to hear it and move on -- as a note, until now, I see the funding as a huge success, getting to 10% in the first day, so, if everyone keeps helping a bit there, it'll be awesome :)&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/blogspot/pydev/~4/9WTd7IC-wCw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pydev.blogspot.com/feeds/2756453559605150789/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8550962&amp;postID=2756453559605150789" title="14 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/2756453559605150789?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/2756453559605150789?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/pydev/~3/9WTd7IC-wCw/pydev-funding-and-liclipse.html" title="PyDev funding and LiClipse?" /><author><name>Fabio Zadrozny</name><uri>http://www.blogger.com/profile/04202246218394712738</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>14</thr:total><feedburner:origLink>http://pydev.blogspot.com/2013/03/pydev-funding-and-liclipse.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE4ERn4zcCp7ImA9WhBQEko.&quot;"><id>tag:blogger.com,1999:blog-8550962.post-5570650026965758606</id><published>2013-03-14T09:01:00.002-07:00</published><updated>2013-03-14T09:01:47.088-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-14T09:01:47.088-07:00</app:edited><title>Keeping PyDev alive through crowdfunding</title><content type="html">Ok, I just started a crowdfunding project (at&amp;nbsp;&lt;a href="http://www.indiegogo.com/projects/pydev-and-liclipse-for-a-fast-sexy-and-dark-eclipse/x/2600856"&gt;www.indiegogo.com&lt;/a&gt;) for the continued development of PyDev (and improvements on Eclipse overall).&lt;br /&gt;
&lt;br /&gt;
In this post, I hope to shed some light on why this funding is needed.&lt;br /&gt;
&lt;br /&gt;
First, a little bit of history just to give some context: I've been developing PyDev for more than 10 years already (wow, I just realized that as I started the campaign) and it's definitely a pretty successful project (if it's not the most used Python IDE, it's definitely among the top ones).&lt;br /&gt;
&lt;br /&gt;
So, backtrack a few years...&lt;br /&gt;
&lt;br /&gt;
PyDev started doing success and I created a commercial extension to enable me to work more time on PyDev itself. After some time, Aptana acquired it and I joined them. Unfortunately, Aptana itself didn't turn out very well: it focused on its main product (the IDE) without generating any revenue from it, while trying to make side projects worthy enough to cover for everything (but those side projects weren't successful enough for that).&lt;br /&gt;
&lt;br /&gt;
Enter Appcelerator: it acquired Aptana out of the need to provide a deeper integration for its main product (which is Titanium). So, for some time, it did back up the PyDev development (along with the other languages), but in the end, their main product is Titanium and the tools around it, so, PyDev itself wasn't seen as relevant enough to be kept supported (to be clear, they're still hosting the homepage and downloads, but not backing the development itself). As such, in the end of the last year they stopped supporting its development.&lt;br /&gt;
&lt;br /&gt;
So, that's where the project is at now: it's (IMHO) a pretty successful, but unable to generate revenue for its continued support. Given this scenario I decided to create a crowdfunding project to ask for the community to provide resources to make that happen.&lt;br /&gt;
&lt;br /&gt;
In the funding, I expanded its reach a bit, on what I think are the main issues with the PyDev environment right now. So, the idea is focusing on a nicer dark UI, usability, speed and memory and providing a way to easily have other editors out of the box in a lightweight implementation (Python is pretty strong in the web, so, one of the weak points right now is actually not the Python editing itself, but related web languages, such as CoffeScript and JavaScript).&lt;br /&gt;
&lt;br /&gt;
So, please help in funding (and sharing) at&amp;nbsp;&lt;a href="http://igg.me/at/liclipse/"&gt;http://igg.me/at/liclipse&lt;/a&gt;&amp;nbsp;to keep PyDev going strong!&lt;img src="http://feeds.feedburner.com/~r/blogspot/pydev/~4/3XxEo8Cyoos" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pydev.blogspot.com/feeds/5570650026965758606/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8550962&amp;postID=5570650026965758606" title="19 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/5570650026965758606?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/5570650026965758606?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/pydev/~3/3XxEo8Cyoos/keeping-pydev-alive-through-crowdfunding.html" title="Keeping PyDev alive through crowdfunding" /><author><name>Fabio Zadrozny</name><uri>http://www.blogger.com/profile/04202246218394712738</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>19</thr:total><feedburner:origLink>http://pydev.blogspot.com/2013/03/keeping-pydev-alive-through-crowdfunding.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEIBRXs_fip7ImA9WhNbFE4.&quot;"><id>tag:blogger.com,1999:blog-8550962.post-9154267984555970372</id><published>2013-01-17T07:29:00.000-08:00</published><updated>2013-01-17T07:29:14.546-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-17T07:29:14.546-08:00</app:edited><title>Interrupting a Python thread with signals</title><content type="html">First off, in Python, as appears to be common knowledge, signals can only be received by the main thread, and usually you need to do synchronization work with Queues or something else to work with other threads, so, what I'll describe below is a different approach to the problem which in effect will give you a way of interrupting a thread in Python from anywhere.&lt;br /&gt;
&lt;br /&gt;
First off, I'll show the code and explain it afterwards:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt;import time
import sys
import threading

class SigFinish(Exception):
    pass

def throw_signal_function(frame, event, arg):
    raise SigFinish()

def do_nothing_trace_function(frame, event, arg):
    # Note: each function called will actually call this function
    # so, take care, your program will run slower because of that.
    return None

def interrupt_thread(thread):
    for thread_id, frame in sys._current_frames().items():
        if thread_id == thread.ident:  # Note: Python 2.6 onwards
            set_trace_for_frame_and_parents(frame, throw_signal_function)

def set_trace_for_frame_and_parents(frame, trace_func):
    # Note: this only really works if there's a tracing function set in this
    # thread (i.e.: sys.settrace or threading.settrace must have set the
    # function before)
    while frame:
        if frame.f_trace is None:
            frame.f_trace = trace_func
        frame = frame.f_back
    del frame


class MyThread(threading.Thread):

    def run(self):
        # Note: this is important: we have to set the tracing function
        # when the thread is started (we could set threading.settrace
        # before starting this thread to do this externally)
        sys.settrace(do_nothing_trace_function)
        try:
            while True:
                time.sleep(.1)
        except SigFinish:
            sys.stderr.write('Finishing thread cleanly\n')


thread = MyThread()
thread.start()
time.sleep(.5)  # Wait a bit just to see it looping.

interrupt_thread(thread)
sys.stderr.write('Joining\n')
thread.join()  # Joining here: if we didn't interrupt the thread before, we'd be here forever.
sys.stderr.write('Finished\n')
&lt;/code&gt;
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
So, there you have it: a hacky approach which will prevent your code from being properly debugged :)&lt;br /&gt;
&lt;br /&gt;
-- note that sys.settrace could be changed for sys.setprofile to achieve the same result -- in which case your program could be debugged but not profiled (which may be a better approach but will make the signal be raised only on function calls, not on line calls).&lt;br /&gt;
&lt;br /&gt;
To sum it up, we use the tracing mechanisms that's intended for debuggers (or profilers) to actually throw the signal for us. This means that we have to enable the tracing on that thread (which will make that thread to execute a bit slower) and set the tracer function to a function which will actually throw the signal.&lt;br /&gt;
&lt;br /&gt;
IMO, it works in a hackish (but nice) way... not sure if I'd use that in a production environment, but, there you have it: interruptible threads in Python (yes, you still have the limitation of the GIL: a thread won't be interrupted while calling some atomic operation that doesn't release the GIL)... Now, if only there was a Python signal library better integrated with the Python interpreter so that it checked for signals itself (probably in a way close to the tracing function itself with less overhead as only a single additional check for a null variable would be needed -- and otherwise a signal would be thrown), this hack wouldn't be needed in the first place -- but I'll leave that to someone else reading this :)&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/blogspot/pydev/~4/EtHxAmryqhc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pydev.blogspot.com/feeds/9154267984555970372/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8550962&amp;postID=9154267984555970372" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/9154267984555970372?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/9154267984555970372?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/pydev/~3/EtHxAmryqhc/interrupting-python-thread-with-signals.html" title="Interrupting a Python thread with signals" /><author><name>Fabio Zadrozny</name><uri>http://www.blogger.com/profile/04202246218394712738</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>3</thr:total><feedburner:origLink>http://pydev.blogspot.com/2013/01/interrupting-python-thread-with-signals.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMFRX44cSp7ImA9WhNUFUs.&quot;"><id>tag:blogger.com,1999:blog-8550962.post-236502220488761114</id><published>2013-01-07T05:46:00.001-08:00</published><updated>2013-01-07T05:46:54.039-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-07T05:46:54.039-08:00</app:edited><title>Python to Javascript translation</title><content type="html">I'm currently doing a project with a backend in Python and a client mostly in Javascript -- still not public, but if everything turns out right I'll post about it later on -- and there are some algorithms I'd like to reuse in both, but without going to a full Python in browser style (such as &lt;a href="http://pyjs.org/"&gt;Pyjs&lt;/a&gt; or &lt;a href="http://www.brython.info/index_en.html"&gt;brython&lt;/a&gt;)... Ideally I'd like something like &lt;a href="http://coffeescript.org/"&gt;Coffescript &lt;/a&gt;(but with a Python-like syntax so that a subset of Python can be used for both Python and Javascript generation).&lt;br /&gt;
&lt;br /&gt;
-- Sidenote: I decided I really have to grasp Javascript in order to find out how things work before trying an alternative language which compiles down to Javascript -- so far my experience has been nice. I found that I end up programming much more in a functional style and use classes in a very limited way (haven't felt the need for inheritance so far), although I feel that it's hard to find resources on what would be the proper way of doing things (but in the plus side, there are LOTS of javascript-related resources, so, I've hardly found myself stuck while learning it).&lt;br /&gt;
&lt;br /&gt;
Anyways,&amp;nbsp;I have some algorithms I've written in Python which I'd like to reuse in Javascript without having to use huge runtime with it (I'm restricting that to simple functions) and searching for a translator, I've found &lt;a href="http://www.allbuttonspressed.com/projects/pyvascript"&gt;Pyvascript&lt;/a&gt;,&amp;nbsp;which is a Python-like language which compiles to Javascript (so, there's only a subset of Python that can really be used, which is ok as I'm not after the ones that attempt to do full Python in Javascript and end up with a huge emulated runtime), but it does fit my needs properly with some minor changes (and now I have some code I can use in both Python and Javascript at the same time). Just to note, it doesn't seem like the project is active right now, but it does work fine for me :)&lt;img src="http://feeds.feedburner.com/~r/blogspot/pydev/~4/ZambjosoNY4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pydev.blogspot.com/feeds/236502220488761114/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8550962&amp;postID=236502220488761114" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/236502220488761114?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/236502220488761114?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/pydev/~3/ZambjosoNY4/python-to-javascript-translation.html" title="Python to Javascript translation" /><author><name>Fabio Zadrozny</name><uri>http://www.blogger.com/profile/04202246218394712738</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://pydev.blogspot.com/2013/01/python-to-javascript-translation.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkcDRHY9fip7ImA9WhNUEU4.&quot;"><id>tag:blogger.com,1999:blog-8550962.post-8423026031768527293</id><published>2013-01-02T05:41:00.001-08:00</published><updated>2013-01-02T05:41:15.866-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-02T05:41:15.866-08:00</app:edited><title>Python: get parent process id (pid) in windows</title><content type="html">Below is code to monkey-patch the&amp;nbsp;&lt;b&gt;os&lt;/b&gt;&amp;nbsp;module to provide a &lt;b&gt;getppid()&lt;/b&gt; function to get the parent process id in windows using ctypes (note that on Python 3.2, os.getppid() already works and is available on windows, but if you're on an older version, this can be used as a workaround).&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt;import os
if not hasattr(os, 'getppid'):
    import ctypes

    TH32CS_SNAPPROCESS = 0x02L
    CreateToolhelp32Snapshot = ctypes.windll.kernel32.CreateToolhelp32Snapshot
    GetCurrentProcessId = ctypes.windll.kernel32.GetCurrentProcessId

    MAX_PATH = 260

    _kernel32dll = ctypes.windll.Kernel32
    CloseHandle = _kernel32dll.CloseHandle

    class PROCESSENTRY32(ctypes.Structure):
        _fields_ = [
            ("dwSize", ctypes.c_ulong),
            ("cntUsage", ctypes.c_ulong),
            ("th32ProcessID", ctypes.c_ulong),
            ("th32DefaultHeapID", ctypes.c_int),
            ("th32ModuleID", ctypes.c_ulong),
            ("cntThreads", ctypes.c_ulong),
            ("th32ParentProcessID", ctypes.c_ulong),
            ("pcPriClassBase", ctypes.c_long),
            ("dwFlags", ctypes.c_ulong),

            ("szExeFile", ctypes.c_wchar * MAX_PATH)
        ]

    Process32First = _kernel32dll.Process32FirstW
    Process32Next = _kernel32dll.Process32NextW

    def getppid():
        '''
        :return: The pid of the parent of this process.
        '''
        pe = PROCESSENTRY32()
        pe.dwSize = ctypes.sizeof(PROCESSENTRY32)
        mypid = GetCurrentProcessId()
        snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)

        result = 0
        try:
            have_record = Process32First(snapshot, ctypes.byref(pe))

            while have_record:
                if mypid == pe.th32ProcessID:
                    result = pe.th32ParentProcessID
                    break

                have_record = Process32Next(snapshot, ctypes.byref(pe))

        finally:
            CloseHandle(snapshot)

        return result

    os.getppid = getppid
      &lt;/code&gt;
&lt;/pre&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/pydev/~4/o95YTqGL7gQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pydev.blogspot.com/feeds/8423026031768527293/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8550962&amp;postID=8423026031768527293" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/8423026031768527293?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/8423026031768527293?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/pydev/~3/o95YTqGL7gQ/python-get-parent-process-id-pid-in.html" title="Python: get parent process id (pid) in windows" /><author><name>Fabio Zadrozny</name><uri>http://www.blogger.com/profile/04202246218394712738</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://pydev.blogspot.com/2013/01/python-get-parent-process-id-pid-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0QER3Yyeip7ImA9WhNWFU0.&quot;"><id>tag:blogger.com,1999:blog-8550962.post-1425712058842785007</id><published>2012-12-14T08:08:00.001-08:00</published><updated>2012-12-14T08:08:26.892-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-14T08:08:26.892-08:00</app:edited><title>Prototyping a class in Python</title><content type="html">I'm not sure what's the name for this technique (for me it resembles what is called prototyping in javascript -- I know it's not the same, but the fact is that you're building your class outside of it, although in Python it's still in its declaration step).&lt;br /&gt;
&lt;br /&gt;
Anyways, the idea is the following: you want to change the class attributes before it becomes final -- there are things you just can't do in Python after a class is already declared (Python uses this technique for creating properties -- in my specific use-case I'm using it to overcome some limitations that Django has in its model inheritance with fields, but I've already used this many times).&lt;br /&gt;
&lt;br /&gt;
The idea is the following: you get the frame which is being used inside the class declaration and change the locals in it so that the final created class will have the things you declared.&lt;br /&gt;
&lt;br /&gt;
I.e.: This code:&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt;
import sys

def prototype_class(frame=None):
    if frame is None:
        frame = sys._getframe().f_back

    frame.f_locals['new_attribute'] = 'New attribute'

class MyNewClass(object):
    prototype_class()

print MyNewClass().new_attribute
&lt;/code&gt; &lt;/pre&gt;
&lt;br /&gt;
Is the same as: &lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt;
class MyNewClass(object):
    new_attribute = 'New attribute'
&lt;/code&gt; &lt;/pre&gt;
&lt;br /&gt;
-- Just more complicated and more flexible -- in my case, it'll properly help me to choose how to create and customize the fields of a Django model class without having to copy and paste a bunch of code.&lt;br /&gt;
&lt;br /&gt;
On a separate note, blogspot just sucks for code... why can't they simply create an option to add a piece of code? I'm now manually putting my code in html as described in&amp;nbsp;&lt;a href="http://stackoverflow.com/a/8697421/110451"&gt;http://stackoverflow.com/a/8697421/110451&lt;/a&gt;&amp;nbsp;-- it'd certainly be trivial for the blogspot devs to put a button which would do that for me right? (colors would be nicer, but this is the easiest things that just works for me and I'd already settle for it if blogger added it -- I know blogger has the quotes, but I want the code at least on a box with a monospaced font).&lt;img src="http://feeds.feedburner.com/~r/blogspot/pydev/~4/36t7VVK4YUA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pydev.blogspot.com/feeds/1425712058842785007/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8550962&amp;postID=1425712058842785007" title="8 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/1425712058842785007?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/1425712058842785007?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/pydev/~3/36t7VVK4YUA/prototyping-class-in-python.html" title="Prototyping a class in Python" /><author><name>Fabio Zadrozny</name><uri>http://www.blogger.com/profile/04202246218394712738</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>8</thr:total><feedburner:origLink>http://pydev.blogspot.com/2012/12/prototyping-class-in-python.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkYMQXc7eCp7ImA9WhNXGEU.&quot;"><id>tag:blogger.com,1999:blog-8550962.post-483315006946992371</id><published>2012-12-07T04:43:00.000-08:00</published><updated>2012-12-07T04:43:00.900-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-07T04:43:00.900-08:00</app:edited><title>Python tricks: making sure a function is only called once</title><content type="html">Sometimes I want a function to be called only a single time (there are many use-cases, but specifically this time I wanted to change the way the Python garbage collection worked when dealing with Qt and threads).&lt;br /&gt;
&lt;br /&gt;
Anyways, usually I did that setting some flag so that the second time a function is called, it'd check that flag and would skip the function in the second time.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After tinkering a bit about it, I came with a shorter version changing the function code which I thought is pretty nice:&lt;br /&gt;
&lt;br /&gt;
&lt;pre nbsp="nbsp" style="background-image: URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt; def func():&amp;nbsp; 
&amp;nbsp;&amp;nbsp; print 'Calling func only this time'&amp;nbsp; 
&amp;nbsp;&amp;nbsp; func.func_code = (lambda:None).func_code&amp;nbsp; &lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Now, calling it a second time will actually execute the lamda:None code.&lt;br /&gt;
&lt;br /&gt;
Yes, I know you'll say it's cryptic, so, I'm including a decorator version below which does the same checking with a variable:&lt;br /&gt;
&lt;br /&gt;
&lt;pre nbsp="nbsp" style="background-image: URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt; @call_only_once &amp;nbsp;
&amp;nbsp;def func(): &amp;nbsp;
&amp;nbsp;&amp;nbsp; print 'Calling func only this time'&amp;nbsp; 
&amp;nbsp;def call_only_once(func): &amp;nbsp;
&amp;nbsp;&amp;nbsp; def new_func(*args, **kwargs): &amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if not new_func._called: &amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try: &amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return func(*args, **kwargs) &amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; finally: &amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new_func._called = True &amp;nbsp;
&amp;nbsp;&amp;nbsp; new_func._called = False &amp;nbsp;
&amp;nbsp;&amp;nbsp; return new_func &amp;nbsp;&lt;/code&gt;&lt;/pre&gt;
&lt;img src="http://feeds.feedburner.com/~r/blogspot/pydev/~4/mtIBLPY8a-o" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pydev.blogspot.com/feeds/483315006946992371/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8550962&amp;postID=483315006946992371" title="9 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/483315006946992371?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/483315006946992371?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/pydev/~3/mtIBLPY8a-o/python-tricks-making-sure-function-is.html" title="Python tricks: making sure a function is only called once" /><author><name>Fabio Zadrozny</name><uri>http://www.blogger.com/profile/04202246218394712738</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>9</thr:total><feedburner:origLink>http://pydev.blogspot.com/2012/12/python-tricks-making-sure-function-is.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D08NSX0_cSp7ImA9WhNXF0Q.&quot;"><id>tag:blogger.com,1999:blog-8550962.post-3464716016832546477</id><published>2012-12-06T04:11:00.001-08:00</published><updated>2012-12-06T04:11:38.349-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-06T04:11:38.349-08:00</app:edited><title>Plugins in Eclipse to accompany PyDev</title><content type="html">Below are some plugins which I believe may be very helpful for people installing Eclipse/PyDev (those are the plugins I usually install on any new Eclipse install).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;1. StartExplorer:&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Details at &lt;a href="https://github.com/basti1302/startexplorer"&gt;https://github.com/basti1302/startexplorer&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Mostly, I use it to open the current file in explorer or copy the current file path to the clipboard (but it has other niceties too).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;2.&amp;nbsp;Extended VS Presentation plugin for Eclipse&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Details at:&amp;nbsp;&lt;a href="http://andrei.gmxhome.de/skins/index.html"&gt;http://andrei.gmxhome.de/skins/index.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
I use it for skinning Eclipse (i.e.: providing a better look and feel), but note it's&amp;nbsp;only for Eclipse 3.x (Eclipse 4.x has a skinning engine builtin).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;3. Eclipse Color Themes&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Details at: &lt;a href="http://eclipsecolorthemes.org/"&gt;http://eclipsecolorthemes.org&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Note that if you're using the Aptana Studio editors, you don't really need this plugin as Aptana Studio itself has a theming feature which supersedes this, but if you're only on Eclipse/PyDev and other editors, this may be a nice addition so that you can apply the same colors for several editor plugins at once.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;4.&amp;nbsp;Practically Macro&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Details at: &lt;a href="https://sourceforge.net/projects/practicalmacro"&gt;https://sourceforge.net/projects/practicalmacro&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Yes, I know, Eclipse does not have macro record/playback by default and it's a major shortcoming. Well, this plugin does cover most of the use-cases I have for doing macro record/playback (although it does have some weirdness sometimes -- in which case I usually just start notepad++ editor just for this feature).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;5. EGit&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Details at: &lt;a href="http://wiki.eclipse.org/EGit/User_Guide"&gt;http://wiki.eclipse.org/EGit/User_Guide&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Note that Aptana Studio has its own Git integration (so, when I'm in Aptana Studio I don't usually install EGit). Although it can do many things with Eclipse, I use the Eclipse integration (either from EGit or Aptana Studio) mostly to have a quick way to know which files I've changed and sometimes seeing the history for a given file. For most of my work I like to work on the shell, usually using a tool I wrote in Python:&amp;nbsp;&lt;a href="https://github.com/fabioz/mu-repo"&gt;https://github.com/fabioz/mu-repo&lt;/a&gt;&amp;nbsp;which helps managing many git repositories at once from a shell (and showing differences I can edit via WinMerge) -- and sometimes I even fire &lt;a href="http://code.google.com/p/gitextensions"&gt;http://code.google.com/p/gitextensions&lt;/a&gt;&amp;nbsp;for exploring some git repository.&lt;br /&gt;
&lt;br /&gt;
I was thinking a bit about this one since in cvs and svn I did everything inside Eclipse, but when it comes to git this trend didn't continue. I think it's mostly because the major thing for me is that the synchronize view wasn't available to me on cvs/svn and the EGit synchronize view is not as streamlined/fast as the other integration -- as I have the habit of reviewing all the code I'm about to update, and as EGit made that process a bit slower (and git is pretty easy to extend with scripting on top of it), I just went a different way this time (but who knows, if EGit provides a more streamlined/faster synchronize view in the future for my modus-operandi I may switch back to only Eclipse here -- but it'd have to beat the time in which I do things in mu-repo which fetches/diffs lots of repositories in parallel in a pretty fast way, so, I'm not sure how feasible that is).&lt;img src="http://feeds.feedburner.com/~r/blogspot/pydev/~4/82XX8592nv0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pydev.blogspot.com/feeds/3464716016832546477/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8550962&amp;postID=3464716016832546477" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/3464716016832546477?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/3464716016832546477?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/pydev/~3/82XX8592nv0/plugins-in-eclipse-to-accompany-pydev.html" title="Plugins in Eclipse to accompany PyDev" /><author><name>Fabio Zadrozny</name><uri>http://www.blogger.com/profile/04202246218394712738</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>3</thr:total><feedburner:origLink>http://pydev.blogspot.com/2012/12/plugins-in-eclipse-to-accompany-pydev.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkEBQ388eCp7ImA9WhNQFE0.&quot;"><id>tag:blogger.com,1999:blog-8550962.post-2133518179229154776</id><published>2012-11-20T02:50:00.003-08:00</published><updated>2012-11-20T02:50:52.170-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-11-20T02:50:52.170-08:00</app:edited><title>Debugging SQL in Django (with PyDev)</title><content type="html">I'm working on a Django project recently and one of the things that came up was debugging SQL statements a bit to see what was actually going on.&lt;br /&gt;
&lt;br /&gt;
After researching a bit, I found: &lt;a href="http://pypi.python.org/pypi/django-debug-toolbar"&gt;http://pypi.python.org/pypi/django-debug-toolbar&lt;/a&gt;, which when installed wraps around the calls that Django does to the DB and prints the actual SQL statements used.&lt;br /&gt;
&lt;br /&gt;
I didn't really install it as a debug toolbar as it recommends, but I use it in the interactive console shell to see how things happen when I'm experimenting.&lt;br /&gt;
&lt;br /&gt;
To do this, after installing it and adding 'debug_toolbar' to your INSTALLED_APPS in Django, one can start the interactive console shell with Django support (if you're in a Python editor just do: Ctrl+2 dj shell) and add write the import:&lt;br /&gt;
&lt;br /&gt;
from debug_toolbar.management.commands import debugsqlshell&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now, when you do some operation that does an SQL operation, it'll be printed to the console, while having all the PyDev niceties on the console (such as code-completion). Pretty nice.&lt;img src="http://feeds.feedburner.com/~r/blogspot/pydev/~4/n42j5gN9gFA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pydev.blogspot.com/feeds/2133518179229154776/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8550962&amp;postID=2133518179229154776" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/2133518179229154776?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/2133518179229154776?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/pydev/~3/n42j5gN9gFA/debugging-sql-in-django-with-pydev.html" title="Debugging SQL in Django (with PyDev)" /><author><name>Fabio Zadrozny</name><uri>http://www.blogger.com/profile/04202246218394712738</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total><feedburner:origLink>http://pydev.blogspot.com/2012/11/debugging-sql-in-django-with-pydev.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0IBRHk5eCp7ImA9WhJXGUg.&quot;"><id>tag:blogger.com,1999:blog-8550962.post-4519489090705422731</id><published>2012-08-14T07:45:00.002-07:00</published><updated>2012-08-14T07:45:55.720-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-08-14T07:45:55.720-07:00</app:edited><title>PyDev &amp; Eclipse 4.2 (i.e.: stick with Eclipse 3.8)</title><content type="html">Ok, I've been giving a whirl on supporting Eclipse 4.2 on PyDev and everything seems to work as expected, but unfortunately, I still can't recommend the Eclipse 4.x series over the 3.x series because performance-wise Eclipse 4 is still not on par with Eclipse 3 (and for me the only gain was that floating docks are now better -- as for skinning, I don't really think it's much better for final users unless someone else already got to the point of doing a skin exactly as you'd want -- so I think that for now, Aptana Studio 3 skinning (themeing) is a better solution -- and targeted at Eclipse 3.x).&lt;br /&gt;
&lt;br /&gt;
I have hopes that those issues will be addressed in a newer release of Eclipse 4, but the truth is that right now Eclipse 4 feels sluggish when compared to Eclipse 3 (even changing configurations on the Eclipse appearance preferences for having some performance gains).&lt;br /&gt;
&lt;br /&gt;
So, if by any chance you've just gotten into PyDev and it doesn't seem as speedy as you'd like, please make sure you check it with Eclipse 3.8 (in the downloads page: &lt;a href="http://download.eclipse.org/eclipse/downloads/%20"&gt;http://download.eclipse.org/eclipse/downloads/ &lt;/a&gt;there's a link to Eclipse 3.x downloads available: &lt;a href="http://download.eclipse.org/eclipse/downloads/eclipse3x.html"&gt;http://download.eclipse.org/eclipse/downloads/eclipse3x.html&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;
Also, make sure that you have the latest version of java as it may make a difference.&lt;br /&gt;
&lt;br /&gt;
Or, if you've gotten the Aptana Studio 3 download directly, you're already good to go -- as it's already based on Eclipse 3.x and has PyDev preinstalled (see &lt;a href="http://pydev.org/download.html"&gt;http://pydev.org/download.html&lt;/a&gt; for links). &lt;img src="http://feeds.feedburner.com/~r/blogspot/pydev/~4/LVBmppQr4TI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pydev.blogspot.com/feeds/4519489090705422731/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8550962&amp;postID=4519489090705422731" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/4519489090705422731?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/4519489090705422731?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/pydev/~3/LVBmppQr4TI/pydev-eclipse-42-ie-stick-with-eclipse.html" title="PyDev &amp; Eclipse 4.2 (i.e.: stick with Eclipse 3.8)" /><author><name>Fabio Zadrozny</name><uri>http://www.blogger.com/profile/04202246218394712738</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total><feedburner:origLink>http://pydev.blogspot.com/2012/08/pydev-eclipse-42-ie-stick-with-eclipse.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0IHQHsycCp7ImA9WhJSEkk.&quot;"><id>tag:blogger.com,1999:blog-8550962.post-7777582153764599577</id><published>2012-07-02T10:18:00.001-07:00</published><updated>2012-07-02T10:18:51.598-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-07-02T10:18:51.598-07:00</app:edited><title>Git (multiple repos)</title><content type="html">Improving my Git workflow has been one of my current targets lately... Especially when working with multiple projects.&lt;br /&gt;
&lt;br /&gt;
So, although I'm working all the time inside Eclipse, I still like to use the command line for many things (so, even with the Aptana Studio 3 Git integration and EGit having improved, I still use the command line a lot on common operations, resorting to other options mostly when investigating the history of a repository or some other thing which may be suboptimal in the command line).&lt;br /&gt;
&lt;br /&gt;
To improve that situation, I ended up creating a tool... Yes, I know there are probably many other command line tools that try to accomplish that, but I did a good amount of research and didn't find anything that worked as I wanted -- and not nearly as fun (but I appreciate suggestions in this realm).&lt;br /&gt;
&lt;br /&gt;
The tool I did is hosted at GitHub: &lt;a href="https://github.com/fabioz/mu-repo"&gt;https://github.com/fabioz/mu-repo&lt;/a&gt;, and it's freely available (GPL 3).&lt;br /&gt;
&lt;br /&gt;
It's a Python program which interfaces with the git binary to execute whatever is needed. Also, for diffing operations it currently relies on WinMerge (meaning this part of the tool is Windows only for now, but if there's interest, it should be straightforward having it support other diff tools such as KDiff3).&lt;br /&gt;
&lt;br /&gt;
My basic workflow is now:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;cd /workspace&lt;/b&gt; (which has many .git subrepos)&lt;br /&gt;
&lt;br /&gt;
Note: all the "mu" operations below will actually be applied to all the git subdirs (must be previously registered), so, a single command line is enough for dealing with all repositories at once -- yes, I know about git submodules, but I don't really like how it works -- and it's one of the main reasons this tool exists :) &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;To get changes:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;mu up&lt;/b&gt; (fetches origin for the current branch updating the origin/current_branch reference -- I found it weird that trying to do "git fetch origin current_branch" ended up updating FETCH_HEAD instead of origin/current_branch -- also, this and most other operations work only in the current branch, leaving other branches or references untouched).&lt;br /&gt;
&lt;br /&gt;&lt;b&gt;mu dd origin/current_branch&lt;/b&gt; (preview incoming changes: compare current branch HEAD to origin/current_branch).&lt;br /&gt;
&lt;br /&gt;&lt;b&gt;mu rebase origin/current_branch&lt;/b&gt; (rebase incoming changes -- could also be: &lt;b&gt;mu merge origin/current_branch&lt;/b&gt;).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;To submit changes:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;mu st &lt;/b&gt;(check status of changed files -- indexed or not)&lt;br /&gt;&lt;b&gt;mu dd &lt;/b&gt;(diff working copy with winmerge while editing changes and keeping the working dir updated even if no symlink support is available)&lt;br /&gt;&lt;b&gt;mu acp "message"&lt;/b&gt; (add all working copy changes, commit, push)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;To start working on a feature:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;mu co -b branch_name &lt;/b&gt;(create branch for all repos)&lt;br /&gt;
&lt;b&gt;mu ac "message"&amp;nbsp; &lt;/b&gt;(add / commit changes on that branch)&lt;br /&gt;
&lt;b&gt;mu co main_branch &lt;/b&gt;(go back to main branch) &lt;br /&gt;
&lt;b&gt;mu rebase branch_name &lt;/b&gt;(get the changes from the branch into the main branch)&lt;br /&gt;
&lt;b&gt;mu branch -D branch_name &lt;/b&gt;(remove that local branch)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note that for my workflow I work mostly without taking "advantage" of the git index -- usually I review things with "mu dd" and on "mu ac" I add all the changes to the index and commit in a single operation (before that I was almost always doing "git add -A" and "git commit -m "message"" anyways).&lt;br /&gt;&lt;br /&gt;
I also still configure many things as I posted previously: &lt;a href="http://pydev.blogspot.com.br/2011/02/git-on-command-line.html"&gt;http://pydev.blogspot.com.br/2011/02/git-on-command-line.html&lt;/a&gt;, but a bunch of things are now better integrated with this tool :)&lt;br /&gt;
&lt;br /&gt;
Also, the tool works for a directory that has a '.git' repository, so, operations such as the diff with WinMerge can be used even when working with a single git repository.&lt;br /&gt;
&lt;br /&gt;
p.s.: The tool is still in beta, so, although I'm using it all the time, it's possible that some things are not working as they should -- but on the good side, I still haven't been able to corrupt any of my git repos :)&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/pydev/~4/9fCBA3SqmU4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pydev.blogspot.com/feeds/7777582153764599577/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8550962&amp;postID=7777582153764599577" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/7777582153764599577?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/7777582153764599577?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/pydev/~3/9fCBA3SqmU4/git-multiple-repos.html" title="Git (multiple repos)" /><author><name>Fabio Zadrozny</name><uri>http://www.blogger.com/profile/04202246218394712738</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://pydev.blogspot.com/2012/07/git-multiple-repos.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUFSX44eip7ImA9WhJTGUw.&quot;"><id>tag:blogger.com,1999:blog-8550962.post-766173508959541841</id><published>2012-06-28T13:43:00.004-07:00</published><updated>2012-06-28T13:43:38.032-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-28T13:43:38.032-07:00</app:edited><title>PyDev 2.6.0 released</title><content type="html">PyDev 2.6.0 is just out of the door.&lt;br /&gt;
&lt;br /&gt;
Main in this release were changes in the interactive console -- and mostly by external contributors, so, it seems this feature has really picked up some traction :)&lt;br /&gt;
&lt;br /&gt;
Hussain Bohra made it possible to have an interactive console bound to a debugger frame and James Blackburn did a bunch of fixes in it.&lt;br /&gt;
&lt;br /&gt;
Aside from that, the default PyUnit runner has new options to include/exclude files from the test loading process and Jython has an annoying fix done (print can be used as a dotted notation) along with many other fixes (see:&amp;nbsp;&lt;a href="http://pydev.org/"&gt;http://pydev.org&lt;/a&gt; for more details).&lt;br /&gt;
&lt;br /&gt;
Also, the PyDev official issue tracker is now the same tracker used in Aptana Studio 3: &lt;a href="https://jira.appcelerator.org/browse/APSTUD/"&gt;https://jira.appcelerator.org/browse/APSTUD/&lt;/a&gt; (there's a component related to PyDev there).&lt;br /&gt;
&lt;br /&gt;
The issues currently on Sourceforge will be migrated to that tracker, but there's no way to make the current Sourceforge trackers read-only, so, I'm just redirecting people to the new tracker and asking not to post on the old one -- hope that works :)&lt;br /&gt;
&lt;br /&gt;
It's interesting to note that now the official Eclipse release is focused on Eclipse 4.x (and not on 3.x)... the integration has already been tested, but not as much as the 3.x series, so, please report any issues found in the way.&lt;img src="http://feeds.feedburner.com/~r/blogspot/pydev/~4/C_UiYoiNyo4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pydev.blogspot.com/feeds/766173508959541841/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8550962&amp;postID=766173508959541841" title="8 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/766173508959541841?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/766173508959541841?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/pydev/~3/C_UiYoiNyo4/pydev-260-released.html" title="PyDev 2.6.0 released" /><author><name>Fabio Zadrozny</name><uri>http://www.blogger.com/profile/04202246218394712738</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>8</thr:total><feedburner:origLink>http://pydev.blogspot.com/2012/06/pydev-260-released.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkIMQn0zeCp7ImA9WhVXEEs.&quot;"><id>tag:blogger.com,1999:blog-8550962.post-114599692588220388</id><published>2012-04-10T04:16:00.002-07:00</published><updated>2012-04-10T07:36:23.380-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-10T07:36:23.380-07:00</app:edited><title>PyDev 2.5.0 released</title><content type="html">Major things in the PyDev 2.5.0 release include:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Proper support for Django 1.4 (as it's layout changed, the project creation wizard wasn't working properly).&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Better patching of Django 1.4 for the debugger and auto-reload (details at the end of the page: &lt;a href="http://pydev.org/manual_adv_django.html"&gt;http://pydev.org/manual_adv_django.html&lt;/a&gt;). &lt;span style="font-weight: bold;"&gt;Note: &lt;/span&gt;there is an issue when using it on Linux, which is already fixed in the nightly build, so, if you are on Linux and want to experiment with it, please update to the current nightly build.&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://pydev.org/manual_adv_django.html"&gt;&lt;/a&gt;&lt;ul&gt;&lt;li&gt;The interactive console can now be attached to the variables/expressions view (the preference at: window &amp;gt; preferences &amp;gt; PyDev &amp;gt; Interactive Console and check 'Connect console to Variables Debug View?' must be enabled). Also, there's drag and drop support for it now.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Aside from those, many bugs were fixed and minor improvements were done. More details can be seen at: &lt;a href="http://pydev.org/"&gt;http://pydev.org/&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/pydev/~4/z_Cp8ktmd-I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pydev.blogspot.com/feeds/114599692588220388/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8550962&amp;postID=114599692588220388" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/114599692588220388?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/114599692588220388?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/pydev/~3/z_Cp8ktmd-I/pydev-250-released.html" title="PyDev 2.5.0 released" /><author><name>Fabio Zadrozny</name><uri>http://www.blogger.com/profile/04202246218394712738</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>6</thr:total><feedburner:origLink>http://pydev.blogspot.com/2012/04/pydev-250-released.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU8HSXo5fSp7ImA9WhVSGE0.&quot;"><id>tag:blogger.com,1999:blog-8550962.post-68753504032399136</id><published>2012-03-13T08:00:00.003-07:00</published><updated>2012-03-15T03:37:18.425-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-15T03:37:18.425-07:00</app:edited><title>PyCon retrospect</title><content type="html">Ok, so, this was the first time I've been on PyCon and I must say it was pretty nice.&lt;br /&gt;&lt;br /&gt;Initially, it started out kind of lousy for me: United seems to have 'misplaced' my bag and I only got it back in time to check it back to Brazil, so, that sucked. On the other hand, to balance things, I won a Kindle DX in raffle from &lt;a href="http://www.truecar.com/"&gt;http://www.truecar.com&lt;/a&gt; :)&lt;br /&gt;&lt;br /&gt;Mainly, it was awesome talking to so many great names of the Python world... Meeting people face to face does make a great difference (some things are simply not as well expressed in an e-mail).&lt;br /&gt;&lt;br /&gt;On the PyDev side, it was pretty nice seeing many people using it while hacking away during the conference and even having some people asking 'how can I help to make PyDev better?'.&lt;br /&gt;&lt;br /&gt;I guess I wasn't properly prepared and mostly, my answer was: &lt;a href="http://pydev.org/developers.html"&gt;read the devs&lt;/a&gt; guide to grab the code/compile, find an itch to scratch and mail me about it so that I can help you find yourself there... Some things can be done in Java, some in Jython, depends a lot on what you want to do.&lt;br /&gt;&lt;br /&gt;Aside from that, documentation-wise, I guess the major issue would be having some section explaining how to configure each major library on how to work with PyDev (most work out of the box, but some need minor adjustments such as adding a token to the forced builtins and some may even require more than that), so, if someone is willing to help working on the PyDev documentation in that topic, that would be a great help (and I guess that if someone doesn't have an itch to scratch and still wants to contribute in code, there are things I can point to that need to be done and are relatively simple to get started).&lt;br /&gt;&lt;br /&gt;On the scientific computing side, I liked Numba (&lt;a href="https://github.com/ContinuumIO/numba"&gt;https://github.com/ContinuumIO/numba&lt;/a&gt;), which seems to be a pretty nice idea... it's still in its early stages, but I think it could be a nice substitute for Psyco (but with knowledge about numpy types and maybe a bit more strict -- if I did understand it properly)... I'd much rather use something as Numba for speedups than Cython (as the Cython code is only 'close' to Python, but doesn't really run on a Python interpreter) and Pypy is just not an option right now...&lt;br /&gt;&lt;br /&gt;Although Pypy seemed strong in the conference, I must say that it'll probably be a long, long time until I'll be able to use it in production... I really use lots of code in C/C++ bindings, so, this is a killer CPython feature which I'm not sure Pypy will ever be able to provide (and the 'current' workaround of porting a library to RPython as is being done in Pypy/Numpy doesn't seem to be really feasible).&lt;br /&gt;&lt;br /&gt;One thing I thought was a bit strange was the lack of projects with Python in mobile platforms, as I was guessing it should be straightforward to compile Python to Android/iPhone (so, I'm guessing the issue is probably the lack of proper multi-platform bindings on that area). In contrast, Python seems very strong on the server-side and scientific computing fields.&lt;br /&gt;&lt;br /&gt;And I think Python 3 does deserve a special note here: I think Guido left it pretty clear (as much of his keynote talked about the subject) that Python 2 is really deprecated, so, although it's currently the production version that's most widely deployed/used, people have to really start getting used to the idea that a port to Python 3 is the way to go -- although in the real world, I still do expect this to take quite a few years (probably more than was initially expected by the Python-core folks). The fact that Guido made this topic such a big portion of his keynote, does make me feel like many of the Python lovers were against this move and the actual response from the community on this respect has been mixed, but regardless of that, the direction that Python-core is going is 100% on Python 3 (maybe doing something here or there to help in easing the port or having a shared Python 2-3 codebase).&lt;br /&gt;&lt;br /&gt;And, there are still have some talks I'll see later at: &lt;a href="http://pyvideo.org/"&gt;http://pyvideo.org&lt;/a&gt; (because many interesting talks took place at the same time).&lt;img src="http://feeds.feedburner.com/~r/blogspot/pydev/~4/p8PXSZmU6FQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pydev.blogspot.com/feeds/68753504032399136/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8550962&amp;postID=68753504032399136" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/68753504032399136?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/68753504032399136?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/pydev/~3/p8PXSZmU6FQ/pycon-retrospect.html" title="PyCon retrospect" /><author><name>Fabio Zadrozny</name><uri>http://www.blogger.com/profile/04202246218394712738</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>5</thr:total><feedburner:origLink>http://pydev.blogspot.com/2012/03/pycon-retrospect.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8ERHc-fip7ImA9WhVSEEU.&quot;"><id>tag:blogger.com,1999:blog-8550962.post-5431229506982853471</id><published>2012-03-06T16:58:00.002-08:00</published><updated>2012-03-06T17:30:05.956-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-06T17:30:05.956-08:00</app:edited><title>PyCon</title><content type="html">Tomorrow I'll be traveling to PyCon and I'll be staying during the 3 days of the main conference (Friday to Sunday).&lt;br /&gt;&lt;br /&gt;So, anyone who wants to talk about PyDev, scientific programming, how to best structure a Python development environment -- or just wants to say hi, I'll be there this time :)&lt;br /&gt;&lt;br /&gt;Just to note, currently the major projects I'm working on are:&lt;br /&gt;&lt;br /&gt;PyDev (&lt;a href="http://pydev.org"&gt;http://pydev.org&lt;/a&gt;), which I guess is pretty well known (especially if you're reading this blog), and I've been developing it for 9 years already :)&lt;br /&gt;&lt;br /&gt;and Kraken (&lt;a href="https://www.esss.com.br/kraken/"&gt;https://www.esss.com.br/kraken/&lt;/a&gt;), which is a software to do post-processing of reservoir simulations (this may be less known, but actually, I started working on PyDev to scratch my own itches while doing scientific programming in Python, and so far, Kraken is the most advanced/complex software I've worked on this area and I've been involved with its development since its beginning, around 5 years ago).&lt;br /&gt;&lt;br /&gt;See you in Santa Clara :)&lt;img src="http://feeds.feedburner.com/~r/blogspot/pydev/~4/5RmwWsFt908" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pydev.blogspot.com/feeds/5431229506982853471/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8550962&amp;postID=5431229506982853471" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/5431229506982853471?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/5431229506982853471?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/pydev/~3/5RmwWsFt908/pycon.html" title="PyCon" /><author><name>Fabio Zadrozny</name><uri>http://www.blogger.com/profile/04202246218394712738</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://pydev.blogspot.com/2012/03/pycon.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUEFQnw5fyp7ImA9WhRbF0k.&quot;"><id>tag:blogger.com,1999:blog-8550962.post-6355374914444511010</id><published>2012-02-08T16:09:00.000-08:00</published><updated>2012-02-08T16:33:33.227-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-08T16:33:33.227-08:00</app:edited><title>PyDev forums -&gt; StackOverflow</title><content type="html">The PyDev forums at SourceForge are now officially deprecated :)&lt;br /&gt;&lt;br /&gt;So, anyone having a doubt regarding PyDev should now ask at StackOverflow and add a 'PyDev' tag.&lt;br /&gt;&lt;br /&gt;I think this will be a real improvement over the current status quo... Some reasons I see for that are:&lt;br /&gt;&lt;br /&gt;1. Many PyDev users follow StackOverflow and do answer things there, whereas in the PyDev forum, many questions were asked, but I was almost the only one answering... (I think the real plus here are the 'gaming' features that StackOverflow has, so, more people are inclined to participate actively).&lt;br /&gt;&lt;br /&gt;2. As people started asking there anyways, I really had to follow StackOverflow closely too, so, deprecating the PyDev forums means I'll be able to follow a single place again :)&lt;br /&gt;&lt;br /&gt;3. Interacting with StackOverflow as a whole seem a nice improvement over the SourceForge forum (it's edition is nicer, accepts pictures, etc.)&lt;br /&gt;&lt;br /&gt;And now on to something a bit unrelated... the PyDev homepage (http://pydev.org) is now being generated from a wiki (it's still a read-only wiki -- but hopefully that'll change soon -- but at least, I feel it'll be easier for me to edit things there and later have the homepage updated from it). So, if someone finds something strange in the homepage, please let me know :)&lt;img src="http://feeds.feedburner.com/~r/blogspot/pydev/~4/fOcskVlsJmg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pydev.blogspot.com/feeds/6355374914444511010/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8550962&amp;postID=6355374914444511010" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/6355374914444511010?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/6355374914444511010?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/pydev/~3/fOcskVlsJmg/pydev-forums-stackoverflow.html" title="PyDev forums -&gt; StackOverflow" /><author><name>Fabio Zadrozny</name><uri>http://www.blogger.com/profile/04202246218394712738</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://pydev.blogspot.com/2012/02/pydev-forums-stackoverflow.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0UNQX44eSp7ImA9WhRbEU8.&quot;"><id>tag:blogger.com,1999:blog-8550962.post-6247448973414474353</id><published>2012-02-01T09:51:00.000-08:00</published><updated>2012-02-01T11:41:30.031-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-01T11:41:30.031-08:00</app:edited><title>PyDev 2.4.0 released</title><content type="html">This release was mostly focused on performance and memory optimizations.&lt;br /&gt;&lt;br /&gt;On the performance front, the major focus was on start up (i.e.: start up Eclipse, open an editor, request a code-completion and show the globals token browser (Ctrl+Shift+T)) -- which should've become pretty fast (tested only with the Eclipse runtime and PyDev -- as things in other plugins can't really be controlled -- the subversive plugin for subversion seems to be especially slow to startup).&lt;br /&gt;&lt;br /&gt;Memory-wise, things have been improved too, with the AST taking up less memory and doing a 'pseudo-intern' for some rather large caches (it's a pseudo-intern because the String.intern() function is not used: a HashMap is done and strings are reused inside it for some processes -- and later that HashMap is thrown away), and the Jython plugin was fine tuned to make less plugins visible to save on memory (and startup time).&lt;br /&gt;&lt;br /&gt;Just to note: the real memory used can be seen going to window &amp;gt; preferences &amp;gt; general &amp;gt; show heap status (the real size of the java process in the OS will probably be bigger as java will usually grow to the size specified by -Xmx, regardless of how memory it's really using at a given time). Personally, on large projects I allocate 300 Mb for the process, but this is mostly because the subversion plugin seems to be rather resource hungry -- migrating to git on some of those projects seems to be making things better :)&lt;br /&gt;&lt;br /&gt;Aside from that, this time I spent some time migrating the PyDev homepage to a wiki ( &lt;a href="https://wiki.appcelerator.org/display/tis/Python+Development"&gt;https://wiki.appcelerator.org/display/tis/Python+Development&lt;/a&gt; ) -- right now it's not available for external edition, but that should happen soon (hopefully), and the idea is that the PyDev homepage will be generated mostly from that wiki.&lt;br /&gt;&lt;br /&gt;And as usual, a bunch of bugs were fixed :P&lt;img src="http://feeds.feedburner.com/~r/blogspot/pydev/~4/hiOz4o757pk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pydev.blogspot.com/feeds/6247448973414474353/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8550962&amp;postID=6247448973414474353" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/6247448973414474353?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/6247448973414474353?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/pydev/~3/hiOz4o757pk/pydev-240-released.html" title="PyDev 2.4.0 released" /><author><name>Fabio Zadrozny</name><uri>http://www.blogger.com/profile/04202246218394712738</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total><feedburner:origLink>http://pydev.blogspot.com/2012/02/pydev-240-released.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE8DR3YyfSp7ImA9WhRWF0U.&quot;"><id>tag:blogger.com,1999:blog-8550962.post-9033309119757211044</id><published>2012-01-05T08:01:00.000-08:00</published><updated>2012-01-05T09:01:16.895-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-05T09:01:16.895-08:00</app:edited><title>Code-completion strategies in PyDev</title><content type="html">I believe one of the strong points in PyDev is its code-completion, so, I thought a bit about giving some details on it :)&lt;br /&gt;&lt;br /&gt;The main preference page for code completion is: Window &amp;gt; Preferences &amp;gt; PyDev &amp;gt; Editor &amp;gt; Code Completion (my preferred configuration is setting the 'Request completions on all letter chars and '_'', so that completions appear automatically when typing, otherwise Ctrl+Space would need to be used to request the completions -- I was actually thinking about making that the default and decided against it to conform to other editors in Eclipse).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;* Word completion &lt;/span&gt;(also called Hippie Completion):&lt;br /&gt;&lt;br /&gt;This is probably the simplest one and is provided by Eclipse itself (through Alt+/). It provides a simple word-based completion which uses all the currently opened editors in Eclipse.&lt;br /&gt;&lt;br /&gt;I've actually provided a patch for Eclipse to improve the speed of this completion (&lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=270385"&gt;https://bugs.eclipse.org/bugs/show_bug.cgi?id=270385&lt;/a&gt;), which was added in Eclipse 3.6.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;* Templates completion:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;These are user-defined templates that may be configured at PyDev &amp;gt; Editor &amp;gt; Templates (most of the base for this completion is provided by Eclipse... PyDev uses a subclass: PyTemplateCompletionProcessor and some of the available variables may be defined in Jython code -- see: pytemplate_defaults.py for details).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;* Common tokens completion:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When you start typing in PyDev, some common tokens (i.e.: keywords, self, etc) start appearing directly. Those can be configured in PyDev &amp;gt; Editor &amp;gt; Code Completion (ctx insensitive and common tokens).&lt;br /&gt;&lt;br /&gt;It's implementation is pretty simple (may be seen at: KeywordsSimpleAssist)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;* Context insensitive completion:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This completion goes through all the tokens available for a given project (which may need to consider project dependencies and which interpreter is being used) and shows those tokens as a completion (i.e.: top-level tokens such as classes or methods and the modules themselves).&lt;br /&gt;&lt;br /&gt;If one of those is selected, the token will be completed and an import will be added for it too (if the preference in PyDev &amp;gt; Editor &amp;gt; Auto Imports &amp;gt; "Do auto import?" is marked as true -- in that same preferences page, the number of chars that need to be available in a word so that these completions start appearing may be specified).&lt;br /&gt;&lt;br /&gt;Note that if the option was set not to do the auto-import, one could just add the token, let it be marked as an unrecognized variable by PyDev and later do an Organize Imports (Ctrl+O), or a Quick Fix in that line (Ctrl+1), to add the import.&lt;br /&gt;&lt;br /&gt;The major issue in this completion isn't actually the completion per-se (implemented in ImportsCompletionParticipant and CtxParticipant), but the structure which needs to be kept to have it as a fast and efficient completion.&lt;br /&gt;&lt;br /&gt;Mainly, PyDev has a concept called 'AdditionalInfo' (this was done when PyDev Extensions was separated from the PyDev Open Source, so, the name is a bit strange now, but the general idea is that it was additional information related to a given project or interpreter), which keeps the following information:&lt;br /&gt;&lt;br /&gt;- Two TreeMaps (AbstractAdditionalTokensInfo.topLevelInitialsToInfo and AbstractAdditionalTokensInfo.innerInitialsToInfo) which map token names to information of the places where the token may be found (i.e.: module and structure inside that module). Those are all kept in memory and are pretty fast to access (AbstractAdditionalTokensInfo.getTokensStartingWith is what's interesting for a code-completion and AbstractAdditionalTokensInfo.getTokensEqualTo is interesting when doing a quick fix or organize imports). This structure is also used in the global tokens browser (Ctrl+Shift+T).&lt;br /&gt;&lt;br /&gt;- Note that it also has a structure (AbstractAdditionalDependencyInfo.completeIndex) which maps a module to all the available tokens in it. This structure is kept in memory only as a SoftHashMap (so, it's only kept in memory while there's enough space for it) and persisted to the disk. It's also only lazily created on operations that need it (currently only a project-wide rename refactoring or a find references (Ctrl+Shift+G) would use it as it's basically a structure which is a bit faster for doing exact match searches than actually doing a search in Eclipse -- especially if the SoftHashMap is still in memory, so, if many find references are done in succession, if there's enough memory, from the 2nd attempt onwards, things should be fast).&lt;br /&gt;&lt;br /&gt;On a project build, the tokens of the completeIndex are simply all removed (to be recalculated when some action that needs it is called). As for the maps, those are always kept up to date when a file is changed. The strategy for having it build fast is that the in-memory cache is directly updated (which is reasonably fast) and instead of saving the whole map it just saves the delta information and when restoring the info, those deltas are applied to have it in the last state (and from time to time it does dump the whole structure and removes the deltas). Also, it runs in a separate thread (not actually in the thread that's doing the build, and a singleton: RunnableAsJobsPoolThread, makes sure than only some of those, depending on the number of processors in your machine, are running at the same time, so, if you change 200 files at once, your computer won't come to a halt).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;* Context sensitive completion:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is by far the most complex completion available as it analyzes the context where you're requesting a completion and provides tokens based on it. Basically, PyDev has an internal type-inference engine to do that (which is also used by actions such as find definition or TDD actions such as create method).&lt;br /&gt;&lt;br /&gt;Internally it uses an LRU structure which maps module names to the module AST (Abstract Syntax Tree) and in a pretty recursive algorithm finds out about the available tokens needed for a given context and provides completions based on that (thankfully it has a huge amount of unit tests holding it all together). That process starts in PyCodeCompletion.getCodeCompletionProposals(ITextViewer, CompletionRequest) and the type inference engine main classes are: ASTManager and ProjectModulesManager.&lt;br /&gt;&lt;br /&gt;On some occasions some modules may be pretty hard to analyze, in which case PyDev resorts to launching a shell and querying it for the needed tokens (those are pre-specified as in window &amp;gt; preferences &amp;gt; PyDev &amp;gt; Interpreter &amp;gt; Forced Builtins, and the communication happens in the java side through the AbstractShell class) -- it's also probably one of the main reasons of problems when configuring PyDev, as it's common to have a firewall blocking that communication (in which case PyDev wouldn't even be able to get common builtins such as len, object, etc).&lt;br /&gt;&lt;br /&gt;On the good side, this also makes it possible for PyDev to analyze .pyd modules (although if you're developing such a module as a part of your project, you have to remember to call &lt;span style="font-weight: bold;"&gt;Ctrl+2, kill&lt;/span&gt; so that PyDev will kill those shells before you actually build it, otherwise that module will be locked and you won't be able to link it -- and tokens wouldn't be updated).&lt;img src="http://feeds.feedburner.com/~r/blogspot/pydev/~4/CMYvSMYgltc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pydev.blogspot.com/feeds/9033309119757211044/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8550962&amp;postID=9033309119757211044" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/9033309119757211044?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/9033309119757211044?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/pydev/~3/CMYvSMYgltc/code-completion-strategies-in-pydev.html" title="Code-completion strategies in PyDev" /><author><name>Fabio Zadrozny</name><uri>http://www.blogger.com/profile/04202246218394712738</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>5</thr:total><feedburner:origLink>http://pydev.blogspot.com/2012/01/code-completion-strategies-in-pydev.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck4HRnk5eyp7ImA9WhRQGUU.&quot;"><id>tag:blogger.com,1999:blog-8550962.post-2538356501225953762</id><published>2011-12-15T12:24:00.000-08:00</published><updated>2011-12-15T12:28:57.723-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-15T12:28:57.723-08:00</app:edited><title>PyDev 2.3.0 released</title><content type="html">PyDev 2.3.0 is out now.&lt;br /&gt;&lt;br /&gt;See &lt;a href="http://pydev.org"&gt;http://pydev.org&lt;/a&gt; for details :)&lt;img src="http://feeds.feedburner.com/~r/blogspot/pydev/~4/EZpz0_gaZP4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pydev.blogspot.com/feeds/2538356501225953762/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8550962&amp;postID=2538356501225953762" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/2538356501225953762?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/2538356501225953762?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/pydev/~3/EZpz0_gaZP4/pydev-230-released.html" title="PyDev 2.3.0 released" /><author><name>Fabio Zadrozny</name><uri>http://www.blogger.com/profile/04202246218394712738</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://pydev.blogspot.com/2011/12/pydev-230-released.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0cERXY7fSp7ImA9WhRQGE8.&quot;"><id>tag:blogger.com,1999:blog-8550962.post-1984496517990088505</id><published>2011-12-13T17:54:00.001-08:00</published><updated>2011-12-13T18:16:44.805-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-13T18:16:44.805-08:00</app:edited><title>Preparing for PyDev 2.3.0</title><content type="html">The major changes in this version will be the introduction of a pep8 analysis (it must be enabled in window &amp;gt; preferences &amp;gt; PyDev &amp;gt; Editor &amp;gt; Code Analysis &amp;gt; pep8) and scope selection/deselection (Shift+Alt+Up/Down).&lt;br /&gt;&lt;br /&gt;The internal Jython version that PyDev uses was bumped from 2.1 to 2.2.1 to support pep8.py -- Jython 2.5 was discarded as an option because it became too big for PyDev (the PyDev distribution with Jython 2.2.1 has 7MB, if it went to Jython 2.5, it'd be around 14MB, so, I think it's not worth making the download twice as big just for this upgrade).&lt;br /&gt;&lt;br /&gt;Also, as a plus, as Jython 2.2.1 is still based on the same grammar structure (JavaCC) that PyDev uses, so, I was able to give it a boost and provide some performance improvements that had been done to the PyDev grammar (Jython 2.5 uses Antlr, which seems to be one of the main reasons it became so big).&lt;br /&gt;&lt;br /&gt;As a nice side-effect of this change, the PyDev startup seems to have improved somewhat (Jython 2.2.1 seems to start up faster than Jython 2.1), and now the Jython sources are included in the PyDev project (and not only a jython.jar), so, I can fine tune Jython itself for some PyDev use-cases (as it seems PyDev won't go for Jython 2.5 anyways).&lt;br /&gt;&lt;br /&gt;There are also some critical bug-fixes in this release (an out of memory error when dealing with PyOpenGL, one cache issue which could make the pythonpath become wrong in memory and one deadlock were fixed).&lt;br /&gt;&lt;br /&gt;So, anyone interested should get the current nightly build to see if all is working properly as an official release should be issued later this week (the current version should be the one released unless some critical issue is found in the meanwhile).&lt;img src="http://feeds.feedburner.com/~r/blogspot/pydev/~4/WOnWkYJlRKg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pydev.blogspot.com/feeds/1984496517990088505/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8550962&amp;postID=1984496517990088505" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/1984496517990088505?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8550962/posts/default/1984496517990088505?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/pydev/~3/WOnWkYJlRKg/preparing-for-pydev-230.html" title="Preparing for PyDev 2.3.0" /><author><name>Fabio Zadrozny</name><uri>http://www.blogger.com/profile/04202246218394712738</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://pydev.blogspot.com/2011/12/preparing-for-pydev-230.html</feedburner:origLink></entry></feed>
