tag:blogger.com,1999:blog-73179785721531287192024-03-05T17:42:19.049+00:00Coder's Logreal_atehttp://www.blogger.com/profile/16642853423539458703noreply@blogger.comBlogger13125tag:blogger.com,1999:blog-7317978572153128719.post-7791861226288664242011-03-30T08:07:00.001+01:002011-03-30T08:11:09.164+01:00Call out the bad apples<p>I was originally planning to post the content of this blog as a reply in response to my previous post, <a href="http://realate.blogspot.com/2011/03/is-it-too-early-for-commitment-said.html">"Is it too early for commitment" said the developer</a> but seeing as it ended up being the length of a blog post I though I should promote it to one. <br />
</p><br />
For those of you who have not read <a href="http://realate.blogspot.com/2011/03/is-it-too-early-for-commitment-said.html">my previous post</a> I would suggest that you go and read it. But here is the comment from tbscope that upset so much that I needed to respond. <br />
<a name='more'></a><br />
<blockquote><a href="http://www.blogger.com/profile/00088327780779638610">tbscope</a> said...<br />
<br />
Ohh dear...<br />
<br />
The clasical lazy student.<br />
<br />
It's like saying: "I want to make a quick and easy modification to the space shuttle. Whatever did I know I had to use a difficult to understand fueling method to get the d*mn thing into space?"<br />
<br />
This is just a classic example of not wanting to read the documentation. There's no excuse for it.<br />
<br />
You can build any program in any IDE. You just need it to be set up correctly, and that takes time and knowledge. You know, things that a student should be doing in the first place: learning.<br />
<br />
A lazy student is just a lazy person, and a person who will fail in doing these tasks in later life (unless he changes).<br />
<br />
Before you drive a car, lets first try to at least know how to walk.<br />
<br />
That does not mean I say you can't start driving right away... but at least expect some bumps down the road and some detours.<br />
<br />
I'm a professional electro-mechanical engineer. I have a lot of theoretical and practical knowledge. But guess what: every day, I need to learn something new, something I don't understand and something that takes time to know.<br />
<br />
Deal with it. Either follow the given recipe, or actually learn something.<br />
<br />
But: some things can indeed be made easier to understand, that is true.<br />
<br />
29 March 2011 09:57</blockquote><br />
And here is my response: <br />
<br />
@tbscope I am really disappointed that the first comment I have on this post is one from someone who clearly doesn't really understand the content of my blog post. I was tempted to just delete your comment but I think it is better that I respond to your points and try and explain why I am so disappointed. <br />
<br />
First of all I must point out that it is extremely rude and insulting to jump directly to the phrase "lazy student". At no point in my blog post did I mention the word lazy nor did I imply it. In fact I explicitly said that students have <i>"other valuable things to do with their time... and time is very valuable during college"</i>. I have seen quite a lot of really great minds buckle under the pressure that college puts them through and I think it is very insulting to them, and in fact to all students, to jump on the stereotype of a "lazy student". <br />
<br />
Also your analogy with the space shuttle is fundamentally flawed. First of all developing a desktop program is not rocket science, developing it *well* or knowing everything about it is a whole load more difficult. If we were to turn away all users who were not at an intermediate level or above how are we supposed to survive as a community!? After all, you stated yourself that a student should be *learning*, how will they gain any experience if we effectively say to them "Sorry you're not good enough to join our community, but come back when you're an expert and we'll think about it". We as a community should lower barriers to entry and try to encourage new developers to join us, after all there is a huge mind grab for developers in the open source world so it makes sense that a new developer will begin with the project that is easiest start developing for. <i>Water always seeks the easiest path</i>. <br />
<br />
Also to pick holes in your driving analogy too: Tell me, on your very first driving lesson did your instructor quiz you on the mechanics of an internal combustion engine before they even let you sit in the driver seat? No (or at least if he did then they were a terrible instructor). Instead they would probably explained the basics to you and allowed you to drive a little bit in a controlled environment. Compare that to my user story, the "basics" are how to check it out from subversion and the "controlled environment" is the separate build directory that can be nuked without having to install anything.real_atehttp://www.blogger.com/profile/16642853423539458703noreply@blogger.com13tag:blogger.com,1999:blog-7317978572153128719.post-44993942244560634712011-03-29T08:03:00.004+01:002011-03-29T13:54:55.250+01:00"Is it too early for commitment" said the developer<div><span class="Apple-style-span"></span><br />
<blockquote><p><span class="Apple-style-span"><i>"Stories are part of every community. They communicate culture, organize and transmit information. Most importantly, they spark the imagination as you explore new ideas. They can ignite action."</i></span><br />
</p></blockquote><span class="Apple-style-span">-</span><span class="Apple-style-span" style="font-size: 13px; line-height: 17px;"><span class="Apple-style-span">Whitney Quesenbery</span></span></div><br />
<div><span class="Apple-style-span"><br />
</span></div><div><span class="Apple-style-span">I am looking for all KDE developers who have had to deal with program data requirements to give me their opinion on an issue I have and hopefully we can come up with an inovative way to solve the problem, in true KDE style. If you do not have time to read the full post please <a href="http://www.blogger.com/post-edit.g?blogID=7317978572153128719&postID=4499394224456063471#question">skip down to the technical question </a> and add a quick comment. </span></div><div><span class="Apple-style-span"></span><br />
<a name='more'></a><br />
Let me tell you a story. A college student studying Computer Science decides one day to download the source of his favourite Open Source program and build it from scratch. This college student wants to impress his friends by adding a simple button that shows a dialogue box with his name in it, hence proving his l33t skills.</div><div><br />
</div><div>This "user story" sets up a persona for the protagonist of this blog post, a very low commitment developer that is trying something on a whim. The user story also paints an interesting picuture of the requirements of the user: </div><div><ol><li>Download the program quickly and easily.</li>
<li>Make a really small change, quickly and easily. </li>
<li>Run the program quickly and easily. </li>
</ol>I'm adding the "quickly and easily" because I assume that college students have many other valuable things to do with their time... and time is very valuable during college. </div><div><br />
</div><div>So taking a well known KDE program as our test subject, how does this scenario fit with the Marble Desktop Globe code base? </div><div><br />
</div><div>1) Download quickly and easily: </div><div><br />
</div><div>The Marble website has a link on the frontpage to "Compiling Marble". Well placed and on a very nice looking website! My college student is having a good time so far, he downloads the source from the Subversion Repository and thinks to himself "Hey I like IDEs so why don't I just skip the next part of the instuctions and run marble from, say, QtCreator" ... move on to step 2 </div><div><br />
</div><div>2) Make a really small change, quickly and easily: </div><div><br />
</div><div>This is a topic for another blog post. I believe that code be structured in such a sensible way that it will pratically guide a new developer to where they need to make their change. More on this some other time ... move to step 3</div><br />
<div><br />
</div><div>3) Run the program quickly and easily: </div><div><br />
</div><div>My student is loving his development experience so far. He's enjoyed looking at screen shots on the Marble website while downloading the source, he's found the part of the code he needs to change really quickly and has made his simple change. So what is there left? Just click that big play button in QtCreator and show off your skills to your friends. Wait a few minutes for it to compile and hey presto! I give you marble:</div><div><br />
</div><div><br />
</div><br />
<div><br />
</div><div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgV7_2lLAF8Ibws4srbLK2iTW1MYxF4iZfLLZPdzXhH0gKVqMff0eqTlsF22WlyNs0A6K67Mn0S4WNbLFeGAN_1icSvHxyxK4LK0jeFpJ6fnNB-Ar4kuCgAvsjkYj39V0AtgGM_BQQPfUQ/s1600/snapshot2.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5587048991998964274" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgV7_2lLAF8Ibws4srbLK2iTW1MYxF4iZfLLZPdzXhH0gKVqMff0eqTlsF22WlyNs0A6K67Mn0S4WNbLFeGAN_1icSvHxyxK4LK0jeFpJ6fnNB-Ar4kuCgAvsjkYj39V0AtgGM_BQQPfUQ/s320/snapshot2.png" style="cursor: hand; cursor: pointer; display: block; height: 226px; margin: 0px auto 10px; text-align: center; width: 320px;" /></a></div><div><br />
</div><div>Eh.. Ok What happened here? Our student is confused and a little frustrated but he make at least a tiny bit of effort to see if he can find out the cause of the problem. He finds this message: </div><div><br />
</div><div><br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9ZwQ5ptZ2eHmowuN7oO1V8oss8rotjgRzN26s289avkEkbvXfmoszouVGfr5jRDBBKekgGQa4e_MkPpxFbIuZ7RVUxSYHsweI_f1PGJEMwOEfmZ8xqOrPEysI_MMSVQcK-MObJWse7eE/s1600/snapshot3.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5587049540602777010" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9ZwQ5ptZ2eHmowuN7oO1V8oss8rotjgRzN26s289avkEkbvXfmoszouVGfr5jRDBBKekgGQa4e_MkPpxFbIuZ7RVUxSYHsweI_f1PGJEMwOEfmZ8xqOrPEysI_MMSVQcK-MObJWse7eE/s320/snapshot3.png" style="cursor: hand; cursor: pointer; display: block; height: 194px; margin: 0px auto 10px; text-align: center; width: 320px;" /></a></div><div><br />
</div><div>At this point the ease of development has completely disappeared for our imaginary student. What he doesn't know is that Marble is expecting its supporting data to be located in a specific place, and if he read the rest of the compilation instructions he would have seen that you have to run make && make install before running marble. </div><div><br />
</div><div>Now our student has a choice: </div><div><ol><li>Continue diving into the code of something that he doesn't understand to figure out the problem and fix it </li>
<li>Get involved in the community by contacting someone on IRC or a mailing list (which he has to find) and wait for some help </li>
<li>Give up.</li>
</ol></div><div><br />
</div><div>Which do you think he will choose at this point? Which one of these outcomes do you think the *majority* of the population of mildly interested, not very commited people would do at this stage? What would you do? </div><div><br />
</div><div>I have brought this discussion up on the #kde-devel chanel trying to figure out a nice technical solution to the underlying problem in marble and I got the response from one of our KDE developers: </div><div><br />
</div><div><*unnamed*>: i'm always concerned if we need those really non commited devels </div><div><br />
</div><div>Now the developer in question may make a very valid point. Why should we spend loads of time and effort on the people who think its too much effort to read the the full "Compiling Marble" page. It is a valid point but I fundamentally disagree. </div><div><br />
</div><div>I believe that our imaginary student should go away from this experience thinking that Marble is an easy project to develop for, and sometime in the future he will remember this fact. It might be days, weeks, months or even years but that developer will come to a time in his life where he has an extra 10 mins a day to work on some open source program and will remember his good experience with Marble. This has a powerful effect in the long run. </div><div><br />
</div><div><a href="http://www.blogger.com/post-edit.g?blogID=7317978572153128719&postID=4499394224456063471" name="question">Now for the technical question!</a></div><div><br />
</div><div>The thing that sparked this philosophical rabbit hole for me was a simple technical question: how do you make it so that a developer can just click "run" in QtCreator when working on a CMake based project where the program has data requirements? The current way Marble does it is that it requires the user to run make && make install before running, which to me is not optimal for 3 reasons. </div><div><br />
</div><div><ol><li>The uncommitted developer (our student from the user story above) may not read the documentation enough to realise that they need to make install before running.</li>
<li>The uncommitted developer may not want to scatter files, programs and libraries around their computer without knowing that they will be able to clean their system afterwards.</li>
<li>The default configuration of make install is that it places the install files in system paths that will most likely be security protected so in fact the user will have to run sudo make install. </li>
</ol></div><div><br />
</div><div>Point 2 above is problematic for our uncommited developer because they, most likely, are not committed enough to read the CMake files and understand where the data will go when they do a make install. Point 3 can be avoided by configuring the install path but this is another piece of configuration our student needs to figure out or read somewhere, and frankly I don't even know how to do this. </div><div><br />
</div><div>So what do we do to solve this problem? Marble has a unique way of dealing with its data dependencies, it uses a class called MarbleDirs that is effectively a layer of indirection for the file system. It currently checks 2 places for any of the file names/paths that are requested </div><div><br />
</div><div><ol><li>The system install path for the data</li>
<li>The user's application data folder, so that files can be created without administrator privileges</li>
</ol></div><div><br />
</div><div>This system also serves the purpose of locating the "system install path" and the "user application data folder" in whatever OS Marble is installed on. </div><div><br />
</div><div>I have proposed a change to this system <a href="http://reviewboard.kde.org/r/6574/">http://reviewboard.kde.org/r/6574/</a> that adds another folder to the "watched folder list". The new folder will be the application directory where the Marble executable is located. This ensures that if the data required by the Marble program is copied to the build directory at configure time (with CMake) the QtCreator IDE will run marble fine right out of the box. </div><div><br />
</div><div>I would ask anyone who writes any program that deals with a data dependency to please let me know what your program is and if you have the time a brief description of how you deal with this issue. If you don't have time just tell me where to find the code and I'll go have a look myself. </div><div><br />
</div><div>I am trying to get a feel for how other people have solved this same problem before I re-invent the wheel. Also if you have any ideas please chip in with a quick comment. </div>real_atehttp://www.blogger.com/profile/16642853423539458703noreply@blogger.com11tag:blogger.com,1999:blog-7317978572153128719.post-1588694820593931332009-10-05T22:59:00.008+01:002009-10-05T23:51:39.563+01:00A new life...Graduating from college, throwing away the shite I collected over 22 years of my live, moving to another country, finding a place to live, getting my first job and where do I find myself? Back in the throes of Open Source.<br /><br />I've always found it a struggle to find where my life, work and my passion for open source can all live together without stepping on each other's toes. Just now that I'm starting to try and get used to the norms of office life and working for a living ( sigh ) I'm finding myself trying to define where my time should be spent. We are all familiar with working 9 -5 , so that one is simple enough. Most of us know about "time well wasted" as I like to call it, where you come home from work and spend way too long making a cuppa tea to ever be considered an efficient tea maker or you sit in a chair looking out the window at that cat that has made it onto your car and seems to be making some kind of nest. Time well wasted is always time well spent, it helps to keep us sane! Some of the really lucky ones know about "Hobby Time" and are little known Ultimate Frisbee champions or have an almost complete collection of sea shells that resemble pop stars. But in all this mishmash of social norms where does the term "Open Source Development" come in?<br /><br />I do not have the good fortune of having a 9-5 that satisfies my Open Source itch. I am certain that I have too few brain cells working during any of my "Time well wasted" sessions to even know what a computer is! So then is my Open Source Time doomed to share a room with random collectables and fringe sports? Do I have to class my Open Source Development as a hobby and stop refering to it as "my calling"? And more importantly how do I fit Open Source into my busy schedule of TV, Drinks with the guys, dancing in sweaty nightclubs and counting the amount of peas I have left in my freezer!? These are very pressing questions that hopefully I will soon have an answer to.<br /><br />A Long time ago I was crap at time management. I'm still crap now but I like to think I'm getting better ;) One of the things that I found on my journey of self enlightenment was David Allen's Getting Things DoneĀ® and I found it FANTASTIC! I was a mess of lists and to-do items and forgetting stuff before David Allen and decided to follow his teaching like they were gospel! .... that lasted about two weeks, maybe 3 if you count having the lists right and not following them. I think the problem was that it didn't fit into my lifestyle, I was a student who was interested in a whole load of things and needed to balance research for 8 college modules with what a wanted to know in the world of open source! If I were a high flying banker or an office goer then I'm sure the system would have worked perfectly but it was lacking <span style="font-style: italic;">something</span> that I needed. It took me a fair deal of time to figure out what that something was.<br /><br />And now to the point of this long post. The Getting Things DoneĀ® method was wrong for me because the "Things" that I wanted to do were not defined. These "things" that David was trying to sort in such a fantastic way were things that lived in 9-5 time. The "things" that I wanted to sort out were usually crazy Ideas that began their life while I was counting peas: "Wouldn't it be great to have an Open Source Project that counted all the peas in my freezer and geolocated all the farms that the peas came from". These crazy thoughts were not definable, could not be put into lists and could not be thought of as "things". Instead they are stuff. Stuff is more fuzzy, less defined and does not conform to to-do lists and schedules, until now!<br /><br />This long winded blog post is a way for me to announce a new project. "Getting Stuff Done". This name may spark some lawsuits but for now I'm going to leave it as a codename, so that it gets across the idea behind this project. Its a simple tool that aims to organise lists in a non-standard way, so that they are more human and much more malleable. I have the first screenshot here:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj40Ev9w2Bpw1SXpuH6G4QGiA1u-Wl_wef1TAWfPqAjKIF-v2P1dPTafStRqzDE-PN1NXbesy3kmG5mVnI06aOjWSn5pBRPf9kob2g3QDoNKcknX5qVMSdqCc2yL_kRBduCDjC21EgL-qc/s1600-h/snapshot3.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 265px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj40Ev9w2Bpw1SXpuH6G4QGiA1u-Wl_wef1TAWfPqAjKIF-v2P1dPTafStRqzDE-PN1NXbesy3kmG5mVnI06aOjWSn5pBRPf9kob2g3QDoNKcknX5qVMSdqCc2yL_kRBduCDjC21EgL-qc/s320/snapshot3.png" alt="" id="BLOGGER_PHOTO_ID_5389249283607866834" border="0" /></a><br />The more well read of you will recognise this as the simple Kontact "Hello World" example. This does mean that the project is in its most infant stage, but each long journey begins with only a single step.<br /><br />Comments are very welcome ;)real_atehttp://www.blogger.com/profile/16642853423539458703noreply@blogger.com12tag:blogger.com,1999:blog-7317978572153128719.post-6262449070209884732009-07-21T18:51:00.002+01:002009-07-21T19:07:42.003+01:00And i give you .....OSM rendering in Marble!<br /><br />Oh yes, that's right! We now have full OSM rendering. It has been quite a struggle to get to this point but the hard work has really paid off. The results are just beautiful! I'm not just braging about my own code, because as it happens there is a lot of work to do to get the OSM rendering in a pretty way, but instead I'm talking about the <span style="font-style: italic;">experience</span> of loading an OSM file. It looks marvellous! See the video below and notice how precise the positioning of the lines and nodes are with respect to the underlying OSM tiles ( I know this is obvious but it just looks so synchronised! ).<br /><br />I don't know about you guys but seeing that map rendering, where the data has been collected and modified with a lot of hard work from a lot of people, really gives me a sense of grandeur. Fair play to all the people in Open Street Map, my hat is really off to you guys ;)<br /><br /><object height="364" width="445"><param name="movie" value="http://www.youtube.com/v/y0PXy74uDPQ&hl=en&fs=1&rel=0&border=1"><param name="allowFullScreen" value="true"><param name="allowscriptaccess" value="always"><embed src="http://www.youtube.com/v/y0PXy74uDPQ&hl=en&fs=1&rel=0&border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="364" width="445"></embed></object><br /><br /><a href="http://www.youtube.com/watch?v=y0PXy74uDPQ">Link for those reading this on the planet. </a>real_atehttp://www.blogger.com/profile/16642853423539458703noreply@blogger.com0tag:blogger.com,1999:blog-7317978572153128719.post-83174628519233976502009-07-17T09:55:00.001+01:002009-07-17T13:23:41.880+01:00Life Hacks Really Do Work!Hey all!<br /><br />As my friend John <span class="blsp-spelling-error" id="SPELLING_ERROR_0">Layt</span> suggest I'll give you a little recap on what I'm doing. My <span class="blsp-spelling-error" id="SPELLING_ERROR_1">GSoC</span> project is to implement a nice Open Street Map annotation framework to make the lives of all you mappers a little bit easier! More info can be found on my <a href="http://realate.blogspot.com/2009/04/accepted-google-summer-of-code-proposal.html">proposal blog post</a>. The thing that has <span class="blsp-spelling-corrected" id="SPELLING_ERROR_2">really</span> been a <span class="blsp-spelling-corrected" id="SPELLING_ERROR_3">challenge</span> with this project was the fact that I'm adding <span class="blsp-spelling-corrected" id="SPELLING_ERROR_4">support</span> for a <span class="blsp-spelling-error" id="SPELLING_ERROR_5">QGraphicsItem</span> like <span class="blsp-spelling-error" id="SPELLING_ERROR_6">API</span> to marble. Little bit <span class="blsp-spelling-corrected" id="SPELLING_ERROR_7">hairy</span> at times but its good fun too! This has really come quite far in the last week and you can see quite an exciting example of this in the video below ( <span class="blsp-spelling-corrected" id="SPELLING_ERROR_8">planet</span> viewers have to come to my blog because the <span class="blsp-spelling-corrected" id="SPELLING_ERROR_9">planet</span> doesn't embed embedded <span class="blsp-spelling-error" id="SPELLING_ERROR_10">youtube</span> for some reason ).<br /><br />Starting Monday I <span class="blsp-spelling-corrected" id="SPELLING_ERROR_11">brought</span> out a little "life hack" that I used quite a lot in my last year of college. Quit simple, very <span class="blsp-spelling-corrected" id="SPELLING_ERROR_12">loosely</span> based on the "Getting Things Done" idea and it can be really effective when you have something that doesn't have a strict <span class="blsp-spelling-corrected" id="SPELLING_ERROR_13">system</span> of "This must be done by this time" or "This must be done first". Maybe I might blog about it sometime ;)<br /><br />With this new life hack in hand I have fixed two bugs, closed one bug, identified the cause of another bug, cleaned up most of my code, made the Marble <span class="blsp-spelling-error" id="SPELLING_ERROR_14">plugin</span> <span class="blsp-spelling-corrected" id="SPELLING_ERROR_15">system</span> more <span class="blsp-spelling-corrected" id="SPELLING_ERROR_16">flexible</span>, started implementing default base <span class="blsp-spelling-error" id="SPELLING_ERROR_17">GeoGraphicsItem</span> classes ( quite similar to the idea of <span class="blsp-spelling-error" id="SPELLING_ERROR_18">QGrahpicsLineItem</span> being a default implementation of <span class="blsp-spelling-error" id="SPELLING_ERROR_19">QGraphicsItem</span> ), fixed the problem with the <span class="blsp-spelling-error" id="SPELLING_ERROR_20">GeoXmlParser</span> that was preventing me from loading <span class="blsp-spelling-error" id="SPELLING_ERROR_21">OSM</span> files and made my little text editor a damn sight more pretty! Wow that was a mouthful!<br /><br />Now with that all under my belt I announce this little clip of the results. As you all know a lot of the stuff I was doing is hidden from view, and also a lot of it is very much <span class="blsp-spelling-corrected" id="SPELLING_ERROR_22">visible</span> but just being done a different way but I think it looks pretty cool too ;)<br /><br /><object height="364" width="445"><param name="movie" value="http://www.youtube.com/v/hTKc546-gjQ&hl=en&fs=1&rel=0&border=1"><param name="allowFullScreen" value="true"><param name="allowscriptaccess" value="always"><embed src="http://www.youtube.com/v/hTKc546-gjQ&hl=en&fs=1&rel=0&border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="364" width="445"></embed></object><br /><br /><a href="http://www.youtube.com/watch?v=hTKc546-gjQ">(Link for people reading on the planet)</a><br /><br />There are some very exciting things planned for the <span class="blsp-spelling-corrected" id="SPELLING_ERROR_23">coming</span> week ( and even just today ) so watch this space. I hope you all like my little updates, if any of you would like me to go into any more detail about anything just drop me a line ( comment or email ) and I'm sure I can <span class="blsp-spelling-corrected" id="SPELLING_ERROR_24">accommodate</span> you in some way!<br /><br />Happy Coding!real_atehttp://www.blogger.com/profile/16642853423539458703noreply@blogger.com0tag:blogger.com,1999:blog-7317978572153128719.post-16463035237775181902009-07-14T09:07:00.000+01:002009-07-14T09:27:31.343+01:00Morning Blog on GeoGraphicsViewHello again everyone!<br /><br />I too am one of the lucky people that got the chance to go to Akademy ( or whatever we are calling it these days ) and it was a truly great experience. Apart from being fantastic craic ( its an Irish thing ;) ) I got a lot of work done, or at least a lot of work discussed, and I'm ready for the next phase of my project. The phase of awesomeness!! ... maybe I need to work on the name...<br /><br />The main problem that I have been faced with is a pretty big one. We are currently implementing a Marble API that is as close to the QGraphicsView as possible ( see <a href="http://realate.blogspot.com/2009/06/update-and-exciting-features.html">my last post</a> for info ). I mentioned that a lot of the stuff has been done before but there were two problems with the current direction of things : 1) there was no real interaction framework or hit tests and 2) we were working with implicit sharing... which is a big NO for a QGraphicsView re-implementation.<br /><br />Before a week ago I didn't even see this as a problem, but now that I've taken the role of a Guinea Pig implementer of this framework it has been shown in a new light. The problem was that somewhere during the implicit sharing and copying values from references there was an explicit downcast of all classes. This may not be a bad thing all of the time because we adopted a QVariant style system but for plugin developers this made things get very hairy. To make a long story short, if a plugin designer wanted to make a new weird and wacky GeoGraphicsItem they would have to directly edit the sources of the Marble Library to make this happen. Not Good.<br /><br />So that's what I'm working on right now. If anyone feels like watching marble crash for the fun of it just check out the svn and enable my stuff ( the osmannotation plugin ) and let the fun begin! The joys of CMake and plugins have given me a great sandbox or more importantly kept my crazy code from all you nice people. Hopefully after all this all you third party developers will be able to make a really cool marble plugin with absolutely no effort, so watch this space!real_atehttp://www.blogger.com/profile/16642853423539458703noreply@blogger.com0tag:blogger.com,1999:blog-7317978572153128719.post-86071468107019384342009-06-20T13:28:00.001+01:002009-06-20T16:03:20.547+01:00Update and Exciting FeaturesRight so I thought it was about time to give a bit of an update on what I have been working on so far for my GSoC project. I have done some really interesting stuff with a lot of ground yet to cover so I'll try to keep it brief ( and I hope to update you all more frequently ).<br /><br />If you have a look at <a href="http://realate.blogspot.com/2009/04/accepted-google-summer-of-code-proposal.html">my last post</a> you can see the big goals that I have created for myself, which is a definite positive as I believe you can never aim high enough! The first of these goals is what i called the Annotation Rendering Framework, which has proved to be a challenge. The Idea of the rendering framework was to provide similar functionality to the QGraphicsView, QGraphicsScene and QGraphicsItem classes in the Qt Gui Module. And believe me, thats a hard act to follow! The main feature from the Qt classes that I wanted to recreate is the ability to "Click and Drag" items around the interface of marble, which is made difficult by the fact that marble is not a 2D surface and hit tests get a little bit more complicated.<br /><br />Thankfully I have the opportunity to stand on the shoulders of giants to get all of this working. The Marble developers have implemented a lot of the necessary functionality to get my stuff off the ground an its my job to extend this and integrate it all in a useful way. So without further ado <a href="http://www.youtube.com/watch?v=XZt2-cj502c">I have a small video to present</a> you with showing a little bit of my work.<br /><br /><object height="364" width="445"><param name="movie" value="http://www.youtube.com/v/XZt2-cj502c&hl=en&fs=1&rel=0&border=1"><param name="allowFullScreen" value="true"><param name="allowscriptaccess" value="always"><embed src="http://www.youtube.com/v/XZt2-cj502c&hl=en&fs=1&rel=0&border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="364" width="445"></embed></object><br /><br />The next step is to get nice little pop-up showing the details of each annotation, be it text, video or audio. This hopefully shouldn't take very long as I have already done a few experiments to do with Geo-Located QWidgets so watch this space!real_atehttp://www.blogger.com/profile/16642853423539458703noreply@blogger.com5tag:blogger.com,1999:blog-7317978572153128719.post-3039362127802625362009-04-22T13:48:00.000+01:002009-04-22T14:35:03.321+01:00Accepted Google Summer of Code ProposalTo follow the trend of my organisation's GSoC mailing list I have decided to make my proposal public, this should help everyone see what tasty treats might be coming in the near future and it is also to allow people to give me some feedback on the ideas.<br /><br />The post will be , for the most part, word for word the same as the the application. The only bits that will be missing are the contact details or boring information. <br /><br /><h3>Title:</h3><br />OSM Annotation for Marble Desktop Globe with an Optimised interface for smaller screens<br /><h3>Student:</h3><br />Andrew Manson<br /><h3>Abstract:</h3><br />This project will allow for the annotation of raw GPS data for use in the the mapping process of Open Street Map (OSM). GPS will be annotated with Geo-Location aware text notes, voice recordings, images and videos while tracing new GPS routes. You will also be able to annotate existing OSM data to verify its accuracy. The project will be aimed at a small, light device with GPS capabilities that can run the Marble Desktop Globe such as the EEEPC and the interface will be optimised for this.<br /><br /><h3>Content:</h3><br /><br />During the course of my studies I have been very interested in Geographical Information Systems and have chosen to do as many projects as possible in this area. This is why I was drawn towards the Marble project and I was very fortunate to be given the opportunity to work with the Marble team in the 2007 Google Summer of Code where I implemented the current GPS functionality that can be seen in Marble today. Since then I have been pretty quiet on the development front, because of my college commitments, but have always remained interested in returning to the Marble project to improve the work that I have done in the past and to implement new features.<br /><br /><br />This project idea was part of the proposed project list last year and since then it has evolved somewhat and I have even tried out some of the techniques that are necessary to implement it as a part of my Final Year Project in University, which I hope to be able to integrate with Marble sometime in the future.<br /><br /><br />The overall goal of this project is to give Open Street Map contributors an integrated, useful and intuitive platform to collect new raw GPS data while interactively annotating the collected data with Geo-location aware notes ( text, audio and video ) that will be helpful to identify the data while uploading it to the Open Street Map server. During this process we should be able to display the latest Open Street Map data to the user so that they may verify its accuracy. This data can either be streamed live over the internet, if a connection is available, or if not then sections of the data could be downloaded to the local machine.<br /><br /><br />Although my main goal is to provide this annotation tool there will be a few essential features that must be added to Marble before the tool can be integrated. These will be further discussed in the Implementation section below.<br /><br /><h3>Implementation Details:</h3><br />The most notable new feature that I would need to add to Marble would be the ability to interact with data that is currently being displayed to the Marble Widget. To clarify exactly what I mean by "interact":<br /><br /><br /><ul><br /><li> The ability to add an information object to the map at a certain Geo-location.</li><br /><li>The ability to click and drag the item to a different Geo-location within the view.</li><br /></ul><br /><br /><br />Currently this behaviour is not available to Marble and once it is implemented it will allow for a more in-depth user experience, offering the potential to edit all data items directly within Marble.<br /><br /><br />I have been discussing the implementation of the of this functionality with some of the Marble developers and was considering creating a custom QGraphicsView overlay system for the Marble Display Widget. This approach however will not be included in my work for Google Summer of Code because it would be completely experimental and would mean that my work would not be directly applicable to the current SVN trunk. Instead I will integrate the system into the current rendering pipeline and try and keep the API for this section as close to the QGraphicsView API so that future integration with this part of the framework will be an easy process.<br /><br /><br />Another notable feature that will be required for this project is the ability to load and render raw Open Street Map data to the Marble widget so that it can be updated and used as a reference while the user is mapping. Although there is already an OSM view in Marble the implementation I require would be quite different from the current solution. Currently the view is created by downloading flat OSM tiles that have been prepared for Marble, Although they can be used as a visual aid to the user while mapping, they do not contain all of the information that is available on the OSM servers. Once the data is loaded some additional features may be added to the project such as making the system aware when you have ventured into an area that has not yet been mapped or adding simple routing algorithms to Marble using the loaded OSM data. These extra features will be listed in the "If time permits" section at the bottom of the Timeline below.<br /><br /><br />The other necessary features shouldn't be too difficult to implement considering the implementation of Qt, for instance: rendering text boxes to the map or having small images visible on the map. The difficulty here will be the seamless integration that I am aiming for in the capturing of images, videos, audio and the taking of text notes. Text notes will be easy enough to accomplish as I will be developing specifically for an EEEPC but the integration between Marble and cameras or microphones will be more difficult. Here is a simple image that I hope describes what I want to accomplish from this project:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHjg4GPysjHqvtAr4mM7EQWt6WoopBn8XU_qYRZY_hIDF9S9k6Wtg8Ww88957veTN186kKvr9_AWVpvYqe34AtFk-fqn6wx6zZaj_Tl1NW6yhUs2SjH5mnPqikEtysPLgtDcUAUguejSM/s1600-h/Anotated.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 241px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHjg4GPysjHqvtAr4mM7EQWt6WoopBn8XU_qYRZY_hIDF9S9k6Wtg8Ww88957veTN186kKvr9_AWVpvYqe34AtFk-fqn6wx6zZaj_Tl1NW6yhUs2SjH5mnPqikEtysPLgtDcUAUguejSM/s320/Anotated.png" alt="" id="BLOGGER_PHOTO_ID_5327504448854726418" border="0" /></a><br /><br />Although the example annotations in the above picture are unremarkable I'm sure you can understand from my descriptions that getting to this stage will be a great success.<br /><br><br />The following is just an itemised list of what I intend to do and is meant as a reference.<br /><br/><br /><br /><h4>Annotation Rendering Framework</h4><br /><ul><br /><li>Be able to add a text, audio or video item to the display</li><br /><li>Have the annotations linked to a GeoData location aware data structure</li><br /><li>Allow for annotations to be moved, i.e. interactively alter their Geolocation. </li><br /></ul> <br /><br/><br /><h4>Live Annotation Interface</h4><br /><ul><br /><li>Make use of the live GPS tracking that is available in marble</li><br /><li>Be able to "drop" an annotation (picture, text ) at a current location</li><br /><li>Have Geolocation aware Audio and Video <br /> <ul><br /> <li>Make the annotation item aware of the GPS track that represents where it was recorded.</li><br /> <li>Move the annotation item along its GPS track during playback</li><br /> </ul> <br /></li><br /></ul><br /><br/><br /><h4>Open Street Map Integration</h4><br /><ul><br /><li>Download OSM data live from their servers</li><br /><li>Download OSM information to a local cache for use when offline<br /> <ul><br /> <li>Allow users to choose what sections of the map to download</li><br /> <li>Be able to update local cache with newest information from the OSM servers</li><br /> </ul><br /></li><br /></ul><br /><br /><br/><br /><h4>Interface Intergration</h4><br /><ul><br /><li>Small Screen Optimisations </li><br /><li>Integrate the Recording devices and commands into the Marble Widget</li><br /></ul> <br /><br /><br/><br /><br /><h4>-If time permits-</h4><br /><ul><br /><li>automatic annotation i.e. adding "Current position not currently on OSM" when in unmapped area</li><br /><li>moving "camera" along the GPS track to replay where you traveled. </li><br /><li>sync moving camera to moving Video/Audio annotation item. </li><br /></ul><br /><br/><br /><h3>Tentative Timeline:</h3><br />For the most part of the project I will be adopting a spiral development model where I will work on each of the separate parts of this project at the same time, adding a few features at a time. This will make it easier for me to show my supervisor what progress I have made and also allow me to get some feedback from the Open Street Map community ( and of course the Marble community ) at regular intervals throughout the project.<br /><br/><br />The only full features that will need to be completed first are the ones listed under the heading "Annotation Rendering Framework" as listed above. This is the only essential prerequisite for my project. This section should take me less than a week to implement and after that the main development model can get underway.<br /><br/><br />By the mid-term evaluation I would like to have: <br /><ul><br /><li> Live annotation, giving the user the ability to add an annotation to their current location with a single click.</li><br /><li>Preliminary implementation of the Open Street Map display so that users can see without any trouble where still needs to be mapped.</li><br /><li>Preliminary integration of the Recording devices into the Interface, i.e. having the ability to seamlessly record even if we cannot display currently connected devices.</li><br /><li> Small Screen Interface patches. This work will be ongoing.</li><br /></ul>I am confident that the rest of the features that are listed above can all be implemented within the time of Google Summer of Code and I will hopefully be able to adapt the implementation based on user suggestions within the timeframe.<br /><br/><br /> <br /><h3>About Me (let us know who you are!):</h3><br />I'm a final year student of Computer Science in Trinity College Dubin. Since this is my last year of a 4 year degree I've had the opportunity to gain a lot of experience in developing applications and systems to a high standard. When it comes to developing systems as part of a group I consider myself to be a Plant, that is, a person who brings discussion and innovative ideas to a project and tries to think outside the box. This, along with my general aptitude for coding, has allowed me to become the project leader for most of the group projects that i have participated in. Although i feel comfortable and at ease while working as part of a team, I have also excelled in my individual projects, even as early as first year where I won the award for Best Programmer in my class.<br /><br/><br />In the past year i have developed an interest in Embedded Systems and electronics, giving me another outlet for my inventions and for me to develop some more of my interesting ideas.<br /><br/><br />If I were to be accepted to the programme, the first thing that I would do would be to register for the Akademy conference, I really enjoyed it two years ago and found it to be very informative, so much so that I am extremely eager to go back. Google Summer of Code is sufficiently flexible to allow me to go for the entirety of the conference, and naturally GSoC and Akademy would be mutually beneficial.real_atehttp://www.blogger.com/profile/16642853423539458703noreply@blogger.com0tag:blogger.com,1999:blog-7317978572153128719.post-23901127531576006982009-04-15T03:05:00.000+01:002009-04-15T03:06:14.755+01:00KDE 4.3 Release Schedule<iframe src="http://www.google.com/calendar/embed?height=400&wkst=1&bgcolor=%23FFFFFF&src=5rvr73av7k3501kaecua182k6c%40group.calendar.google.com&color=%232952A3&ctz=Europe%2FDublin" style=" border:solid 1px #777 " width="600" height="400" frameborder="0" scrolling="no"></iframe><br /><br /><br />After Finding out there was no central ICal for The KDE Release Schedule I decided to make my own and share it with the world, this is Open Source after all ;) if you want to follow this calendar yourself in you usual PIM suite then use <a href="http://www.google.com/calendar/ical/5rvr73av7k3501kaecua182k6c%40group.calendar.google.com/public/basic.ics">this link</a>.real_atehttp://www.blogger.com/profile/16642853423539458703noreply@blogger.com0tag:blogger.com,1999:blog-7317978572153128719.post-28783057753776202532009-03-20T17:34:00.000+00:002009-03-21T13:42:45.306+00:00Returning to the nestYou will probably notice that the last post that <span class="blsp-spelling-corrected" id="SPELLING_ERROR_0">I've</span> actually put on this blog was 2 years ago, 2 long and glorious years that have been a great chance to improve my experience and <span class="blsp-spelling-corrected" id="SPELLING_ERROR_1">expertise</span> with software and coding. I'm still in college at the moment but I reckoned that it was about time i returned to the project that started my life as an open source <span class="blsp-spelling-corrected" id="SPELLING_ERROR_0">contributor</span>, Marble.<br /><br />Marble is a nice 3D(<span class="blsp-spelling-error" id="SPELLING_ERROR_2"><span class="blsp-spelling-error" id="SPELLING_ERROR_1">ish</span></span>) globe program that is part of the <span class="blsp-spelling-error" id="SPELLING_ERROR_3"><span class="blsp-spelling-error" id="SPELLING_ERROR_2">KDE</span></span> project. It is mostly built on Qt so it is easily <span class="blsp-spelling-corrected" id="SPELLING_ERROR_4">portable</span> to any platform. What i set out yesterday to do was the <span class="blsp-spelling-corrected" id="SPELLING_ERROR_5">relatively</span> simple task, or so i thought, of understanding the XML parsing system of marble with the intention to implement a simple test implementation of a Open Street Map parser. When i started yesterday i was full of vigor and looking forward to the <span class="blsp-spelling-corrected" id="SPELLING_ERROR_6">challenge</span>, but by the end of the day i was sent home with my tail between my legs.<br /><br />So you might be wondering what can scare a young programmer so much... Its all just a matter of understanding. The little bit of programming that i have done for marble 2 years ago consisted of a simple (<span class="blsp-spelling-corrected" id="SPELLING_ERROR_7">naive</span>) XML parser that read in <span class="blsp-spelling-error" id="SPELLING_ERROR_8"><span class="blsp-spelling-error" id="SPELLING_ERROR_3">GPX</span></span> information and rendered it to the screen, but since then the XML story of marble has become a lot crazier. Not long after my time in marble a unknown programmer ( unknown to me, please post their name in the comments if you know ) came on board with a solution, and because of his work on the <span class="blsp-spelling-error" id="SPELLING_ERROR_9"><span class="blsp-spelling-error" id="SPELLING_ERROR_4">Webkit</span></span> engine you can bet that he knows what he was talking about. The problem with his solution was simple, it was "Right".<br /><br />Yes <span class="blsp-spelling-corrected" id="SPELLING_ERROR_10">that's</span> right, you heard me! <span class="blsp-spelling-corrected" id="SPELLING_ERROR_11">I'm</span> complaining that a solution is right and i have good reason! My goal yesterday was to understand the XML <span class="blsp-spelling-corrected" id="SPELLING_ERROR_12">implementation</span> in marble, i understood the <span class="blsp-spelling-corrected" id="SPELLING_ERROR_13">concept</span> in about 5 <span class="blsp-spelling-error" id="SPELLING_ERROR_14"><span class="blsp-spelling-error" id="SPELLING_ERROR_5">mins</span></span> but the implementation was littered with so many "Best Practices" and "Time saving Tips" that i <span class="blsp-spelling-corrected" id="SPELLING_ERROR_15">challenge</span> anyone who hasn't <span class="blsp-spelling-corrected" id="SPELLING_ERROR_16">spent</span> some time doing production level XML parsing to try and understand it and implement a parser in less than a week! This kind of a system is so intimidating to any programmer that would consider having a pet project using Marble's Parser would be instantly scared off. I'm not saying that we should sacrifice all <span class="blsp-spelling-corrected" id="SPELLING_ERROR_17">performance</span> for "Ease of use" but i really believe in a balance, one that will be inviting to new programmers but still encourage them to learn some of the "Best" ways of doing something.<br /><br />I'm not going to get into the details of what i really didn't like about the parser but i will list a few points.<br /><br /><ul><li>Macros! god i hate macros, and i would put that down to being thought in my first year of programming "Don't ever use Macros, they are Evil". I wouldn't <span class="blsp-spelling-corrected" id="SPELLING_ERROR_18">necessarily</span> say that they are evil but using them to save time really feels like a bad idea to me, a more structured architectural model may result in less use of macros? who knows!</li><li>Element dictionary! <span class="blsp-spelling-error" id="SPELLING_ERROR_19"><span class="blsp-spelling-error" id="SPELLING_ERROR_6">Ok</span></span> this sounds like a good idea in theory, and i can see where this can be a very good idea in practice too, but i really don't think that a standard parser that uses an element dictionary is the "Best" way to account for the many varying formats that could represent data that a marble module or <span class="blsp-spelling-corrected" id="SPELLING_ERROR_20">plug-in</span> might be interested in.<br /></li><li>Parser only able to return <span class="blsp-spelling-error" id="SPELLING_ERROR_21"><span class="blsp-spelling-error" id="SPELLING_ERROR_7">GeoData</span></span>! one <span class="blsp-spelling-corrected" id="SPELLING_ERROR_22">problem</span> with using this <span class="blsp-spelling-corrected" id="SPELLING_ERROR_23">approach</span> with <span class="blsp-spelling-error" id="SPELLING_ERROR_24"><span class="blsp-spelling-error" id="SPELLING_ERROR_8">OSM</span></span> is the <span class="blsp-spelling-error" id="SPELLING_ERROR_25"><span class="blsp-spelling-error" id="SPELLING_ERROR_9">xml</span></span> tags do not <span class="blsp-spelling-corrected" id="SPELLING_ERROR_26">completely</span> enclose the <span class="blsp-spelling-corrected" id="SPELLING_ERROR_27">relevant</span> data in their children or parents. To actually implement an <span class="blsp-spelling-error" id="SPELLING_ERROR_28"><span class="blsp-spelling-error" id="SPELLING_ERROR_10">OSM</span></span> parser you would need to modify the parser itself, which doesn't really make it a generic "One size fits all" parser.<br /></li></ul>Its not all bad. the system is very optimized but i really don't think that every Programmer that would want to <span class="blsp-spelling-corrected" id="SPELLING_ERROR_29">implement</span> a parser should have to ever look at something so <span class="blsp-spelling-corrected" id="SPELLING_ERROR_30">complicated</span> as "The way Marble does it". I believe that any <span class="blsp-spelling-error" id="SPELLING_ERROR_31"><span class="blsp-spelling-error" id="SPELLING_ERROR_11">Plugin</span></span> or module that needs a parser should implement their own using <span class="blsp-spelling-error" id="SPELLING_ERROR_32"><span class="blsp-spelling-error" id="SPELLING_ERROR_12">Qt's</span></span> <span class="blsp-spelling-corrected" id="SPELLING_ERROR_33">excellent</span> parsing capabilities.<br /><br />I have proposed a solution for a middle ground to the head <span class="blsp-spelling-corrected" id="SPELLING_ERROR_34">developer</span> already, we have discussed it at length and i will be doing an experimental solution based on what we discussed to see what it's <span class="blsp-spelling-corrected" id="SPELLING_ERROR_35">performance</span> is like.<br /><br />I might be convinced, at some later stage, that the parser model in marble is in fact the best solution for Everything! but just not right now!<br /><br />Till next time,<br />Over and outreal_atehttp://www.blogger.com/profile/16642853423539458703noreply@blogger.com0tag:blogger.com,1999:blog-7317978572153128719.post-6364525451076935012007-06-13T18:38:00.001+01:002009-03-20T17:32:34.258+00:00Update 1Hi to anyone listening,<br />Wow this has been a crazy few days! I've just finished college (with more stuff to finish off) for the summer and have jumped head first into the project. As usual i have come up with this crazy idea of dealing with the base/generic case first and then building from there (what can i say, its what i do!). so right now I'm investigating the wonderful marble code to find anything that could be deemed as a layer (in the rendering sense) and extracting all of that in a frame work for all layers, present and future! The reason for this in my mind is to keep track of memory management and what not in a base class so that coders of new layers can keep upstairs at the high level coding ;)<br />so right now I'm off to find all that i can that would apply to the generic base classes. after i do about 1/2 hours of work on that today I'll move onto some information gathering, as in how to get my gps info from my gpx/device into the virtual world. that is my plan for today, oh and to contact the kde-edu mailing list, and so help me I'll be putting my all into it! this stuff is great craic! (and for all you non Irish, that just means fun )<br />Slan leat (goodbye)<br /> Andrewreal_atehttp://www.blogger.com/profile/16642853423539458703noreply@blogger.com0tag:blogger.com,1999:blog-7317978572153128719.post-54900287882622937782007-04-18T22:05:00.001+01:002009-03-20T17:31:57.729+00:00Next up!ok, now that everything in the start has calmed down i am seeing some sort of a direction in my madness emerging. i have contacted my mentor and will be making note of all the things that he had told me to get started on and hopefully start to put time to explore into my schedual. it will be happening soon but i'd like to be able to put it in tomorrow!<br />another thing that i have been trying to get used to is the communication within my organisation. its hard to follow what exactly it is that i have to follow, find out where (or when) there is going to be a crutial communication and try and be there when it hits. of course its a learning curve, just have to find out what sheet to learn it from! <br />project wise, i've so far just started laying out my lists. not very big i hear you say? if you knew me you'd see just how big of an effect a list can have in my daily comings and goings.<br />so, thats it for now. just a story of exploring, making time and generating the list that will guide me and my project to salvation!<br />over and out...real_atehttp://www.blogger.com/profile/16642853423539458703noreply@blogger.com0tag:blogger.com,1999:blog-7317978572153128719.post-51813056282522685412007-04-13T13:21:00.000+01:002009-03-20T17:31:06.592+00:00Google Sumer of codeWell if it isn't the best place to start my blog. I as of yet have kept as far away as i can from the idea of bloging because i just don't have time!! but i've just been accepted to google summer of code and i think its time to make a blog. its not gonna be of my personal life journey but instead i'll try and keep it updated on my academic journey instead. watch this spacereal_atehttp://www.blogger.com/profile/16642853423539458703noreply@blogger.com0