RooJSolutions en RSS: RooJSolutions - /index.php 150 150 Free your data... seed webkit browser mirror button 2012-01-14 00:00:00 <a href="">Article originally from rooJSolutions blog</a><br/> <div>One of the great things about the internet is the availability of cheap or free services online, so many clients are using gmail, dropbox, github etc. for their business operations. But all to often they forget that these services are often playing the oldest game in the technology industry. "Vendor Lock-in".</div><div><br></div><div>While the ones I mentioned are not to bad, you can cheaply and easily rescue or backup your data to another location, or move to an alternative provider. Not all of them are like that.&nbsp;</div><div><br></div><div>We are in the middle of a migration project from Netsuite (It's a SAS Oracle based ERP system) to Xtuple, which is a open source ERP system, based around postgresql. This is a slow and painfull migration, as there is no standard for ERP data, and exporting is slow and clumsy over SOAP. Anyway, as a plesant distraction from this large migration, the same client also wanted us to look at migrating from backpack, a 37 signals product.</div><div><br></div><div>Backpack, unlike all the SAS systems I mentioned has&nbsp;deliberately&nbsp;made it hard, or practically impossible to migrate from their services. The primary offering of backpack is a online file storage service that you can permit clients or suppliers the ability to do share files and folders. It is only web based (unlike dropbox or, and there is no desktop client that you can use to access the files other than the web interface.</div><div><br></div><div>When I started looking at how the company could extract the data, I tried out a few of the classic tools, like wget and httrack however the strong use of javascript, and the convoluted login system with login keys ensured that those kind of tools did not work. The other requirement was the ability to organise the files into folder, by just mirroring the site, you would just end up with thousands of folders called asset/123123/ where the number is probably the UID of the database record.</div><div><br></div><div>So how to rescue the data... Read on for the trick..</div><div><br></div> Barcamp Hong Kong 2010 2010-09-19 00:00:00 <a href="">Article originally from rooJSolutions blog</a><br/> Had a great time at Barcamp Hong Kong yesterday, Saw some really good talks on Y-Combinator , portable Mobile app development with a Webkit wrapper and gave a rather&nbsp;disastrous&nbsp;talk on Javascript (due to technical problems with my laptop, nvidia cards and projectors...)<div><br></div><div>Anyway here's the slideshow I gave in full..</div><div><br></div><div>I will update this post later - with a few more details</div> Javascript Packer 2010-08-11 00:00:00 <a href="">Article originally from rooJSolutions blog</a><br/> Javascript packer in Javascript, with full scoped variable replacement <h3>Source:</h3> <pre>git clone<br><br><a href=";a=tree">;a=tree</a></pre><br><br><br> app.Builder.js - First release 2010-07-05 00:00:00 <a href="">Article originally from rooJSolutions blog</a><br/> <h3>A Release!!! - Well Idle hands make cool stuff...</h3> <object width="560" height="425"><param name="movie" value=";hl=en_US&amp;fs=1&amp;rel=0&amp;border=1"><param name="allowFullScreen" value="true"><param name="allowscriptaccess" value="always"><embed src=";hl=en_US&amp;fs=1&amp;rel=0&amp;border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="425"></object> <br><h3>What is It?</h3>Basically Glade on steriods. (and it needs a good name!!)<br><h3>What?</h3>Well Glade the UI builder is great for what it does, however app.Builder.js attempts to solve a few roadblocks in Glade<br><br><ul><li>Moving stuff around is klumsy - no drag drop - It's not very good for prototyping layouts...</li><li>It's limited in what widgets can be added</li><li>Coding (when used as an Ajunta addon) is just downright messy.</li><li>It's difficult to extend/modify (and in some cases next to impossible)</li><li>Adding additional properties to widgets is difficult</li><li>Information is often hidden from display (how many clicks to find out what signals are connected)</li><li>There is no 'run it and see' option.</li></ul><h3>So what makes this different..?</h3><ul><li>It's all done in Javascript - using a tree like structure (and it's fully self hosting) - the application is used to modify it'self.</li><li>It uses GObject Introspection. which solves a number of issues</li><ul><li>All available properties can be set (and quickly listed, with documentation)</li><li>how widget's can be packed, can be determined from introspection of the methods.</li><li>all signals are available, and stubs are created for you to start implementing.</li></ul><li>Making extra widgets to the application is just a matter of editing files (eventually a UI will enable you to pick from a list of available Introspection elements... )</li><li>You can build web Applications (using toolkits like RooJS) - ExtJS, Moo etc. could be easily added..</li><li>It should be quite easy to build Clutter applications...</li></ul><h3>Do I need to know anything to use it.</h3>Yes, one of the core concepts behind the builder is understanding XObject, a simple Javascript wrapper around GObjects<br>that enables you to create a JSON like tree, and XObject will turn your tree into an application.<br><br>Key features of the XObject are<br><ul><li>xtype - the name of the GObject (eg. Gtk.Window)</li><li>packing - the pack property, can be a string (comma seperated indicating how an element is packed to it's parent)</li><li>id - all objects can have ID's you can fetch any object using this.get('the_id') as long as it's a child of the current element. To look up the tree, use a '.' at the start, or to start at the top of the tree use '/', eg. this.get('/Window') get's you the window. this.get('/Window.toolbar') get's you the first toolbar in the window.</li><li>el - when an element is created, the GObject is always stored in this.el</li><li>|pipe - properties - currently the editor uses '|' as a prefix to indicate the value is raw Javascript (eg. a function or Value, that when used should not be quoted as if it was a string.</li></ul><h3>What state is it in?</h3>Well, It's self editing.. - The application is used to create it's self, just create a new Gtk Project, and point it at the Sample directory, and you can edit the current codebase. (copying it to the Builder directory when you have a stable build)<br><h3>What's to do...</h3>Quite a few tweaks.. It works, but could do with more time in polishing the interface. My personal goal is to save time using it as a productivity tool, for development. Which is basically where it's at..<br><h3>Where do I get it?</h3>Download a tarball <a href="">app.Builder.js.2010-05-25.tgz</a><div> or </div> <div>git clone<br><br></div><div>once unpacked/cloned.</div><div>run - to update your gir files.</div><div>If you want to try RooJS editor - you need git then</div><div>run</div><div><div><br></div><div><h3>What do I need to get it to work?</h3></div><div>basically a working gobject instrospection installation (.gir files and .typelib files) and the latest version of the Gnome seed interpreter</div><div>- I know it works on Linux. I would be interested to hear if it works on other platforms.</div><div>Note: there is a update script in the distribution which fixes the currently available Gtk gir's (please read the readme.txt for more info)</div><div><br></div><div><br></div> </div> Using WebKit Inspector with seed 2010-06-11 14:32:09 <a href="">Article originally from rooJSolutions blog</a><br/> One of the key reasons to create the app.Builder, was so I could speed up the development of Web applications using the Roo library. The web based version saved considerable time, and led to quite an improvement in delivery times for projects.<div><br /></div><div>It's key drawback was the very limited editing enviroment offered by web based textarea, the slight latency and klunky file writing method. However the ability to use Firebug or Webkit inspector was very usefull in debugging in-development applications.</div><div><br /></div><div>As I eat my own dogfood by developing with the desktop version, most of the previous issues with the development platform had been solved, however debugging was very difficult - I effectively had to run the application in a browser to get debugging information. So after a day of fustration with that, I decided to investigate the Webkit API a bit further, and to my delight discovered that the Inspector you see in Chromium / Chrome is just a few lines of code away.</div><div align="baseline"><br /></div><div><img src="" /></div><div><br /></div><div>As you can see above, I can fully debug the application as it's being modified.</div><div><br /></div><div>The basic code to do this was quite simple. It needs a couple of fixes to the WebKit Gir file, (which has been submitted as a bug report to Webkit), but this simple bit of code should illustrate how to use it in seed.</div><div><br /></div><pre>//&lt;Script type=&quot;text/javascript&quot;&gt; /** * Test of web kit inspector. * create a window + 2 webviews. inside scrolled window. * load google in first, then hook in the inspector.. * * needs the transfer ownship fixing on return value in WebKit-1.0.gir * * &lt;method name=&quot;get_inspector&quot; * c:identifier=&quot;webkit_web_view_get_inspector&quot;&gt; * &lt;return-value transfer-ownership=&quot;none&quot;&gt; * &lt;type name=&quot;WebInspector&quot; c:type=&quot;WebKitWebInspector*&quot;/&gt; * &lt;/return-value&gt; * &lt;/method&gt; * * then compile it.. * g-ir-compiler /usr/share/gir-1.0/WebKit-1.0.gir -o /usr/lib/girepository-1.0/WebKit-1.0.typelib * */ Gtk =; WebKit =; Gtk.init(null,null); // build the UI.. w = new Gtk.Window.c_new( Gtk.WindowType.TOPLEVEL); v = new Gtk.VBox(); s1 = new Gtk.ScrolledWindow(); s2 = new Gtk.ScrolledWindow(); w1 = new WebKit.WebView(); w2 = new WebKit.WebView(); s1.add(w1); s2.add(w2); v.add(s1); v.add(s2); w.add(v); // enable inspector.. w1.get_settings().enable_developer_extras = true; // load google on show.. { w1.load_uri(&quot;;); }); // load the inspector when loading has finished! w1.signal.load_finished.connect(function(wv) { w1.get_inspector().show(); }); // return the bottom window as the inspector.. w1.get_inspector().signal.inspect_web_view.connect(function() { return w2; }) // show and go.. w.show_all(); Gtk.main(); </pre> Application Builder slowly growing 2010-05-14 00:00:00 <a href="">Article originally from rooJSolutions blog</a><br/> <p> </p><p>While paid work is still horribly quiet, my little application builder is getting closer to usable.</p><p>I posted a video a while back showing the web version of the Application builder, this is the next generation, a desktop version all done in Javascript using Seed. Not only can it build Roo applications, but also Gtk ones.. (and in theory maybe JQuery/Prototype etc..)</p><p>The main reason to switch to a desktop version was the addition of GtkSourceView, which will enable autocompletion and proper code editing.</p><p> <a href=""><img src=";rs=AOn4CLByreqmkkKHhbu9JNdeLcieZmvwDQ"></a> </p><p>It's really a proof of concept, but I can easily move it out to github from it's current home - <a href=""></a> if anyone want's to help out.</p><p>download:</p><p>git clone</p><p>run once download to get the roo library</p><p><br></p><p> </p> Git Live 2010-05-11 00:00:00 <a href="">Article originally from rooJSolutions blog</a><br/> <p> </p><p>Inotify and Git auto commit then push using Gnome Seed</p> Seed doc updates, and Gio async directory listing 2010-03-08 13:52:00 <a href="">Article originally from rooJSolutions blog</a><br/> The <a href="">documentation for seed gobject introspection</a> is improving continually, I now have a <a href="">jhbuild</a> virtual machine, which is picking up the latest versions from git.<div><br /></div><div>In addition many of the documentation details have been expanded, including</div><div><ul><li>Interfaces, Enums</li><li>callback methods are now documented</li><li>More libraries have been added.</li><li>More doc comments can be picked up</li></ul><div>With better documentation it's finally possible to figure out how to use the API. A classic example of this was a small problem I tried to solve before the API documentation was available. Listing a directory asynchronously, It took me over an hour to get close to figuring out how to do this, I eventually had to give up. as digging through the source, C reference and GIR files took so long.</div><div><br /></div><div>However within 5 minutes with the documentation, I was able to write a small script to do this.</div><pre>Gio =; Gtk =; var f = Gio.file_new_for_path('/home/'); f.enumerate_children_async ( &quot;*&quot;, Gio.FileQueryInfoFlags.NONE, GLib.PRIORITY_DEFAULT, null, function(o,ar) { // listing completed.. var fe = f.enumerate_children_finish(ar);<br /> var ch = false;<br /> while (ch = fe.next_file(null)) { Seed.print(ch.get_name()); } Seed.quit(); }, null); Gtk.main();</pre></div><div><br /></div><div><br /></div><div><br /></div>