tag:blogger.com,1999:blog-83013330493904729772024-03-05T00:57:30.509-08:00pyppetbrett's projects: PythonJS, Blender2Ogre, Rpythonicraptorhttp://www.blogger.com/profile/14287416587600419675noreply@blogger.comBlogger35125tag:blogger.com,1999:blog-8301333049390472977.post-66415047381636255662018-12-28T15:26:00.001-08:002019-01-15T12:22:06.775-08:00LMMS Scripting<div dir="ltr" style="text-align: left;" trbidi="on">
<br /></div>
<iframe width="560" height="315" src="https://www.youtube.com/embed/28OYCxrm1FA" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<iframe width="560" height="315" src="https://www.youtube.com/embed/zgEDhxTbIuI" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<a href="https://2.bp.blogspot.com/-LRLwGDOEDJg/XCav_xQe_zI/AAAAAAAAKvY/0GzOSrh14R0X_OZGdeAWH2iZlSWUKa_YgCLcBGAs/s1600/lmms-scripting.png" imageanchor="1" ><img border="0" src="https://2.bp.blogspot.com/-LRLwGDOEDJg/XCav_xQe_zI/AAAAAAAAKvY/0GzOSrh14R0X_OZGdeAWH2iZlSWUKa_YgCLcBGAs/s400/lmms-scripting.png" width="400" height="223" data-original-width="1572" data-original-height="878" /></a>
<br/>
The new scripting system in LMMS allows you to run javascript inside of LMMS. You can generate beats and notes, and call external an external process like <b>mplayer</b>, which on Linux allows you to embed the mplayer window into the LMMS workspace.
<br/>
<a href="https://3.bp.blogspot.com/-23guNKOFLsU/XCrTddjlHQI/AAAAAAAAKvk/_0cIgTPClzEqn8te5_8r9QtE_ZjOwCvkACLcBGAs/s1600/Screenshot%2Bfrom%2B2018-12-31%2B18-36-07.png" imageanchor="1" ><img border="0" src="https://3.bp.blogspot.com/-23guNKOFLsU/XCrTddjlHQI/AAAAAAAAKvk/_0cIgTPClzEqn8te5_8r9QtE_ZjOwCvkACLcBGAs/s640/Screenshot%2Bfrom%2B2018-12-31%2B18-36-07.png" width="640" height="360" data-original-width="1600" data-original-height="900" /></a>
above blender2.8 embedded inside of LMMS
<a href="https://3.bp.blogspot.com/-hUmChruaV8M/XCrV8KO0bsI/AAAAAAAAKvw/ogQwKSGXzWkckxLUORV7dDPJK1HFlbV4QCLcBGAs/s1600/Screenshot%2Bfrom%2B2018-12-31%2B18-51-27.png" imageanchor="1" ><img border="0" src="https://3.bp.blogspot.com/-hUmChruaV8M/XCrV8KO0bsI/AAAAAAAAKvw/ogQwKSGXzWkckxLUORV7dDPJK1HFlbV4QCLcBGAs/s640/Screenshot%2Bfrom%2B2018-12-31%2B18-51-27.png" width="640" height="360" data-original-width="1600" data-original-height="900" /></a>
above: amsynth, hydrogen, and vlc inside of LMMS
<iframe width="560" height="315" src="https://www.youtube.com/embed/xNlXcOYKUeQ" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<br/>
<a href="https://github.com/hartsantler/lmms">LMMS X11 Scripting Fork</a>
raptorhttp://www.blogger.com/profile/14287416587600419675noreply@blogger.com1tag:blogger.com,1999:blog-8301333049390472977.post-3356417395053765272016-02-14T16:22:00.001-08:002016-04-07T00:32:30.089-07:00Back in Gotham City<div dir="ltr" style="text-align: left;" trbidi="on">
<br /></div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrVAusGLtfEvwY6OJhuo-gpoCe5PpBNFwfFU6E-JNaL62YpRGT-eWQsMEEz82yB3PsCWHrMHdCnirAvlrzzC4wZQnBfnhx1_olpocPZ1u4ym2vSCaa8R0W4aOF78msKe7B4HAS1zsVqHvu/s1600/facebook_1459464854229.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrVAusGLtfEvwY6OJhuo-gpoCe5PpBNFwfFU6E-JNaL62YpRGT-eWQsMEEz82yB3PsCWHrMHdCnirAvlrzzC4wZQnBfnhx1_olpocPZ1u4ym2vSCaa8R0W4aOF78msKe7B4HAS1zsVqHvu/s400/facebook_1459464854229.jpg" /></a>
<a href="https://1.bp.blogspot.com/-Vk73Ahkcgyk/VsEY_Z4cqEI/AAAAAAAAC4A/mEb1jHKGM-w/s1600/niki-vs-police1.jpg" imageanchor="1" ><img border="0" src="https://1.bp.blogspot.com/-Vk73Ahkcgyk/VsEY_Z4cqEI/AAAAAAAAC4A/mEb1jHKGM-w/s400/niki-vs-police1.jpg" /></a>
<p>
After two weeks in Oakland, Jimmy and I return to Sacramento.
We had not even been in the city for more than 30minutes,
before we saw the police with their anger and power.
</p>
<iframe width="420" height="315" src="https://www.youtube.com/embed/kELCZ-owdoY" frameborder="0" allowfullscreen></iframe>
<p>
The video above is of the Sacramento police arresting a young, peaceful protester in front of city hall.
</p>
<h3>update: feb 15th, 2016</h3>
<iframe width="420" height="315" src="https://www.youtube.com/embed/OOWpAAWALBg" frameborder="0" allowfullscreen></iframe>
<a href="https://1.bp.blogspot.com/-7UsCtnxrkxM/VsJPkd9SAKI/AAAAAAAAC4Q/CdN8vPmkP9g/s1600/IMG_20160215_071703.jpg" imageanchor="1" ><img border="0" src="https://1.bp.blogspot.com/-7UsCtnxrkxM/VsJPkd9SAKI/AAAAAAAAC4Q/CdN8vPmkP9g/s400/IMG_20160215_071703.jpg" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdKwT2k9cddd5E9cDrvV2nrrJbSsaxH6d_tPXxSIXpqZetR8zGeKhbhY9OVg3c843KqcjwV_DaST5k0qVN-motz6SGMN00aSGcYani4pqxUlIqRVgjQhdq1WhJ2lB-E4KTiAS1J8qX9U6M/s1600/IMG_20160215_092413.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdKwT2k9cddd5E9cDrvV2nrrJbSsaxH6d_tPXxSIXpqZetR8zGeKhbhY9OVg3c843KqcjwV_DaST5k0qVN-motz6SGMN00aSGcYani4pqxUlIqRVgjQhdq1WhJ2lB-E4KTiAS1J8qX9U6M/s400/IMG_20160215_092413.jpg" /></a><a href="https://4.bp.blogspot.com/-XQE_cBBRWJk/VsJPlzmkXoI/AAAAAAAAC4U/NdQC7nCNslI/s1600/IMG_20160215_071525.jpg" imageanchor="1" ><img border="0" src="https://4.bp.blogspot.com/-XQE_cBBRWJk/VsJPlzmkXoI/AAAAAAAAC4U/NdQC7nCNslI/s400/IMG_20160215_071525.jpg" /></a>
<h3>Arrest of Rafterman (me)</h3>
<iframe width="560" height="315" src="https://www.youtube.com/embed/WxdiO_ghH4U" frameborder="0" allowfullscreen></iframe>
<p>
My first arrest for protesting at cityhall. Sgt. John Harris looked down at me and says "is he moving? (no) get him"
</p>raptorhttp://www.blogger.com/profile/14287416587600419675noreply@blogger.com0tag:blogger.com,1999:blog-8301333049390472977.post-80395146974851277522016-02-10T14:39:00.000-08:002016-02-13T07:46:18.962-08:00Painting at Noah's Part2<div dir="ltr" style="text-align: left;" trbidi="on">
<br /></div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdmvNZQ0tbmrwcM_DY4qD08syRZjyvpBVqX8GOOEVSbnh-YPfZKcpjqvNMxn7tZjFG3tJYHw3bD8Em0hQzu1FBxF2Ax6cQMT0KkmBOpwL7qmD_bFkMNpO08n6OaS4BL6aDsdMQESHCgLYK/s1600/IMG_20160207_165036.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdmvNZQ0tbmrwcM_DY4qD08syRZjyvpBVqX8GOOEVSbnh-YPfZKcpjqvNMxn7tZjFG3tJYHw3bD8Em0hQzu1FBxF2Ax6cQMT0KkmBOpwL7qmD_bFkMNpO08n6OaS4BL6aDsdMQESHCgLYK/s400/IMG_20160207_165036.jpg" /></a><a href="https://1.bp.blogspot.com/-tHyb5mc68HU/Vru7T0uoXvI/AAAAAAAAC1s/6bqM3hEa_dw/s1600/IMG_20160208_175007.jpg" imageanchor="1" ><img border="0" src="https://1.bp.blogspot.com/-tHyb5mc68HU/Vru7T0uoXvI/AAAAAAAAC1s/6bqM3hEa_dw/s400/IMG_20160208_175007.jpg" /></a>
<br/>
<a href="https://3.bp.blogspot.com/-vMgt7JF7lHA/Vru7cmsEw-I/AAAAAAAAC10/xqZekOIe5fA/s1600/IMG_20160210_103407.jpg" imageanchor="1" ><img border="0" src="https://3.bp.blogspot.com/-vMgt7JF7lHA/Vru7cmsEw-I/AAAAAAAAC10/xqZekOIe5fA/s320/IMG_20160210_103407.jpg" /></a>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlCqbA3drSyv1sX4dKcAZYS68FIuZr-C9RN-5n6_lhTfrdUl4JpxE1TVkcJOuac1Uirmjw22eQ_l7UD2LKBnMnocQ8tKlKaLLRExs8e-6cVggEJuXPA2hXfnOyFft0tt-p22FeGi9h72VW/s1600/IMG_20160210_105743.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlCqbA3drSyv1sX4dKcAZYS68FIuZr-C9RN-5n6_lhTfrdUl4JpxE1TVkcJOuac1Uirmjw22eQ_l7UD2LKBnMnocQ8tKlKaLLRExs8e-6cVggEJuXPA2hXfnOyFft0tt-p22FeGi9h72VW/s400/IMG_20160210_105743.jpg" /></a><a href="https://4.bp.blogspot.com/-pHfzlKPU3r4/Vru7tAOXD2I/AAAAAAAAC18/KkXQOiBsVJc/s1600/IMG_20160210_105757.jpg" imageanchor="1" ><img border="0" src="https://4.bp.blogspot.com/-pHfzlKPU3r4/Vru7tAOXD2I/AAAAAAAAC18/KkXQOiBsVJc/s400/IMG_20160210_105757.jpg" /></a><a href="https://4.bp.blogspot.com/-9wXcmYU_tMo/Vru7tCC07DI/AAAAAAAAC2A/R5cxS7KoL18/s1600/IMG_20160210_110057.jpg" imageanchor="1" ><img border="0" src="https://4.bp.blogspot.com/-9wXcmYU_tMo/Vru7tCC07DI/AAAAAAAAC2A/R5cxS7KoL18/s400/IMG_20160210_110057.jpg" /></a>
<hr/>
<a href="https://1.bp.blogspot.com/-tCzasG_Y-gg/Vr9Pu8xNukI/AAAAAAAAC3o/3HB8qRIwD58/s1600/IMG_20160212_094619.jpg" imageanchor="1" ><img border="0" src="https://1.bp.blogspot.com/-tCzasG_Y-gg/Vr9Pu8xNukI/AAAAAAAAC3o/3HB8qRIwD58/s400/IMG_20160212_094619.jpg" /></a><a href="https://4.bp.blogspot.com/-5vORcO7L4Ho/Vr9Pu7M2tBI/AAAAAAAAC3s/oePCgVB9LDw/s1600/IMG_20160212_150008.jpg" imageanchor="1" ><img border="0" src="https://4.bp.blogspot.com/-5vORcO7L4Ho/Vr9Pu7M2tBI/AAAAAAAAC3s/oePCgVB9LDw/s400/IMG_20160212_150008.jpg" /></a><a href="https://2.bp.blogspot.com/-r9PHfpCTclA/Vr9PuhqIcuI/AAAAAAAAC3k/2vxKJYlXURc/s1600/IMG_20160212_192246.jpg" imageanchor="1" ><img border="0" src="https://2.bp.blogspot.com/-r9PHfpCTclA/Vr9PuhqIcuI/AAAAAAAAC3k/2vxKJYlXURc/s400/IMG_20160212_192246.jpg" /></a>
<hr/>
<a href="https://4.bp.blogspot.com/-48ALLVaIyNI/Vru7tmT5LVI/AAAAAAAAC2E/v58qk7dUK1k/s1600/IMG_20160210_120939.jpg" imageanchor="1" ><img border="0" src="https://4.bp.blogspot.com/-48ALLVaIyNI/Vru7tmT5LVI/AAAAAAAAC2E/v58qk7dUK1k/s400/IMG_20160210_120939.jpg" /></a><a href="https://3.bp.blogspot.com/-nrTiJYnSz0Q/Vru7t28ZXyI/AAAAAAAAC2I/vthatVQrYa8/s1600/IMG_20160210_122422.jpg" imageanchor="1" ><img border="0" src="https://3.bp.blogspot.com/-nrTiJYnSz0Q/Vru7t28ZXyI/AAAAAAAAC2I/vthatVQrYa8/s400/IMG_20160210_122422.jpg" /></a>
<hr/>
<a href="https://4.bp.blogspot.com/-azs73_IYTDY/Vr1L50OjAvI/AAAAAAAAC3M/9V4kSLPEWPo/s1600/IMG_20160211_152337.jpg" imageanchor="1" ><img border="0" src="https://4.bp.blogspot.com/-azs73_IYTDY/Vr1L50OjAvI/AAAAAAAAC3M/9V4kSLPEWPo/s320/IMG_20160211_152337.jpg" /></a>
<hr/>
<a href="https://2.bp.blogspot.com/-sIchccIf8nc/Vr1LrXF3FMI/AAAAAAAAC3I/nzshF2TF158/s1600/IMG_20160211_075329.jpg" imageanchor="1" ><img border="0" src="https://2.bp.blogspot.com/-sIchccIf8nc/Vr1LrXF3FMI/AAAAAAAAC3I/nzshF2TF158/s200/IMG_20160211_075329.jpg" /></a><a href="https://1.bp.blogspot.com/-v0wRjFCwjSQ/Vr1LrWa7wTI/AAAAAAAAC3E/vqYORdeVaqM/s1600/IMG_20160211_095106.jpg" imageanchor="1" ><img border="0" src="https://1.bp.blogspot.com/-v0wRjFCwjSQ/Vr1LrWa7wTI/AAAAAAAAC3E/vqYORdeVaqM/s200/IMG_20160211_095106.jpg" /></a><a href="https://4.bp.blogspot.com/-DkuRToQ8y6s/Vr1LrOvZsYI/AAAAAAAAC3A/Y6QUBby2x5k/s1600/IMG_20160211_112249.jpg" imageanchor="1" ><img border="0" src="https://4.bp.blogspot.com/-DkuRToQ8y6s/Vr1LrOvZsYI/AAAAAAAAC3A/Y6QUBby2x5k/s200/IMG_20160211_112249.jpg" /></a>
<h3>For Pinky</h3>
<a href="https://4.bp.blogspot.com/-gGTknNN3s8A/Vr1MR9ZrOsI/AAAAAAAAC3Q/KSs0AeF_kvQ/s1600/IMG_20160211_184634.jpg" imageanchor="1" ><img border="0" src="https://4.bp.blogspot.com/-gGTknNN3s8A/Vr1MR9ZrOsI/AAAAAAAAC3Q/KSs0AeF_kvQ/s400/IMG_20160211_184634.jpg" /></a>raptorhttp://www.blogger.com/profile/14287416587600419675noreply@blogger.com1tag:blogger.com,1999:blog-8301333049390472977.post-76437791002187040022016-02-03T16:08:00.001-08:002016-02-07T13:13:04.449-08:00Painting at Noahs in Oakland<div dir="ltr" style="text-align: left;" trbidi="on">
<br /></div>
<h3>day1</h3>
<a href="http://3.bp.blogspot.com/-u8tmw0v3uDU/VrKVwubifRI/AAAAAAAAC0M/QKRUStXxTxw/s1600/dude2_IMG_20160201_092755.jpg" imageanchor="1" ><img border="0" src="http://3.bp.blogspot.com/-u8tmw0v3uDU/VrKVwubifRI/AAAAAAAAC0M/QKRUStXxTxw/s200/dude2_IMG_20160201_092755.jpg" /></a><a href="http://1.bp.blogspot.com/-bcvXhQQ0z_s/VrKVwU39WxI/AAAAAAAAC0E/pIXaT-7LLKY/s1600/IMG_20160201_202438.jpg" imageanchor="1" ><img border="0" src="http://1.bp.blogspot.com/-bcvXhQQ0z_s/VrKVwU39WxI/AAAAAAAAC0E/pIXaT-7LLKY/s200/IMG_20160201_202438.jpg" /></a><a href="http://2.bp.blogspot.com/-pBxUyglAiEw/VrKVweLPpHI/AAAAAAAAC0I/drdqNaMigJw/s1600/redrocks_IMG_20160201_202333.jpg" imageanchor="1" ><img border="0" src="http://2.bp.blogspot.com/-pBxUyglAiEw/VrKVweLPpHI/AAAAAAAAC0I/drdqNaMigJw/s200/redrocks_IMG_20160201_202333.jpg" /></a>
<h3>day2</h3>
<a href="http://2.bp.blogspot.com/-obCGLygpEuI/VrKWH9vWx6I/AAAAAAAAC0Q/7_DTJ4rp7NY/s1600/IMG_20160202_173249.jpg" imageanchor="1" ><img border="0" src="http://2.bp.blogspot.com/-obCGLygpEuI/VrKWH9vWx6I/AAAAAAAAC0Q/7_DTJ4rp7NY/s320/IMG_20160202_173249.jpg" /></a><a href="http://2.bp.blogspot.com/-G6Y8LG_61ko/VrKWIN-U2BI/AAAAAAAAC0U/aisVhE9lcqs/s1600/IMG_20160203_101427.jpg" imageanchor="1" ><img border="0" src="http://2.bp.blogspot.com/-G6Y8LG_61ko/VrKWIN-U2BI/AAAAAAAAC0U/aisVhE9lcqs/s320/IMG_20160203_101427.jpg" /></a><a href="http://4.bp.blogspot.com/-Jy3ddimfJZg/VrKWICDunMI/AAAAAAAAC0Y/fqQkOKd1T3k/s1600/IMG_20160203_101532.jpg" imageanchor="1" ><img border="0" src="http://4.bp.blogspot.com/-Jy3ddimfJZg/VrKWICDunMI/AAAAAAAAC0Y/fqQkOKd1T3k/s320/IMG_20160203_101532.jpg" /></a>
<h3>day3</h3>
<a href="http://2.bp.blogspot.com/-M3kf8gsxEhE/VrKWTologRI/AAAAAAAAC0g/9Qpj428QK1Y/s1600/IMG_20160203_155615.jpg" imageanchor="1" ><img border="0" src="http://2.bp.blogspot.com/-M3kf8gsxEhE/VrKWTologRI/AAAAAAAAC0g/9Qpj428QK1Y/s400/IMG_20160203_155615.jpg" /></a><a href="http://1.bp.blogspot.com/-Ghpm0jIfWyE/VrKWTnWkTLI/AAAAAAAAC0k/60wzIRogBUY/s1600/IMG_20160203_155641.jpg" imageanchor="1" ><img border="0" src="http://1.bp.blogspot.com/-Ghpm0jIfWyE/VrKWTnWkTLI/AAAAAAAAC0k/60wzIRogBUY/s400/IMG_20160203_155641.jpg" /></a><a href="http://3.bp.blogspot.com/-1DZNoWHWs2w/VrKWTdIXG3I/AAAAAAAAC0c/ttiFgC7ihaA/s1600/IMG_20160203_155713.jpg" imageanchor="1" ><img border="0" src="http://3.bp.blogspot.com/-1DZNoWHWs2w/VrKWTdIXG3I/AAAAAAAAC0c/ttiFgC7ihaA/s400/IMG_20160203_155713.jpg" /></a>
<h3>day4</h3>
<a href="https://3.bp.blogspot.com/-lZ4bHwRGDYg/VrZuMl0oZoI/AAAAAAAAC04/l2I1NYhSvB4/s1600/IMG_20160205_154001.jpg" imageanchor="1" ><img border="0" src="https://3.bp.blogspot.com/-lZ4bHwRGDYg/VrZuMl0oZoI/AAAAAAAAC04/l2I1NYhSvB4/s640/IMG_20160205_154001.jpg" /></a>
<h3>day5</h3>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmQYU9_qFt4eRHOYu9HN0ElPG5Zl4Rk0Q2yk2G_tPE__MbtRgPiF7jJH9SQ80IOiu-ns1H8A6pFcovcjWPbi4dirTZ3i4wkjNWeHrrRc3eE7HfQ3XS-S9Lh8SEXtFCoHIN1H8DeQqbL0mm/s1600/IMG_20160205_103820.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmQYU9_qFt4eRHOYu9HN0ElPG5Zl4Rk0Q2yk2G_tPE__MbtRgPiF7jJH9SQ80IOiu-ns1H8A6pFcovcjWPbi4dirTZ3i4wkjNWeHrrRc3eE7HfQ3XS-S9Lh8SEXtFCoHIN1H8DeQqbL0mm/s400/IMG_20160205_103820.jpg" /></a>
<h3>day6</h3>
<a href="https://2.bp.blogspot.com/-zOlf1NHqdCs/VrZupNRYVLI/AAAAAAAAC1A/DqfJ-9a-7WU/s1600/IMG_20160206_135906.jpg" imageanchor="1" ><img border="0" src="https://2.bp.blogspot.com/-zOlf1NHqdCs/VrZupNRYVLI/AAAAAAAAC1A/DqfJ-9a-7WU/s400/IMG_20160206_135906.jpg" /></a>
<h3>day7</h3>
<a href="https://2.bp.blogspot.com/-x-rvVda6piI/VrezVO7yk0I/AAAAAAAAC1Y/KZe0rjHtR0U/s1600/IMG_20160207_130213.jpg" imageanchor="1" ><img border="0" src="https://2.bp.blogspot.com/-x-rvVda6piI/VrezVO7yk0I/AAAAAAAAC1Y/KZe0rjHtR0U/s400/IMG_20160207_130213.jpg" /></a><a href="https://2.bp.blogspot.com/-SyfAWFjTaVY/VrezU0Rd2FI/AAAAAAAAC1U/8bWR9c4IRdA/s1600/IMG_20160207_130250.jpg" imageanchor="1" ><img border="0" src="https://2.bp.blogspot.com/-SyfAWFjTaVY/VrezU0Rd2FI/AAAAAAAAC1U/8bWR9c4IRdA/s400/IMG_20160207_130250.jpg" /></a>raptorhttp://www.blogger.com/profile/14287416587600419675noreply@blogger.com0tag:blogger.com,1999:blog-8301333049390472977.post-70108125722931981082016-01-12T12:22:00.002-08:002016-01-15T06:03:47.818-08:00Sacramento City Threatens Occupy Again<div dir="ltr" style="text-align: left;" trbidi="on">
<br /></div>
<iframe width="420" height="315" src="https://www.youtube.com/embed/qbvlDvYEzoc" frameborder="0" allowfullscreen></iframe>
<a href="http://1.bp.blogspot.com/-Z4q0PYdBZ2g/VpVgOQOsS9I/AAAAAAAACkQ/ucSFb4yUDOA/s1600/IMG_20160112_113950.jpg" imageanchor="1" ><img border="0" src="http://1.bp.blogspot.com/-Z4q0PYdBZ2g/VpVgOQOsS9I/AAAAAAAACkQ/ucSFb4yUDOA/s320/IMG_20160112_113950.jpg" /></a><a href="http://3.bp.blogspot.com/-FAOSDDGBpTg/VpVgOS915BI/AAAAAAAACkM/tvfNpH1Oqlo/s1600/IMG_20160112_115215.jpg" imageanchor="1" ><img border="0" src="http://3.bp.blogspot.com/-FAOSDDGBpTg/VpVgOS915BI/AAAAAAAACkM/tvfNpH1Oqlo/s320/IMG_20160112_115215.jpg" /></a><a href="http://3.bp.blogspot.com/-q0V6eEmBn0Q/VpVgNRa6Z_I/AAAAAAAACkE/iKxXvYYVOEg/s1600/IMG_20160112_115626.jpg" imageanchor="1" ><img border="0" src="http://3.bp.blogspot.com/-q0V6eEmBn0Q/VpVgNRa6Z_I/AAAAAAAACkE/iKxXvYYVOEg/s320/IMG_20160112_115626.jpg" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGP3O9lTzhc6g-v0aF0RKohJfNbq15Wl_IHSV3xrX5bu6fmpzl51tC4entZHd_kQNda2ssGlA1t6hwfh8gNqv39hQQKGne9ImYaGJZVa3fL8GMPOvSHny8XROPlEATzRS6OmEdJTOXEUdH/s1600/IMG_20160112_115748.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGP3O9lTzhc6g-v0aF0RKohJfNbq15Wl_IHSV3xrX5bu6fmpzl51tC4entZHd_kQNda2ssGlA1t6hwfh8gNqv39hQQKGne9ImYaGJZVa3fL8GMPOvSHny8XROPlEATzRS6OmEdJTOXEUdH/s320/IMG_20160112_115748.jpg" /></a>
<a href="http://3.bp.blogspot.com/-Fk4hk_RizQ0/Vpj8JvgnwxI/AAAAAAAACnM/7vxv8RJ1fCU/s1600/IMG_20160114_105721.jpg" imageanchor="1" ><img border="0" src="http://3.bp.blogspot.com/-Fk4hk_RizQ0/Vpj8JvgnwxI/AAAAAAAACnM/7vxv8RJ1fCU/s400/IMG_20160114_105721.jpg" /></a><a href="http://2.bp.blogspot.com/-m3D1qa3RY00/Vpj8JqaUKfI/AAAAAAAACnU/UosMmX0TLis/s1600/IMG_20160114_110417.jpg" imageanchor="1" ><img border="0" src="http://2.bp.blogspot.com/-m3D1qa3RY00/Vpj8JqaUKfI/AAAAAAAACnU/UosMmX0TLis/s400/IMG_20160114_110417.jpg" /></a><a href="http://4.bp.blogspot.com/-Fsc_2J7AxFY/Vpj8J7bUU3I/AAAAAAAACnQ/Xln1eWaoPng/s1600/IMG_20160114_110437.jpg" imageanchor="1" ><img border="0" src="http://4.bp.blogspot.com/-Fsc_2J7AxFY/Vpj8J7bUU3I/AAAAAAAACnQ/Xln1eWaoPng/s400/IMG_20160114_110437.jpg" /></a><a href="http://2.bp.blogspot.com/-XGIouObEqCs/Vpj8KRnTaII/AAAAAAAACnY/SgpC8YPk9-c/s1600/IMG_20160114_110510.jpg" imageanchor="1" ><img border="0" src="http://2.bp.blogspot.com/-XGIouObEqCs/Vpj8KRnTaII/AAAAAAAACnY/SgpC8YPk9-c/s400/IMG_20160114_110510.jpg" /></a>raptorhttp://www.blogger.com/profile/14287416587600419675noreply@blogger.com0tag:blogger.com,1999:blog-8301333049390472977.post-15301067699401590732016-01-09T08:44:00.001-08:002016-01-10T13:35:58.263-08:00The Attempted Annihlation of Occupy<div dir="ltr" style="text-align: left;" trbidi="on">
<br /></div>
<iframe width="420" height="315" src="https://www.youtube.com/embed/BdjD0-r4tgE" frameborder="0" allowfullscreen></iframe>
<a href="http://3.bp.blogspot.com/-G8fvPdO7-o8/VpE4Qn9LczI/AAAAAAAACgw/az0qZd_k2jQ/s1600/IMG_20160109_081755.jpg" imageanchor="1" ><img border="0" src="http://3.bp.blogspot.com/-G8fvPdO7-o8/VpE4Qn9LczI/AAAAAAAACgw/az0qZd_k2jQ/s400/IMG_20160109_081755.jpg" /></a>
<iframe width="420" height="315" src="https://www.youtube.com/embed/79_nTi2vkfQ" frameborder="0" allowfullscreen></iframe>
<a href="http://4.bp.blogspot.com/-H8WlsDv1ZLY/VpJ2_19LbvI/AAAAAAAACi0/AQI64Us7S4s/s1600/cop-crop-IMG_20160109_081754.jpg" imageanchor="1" ><img border="0" src="http://4.bp.blogspot.com/-H8WlsDv1ZLY/VpJ2_19LbvI/AAAAAAAACi0/AQI64Us7S4s/s640/cop-crop-IMG_20160109_081754.jpg" /></a>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyHMOrVZ_qIvKdDqmF04NU3MlGWFe0jI0PKj9tMVgMiCEkutmcvfj2DZNc8S4w9m0i127UkFg6tuNzzOXyvzZ21Z6USflHRp_tI0uC3xLxLimi3BCb0_WjXbn7rcQJUa9iANrHmUUafSCc/s1600/IMG_20160109_081734.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyHMOrVZ_qIvKdDqmF04NU3MlGWFe0jI0PKj9tMVgMiCEkutmcvfj2DZNc8S4w9m0i127UkFg6tuNzzOXyvzZ21Z6USflHRp_tI0uC3xLxLimi3BCb0_WjXbn7rcQJUa9iANrHmUUafSCc/s400/IMG_20160109_081734.jpg" /></a>
<iframe width="420" height="315" src="https://www.youtube.com/embed/ZYA7UX0YJQ4" frameborder="0" allowfullscreen></iframe>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKfNvH3I1QgsI-VQrCqiEef1UQvUP6g228fJerKNLBX29LPHNOWknzBPHpwchw06ucQjx-ZvWTVgqq4KHDc3AmXXG0U1C7B99YIJLkTUdgYTW7G5YkLv0HXgX_Q5wQ5o3Lr5UWF1w_k1GO/s1600/IMG_20160109_073748.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKfNvH3I1QgsI-VQrCqiEef1UQvUP6g228fJerKNLBX29LPHNOWknzBPHpwchw06ucQjx-ZvWTVgqq4KHDc3AmXXG0U1C7B99YIJLkTUdgYTW7G5YkLv0HXgX_Q5wQ5o3Lr5UWF1w_k1GO/s320/IMG_20160109_073748.jpg" /></a><a href="http://2.bp.blogspot.com/-XaGiXRpe6SE/VpE4vcVCNGI/AAAAAAAAChE/k1Io7mfBK5Q/s1600/IMG_20160109_073902.jpg" imageanchor="1" ><img border="0" src="http://2.bp.blogspot.com/-XaGiXRpe6SE/VpE4vcVCNGI/AAAAAAAAChE/k1Io7mfBK5Q/s320/IMG_20160109_073902.jpg" /></a>
<iframe width="420" height="315" src="https://www.youtube.com/embed/GY91WssrXBM" frameborder="0" allowfullscreen></iframe>
<a href="http://1.bp.blogspot.com/-mwR-PqZslGY/VpE47t8v8KI/AAAAAAAAChQ/8GWZUBxi4pw/s1600/IMG_20160109_073314.jpg" imageanchor="1" ><img border="0" src="http://1.bp.blogspot.com/-mwR-PqZslGY/VpE47t8v8KI/AAAAAAAAChQ/8GWZUBxi4pw/s400/IMG_20160109_073314.jpg" /></a>
<h4>links</h4>
<ul>
<li><a href="http://www.kcra.com/news/Homeless-threaten-action-remain-camped-outside-Sacramento-City-Hall/37344042">http://www.kcra.com/news/Homeless-threaten-action-remain-camped-outside-Sacramento-City-Hall/37344042</a></li>
<li><a href="http://www.sacbee.com/news/local/crime/article53921025.html">http://www.sacbee.com/news/local/crime/article53921025.html</a></li>
</ul>raptorhttp://www.blogger.com/profile/14287416587600419675noreply@blogger.com4tag:blogger.com,1999:blog-8301333049390472977.post-30954262097409035472015-12-21T13:13:00.000-08:002019-05-18T05:22:17.243-07:00Fuck Sacramento<div dir="ltr" style="text-align: left;" trbidi="on">
<br /></div>
<iframe width="560" height="315" src="https://www.youtube.com/embed/UsdORTAcSL4" frameborder="0" allowfullscreen></iframe>
<ul>
<li>
<a href="http://sacramento.cbslocal.com/2015/12/09/homeless-advocates-sleep-outside-sacramento-city-hall-in-protest/">
http://sacramento.cbslocal.com/2015/12/09/homeless-advocates-sleep-outside-sacramento-city-hall-in-protest/
</a>
</li>
<li>
<a href="http://sacramento.cbslocal.com/2015/12/25/protesters-continue-to-fight-for-homeless-outside-sacramento-city-hall-on-christmas/">
http://sacramento.cbslocal.com/2015/12/25/protesters-continue-to-fight-for-homeless-outside-sacramento-city-hall-on-christmas/
</a>
</li>
</ul>
<a href="http://4.bp.blogspot.com/-IhItVzEPZMo/VnhqyGH-_8I/AAAAAAAACd8/7Jv3Ocrk750/s1600/group-shot.jpg" imageanchor="1" ><img border="0" src="http://4.bp.blogspot.com/-IhItVzEPZMo/VnhqyGH-_8I/AAAAAAAACd8/7Jv3Ocrk750/s320/group-shot.jpg" /></a>
<p>
The city of sacramento has many ordinances in place to push people living on the streets even lower into the gutter, so they can decompose and be flushed out to sea. I recently starting camping with the <a href="http://occupysf.net/index.php/2015/12/08/homeless-protest-city-councils-camping-ordinance-by-camping-at-city-hall-by-bob-moffitt-capradio-org/">Occupy Sac</a> protesters at city hall, who plan to stay until the city revokes the ordinance.
</p>
<a href="http://1.bp.blogspot.com/-08JR2REOJuQ/VnhrD_TT-NI/AAAAAAAACeE/E2UvMyGo_hs/s1600/me_and_ajgunn.jpg" imageanchor="1" ><img border="0" src="http://1.bp.blogspot.com/-08JR2REOJuQ/VnhrD_TT-NI/AAAAAAAACeE/E2UvMyGo_hs/s320/me_and_ajgunn.jpg" /></a>
<p>
“Sleeping is a life-sustaining activity- i.e., it must occur at some time in some place,” argued the DOJ in the still pending case. “If a person literally has nowhere to go, then enforcement of the anti-camping ordinance against that person criminalizes her for being homeless.” Such laws, the DOJ argues, violate 8th Amendment protections against cruel and unusual punishment, and thus, unconstitutional. - <a href="http://occupysac.com/homeless-advocates-to-occupy-sacramento-city-hall/">http://occupysac.com/homeless-advocates-to-occupy-sacramento-city-hall/</a>
</p>
<h3>police say illegal to feed people</h3>
<p>by order of the city council</p>
<iframe width="200" height="340" src="https://www.youtube.com/embed/Ot12Jik7w8I" frameborder="0" allowfullscreen></iframe>
<h3>updates: jan 8th</h3>
<a href="http://1.bp.blogspot.com/-cdXxkP3LyOM/VpA9x33l4aI/AAAAAAAACfk/cCtgR9D05IU/s1600/IMG_20160108_105307.jpg" imageanchor="1" ><img border="0" src="http://1.bp.blogspot.com/-cdXxkP3LyOM/VpA9x33l4aI/AAAAAAAACfk/cCtgR9D05IU/s320/IMG_20160108_105307.jpg" /></a><a href="http://1.bp.blogspot.com/-q1VcTiY-FIc/VpA9xurzDHI/AAAAAAAACfc/KquTi_6is2E/s1600/IMG_20160108_105322.jpg" imageanchor="1" ><img border="0" src="http://1.bp.blogspot.com/-q1VcTiY-FIc/VpA9xurzDHI/AAAAAAAACfc/KquTi_6is2E/s320/IMG_20160108_105322.jpg" /></a><a href="http://2.bp.blogspot.com/-I5aLY_FQMkg/VpA9x5AkL8I/AAAAAAAACfg/6UpDSr3EUzo/s1600/IMG_20160108_105342.jpg" imageanchor="1" ><img border="0" src="http://2.bp.blogspot.com/-I5aLY_FQMkg/VpA9x5AkL8I/AAAAAAAACfg/6UpDSr3EUzo/s320/IMG_20160108_105342.jpg" /></a>
<iframe width="560" height="315" src="https://www.youtube.com/embed/BVx1gVPpPjw" frameborder="0" allowfullscreen></iframe>
<h3>Anonymous Threatens Sacramento</h3>
<ul>
<li><a href="http://www.sacbee.com/news/local/crime/article53497500.html">http://www.sacbee.com/news/local/crime/article53497500.html</a></li>
<li><a href="http://www.kcra.com/news/local-news/news-sacramento/anonymous-releases-video-threatening-city-of-sacramento/37314642">http://www.kcra.com/news/local-news/news-sacramento/anonymous-releases-video-threatening-city-of-sacramento/37314642</a></li>
<li><a href="http://www.nbcbayarea.com/news/california/Video-Posted-by-Group-Claiming-to-be-Anonymous-Threatens-Action-Against-Sacramento-Over-Homeless-Policies-364543651.html">http://www.nbcbayarea.com/news/california/Video-Posted-by-Group-Claiming-to-be-Anonymous-Threatens-Action-Against-Sacramento-Over-Homeless-Policies-364543651.html</a></li>
<li><a href="http://sacramento.cbslocal.com/2016/01/07/anonymous-threatens-sacramento-over-policies-towards-homeless/">http://sacramento.cbslocal.com/2016/01/07/anonymous-threatens-sacramento-over-policies-towards-homeless/</a></li>
</ul>raptorhttp://www.blogger.com/profile/14287416587600419675noreply@blogger.com0tag:blogger.com,1999:blog-8301333049390472977.post-40556985415764492222015-06-04T08:02:00.001-07:002015-06-10T02:15:30.786-07:00Spaceship Earth - part2<div dir="ltr" style="text-align: left;" trbidi="on">
<br /></div>
<a href="http://3.bp.blogspot.com/-AeOMg4EZZ8c/VXBn_a3vMoI/AAAAAAAABwA/Eh4IVB33N2o/s1600/previewshot.jpg" imageanchor="1" ><img border="0" src="http://3.bp.blogspot.com/-AeOMg4EZZ8c/VXBn_a3vMoI/AAAAAAAABwA/Eh4IVB33N2o/s400/previewshot.jpg" /></a>
<p>
At the moment, mankind is quickly destroying the Earth's natural environment and each other.
Spaceship Earth helps us see the Earth as a permanent home, rather than something we are simply going to ditch in a couple billion years when the sun becomes a hostile red giant star. We need to start working together now to clean up the environment, and make sure all races and cultures can first live in peace, and then voluntarily cooperate to create this mega structure. No other species can save the planet, so we better step up and get to work now on a real peace plan.
</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/7xmYf8DPAKY" frameborder="0" allowfullscreen></iframe>
<hr/>
<h3>Spaceship Earth Near Light Speed</h3>
<a href="http://2.bp.blogspot.com/-7D3vOu6eTyE/VXM7nN1VsKI/AAAAAAAABwk/QSYP2HFVCzg/s1600/SSE-lightspeed-nebula.jpg" imageanchor="1" ><img border="0" src="http://2.bp.blogspot.com/-7D3vOu6eTyE/VXM7nN1VsKI/AAAAAAAABwk/QSYP2HFVCzg/s400/SSE-lightspeed-nebula.jpg" /></a>
<p>
After living in peace and harmony for millions of years, humanity and the entire earth reach <a href="http://en.wikipedia.org/wiki/Relativistic_speed">relativistic speeds</a>.
</p>
<a href="http://4.bp.blogspot.com/-lHSk8JHDbUw/VXM4aWwKtVI/AAAAAAAABwY/EhcBHVEQkhE/s1600/SSE-lightspeed-preview1.jpg" imageanchor="1" ><img border="0" src="http://4.bp.blogspot.com/-lHSk8JHDbUw/VXM4aWwKtVI/AAAAAAAABwY/EhcBHVEQkhE/s640/SSE-lightspeed-preview1.jpg" /></a>
<iframe width="560" height="315" src="https://www.youtube.com/embed/eGEC7JHjrfs" frameborder="0" allowfullscreen></iframe>
<hr/>
<h3>Blender Scene</h3>
<p>
Created with Blender 2.74
<p>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmf0VgadAOJUuP6V4Ft0oDoUXMuHTPkavAa22Kv8cbuYT0lYFr9sbU0wBx6fCXj67hoJsqIz1vuhdQeXQ-Wv491HprxQCQxrg-zCQoomyG-OOVZytfezHZmgzS2br9xOPuXhMsrerEi9kq/s1600/spaceshipearth-SETUP.blend.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmf0VgadAOJUuP6V4Ft0oDoUXMuHTPkavAa22Kv8cbuYT0lYFr9sbU0wBx6fCXj67hoJsqIz1vuhdQeXQ-Wv491HprxQCQxrg-zCQoomyG-OOVZytfezHZmgzS2br9xOPuXhMsrerEi9kq/s400/spaceshipearth-SETUP.blend.png" /></a>raptorhttp://www.blogger.com/profile/14287416587600419675noreply@blogger.com1tag:blogger.com,1999:blog-8301333049390472977.post-87045256743041244122015-04-13T16:31:00.001-07:002015-04-13T16:31:18.330-07:004D Navigation<div dir="ltr" style="text-align: left;" trbidi="on">
<br /></div>
<iframe width="560" height="315" src="https://www.youtube.com/embed/_t3mpHGQZa8" frameborder="0" allowfullscreen></iframe>
<p>
This weekend I teamed up with Steve Favis on a nearly nonstop 30 hour hackathon for NASA SpaceApps 2015. We developed a navigation system that takes into account the physics of possible future events and jumping to reach its target goal. Checkout Steve's twitter for more info: <a href="https://twitter.com/stevefavis">@stevefavis</a>
</p>
raptorhttp://www.blogger.com/profile/14287416587600419675noreply@blogger.com0tag:blogger.com,1999:blog-8301333049390472977.post-44622401835833585702014-02-21T04:43:00.000-08:002014-02-21T04:43:18.272-08:00Fishing in a River of Trash - part2<div dir="ltr" style="text-align: left;" trbidi="on">
<br /></div>
<iframe width="560" height="315" src="//www.youtube.com/embed/DTzRTnY8NGg" frameborder="0" allowfullscreen></iframe>
<a href="http://1.bp.blogspot.com/-wJfGdwMJeb4/UwdInMlN1sI/AAAAAAAAAsY/gacKTGWKJTc/s1600/trash-river4.jpg" imageanchor="1" ><img border="0" src="http://1.bp.blogspot.com/-wJfGdwMJeb4/UwdInMlN1sI/AAAAAAAAAsY/gacKTGWKJTc/s320/trash-river4.jpg" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBHZ2Kx58FSM1YeGNI2ScxNeFBtipPuTQ_cjzprAI0SKntycRbUMGNDZ-LmaHgDkiQG6lkKZODWhxnHCOouiKkdJgY5MzHSa92htDCMc9goFtz87mUqPgY2o68NdwxejGbUMgApUI1Xmne/s1600/trash-river5.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBHZ2Kx58FSM1YeGNI2ScxNeFBtipPuTQ_cjzprAI0SKntycRbUMGNDZ-LmaHgDkiQG6lkKZODWhxnHCOouiKkdJgY5MzHSa92htDCMc9goFtz87mUqPgY2o68NdwxejGbUMgApUI1Xmne/s320/trash-river5.jpg" /></a><a href="http://1.bp.blogspot.com/-1XlNvA5qEmM/UwdIxGCfv7I/AAAAAAAAAsg/FL5EXhZ7KAU/s1600/trash-river6.jpg" imageanchor="1" ><img border="0" src="http://1.bp.blogspot.com/-1XlNvA5qEmM/UwdIxGCfv7I/AAAAAAAAAsg/FL5EXhZ7KAU/s320/trash-river6.jpg" /></a><a href="http://3.bp.blogspot.com/-e-jGt5UPR3o/UwdJDgbmMeI/AAAAAAAAAsw/f1m70ZvHYMI/s1600/trash-river7.jpg" imageanchor="1" ><img border="0" src="http://3.bp.blogspot.com/-e-jGt5UPR3o/UwdJDgbmMeI/AAAAAAAAAsw/f1m70ZvHYMI/s320/trash-river7.jpg" /></a><a href="http://2.bp.blogspot.com/-tTow7ujmgrQ/UwdJGQ0fM6I/AAAAAAAAAs4/DvFRVweSd0Q/s1600/trash-river8.jpg" imageanchor="1" ><img border="0" src="http://2.bp.blogspot.com/-tTow7ujmgrQ/UwdJGQ0fM6I/AAAAAAAAAs4/DvFRVweSd0Q/s320/trash-river8.jpg" /></a>raptorhttp://www.blogger.com/profile/14287416587600419675noreply@blogger.com1tag:blogger.com,1999:blog-8301333049390472977.post-42569139167715803562014-02-20T04:49:00.000-08:002014-02-20T04:49:00.155-08:00Fishing in a River of Trash - part1<div dir="ltr" style="text-align: left;" trbidi="on">
<br /></div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg10EzxoTBAXWnPsM_qvnFia_DG8MTa_sRUXdtV-bqWFDJqMTyQ-kBaoyKt80UFYCkjvb2NQ5YxBV-nBirEv8XZGWR1pWTTFLXMyNo8PKiwWvCR-5Hj6MDB3UFubntRLI8bZcPlmuiuqm3s/s1600/trash-river2.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg10EzxoTBAXWnPsM_qvnFia_DG8MTa_sRUXdtV-bqWFDJqMTyQ-kBaoyKt80UFYCkjvb2NQ5YxBV-nBirEv8XZGWR1pWTTFLXMyNo8PKiwWvCR-5Hj6MDB3UFubntRLI8bZcPlmuiuqm3s/s640/trash-river2.jpg" /></a>
<p>
I had posted earlier this month about the garbage polluting the river that flows into Tarlac City <a href="http://pyppet.blogspot.com/2014/02/san-jose-tarlac-province.html">here.</a> 30Km downstream in the center of Tarlac City, things get much worse.
</p>
<a href="http://2.bp.blogspot.com/-aZZWG9jDOoo/UwX5KVizl7I/AAAAAAAAAsA/jBMJCg72g1g/s1600/trash-river3.jpg" imageanchor="1" ><img border="0" src="http://2.bp.blogspot.com/-aZZWG9jDOoo/UwX5KVizl7I/AAAAAAAAAsA/jBMJCg72g1g/s640/trash-river3.jpg" /></a>
<p>
Passing through the city I often see people of all ages fishing in the river, despite its extreme level of pollution. Today I saw four young boys with a battery and two long prods shocking fish to catch them. They were also collecting coconuts from the river.
</p>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCutERl3-HyoXYi9uPL0AjYbI3Hc7kl_-y4kjqs9juxe3HVA_Gpx0Cq3tJ3uXyuXPVWP0jvYxSy9b3XIGULuNLT25P40N46YDYcTeRJ9xmQ4lXT8ON3Q88-LNjbM4NC1grz9RlVrBljC94/s1600/trash-river1.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCutERl3-HyoXYi9uPL0AjYbI3Hc7kl_-y4kjqs9juxe3HVA_Gpx0Cq3tJ3uXyuXPVWP0jvYxSy9b3XIGULuNLT25P40N46YDYcTeRJ9xmQ4lXT8ON3Q88-LNjbM4NC1grz9RlVrBljC94/s640/trash-river1.jpg" /></a>
raptorhttp://www.blogger.com/profile/14287416587600419675noreply@blogger.com0tag:blogger.com,1999:blog-8301333049390472977.post-41842977185310268472014-02-03T16:13:00.000-08:002014-02-03T16:22:12.242-08:00San Jose - Tarlac Province<div dir="ltr" style="text-align: left;" trbidi="on">
<br /></div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPP8WTdI1bsFT9arh3eBz5Q5WFKh1hvzdiIclYu4xj_Rj2fUsJ4Hgd0YBO_SEs28MBahKTSA-xYS-tCgFb4Ih_ZTOYU2BOlwUdq8jrSDSap2I9GOUyTWDbg7TPBvgWNClP09Bp0v84CIx6/s1600/sanjose-view.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPP8WTdI1bsFT9arh3eBz5Q5WFKh1hvzdiIclYu4xj_Rj2fUsJ4Hgd0YBO_SEs28MBahKTSA-xYS-tCgFb4Ih_ZTOYU2BOlwUdq8jrSDSap2I9GOUyTWDbg7TPBvgWNClP09Bp0v84CIx6/s400/sanjose-view.jpg" /></a>
<a href="http://2.bp.blogspot.com/-n8IUUe5xov0/UvApWBcTuXI/AAAAAAAAAno/2oyr5duq2rU/s1600/sanjose-river.jpg" imageanchor="1" ><img border="0" src="http://2.bp.blogspot.com/-n8IUUe5xov0/UvApWBcTuXI/AAAAAAAAAno/2oyr5duq2rU/s400/sanjose-river.jpg" /></a>
<p>
<a href="http://visit-tarlac.com/">San Jose, Tarlac Province,</a> has a network of cool streams flowing from the western mountains, it one of the few places in the Philippines that it is still safe to drink water directly from the river. Many small villages can be found near and along the water ways.
</p>
<p>
Until recently the people in San Jose had lived in near perfect harmony with their environment; sadly things have recently changed. Along my short 3km hike to the river, I estimate I encountered about twenty small dumping sites composed mainly of baby diapers. All of these sites were relatively new. Each site had about 20-100 diapers.
</p>
<a href="http://4.bp.blogspot.com/-8B-gI-SCm84/UvAppy18NlI/AAAAAAAAAnw/G-6F9MqsH2A/s1600/sanjose-plastic3.jpg" imageanchor="1" ><img border="0" src="http://4.bp.blogspot.com/-8B-gI-SCm84/UvAppy18NlI/AAAAAAAAAnw/G-6F9MqsH2A/s400/sanjose-plastic3.jpg" /></a>
<p>
above: baby diapers torn apart and scattered by wild dogs.
</p>
<h3>Garbage Dynamics</h3>
<a href="http://2.bp.blogspot.com/-23ibgwc1Wws/UvAqfdBZ28I/AAAAAAAAAoA/qH4cutfYr2g/s1600/sanjose-plastic6.jpg" imageanchor="1"><img border="0" src="http://2.bp.blogspot.com/-23ibgwc1Wws/UvAqfdBZ28I/AAAAAAAAAoA/qH4cutfYr2g/s200/sanjose-plastic6.jpg" /></a>
<a href="http://1.bp.blogspot.com/-XSVtcy1ItFY/UvAqcHi2b7I/AAAAAAAAAn4/hVILngoGO18/s1600/sanjose-plastic4.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="http://1.bp.blogspot.com/-XSVtcy1ItFY/UvAqcHi2b7I/AAAAAAAAAn4/hVILngoGO18/s200/sanjose-plastic4.jpg" /></a>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjy5Eoep5Q9ayTncv6pJCQyJJNSLU0JYBos0MxAcMXiC8Qm-pTC7LYdcvXCME6CDUjD-XEILjH5d4RcpyvOcnjdcbUPIzCGxTwD8UbWwcZYKWy-_dEchqfcgd_mvvAonsKU19y_uyzmKGC6/s1600/sanjose-plastic5.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/AVvXsEjy5Eoep5Q9ayTncv6pJCQyJJNSLU0JYBos0MxAcMXiC8Qm-pTC7LYdcvXCME6CDUjD-XEILjH5d4RcpyvOcnjdcbUPIzCGxTwD8UbWwcZYKWy-_dEchqfcgd_mvvAonsKU19y_uyzmKGC6/s200/sanjose-plastic5.jpg" /></a>
<p>
Garbage accumulates at different rates depending on what type it is and where it was dumped. Often it starts out as a few pieces of discarded plastic, once a place no longer is pristine, people are more likely to litter more. Once some threshold has been reached, someone will dump the first big bag of trash, this quickly leads others to dump more in the same area. There is a powerful feedback effect.
</p>
<p>
It is routine in the Philippines to burn trash in remote areas, this helps restore the areas to a relatively clean state, and control the feedback effect. Diapers are hard to burn compared to most other trash, so they tend to build up and encourage the growth of dumping sites. The Pinoy style for trash burning is simply to throw some grass on top and set it ablaze. This technique fails with diapers.
</p>
<h3>How To Safely Burn Plastics</h3>
<p>
Grass and wood should be placed under the plastic. A ratio of at least 50/50 wood/plastic is the minimum. Less harmful <a href="http://en.wikipedia.org/wiki/Dioxins_and_dioxin-like_compounds">dioxins</a> are released when the fire is hot, so the more dry wood the better.
</p>
<a href="http://4.bp.blogspot.com/-Khqt2f7a6aU/UvAsvXBTrPI/AAAAAAAAAoU/VMt26tuXuQI/s1600/sanjose-plastic7.jpg" imageanchor="1" ><img border="0" src="http://4.bp.blogspot.com/-Khqt2f7a6aU/UvAsvXBTrPI/AAAAAAAAAoU/VMt26tuXuQI/s400/sanjose-plastic7.jpg" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmPXKR0JA5Ke-MQv51jcBsLZyqruL2UJnvpOgEPzleNW_tjdh-B8TvgfHHxGJBoGvQJMkupGpITLS6CiaSmujmdZj6HCdqWuG_wbNxFGl6X_BVTIdOL_HTXWKUmFttH5rexkw8PvUIqvMr/s1600/sanjose-plastic8.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmPXKR0JA5Ke-MQv51jcBsLZyqruL2UJnvpOgEPzleNW_tjdh-B8TvgfHHxGJBoGvQJMkupGpITLS6CiaSmujmdZj6HCdqWuG_wbNxFGl6X_BVTIdOL_HTXWKUmFttH5rexkw8PvUIqvMr/s400/sanjose-plastic8.jpg" /></a><a href="http://1.bp.blogspot.com/-2fy-VnEw1Ao/UvAuOyOn2LI/AAAAAAAAAoo/keZnHAP7o0E/s1600/sanjose-plastic9.jpg" imageanchor="1" ><img border="0" src="http://1.bp.blogspot.com/-2fy-VnEw1Ao/UvAuOyOn2LI/AAAAAAAAAoo/keZnHAP7o0E/s400/sanjose-plastic9.jpg" /></a>
<p>
Anything thing with chlorine <a href="http://www.naturalnews.com/022784_paper_chlorine_water.html">(like paper products)</a> when burned with plastics creates more dioxins, so burn them separately. Avoid burning black and dark colored plastics. Obviously, try to recycle as much of the plastic as possible, instead of burning it.
</p>raptorhttp://www.blogger.com/profile/14287416587600419675noreply@blogger.com1tag:blogger.com,1999:blog-8301333049390472977.post-23432294864815710502014-01-23T14:10:00.001-08:002014-01-23T14:10:47.328-08:00Spaceship Earth<div dir="ltr" style="text-align: left;" trbidi="on">
<br /></div>
<p>
A new computer model by Eric Wolf, estimates the earth will be destroyed by our sun in 1.5 billion years. <a href="http://news.sciencemag.org/climate/2014/01/earth-wont-die-soon-thought">[1]</a>
</p>
<p>
It is a popular idea in science and science fiction that we will one day escape destruction on earth by colonizing other planets. In these scenarios the polluted and spent earth is left behind. But, will there be enough space ships to save us all? What about all the plants and animals we would leave behind? This is a bad way of thinking about the future that can have a negative impact on how we think about the present. We more readily accept pollution and things that harm the planet, when we think that in the distant future, we are going to ditch the earth anyways.
</p>
<iframe width="560" height="315" src="//www.youtube.com/embed/29JB7uqo58E" frameborder="0" allowfullscreen></iframe>
<p>
Instead we should plan to save the earth by turning it into a giant space ship, so we can safely move the earth to a higher orbit as the sun becomes a red giant star. Is it too soon to worry about these things? It might take millions of years to safely move the earth to this higher orbit, and transforming the earth into a spaceship may itself take millions of years as well, so we better start now to be sure we have enough time.
</p>
<p>
Much of the earth as we know it will be lost in this radical transformation into spaceship. In order to preserve natural habitats and places for cities of the future, we will need to greatly increase the total surface area, control the weather, and globally route the flow of fresh water. I have created this animation in Blender to try to capture some of these ideas. I imagine the disk structure as a place for the new cities, where people can enjoy flying around in the lower gravity. The original earth surface enclosed in a protective biosphere, can be maintained for wild animals and returned to its natural state. I placed the rocket booster at the south pole, I imagine we would have to drill to the earths core and reinforce the entire earth through its center from both poles.
</p>
raptorhttp://www.blogger.com/profile/14287416587600419675noreply@blogger.com2tag:blogger.com,1999:blog-8301333049390472977.post-48027255931720481152014-01-16T03:05:00.000-08:002014-01-16T03:05:19.927-08:00Tarlac City vs Ace Manalang<div dir="ltr" style="text-align: left;" trbidi="on">
<br /></div>
<iframe width="560" height="315" src="//www.youtube.com/embed/FYXAtYqGazY" frameborder="0" allowfullscreen></iframe>
<p>
No one here can escape the foul smell of burning plastic. Last month I ran into the Mayor of Tarlac City <a href="http://mayoracemanalang.com/">("Ace" Manalang)</a> and confronted him about the widespread dumping of plastic and other waste burning all around the city. He tried to dodge my questions, and kept repeating that: "nothing can be done to change the people".
</p>
<p>
Is it time to give up on clean air and water? I took to the streets to see what people think, and the results surprised me. I spoke with many different people of all ages, and there was a clear pattern in every instance. Women are aware and concerned about the situation, and actively clean and recycle plastics. Children under the age of ten enjoyed picking up plastics, it is seen as a game that can make a little money.
</p>
<p>
Most of the men I spoke with were either drinking beer or gin. They were unaware and not concerned by problems created by burning plastics. When asked to help clean up the community along side the women and children, all quickly refused. This is what surprised me, they clearly had nothing better to do, yet refused to help. What was holding them back? These drunken men were ironically concerned about their public image and status within the community. If they were seen cleaning trash they could be labeled a <a href="http://www.theguardian.com/world/2013/jan/29/manila-philippines-recycling-payatas">"scavenger".</a>
</p>
raptorhttp://www.blogger.com/profile/14287416587600419675noreply@blogger.com0tag:blogger.com,1999:blog-8301333049390472977.post-71755399863248960872013-11-25T04:30:00.000-08:002013-12-10T00:22:54.792-08:00Pystone - PythonJS vs PyPy<div dir="ltr" style="text-align: left;" trbidi="on">
<br /></div>
<p>
The following <a href="http://svn.python.org/projects/python/trunk/Lib/test/pystone.py">Pystone</a> benchmarks were performed with the default 50,000 iterations, the results are the average of five runs. PythonJS is tested in four different modes with greater levels of optimizations. Test machine is: dual core 2.4GHZ, 4GB RAM, LinuxMint with Google-Chrome v31.
</p>
<h3>PythonJS vs Brython and Empythoned</h3>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbBWCO2i-js1fVRIbES8rsxTLq4hUibSY1Eri1meMLgZ6WRKCjlXU77qZH__xBy8bxOpgFFKBxZCn0qEnNKYwKzB0WqAkIZwui3NuHNi15GHpXOJJKUFqlAKpw4B7K2lHOjrK2bKF_nuGX/s1600/brython-empythoned-pythonjs.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbBWCO2i-js1fVRIbES8rsxTLq4hUibSY1Eri1meMLgZ6WRKCjlXU77qZH__xBy8bxOpgFFKBxZCn0qEnNKYwKzB0WqAkIZwui3NuHNi15GHpXOJJKUFqlAKpw4B7K2lHOjrK2bKF_nuGX/s400/brython-empythoned-pythonjs.png" /></a>
<p>
Above: <a href="http://www.brython.info/">Brython</a>, <a href="https://github.com/replit/empythoned">Empythoned</a>, PythonJS in default mode, and PythonJS with inlined optimization.
PythonJS outperforms other browser based Python's: Empythoned (3,320 pystones) and Brython (425 pystones). PythonJS in default mode gets 8,150 pystones per-second. See Brython's JavaScript output <a href="http://pastebin.com/qrr3uAZk">here</a>
</p>
<h3>PythonJS vs PyPy</h3>
<a href="http://3.bp.blogspot.com/-TX_1-A66qPA/UqbO2Q54yBI/AAAAAAAAAkU/_4YKKO-8Y7E/s1600/pystoned-update.png" imageanchor="1" ><img border="0" src="http://3.bp.blogspot.com/-TX_1-A66qPA/UqbO2Q54yBI/AAAAAAAAAkU/_4YKKO-8Y7E/s400/pystoned-update.png" /></a>
<p>
Python2.7 reaches an average of 112,257 Pystones per-second.
<a href="https://github.com/pythonium/pythonium">Pythonium</a> (another Python to JavaScript translator) in its fastest <i>veloce</i> mode reaches an average of pystones 291,480 per-second.
PythonJS in <i>javascript mode</i>, reaches an average of 850,120 Pystones per-second.
PyPy-1.9 is the winner with an average score of 1,813,461 Pystones per-second.
</p>
<hr/>
<h3>Brython PythonJS Integration</h3>
<p>
I am also working on integrating Brython's tokenizer and parser into PythonJS so that PythonJS can be fully self hosted. The file in Brython's source code is <a href="https://bitbucket.org/olemis/brython/src/7df8efe4fcd0bd78f3e5fb60ce3cf2b275f4575c/src/py2js.js?at=default">py2js.js</a>. It transforms Python code into its own abstract syntax tree that is very similar to the standard Python AST. I am making code to walk this tree and convert it into a standard AST that is required by the translator in PythonJS. See these files, and contact me if you would like to help.
</p>
<ul>
<li><a href="https://github.com/PythonJS/PythonJS/blob/master/tests/test_AST.html">https://github.com/PythonJS/PythonJS/blob/master/tests/test_AST.html</a></li>
<li><a href="https://github.com/PythonJS/PythonJS/blob/master/bindings/ast.py">https://github.com/PythonJS/PythonJS/blob/master/bindings/ast.py</a></li>
</ul>raptorhttp://www.blogger.com/profile/14287416587600419675noreply@blogger.com2tag:blogger.com,1999:blog-8301333049390472977.post-650255815008730602013-11-10T18:55:00.000-08:002013-11-10T18:55:38.235-08:00Brython vs PythonJS<div dir="ltr" style="text-align: left;" trbidi="on">
<br /></div>
<p>
If you have not heard of <a href="http://www.brython.info/">Brython</a>, it is one of the most popular in-browser Python implementations. From the top of Brython's documentation: "Brython's goal is to replace Javascript with Python, as the scripting language for web browsers." Brython is a long way from reaching this goal, because as we will see below, it has serious performance issues. Brython is slow because of its conformant implementation of the Python standard, which is very dynamic and is generally hard to map to JavaScript.
</p>
<p>
The following tests compare the performance of Brython 1.1, Python 2.7, PyPy 1.9 and PythonJS 0.8.3. Note that PyPy tests were done with a warmed up JIT. These tests were performed with <b>N=100,000</b> on a dual core 2.4GHZ machine with 4GB of ram. (test scores below are given in seconds)
</p>
<h3>Test1 - for loop:</h3>
<pre>
a = 0
for x in range( N ):
a += 1
</pre>
<ul>
<li>Brython: 6.8249</li>
<li>Python: 0.0064</li>
<li>PyPy: 0.00267</li>
<li>PythonJS: 0.0009</li>
</ul>
<p>
In a simple for loop over a range, with a single variable incremented: Brython is 1,000 times slower than Python, and 7,500 times slower the PythonJS. Lets examine the output of Brython to see why it is so slow.
</p>
<h4>Brython Output</h4>
<pre>
a=$globals["a"]=Number(0)
var $iter61=iter( range.__call__(N) )
var $no_break61=true;
while(true){
try{
x=$globals["x"]=$iter61.__next__()
}
catch($err){
if($err.__name__=="StopIteration"){break}
else{throw($err)}
}
document.$line_info=[21,"__main__"];None;
$temp=Number(1)
if(!hasattr(a,"__iadd__")){
a=$globals["a"]=a.__add__($temp)
}
else{
a=a.__iadd__($temp)
}
}
</pre>
<p>
As we can see above, Brython generates alot of code for such a simple for loop. Instead of using JavaScript's native number type, Brython has its own Number object. It has a try/catch to catch the StopIteration exception, and also it testing each loop if the number has a method <i>__iadd__</i>, and if not it falls back to using <i>__add__</i>.
Lets take a look at how PythonJS translates the same code, and why it is 7,500 times faster in this case.
</p>
<h4>PythonJS Output</h4>
<pre>
a = 0;
var x;
x = 0;
while(x < N) {
a += 1
x += 1
}
</pre>
<p>
The PythonJS compiler knows that a <i>for loop over a range</i> is actually just a simple loop that can be translated to fast JavaScript.
</p>
<h3>Test2 - while loop:</h3>
<pre>
a = 0
i = 0
while i < N:
a += 1
i += 1
</pre>
<ul>
<li>Brython: 13.5709</li>
<li>Python: 0.01008</li>
<li>PyPy: 0.00144</li>
<li>PythonJS: 0.001</li>
</ul>
<p>
Things get worse for Brython when the loop gets more complicated, this tests increments two values. In this test Brython is 1,300 times slower than Python.
</p>
<h3>Test3 - calling simple function:</h3>
<pre>
a = 0
for x in range(N):
a += no_args()
</pre>
<ul>
<li>Brython: 7.717
<li>Python: 0.0137</li>
<li>PyPy: 0.0025169</li>
<li>PythonJS: 0.0019</li>
</ul>
<h3>Test4 - function call with normal arguments:</h3>
<pre>
a = 0
for x in range(N):
a += no_kwargs(1,2,3)
</pre>
<ul>
<li>Brython: 15.3209</li>
<li>Python: 0.0250</li>
<li>PyPy: 0.00279</li>
<li>PythonJS: 0.3729</li>
<li>PythonJS + with fastdef: 0.0039</li>
</ul>
<p>
In this test PythonJS is 14 times slower than Python, this is because by default PythonJS functions that take arguments, have logic to check those arguments at runtime, and to also check if the function was called from JavaScript and if so - adapt the arguments. This can be bypassed using the <b>@fastdef</b> function decorator, or fastdef with statement `with fastdef:`.
</p>
<p>
In the above test, PythonJS with fastdef is 6.4 times faster than Python. Note that you can still call fastdef function from external JavaScript, you only need to pack arguments into an array as the first argument, and pack keyword args into an Object as the second argument. Example: <i>func( [x,y,z], {a:1, b:2, c:3} )</i>
</p>
<h3>Test5 - function call with keyword arguments:</h3>
<pre>
a = 0
for x in range(N):
a += call_kwargs(1,2,3, x=1, y=2, z=3)
</pre>
<ul>
<li>Brython: 14.75</li>
<li>Python: 0.0370</li>
<li>PyPy: 0.00417</li>
<li>PythonJS: 0.631</li>
<li>PythonJS + with fastdef: 0.006</li>
</ul>
<h3>Conclusion</h3>
<p>
Brython is slow and heavy, written almost entirely in JavaScript, and closely follows the Python language standards. Its runtime <i>brython.js</i> is 227KB. Its tokenizer and compiler, <i>py2js.js</i> is 3,500 lines of JavaScript code. It lacks static type analysis and optimizations. Brython is able to translate Python code to JavaScript on the client side. Its performance is much slower than Python.
</p>
<p>
PythonJS is fast and light weight, written in pure Python, and tries to balance performance concerns with the Python language standards (read more <a href="http://blogs-pyjeon.rhcloud.com/?p=465">here</a>). Its runtime <i>pythonjs.js</i> is 98KB. The PythonJS translator is 1,900 lines of Python code. The translator includes static type analysis, and optimizes operator overloading and attribute access. It lacks a tokenizer and currently can only translate code on the server side using Python2 as its host. Its performance can surpass Python and approach PyPy in some cases, because it tries to output JavaScript JIT friendly code.
</p>
<h3>PythonJS 0.8.3 Released</h3>
<a href="http://1.bp.blogspot.com/-hq6TEPvcQCU/UoBGiz2gNKI/AAAAAAAAAf8/4dekXe_seYg/s1600/pythonjs-0.8.3.png" imageanchor="1" ><img border="0" src="http://1.bp.blogspot.com/-hq6TEPvcQCU/UoBGiz2gNKI/AAAAAAAAAf8/4dekXe_seYg/s320/pythonjs-0.8.3.png" /></a>
<p>
Today I have released <a href="https://github.com/PythonJS/PythonJS/releases/tag/0.8.3">PythonJS 0.8.3</a>, this includes the new <i>fastdef</i> and fast for loop optimizations. The performance test above is also included under tests/test_performance.html. The next release of PythonJS will feature integration with NodeJS.
</p>raptorhttp://www.blogger.com/profile/14287416587600419675noreply@blogger.com5tag:blogger.com,1999:blog-8301333049390472977.post-14814924579461363472013-11-08T19:20:00.000-08:002013-11-08T19:20:01.509-08:00Pixi.js and Blockly Animation System<div dir="ltr" style="text-align: left;" trbidi="on">
<br /></div>
<iframe width="560" height="315" src="//www.youtube.com/embed/LQp98GNyFaM" frameborder="0" allowfullscreen></iframe>
<p>
I am currently working on a way to drive animations in Pixi.js using Tween.js and GoogleBlockly. The new SpriteController Block directly parses the conditional blocks it contains, if the selected Event is True, then the animation will play. In this example the Bee moves left and right when the <i>left</i> and <i>right</i> keys are pressed.
</p>
<p>
Next I will be working on improving the event system by adding more event types, branching logic, relative animation, and variables.
</p>
<a href="http://2.bp.blogspot.com/-nJvO2FlNNpk/Un2pK8l0zXI/AAAAAAAAAfs/KKBj9We5Otw/s1600/sprite-controller.png" imageanchor="1" ><img border="0" src="http://2.bp.blogspot.com/-nJvO2FlNNpk/Un2pK8l0zXI/AAAAAAAAAfs/KKBj9We5Otw/s400/sprite-controller.png" /></a>raptorhttp://www.blogger.com/profile/14287416587600419675noreply@blogger.com1tag:blogger.com,1999:blog-8301333049390472977.post-28573378600922552042013-11-06T01:32:00.001-08:002013-11-06T01:32:19.259-08:00Pixi.js and GoogleBlockly<div dir="ltr" style="text-align: left;" trbidi="on">
<br /></div>
<h3>Pixi.js</h3>
<p>
<a href="http://www.pixijs.com/">Pixi.js</a> is a fast 2D rendering engine that is optimized for WebGL, and is able to use HTML5 Canvas as a fallback. Using WebGL Pixi is able to render high resolution graphics very quickly. The Pixi API is well designed, and easily wrapped in PythonJS, see my bindings <a href="https://github.com/PythonJS/PythonJS/blob/master/bindings/pixi.py">here.</a>
</p>
<iframe width="560" height="315" src="//www.youtube.com/embed/Cx18QeK3aD4" frameborder="0" allowfullscreen></iframe>
<h3>Google Blockly Integration</h3>
<p>
The officially documented way to integrate Google Blockly with an external API is using <b>Blockly.addChangeListener( my_callback )</b>, your callback will be called each time the UI is updated. Your callback can then call <b>Blockly.JavaScript.workspaceToCode()</b> and then use JavaScript's <i>eval</i> to execute the string that it returns. This only allows for weak integration, here are the following problems:
</p>
<ol>
<li>Your callback will be called for every single UI event, like moving blocks, or typing in an input field.
This is slow and makes it very hard to catch just the events you are interested in.
</li>
<li>You have no way to send signals back to the blocks that generated the code.
This makes it impossible to update fields on Blockly's blocks, like number fields.
For example, your custom block creates a Sprite, and then in the game the sprite is moved,
now your code will need to update the position field on the block in Blockly's workspace,
but the Sprite has no reference to the block to do so.
</li>
<li>
Each time your callback is triggered, you might have to tear down and reinitialize alot of state.
</li>
<li>
This is generally a bad fit for an Actor model, where entities carry out their own behaviors,
and interact with their environment using dynamic rules.
</li>
</ol>
<p>
The above problems show us that the official way to integrate Blockly is pretty much useless with a dynamic system that requires bi-directional updates. The workaround to these problems requires us to modify Blockly's prototypes and functions so that blocks can be created from an external API, and UI events can be caught directly for each field. My solution is implemented in the binding layer between Blockly and PythonJS. Blockly's source code can remain intact - because prototypes and functions can be changed at runtime in JavaScript using special syntax in PythonJS. You can see my binding <a href="https://github.com/PythonJS/PythonJS/blob/master/bindings/blockly.py">here.</a>
</p>
<a href="http://4.bp.blogspot.com/-VQiOPbAM3oA/UnoMB_Tw1RI/AAAAAAAAAfc/uds_JrEcosk/s1600/pixi-blockly-cropped.png" imageanchor="1" ><img border="0" src="http://4.bp.blogspot.com/-VQiOPbAM3oA/UnoMB_Tw1RI/AAAAAAAAAfc/uds_JrEcosk/s400/pixi-blockly-cropped.png" /></a>
<h3>Wrapper Decorators</h3>
<p>
One of my goals when starting the integration between Google Blockly and Pixi was to write as little wrapper code as possible, but not so little that it was unclear how things are tied together. To achive this I implemented two special class decorators: <b>@pythonjs.init_callbacks</b> and <b>@pythonjs.property_callbacks</b>. These are different from normal Python class decorators because they inject some code and attributes into the class and it's methods at compile time. The <i>"Block Generator"</i> in the Blockly binding can then use the extra attributes to hook in it's own callbacks for when instances of a class are created, and when values are set on property setters. In my first attempts to integrate Blockly with Three.js I had written alot of code to generate a custom block for each Three.js class. The new <i>Block Generator</i> can wrap a class and generate a custom block with a single call: <b>block.bind_class( my_class )</b>.
</p>
<p>
To run this demo you need the checkout the latest source code for: Pixi.js, GoogleBlockly, and Tween.js. Then pull the latest source for PythonJS. The source code for the demo is <a href="https://github.com/PythonJS/PythonJS/blob/master/tests/pixi_and_blockly_and_tween.html">here.</a>
</p>raptorhttp://www.blogger.com/profile/14287416587600419675noreply@blogger.com0tag:blogger.com,1999:blog-8301333049390472977.post-65470103679531201042013-10-25T02:39:00.000-07:002013-10-25T02:39:12.332-07:00Blockly Three.js and Tween.js<div dir="ltr" style="text-align: left;" trbidi="on">
<br /></div>
<iframe width="420" height="315" src="//www.youtube.com/embed/i4HSI_zt4VA" frameborder="0" allowfullscreen></iframe>
<p>
<a href="https://github.com/sole/tween.js/">Tween.js</a> by Soledad Penades is a fast and simple animation library that can interpolate "tween" values. I have created a binding for Tween.js for PythonJS, <a href="https://github.com/PythonJS/PythonJS/blob/develop/bindings/tween.py">here,</a> and integrated it with the GoogleBlockly THREE.js editor, the new animation blocks are efficiently driven by Tween.js and can animate translation and color. see my commit <a href="https://github.com/PythonJS/PythonJS/commit/5b9de1fed9481d8aeea32a7f4d4aa1c891879f26">here.</a>
</p>
<p>
Last night I was chatting with Erik de Bruijn (creator of <a href="https://www.ultimaker.com/">The UltiMaker</a> 3D printer) and he completely blew me away with his work he has been pioneering with <a href="https://code.google.com/p/blockly/">GoogleBlockly</a> and THREE.js to make a constructive solid geometry editor called "UltiShaper". Do not miss these youtubes he has posted!
</p>
<ul>
<li><a href="http://www.youtube.com/watch?v=aG77wX4wFTc">Erik's UltiShaper preview3</a></li>
<li><a href="http://www.youtube.com/watch?v=gogJLELiPdw">Erik's UltiShaper preview2</a></li>
<li><a href="http://www.youtube.com/watch?v=E4GMLDY_i-0">Erik's UltiShaper preview1</a></li>
</ul>raptorhttp://www.blogger.com/profile/14287416587600419675noreply@blogger.com2tag:blogger.com,1999:blog-8301333049390472977.post-78716649794224148962013-07-16T18:27:00.000-07:002013-07-18T12:40:10.115-07:00We live in the forest<div dir="ltr" style="text-align: left;" trbidi="on">
<iframe width="420" height="315" src="//www.youtube.com/embed/jZtvXLryGfQ" frameborder="0" allowfullscreen></iframe>
<a href="http://4.bp.blogspot.com/-gg-O8E-KEz0/UeX5BTgJR3I/AAAAAAAAAXw/wtaT4Y3PrAA/s1600/DSC00095.jpg" imageanchor="1" ><img border="0" src="http://4.bp.blogspot.com/-gg-O8E-KEz0/UeX5BTgJR3I/AAAAAAAAAXw/wtaT4Y3PrAA/s400/DSC00095.jpg" /></a>
<br />
This is Miran and I.
I am coding, while he is training for a fight.
<a href="http://thomasbacklund.com/category/2013-forest-life/">Thomas Backlund</a> is another coder living in the forest, but not like Miran and I. No tent, no sleeping bags required - just dig a hole.
</div>raptorhttp://www.blogger.com/profile/14287416587600419675noreply@blogger.com0tag:blogger.com,1999:blog-8301333049390472977.post-75973781217758974292012-07-17T00:12:00.001-07:002012-12-27T21:48:56.820-08:00Google Blockly in Blender<iframe allowfullscreen="" frameborder="0" height="240" src="http://www.youtube.com/embed/ikyaLe2FlUI" width="480"></iframe>
<p>
Hacking around with <a href="http://code.google.com/p/blockly/">Google Blockly</a> and Blender. Blockly inside of Blender could be useful for game play scripting and other things. At the moment this is just a proof of concept how to get WebKit and Blockly to load inside of Blender and have simple two-way communication.
</p>
This hack is standalone, and already includes Blender2.63 compiled by natewiebe13 from Graphicall.org. To get this running, all you need to do is: <i>"sudo apt-get install libwebkitgtk-3.0-dev"</i>
<a href="http://pyppet.googlecode.com/files/blockly-in-blender.tar.bz2">download here</a>
<h3>Hello World Source Code</h3>
<pre>
import bpy
def myprocedure():
'''
user defined function, in blockly just define an empty function,
and give it the name "myprocedure"
'''
bpy.ops.mesh.primitive_monkey_add()
###############################################
import os, sys, time, ctypes
sys.path.append( os.path.abspath('.') )
import webkitgtk as webkit
import Blender # brett's ctypes wrapper to libblender
gtk = glib = webkit # webkit links to gtk and glib
gtk.init()
def get_html():
dom = view.get_dom_document()
html = webkit.dom_html_element_get_inner_html( dom )
return html
def call_javascript( script ):
'''
this won't work because it kills newlines!
view.execute_script('document.title=%s;' %script)
'''
view.execute_script(
"document.getElementsByTagName('text_hack')[0].setAttribute('x',%s);"%script
)
result = get_html()
result = result.split('text_hack x="')[-1]
result = result.split('"')[0]
return result
def hack_code( script ):
'''
need to hack the script a bit, blockly generates python2,
and blender needs python3!
'''
a = []
for line in script.splitlines():
if "print '" in line:
line = line.replace("print '", "print('") + ')'
if line == 'null': continue # blockly bug?
elif line.strip() == 'passnull': # check for an undefined function and remove it
a.pop()
continue
a.append(line)
script = '\n'.join(a)
print('----------- python code -------------')
print(script)
return script
def execute_python( script ):
script = hack_code( script )
print('----------- exec python code -------------')
exec( script )
################### WebKitGTK ####################
view = webkit.webkit_web_view_new()
print(view)
settings = webkit.web_settings_new()
for prop in 'enable-webaudio enable-file-access-from-file-uris enable-universal-access-from-file-uris enable-developer-extras enable-accelerated-compositing enable-webgl'.split():
gval = glib.GValue(True)
glib.g_object_set_property( settings, prop, gval )
view.set_settings( settings )
view.load_uri( 'file://%s/test-blockly.html'%os.path.abspath('.'))
win = gtk.Window()
root = gtk.VBox()
win.add( root )
header = gtk.HBox()
root.pack_start( header, expand=False )
button = gtk.Button('print html')
button.connect('clicked', lambda b: get_html() )
header.pack_start( button, expand=False )
header.pack_start( gtk.Label() )
button = gtk.Button('print python')
button.connect('clicked', lambda b: hack_code(call_javascript("Blockly.Generator.workspaceToCode('Python')")) )
header.pack_start( button, expand=False )
button = gtk.Button('run python')
button.connect('clicked', lambda b: execute_python(call_javascript("Blockly.Generator.workspaceToCode('Python')")) )
header.pack_start( button, expand=False )
root.pack_start( view, expand=True )
win.set_default_size( 800, 600 )
win.show_all()
class BlenderHack(object):
def update_gtk(self, region):
while gtk.gtk_events_pending():
gtk.gtk_main_iteration()
def setup_blender_hack(self, context):
self._sync_hack_handles = {} # region : handle
self.default_blender_screen = context.screen.name
self.evil_C = Blender.Context( context )
for area in context.screen.areas:
if area.type == 'VIEW_3D':
for reg in area.regions:
if reg.type == 'WINDOW':
handle = reg.callback_add( self.update_gtk, (reg,), 'POST_PIXEL' )
self._sync_hack_handles[ reg ] = handle
return self._sync_hack_handles
def mainloop(self):
self.active = True
while self.active:
screen = bpy.data.screens[ self.default_blender_screen ]
## force a redraw on the 3d view
for area in screen.areas:
if area.type == 'VIEW_3D':
for reg in area.regions:
if reg.type == 'WINDOW':
reg.tag_redraw()
break
## iterate blender's mainloop from ctypes
Blender.iterate( self.evil_C )
time.sleep(0.01)
hack = BlenderHack()
hack.setup_blender_hack( bpy.context )
hack.mainloop()
print('exit to normal blender mainloop')
</pre>raptorhttp://www.blogger.com/profile/14287416587600419675noreply@blogger.com3tag:blogger.com,1999:blog-8301333049390472977.post-33786183820847776132012-06-16T00:30:00.004-07:002012-06-22T09:48:42.740-07:00WebGL - Optimized Streaming<div dir="ltr" style="text-align: left;" trbidi="on"><br /><iframe allowfullscreen="" frameborder="0" height="540" src="http://www.youtube.com/embed/-Z5usqoZSSY" width="340"></iframe><br /><h3>Level of Interest</h3>The client sends camera location updates back to the server. The server then optimizes the client stream, first only stream dynamic mesh for objects very near to the camera, and reduce object transform update as an object becomes more distant to the camera.<br /><h3>Level of Detail</h3>To have the scene load as fast as possible for the client, the server streams the lowest level of detail LOD's to the client first, and then slowly sends the higher resolution mesh and textures. LOD's are generated and cached on the fly by the server and could be adaptive to target the clients profile (mobile or desktop).<br />For each generated LOD the reduction in triangles can be set to any amount, because we do not attempt to preserve UV mapping or sharing materials and textures among LODs - instead we use Blender's decimate modifier to reduce the mesh, uv smart project to generate new UV's, and then generate a new texture using Blender's bake with "selected to active object" using the high resolution mesh as the source of the bake. (baking down to a single material and single texture provides client side performance gains as well, by reducing GPU material/context switching)<br />Three.js has another feature we can use to improve LOD, subdivision surfaces! This puts no extra bandwidth strain on the server because the subdivision is all done on the client side. Note that in this video the frame rate drops on subdivision because the subdivision is recalculated every frame, this could easily be optimized to only recalculate when crossing the LOD distance threshold.<br /><a href="http://4.bp.blogspot.com/-56zWVrNQPZk/T9w1KnzzaAI/AAAAAAAAARE/nlvJ1_Pt0pw/s1600/pyppet-lod-loi.png" imageanchor="1"><img border="0" height="369" src="http://4.bp.blogspot.com/-56zWVrNQPZk/T9w1KnzzaAI/AAAAAAAAARE/nlvJ1_Pt0pw/s400/pyppet-lod-loi.png" width="400" /></a><h3>Streaming Curve Data</h3>Another feature in development is streaming curve data, and later on other types of shapes. This can also greatly reduce server bandwidth because only the control points of the curve need to be streamed, the extrusion to triangles is all done client-side.<iframe width="340" height="540" src="http://www.youtube.com/embed/xaI6DP3ph0Y" frameborder="0" allowfullscreen></iframe><br /></div>raptorhttp://www.blogger.com/profile/14287416587600419675noreply@blogger.com2tag:blogger.com,1999:blog-8301333049390472977.post-23379467862443171062012-04-27T04:01:00.001-07:002012-04-27T04:07:01.051-07:00Rpython to LLVM - Part2In the <a href="http://pyppet.blogspot.com/2012/04/rpython-to-llvm.html">last post</a> we saw that Rpython-to-LLVM can be 200X faster than Python in a tight loop. What happens when the loop gets more complicated? This next test introduces a Vector class, and using a new decorator, the LLVM backend can translate instances of this class into the <a href="http://en.wikipedia.org/wiki/Streaming_SIMD_Extensions">SSE</a> optimized LLVM vector type.
<br />
<pre>
@rpy.vector( type='float32', length=4 )
class Vector(object):
def __init__(self, x=.0, y=.0, z=.0):
self.x = x
self.y = y
self.z = z
def __getitem__(self, index):
r = .0
if index == 0: r = self.x
elif index == 1: r = self.y
elif index == 2: r = self.z
return r
def __setitem__(self, index, value):
if index == 0: self.x = value
if index == 1: self.y = value
if index == 2: self.z = value
def __add__( self, other ):
x = self.x + other.x
y = self.y + other.y
z = self.z + other.z
return Vector( x,y,z )
</pre>
<br />
The new decorator is "rpy.vector( type, length )" and for best SSE performance it should be of type float32 with length 4 (even if you only use 3).
<br />
<h3>
Test Function:</h3>
<pre>def test(x1, y1, z1, x2, y2, z2):
a = Vector(x1, y1, z1)
b = Vector(x2, y2, z2)
i = 0
c = 0.0
while i < 16000000:
v = a + b
c += v[0] + v[1] + v[2]
i += 1
return c
</pre>
<h3>
Test Results:</h3>
<ul>
<li>Python2 = 51 seconds</li>
<li>Rpython-to-LLVM = 0.019 seconds</li>
</ul>
How could LLVM be 2,680X faster than standard Python? It turns out in this case LLVM is able to optimize the while-loop by moving many operations into the "function entry" and reducing the work the while-loop needs to do (see the optimized LLVM ASM below).
<br />
<h3>
LLVM ASM</h3>
<pre>define float @test(float %x1_0, float %y1_0, float %z1_0, float %x2_0, float %y2_0, float %z2_0) {
entry:
%0 = insertelement <4 x float> <float 0.000000e+00="" float="" undef,="">, float %x1_0, i32 0
%1 = insertelement <4 x float> %0, float %y1_0, i32 1
%2 = insertelement <4 x float> %1, float %z1_0, i32 2
%3 = insertelement <4 x float> <float 0.000000e+00="" float="" undef,="">, float %x2_0, i32 0
%4 = insertelement <4 x float> %3, float %y2_0, i32 1
%5 = insertelement <4 x float> %4, float %z2_0, i32 2
%vecadd = fadd <4 x float> %2, %5
%element = extractelement <4 x float> %vecadd, i32 0
%element3 = extractelement <4 x float> %vecadd, i32 1
%v5 = fadd float %element, %element3
%element4 = extractelement <4 x float> %vecadd, i32 2
%v7 = fadd float %v5, %element4
br label %while_loop
while_loop:
%st_c_0.0 = phi float [ 0.000000e+00, %entry ], [ %v8, %while_loop.while_loop_crit_edge ]
%st_i_0.0 = phi i32 [ 0, %entry ], [ %v9, %while_loop.while_loop_crit_edge ]
%v8 = fadd float %st_c_0.0, %v7
%v9 = add i32 %st_i_0.0, 1
%v10 = icmp ult i32 %v9, 16000000
br i1 %v10, label %while_loop.while_loop_crit_edge, label %else
while_loop.while_loop_crit_edge:
br label %while_loop
else:
%v8.lcssa = phi float [ %v8, %while_loop ]
ret float %v8.lcssa
}
</float></float></pre>
<h2>
Part2: Escaping the GIL</h2>
llvm-py contains an example "call-jit-ctypes.py" that shows you how to bypass the LLVM Execution Engine and instead call your compiled function via ctypes. The advantage of using ctypes over the Execution Engine is that ctypes will release the GIL and allows your Python threads to run in parallel. The next test simply calls the same function four times from four threads at the same time.
<br />
<h4>
Test 4 Threads:</h4>
<ul>
<li>LLVM Execution Engine = 0.086 seconds</li>
<li>Ctypes = 0.025 seconds</li>
</ul>
As we can see in this test with 4 threads, ctypes is 3.4X faster on a quad core CPU. Note that another way to escape the GIL is the multiprocessing module, there are pros and cons for both processes and threads. Rpythonic now uses ctypes by default to call the compiled LLVM functions, so its up to you to decide if you want to take advantage of threads or not.raptorhttp://www.blogger.com/profile/14287416587600419675noreply@blogger.com2tag:blogger.com,1999:blog-8301333049390472977.post-8177146112758568282012-04-22T01:58:00.000-07:002012-04-22T19:42:53.244-07:00Rpython to LLVM<a href="http://psyco.sourceforge.net/">Psyco</a> and <a href="http://code.google.com/p/unladen-swallow/">Unladen Swallow</a> were the first to try to make a just-in-time compiler (JIT) for Python, but these projects have stopped, leaving standard Python with no good JIT solution. So I started investigating how hard would it be to make a JIT for Python using Rpython and LLVM. The results of my first <i>highly experimental</i> implementation of Rpython-to-LLVM show very fast JIT performance: 4x faster than PyPy, 200x faster than Python2, and 260x faster than Python3.
<iframe width="420" height="315" src="http://www.youtube.com/embed/vFfgig5jF0k" frameborder="0" allowfullscreen></iframe>
<br />
<h3>
Test Function</h3>
<pre>def simple_test(a, b):
c = 0
while c < 100000*100000:
c += a + b
return c
</pre>
The test function is simply a huge loop that adds-to and returns a 64bit integer. The test was performed on a AMD 2.4ghz Quad with 4GB of RAM, average test result times are:
<br />
<ul>
<li>Rpython-to-LLVM = 2 seconds</li>
<li>PyPy1.8 (with warm JIT) = 8 seconds</li>
<li>Python2.7.2 = 400 seconds</li>
<li>Python3.2.2 = 530 seconds</li>
</ul>
<h3>
Building The JIT</h3>
The first challenge in this project was building the code that traverses the Rpython flow-graph ("flow object space") and converts it into LLVM format. For each Rpython flow-graph block a new LLVM basic-block is created, and for each operation in the block a new LLVM instruction is created. Blocks that loop and modify a variable require some extra work, these mutable variables are treated as stack allocations, and then the LLVM optimization pass PROMOTE_MEMORY_TO_REGISTER replaces the costly stack allocations with fast register memory.
It is interesting to see what LLVM IR looks like for the simple function used in this test, before and after the PROMOTE_MEMORY_TO_REGISTER optimization.
<br />
<h5>
Raw LLVM IR</h5>
<pre>define i64 @simple_test(i64 %a_1, i64 %b_1) {
entry:
%st_a_1 = alloca i64 ; <i64*> [#uses=2]
store i64 %a_1, i64* %st_a_1
%st_b_1 = alloca i64 ; <i64*> [#uses=2]
store i64 %b_1, i64* %st_b_1
%st = alloca i64 ; <i64*> [#uses=1]
store i64 0, i64* %st
%st_v2 = alloca i64 ; <i64*> [#uses=4]
store i64 %a_1, i64* %st_v2
br label %while_loop
while_loop: ; preds = %while_loop, %entry
%a_0 = load i64* %st_a_1 ; <i64> [#uses=1]
%b_0 = load i64* %st_b_1 ; <i64> [#uses=1]
%v0 = add i64 %a_0, %b_0 ; <i64> [#uses=1]
%v1 = load i64* %st_v2 ; <i64> [#uses=1]
%v2 = add i64 %v1, %v0 ; <i64> [#uses=2]
store i64 %v2, i64* %st_v2
%v3 = icmp ult i64 %v2, 10000000000 ; <i1> [#uses=1]
br i1 %v3, label %while_loop, label %else_return
else_return: ; preds = %while_loop
%0 = load i64* %st_v2 ; <i64> [#uses=1]
ret i64 %0
}
</i64></i1></i64></i64></i64></i64></i64></i64*></i64*></i64*></i64*></pre>
<h5>
LLVM IR (after PROMOTE_MEMORY_TO_REGISTER)</h5>
<pre>define i64 @simple_test(i64 %a_1, i64 %b_1) {
entry:
br label %while_loop
while_loop: ; preds = %while_loop, %entry
%st_v2.0 = phi i64 [ %a_1, %entry ], [ %v2, %while_loop ] ; <i64> [#uses=1]
%v0 = add i64 %a_1, %b_1 ; <i64> [#uses=1]
%v2 = add i64 %st_v2.0, %v0 ; <i64> [#uses=3]
%v3 = icmp ult i64 %v2, 10000000000 ; <i1> [#uses=1]
br i1 %v3, label %while_loop, label %else_return
else_return: ; preds = %while_loop
ret i64 %v2
}
</i1></i64></i64></i64></pre>
<h3>
LLVM Advantages</h3>
LLVM is more than just a JIT, because LLVM IR is platform independent, it becomes the best solution for making Python extension modules that need to support all platforms and all Python versions. A classic Python extension module is written in C, and must be compiled for each Python version, each OS, and each OS type (32bit and 64bits)! (Python2+Python3+PyPy)*(Linux+OSX+Windows)*(32bits+64bits) = 18 targets. How is anybody supposed to compile their Python extension for all 18 targets?
LLVM IR can be generated on any platform any bit-depth, saved to a file, and later loaded and run on any target that PyLLVM supports. PyLLVM works with Python2 and Python3; and is easily portable to PyPy using cpyext. In other words, LLVM IR can easily hit all 18 targets - no problem.
<h5>Extra Advantages:</h5>
<br />
<ul>
<li>LLVM easily calls into C libraries</li>
<li>LLVM has a SIMD accelerated vector type</li>
<li>LLVM has powerful optimizations like: PROMOTE_MEMORY_TO_REGISTER</li>
<li>Rpython and LLVM are a natural fit</li>
</ul>
Still not convinced? <a href="http://software.intel.com/en-us/blogs/2009/05/27/why-we-chose-llvm/">Read what Intel has to say about LLVM.</a>
<h3><a href="http://rpythonic.googlecode.com/files/rpythonic-0.4.7.tar.bz2">source code</a></h3>
<h3><a href="http://www.mdevan.org/llvm-py/">requires Mahadevan's PyLLVM</a></h3>raptorhttp://www.blogger.com/profile/14287416587600419675noreply@blogger.com3tag:blogger.com,1999:blog-8301333049390472977.post-62367495010335777262012-02-01T19:22:00.000-08:002012-02-01T19:40:30.636-08:00Progressive Baking<iframe width="620" height="315" src="http://www.youtube.com/embed/BuTy9WDLPcE" frameborder="0" allowfullscreen></iframe><br />Texture maps are progressively downloaded from the Blender integrated server. Baking happens on demand and is fully automated. Client side javascript code adapts the texture request to best fit the given shader. Supported texture layers: diffuse, AO, specular intensity and displacement.<br /><br /><h3>Hardware Displacement Mapping</h3><br /><iframe width="620" height="349" src="http://www.youtube.com/embed/muHeGpzNqS0?hl=en&fs=1" frameborder="0" allowfullscreen></iframe><br /><br />The base mesh (without subdivision) is sent to the client. The client then applies subdivision and recalculates the tangents. The displacement map is progressively downloaded starting at 64x64 and stopping at 512x512 resolution. The displacement happens in hardware using GLSL shader model 3.0. <i>Code recycled from the Three.js examples.</i>raptorhttp://www.blogger.com/profile/14287416587600419675noreply@blogger.com0