tag:blogger.com,1999:blog-251118152024-03-07T15:09:44.862-08:00ThoughtsNokia Internet Tablet development.Konttorihttp://www.blogger.com/profile/13624128995827387189noreply@blogger.comBlogger75125tag:blogger.com,1999:blog-25111815.post-81745643992394450312012-03-08T12:38:00.001-08:002012-03-08T12:39:23.659-08:00Native code for flashAdobe is just insane. <br /><br />I'm again having some time and space in my mind to look at the world around me. A huge work related milestone was reached today. Something ended and something starts. It's a really big shame that the things that do succeed in my new position are definitely something I would not be able to share for a long long time with anybody outside of Nokia. <br /><br />I wrote some time ago about how insane the flash 11 is for 3D support with a very concise representation compared to that of html5 and silverlight. Now, adobe really has done it. Adobe alchemy allows conversion of c/c++ code into low level actionscript bytecode. Secure execution at native speed. Full GDB support, compiles with gcc, supports all the tricks c++ has in its sleeve. Just insane. The bytecode is now running at 40% native, wiht high hopes to get it to 80% native speed before alchemy is launched. You also get finally direct access to converted c++ libraries from AS code. All existing code assets are finally browser compatible. <br /><br />If you are interested in where online gaming is heading in the future, look no further. <br /><br />As a demonstration, Epic has converted the >1MLoc unreal engine with alchemy. Watch this whether you are or are not not a coder. <br /><iframe width="640" height="360" src="http://www.youtube.com/embed/jXiJwpDU2Gw?feature=player_embedded" frameborder="0" allowfullscreen></iframe><br /><br />If you are a coder, you need to reserve 45 minutes and watch the video. I am serious. You *have* to watch it.<br /><iframe title='AdobeTV Video Player' width='515' height='296' src='http://tv.adobe.com/embed/803/11208/' frameborder='0' allowfullscreen scrolling='no'></iframe><br /><br />This is bliss. Triple-a -level games coming to facebook ;). Then push button conversion to adobe air application for your favorite i or android device. I wonder how this will work for windows phone in the future.Konttorihttp://www.blogger.com/profile/13624128995827387189noreply@blogger.com1tag:blogger.com,1999:blog-25111815.post-18109417274743956082011-10-13T13:00:00.000-07:002011-10-13T13:05:33.261-07:00N9 on sale in Finland ... and a few other thingsI'm fell for it again. Long period of silence. It doesn't mean that things have stood still. <br /><br />First of all, a very close friend of mine died. Gary Birkett, lcuk to the community, lost his life a few weeks back. For this, for me, world suddenly stopped in its tracks. He was truly an inspiration to us all. I wish all the best to his family while they seek to cope with the tragic loss. To Gary I raise a pint of Guinness. Rest in peace my friend. You will be missed, time and time again.<br /><br />N9 finally shipped. I was in my earlier post saying that it was a swan song for Nokias Meego efforts, but as faith put it, it is likely the swan song for Meego proper. <br /><br />It's hard to put into words the feelings we have been having during the late summer/early autumn time. Software has been complete since summer, but some surprise issues had been helding the sales start for some time. <br /><br />That's business as usual, but not very pleasant ever. We did a few touches here and there all the time until the release, but it was just polish really. <br /><br />While the agonizing wait was ongoing, software teams worked furiously on making the experience even better. First update release is complete, we will be distributing fruits of it to developers soon and end users a bit further down the road. <br /><br />Improvements are a legion. This is due to the fact that many teams stopped the sales release work already in spring time and set their sights on the first update release. I counted around 3500 improvements (fixes or features) to be in the release. <br /><br />Out of interest, I tohttp://www.blogger.com/img/blank.gifok a look at the git activity of meegotouch.<br /><a href="http://meego.gitorious.org/meegotouch/libmeegotouch/commits/Harmattan_1.0">http://meego.gitorious.org/meegotouch/libmeegotouch/commits/Harmattan_1.0</a><br />11.8.2011<br /><a href="http://meego.gitorious.org/meegotouch/libmeegotouch/commits/Harmattan_1.1">http://meego.gitorious.org/meegotouch/libmeegotouch/commits/Harmattan_1.1</a><br />23.9.2011<br /><a href="http://meego.gitorious.org/meegotouch/libmeegotouch/commits/Harmattan_1.1.1">http://meego.gitorious.org/meegotouch/libmeegotouch/commits/Harmattan_1.1.1</a><br />28.9.2011<br /><br />Of course, those dates do not mean that the versions were finalized on those days, just that those were the days that last tags of meegotouch were made. For example meegotouch theme for 1.1.1 was update just today, so, it probably isn't ready yet. <br />http://meego.gitorious.org/meegotouch/meegotouch-theme/commits/Harmattan_1.1.1<br /><br />Now it's time that we are going full steam ahead with the 1.2 update release, where work is proceeding nicely. <br /><br />Back to other topics. I have been "grinding" the triple A title games that I have missed, with most recent being the portal, and modern warfare 1&2. After all the hype, I was a bit disappointed about portal. Sure, the mood was pretty OK, but writing was amateurish and the "hidden" marks of the previous lab rats (you?) didn't tell enough story to me. SUmmarising, it was fun, but didn't really pull me in so that I would have to start portal 2 immediately. <br /><br />That was not the case with call of duty modern warfare. When the very first mission started in random boat in the middle of Atlantic, I was totally hooked in. This was totally immersive game and I really had to drag myself away from the game two times. I didn't even touch the multiplayer after playing it though, just went to steam and bought the second in the trilogy. <br /><br />Unfortunately, second was this time not as good as the first in the series. It was generally ok, but the events felt very detached from each other. Action was still good and level design was fun to play, but it wasn't such a holistic experience of being there as in the first. If you haven't played those games yet, do yourself a favor and don't start at 10 PM, but 9 PM. Games last only 6-7 hours and they are total adrenaline rush. You won't fall asleep after playing. <br /><br />I have also been playing with windows 8 a bit. Truly, a leap for Microsoft. Both on the base OS side (it boots so fast that it should default to hibernation rather than standby), as well as UX side. Metro UI is clear, simplified in a good way and beautiful. I'm not a fan of the Metro home screen concept though. I think it was barely adequate for windows phone, but it is too limited for tablet use. Clutter really. However rest of the tablet & phone UI is a jewel. It's so easy to use that even my 2,5 years old daughter is able to power it on, unlock it with the picture password, open metro home and start drawing with the paint application. Not all rosy though, apps start horribly slow, they crash all the time, perform really badly and seem to be generally been given at most a few hours of effort. I hope they are there to set an example that you can do better. Fortunately, there is always the full OS behind that makes the tablet pretty OK even though it's just a developer hacking device. <br /><br />I was asked recently where I failed during harmattan. I answered that I didn't resist enough the pressure and the temptation of doing the events screen to home. While it serves its purpose well and performs (especially in 1.2) much better than the apps pushing data to it, I think we should have left it out. It's a bit of clutter in the same way as metro home is clutter and cost us a lot of development and management time. Time we might have spent elsewhere better. <br /><br />But now that I was thinking of windows 8, I think I would revise that. The biggest thing I failed to understand to need a push was replacing backstacking with horizontal paneling. <br /><br />N9 home is clearly a single layer where you move horizontally between the three different views. On top of home, you have application layer. But with back stacking, applications themselves start to visually have many layers on top of each other. Leaving menus and dialogs aside, I think it really doesn't suit the UI paradigm.<br /><br />Correct and clinical (like my friend Otso would say) would have been to keep applications in single layer. Lock screen sits on top of applications, applications sit on top of home. All views, move horizontally to show different aspects of the layer. Virtual KB, menus and dialogs are ok to float on top of anything. As back button is not needed anymore, need for toolbar overall diminishes considerably. <br /><br />Back button really has held the UI design. Swipe would also have been strengtened as a concept by becoming the navigation tool also within the applications. Windows mobile 7 devices have the back as a physical button allowing the UIs themselves to not need a toolbar-alike construct for consumption views, only for productivity views. <br /><br />I'm kind of signing myself away from the meego also with this blog. I have started already working part time in the smart devices organization (that's windows phones in nokia terms) in forward center. Work that I'm doing now is at the moment revolving around hardware problems now than software. I assume that to change a bit more as we start getting a clear picture on where we want to be going with hardware in the future. <br /><br />It is very exciting work indeed. We are looking at the devices coming out in 2013 / 2014 now and the tech for that time is something mind boggling. For a long time, it seemed to me that invention was stalling again after apple iphone 4 came out. iphone was revolutionary, but 4 didn't bring anyting big on top of 3/3gs, just nicer looking, more power and a bit more resolution. 4S doesn't seem to be bringing much new either, just better and faster than previous model. Android has been mostly fixing the flaws it has had all the time, and trying to make the platform vaguely performant. <br /><br />When I'm looking at the next generation of CPU/GPU combinations, I'm almost speechless on what could be done with them. We were stuggling so much with N9 to get the 60 fps possible on the 848x480 display (have you guys noticed hidden 16 pixel rows by the way? <- hackers take a peek and gain a few thousand pixels more) with the limits that we had. These limits are now totally gone. There is no limit for 2.5 D view rendering performance neither on CPU or GPU side.<br /><br />2013 onwards, industry will make a huge leap in CPU and GPU power and start being close to PS3 & Xbox power levels. It's so fast that even Android can start innovating new things. ;) <br /><br />This leap of power will usher a new age for mobile devices - if we play our cards right (I mean, as the industry, not only as Nokia). Display technology is advancing at immense rates. Transparent and flexible OLEDs seem to raise so many opportunities that it makes my imagination just tingle of working to set the playground ready for the next innovations on the software front. <br /><br />If you see issues in n9, don't hesitate to contact me. I'm still well connected to nokia meego and there is a lot of talent working on making it all the time better. <br /><br />Perhaps it's time to call it a day.Konttorihttp://www.blogger.com/profile/13624128995827387189noreply@blogger.com239tag:blogger.com,1999:blog-25111815.post-58854655401817156302011-08-18T13:30:00.000-07:002011-08-18T13:51:18.432-07:00Molehill - Flash 11Somehow, in the flurry of figthing to get N9 out, I missed Adobes latest big thing.
<br />
<br />I have always loved pretty much everything adobe has been pushing out, but this one is just insane.
<br />
<br />New Adobe Flash 11 will contain support for 3d acceleration, totally abstracted from opengl/DirectX/OpenGlES or lack of any acceleration.
<br />
<br />Guys at Adobe have done outstanding job at abstracting the GPU acceleration to work the same on all platforms (MS, Linux, Osx, Mobile) - yet, you still get to code shaders all the same for all of them.
<br />
<br />One of course immediately compares Stage3D to webgl and Silverlight 5. Silverlight 5 looks to me like a nice first try for MS. Webgl, while nice as an idea of pulling it all to browser itself, lacks the compatibility between browsers, and does not even try to protect code copying.
<br />
<br />One of the most interesting, and perhaps odd things about the stage3d/molehill, is that adobe somehow resisted trying to crete their own development & design tools for 3d. It would have been a futile effort to do it the whole way from 3d object modelling to animation crafting in a way that pleases all, so they decided to stick with doing just the 3d abstraction layer and do it par none. Having been testing it a bit, I must applaud for job well done.
<br />
<br />By not doing the toolset, they have in effect taken all existing adobe 3d engine creators to come onboard as well as converted some of the other engine developers like Unity. While Unity says this is not the end of their dedicated web based player, I don't see any reason why they would keep two competing implementations alive.
<br />
<br />For Unity, you code your game with normal c#/javascript/boo, which gets converted to actionscript. These days scripts are mostly running game decision logic, and pretty much all of the heaevy lifting is done on shader programs. So, not a whole lot of perf is lost by sticking completely to actionscript.
<br />
<br />For most of the other Stage3D based engines, it's business as usual, use maya/3dmax/whatever makes you tick to do the meshes and place the textures, use the 3d game RAD tool to get it all together and actionscript to control it all.
<br />
<br />Let me give you and example of how the code looks for a simple triangle with color slides between the vertices between the three competitors:
<br />
<br />
<br />WebGl (note that I have dropped shader creation completely -> read from source) source : <a href="http://learningwebgl.com/blog/?p=134"> Source</a>
<br />
<br /><pre>
<br />//Vertexbuffer
<br /> triangleVertexPositionBuffer = gl.createBuffer();
<br /> gl.bindBuffer(gl.ARRAY_BUFFER, triangleVertexPositionBuffer);
<br /> var vertices = [
<br /> 0.0, 1.0, 0.0,
<br /> -1.0, -1.0, 0.0,
<br /> 1.0, -1.0, 0.0
<br /> ];
<br /> gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
<br /> triangleVertexPositionBuffer.itemSize = 3;
<br /> triangleVertexPositionBuffer.numItems = 3;
<br />
<br /> triangleVertexColorBuffer = gl.createBuffer();
<br /> gl.bindBuffer(gl.ARRAY_BUFFER, triangleVertexColorBuffer);
<br /> var colors = [
<br /> 1.0, 0.0, 0.0, 1.0,
<br /> 0.0, 1.0, 0.0, 1.0,
<br /> 0.0, 0.0, 1.0, 1.0
<br /> ];
<br /> gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);
<br /> triangleVertexColorBuffer.itemSize = 4;
<br /> triangleVertexColorBuffer.numItems = 3;
<br />//Shader creation
<br />//--> Read from the source, it's far too long to express here
<br /></pre>
<br />
<br />Ms Silverlight 5 <a href="http://code.msdn.microsoft.com/Triangle-Sample-3D-a69d04b4"> Source </a> <a href="http://code.msdn.microsoft.com/Triangle-Sample-3D-a69d04b4/sourcecode?fileId=21229&pathId=1122905725">Full source</a> :
<br />
<br /><pre>
<br /> vertexBuffer = CreateTriangle();
<br />
<br />// Shader creation:
<br /> Stream shaderStream = Application.GetResourceStream(new Uri(@"TriangleSample;component/Triangle.vs", UriKind.Relative)).Stream;
<br /> vertexShader = VertexShader.FromStream(resourceDevice, shaderStream);
<br />
<br /> shaderStream = Application.GetResourceStream(new Uri(@"TriangleSample;component/Triangle.ps", UriKind.Relative)).Stream;
<br /> pixelShader = PixelShader.FromStream(resourceDevice, shaderStream);
<br />
<br />//Vertex buffer
<br /> var vertices = new VertexPositionColor[3];
<br /> vertices[0].Position = new Vector3(-1, -1, 0); // left
<br /> vertices[1].Position = new Vector3(0, 1, 0); // top
<br /> vertices[2].Position = new Vector3(1, -1, 0); // right
<br /> vertices[0].Color = new Color(255, 0, 0, 255); // red
<br /> vertices[1].Color = new Color(0, 255, 0, 255); // green
<br /> vertices[2].Color = new Color(0, 0, 255, 255); // blue
<br />
<br /> // create graphics device managed buffer
<br /> var vb = new VertexBuffer(resourceDevice, VertexPositionColor.VertexDeclaration,
<br /> vertices.Length, BufferUsage.WriteOnly);
<br />
<br /> // copy vertex data to graphics device buffer
<br /> vb.SetData(0, vertices, 0, vertices.Length, 0);
<br /></pre>
<br />
<br />Adobe Flash Stage3D <a href="http://www.bytearray.org/?p=2555">Source</a> :
<br /><pre>
<br />
<br />//Shader creation
<br /> context3D.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX, 0, modelMatrix, true );
<br />
<br /> var vertexShaderAssembler : AGALMiniAssembler = new AGALMiniAssembler();
<br /> vertexShaderAssembler.assemble( Context3DProgramType.VERTEX,
<br /> "m44 op, va0, vc0 \n" + // 4x4 matrix transform from stream 0 (vertex position) to output clipspace
<br /> "mov v0, va1 \n" // copy stream 1 (vertex color) to fragment shader
<br /> );
<br />
<br /> var fragmentShaderAssembler : AGALMiniAssembler= new AGALMiniAssembler();
<br /> fragmentShaderAssembler.assemble( Context3DProgramType.FRAGMENT,"mov oc, v0);" // output color
<br />
<br />
<br />//Vertex buffer
<br /> vertexbuffer.uploadFromVector ( Vector.<Number>([
<br /> 4.-1,-1,0, 255/255,0,0, // red
<br /> 5.0,1,0, 193/255,216/255,47/255, // green
<br /> 6.1,-1,0, 0,164/255,228/255 // blue
<br /> 7.]),0, 3 ); // start at offset 0, count 3
<br />
<br /> context3D.setVertexBufferAt( 1, vertexbuffer, 3,Context3DVertexBufferFormat.FLOAT_3 );
<br /></pre>
<br />
<br />What I find interesting is that at the same time, Stage3d example code may look a bit more complex than the other, but that's the efficiency and concise presentation talking.
<br />
<br />Silverlight stays the most readable of them all, but mostly because shader program is in separate file.
<br />
<br />I think this is the new platform that games developers for facebook and mobile will embrace. It will be the basis of new wave of creative coding frameworks, ditching openframeworks and alike.
<br />
<br />While also silverlight 5 seems to have a nice home for indie game development for 360+WP7/8, I don't believe it to have as significant impact on gaming as a whole as Stage 3d from adobe will.
<br />
<br />I'm in awe.
<br />
<br />Now, take a look at how Adobe presents this:
<br /><iframe title="AdobeTV Video Player" width="480" height="296" src="http://tv.adobe.com/embed/64/8184/" frameborder="0" allowfullscreen scrolling="no"></iframe>
<br />
<br />Don't mind about how "very very exciting it is"
<br />
<br />If you want a hands on, try the max racer yourself:
<br />http://www.molehillgaming.com/label/stage3d
<br />
<br />First install Flash 11 Beta, then open the game. Konttorihttp://www.blogger.com/profile/13624128995827387189noreply@blogger.com1tag:blogger.com,1999:blog-25111815.post-18668557972360487262011-06-21T12:10:00.000-07:002011-06-21T12:21:16.062-07:00RespectThrough unimaginable hardships, we managed to pull a rabbit from the hat and get N9 done.<br />Schedule was just insanely tight, we got blows from all directions: Vanjoki leaving us, Ari leaving us, Elop dropping of meego from strategy, key developers leaving the company when we needed them the most.<br /><br />Swipe UI, that we are now admiring, required every single application and framework to be rebuilt almost from scratch. All the blows and all the work in the course of 9 months. I never knew how much sweat and tears there needs to be to get this baby out.<br /><br />What I want to say to the people who beared all that: Respect. You have my utmost respect and admiration. We didn't just do our best, we crafted the software to near perfection. Simplistic UI is easy to imagine, but extremely hard to execute. And execution includes design. Devil is in details and temptations are many. Keeping the boat steady on course needed a lot from you design and product management.<br /><br />It's nothing short of miracle that the fruit of our labor is now admired by millions.<br /><br />I am extremely proud of what I am holding in my hand right now. As a user, I'm loving every minute of using it and wouldn't change it for a thing.<br /><br />All of maemo: I salute you. Job well done. Be proud.Konttorihttp://www.blogger.com/profile/13624128995827387189noreply@blogger.com88tag:blogger.com,1999:blog-25111815.post-61117522474335824392010-07-17T02:45:00.001-07:002010-07-17T02:47:53.435-07:00NuvoFre 1.10NuvoFre 1.10 out with nice summer feel to it.<br /><br />I'll add it to devel soon.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcidlmh07Vnvai1QlfPvITIEjZgDJ_2g1LfvOkg_0NVHqJN5H8wA-Ssd-S7TR6qgnsbV5FvlNTJanZY4iLQSHECjZ-Iokdn_shf4QpiuEe_QbbdLwsWm3i0Gnj7f4-G9gK9_LxQA/s1600/Screenshot-20100717-124219.png"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 192px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcidlmh07Vnvai1QlfPvITIEjZgDJ_2g1LfvOkg_0NVHqJN5H8wA-Ssd-S7TR6qgnsbV5FvlNTJanZY4iLQSHECjZ-Iokdn_shf4QpiuEe_QbbdLwsWm3i0Gnj7f4-G9gK9_LxQA/s320/Screenshot-20100717-124219.png" alt="" id="BLOGGER_PHOTO_ID_5494809363381073714" border="0" /></a><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgb-qh3_EA0wm31R0GtOzDgMVFbd402d5oCwVxxADE0UyGR3biZFDsVc6bce3f_6vYu2-QlLiQUJwlEx23iL6EW7zlG1nkFDzFo5W90_vYUfujDmACGAuYSXDtaq4AXw7Zy-JGH4A/s1600/Screenshot-20100717-124333.png"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 192px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgb-qh3_EA0wm31R0GtOzDgMVFbd402d5oCwVxxADE0UyGR3biZFDsVc6bce3f_6vYu2-QlLiQUJwlEx23iL6EW7zlG1nkFDzFo5W90_vYUfujDmACGAuYSXDtaq4AXw7Zy-JGH4A/s320/Screenshot-20100717-124333.png" alt="" id="BLOGGER_PHOTO_ID_5494809210017310594" border="0" /></a><br /><br />Direct link: <a href="https://garage.maemo.org/frs/download.php/8515/nuvofre_1.10_all.deb">NuvoFre 1.10</a>Konttorihttp://www.blogger.com/profile/13624128995827387189noreply@blogger.com10tag:blogger.com,1999:blog-25111815.post-17765848685277452972010-07-17T02:18:00.000-07:002010-07-17T02:30:46.314-07:00QML photoviewer demo on n900 with data from on-device webserver and trackerTitle says almost all. <br /><br />I've been toying a bit with idea of adding a very lightweight http server to n900 to serve the primary data of the device so that development of the UI can be done nicely on PC while still accessing the real data. One might argue that just pulling the data to PC would solve this and using the existing APIs. Well, yeah, but that's also laborious if you are not linux developer, whereas this approach works beautifully for any web runtime developers as well as developers of qt quick apps. <br /><br />Doing this on web paradigm allows reuse of many learnings from my past life and creates a very flexible middle layer between the data itself and the UI. <br /><br />As the first thing to serve as the proof of concept, I created an ATOM image http service on the device. It follows directly the format of flickr, so any code written to show flickr images can be converted to showing n900 images - either on the pc or on the device itself. Data is retrieved from tracker and thumbnails are also trackers pre-generated thumbs.<br /><br />And here's the beef of course. Once the UI code is working nice and all, it can be just copied to the device and it'll just work. As a demo, here's vanila n900 (no overclocking) running both the server and qt quick application without any noticeable lag. Of course the devices thumsbs suck, as they don't have an aspect-ratio retained version available. <br /><br />Web server also works as a very nice access control layer between a runtime that can be now very sandboxed. Not that I care. <br /><br /><object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/VArTvtR4kow&hl=en_GB&fs=1"><param name="allowFullScreen" value="true"><param name="allowscriptaccess" value="always"><embed src="http://www.youtube.com/v/VArTvtR4kow&hl=en_GB&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object>Konttorihttp://www.blogger.com/profile/13624128995827387189noreply@blogger.com3tag:blogger.com,1999:blog-25111815.post-29532988603957174482010-06-13T12:03:00.001-07:002010-06-13T13:12:46.800-07:00NuvoFre 1.0.8A quick peek at the next nuvofre is out in case you want to try it out.<br /><br />I'll fix an issue in calendar coloring before I will put the next version of theme maker out.<br /><br />Theme is using the nice bundled tahoma font, icons are oxygen icons from kde (kudos guys), transitions have been tuned to feel more flowy.<br /><br />Download: <a href="https://garage.maemo.org/frs/download.php/8315/nuvofre_1.08_all.deb">NuvoFre_1.08</a><br /><br />As said, grave issues with calendar, otherwise it should rock.<br /><br /><br />A few shots:<br /><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbCfVqOMka8yQVI-Lvr0lyLC-MnomWXv-EUwPD-ixt6qwOb-wbuJwACKt3ZsFDqE6uY7YZlfr9DPOgYnE5AEJc86ZvsS9m-9jAsElyaCVxOFfN_i6HofrVWsCYsggvwLj3bM69Cw/s1600/Screenshot-20100613-212813.png"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 192px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbCfVqOMka8yQVI-Lvr0lyLC-MnomWXv-EUwPD-ixt6qwOb-wbuJwACKt3ZsFDqE6uY7YZlfr9DPOgYnE5AEJc86ZvsS9m-9jAsElyaCVxOFfN_i6HofrVWsCYsggvwLj3bM69Cw/s320/Screenshot-20100613-212813.png" alt="" id="BLOGGER_PHOTO_ID_5482352371455095346" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheL27S-nAUejfu1Gdwk8txCBYQ4yghI_Gc76FYtIBLcPuQ4gGpe8xY1aqdtyY5USZp_jFfb1QE6CJOHVX_1wsmEy1G6gHzNjpRnEocv52BT7P3dOxusDRaWt-CAUfWY3TGpM1uHw/s1600/Screenshot-20100613-212821.png"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 192px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheL27S-nAUejfu1Gdwk8txCBYQ4yghI_Gc76FYtIBLcPuQ4gGpe8xY1aqdtyY5USZp_jFfb1QE6CJOHVX_1wsmEy1G6gHzNjpRnEocv52BT7P3dOxusDRaWt-CAUfWY3TGpM1uHw/s320/Screenshot-20100613-212821.png" alt="" id="BLOGGER_PHOTO_ID_5482352495751956530" border="0" /></a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0OK8d1TQd7s6L2pN-oT0ir-RpBk9PbS567UvWK_599H3E2-Tb-NTjsPjBk2qm0vqka6MQPtgrYDv-TtSUzay50K-e1aCWNB1uvsfi6jALKLl2QDcN8TBPzKWCoRzUoTXsl9y0fQ/s1600/Screenshot-20100613-215839.png"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 192px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0OK8d1TQd7s6L2pN-oT0ir-RpBk9PbS567UvWK_599H3E2-Tb-NTjsPjBk2qm0vqka6MQPtgrYDv-TtSUzay50K-e1aCWNB1uvsfi6jALKLl2QDcN8TBPzKWCoRzUoTXsl9y0fQ/s320/Screenshot-20100613-215839.png" alt="" id="BLOGGER_PHOTO_ID_5482352576749049106" border="0" /></a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgx55YX1A7_ouMKO5NqfHwimq1eqVwkQFUt6Bd7NvpYLW3XxTF42Ivls9q-Ylusgj2J0x_D38X5Y1n5OQPx3aRHihTBnL9P_VOYrC5VSFWHVrqAQDozVaHoVEGNPtsRvh-2n6jY4Q/s1600/Screenshot-20100613-215952.png"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 192px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgx55YX1A7_ouMKO5NqfHwimq1eqVwkQFUt6Bd7NvpYLW3XxTF42Ivls9q-Ylusgj2J0x_D38X5Y1n5OQPx3aRHihTBnL9P_VOYrC5VSFWHVrqAQDozVaHoVEGNPtsRvh-2n6jY4Q/s320/Screenshot-20100613-215952.png" alt="" id="BLOGGER_PHOTO_ID_5482352723297055426" border="0" /></a>Konttorihttp://www.blogger.com/profile/13624128995827387189noreply@blogger.com8tag:blogger.com,1999:blog-25111815.post-19669604289717486702010-05-05T09:33:00.000-07:002010-05-05T10:05:50.484-07:00Harmattan + Meego Here I comeI have moved now away from Fremantle to Harmattan and Meego. This doesn't mean that the maintenance is stopping for Fremantle in any way, just that the coordination effort on OS & MW has lessened and my presence is not needed so much anymore.<br /><br />I would like to take just a sec also to address the comments about the leaked firmware. It is indeed not the final Pr1.2 firmware, and there are reasons for it. So, if you find severe issues in it, don't be surprised. If it only had minor issues, it would have been published already. We are often finding still some new major issues in the stabilization phase. It's normal for big projects.<br /><br />So, what am I doing now then? I am looking after the Harmattan Maemo API to make sure we have a solid 3rd party API and there is a clear continuation path for everything that would change for Meego. At the same time I'm working as a catalyst for the Harmattan software program. This catalyst role is naturally a bit vague and I'm often afraid whether I'm doing more harm than good after being so long time away from Harmattan development, but it looks like I'm able to pick issues every day that do push us a clear step closer to the target. Let's see how long this continues. But what I really focus all the time is the Maemo API.<br /><br />What does the Maemo API work mean in practice? It's about defining together with the architects the Application development APIs and the platform APIs. The distiction between these two is that every single API of the former should stay the same in Meego and maintain API and ABI compatibility. For the latter, we yield that they are needed for development of many applications but we deem those may be subject to change for various reasons (be that that we know a better one is around the corner, the API is unstable or even that we just happen to be uncertain what will happen to the API in the future), and thus if you use those APIs on your app, they might need tuneups before they work on the Meego handheld platform.<br /><br />In addition to only the pick and mix work of selecting the APIs, I'm also actively trying to look for issues we might have in the APIs that restrict certain types of development. It's a common case that we have been looking solely for our own needs (or Intels) on many cases, but we have forgotten that small detail that would mean the world for some 3rd party developers. I would be naive to think that I can somehow find all the issues and get them miraculously fixed. Indeed not, but I have some talented help and I'm sure every improvement is a step to a better direction.<br /><br />I'm not exactly certain if I can discuss about the inititives that I have started or the issues I have found, so I'll leave discussion on those until I have chatted with Quim Gil about it. In the meanwhile, please do contact me if you find issues in the APIs that has been published in the SDKs or in the open repos like gitorious for Harmattan Maemo API.<br /><br />Oh, why is it Maemo API and not Meego? Well, we are still using the low part of the stack from maemo and haven't merged to meego lower levels, we use still different packaging system, and tons of other reasons that have been voiced out probably many times before.Konttorihttp://www.blogger.com/profile/13624128995827387189noreply@blogger.com6tag:blogger.com,1999:blog-25111815.post-25080194271590541952010-01-11T11:30:00.001-08:002010-01-11T12:28:08.965-08:00Retrospective on 101The first maintenance release is out. What you can see as the biggest news items is that application manager looks quite a bit different, and Ovi store is out. These two things go hand in hand. The work on application manager is on improving the user experience for installing applications from Ovi store. In addition to that, it's on improving the user experience of installing content from the community and nokia applications catalogues. Application manager is now fast enough to use - if only maemo.org would be updated soon, then so would the community catalogues.<br /><br />Ovi store content is not visible in the application manager installable applications. This is intentional, as we want the official Ovi store front-end to be the only place to browse for the great applications, backgrounds, ringtones and wallpapers. For this reason, the red pill mode was removed as well.<br /><br />Here's a look at the application manager categories list (In finnish - it's time you all learned it ;) )<br />.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1Sx3QtXffdgtBvA9xAIYBpj1Gbre1HPE3xUnRORTvxAQIuexGBYqKYJ055qIswocbIVeHpBz8N1jPxEEOKuGfhq9VnNItf8cRz-pEaOh98VIVhGDsoy0JEPl9KizMHkQsydTjqA/s1600-h/Screenshot-20100111-213716.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 192px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1Sx3QtXffdgtBvA9xAIYBpj1Gbre1HPE3xUnRORTvxAQIuexGBYqKYJ055qIswocbIVeHpBz8N1jPxEEOKuGfhq9VnNItf8cRz-pEaOh98VIVhGDsoy0JEPl9KizMHkQsydTjqA/s320/Screenshot-20100111-213716.png" alt="" id="BLOGGER_PHOTO_ID_5425577316692988482" border="0" /></a>Great work from Vilja on the icons. Kudos! And for Gabriel for turning it to reality.<br /><br />What you don't see immediately on the outside, is the work on preparation for the next big update. We have been working hard in making sure the OS update really works cleanly over the air and that it can be done with as little free space avaiable as possible. The end result is something to be proud of. I would like to thank especially Lokesh, Victor, Mario and David for the hard work, long days and tiresome weekends that resulted in the flawless update experience you guys are about to embark on. Without these guys raising to occasion when the going got tough, we would probably be pretty shaky about how the big updates will work. Now I'm content it will work great for all of you out there.<br /><br />So, this is the step 1 only, you should be able to enjoy it and the Ovi store applications while waiting for the big update coming your way soon.<br /><br />Hildon icon cache has been removed and update-icon-cache is now a no-op. Reason is that it was consuming vast amounts of space on rootfs and it was too slow to use on opt. Dropping has no human detectable differences in anything, so I'm sure it won't be missed by anyone. Computer measurable startup difference was within some percents give or take for most of the apps, but media player is 30 % faster without the cache, while maps is about 20% slower. Anyway, a good trade off.<br /><br />Another thing that was removed is the red pill mode, as we didn't see any particular need for it anymore.<br /><br />A word of warning: The next big update will require 45 megs of free space on the rootfs. This is pretty difficult for an end user to understand, so I'm calling all you developers who might have wasted end users rootfs space: please do what you can to optfy end users devices for every byte you can spare.<br /><br />Read more detailed comments on the application manager work from here:<br /><a href="http://blogs.igalia.com/vjaquez/2009/12/14/shinning-new-ham/">http://blogs.igalia.com/vjaquez/2009/12/14/shinning-new-ham/</a>Konttorihttp://www.blogger.com/profile/13624128995827387189noreply@blogger.com7tag:blogger.com,1999:blog-25111815.post-31128169596019320902010-01-03T11:58:00.000-08:002010-01-04T02:49:38.444-08:00Enhanced Calculator demo codeThis is just a quick blog reply to requests to show the code of the Calculator of my previous blog post. I would gladly share the source in a nice zip as well, but maemo.org wiki doesn't allow zip uploads (DOH!), so you'll have to accept badly commented wiki page. <br /><br />Here be the <a href="http://wiki.maemo.org/QML-EnhancedCalcExample">WIKI</a>.Konttorihttp://www.blogger.com/profile/13624128995827387189noreply@blogger.com6tag:blogger.com,1999:blog-25111815.post-64295108192743129802009-12-29T11:55:00.000-08:002009-12-29T11:59:46.102-08:00QML Hello World (or calculate world)Some thoughts about QML<br /><br />QML reminds me a lot of Adobe Flex on Flash - my personal favourite tool for creating anything. Only difference is that QML is more suited for application development, as it allows full access to all system components - and is easily extensible with pretty much any normal qt components.<br /><br />Read more on the snapshot:<br /><a href="http://qt.nokia.com/doc/qml-snapshot/">http://qt.nokia.com/doc/qml-snapshot/</a><br />and from Kenneths excellent blog on the subject:<br /><a href="http://kenneth.christiansen.googlepages.com/DUI.html">http://kenneth.christiansen.googlepages.com/DUI.html</a><br /><br />Anyway, intro aside, I have also started doing a bit of coding now on QML and I really love it. It has nice separation of the declarative part (QML) and the logic part (either qt components or javascript). You can easily embed javascript to the qml code, but the clever guys at qt labs have made sure that you can only have tiny snipplets there. A welcome separation. <br /><br />What has also been fun is that I have done ALL the coding on the pygtkeditor, so no coding on the mac, and all the coding on n900. Well, I did work on some button gfx a bit on mac, but that's it. Painting is not coding ;)<br /><br />Anyway, take a look at the result of less than 400 lines of code. And the code is clean, sweet and easy to extend. Check out those transitions! They are 10 lines of code for the advanced, and about the same to get the fancy glow effect done to the buttons. <br /><br /><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/BGmw2IjLLv0&hl=en&fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/BGmw2IjLLv0&hl=en&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object><br /><br />What I am really eagerly waiting for is a chance to see a proper flash-like editor for qml.Konttorihttp://www.blogger.com/profile/13624128995827387189noreply@blogger.com6tag:blogger.com,1999:blog-25111815.post-36182878997174096132009-12-07T10:35:00.000-08:002009-12-07T10:43:00.211-08:00Theme Maker 1.2.5 out - Fremantle BetaNow theme maker is on the Beta level. You can actually consider creating themes with this one and give those to your friends and not only to your enemies.<br /><br />What really was improved:<br />1. Optification - Theme maker theme deb files are optified so they don't eat any root<br />2. Icons are also optified<br />3. Fonts work again (and are stored in user home, which is as good as optification)<br />4. Theme selection works now without need for device reboot<br /><br /><br />What is missing:<br />1. build-deb needs to be added - not a biggie<br />2. Icons need user to restart the device - it's a bug in the launcher code, that is being fixed by Nokia tam .<br />3. Application manager new icons are not yet themable - doh! - I cannot release features that haven't officially been released. Damn!<br />4. Theme based transition tuning is not yet part of theme maker - see above<br /><br />I guess the bottom line is that I'll be releasing a new version soonish, but you'll at least now know what is going to be in there. I'll probably make a 1.2.6 version that fixes at least the part 3. by having a copy of the icons from the base theme. <br /><br />Download here: <a href="https://garage.maemo.org/frs/?group_id=36">Garage</a><br /><br />Have a test with nuvofre in the same location. <br /><br />I'll upload some shots later on. Carry on!<br /><br /><br />EDIT: You Must delete your old theme folder for theme maker to be able to optify the content. So extract that zip to a new folder and start there from scratch. Never re-use old theme maker folders.Konttorihttp://www.blogger.com/profile/13624128995827387189noreply@blogger.com6tag:blogger.com,1999:blog-25111815.post-33524126643509893462009-11-22T08:12:00.000-08:002009-11-22T08:28:39.510-08:00On gaming on n900 and the newly found lack of arrow keysEverybody who has seen the n900 with english/generic keyboard thinks all keyboards will have arrow keys. Well, they don't. And this sucks big time for any gaming applications, as they cannot assume that keyboard has specific direction keys that would actually work. In most of the keyboards, there are only left and right keys. While up and down are behind fn+left/right. <br /><br />Only thing we can really do to fix this 'great kb layout design' is in my opinion:<br />Forget that we ever even had the arrow keys and start using the usual WASD combo for the default direction controls. And to balance the AB,XY buttons, we should probably use the I,O,K,L buttons. All of these buttons are the same in all kb layouts that I know. This is a pretty balanced layout, but again, not so easy to discover. Grr.. I hate the kb layout mistake that we made. Sane solution would have been to move the extra letters behind fn key.<br /><br />Otoh, I have finnish kb on the device, but I have switched to english layout so that I can have a sane d keys on the device. But it feels confusing. <br /><br />On a whole different note, I just read an interesing articles on DUI, the UI frameworks of Harmattan written by Zchydem:<br /><br />Part one: <br /><a href="http://zchydem.enume.net/?p=128">http://zchydem.enume.net/?p=128</a><br />Part two:<br /><a href="http://zchydem.enume.net/?p=149">http://zchydem.enume.net/?p=149</a><br /><br />I'm eagerly waiting for part three.<br /><br />We are also preparing for a small update for the N900 owners to come really soon, which is going to keep me busy next week in preparation of it. Let's see when we can deliver it to you guys. After we have released that, I'll start blogging a bit more on what is up for the end of the year update and what is brewing for the other near future updates.Konttorihttp://www.blogger.com/profile/13624128995827387189noreply@blogger.com9tag:blogger.com,1999:blog-25111815.post-85800668959110886062009-10-18T11:49:00.000-07:002009-10-18T11:56:46.166-07:00Theme Maker 1.2.4 released<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnH4mUkFxpooPDb9VWOWVOta8x5ShtUKpggURuPoL2NbO3yO8T40Q1ra9btk00yHkwayxMqvFrVq5YP4z6i2sndCbMdi1TdJAIsiDk7RkMsiq3i7RDmM-uzP8sykwNQ_GyYDdu6g/s1600-h/Kuva+9.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 126px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnH4mUkFxpooPDb9VWOWVOta8x5ShtUKpggURuPoL2NbO3yO8T40Q1ra9btk00yHkwayxMqvFrVq5YP4z6i2sndCbMdi1TdJAIsiDk7RkMsiq3i7RDmM-uzP8sykwNQ_GyYDdu6g/s320/Kuva+9.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5394014473750335474" /></a><br /><br />A new version of theme maker contains a few more icons, fixes bg issue with media player bg, add new bgs for clock, call-ui and app manager, has better example files, now also PSD files are included, of which an example above, showing the cut layers and the example layers for the backgrounds template. <br /><br />What else. Linux version now is also able to create debs, but seems to need a bit more mem that the shell script gives, so first build your theme, then close theme maker, reopen it, and the click on make debian button. I'll check if I can sort the memory issues at some point on linux as well. <br /><br />There is a short suggestion text document included on how windows users can develop until I get the debian creation working on windows again. <br /><br />Oh, link: <a href="https://garage.maemo.org/frs/?group_id=36"> Garage downloads section</a><br /><br />[Edit] Always rebase your theme template, icon and background files on top of the new ones. I have again changed the resolution of the bg template.Konttorihttp://www.blogger.com/profile/13624128995827387189noreply@blogger.com2tag:blogger.com,1999:blog-25111815.post-5397306204658145892009-09-29T09:42:00.001-07:002009-09-29T11:46:26.900-07:00Snes on n900Thanks to the great developers of nrnoksnes, we have now snes running on n900 fullscreen. Wiimote supported, as well as tv out.<br /><br />take a look at the video:<br /><br /><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/E0wbLaMXeu4&hl=en&fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/E0wbLaMXeu4&hl=en&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object><br /><br />[Edit] I ported wiicontrol on the weekend just to get this awesomness up and running. While it's great that you can play games on the go and to be able to continue later from your couch with wiimote, you can also just bring your wiimote with you and use that to play games. It's just perfect. <br /><br />And kids, don't pirate games.Konttorihttp://www.blogger.com/profile/13624128995827387189noreply@blogger.com20tag:blogger.com,1999:blog-25111815.post-70908883980961182562009-08-29T12:43:00.001-07:002009-08-29T13:00:04.407-07:00Theme Maker for N900N900 is now out and we all want to make it even cooler. Even more My device than it already is. To the majority of the world that probably moot point as you don't yet have one, but you will. Soon. And then you want to make it more You. Enter Theme Maker N900.<br /><br />I have updated Theme Maker (from now on, TM) to fully support N900 Theming. Not only can you convert the buttons, toolbars, all the widgets, but TM themes also convert the fonts, the icons and bacground images.<br /><br />Wwhat is so different from before. Base theme template is larger than before. It's mostly legacy support stuff and you only really need to touch the right third of the template if you are lazy. In addition you will have two new templates: icons and backgrounds.<br /><br />Lemme show these to you:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-bGKf2GyPdlWawlw9j76aIXVkgPr0QBA32dEwA82h1TPIpt30KKx0PJacs7_OPMxjNaMmAnfS3KkHosB4IyEEzzgoF72kV5Ts3VVyQUcz2FGat2fafgclxmTaFrbH2AUgWOgFNA/s1600-h/Icon-Template.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 320px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-bGKf2GyPdlWawlw9j76aIXVkgPr0QBA32dEwA82h1TPIpt30KKx0PJacs7_OPMxjNaMmAnfS3KkHosB4IyEEzzgoF72kV5Ts3VVyQUcz2FGat2fafgclxmTaFrbH2AUgWOgFNA/s320/Icon-Template.png" alt="" id="BLOGGER_PHOTO_ID_5375474304974643298" border="0" /></a><br /><br />The icon template contains all the apps you have by default in the launcher and also for different mime types, devices and some control panel items. I'll be adding a few more later on. Ideas for good candidates are welcome. The reason these are not Nokia icons is that we need to have a CC basis for the icons so that you can work on top of them. Nokia Icons are of course strictly copyright Nokia, so I just used these beautiful Oxygen icons to set a good example for you.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgexujh0MFaBtV46BylUCCnX6zuvj5_r1sJQIAzVq8sMZCRcmi97f-SYkUheydqhNPav3gI5-I-QPGV0NE9as5KdRH0g0QPRKvTgzS6ixT_EpNy6dCCO4l62iw02U9HwoXkdzJ11A/s1600-h/backgrounds-template.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 97px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgexujh0MFaBtV46BylUCCnX6zuvj5_r1sJQIAzVq8sMZCRcmi97f-SYkUheydqhNPav3gI5-I-QPGV0NE9as5KdRH0g0QPRKvTgzS6ixT_EpNy6dCCO4l62iw02U9HwoXkdzJ11A/s320/backgrounds-template.png" alt="" id="BLOGGER_PHOTO_ID_5375473892988740402" border="0" /></a><br />Backgrounds contains on the top part a full 4 screens wide image (3200x480), so you can easily put an image that pans nicely on the device. Under it there are / will be some bgs for some additional apps.<br /><br />So, even if you don't have N900 yet, I urge you to download theme maker and the example tempaltes and start hackign for a new theme, because you will surely be able to install it on your beautiful N900 very soon.<br /><br />Theme Maker comes with two default templates, one for dark themes and another for light themes. This should set up the basis nicely for your new theme.<br /><br />Link to download:<br /><a href="https://garage.maemo.org/frs/?group_id=36">https://garage.maemo.org/frs/?group_id=36</a><br /><br />[Edit: Forgot to mention that theme maker requires bigger java heap on linux than by default. OSX app handles it nicely, just doubleclick to open, but on linux you need to start with -Xmx1024M parameter. I'll add a .sh script to next release to easen the pain of linux users. Windows version will follow soonish. You can edit the theme template anyway already and that's the most important thing. ]Konttorihttp://www.blogger.com/profile/13624128995827387189noreply@blogger.com5tag:blogger.com,1999:blog-25111815.post-62002955500440534902009-08-27T04:05:00.000-07:002009-08-27T04:09:08.416-07:00Maemo 5 is outIt's out! <br />http://maemo.nokia.com<br /><br />I'm so proud of what we have achieved in maemo team.Konttorihttp://www.blogger.com/profile/13624128995827387189noreply@blogger.com2tag:blogger.com,1999:blog-25111815.post-12814570021110962612009-04-27T06:49:00.000-07:002009-05-13T05:07:40.584-07:00Album Art in FremantleMost of the media players need album art. So, ever application does the handling of the art by themselves (just like getting the metadata). For the metadata, we have tracker to get the metadata - one less headache. For the album art, we have tracker, hildon-thumbnailer and a standard to help alleviate another headache. <br /><br />Standard? In Fremantle we have finally agreed on a standard on how to store album art and media art in general. This means that applications will be able to share the files, so album art is stored only once, retrieved from the internet if needed and a thumbnail suitable for list views is stored in common way.<br /><br />We also worked together with Banshee team to make this a standard on linux desktop as well (Kudos to Philip van Hoof for it). You can read the spec in <a href="http://live.gnome.org/MediaArtStorageSpec">http://live.gnome.org/MediaArtStorageSpec</a><br /><br />So, what does this mean in practice?<br />1. Tracker and hildon-thumbnailer do a lot of work for you in advance<br /> - Tracker gets the embedded album art automatically<br /> - Hildon-thumbnailer makes the thumbnails in advance in freedesktop.org standard<br /> - Heuristic search is used in tracker and hildon-thumbnailer as specified in the media-art spec.<br />2. You can extend hildon-thumbnailer with content source plugins that download missing covers from the internet.<br />3. You can handle the album art all by yourself and just save some time if the condition 1. has hit its mark.<br /><br />The option 2. is of course the preferred way of handling the album art, but heck: this ain't a perfect world, and I'm doing things a bit dirty, so I'll go for route 3. If the condition 2. would apply and an internet download plugin is available, I would change ukmp to depend on that package and thus, the following code would (mostly) not be needed at all.<br /><br />However, quite a bit of it is useful. First of all: How is the album art filename (to the full version) calculated? I have nice copy paste functions here. Feel free to use them as is under any license.<br /><br />You will need unicodedata and md5 as non-usual dependencies, so:<br /><pre><code><br />import md5<br />import unicodedata<br /></code></pre><br /><br /><br />Then the functions. First we create the album art filename as specified in the standard. The following function handles that conveniently for you. Now, it's up to you on how to use that. You can either just depend on whatever tracker and hildon thumbnailer have created for you (with or without the plugins), or, as ukmp does, which is, that if first checks whether the album art exists, if not, it downloads it from the internet.<br /><pre><code><br />coverlocation=homedir+"/.cache/media-art/"<br /><br />def getCoverArtFileName( album ):<br /> """Returns the cover art's filename that is formed from the album name."""<br /> albumString=dropInsideContent(album,"[","]" )<br /> albumString=dropInsideContent(albumString,"{","}" )<br /> albumString=dropInsideContent(albumString,"(",")" ) <br /> albumString=albumString.strip('()_{}[]!@#$^&*+=|\\/"\'?<>~`')<br /> albumString=albumString.lstrip(' ')<br /> albumString=albumString.rstrip(' ')<br /> albumString=dropInsideContent(albumString,"{","}" )<br /> albumString=albumString.lower()<br /> albumString=string.replace(albumString,"\t"," ")<br /> albumString=string.replace(albumString," "," ") <br /> <br /> try: <br /> albumString=unicodedata.normalize('NFKD',albumString).encode()<br /> albumString=albumString.encode()<br /> print albumString<br /> except:<br /> try:<br /> albumString=albumString.encode('latin-1', 'ignore')<br /> albumString=unicodedata.normalize('NFKD',albumString).encode("ascii")<br /> albumString=str(albumString)<br /> print albumString<br /> except:<br /> albumString="unknown"<br /> if len(albumString)==0: albumString=" "<br /> <br /> albumMD5=md5.new(albumString).hexdigest() <br /> emptyMD5=md5.new(" ").hexdigest()<br /> albumArt=coverlocation+"album-"+emptyMD5+"-"+albumMD5+".jpeg"<br /> return albumArt<br /><br /><br />def dropInsideContent(s, startMarker, endMarker):<br /> startPos=s.find(startMarker)<br /> endPos=s.find(endMarker)<br /> if startPos>0 and endPos>0 and endPos>startPos:<br /> return s[0:startPos]+s[endPos+1:len(s)]<br /> return s<br /><br /><br /></code></pre><br /><br />Ok, great, now we have the full version. But, as ukmp needs mostly the thumbnail version, we need the filename to the thumbnail itself.<br /><br /><pre><code><br />thumbnailLocation=homedir+"/.thumbnails/normal/"<br />def getCoverArtThumbFileName( album ):<br /> artFile=getCoverArtFileName(album)<br /> thumbFile=thumbnailLocation+md5.new(artFile).hexdigest()+".jpeg"<br /> return thumbFile<br /></code></pre><br /><br />If it happens that the thumbnail does not exist (e.g. wasn't created, has been removed or whatnot), you have a few options:<br />1. you can create the thumbnail yourself (I'll give an example soon for that)<br />2. you can request hildon-thumbnailer to create it for you<br /><br />For the first option, you can just call hildon-thumbailer on the dbus:<br />https://stage.maemo.org/svn/maemo/projects/haf/trunk/hildon-thumbnail/daemon/thumbnailer.xml<br /><br />I am not using the method myself at the moment, so here is a quick example. The method is not blocking, so proper use would need to also receive the finished signal from h-t with the thumbnailHandle property. Of course, you can also be polling to see when it has been generated. Usually in non congested situation, this is going to be some tenths of a second. If there is congestion, the content is handled lifo fashion in h-t. <br /><br /><pre><code><br />import dbus, time<br />filename="file:///user/home/.images/01.jpg"<br />bus = dbus.SessionBus()<br />handle=time.time()<br />thumbnailproxy = bus.get_object('org.freedesktop.thumbnailer','/org/freedesktop/thumbnailer/Generic')<br />thumbnailHandle=thumbnailproxy.Queue([filename],["image/jpeg"],dbus.UInt32(handle))<br /></code></pre><br /><br />I'm scaling inline in ukmp. I'm using PIL to scale down the image. It's slower than using pygame (or h-t), but looks better, as it has good anti-aliasing. Anyway, it's once in a lifetime happening, so it's ok to take a while. Here we are also using the above created functions (wehey). I'm using freedesktop org standard size: normal, which is 128x128. Be aware that the media player in Fremantle uses 124x124, so I might switch to that resolution as well. The coverlocation will then also switch from '~/.thumbnails/normal' to '~/.thumbnails/cropped'.<br /><pre><code><br />import PIL<br />thumbFile=getCoverArtThumbFileName(album)<br />fullCoverFileName=getCoverArtFileName(album)<br />if (os.path.exists(fullCoverFileName)):<br /> thumbFile=getCoverArtThumbFileName(album)<br /> fullCoverFileName=getCoverArtFileName(album)<br /> image = Image.open(fullCoverFileName)<br /> image = image.resize( THUMBNAIL_SIZE, Image.ANTIALIAS )<br /> thumbFile=thumbFile<br /> image.save( thumbFile, "JPEG" )<br /></code></pre>Konttorihttp://www.blogger.com/profile/13624128995827387189noreply@blogger.com1tag:blogger.com,1999:blog-25111815.post-79042539054688761052009-04-26T13:41:00.000-07:002009-04-27T02:20:05.157-07:00A little tracking for the people waiting for FremantleI haven't been blogging much about Fremantle yet. But, yesterday there was a question on the maemo developers mailinglist about what files are indexed to the trackers metadata database, so I though to clear out that issue and also to tell a bit about how your app can use tracker.<br /><br />So, to answer that question first: Tracker tracks the user home and any mounted media that is attached to the device. For the memory cards, it retains a stack of 3 cards in it's database, so, you can change card A to card B, and back to card A and tracker won't need to reindex the content of the cards. And yes, you can be then swithing to B, to A, to B and you won't lose any data. The amount of cards to support is a configuration option, but by default it's set to 3. So, internal card=1, external card1=2 and then you have the one more as exteral card2. For a third external card, the device will need to flush the oldest seen card away from it's indexes.<br /><br />There was some concern also as to whether applications can put sound effects and pixmaps into the cards and to make sure they won't be indexed. Well, to this, we have two solutions:<br />1. put the files to a folder that is hidden (so, it has a "." in the beginning of the folder name) - tracker won't index any hidden folders by default<br />2. Add the folders to trackers blacklist file<br /><br />I recommend the solution 1 for multiple reasons.<br />1. it's simple.<br />2. user doesn't have any reason to see application data anyway, so this way it'll be also hidden in the file manger. Just make sure your app will flush the data on uninstall of your app.<br /><br />Ok, then a bit on how you can use Tracker.<br />As you probably have read, I've been on paternity leave, from which, I've taken a bit of time to integrate ukmp to the new Fremantle stack.<br /><br />So, first thing I did was, I replaced my own indexing code with code to load all music metadata from tracker database. Loading of this data on startup takes almost no time and tracker also does sorting of the data really easily for me. Not that sorting would actually be any issue in python, nice anyway.<br /><br />On startup, I hear you saying? Why not on demand? Sure, that would be an option, just happens that how ukmp was built, it's easier for me to get all the content on startup and not on demand. Both are fine. I could write a small comment on how to do stuff on demand as well, but let's start with this.<br /><br />We'll need to use two interfaces: search and metadata<br /><br />Corresponding dbus introspection files are:<a href="http://svn.gnome.org/viewvc/tracker/tags/TRACKER_0_6_92/data/dbus/tracker-search.xml?view=markup"> search</a> and <a href="http://svn.gnome.org/viewvc/tracker/tags/TRACKER_0_6_92/data/dbus/tracker-metadata.xml?view=markup">metadata</a><br /><br />You can find the whole dbus introspection from <a href="http://svn.gnome.org/viewvc/tracker/tags/TRACKER_0_6_92/data/dbus/">here</a><br /><br /><br />Let's start with defining the needed proxy objects:<br /><pre><code><br />import dbus<br />bus = dbus.SessionBus()<br />searchproxy = bus.get_object('org.freedesktop.Tracker','/org/freedesktop/Tracker/Search')<br />metadataproxy=bus.get_object('org.freedesktop.Tracker','/org/freedesktop/Tracker/Metadata')<br /><br />#Ok, let's then get all music files and for those, the artist, album, title and track# sorted by artist<br /><br />metadata=searchproxy.Query(-1, "Music", ["Audio:Artist","Audio:Album","Audio:Title","Audio:TrackNo"],"", dbus.Array([], signature='s') ,"",False,["Audio:Artist"], False,0, 40000)<br /><br />#Now that we have the data, we'll just add it to the internal structures<br /><br />for songItem in metadata: <br /> fileUrl=songItem[0]<br /> artist=songItem[2]<br /> album=songItem[3]<br /> song=songItem[4]<br /> track=songItem[5] <br /> self.appendSong(track, album, artist, song, fileUrl)<br /></code></pre><br /><br /><br />Nice and simple. Now we have the data. This saved me about 300 lines of code, plus multiple library dependencies and tons of headache.<br /><br />Of course, with my approach of loading everything on startup, I need to update the data when the data changes, but for this, tracker provides a really nice signal that looks like this:<br /><br /><pre><code><br />signal sender=:1.15 -> dest=(null destination) serial=403 path=/org/freedesktop/Tracker; interface=org.freedesktop.Tracker; member=ServiceStatisticsUpdated<br />array [<br /> array [<br /> string "Files"<br /> string "2320"<br /> ]<br /> array [<br /> string "Music"<br /> string "543"<br /> ]<br />]</code></pre><br />I won't show the implementation on how to keep the data update on this blog post, I'll save it for a future blog post. I'll instead now tell how to keep Tracker up-to-date on usage of the files. All media players on Fremantle should either use MAFW or do the following so that we would all be happy campers no matter which media player user uses.<br /><br />When you are playing a music file, please notify tracker of the play event. I do so at the end of a track, but your heuristic may vary. Firts we get the current playcount, then we add 1 to it, then we set the new playcount and the curren playtime. We set the time in GMT in UTC format, which is rather easy to get in python.<br /><pre><code><br />import time<br />currentCount=metadataproxy.Get("Music",currentPlayFile, ["Audio:PlayCount"])<br />newcount=1<br />if len(currentCount[0])>0: newcount=int(currentCount[0])+1<br />currentTimeUTC=time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())<br />metadataproxy.Set("Music",currentPlayFile, ["Audio:PlayCount","Audio:LastPlay"],[str(newcount),currentTimeUTC])<br /></pre></code><br /> <br />Ah, now we have the data in tracker, we are able to update the playcounts and playtimes so that all music players can benefit from the data. In my next blog post, I'll tell how the album art can be handled in common way across the platform. I'll tell you how you should do it and I'll tell you how I do it now (which might not be the case I will do when the device has been out for a while).<br /><br />Then I'll make a blog about how to make dynamic lists, e.g. to list most popular tracks, most recently added and the most recently played tracks.<br /><br />Then, to top this, I'll let you know how the signaling can be used to keep your internal data structures up-to-date, in case you are not using on-demand loading of the data.<br /><br />edit: fixed typo as noticed by timelessKonttorihttp://www.blogger.com/profile/13624128995827387189noreply@blogger.com2tag:blogger.com,1999:blog-25111815.post-11718324007644558552009-04-20T06:25:00.000-07:002009-04-20T06:27:25.422-07:00I'm a daddy!<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXwA2Rt9JLDMyvpQy4RT7hOHKpJyc5rmYt3w-iL5oIRhEX7UHKNuKRaaC3y22TqJIeIDcjDOMyT9sYqMUvmQVznskQltOYLh963xOyQK4xRAqDTWkpowGIFylF-0JLqLKvj2JyAA/s1600-h/IMG_8519.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXwA2Rt9JLDMyvpQy4RT7hOHKpJyc5rmYt3w-iL5oIRhEX7UHKNuKRaaC3y22TqJIeIDcjDOMyT9sYqMUvmQVznskQltOYLh963xOyQK4xRAqDTWkpowGIFylF-0JLqLKvj2JyAA/s320/IMG_8519.jpg" alt="" id="BLOGGER_PHOTO_ID_5326764595384912114" border="0" /></a><br /><br />Almost exactly a week ago I became a dad of a very sweet little girl. Her hello world message will be coming a bit later on when a name has been bestowed upon her.<br /><br />I am the happiest man on the planet.Konttorihttp://www.blogger.com/profile/13624128995827387189noreply@blogger.com12tag:blogger.com,1999:blog-25111815.post-605638197976708402008-11-27T10:07:00.000-08:002008-11-27T22:46:01.693-08:00UKMP 1.83 released to repositoriesA week of tuneups and I feel confident putting the portrait ukmp to maemo extras. It's there now available as update to previous users of ukmp.Album art downloading was greatly improved on version 1.82, so 1.83 will remove your existing cover art upon install. 1.83 added the final touches like play/pause button to work properly and some layout tuneups. Shuffle logic is still horrible and I really need to revisit that for the next version.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNAcLbcTRDh8sMG06QiN-Qug8qLFY84HQ0qdxd6e04Rlcc-_OkVCCbErefRfJSETCVNo9sQvMUdpDTAMTsnwlwlGrP90-g6Ez7Uq57F-2hv-Eyebj3nww2kEYVLKE6B4nYQf4-vA/s1600-h/screenshot01.png"><img style="margin: 0px auto 10px; text-align: left; cursor: pointer; width: 240px; height: 400px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNAcLbcTRDh8sMG06QiN-Qug8qLFY84HQ0qdxd6e04Rlcc-_OkVCCbErefRfJSETCVNo9sQvMUdpDTAMTsnwlwlGrP90-g6Ez7Uq57F-2hv-Eyebj3nww2kEYVLKE6B4nYQf4-vA/s400/screenshot01.png" alt="" id="BLOGGER_PHOTO_ID_5273401253171544274" border="0" /> </a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwau6hVsxyp-VDmrKsQez4tMjkQ2c2Ss0eHJsdFH_PlqL_wzloQvq_ZX4V_G-kl0qRyQYAFUYlUogxNkrrrqCkyDZN0FGSnkQk9X1RNFBO2Aporwl0HQBDoMu_b88imR7kEJ2rjw/s1600-h/screenshot00.png"><img style="margin: 0px auto 10px; text-align: left; cursor: pointer; width: 240px; height: 400px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwau6hVsxyp-VDmrKsQez4tMjkQ2c2Ss0eHJsdFH_PlqL_wzloQvq_ZX4V_G-kl0qRyQYAFUYlUogxNkrrrqCkyDZN0FGSnkQk9X1RNFBO2Aporwl0HQBDoMu_b88imR7kEJ2rjw/s400/screenshot00.png" alt="" id="BLOGGER_PHOTO_ID_5273401921438080322" border="0" /></a><br /><br />Other known irritations are that only fisrt 35 songs are visible on each album, so if you have e.g. Rolling Stones top 500 songs as one album, you'll be very dissatisfied with ukmp. I'm trying to bridge the gap between what is now and having 500 songs on an album, but it's not going to work on the next release. Also, everyone should be plesed to notice the exit button on top right corner, with me being the most pleased, because perhaps this will stop emails to me asking how to close ukmp. 1.82 also came with proper support for collection albums. Now the song artist is displayed in the song list view for collection albums. It's simple, yet very rewarding feature.<br /><br />No more words: <a href="http://maemo.org/downloads/product/OS2008/ukmp/">Click here to install</a> .<br /><br />Oh, I'll be posting a new video for the next version. Check out my previous post for the 1.80 release video.Konttorihttp://www.blogger.com/profile/13624128995827387189noreply@blogger.com15tag:blogger.com,1999:blog-25111815.post-51851775768563721702008-11-22T13:34:00.000-08:002008-11-26T11:33:33.157-08:00UKMP 1.80 and Zen of music playerLong time in the making bears fruit. I'm publishing ukmp 1.8 now. It's beta, I have worked today six or seven hours on it, which is probably more I've done to it for a few months. I've been doing some testing, but as you can imagine, it needs a bit more tests before I feel confident putting it to maemo extras repositories and download pages.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjDk2yFt9Afc6TyYZhF1OC9TYcTYWivRM1-MEumiDvD72W4Qb8GtE_2eyeJNQY6Pi4ppTGAUS8Vr7vKr3muumiafCole15d2niO6Z_fuYpfrlXXHgYXaoem7iYkZnUb-m8bhiICw/s1600-h/IMG_7990.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 260px; height: 400px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjDk2yFt9Afc6TyYZhF1OC9TYcTYWivRM1-MEumiDvD72W4Qb8GtE_2eyeJNQY6Pi4ppTGAUS8Vr7vKr3muumiafCole15d2niO6Z_fuYpfrlXXHgYXaoem7iYkZnUb-m8bhiICw/s400/IMG_7990.JPG" alt="" id="BLOGGER_PHOTO_ID_5271599311013762370" border="0" /></a><br />However, what is there is something I'm pretty proud of. It's now the music player I always wanted it to be. Very easy to use, very smooth and now that it's in portrait mode, it's finally usable with one hand. Mind you, the optimal hand is left hand.<br /><br />What is so very nice of this portrait mode is that it works without any support from the X. I made it with the xrandr support initially, but later coded the version that doesn't require the x changes, because I know only a handful of people who have it installed (even though I do love the portrait mode on most of the applications, especially the browser).<br /><br /><br />Ah, back to ukmp. Well, Here is a camera grab playing on n800. And of course, it's always nice to give you guys a short video as well. I'm really a bit tired, so I only made a one shot presentation. I hope you guys forgive the shaky cam.<br /><object height="344" width="425"><param name="movie" value="http://www.youtube.com/v/0T3Szw4pJZg&hl=en&fs=1"><param name="allowFullScreen" value="true"><param name="allowscriptaccess" value="always"><embed src="http://www.youtube.com/v/0T3Szw4pJZg&hl=en&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"></embed></object><br /><br />If you want to try the latest ukmp, please install first ukmp 1.7 from: <a href="https://maemo.org/downloads/product/OS2008/ukmp/">Maemo Downloads<br /><br /></a> and then update it with this link: <a href="https://garage.maemo.org/frs/download.php/4923/ukmp-1.83_all.deb">ukmp 1.83</a><br /><br /><br />(or check if later releases already exist: <a href="https://garage.maemo.org/frs/?group_id=234">ukmp releases</a> )<br /><br /><br /><br /><span style="font-weight: bold;">Zen of UKMP</span><br /><br />UKMP is trying to be a great music player with as little features as possible in the limited space a mobile device has. There is one way to access your music : by album. All music is sorted with one criteria: artist. This way all of albums of one artist are next to each other. Music collections are bundler as artist VA (various artists).<br /><br />When you open an album, there is again just one sorting criteria: song number (that is, the original sort on the CD),<br /><br />If you click on a song, it starts playing. Simple.<br /><br />Sure, shuffle mode needs to be there. Check.<br />Party mode / queue needs to exists. Check.<br /><br />What this model gains is that you are at most two clicks away from playing a file. This is quite different from overly generalized music players. I'm not saying there is anything bad about having to do 8 clicks before a song starts playing, It's just not my cup of tea.<br /><br />There is work to be done for sure. Volume should be more obvious ( + and - buttons on your device), there should be an exit button. Nothing more really comes to my mind now. Please comment your ideas.<br /><br />An extra one that might need explaining is delete on click. This mode is convenient for e.g. podcasts or for weeding your music out of filler songs. Don't bug me if you delete accidentally something. It is for a reason the only colored (red) widget in the otherwise black and white UI.<br /><br />[edit] added the maemo.org dl link<br />[edit] modified link to point to 1.81 version. Will blog about 1.82 probably at some point. Will publish 1.82 to repositories. Please let me know of any bugs in 1.81.<br />[edit] modified link to 1.83. Please let know of ny 1.83 bugs. Perhaps 1.83 or 1.84 will go to repos.<br />[comment] ukmp code is pretty bloaded. 3500 loc.Konttorihttp://www.blogger.com/profile/13624128995827387189noreply@blogger.com15tag:blogger.com,1999:blog-25111815.post-36316482011409812102008-09-21T05:51:00.000-07:002008-09-21T06:03:48.954-07:00Desktop search hackfest 1st dayFirst proper day of desktop search hackfest behind. We had good progress on the most important areas already and we are making now similar progress on the second day. The biggest one was that we agreed on the ontology changes that have been raised with variable solution candidates now for a year. The solution is clean and simple. It is future oriented by allowing proper object relations in the ontology, but still retaining the possibility to be efficient on the cases where you are only interested in a lablel-like property of the relationship rather than the actual object in the relation.<br /><br /><a href="http://www.grillbar.org/wordpress/?p=304">Check out mikkels post on the subject</a><br /><br />Today we have also been able to extend the query api to reflect this ontological change. We also agreed to add proper support of nested queries that truly makes the search api powerful. Biggest issues remaining currently are in the area of live queries. Here is a very good example of a real world ;) use case. By the way, using Gobby (gnome application) makes document collaboration astonishingly easy.<br /><br /><blockquote><br /><pre><br /><!--<br />Maybe we could try to draft a spec as well? Maybe just some notes?<br />Because it's still not really clear what everyone up to because everyone is up to slightly different things.<br />--><br /><br /><!--<br /> Match all documents with keyword "biology" which author comes from the<br /> same country as any person with name Jim.<br />--><br /><query content="xesam:Document" hitFields="xesam:title, xesam:author/xesam:givenName"><br /><br /> <and><br /> <br /> <equals><br /> <field name="xesam:keyword"/><br /> <string>biology</string><br /> </equals><br /> <br /> <equals><br /> <field name="xesam:author/xesam:country"/><br /> <field name="xesam:author/xesam:birthdate"/><br /> <query content="xesam:Person" hitFields="xesam:country, xesam:birthdate"><br /> <and><br /> <equals><br /> <field name="xesam:givenName"/><br /> <string>Kim</string><br /> </equals><br /> <equals><br /> <field name="xesam:gender"/><br /> <string>male</string><br /> </equals><br /> <greaterThan><br /> <field name="xesam:birthdate"/><br /> <date>1979-12-24</date><br /> </greaterThan><br /> </and><br /> </query><br /> </equals><br /> <br /> </and><br /><br /></query><br /></pre><br /></blockquote>Konttorihttp://www.blogger.com/profile/13624128995827387189noreply@blogger.com3tag:blogger.com,1999:blog-25111815.post-88643684860460325592008-09-16T13:06:00.000-07:002008-09-16T13:10:04.744-07:00Cairoclock outKhertan was kind enough to package the cairoclock and put it to extras repository. Now we can all easily install the magnificent clock on diablo/chinook.<br /><br />What makes it so great? Well, it's much better looking than the default clock. You can resize it as you see fit. It's simplistic and looks good.<br /><br />Take a look at the screenshots below.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgK8FoT4XixTmozWvlVAex8x3bMMvlrsMjqMHuS0KlKRJjIJpruCOxKjzWKIfyuVfFgcQ62iL9q508UFHQ334G61qaaUmLlwdss2s2k8iFGzB_a7rHWv9Vh10oLtXQrTD5UxKFNYQ/s1600-h/screenshot01.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgK8FoT4XixTmozWvlVAex8x3bMMvlrsMjqMHuS0KlKRJjIJpruCOxKjzWKIfyuVfFgcQ62iL9q508UFHQ334G61qaaUmLlwdss2s2k8iFGzB_a7rHWv9Vh10oLtXQrTD5UxKFNYQ/s400/screenshot01.png" alt="" id="BLOGGER_PHOTO_ID_5246713405389713698" border="0" /></a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1SXFRp0z7cHZjjt5cPbmKyt-Mjx2SrKxsSgJusbyKk48jX7Crh2PtEqneM4Q5MxCt732Mz_MEz1lrTkTvTOu08NPYuZNvKsmYQ8LSSOFRyK2y3wfRly8A55tx2YNLB36GLwiVhg/s1600-h/screenshot00.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1SXFRp0z7cHZjjt5cPbmKyt-Mjx2SrKxsSgJusbyKk48jX7Crh2PtEqneM4Q5MxCt732Mz_MEz1lrTkTvTOu08NPYuZNvKsmYQ8LSSOFRyK2y3wfRly8A55tx2YNLB36GLwiVhg/s400/screenshot00.png" alt="" id="BLOGGER_PHOTO_ID_5246713316887702290" border="0" /></a><br /><br /><br />Also, what is truly great on that is that it's a python applet and has a very nice and clean code to serve as an example to anyone interested in making cairo based applets for the device. I do encourage giving it a go. You'll get good control over the content and cairo seems to be drawing quite fast even on larger surfaces.<br /><br />As some sort of future update, the clock could be setup to have option to not to include the seconds.<br /><br /><a href="http://maemo.org/downloads/product/OS2008/cairoclock/">Link to install is at maemo.org downloads</a>Konttorihttp://www.blogger.com/profile/13624128995827387189noreply@blogger.com2tag:blogger.com,1999:blog-25111815.post-44312892961756726672008-09-08T12:20:00.000-07:002008-09-08T12:33:20.152-07:00Theme Maker 1.1.7 now with support for iconsTheme maker now includes support for icons. Sure, it used to have the support earlier on as well, but now the support is proper and the icons are actually made into an icon gtk theme and the theme is then referred in the actual theme as the themes icon theme.<br /><br />Confusing? Well the good thing is that no-one needs to care. Just open theme maker, set your theme name (no spaces), set your name, select bg file, select template file, select icon file, set theme version, top bar height (I recommend 60 - remind myself to put that as default, now it's 45), then set font sizes, font names, add a .ttf font if you want to install new font to the system. Click on the build theme and again on build theme on the next page and POW! You are done. Your own theme with your own font and your own icons. Currently only the home screens four icons are supported, I'll add the rest on later versions. Anyway, you still need to make the theme look your own, but to do that, all you need is photoshop (or any other similar tool) and a little patience. I've myself been especially using the fonts to get some sweet new fonts for my fbreader sessions.<br /><br />Link to download: <a href="https://garage.maemo.org/frs/?group_id=36">Download at garage</a><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1ND4oKRJPdBXOUt3Sk92tF3dNyrSOnylAcKwfCboBv5DXA_axG1SIczTxGzvnu-N0yYhayKnYyA7uWHVf1e22zpXruzDVvF6CvLbxPbR5nkvfdY2gNR0eY09GZep-kxwALmVqNw/s1600-h/Kuva+1.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1ND4oKRJPdBXOUt3Sk92tF3dNyrSOnylAcKwfCboBv5DXA_axG1SIczTxGzvnu-N0yYhayKnYyA7uWHVf1e22zpXruzDVvF6CvLbxPbR5nkvfdY2gNR0eY09GZep-kxwALmVqNw/s400/Kuva+1.png" alt="" id="BLOGGER_PHOTO_ID_5243733305049317250" border="0" /></a>As you can see, I forgot to change the version number on the theme maker view. Will be fixed for 1.1.8. ;)<br /><br />Please note that the icon template seems to be mandatory in this version. Looks like 1.1.8 is coming sooner than I thought! ;)Konttorihttp://www.blogger.com/profile/13624128995827387189noreply@blogger.com6