tag:blogger.com,1999:blog-33690264693619728862024-03-13T01:48:16.411-07:00Frapell's Blogfrapellhttp://www.blogger.com/profile/05242205112214267508noreply@blogger.comBlogger14125tag:blogger.com,1999:blog-3369026469361972886.post-1602012327523773872014-04-01T00:01:00.000-07:002014-04-01T13:07:26.181-07:00Emerald Sprint 2014<span style="font-size: large;">I had the chance to attend to another awesome sprint... Winter is ending and the 2014 edition of the <a href="http://www.coactivate.org/projects/emerald-sprint/project-home" target="_blank">Emerald Sprint</a> is on! Another fantastic location, plonistas, designers, hot tub, beer and spirits... what else can you ask for ?<br /><br />This year, I was able to attend to the sprint, sponsored by the Plone experts at</span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.enfoldsystems.com/" target="_blank"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbi5zkvZ4ShI64qe9RpeL585LgOUsjlktYulZDGhlX2JH4Ki0FWfvw4lZpMto27qxxlz0Ktc_7CI16yLKXnyThdnxZTSKnECn-wunRrA7Y4fmgDb7HFj6mk_exF-c_iyKOLM-Kf20pSCg/s1600/Enfold-Logo.png" height="87" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<h2 style="text-align: left;">
<span style="font-size: x-large;">
The trip</span></h2>
<span style="font-size: large;">After a long 33 hour trip from Argentina, I made it to Seattle, where I was kindly hosted by a very good friend, <a href="https://github.com/fulv">Fulvio Casali</a>, in his sailboat, which, we used at the next day to get to the sprint location.</span><br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhS5BAA1ffJI7mh5fOvLiBNwRXzUNZXgfAAmnCUcO0fuja2eVnKtL2t1MDx9EdiwzdDO6wCV5_HN0Mm6p7oHg3wJSB7MWeGxoLqyWao5DisFq-8NE8X9krHU8KyV3PpW2Go3cBxcPFhfOg/s1600/20140317_095559_Richtone(HDR).jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhS5BAA1ffJI7mh5fOvLiBNwRXzUNZXgfAAmnCUcO0fuja2eVnKtL2t1MDx9EdiwzdDO6wCV5_HN0Mm6p7oHg3wJSB7MWeGxoLqyWao5DisFq-8NE8X9krHU8KyV3PpW2Go3cBxcPFhfOg/s1600/20140317_095559_Richtone(HDR).jpg" width="330" /></a></div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEih2EWduM63RRJq9n7Vz4UkLVW2x1-zlX2Ir59PW_VnpTZEQBnQmsbhzkhaAbtYwVfns5nHLrTygYpCGTBv74GpOU6jkEkt545mO8cZTyT4UqJ-V_Jnb4uuOm4nip43RHV9CrAO-KDB9V4/s1600/20140313_111358.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEih2EWduM63RRJq9n7Vz4UkLVW2x1-zlX2Ir59PW_VnpTZEQBnQmsbhzkhaAbtYwVfns5nHLrTygYpCGTBv74GpOU6jkEkt545mO8cZTyT4UqJ-V_Jnb4uuOm4nip43RHV9CrAO-KDB9V4/s1600/20140313_111358.jpg" height="320" width="180" /></a><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<h2>
<span style="font-size: x-large;">The location</span></h2>
<span style="font-size: large;">The location for the 2013 edition of the Emerald sprint was incredible, and the 2014 one, did not fall behind. An amazing house in beautiful Whidbey Island, where 15 Plone developers and 2 designers can relax and create !</span><br />
<div>
<br /></div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgs0H-kYh5aJv9u5wwv5HZ1EqKUL7loW1V0_SFP5aUuV-ZmFUYB-NPw3bZS4-pEvzqfdFGNwJzav33HNGGbl70n1IzIJBFUw70J33T656Zzj1twomObgP5X15zK-x93AQ7rpDnpjferpj4/s1600/20140317_094408_Richtone(HDR).jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgs0H-kYh5aJv9u5wwv5HZ1EqKUL7loW1V0_SFP5aUuV-ZmFUYB-NPw3bZS4-pEvzqfdFGNwJzav33HNGGbl70n1IzIJBFUw70J33T656Zzj1twomObgP5X15zK-x93AQ7rpDnpjferpj4/s1600/20140317_094408_Richtone(HDR).jpg" width="255" /></a>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEjzXo5N5cVhi4Y9hemxNkcufA6LCnIb-49gDWSk1VZQDwf2VN0w_OlXOWOGvvr70uHu4YDHlZtvihph55Er0ugIOJpDeFo5yEX2SBuZo7QMaQyV84V6SQEuVlwqhc1Ov1bzBxr1Y__rs/s1600/20140317_094815_Richtone(HDR).jpg&container=blogger&gadget=a&rewriteMime=image%2F*" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEjzXo5N5cVhi4Y9hemxNkcufA6LCnIb-49gDWSk1VZQDwf2VN0w_OlXOWOGvvr70uHu4YDHlZtvihph55Er0ugIOJpDeFo5yEX2SBuZo7QMaQyV84V6SQEuVlwqhc1Ov1bzBxr1Y__rs/s1600/20140317_094815_Richtone(HDR).jpg" width="255" /></a><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZz6HlKF7h85CRpr-CliqZvIj7pUuL4Az9wCKjBldbzCMQedVs_Rmv-egRA-0jvu9DpHHP7MvZ51AMIRwbLEBndLWHSz7kD6SigzacxSRYaINxW0GaPt3YalQWnfn3z31WP_3uTK-Akoo/s1600/20140317_094350_Richtone(HDR).jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZz6HlKF7h85CRpr-CliqZvIj7pUuL4Az9wCKjBldbzCMQedVs_Rmv-egRA-0jvu9DpHHP7MvZ51AMIRwbLEBndLWHSz7kD6SigzacxSRYaINxW0GaPt3YalQWnfn3z31WP_3uTK-Akoo/s1600/20140317_094350_Richtone(HDR).jpg" height="225" width="400" /></a></div>
<br />
<div style="text-align: center;">
</div>
<span style="font-size: large;">Also, why not, excercise</span><br />
<span style="font-size: large;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidPTcbTF_1AymI1THG42Tm_YrzureT2bTLf-f-1QrubkFWzT8E_LiYp6035Q0ciSgKNRxOaMt_qJsw_cRZVDNyGZlWGJWDZ7BDJ-ggCKXKmDXolivBa0hVuQo2sroGx9ZWVoPB2j7hafs/s1600/20140314_110234.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidPTcbTF_1AymI1THG42Tm_YrzureT2bTLf-f-1QrubkFWzT8E_LiYp6035Q0ciSgKNRxOaMt_qJsw_cRZVDNyGZlWGJWDZ7BDJ-ggCKXKmDXolivBa0hVuQo2sroGx9ZWVoPB2j7hafs/s1600/20140314_110234.jpg" height="225" width="400" /></a></div>
<div class="" style="clear: both; text-align: left;">
<br /></div>
<span style="font-size: large;">Fantastic food by <a href="https://www.linkedin.com/in/skleinfeldt" target="_blank">Sally Kleinfeldt</a>, a lot of bunny ears and even a fire pit! Indeed a nice place to enjoy the great drinks by our own <a href="https://github.com/rpatterson" target="_blank">Ross Patterson</a> and <a href="http://plone.org/community/gin-apocrypha" target="_blank">Gin-Apocrypha</a></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi03C50vSYrVOodO71zqpwLQxOG-m6fAO92y93nvvlc31_7wK6LsvPuJdhRjAl54k23PQtJPPixENyX-wgiXSikypGicq9uk0Qtf4uDTPgWKdrkup0VTZ8K8Ck3oTGbysRppl74933g8GA/s1600/20140314_214712.jpg" imageanchor="1" style="clear: left; display: inline !important; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi03C50vSYrVOodO71zqpwLQxOG-m6fAO92y93nvvlc31_7wK6LsvPuJdhRjAl54k23PQtJPPixENyX-wgiXSikypGicq9uk0Qtf4uDTPgWKdrkup0VTZ8K8Ck3oTGbysRppl74933g8GA/s1600/20140314_214712.jpg" height="180" width="320" /></a></div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDZMGorzy7zYgprfX5-tmynTgSKGXornIIUQdRgM7Rf_axh4iAl7Jf4N-C1gvqBtFDKTs-37kOkfkmvdD_dGwevXl8Vt9OZeUQC5tcUKrC-OEFmOoSosHM4mBfrz92I-iXlniWlAh6O_A/s1600/20140314_220941_LLS.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDZMGorzy7zYgprfX5-tmynTgSKGXornIIUQdRgM7Rf_axh4iAl7Jf4N-C1gvqBtFDKTs-37kOkfkmvdD_dGwevXl8Vt9OZeUQC5tcUKrC-OEFmOoSosHM4mBfrz92I-iXlniWlAh6O_A/s1600/20140314_220941_LLS.jpg" height="320" width="180" /></a><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<h2>
<span style="font-size: x-large;">The Sprint</span></h2>
<div>
<span style="font-size: large;">This year's topic was improving the login story for Plone 5, coming soon to a download server <a href="http://plone.org/download" target="_blank">near you</a>.</span></div>
<span style="font-size: large;">The first day we did some brainstorming, with sticky notes that didn't stick that much... nothing that a bit of duct tape couldn't solve.</span><br />
<span style="font-size: large;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj50YQ40l_HxaC2qzNMW0kVKANyLkxAbnHb7r-fvVdDI13SN4rhBTrA71xijFZQJriqy0_bMmYJ1zdlS_StXGnkobwL0rWqQ90ZE6hRdqSnt5V2Ubd83NU_JXqHNg0Ut3TROEm2W_RHXSE/s1600/20140314_105726.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj50YQ40l_HxaC2qzNMW0kVKANyLkxAbnHb7r-fvVdDI13SN4rhBTrA71xijFZQJriqy0_bMmYJ1zdlS_StXGnkobwL0rWqQ90ZE6hRdqSnt5V2Ubd83NU_JXqHNg0Ut3TROEm2W_RHXSE/s1600/20140314_105726.jpg" width="255" /></a>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicuUGk2c-bzzXq2wBIbFVtbzTql6vn_0e5NhGkX_Zp_isX9hLSA6rfCxyNJHOe9Uir4286v6b588tcxnNtU7Qs8j8bZWTlrCKIRFtWnzo_xlKD0OGS5eUFStsEl0D_cjNjWPy-MLpQqMk/s1600/20140314_105801.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicuUGk2c-bzzXq2wBIbFVtbzTql6vn_0e5NhGkX_Zp_isX9hLSA6rfCxyNJHOe9Uir4286v6b588tcxnNtU7Qs8j8bZWTlrCKIRFtWnzo_xlKD0OGS5eUFStsEl0D_cjNjWPy-MLpQqMk/s1600/20140314_105801.jpg" width="255" /></a></div>
<span style="font-size: large;"><br /></span>
<span style="font-size: large;"><br /></span>
<span style="font-size: large;"><br /></span>
<span style="font-size: large;"><br /></span>
<span style="font-size: large;"><br /></span>
<span style="font-size: large;"><br /></span><span style="font-size: large;">Groups formed into different tasks. I decided to work on rewriting all the old forms that were based on cpt, vpy, and cpy, to modernize them using <a href="https://pypi.python.org/pypi/z3c.form" target="_blank">z3c.form</a></span><br />
<br />
<span style="font-size: large;">Some mockups by the designers that joined us</span><br />
<span style="font-size: large;"><br /></span>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://www.coactivate.org/projects/emerald-sprint/loginprocess/login-mockup.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="http://www.coactivate.org/projects/emerald-sprint/loginprocess/login-mockup.jpg" height="262" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Log in</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://www.coactivate.org/projects/emerald-sprint/loginprocess/signup-mockup.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="http://www.coactivate.org/projects/emerald-sprint/loginprocess/signup-mockup.jpg" height="262" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Sign up</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://www.coactivate.org/projects/emerald-sprint/loginprocess/trouble-mockup.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="http://www.coactivate.org/projects/emerald-sprint/loginprocess/trouble-mockup.jpg" height="262" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Need help?</td></tr>
</tbody></table>
<span style="font-size: large;">Pretty nice, huh ?</span><br />
<span style="font-size: large;">So, we (<a href="https://github.com/ableeb" target="_blank">Andy</a>, <a href="https://github.com/cbcunc" target="_blank">Chris</a>, <a href="https://github.com/cewing" target="_blank">Cris</a>, <a href="https://github.com/esteele" target="_blank">Eric</a>, <a href="https://github.com/gforcada" target="_blank">Gil</a>, <a href="https://github.com/eleddy" target="_blank">Liz</a>, <a href="https://github.com/feesh" target="_blank">Trish</a>, and <a href="https://github.com/frapell" target="_blank">me</a>) started working in a new package that eventually will be merged with <a href="https://pypi.python.org/pypi/plone.app.users" target="_blank">plone.app.users</a>, called <a href="https://github.com/plone/plone.login" target="_blank">plone.login</a>.</span><br />
<span style="font-size: large;"><br /></span>
<span style="font-size: large;">A lot of work was made, and we managed to push <a href="https://github.com/plone/plone.login/commits/master" target="_blank">180 commits</a> in 3 days!</span><br />
<span style="font-size: large;"><br /></span>
<span style="font-size: large;">The strategy was to start with basic forms first, and then start adding additional functionality.</span><br />
<span style="font-size: large;"><br /></span>
<br />
<h3>
<span style="font-size: large;">Registration form</span></h3>
<div>
<span style="font-size: large;">Registering to the site works, and it will validate proper email and username were entered. It will also check if a user is already registered with that username.</span></div>
<div>
<span style="font-size: large;">After successfuly registering, it will automatically log you in.</span></div>
<div>
<span style="font-size: large;">Federated login and password strength are there only as placeholders.</span></div>
<div>
<span style="font-size: large;">It is still not wired to the "Let users select their own password" option in the security tab.</span></div>
<div>
<span style="font-size: large;"><br /></span></div>
<h3>
<span style="font-size: large;">Login form</span></h3>
<span style="font-size: large;">Loggin in to the site works. In the case you are asked to login because you don't have permissions to access a specific page, it will redirect to it after loggin in.</span><br />
<span style="font-size: large;">Federated login is also left here as placeholder, and it doesn't yet provide the "Remember me" kind of checkbox.</span><br />
<span style="font-size: large;">Also the came_from needs a bit of love handling some specific scenarios, and to allow to <b>easily customize it</b> ;)</span><br />
<span style="font-size: large;"><br /></span>
<br />
<h3>
<span style="font-size: large;">Login help</span></h3>
<div>
<span style="font-size: large;">This view will allow you to recover your username and/or password, in case you forgot any of them.</span></div>
<div>
<span style="font-size: large;">It's not yet functional, and also needs options from the control panel to control which of them are allowed, or maybe even neither.</span><br />
<span style="font-size: large;"><br /></span>
<br />
<h3>
<span style="font-size: large;">Insufficient privileges</span></h3>
</div>
<span style="font-size: large;">This view asks you to login, if you are not, and you are trying to access a private page. If you are logged in already, it will clearly state that you are logged in, but you don't have permission to access it.</span><br />
<span style="font-size: large;">It is not there yet, but eventually, it will allow you to "Ask access", in which case, a person with proper permissions will get notified and decide to give that person access.</span><br />
<span style="font-size: large;"><br /></span>
<br />
<h3>
<span style="font-size: large;">Complete your profile</span></h3>
<div>
<span style="font-size: large;">This is a new view introduced now. Plone 5 will allow you to customize the fields the users of the site will have, by using a <a href="https://dev.plone.org/ticket/13350" target="_blank">through-the-web tool</a>, very similar to the one used for managing dexterity fields. Steve wrote a nice <a href="http://www.stevemcmahon.com/steves-blog/user-property-frolics-on-the-sound" target="_blank">blog post</a> about the work done in the sprint, where you can read more about this.</span></div>
<div>
<span style="font-size: large;">This tool will allow you to choose which fields are required, so, after registering to the site, a user will get redirected to this view, which will ask to complete his profile, as opposed to having a huge register form.</span></div>
<div>
<span style="font-size: large;">I'm not sure, but I think this functionality needs further discussion, and the view, further work.</span></div>
<span style="font-size: large;"><br /></span>
<span style="font-size: large;"><br /></span>
<br />
<h2>
<span style="font-size: x-large;">That's it folks!</span></h2>
<span style="font-size: large;">Even that a lot was done during the sprint, this still needs a lot of work, adding more and more functionality and finishing up others... also tests, tests, and more tests!</span><br />
<span style="font-size: large;"><br /></span>
<span style="font-size: large;">Want to help? great! clone <a href="https://github.com/plone/plone.login" target="_blank">plone.login</a>, run the buildout and commit changes! </span><span style="font-size: large;">By the way, the product works in Plone 4 ( wink, wink... )</span><br />
<br />
<span style="font-size: large;">See you in the next Emerald Sprint !</span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiI70nXMRmV_JB2ugjrw5o5jxBQTWe789vwL2OjEcNPElupdQKr5Qndfu7gcuoqu0T6Emsuv38GgGUu8ldK4flNEbSjRqDiDWO3-32R559eBsqdvpDSTzuVy45iFzvjN-bB9uTMRHjf4g0/s1600/20140317_094643_Richtone(HDR).jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiI70nXMRmV_JB2ugjrw5o5jxBQTWe789vwL2OjEcNPElupdQKr5Qndfu7gcuoqu0T6Emsuv38GgGUu8ldK4flNEbSjRqDiDWO3-32R559eBsqdvpDSTzuVy45iFzvjN-bB9uTMRHjf4g0/s1600/20140317_094643_Richtone(HDR).jpg" height="224" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRz-sQ3RpEvnnaHqpbbtxFGk0D4w7Waf-w4BC93sU8u26JYcWTQH_oViXdyI3DU_vPB8RFEQaQurDrJ1PdjihNkULEMr0WCfjw96Y7ejH1Ivt4S11dVT8WTfLOXHfrEhlQtW8PrZ8CH64/s1600/1979184_10102533234030523_1593021550_o.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRz-sQ3RpEvnnaHqpbbtxFGk0D4w7Waf-w4BC93sU8u26JYcWTQH_oViXdyI3DU_vPB8RFEQaQurDrJ1PdjihNkULEMr0WCfjw96Y7ejH1Ivt4S11dVT8WTfLOXHfrEhlQtW8PrZ8CH64/s1600/1979184_10102533234030523_1593021550_o.jpg" height="300" width="400" /></a></div>
<br />
<br />
<br />
<h2>
<span style="font-size: x-large;">Bonus Track</span></h2>
<span style="font-size: large;">A great video made by Trish about the event <a href="http://vimeo.com/89478853" target="_blank">here</a></span><br />
<br />
<h2 style="text-align: center;">
<span style="font-size: x-large;">More mockups by <a href="https://medium.com/@cydoval" target="_blank">Cal Doval</a></span></h2>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_omp1eEaeHXTkyC0i5k6WPQ9KlpKmvAJxjm3SMgnCSu_78MVAVP5MB_6BAbR6_APE0H6Xcxa6DD61r3YoIBm7WQTFmTYK4-CosMMq7wxKrUV4gzMtE1vDYBI6MeKNkGhMRVKzXZvV2CY/s1600/barceloneta_author_view.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_omp1eEaeHXTkyC0i5k6WPQ9KlpKmvAJxjm3SMgnCSu_78MVAVP5MB_6BAbR6_APE0H6Xcxa6DD61r3YoIBm7WQTFmTYK4-CosMMq7wxKrUV4gzMtE1vDYBI6MeKNkGhMRVKzXZvV2CY/s1600/barceloneta_author_view.jpg" height="328" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Users profile in "Edit mode"</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXocdyNcv1LbKz5LmxBepwItuenU5eYKTuegbPhyphenhyphenRL0GBAwXGSruFj9Lc-EonqQZbuUaQF-bcxfl1qMPQMiz1GVjtEKh5h_AgucPJLIfUH4RxB_c4FOKaIToPXAWUNHJ2oELxbqQRFqjE/s1600/barceloneta_public_author_view.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXocdyNcv1LbKz5LmxBepwItuenU5eYKTuegbPhyphenhyphenRL0GBAwXGSruFj9Lc-EonqQZbuUaQF-bcxfl1qMPQMiz1GVjtEKh5h_AgucPJLIfUH4RxB_c4FOKaIToPXAWUNHJ2oELxbqQRFqjE/s1600/barceloneta_public_author_view.jpg" height="328" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Users profile in "Public mode"</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyU_wSKuCOQt09e6AV6bu_8EDwhlVPpw7NLpAWqQEBJzj-BEAoIBLsrsq-zULrj-bPjU1LcO6CTRg0SPLfGFZMpnd8uQTbMpzkv1Cc2dV0i5N_1UYB90t3O1qVMc9uqteaLFNxyhSFdng/s1600/barceloneta_controlpanel_addon.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyU_wSKuCOQt09e6AV6bu_8EDwhlVPpw7NLpAWqQEBJzj-BEAoIBLsrsq-zULrj-bPjU1LcO6CTRg0SPLfGFZMpnd8uQTbMpzkv1Cc2dV0i5N_1UYB90t3O1qVMc9uqteaLFNxyhSFdng/s1600/barceloneta_controlpanel_addon.jpg" height="400" width="373" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">The "Add-ons" panel</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYgU5Ez-IC4m-_D3nipOzaQg38TpIIVUVsUhCF27YcicFiIy5tnJcI1KB_NoFcXERK5xNFCqPVEnHWnU6LE7r6cyOQci38rM0o1SllwnQW6n2XUBUyABxu1H0S38ynraU8dA7Eg6R5Pwk/s1600/barceloneta_controlpanel_security.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYgU5Ez-IC4m-_D3nipOzaQg38TpIIVUVsUhCF27YcicFiIy5tnJcI1KB_NoFcXERK5xNFCqPVEnHWnU6LE7r6cyOQci38rM0o1SllwnQW6n2XUBUyABxu1H0S38ynraU8dA7Eg6R5Pwk/s1600/barceloneta_controlpanel_security.jpg" height="400" width="373" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">The "Site security" panel</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgErC_wD1zhF4bXeQMscQocMZb5IujiaVmd6GYsrkwJ1IZhLppGm7cEgIoIp9bvu3-aigbV5Moe7lKYucpnRr2Abo8vulc7ODsHMd8RaiampAjPdVUyGfsNhyz1Tk9MM1yY2PDY2sa60EA/s1600/barceloneta_controlpanel_usersettings.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgErC_wD1zhF4bXeQMscQocMZb5IujiaVmd6GYsrkwJ1IZhLppGm7cEgIoIp9bvu3-aigbV5Moe7lKYucpnRr2Abo8vulc7ODsHMd8RaiampAjPdVUyGfsNhyz1Tk9MM1yY2PDY2sa60EA/s1600/barceloneta_controlpanel_usersettings.jpg" height="400" width="373" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">The "User settings" panel</td></tr>
</tbody></table>
<!-- Blogger automated replacement: "https://images-blogger-opensocial.googleusercontent.com/gadgets/proxy?url=http%3A%2F%2F2.bp.blogspot.com%2F-honanU-RMxI%2FUzo4IMUwtgI%2FAAAAAAAAi-U%2Fp8CmH1Hqeo8%2Fs1600%2F20140317_094815_Richtone" with "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEjzXo5N5cVhi4Y9hemxNkcufA6LCnIb-49gDWSk1VZQDwf2VN0w_OlXOWOGvvr70uHu4YDHlZtvihph55Er0ugIOJpDeFo5yEX2SBuZo7QMaQyV84V6SQEuVlwqhc1Ov1bzBxr1Y__rs/s1600/20140317_094815_Richtone" -->frapellhttp://www.blogger.com/profile/05242205112214267508noreply@blogger.com1tag:blogger.com,1999:blog-3369026469361972886.post-57551191292742833842013-10-10T15:52:00.000-07:002013-10-10T15:52:23.069-07:00Including Plone Mockup in your own project ( Part 2 )2 months ago, I wrote a blog post: <a href="http://blog.frapell.com.ar/2013/08/including-plone-mockup-in-your-own.html" target="_blank">Including Plone Mockup in your own project</a>, and now, after some feedback from people trying it, and work done in the sprints after PloneConf 2013, I'm writing this new entry with changes from the recent version (0.0.4) of the package.<br />
<br />
<h3>
Version Bugfix</h3>
<div>
The generator allowed to use any format for versioning, and 'npm install' complains if the version is not in the X.Y.Z format. So now, if you specify a version shorter, the generator will add ".0" as necessary at the end. If it is longer, it will remove the extra ones. For example:</div>
<div>
<ul>
<li>"1" -> "1.0.0"</li>
<li>"1.2" -> "1.2.0"</li>
<li>"0.2.0.5" -> "0.2.0"</li>
</ul>
<div>
<br /></div>
<h3>
UglifyJS, CssMin and LESS</h3>
</div>
<div>
Up to now, the package was generating a widgets.min.js, giving the wrong impression that this was a minified Javascript, when it wasn't the case. Now, not only the name was changed to "bundle", but also, you will get, after compiling, a "bundle.js" and a "bundle.min.js", the latter being the uglified version of the first one.</div>
<div>
<br /></div>
<div>
Also, after running "grunt", you will get a "bundle.css", which is generated from "less/bundle.less", and a "bundle.min.css", which is the minified version, of course.</div>
<div>
At this point, this file includes everything from the mockup project, you should modify it to include any specific you might need.</div>
<div>
<br /></div>
<h3>
Development Mode</h3>
<div>
Before 0.0.4, you needed to compile your changes to your patterns/bundle, and then with the compiled Javascript file, test it in your project.</div>
<div>
This is no longer the case. Now, there's a new folder created, called "dev", where you will find a "dev.html" and a "dev.js" files.</div>
<div>
You don't need to pay much attention to dev.js, this is what will include require.js and configure it, to import your bundle with its dependencies.</div>
<div>
<br /></div>
<div>
So, now to develop your pattern, all you need to do is add relevant HTML code to "dev.html" and open the file with your browser.</div>
<div>
Any change you do to your patterns/bundle will get reflected in the browser with just a refresh.</div>
<div>
<br /></div>
<div>
Finally, when everything is ready, you can compile as usual and include your compiled Javascript into your project, as usual.</div>
<div>
<br /></div>
<h3>
Test Skeleton</h3>
<div>
From version 0.0.4, all the configuration needed to run tests, and a test skeleton is already included after "yo" finishes. All you need to do is go to the "tests" folder, open the "pattern-[something]-test.js" file, add some tests, save the file, and then from the package, run "grunt test".</div>
<div>
If instead of "PhantomJS", you would like tests to be run using Chrome (or Chromium), just run "grunt karma:dev_chrome"</div>
<div>
<br /></div>
<h3>
Minor Changes</h3>
<div>
<ul>
<li>As mentioned before, the bundle file is no longer called "widgets.js", but, "bundle.js".<br />Also the compiled files are called "bundle".</li>
<li>Now the generator, includes a README.md, so 'npm install' doesn't give a warning about it.</li>
</ul>
<div>
<br /></div>
</div>
<h3>
Known Bugs</h3>
<div>
Do not use spaces for neither your project name, or pattern name.</div>
<div>
<a href="https://github.com/collective/generator-plonemockup/issues/3">https://github.com/collective/generator-plonemockup/issues/3</a></div>
<div>
<br /></div>
<div>
Happy mock'ing ! :)</div>
<div>
<br /></div>
<div>
<br /></div>
frapellhttp://www.blogger.com/profile/05242205112214267508noreply@blogger.com2tag:blogger.com,1999:blog-3369026469361972886.post-89076070132447679372013-08-05T09:31:00.000-07:002013-10-11T07:07:52.397-07:00Including Plone Mockup in your own project<h3>
Introduction</h3>
<a href="https://github.com/plone/mockup" target="_blank">Plone Mockup</a> is going to be the future in Javascript development in Plone from version 5.0 and up. If you still don't know what is this all about, here are a couple of links to get you started:<br />
<br />
<ul>
<li><a href="http://garbas.si/blog/2013/patternslib-plone-mockup-ok-time-to-explain-it" target="_blank">Plone Mockup</a>, from the mastermind behind it.</li>
<li><a href="http://plone.github.io/mockup/dev/#about" target="_blank">Official docs</a></li>
<li><a href="http://plone.github.io/mockup/dev/#patterns" target="_blank">List of existing patterns</a></li>
<li><a href="https://github.com/plone/plone.app.widgets" target="_blank">plone.app.widgets</a>, the project that brings mockup to Plone 4.x</li>
<li><a href="http://2013.ploneconf.org/program/pc/plone_ui/patterns-the-new-javascript-framework" target="_blank">My talk for PloneConf 2013</a></li>
</ul>
<div>
This blogpost, however, is not about an introduction to patterns, mockup, and all that, and assumes you already know the basics.</div>
<div>
<br /></div>
<div>
From July 23rd to the 26th, in the city of Rosario, Argentina, the second edition of the <a href="http://plone.org/events/community/cafecito-sprint-rosario" target="_blank">Cafecito Sprint</a> was held, and although working on Mockup is not listed among the primary goals, it was one. And so, I worked on finding an easy way to let people include and develop patterns for their projects.<br />
<br /></div>
<h3>
Let's get started</h3>
<div>
UPDATE 2013/10/10: There's a follow-up with some stuff that was changed since this write up, please go <a href="http://blog.frapell.com.ar/2013/10/including-plone-mockup-in-your-own.html" target="_blank">here</a> and read about them if something here no longer works.</div>
<div>
<br /></div>
<div>
There are 2 major code "locations" to pay attention in Mockup:</div>
<div>
<ul>
<li><a href="https://github.com/plone/mockup/tree/master/js/patterns" target="_blank">Patterns</a></li>
<li><a href="https://github.com/plone/mockup/tree/master/js/bundles" target="_blank">Bundles</a></li>
</ul>
<div>
The "Patterns" location is where all the different patterns are developed. </div>
<div>
(For the ones getting started with patterns, mockup, etc, as a quick tip, I would suggest to take a look into the "accesibility.js" or the "tablesorter.js" ones, to get started with really easy ones, and then go ahead and check a more complex one, such as "modal.js".)</div>
</div>
<div>
<br /></div>
<div>
The "Bundles" location is where bundles are (shocking!). Basically this will be the place to list the patterns you wish to include with your project, and where you will include code you want to get executed prior to the registry scanning the DOM. (Take your time to check how plone.app.widgets work to get a better understanding of all this...)</div>
<div>
<br /></div>
<div>
After compiling this code, you get the Javascript file you need to include in your project. This should be the only Javascript you need to include, as it contains everything.</div>
<div>
<br /></div>
<div>
Now, what happens if you want to use some patterns, not all of them, and/or you want to keep using your old Plone Javascript (without replacing it with patterns, as plone.app.widgets does.)?</div>
<div>
<br /></div>
<div>
Say hello to <a href="https://github.com/collective/generator-plonemockup" target="_blank">generator-plonemockup</a> (This package is most probably going to be merged into <a href="https://github.com/plone/mockup" target="_blank">Mockup</a> itself in the future)</div>
<div>
<br /></div>
<div>
This new product, is the result of my research and work in the Cafecito Sprint, and is a generator intended to be used with <a href="http://yeoman.io/" target="_blank">Yeoman</a>, which is a tool used by Javascript developers to generate new projects, get their dependencies, and build/compile the final product. If you don't know this set of tools, I suggest you read its docs and play around with it for a bit.</div>
<div>
<br /></div>
<h3>
Enough introduction, let's get our hands dirty</h3>
<div>
Assuming you have Yeoman tools already installed (globally), all you need to do is the following:</div>
<div>
<ol>
<li>Install plonemockup generator using npm<br /><br />$ npm install -g generator-plonemockup<br /><br />If you didn't have any network, or "global npm" related issues, you should end up with the generator installed.<br />Note: I had problems with "bower" 1.0.0, so I had to downgrade to version 0.10.0</li>
<li>Create your project<br /><br />$ yo plonemockup<br /><br />Note: Bear in mind that "yo" assumes your project's directory is the current directory, so all files and folders will be generated in the current path, instead of a new folder with the project name.<br /><br />You will be presented with some questions, that if you answer them correctly, you shouldn't need to manually rename, move, etc any files or configuration options.<br />I recommend you generate some test projects just to see what each option will result in the generated project.</li>
<li>Make sure that when the process ends, you didn't get any errors, and that you do, in fact, have a folder in the current directory named "bower_components". If you don't, then you may need to downgrade "bower", and re-run "bower install" to get dependencies.</li>
<li>(optional) Install additional dependencies your pattern may need.</li>
</ol>
<div>
If you reached this far, you should now have a bunch of files in your current directory, and you are ready to start coding your own pattern, bundle, or both.</div>
</div>
<div>
Take a look at config.js, as here are listed the paths for getting each component when compiling the final Javascript that you will use in your project.</div>
<div>
<br /></div>
<div>
Let's go ahead and open <strike>"js/bundles/widgets.js"</strike> "js/bundles/bundle.js" file. And let's say, all you want is the "tablesorter" pattern in your project and nothing else. Where it says "<!~~ Add patterns below this line ~~!>", you should see the pattern that the generator created, listed below, named "[project_name]-patterns-[pattern_name]", so this name will depend on the names you used when answering the questions up there.</div>
<div>
Since we are not developing a new pattern, then just replace this with "mockup-patterns-tablesorter", which is the name for the tablesorter pattern (check config.js file).</div>
<div>
<br /></div>
<div>
Save the file, and go to the project directory and run "grunt". You should see the directory paths for the dependencies, and an ending message saying: "Done, without errors.".</div>
<div>
If this is the case, then you should get a <strike>"build/widgets.min.js" (which, at the moment of this writing, is not automatically minified, as the filename suggests)</strike> "build/bundle.js" and a minified version "build/bundle.min.js".</div>
<div>
<br /></div>
<div>
In order to test that everything worked fine, you can create a test html including this generated Javascript (along with the jquery you intend to use, since that is the only dependency not included with the result Javascript), and a table:</div>
<div>
<br /></div>
<div>
Check <a href="http://pastie.org/8208591" target="_blank">this example</a>, which includes the compiled Javascript, the jquery and a table as defined in the <a href="http://plone.github.io/mockup/dev/#patterns/tablesorter" target="_blank">tablesorter example</a></div>
<div>
<br /></div>
<div>
Of course, this bundle *only* includes this pattern, but you get the idea... you should list all the patterns you wish to use, and if you plan to develop your own, then do not remove the line we removed initially, and go to the js file that was created inside "js/patterns" to do the development.</div>
<div>
<br /></div>
<div>
If you want to develop additional patterns, then all you need to do is copy the same "skeleton" of this js file with a new name, and make sure you update the config.js accordingly.</div>
<div>
<br /></div>
<div>
If you want to include everything the Plone Mockup brings, and code "on top" of it, all you need to do is remove the comment from "mockup-bundles-widgets". This will cause everything (including the bundle) from Mockup to be included.</div>
<div>
<br /></div>
<div>
Finally, as plone.app.widgets does, everything you put into "transform", will be executed before having the registry to scan the DOM, so you can make any changes you need here.</div>
<div>
<br /></div>
<h3>
What remains to be done</h3>
<div>
At this moment, the generator is at version 0.0.2, and what I would like to have in future versions:</div>
<div>
<ul>
<li>Tests for the generator</li>
<li><strike>Generate proper test skeleton with the resulting project (after running the generator)</strike> (Done as of version 0.0.4, read <a href="http://blog.frapell.com.ar/2013/10/including-plone-mockup-in-your-own.html" target="_blank">here</a>)</li>
<li>Have a subgenerator to genereate patterns (provided we can get the project name when running the subgenerator)</li>
</ul>
<div>
<br /></div>
</div>
<div>
So, start using it, report bugs, enhancements, and (preferably :P) pull requests.</div>
<div>
<br /></div>
frapellhttp://www.blogger.com/profile/05242205112214267508noreply@blogger.com5tag:blogger.com,1999:blog-3369026469361972886.post-70109982768414164142010-12-17T06:26:00.000-08:002010-12-17T10:55:36.000-08:00El adiós a un grandeEn el día de ayer (Jueves 16 de Diciembre del 2010) se despidieron los restos de una de las personas más grandes que tuve el gusto de conocer, el Dr. Julio César Salazar.<br />Yo lo conocía desde poco menos de un año, y en ese tiempo, pude ver lo excelente persona que era. Que se vio evidenciado en su despedida. Muy emotiva, repleta de gente, familiares, amigos y mucho más.<br /><br />Son estos momentos, los que a uno le hacen pensar y darse cuenta, cuales son las cosas que hacen "grande" a una persona. Cuales son las acciones que marcan una huella profunda en la vida de los que nos rodean. Qué es una verdadera "riqueza"... y ésta no es tener millones de dolares, casas, vehículos, etc. Es que miles de personas te lleven en sus memorias y en sus corazones, gracias a tus buenas acciones completamente desinteresadas.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgC50OeNYAXDjyBVTugox5eVKjRkN2EOj7SKcxj7_tligJPcrj3LOKWs9LL3Mt2IaY6JfEh4hEpl6s4PX-pM-sJxINdqOyYjjzlBHW07AkU_sG7JSA8nLAPZdreQGdngNyXhL8OWU8p-Oc/s1600/velatorio.jpeg"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 399px; height: 223px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgC50OeNYAXDjyBVTugox5eVKjRkN2EOj7SKcxj7_tligJPcrj3LOKWs9LL3Mt2IaY6JfEh4hEpl6s4PX-pM-sJxINdqOyYjjzlBHW07AkU_sG7JSA8nLAPZdreQGdngNyXhL8OWU8p-Oc/s320/velatorio.jpeg" alt="" id="BLOGGER_PHOTO_ID_5551714797481613090" border="0" /></a><blockquote>Que vale más? haber amasado una fortuna monetaria o una fortuna sentimental? que a tu velorio vayan un puñado de interesados por obtener tajada en lo que dejaste o que vaya todo un pueblo porque sienten profundamente que te hayas ido ?</blockquote><br />Una de las cosas que dijo el padre en el velatorio fue "Quien no le debe algo a julito?", evidenciando así la completa entrega de Julio por ayudar a quien lo necesitara, recibiendo cualquier cosa a cambio de atención medica, inclusive a veces nada... lo cual me trajo instantáneamente a mi cabeza al <a href="http://es.wikipedia.org/wiki/Ren%C3%A9_Favaloro">Dr. René Favaloro</a>. Quizás Julio no fue tan conocido, o no realizó una obra tan significativa como Favaloro, pero considero que su entrega, dedicación, pasión por lo que hacía, instinto de ayudar sin importar nada, ética, moral, y sus valores personales, fueron iguales.<br /><br />Y a pesar de haber sido una persona excepcional, la vida lo trató de la peor forma... dándole una terrible enfermedad que lo mantuvo sufriendo durante meses. Una asquerosa injusticia de la cual no existe libro de quejas para reclamar.<br /><br />El mundo perdió a una persona excelente, a un flor de tipo, de esos que hay pocos.<br /><br />Querido Julito, para concluir este breve escrito, me despido hasta siempre, con las mismas últimas palabras que me dijiste:<br />"Te voy a extrañar mucho"<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj47NgHcGL8vb6mE8ZIrjw_XTG8CtqDizkrYR2xyxIk5dJb5SGfklvXRaZLA2J5mZAiRHgUYvWRQs4mmGSCk_dqKItMdgTJHGosVvfLQCX1lbDvKY4HvSwK_H-b19_vKZPRLXi43FoqCNA/s1600/Julito.jpg"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 233px; height: 320px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj47NgHcGL8vb6mE8ZIrjw_XTG8CtqDizkrYR2xyxIk5dJb5SGfklvXRaZLA2J5mZAiRHgUYvWRQs4mmGSCk_dqKItMdgTJHGosVvfLQCX1lbDvKY4HvSwK_H-b19_vKZPRLXi43FoqCNA/s320/Julito.jpg" alt="" id="BLOGGER_PHOTO_ID_5551726658997954178" border="0" /></a><br />Q.E.P.D - Dr. Julio César Salazar (09/07/1951 - 15/12/2010)frapellhttp://www.blogger.com/profile/05242205112214267508noreply@blogger.com3tag:blogger.com,1999:blog-3369026469361972886.post-9934785417531641162010-06-08T15:35:00.000-07:002011-12-17T10:12:46.696-08:00Problema con StoneageHTML y cssutilsSi has llegado a este post por realizar una busqueda en tu buscador favorito, lo mas probable que sea porque te has topado con el mismo problema que me hizo renegar unas buenas horas. Y es ese el motivo por el cual agrego esta entrada a mi blog, quizas a alguien mas le ahorra un par de horas.
<br />
<br />
<br />
<pre><blockquote>
Time 2010/05/31 14:28:38.352 GMT-3
<br />
User Name (User Id) xxxxxxxx (xxxxxxxx)
<br />
Request URL
<br />
http://xxxxxxxxxxxxxxxx:8080/[…]/newsletter-stats.html
<br />
Exception Type AttributeError
<br />
Exception Value 'list' object attribute 'append' is read-only
<br />
<br />
Traceback (innermost last):
<br />
<br />
* Module ZPublisher.Publish, line 119, in publish
<br />
* Module ZPublisher.mapply, line 88, in mapply
<br />
* Module ZPublisher.Publish, line 42, in call_object
<br />
* Module plone.z3cform.layout, line 49, in __call__
<br />
* Module Shared.DC.Scripts.Bindings, line 313, in __call__
<br />
* Module Shared.DC.Scripts.Bindings, line 350, in _bindAndExec
<br />
* Module Products.PageTemplates.PageTemplateFile, line 129, in _exec
<br />
* Module Products.PageTemplates.PageTemplate, line 89, in pt_render
<br />
* Module zope.pagetemplate.pagetemplate, line 117, in pt_render
<br />
* Module zope.tal.talinterpreter, line 271, in __call__
<br />
* Module zope.tal.talinterpreter, line 346, in interpret
<br />
* Module zope.tal.talinterpreter, line 891, in do_useMacro
<br />
* Module zope.tal.talinterpreter, line 346, in interpret
<br />
* Module zope.tal.talinterpreter, line 536, in do_optTag_tal
<br />
* Module zope.tal.talinterpreter, line 521, in do_optTag
<br />
* Module zope.tal.talinterpreter, line 516, in no_tag
<br />
* Module zope.tal.talinterpreter, line 346, in interpret
<br />
* Module zope.tal.talinterpreter, line 891, in do_useMacro
<br />
* Module zope.tal.talinterpreter, line 346, in interpret
<br />
* Module zope.tal.talinterpreter, line 536, in do_optTag_tal
<br />
* Module zope.tal.talinterpreter, line 521, in do_optTag
<br />
* Module zope.tal.talinterpreter, line 516, in no_tag
<br />
* Module zope.tal.talinterpreter, line 346, in interpret
<br />
* Module zope.tal.talinterpreter, line 949, in do_defineSlot
<br />
* Module zope.tal.talinterpreter, line 346, in interpret
<br />
* Module zope.tal.talinterpreter, line 536, in do_optTag_tal
<br />
* Module zope.tal.talinterpreter, line 521, in do_optTag
<br />
* Module zope.tal.talinterpreter, line 516, in no_tag
<br />
* Module zope.tal.talinterpreter, line 346, in interpret
<br />
* Module zope.tal.talinterpreter, line 957, in do_defineSlot
<br />
* Module zope.tal.talinterpreter, line 346, in interpret
<br />
* Module zope.tal.talinterpreter, line 536, in do_optTag_tal
<br />
* Module zope.tal.talinterpreter, line 521, in do_optTag
<br />
* Module zope.tal.talinterpreter, line 516, in no_tag
<br />
* Module zope.tal.talinterpreter, line 346, in interpret
<br />
* Module zope.tal.talinterpreter, line 891, in do_useMacro
<br />
* Module zope.tal.talinterpreter, line 346, in interpret
<br />
* Module zope.tal.talinterpreter, line 957, in do_defineSlot
<br />
* Module zope.tal.talinterpreter, line 346, in interpret
<br />
* Module zope.tal.talinterpreter, line 536, in do_optTag_tal
<br />
* Module zope.tal.talinterpreter, line 521, in do_optTag
<br />
* Module zope.tal.talinterpreter, line 516, in no_tag
<br />
* Module zope.tal.talinterpreter, line 346, in interpret
<br />
* Module zope.tal.talinterpreter, line 534, in do_optTag_tal
<br />
* Module zope.tal.talinterpreter, line 516, in no_tag
<br />
* Module zope.tal.talinterpreter, line 346, in interpret
<br />
* Module zope.tal.talinterpreter, line 949, in do_defineSlot
<br />
* Module zope.tal.talinterpreter, line 346, in interpret
<br />
* Module zope.tal.talinterpreter, line 536, in do_optTag_tal
<br />
* Module zope.tal.talinterpreter, line 521, in do_optTag
<br />
* Module zope.tal.talinterpreter, line 516, in no_tag
<br />
* Module zope.tal.talinterpreter, line 346, in interpret
<br />
* Module zope.tal.talinterpreter, line 949, in do_defineSlot
<br />
* Module zope.tal.talinterpreter, line 346, in interpret
<br />
* Module zope.tal.talinterpreter, line 586, in do_setLocal_tal
<br />
* Module zope.tales.tales, line 696, in evaluate
<br />
URL: controlpanel
<br />
Line 10, Column 4
<br />
Expression: <pathexpr>
Names:
{'container': <channelcontainer>,
'context': <channelcontainer>,
'default': <object><p>
,
</p>
<p>
'here': <channelcontainer>,
<br> 'loop': {},
<br> 'nothing': None,
<br> 'options': {'args': ()},
<br> 'repeat': <products.pagetemplates.expressions.safemapping>,
<br> 'request': <httprequest, <br="">URL=http://xxxxxxxxxxxxxxxx:8080/[…]/newsletter-stats.html>,
<br> 'root': <application>,
<br> 'template': <implicitacquirerwrapper>,
<br> 'traverse_subpath': [],
<br> 'user': <ploneuser>,
<br> 'view': <products.five.metaclass.myformwrapper>,
<br> 'views': <zope.app.pagetemplate.viewpagetemplatefile.viewmapper <br="" at="" object="">0xb0e04a8c>}
<br>
<br> * Module zope.tales.expressions, line 217, in __call__
<br> * Module Products.PageTemplates.Expressions, line 161, in _eval
<br> * Module Products.PageTemplates.Expressions, line 123, in render
<br> * Module plone.z3cform.layout, line 58, in contents
<br> * Module plone.z3cform.layout, line 66, in render_form
<br> * Module z3c.form.form, line 189, in __call__
<br> * Module plone.z3cform.crud.crud, line 381, in update
<br> * Module plone.z3cform.crud.crud, line 229, in update
<br> * Module z3c.form.form, line 186, in update
<br> * Module z3c.form.action, line 99, in execute
<br> * Module z3c.form.button, line 302, in __call__
<br> * Module z3c.form.button, line 170, in __call__
<br> * Module collective.dancing.browser.stats, line 124, in handle_process_jobs
<br> * Module collective.singing.async, line 22, in process
<br> * Module collective.singing.async, line 37, in __call__
<br> * Module collective.dancing.browser.sendnewsletter, line 51, in _assemble_messages
<br> * Module collective.singing.scheduler, line 117, in __call__
<br> * Module collective.singing.scheduler, line 109, in render_message
<br> * Module collective.dancing.composer, line 307, in render
<br> * Module plone.memoize.volatile, line 272, in replacement
<br> * Module collective.dancing.composer, line 297, in _render
<br> * Module stoneagehtml.stoneagehtml, line 91, in compactify
<br> * Module stoneagehtml.stoneagehtml, line 208, in compactify
<br> * Module cssutils.css.cssstylesheet, line 106, in _setCssRules
<br>
<br>AttributeError: 'list' object attribute 'append' is read-only
<br>
<br>Bien, ahora, a que se debe esto ? bueno, basicamente, en las ultimas versiones del producto cssutils[0] (yo me tope con el problema en la version 0.9.7a4) en el archivo cssutils/css/cssstylesheet.py linea 104, se sobre-escribe el metodo setter del campo cssRules (atributo de la clase), en donde se intenta reemplazar el metodo 'append' de cssRules (parametro de entrada del metodo).
<br>
<br>El problema radica, cuando en lugar de que cssRules (parametro del metodo) sea un cssutils.css.CSSRuleList, sea una lista (tipo built-in de python), lo que provoca que dicha excepcion se levante.
<br>
<br>Esto ultimo, es provocado por la linea 208 del archivo stoneagehtml/stoneagehtml.py del producto StoneageHTML[1]:
<br>
<br>sheet.cssRules = self.filterCSSDeclarations(sheet.cssRules)
<br>
<br>ya que filterCSSDeclarations devuelve una lista (la cual se pasa al setter del cssRules, provocando el crash descripto arriba).
<br>
<br>La solucion, seria que stoneageHTML se actualizara, para funcionar con las ultimas versiones de cssutils, pero al momento de escribir esto, dicha solcion no existe, con lo cual la siguiente solucion es hacer un downgrade de cssutils. En mi caso, lo hice a la 0.9.5 ya que es la que en fechas esta mas cerca del lanzamiento de stoneageHTML 0.1.5, luego de lo cual, el crash desaparecio y todo funciona bien de nuevo.
<br>
<br>Ya me puse en contacto con el desarrollador de StoneageHTML para informarle de este bug, y ver si puede especificar la dependencia de cssutils para que su producto funcione, o que en su defecto saque una version mas nueva de StoneageHTML. Tratare de actualizar la entrada con la informacion que obtenga de el.
<br>
<br>[0] - http://pypi.python.org/pypi/cssutils
<br>[1] - http://pypi.python.org/pypi/StoneageHTML</zope.app.pagetemplate.viewpagetemplatefile.viewmapper></products.five.metaclass.myformwrapper></ploneuser></implicitacquirerwrapper></application></httprequest,></products.pagetemplates.expressions.safemapping></channelcontainer></p>
</object></channelcontainer></channelcontainer></pathexpr>
</blockquote>
</pre>
frapellhttp://www.blogger.com/profile/05242205112214267508noreply@blogger.com0tag:blogger.com,1999:blog-3369026469361972886.post-63353518499478436642009-10-11T11:13:00.000-07:002009-10-11T14:22:52.637-07:00Charla de difusión de herramientas de Software Libre para el diseño (3D principalmente)<div style="text-align: left;">Disclaimer: Las fotos dan asco, lo se :(</div><div><br /></div>Este sábado asistí a la charla que Martin Eschoyez dio en el Pabellón Argentina en el marco del <a href="http://www.animafestival.com.ar/spa/01_home_spa.php">Anima 09</a><div><br /></div><div><span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4rB5mKrsZ5tmp5FI8G8s_nh5FKlUvdyFn7chYfXjFyGXATytF8drEFHikMeCcLmtlHWMEnRQJamtojFwlDUoP8ts7p7gSL1XtIwaSlvhrBz5raNJWpYvKrCVQnIyzJO3C_RIO-9NPjWI/s320/100_9860.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5391453909292442786" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 240px; " /></span></div><div><a href="http://www.animafestival.com.ar/spa/01_home_spa.php"></a><div>Si bien yo hace rato que vengo jugueteando con <a href="http://www.blender.org/">Blender</a>, mi principal motivación para ir fue para ver si aprendía algunas técnicas de modelado, o tips de parte de Martin (el tipo es muy groso, podes ver algo de su laburo <a href="http://www.flickr.com/photos/martineschoyez">aca</a> y <a href="http://www.vimeo.com/user1150455">aca</a>) ya que cuando avanzo un poco en el modelado de algo medianamente complejo, me trabo en cosas simples que no se hacer, y tengo que empezar de cero :-(</div><div><br /></div><div>En fin, la cosa es que me sorprendió (muy felizmente por cierto) ver que la charla tuvo un altísimo componente en cuanto a la difusión del <a href="http://es.wikipedia.org/wiki/Software_libre">Software Libre</a> y contarle un poco a la gente sobre de qué se trata esto, los beneficios que trae a la comunidad, a la sociedad, al aprendizaje, y bueh, todo lo que ya sabemos acerca de las bondades del mismo (si no las sabes, te recomiendo que leas el artículo de la Wikipedia, o que busques en Google al respecto, o de última, cerveza de por medio, te cuento un poco de que se trata ;) )</div><div><br /></div><div>Desgraciadamente "time's a bitch", y el tiempo se fue volando. Asimismo, tuvo tiempo para mostrar algunas cositas de Blender, también algo de <a href="http://inkscape.org/">Inkscape</a> (no sabía LO FACIL que puede ser vectorizar una imagen, realmente quedé sorprendido) y solo llegó a mencionar <a href="http://www.gimp.org/">GIMP</a></div><div><br /></div><div>En cuanto a Blender, modeló un avioncito en 5 minutos usando un cubo y extrudando sus caras (no recuerdo el nombre de esta técnica, si alguien la sabe deje comentario, pero creo que es Cube Modelling ?) y aprovechó en ese modelo para mostrar lo sencillo que es texturizar usando coordenadas UV</div><div><span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcI7s4JpxjmWNPW87WM9XaJigSV8bv6qUSpHN6sTwBDkQ9xjNvlmLpEhO2gfgHMB8yeQlLdQZkrq1cLBwY8Y8DFZvuCEgs-fMzExMnbU7E2qk5fInk3ohy_o-MvxJxl-GvzbDxYR6lNpg/s320/100_9877.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5391453927941914306" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 240px; " /></span></div><div>Luego mostró un poco de cómo riggear un modelo, y como animarlo usando key frames y luego ajustando las curvas IPO.</div><div><br /></div><div><span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik5a8pQuXcbW0SpEyldA723aTsG36l9cIgLcTNnnDIwiZNBHYKqYECNF5SOezHL1bB85mD6uLWw71aFgVKPggiX00oqZNLua1plJO4fzhCkeBvQLRvbUJ9SV1BZHRtQ-XTJNcPYNcI8Yg/s320/100_9871.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5391453925342708130" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 240px; " /></span></div><div>También alcanzó a mostrar así muy velozmente el motor de física integrado, y el de telas (ropa)</div><div>Ahh, y tambien mostro unos renders usando el motor de pelo, que estaban realmente increibles.</div><div><br /></div><div><span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZ8sncqkxQ9dQTqu0pnkWf90rmoE8QAeUMvzau2haD9OMTsuLIX9Rc9iiU0eAjdXUaDZwmSmHF9TcnD3l5XwdZsn6iq3xI92fr9LxZCeVKp4cOkTlo8TYep6SmYs4UizKSL5tvn-hSElg/s320/100_9867.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5391453915016186386" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 240px; " /></span></div><div>Lamentablemente no alcanzó a mostrar el (en mi opinión) caballito de batalla, el cual es el motor de fluidos.</div><div><br /></div><div>Por último modeló y riggeó la mascota del evento (el ñandú) usando solo planos para cada una de sus partes, mostrando aca los efectos de la cinemática directa e inversa, y haciendo cosas interesantes con la luz ya que estos planos se encontraban a distintas profundidades, logrando una imagen en 2D pero con sensación de profundidad (creo que esto se llama 2.5D si mal no recuerdo)</div><div><br /></div><div><span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSppyPRPEoo_XxiXmUK89GFqOmqiES1riChMw9JZfMT8N8l2flLka4kZcGXonAIkJc9Ew73psp1bI2gXO9-J_jc4IGEkidD1ZV7kZdn-W5bFW0PAcIxrN8_K6sy_6O3VIbLZ4VzOadOZA/s320/100_9879.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5391453938588639154" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 240px; " /></span></div><div>En resumen, me gustó mucho el evento, hubiese estado bueno que durara más tiempo, pero bueno, "e' lo que hay" :-)</div><div><br /></div><div>aca abajo dejo unos links a videos de YouTube mostrando cosas hechas con blender:</div><div><br /></div><div>Fluidos:</div><div><a href="http://www.youtube.com/watch?v=WruTNnF6Ztg">http://www.youtube.com/watch?v=WruTNnF6Ztg</a></div><div><a href="http://www.youtube.com/watch?v=YJM-OFheiBw">http://www.youtube.com/watch?v=YJM-OFheiBw</a></div><div><br /></div><div>Pasto:</div><div><a href="http://www.youtube.com/watch?v=wKIY2JwdKPg">http://www.youtube.com/watch?v=wKIY2JwdKPg</a></div><div><br /></div><div>Humo:</div><div><a href="http://www.youtube.com/watch?v=18cTthGQmK0">http://www.youtube.com/watch?v=18cTthGQmK0</a></div><div><br /></div><div>Pelo:</div><div><a href="http://www.youtube.com/watch?v=Gx9CIncjl-o">http://www.youtube.com/watch?v=Gx9CIncjl-o</a></div><div><br /></div><div>Física:</div><div><a href="http://www.youtube.com/watch?v=nwe11y5_Us0">http://www.youtube.com/watch?v=nwe11y5_Us0</a></div><div><br /></div><div>y hay miles más. Ahora si por último, un par de cortos hechos en Blender, y un largometraje que se está haciendo en Argentina usando íntegramente Software Libre, que lamentablemente por (según tengo entendido) problemas de presupuesto, se encuentra parado, pero tengo fe que va a terminarse:</div><div><br /></div><div>Elephants Dream:</div><div><a href="http://www.youtube.com/watch?v=bsGEWHNJ3s8">http://www.youtube.com/watch?v=bsGEWHNJ3s8</a></div><div><a href="http://www.elephantsdream.org/">http://www.elephantsdream.org/</a></div><div><br /></div><div>Big Buck Bunny:</div><div><a href="http://www.youtube.com/watch?v=7paen5lz6cc">http://www.youtube.com/watch?v=7paen5lz6cc</a></div><div><a href="http://www.bigbuckbunny.org/">http://www.bigbuckbunny.org/</a></div><div><br /></div><div>Plumiferos (El largometraje argentino):</div><div><a href="http://www.youtube.com/watch?v=RNaz9OJm7kg">http://www.youtube.com/watch?v=RNaz9OJm7kg</a></div><div><a href="http://www.plumiferos.com/">http://www.plumiferos.com/</a></div><div><br /></div><div>Como verán esto da para muchísimo más, pero lo dejo acá.</div><div><br /></div><div>Hasta la próxima</div></div>frapellhttp://www.blogger.com/profile/05242205112214267508noreply@blogger.com0tag:blogger.com,1999:blog-3369026469361972886.post-4017180036562985212009-09-07T15:25:00.000-07:002009-09-07T16:48:09.676-07:00Pycon Argentina 2009El fin de semana estuve en Buenos Aires para la primera PyCon Argentina realizada en la Universidad de Belgrano.<br /><br />En primer lugar, la conferencia estuvo fabulosamente bien organizada, todo salio espectacular y no hubo problemas (bueno, un pequeñito corte de luz justo cuando dabamos nuestra charla, pero obviamente no tuvo nada que ver con la organizacion del evento) asi que felicitaciones realmente a toda la gente involucrada porque fue un laburo admirable.<br /><br />Mi dia comenzo el viernes a las 5 AM cuando me levante para ir para el aeropuerto, como veran, una luna fabulosa (no se alcanza a ver bien en la foto, pero creanme, se veia genial)<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHshOulhbImRfakQ2IBqgE9qoxXw0HktMysYgVDKctZAZRYu1vw2i-GcZPdz037uJ4osJRpZ2hx9bPNsDlfP1nwXjOGyR-XhV5Z_bOtrsPLM9Mb7-lIpq-AXDSz0qvgvVF9CWBuVVZOsk/s1600-h/P1020802.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 240px; height: 320px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHshOulhbImRfakQ2IBqgE9qoxXw0HktMysYgVDKctZAZRYu1vw2i-GcZPdz037uJ4osJRpZ2hx9bPNsDlfP1nwXjOGyR-XhV5Z_bOtrsPLM9Mb7-lIpq-AXDSz0qvgvVF9CWBuVVZOsk/s320/P1020802.JPG" alt="" id="BLOGGER_PHOTO_ID_5378857767879288418" border="0" /></a><br />Emanuel paso a eso de las 6 menos cuarto, y desde mi casa nos tomamos un taxi.<br />Embarcamos, y 54 minutos despues ya estabamos en Bs As. El vuelo estuvo fabuloso, yo estaba como nene ahi arriba.<br /><br />A eso de las 9 AM. aprox, llegamos a la Universidad, un edificio impactante, y nos registramos<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_7_0PoG3HhwXNaMTjaIpWLpeOeSuItlT-jPb3soAiaIiBNYShvifzBdapLkGyqshCiQ4N0F2GNmYPEKyqczzJ7yEADUE6MPpCEmpsbMqiGrmTHBcWMGf7RVXU9RHB2WDV4khzqndAt2I/s1600-h/P1020825.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_7_0PoG3HhwXNaMTjaIpWLpeOeSuItlT-jPb3soAiaIiBNYShvifzBdapLkGyqshCiQ4N0F2GNmYPEKyqczzJ7yEADUE6MPpCEmpsbMqiGrmTHBcWMGf7RVXU9RHB2WDV4khzqndAt2I/s320/P1020825.JPG" alt="" id="BLOGGER_PHOTO_ID_5378858876515433586" border="0" /></a><br />La primer charla que vi fue la de Andres Riancho sobre "Python como un lenguaje de hacking" la cual estuvo muy buena, ya que Andres la tenia bastante clara y pudo mostrar todas las cosas de una manera muy entendible<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEid_5aUBi0RxCaJdb8mx6HhyphenhyphenPgIkgkhuTAz5-DECZrLdFfyppRlRBsIxlymWapMjT5EIlamcHtfRKaKQw0JBH9rIT77av8toGqS7PSnAWbFTO9eJKhwTX3-TVQp1lLdj9buLuxHJz18DXs/s1600-h/P1020830.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEid_5aUBi0RxCaJdb8mx6HhyphenhyphenPgIkgkhuTAz5-DECZrLdFfyppRlRBsIxlymWapMjT5EIlamcHtfRKaKQw0JBH9rIT77av8toGqS7PSnAWbFTO9eJKhwTX3-TVQp1lLdj9buLuxHJz18DXs/s320/P1020830.JPG" alt="" id="BLOGGER_PHOTO_ID_5378861061460596466" border="0" /></a><br />Despues, vi un poco de la charla de "humitos" sobre Django, que tambien estuvo buena, pero no pude terminar de verla, porque ya venia mi charla que daba con Emanuel y nueces sobre Plone.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCpl6KTgEi-egHjjKaDms6WikCI3GQ26xyb5iuForO39t9aygacAN2RL3pCxDCpMYdTWxIZRhRkTsZWT2sHxNvC_vdY9MU0fSvhVGZdQ149LKCNu6UVh-Pjq6LRLV5r_zlA2Egrvf7NzA/s1600-h/P1020835.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCpl6KTgEi-egHjjKaDms6WikCI3GQ26xyb5iuForO39t9aygacAN2RL3pCxDCpMYdTWxIZRhRkTsZWT2sHxNvC_vdY9MU0fSvhVGZdQ149LKCNu6UVh-Pjq6LRLV5r_zlA2Egrvf7NzA/s320/P1020835.JPG" alt="" id="BLOGGER_PHOTO_ID_5378864900130034866" border="0" /></a><br />La charla nuestra estuvo linda, hubo bastante gente atendiendo, pero se nos corto la luz a los 15 minutos de haber comenzado, asi que seguimos un poco sin luz, y dimos el resto cuando volvio la misma, y lamentablemente muy rapido ya que habiamos perdido mucho tiempo y habia que terminar, pero por suerte creo que la idea general se entendio, asi que podriamos decir que fue un exito.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghS0_wI9Pq73_yn3WtVKRGIpDV6evkl8kXv14d2rp5DkrcZAVU2stnolAP_fsgyNkCuhfgxeqtVh5sYburX7B-aYdtI0YvXz8NObKxyzC-AW2LAh2QPIcaIKgl3qROMWvNLFofI8yAWO4/s1600-h/P1020837.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghS0_wI9Pq73_yn3WtVKRGIpDV6evkl8kXv14d2rp5DkrcZAVU2stnolAP_fsgyNkCuhfgxeqtVh5sYburX7B-aYdtI0YvXz8NObKxyzC-AW2LAh2QPIcaIKgl3qROMWvNLFofI8yAWO4/s320/P1020837.JPG" alt="" id="BLOGGER_PHOTO_ID_5378864909784163378" border="0" /></a><br />Aca sin luz :P<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbcdZm04VCgMBOmlxE57vZVgugJ9yZaavKlsbk7H8FU3XWb_JJ1lTkP4rxV8v8Lbcx5tF3HoTaHFG991A977il4GHezkjD7gLX94gZO14tPJ63U-QiRbF1ppkp17cGbehSnWeI-Xl6wTI/s1600-h/P1020840.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbcdZm04VCgMBOmlxE57vZVgugJ9yZaavKlsbk7H8FU3XWb_JJ1lTkP4rxV8v8Lbcx5tF3HoTaHFG991A977il4GHezkjD7gLX94gZO14tPJ63U-QiRbF1ppkp17cGbehSnWeI-Xl6wTI/s320/P1020840.JPG" alt="" id="BLOGGER_PHOTO_ID_5378864921186926098" border="0" /></a><br /><br />Luego del almuerzo, no fui a ver ninguna charla a las 14hs, pero vi la de las 15hs "Hacking Django, mismo framework, distintos paradigmas" que dio Nubis, la cual estuvo MUY interesante porque mostro cosas muy copadas para hacer con Django.<br /><br />Para terminar con ese dia, se dieron unas Lightning talks bien variadas, y por ultimo una charla de Jacob Kaplan-Moss que me gusto mucho, basicamente rondaba alrededor de "el desarrollo web apesta, que podemos hacer para cambiar eso ?" y digo que me gusto bastante, porque coincido con el y me gustaria que el desarrollo web sea distino (obvio que no se como, pero que lo sea :P)<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjn7CsYj5OATaKozr1zHUe3HHQYa8jUYJG1DYgrywXhWHOx4IGY25OmbZEwcT6EtroSD6gwJqKTi_01Vo5Dl0ZbFC6uu7kzy2RMJPOuc6M08InFY3g_vikF09clNUq4obZ_v7Bfbu89xUc/s1600-h/P1020853.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjn7CsYj5OATaKozr1zHUe3HHQYa8jUYJG1DYgrywXhWHOx4IGY25OmbZEwcT6EtroSD6gwJqKTi_01Vo5Dl0ZbFC6uu7kzy2RMJPOuc6M08InFY3g_vikF09clNUq4obZ_v7Bfbu89xUc/s320/P1020853.JPG" alt="" id="BLOGGER_PHOTO_ID_5378864931043199122" border="0" /></a><br /><br />En el segundo dia de PyCon, nos levantamos tarde con los chicos en el hostel, asi que me perdi por cuarta vez (creo que es la cuarta, ya perdi la cuenta :P), la charla de Facundo sobre Unicode, espero poder verla alguna vez...<br /><br />La que si pude ver, fue una charla/panel armado entre gente que usaba distintos toolkit graficos (wxPython, PyQT y PyGTK) que estuvo muy interesante, y basicamente todo se resume a que son todos lo mismo, y que uses el que mas te guste esteticamente :)<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJoHxHzdUt3sl1tycEQuLt6d4X4ICwDB4X5oGDLZkYjAR3J3EF9-RDOj8fTkbH_Uw2CsWtlLrK7fu33o66qQwLqegEc_SUpr40nwPSzSpmH7LRmQ6UrYCVvshyphenhypheno6GQDs75A36OR_7CC-A/s1600-h/P1020869.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJoHxHzdUt3sl1tycEQuLt6d4X4ICwDB4X5oGDLZkYjAR3J3EF9-RDOj8fTkbH_Uw2CsWtlLrK7fu33o66qQwLqegEc_SUpr40nwPSzSpmH7LRmQ6UrYCVvshyphenhypheno6GQDs75A36OR_7CC-A/s320/P1020869.JPG" alt="" id="BLOGGER_PHOTO_ID_5378864942649320914" border="0" /></a><br />Luego asisti a la charla de Mariano Guerra sobre como inicio el desarrollo de emesene, un cliente de mensajeria instantanea para MSN y ahora tambien para Jabber. Estuvo muy buena porque comento bastante lo que es estar involucrado en un proyecto de software libre, y de lo facil que resulta, si tenes una buena idea, conseguir gente que te de una mano.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiso0t1U-5jF3qf8XKJ94pD31oQ6Br2YdUSRi6Hae7E6DNp0-PZXCYKpfgiVnS1EnrvGDTaW0vwcQMrLRNTbv9ZBp9SrVkzFi7K9Cn4yrmrIO7LwYnEWRtN2mxurDVyDZPYNgjUeF3jTMc/s1600-h/P1020871.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiso0t1U-5jF3qf8XKJ94pD31oQ6Br2YdUSRi6Hae7E6DNp0-PZXCYKpfgiVnS1EnrvGDTaW0vwcQMrLRNTbv9ZBp9SrVkzFi7K9Cn4yrmrIO7LwYnEWRtN2mxurDVyDZPYNgjUeF3jTMc/s320/P1020871.JPG" alt="" id="BLOGGER_PHOTO_ID_5378868652291311618" border="0" /></a><br />A continuacion, vi la charla de Facundo Batista, sobre Python 3000, que estuvo muy interesante ya que se mostraron los cambios que se introducen a partir de la nueva version de Python, y que hay que ir teniendo en cuenta, realmente son cambios que van a estar bastante buenos.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4GoQbjoxJL-oVQXRNLIuAgnWc4I4IJqui0OSvgc4EnARakEQ7-WX9wfJpXqhlq4pFYmXUXvw0SIYz9dwWnPYJWKfh8bwjMxR5Z0INqzI7lSthwHLRexPWQGxBs3CdsT7WKYeWiUGwzSg/s1600-h/P1020873.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4GoQbjoxJL-oVQXRNLIuAgnWc4I4IJqui0OSvgc4EnARakEQ7-WX9wfJpXqhlq4pFYmXUXvw0SIYz9dwWnPYJWKfh8bwjMxR5Z0INqzI7lSthwHLRexPWQGxBs3CdsT7WKYeWiUGwzSg/s320/P1020873.JPG" alt="" id="BLOGGER_PHOTO_ID_5378868661473723202" border="0" /></a><br /><br />Luego de nuevo a comer, y no pude llegar temprano para ver ninguna de las charlas, asi que me meti en la charla que estaba dando Lucio Torre sobre Twisted para seres humanos, pero dado que la agarre empezada, no entendi nada :P<br /><br />Luego, vi la charla del Mati Bordese, sobre el Bytecode de Python, y de como decompilar una aplicacion, inclusive asi haya sido convertida en EXE usando py2exe. Realmente interesantisimo y muy poderoso.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7HgQmGDREoPznPA1pA362nrUpcpZkq_oA8nWOv_9g1pb8EYhckJE3asJTlAZ_Be-TaQuqjyShuNelrpK0BWJPWEUwLFZJDPht0-dcRe-9dSLoo2zM94aImbFRtDyo5JvuE0fbP_UxTdA/s1600-h/P1020874.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7HgQmGDREoPznPA1pA362nrUpcpZkq_oA8nWOv_9g1pb8EYhckJE3asJTlAZ_Be-TaQuqjyShuNelrpK0BWJPWEUwLFZJDPht0-dcRe-9dSLoo2zM94aImbFRtDyo5JvuE0fbP_UxTdA/s320/P1020874.JPG" alt="" id="BLOGGER_PHOTO_ID_5378868668179931810" border="0" /></a><br />Luego otra sesion de charlas relampagos donde se trataron de los mas diversos temas y por ultimo, cerro la conferencia Collin Winter, un chabon que labura en Google, en un proyecto llamado Unladen Swallow, en donde intentan hacer python 5 veces mas rapido. Se nota que la tiene bastante clara y que sabe MUCHO. La charla fue buenisima, porque se entendia de que estaba hablando, pudo llegar a la gente, por lo menos a mi :)<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwEviw-3_aR-K2Ne_XfUStX_A3oCX_NUWpgq1FqYJZ2vPOWOKzwUIJdTlQlcYUxamiitGg_uPIwLAmSItD5hfTQOQuXQBhdIaZon1xq58UD7WvrS4wAZk9r8FWtuQuGI0bzkhOy2ggeKc/s1600-h/P1020894.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwEviw-3_aR-K2Ne_XfUStX_A3oCX_NUWpgq1FqYJZ2vPOWOKzwUIJdTlQlcYUxamiitGg_uPIwLAmSItD5hfTQOQuXQBhdIaZon1xq58UD7WvrS4wAZk9r8FWtuQuGI0bzkhOy2ggeKc/s320/P1020894.JPG" alt="" id="BLOGGER_PHOTO_ID_5378868691222619394" border="0" /></a><br />Y como broche final, el evento de cierre, donde se conto un poco la historia de PyAr en estos 5 años de vida, y se realizo un sorteo de libros, vasos, calcos, etc.<br />Aca una imagen de la cantidad de gente que asistio.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisbLNhfh_12qqT2dElcG_Pw1WGR1D7BpSfnUSu2Vg-MzIZ_4NEMQSO3D0RQOBDDBWkXVmUFVCzlRPnbZDANepV3A5EoJ8b_PhxcPS5PQWQ9wwUn84dnabmpfxPeO8GyP3cWNm2yXmKL7U/s1600-h/P1020886.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisbLNhfh_12qqT2dElcG_Pw1WGR1D7BpSfnUSu2Vg-MzIZ_4NEMQSO3D0RQOBDDBWkXVmUFVCzlRPnbZDANepV3A5EoJ8b_PhxcPS5PQWQ9wwUn84dnabmpfxPeO8GyP3cWNm2yXmKL7U/s320/P1020886.JPG" alt="" id="BLOGGER_PHOTO_ID_5378868684383890946" border="0" /></a><br />Y para terminar con el post, una foto con todos los ¨Pitufos" como los llamaba Facundo, que fueron los responsables de que todo saliera espectacular como salio.<br />Se llevaron un merecidisimo aplauso de toda esa gente en la foto de recien.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_7Rqm85G2fGPtphi7SX_xDNX8lOO26Baf93VMupvEN4nbAsNjqkpppjx_fy0wZf_nw29hPul-zEXisaWHdj2Md3STg_THlMf_gdIqjE5ChboIKl3Y1Iyq5_esYU4s7NY9CuH61rnOeNY/s1600-h/P1020896.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_7Rqm85G2fGPtphi7SX_xDNX8lOO26Baf93VMupvEN4nbAsNjqkpppjx_fy0wZf_nw29hPul-zEXisaWHdj2Md3STg_THlMf_gdIqjE5ChboIKl3Y1Iyq5_esYU4s7NY9CuH61rnOeNY/s320/P1020896.JPG" alt="" id="BLOGGER_PHOTO_ID_5378874610969532322" border="0" /></a><br />En resumidas cuentas, la conferencia estuvo buenisima, la pase genial y conoci gente muy copada (como siempre pasa en este tipo de eventos).<br /><br />El año que viene (2010) PyCon Argentina es en Cordoba, asi que asistencia obligada ;)frapellhttp://www.blogger.com/profile/05242205112214267508noreply@blogger.com0tag:blogger.com,1999:blog-3369026469361972886.post-37182153751301626102009-06-11T12:34:00.001-07:002009-10-11T13:48:35.554-07:00Le cambia el nombre a Blender y lo vende como propioHoy me entere que un tipo le cambio el nombre a Blender por 3DMagix y cobra 47 dolares por el.<br /><br />Lamentablemente el sitio daba un 403 asi que no pude ver bajo que terminos lo vendia y que valor agregado le daba, pero por la indignacion de la comunidad intuyo que pretendia engañar a sus clientes.<br /><br />Es triste ver como la gente intenta aprovecharse del laburo de los demas.<br /><br />Historia completa en: <a href="http://www.blendernation.com/2009/06/11/3dmagix-re-branding-and-selling-the-free-software-blender/">http://www.blendernation.com/2009/06/11/3dmagix-re-branding-and-selling-the-free-software-blender/</a>frapellhttp://www.blogger.com/profile/05242205112214267508noreply@blogger.com2tag:blogger.com,1999:blog-3369026469361972886.post-38842386070758871212009-05-11T05:13:00.000-07:002009-05-14T13:10:59.815-07:00Customizando una portal toolCuando se trabaja en sitios Plone, a menudo se trabaja desde la interfaz ZMI (Zope Management Interface). Por consiguiente, a veces es necesario cambiar el funcionamiento de alguna de estas 'tools' que fueron provistas por algun producto.<br />Yo voy a mostrarlo tomando como ejemplo la tool provista por el producto que integra Plone con Salesforce, Product.salesforcebaseconnector.<br />Aqui como:<br /><br />1) Agregar un archivo toolset.xml a nuestro profile/default (o el profile que esten usando) con lo siguiente<br /><pre><blockquote><br /><span style="color: rgb(20, 19, 18);"><b><?xml</b> version="1.0"<b>?></b></span><br /><span style="color: rgb(20, 19, 18);"><b><tool-setup></b></span><br /><span style="color: rgb(20, 19, 18);"> <b><required</b></span><span style="color: rgb(0, 110, 40);"> tool_id=</span><span style="color: rgb(170, 0, 0);">"portal_salesforcebaseconnector"</span><br /><span style="color: rgb(0, 110, 40);"> class=</span><span style="color: rgb(170, 0, 0);">"salesforce.patch.salesforcebaseconnector.SalesforcePatched"</span><span style="color: rgb(20, 19, 18);"><b>/></b></span><br /><span style="color: rgb(20, 19, 18);"><b></tool-setup></b></span></blockquote><span style="color: rgb(20, 19, 18);"><b></b></span></pre>2) En un archivo python (salesforcebaseconnector) lo siguiente:<br /><pre><br /><span style="color: rgb(255, 128, 224);"></span><blockquote><span style="color: rgb(255, 128, 224);">from</span><span style="color: rgb(20, 19, 18);"> Products.salesforcebaseconnector.salesforcebaseconnector </span><span style="color: rgb(255, 128, 224);">import</span><span style="color: rgb(20, 19, 18);"> SalesforceBaseConnector</span><br /><span style="color: rgb(255, 128, 224);">from</span><span style="color: rgb(20, 19, 18);"> Products.PageTemplates.PageTemplateFile </span><span style="color: rgb(255, 128, 224);">import</span><span style="color: rgb(20, 19, 18);"> PageTemplateFile</span><br /><br /><span style="color: rgb(255, 128, 224);">from</span><span style="color: rgb(20, 19, 18);"> AccessControl </span><span style="color: rgb(255, 128, 224);">import</span><span style="color: rgb(20, 19, 18);"> ClassSecurityInfo</span><br /><span style="color: rgb(255, 128, 224);">from</span><span style="color: rgb(20, 19, 18);"> Products.CMFCore.permissions </span><span style="color: rgb(255, 128, 224);">import</span><span style="color: rgb(20, 19, 18);"> ManagePortal</span><br /><br /><br /><span style="color: rgb(20, 19, 18);"><b>class</b> SalesforcePatched(SalesforceBaseConnector):</span><br /><br /><span style="color: rgb(20, 19, 18);"><b> def</b> </span><span style="color: rgb(0, 14, 82);"><b>__init__</b></span><span style="color: rgb(20, 19, 18);">(</span><span style="color: rgb(0, 110, 40);">self</span><span style="color: rgb(20, 19, 18);">):</span><br /><span style="color: rgb(0, 87, 174);"> super</span><span style="color: rgb(20, 19, 18);">(SalesforcePatched, </span><span style="color: rgb(0, 110, 40);">self</span><span style="color: rgb(20, 19, 18);">).</span><span style="color: rgb(0, 14, 82);"><b>__init__</b></span><span style="color: rgb(20, 19, 18);">()</span><br /><br /><span style="color: rgb(20, 19, 18);"> security = ClassSecurityInfo()</span><br /><span style="color: rgb(20, 19, 18);"> security.declareProtected(ManagePortal, </span><span style="color: rgb(191, 3, 3);">'manage_config'</span><span style="color: rgb(20, 19, 18);">)</span><br /><br /><span style="color: rgb(20, 19, 18);"> manage_config = PageTemplateFile(</span><span style="color: rgb(191, 3, 3);">'www/manageAuthConfigCustom'</span><span style="color: rgb(20, 19, 18);">, </span><span style="color: rgb(0, 87, 174);">globals</span><span style="color: rgb(20, 19, 18);">() )</span></blockquote><span style="color: rgb(20, 19, 18);"></span></pre><br />3) Por ultimo en la carpeta www, un manageAuthConfigCustom.zpt con el template customizado<br /><br />4) Instalar el producto y la tool se reeinstalara (cuidado aca, si habia datos que la tool mantenia, como en este caso el login a salesforce, todo eso se pierde, y hay que volver a cargarlos)<br /><br />En realidad, en la clase SalesforcePatched piso un par de metodos de SalesforceBaseConnector, que no vienen al caso ahora.<br /><br />Espero que a alguien le sirva esto.<br /><br />Cheers<br /><br />EDIT: Gracias Santiago por el comentario para poder meter codigo xml en el post y para colorear, aguante Kate :Dfrapellhttp://www.blogger.com/profile/05242205112214267508noreply@blogger.com3tag:blogger.com,1999:blog-3369026469361972886.post-64568144350730468452009-04-21T15:15:00.000-07:002009-04-21T15:21:32.039-07:00Radios online argentinas en Amarok2Bueno, mi primera contribucion al mundo de KDE4 fue un script para Amarok2 el cual agrega unos cuantos streams de radios online argentinas al nuevo Amarok.<br /><br />En escencia, agarré el script para radios de Serbia[0] y lo modifique para las radios Argentinas.<br /><br />Si usan Amarok2, lo pueden instalar desde el gestor de scripts, buscan agregar nuevos scripts desde internet y ahi deberia estar listado, sino lo pueden bajar a mano de aca[1]<br /><br />Cualquier tipo de feedback sera apreciado.<br /><br />[0] - http://kde-apps.org/content/show.php/Serbian+Radio+Streams+Service?content=93595<br />[1] - http://kde-apps.org/content/show.php/Argentina+Radio+Streams?content=103185frapellhttp://www.blogger.com/profile/05242205112214267508noreply@blogger.com2tag:blogger.com,1999:blog-3369026469361972886.post-15042666823020732382009-03-26T21:27:00.000-07:002009-03-26T21:45:02.364-07:00Creando usuarios programaticamente en Plone<span class="ul-threaded" style="margin: 0.5em 0pt 0pt -20px;"><span class="text-cell"><span> <br /></span></span></span><blockquote><span class="ul-threaded" style="margin: 0.5em 0pt 0pt -20px;"><span class="text-cell"><span> from Products.CMFCore.utils import getToolByName </span></span></span><br />#Primero pedimos la portal_registration tool<br />pr = getToolByName(context, 'portal_registration')<br />id = 'id_usuario'<br />password = 'password'<br />#En este diccionario cargamos campos adicionales<br />props = {<br /> 'username' : id,<br /> 'fullname' : 'Nombre Completo',<br /> 'email' : 'email_del_usuario',<br />}<br /><br />pr.addMember(id, password, properties=props)</blockquote><br /><br />API: http://api.plone.org/CMF/2.1.0/public/frames/products/CMFCore/products.CMFCore.MembershipTool.MembershipTool-class.html#addMemberfrapellhttp://www.blogger.com/profile/05242205112214267508noreply@blogger.com2tag:blogger.com,1999:blog-3369026469361972886.post-18529484287817285082008-06-03T08:12:00.000-07:002008-06-03T09:31:11.567-07:00Control remoto bajo Linux<span>Bueno, hacia mucho que no escribía nada, pero acabo de hacer funcionar el modulo lirc-gpio con un kernel 2.6.24 y como estoy tan feliz, voy a compartirlo aqui :-D<br /><br />Si tenés una capturadora de TV, usás el modulo bttv para usarla, tiene receptor infrarrojo y tenes un kernel 2.6.24, aca están los pasos para poder hacer funcionar Lirc y poder disfrutar del control remoto de la misma.<br /><br />Como primera medida, debemos saber si la placa está soportada... para eso <a href="http://www.lirc.org/html/table.html">este link</a>, es muy útil.<br /><br />en caso de estar soportada, hay que compilar el modulo de lirc, pero antes, hay que aplicar un patch al kernel, dado que, en la versión 2.6.24 hay algunos cambios en bttv con los cuales lirc no compila.<br /><br />para esto, bajamos el patch de <a href="http://lirc.sourceforge.net/software/snapshots/lirc-bttv-linux-2.6.24.patch">aca</a> (pueden darle click derecho al archivo y "Guardar como" o una vez que entren al link, guardar la pagina como "lirc-bttv-linux-2.6.24.patch"<br /><br />Bueno, lo que va a hacer este patch, es meterle vieja funcionalidad a bttv para poder compilar lirc... ahora, *solo* hacer esto, basta para compilarlo, pero cuando lo querramos usar, nos va a dar errores, dado que el driver que tenemos instalado está compilado sin este patch.<br /><br />Ok, basta de charlas y vamos a la acción:<br /><br />nota: yo utilizo Debian, así que es probable que en otras distros los paquetes se llamen distinto<br /><br />primero lo primero, instalar:</span><blockquote>apt-get install lirc lirc-modules-source linux-headers-$(uname -r) kernel-package</blockquote><br />También vamos a nacesitar las fuentes del kernel, en mi caso:<br /><blockquote>apt-get install linux-source-2.6.24</blockquote><br />Ahora lo que tenemos que hacer es ir a /usr/src y descomprimir las fuentes<br /><blockquote>tar xjvf linux-source-2.6.24.tar.bz2<br />tar xzvf lirc-modules.tar.gz</blockquote>en mi caso, las fuentes de bttv no venían con los headers, así que hay que copiar los archivos a mano desde las fuentes:<br /><blockquote>cp -R linux-source-2.6.24/drivers/media/video/bt8xx/bt* linux-headers-2.6.24-1-common/drivers/media/video/bt8xx/</blockquote><br />los archivos que "patchea" son bttv.h y bttv-if.c, estos archivos son parte de lo que acabamos de copiar, con lo cual copiamos el archivo patch (que bajamos anteriormente) a /usr/src y ejecutamos lo siguiente:<br /><blockquote>patch -p0 < lirc-bttv-linux-2.6.24.patch </blockquote><br />nos va a preguntar la ubicacion de los archivos, primero el bttv.h y luego el bttv-if.c, así que se las pasamos:<br /><blockquote>linux-headers-2.6.24-1-common/drivers/media/video/bt8xx/bttv.h linux-headers-2.6.24-1-common/drivers/media/video/bt8xx/bttv-if.c</blockquote><br />si todo fue bien, debería haber terminado sin error.<br />Ahora, como dije antes, tenemos que compilar bttv nuevamente, para tener estos nuevos cambios... Para esto:<br /><blockquote>cd linux-source-2.6.24/drivers/media/video/bt8xx/<br />make -C /lib/modules/`uname -r`/build SUBDIRS=$PWD modules<br />make -C /lib/modules/`uname -r`/build SUBDIRS=$PWD modules_install<br />depmod -a</blockquote><br />Luego de hacer eso (sin errores) vamos a tener nuestro nuevo modulo de bttv listo para cargar. En caso de tenerlo cargado de antes hacemos:<br /><blockquote>rmmod bt878<br />rmmod bttv<br />modprobe bt878<br />modprobe bttv</blockquote><br />y listo, nuestro modulo patcheado debería estar cargado. Pueden fijarse en 'dmesg' o en 'lsmod |grep bttv'<br />y ahora por ultimo lo que queda es compilar el modulo de Lirc, para eso, volvemos a /usr/src y hacemos lo siguiente:<br /><blockquote>m-a update,prepare<br />dpkg-reconfigure lirc-modules-source</blockquote><br />una vez que guardamos, ejecutamos:<br /><blockquote>m-a a-i lirc<br />dpkg -i /usr/src/lirc-modules-*.deb</blockquote><br />y por último cargamos el modulo haciendo:<br /><blockquote>modprobe lirc-gpio</blockquote>Si todo fue bien, el modulo deberia haberse cargado sin errores... pueden comprobarlo ejecutando 'dmesg' nuevamente, deberían ver algo como: lirc_gpio (0): driver registered<br /><br />muy bien, una vez terminado todo, pueden probar si anda usando mode2<br /><blockquote>mode2 -d /dev/lirc0</blockquote>Cuando ejecuten eso, deberían ver cosas en la pantalla a medida que aprietan diferentes botones en el control remoto... en caso negativo, entonces algo no estuvo bien y le modulo no esta funcionando correctamente.<br /><br />En caso de recibir señales, es hora de hacer un archivo lircd.conf con la informacion de su control:<br /><blockquote>irrecord -d /dev/lirc0 lircd.conf</blockquote>Una vez que terminaron de grabar los botones, copian el archivo generado (lircd.conf) y pisan el que se encuentra en /etc/lirc/ con el mismo nombre.<br />Una vez hecho esto, pueden correr 'lircd -n -d /dev/lirc0' para ver si se carga sin problemas. Si les dice que está listo, pueden probar en otra consola, ejecutando 'irw' y oprimir teclas del control... deberian ver el nombre que le pusieron en el lircd.conf.<br /><br />Bueno, si hasta aca no tuvieron problemas, es hora de cargar el daemon y disfrutar del control :-D<br /><br />para esto ejecutan /etc/lirc start<br /><br />y luego usan cosas como irkick (esto es para KDE, no conozco si viene algo similar para gnome, pero calculo que debe venir, y para los otros escritorios tambien) para configurar las aplicaciones.<br /><br />Y bueno, eso es todo.<br /><br />Espero que les haya servido, cualquier cosa dejen un comentario con algún problema y lo intentamos resolver ;-)<br /><br />hasta la proxima.frapellhttp://www.blogger.com/profile/05242205112214267508noreply@blogger.com0tag:blogger.com,1999:blog-3369026469361972886.post-75804014405123788802008-04-14T05:47:00.000-07:002008-04-14T07:01:51.113-07:00Creando un DVD con fotosBueno, al final en la presentacion dije los temas sobre los que iba a hablar en las sucesivas "entradas" de este blog, y bueno, esta no tiene nada que ver con nada de lo que nombre :-P<br /><br />Hace un tiempo quería hacer una peliculita usando fotos y con musica de fondo.... para esto intenté usar el increiblemente versatil mencoder(herramienta de la cual seguro voy a hablar en algun otro post), y, a pesar de haber podido crear un archivo con imagenes que iban pasando como yo quería, tenia algunos problemitas... digamos, la idea de mencoder cuando se usa para hacer una pelicula basado en muchas imagenes, es la idea de las caricaturas.... uno tiene muchas imagenes que varian muy poco, entonces puede hacer el efecto de movimiento, con lo cual no se adecuaba exactamente para lo que yo queria...<br /><br />resulta que hace un par de dias, una persona envió un mail a la lista de correo de los usuarios de mencoder (si, estoy suscripto :-P) preguntando, porque mencoder le tiraba error cuando intentaba hacer lo de muchas imagenes para hacer un video... a lo que yo le respondi dado que habia renegado un poco y tenia una idea de como hacerlo, y aproveché para comentarle lo que quería hacer y que si el lograba algo por el estilo me tirara la linea que usó, fue entonces cuando recibi respuesta de otro usuario de la lista diciendome, ¿por que no usas 'dvdslideshow'? y ahi descubri este particular software, de lo cual vengo a hablarles.<br /><br />Para empezar, no lo encontré, dado que su nombre (por lo menos en Debian) no es dvdslideshow sino dvd-slideshow. je<br /><br />asi que lo primero que hay que hacer es:<br /><br /><blockquote>aptitude install dvd-slideshow</blockquote>Bien... esto nos instala el paquete dvd-slideshow con todas sus herramientas.<br />El proceso para hacer esto es un tanto tedioso, en el sentido que hay que hacer varios "pasos"<br />Primero utilizamos el programita dir2slideshow<br />si ejecutan el comando asi solito, les va a tirar las opciones de uso.<br />Para hacer una prueba rapida, pueden pararse sobre el directorio donde tengan las fotos y ejecutar:<br /><blockquote>dir2slideshow -o dvd/ -c 2 -n 'Prueba de fotos' -k -a audio.mp3 -p .</blockquote>basicamente con el parametro "-o" le decimos a que directorio hacer el output, con "-c" le decimos el tiempo en segundos del crossfade entre fotos, luego con "-n" le damos el titulo, con -k que le haga efectos Ken Burns[1] aleatorios, con "-a" le damos uno o varios archivos de audio (si quisieran que cuando termine audio.mp3 empiece audio2.mp3, entonces deben usar -a audio.mp3,audio2.mp3 y en el caso de tener espacios en el nombre, usar el formato que se uso en -n, es decir, usar comillas), luego con "-p" le decimos que queremos PAL en lugar de NTSC, y por ultimo el "." es para decirle que las imagenes estan donde estamos parados... hay unos cuantos comandos mas, que pueden verlos en la ayuda del programa... bueno, una vez que termina, nos va a decir algo como:<br /><blockquote>#########################################<br />[dir2slideshow] Done!<br />[dir2slideshow] Output file is dvd/Prueba_de_fotos.txt<br /></blockquote>genial, ya tenemos nuestro archivo para darle a dvd-slideshow y hacer el archivo de pelicula con las fotos.<br />Asi que ejecutamos dvd-slideshow, el cual tambien tiene sus comandos, en caso que querramos agregar alguna cosita extra:<br /><br /><blockquote>dvd-slideshow -o dvd/ -b 100_1355.JPG -border 10 -r -smp -f dvd/Prueba_de_fotos.txt</blockquote>bien, como en el comando anterior, con "-o" le decimos a donde meter los resultados, con "-b" le decimos que queremos que esa imagen en particular sea nuestro background (si no le ponen nada se verá un fondo negro), con "-border 10" le damos un borde a todas las fotos (de 10 pixeles), con "-r" le decimos que auto recorte las fotos para hacerlas entrar, con "-f" le decimos el nombre del archivo input que creamos anteriormente con dir2slideshow. El parametro "-smp" nos permite, si tenemos un procesador de doble nucleo, hacer uso de ambos nucleos para disminuir el tiempo que demora en hacerse todo el slideshow, que si usan efectos, crossfade, etc y son muchas fotos, puede demorarse un tiempo...<br />Muy bien, una vez que termina, vamos a tener un output como el siguiente:<br /><br /><blockquote>[dvd-slideshow]############################################################<br />[dvd-slideshow] total chapters=5<br />[dvd-slideshow] chapter markers at 0,0:0:15.015,0:0:31.998,0:0:43.009,0:0:48.014<br />[dvd-slideshow]############################################################<br />[dvd-slideshow] cleanup...<br />[dvd-slideshow] More extensive logfile output is at:<br />[dvd-slideshow] dvd/dvd-slideshow.log<br />[dvd-slideshow] Done!<br /><br />[dvd-slideshow] use one of the following comands to view your output:<br />[dvd-slideshow] xine -g -u 0 "dvd/Prueba_de_fotos.vob"<br />[dvd-slideshow] mplayer -sid 0 "dvd/Prueba_de_fotos.vob"<br /></blockquote>y dentro de la carpeta dvd, vamos a tener un archivo de pelicula, que podemos ver ejecutando alguno de los comandos que nos propone.<br /><br />Este proceso lo repetimos por todos los slideshows que querramos hacer, luego con un software de autoria de DVD's juntamos todos estos archivos y hacemos un DVD con menúes y todo.<br /><br />Hay uno muy intuitivo y facil de usar, que utiliza la tecnica "dale siguiente y yo hago todo por vos" que se llama "KDE DVD Authoring Wizard" (aptitude install dvdauthorwizard) que les puede venir al pelo.<br /><br />En fin, como verán, con 2 comandos, pudimos hacernos un DVD con un acabado bastante similar a lo que un profesional puede hacer, claro que infinitamente mas barato (y bueh, no TAN bien terminado, jeje) pero si saben utilizar algun editor de video, pueden retocar un poco cada slideshow y dejarlas un poco mejor, pero para quienes lo queremos para hacerle algun regalito a la novia nos alcanza y nos sobra :-P<br /><br />Bien, espero que les haya servido, y si quieren leer un poco mas, aca esta la wiki del proyecto donde hay un poco de informacion mas avanzada y detallada[2].<br /><br />Saludos,<br />Franco<br /><br /><br />[1] - http://es.wikipedia.org/wiki/Ken_Burns<br />[2] - http://dvd-slideshow.sourceforge.net/wiki/Main_Pagefrapellhttp://www.blogger.com/profile/05242205112214267508noreply@blogger.com0tag:blogger.com,1999:blog-3369026469361972886.post-90789693517724713042008-03-28T09:28:00.001-07:002008-03-28T09:31:48.137-07:00Primera EntradaBueno, bienvenido frapell al mundo de los blogs.... siempre me resisti, por no se... despues de leer las b****** que escriben algunas personas dije "yo no voy a ser uno de esos..." pero bueh, aqui estoy. Es mi primer post, y la idea va a ser meter aqui cosas relacionadas a mis intereses, los cualen el 95% rondan al rededor de estar frente al monitor, asi que van a ver cosas de Plone, Blender, Panda3D, Zope, Python, C, Assembly, etc, etc, etc<br /><br />por el momento no creo que sean entradas frecuentes, veremos que pasa en un futuro...<br /><br />por lo pronto, "hola :-D"frapellhttp://www.blogger.com/profile/05242205112214267508noreply@blogger.com2