Disclaimer: this is an automatic aggregator which pulls feeds and comments from many blogs of contributors that have contributed to the Mono project. The contents of these blog entries do not necessarily reflect Novell's position.

May 11

19th Skin Completed - mitchinson-golden

I've just completed the 19th new skin of my campaign, mitchinson-golden, which can be seen on demo.mojoportal.com

mitchinson-golden skin screen shot

One more to go and I'm finished with skinning for a while!



Joe Audette  ...

17th and 18th New Skins, mitchinson-khaki, styleshout-coolwater

I've just completed the 18th new skin for mojoPortal, far exceeding my original goal of 10 new skins. This one is named mitchinson-khaki, and the one below is styleshout-coolwater, which I completed yesterday. You can see these skins now on demo.mojoportal.com. I still have 2 more designs that I want to try and make skins with today while I have skinning momentum. Tomorrow I will package a new release of mojoPortal to include all these new skins. I've been working full blast on skins since April 23rd until today. I'm very happy with the results, but ready to get working on other priorities.

mitchinson-khaki skin screen shot

styleshout-coolwater skin screen shot



Joe Audette  ...

May 10

A new community devolopment model?


Long story

(Go to the short story if you're too lazy to read a lot.)

Some time ago I wrote about the usual confusion between the terms "commercial" and "propietary". FLOSS is commercial software because it's not only driven by the generosity of some developers with their spare time. A FLOSS developer can be paid by a software company, either by being employed (the most common case currently) or either by a consultancy/bounty basis. And there are still even open source companies which still indirectly refer to FLOSS as non-commercial when they compare both most popular development models nowadays by saying "open source VS commercial software".

And why the bounty system is not so popular? Well, because:
1) It's very project-driven: bounties are usually published in means very related to the project. This can be considered an advantage because only motivated/interested developers will apply, but sometimes the project is too small, too recent or not very popular, or with a lot of similar projects around.
2) There's no strong system to manage the bounty in respect to requirements, secure payment, trust system between parts, etc.
3) Many people don't advocate for it (or they advocate for a bounty system that works as a task exchange without money intervention: I fix this for you if you fix this for me) because, we know, one of the reasons of the excellence of free software is because developers love what they do without rewards. (But IMHO one of the big downsides is also because there are also important tasks in a project that nobody likes to do. Besides, I think people tend to spend less spare time on free software as their age grows.)

An exception to the 1st item could be bountycounty.org: a site that tries to announce bounties from free software projects. However, it seems to be an initiative that hasn't got much audience (the last bounty is 2 years old), either because the people that offer bounties forget to notify to this system, or, maybe because in the end the bounty development model doesn't work in FLOSS?

Well, I don't think this is the case, because there's a bounty system that is succeeding, and which is also an exception to the (2) item of the above list: Google Summer of Code.

However, GSoC has the following disadvantages to be "complete" for this matter:
a) Only students can apply.
b) All projects happen in the same time-frame and have the same duration (a summer).
c) All bounties are the same for each developer.
d) A concrete company controls all the process (because, it's true, they put the money).

But we need something similar to GSoC (similar in the "It Works" aspect) and that saves these problems and is not a mere "announcement" site like BountyCounty.org.

Some initiatives have appeared that tried to solve these situation: BountySource.com and SourceForge.net marketplace. The common problem to both is that they try to solve it by attracting the developers to host their projects, so this causes big and mature projects not to apply (because they have currently good hosting solutions, or are self-hosted, like Mozilla projects for instance).

One of the ideas is to implement a bounty system in our bug tracking system software, like Bugzilla. If I had time and liked Perl more, I would try to contribute something for it. Maybe we're in the chicken-egg problem here: we need a bounty system for that task.

Surprisingly, there's already a general purpose web-based service for this task: RentACoder.com. But I haven't seen any free software projects using it, because it seems very focused on propietary developments.

And then it happened: Some weeks ago a new FLOSS-oriented service was born: FOSS Factory. I wanted to start using it by publishing some mini-bounties (which hopefully would grow if other people are interested, similarly to voting systems in Bug Tracking software), but I got disappointed when even the project creation had a cost. But yesterday I received this e-mail:


Andres G. Aragoneses,

Thanks so much for your interest in FOSS Factory! As one of our early adopters, I wanted to keep you in the loop on two very important developments.

First, in response to user feedback, we've removed all costs for creating FOSS Factory projects! Instead, we now charge a 5% transaction fee on payouts. This aligns our interests with yours by ensuring that we will only make money if your projects succeed. It also enables developers to post their own projects without having to spend money.

Second, we recently released our website source code under a FOSS license. You can now download the code from http://www.fossfactory.org/get-source.php. Our primary reason for doing this was so that we could take advantage of our own system to help improve the site. In case you're interested, we've already posted a few bounties for improvements that we haven't had time to implement ourselves: http://www.fossfactory.org/project.php?p=p30&tab=subprojects. Please feel free to participate.

If you have any questions or concerns, please either reply to this message, or email me directly at jjgignac {at} fossfactory {dot} org. Your feedback is very important to us!

Sincerely,

John-Paul Gignac
President and Founder
FOSS Factory Inc.


Unfortunately, there's a 5% transaction charge for each bounty, but hey, we need to support their service! Also, the software is PHP based, so I won't likely spend time on improving it (you know, I already fled from PHP and Perl some years ago ;) ).

But I like the initiative and I'll start to publish the bugs/features I consider interesting to have, but have no time/interest to hack on. Here are the first ones (take in account that, if every voter of the bug payed 10$, the bounty would be enough attractive for a developer I guess, because they are not very complicated):

- Thunderbird/Seamonkey feature Auto-watch threads you've posted to (21 votes)
- Thunderbird/Seamonkey regression Allow edit of unsent message (Unsent folder messages should open to a compose window when double click) (26 votes)
- Bugzilla's feature (or fix for highly confusing workflow for newcomers) Move all bug activity onto main bug screen (17 votes)
- Banshee's feature (currently handled by an outdated addin AFAIK) Banshee needs a way to cleanup (remove stale tracks) (reporter+4CC; no voting system in BGO)
- Banshee's feature (patch proposed but I guess someone should make it apply to trunk) [Patch] Automatically scan music folders for new songs (reporter+6CC; no voting system in BGO)
- Gnome's bug (someone wrote a patch but not sure if it will finally make it for 2.24...) The ``Replace File'' dialog should display the two file sizes, times, etc. (reporter+23CC; no voting system in BGO)
- Monsoon's crazy feature (maybe implies the creation of a new Gtk widget) When the option "Minimize to notification area on close" is not enabled, we should have a new widget on the title bar for that action (just me)
- Real fix for Mono's issue (because we already have a workaround) System.Windows.Forms dependency on GTK makes code to crash if it uses ATK# and GTK_MODULES contains 'atk-bridge'

The last of the issues affected our project until we found a workaround overriding environment variables. If we reach our milestones properly and nobody has fixed it at that time, we could have a try! Now we still have tons of work which Calvin and the team have perfectly outlined. Unfortunately I haven't helped in this doc effort because I was busy debugging the issues I mentioned in my last post, which turned out to be an invalid bug (but at least gave me an idea for a Gendarme Rule) and a GAPI parser bug that Mike fixed) and because on thursday afternoon I was affected by some small rock ;) and probably was the cause of me trying to debug something I didn't correctly updated on Friday (and maybe because of our dumb deployment methodology that Mike has already blamed). Well, I'll talk about this in a later entry...

Short story

Maybe this day will be remembered in the Free Software community as the day in which a first software draft is presented in order to fill some awesome ideas from devs like Nat Friedman about a general-purpose bounty system:

FOSS Factory


Especially interesing is their reasonings for its creation.

Wouldn't it be nice if...

Over the past week, I've been spending some time hacking on Evolution again because of my frustration with the current IMAP backend. This got me to wondering... why hasn't anyone stepped up to the plate and rewritten Evolution's IMAP code yet?

I think the reason can be summed up with the following 2 problems:

1. IMAP is hard
2. Coding something complicated like a multithreaded multiplexed IMAP client library in C is harder.

That got me and Michael Hutchinson wondering... wouldn't it be nice if we could write Camel provider plugins in C# or in any other managed language that we might prefer?

I think Camel, like Evolution itself, should allow developers to implement plugins in C# as well. I really think this might help lessen the burden of implementing new mail protocol backends for Camel/Evolution.

On that note, I've created a new svn module called camel-imap4 which can be built against your installed evolution-data-server devel packages.

Currently, however, it'll probably only work with e-d-s >= 2.23.x because some things (and assumptions) in Camel have changed recently.

One problem I'm having is that the symbol camel_folder_info_new() used to not exist in older versions of e-d-s, but recently that symbol was added and makes use of g_slice_alloc0(). The problem is that the way providers used to allocate CamelFolderInfo structures before was using g_new0() themselves. Why does this pose a problem? There's no guarantee that I'm aware of that you can mix and match g_malloc/g_slice_free or g_slice_alloc/g_free.

This makes it difficult for me to implement a plugin that builds and works with my installed version of Evolution (2.12) and also work with Evolution svn (2.23). This is quite unfortunate :(

While I'm at it, allow me to also propose some changes to the GChecksum API. Please, please, please make it so that we ned not allocate/free a GChecksum variable each time we need to checksum something?

I propose the ability to do the following:

GChecksum checksum;

g_checksum_init (&checksum, G_CHECKSUM_MD5);
g_checksum_update (&checksum, data, len);
g_checksum_get_digest (&checksum, digest, &len);

Then I'd like to be able to either call g_checksum_init() on checksum again or maybe have another function to clear state, maybe g_checksum_clear() which would allow me to once again use the same checksum variable for calculating the md5 of some other chunk of data.

Camel generates md5sums for a lot of data, sometimes in loops. Having to alloc/free every iteration is inefficient and tedious.

Going to Canada...

Hi, all!!

It's a great pleasure to say I'm going to attend PGCon2008 this year!! :)

I'm going to Canada tomorrow (May, 11) and hope to enjoy Ottawa and Canada before conference starts.

If you live in Ottawa and would like to talk about Npgsql, Mono, .Net or anything else, please drop me a mail.

About Npgsql, I posted on npgsql-devel list about an Npgsql2 beta4 release this week. But unfortunately it won't be possible. Josh is fixing some last bugs and will be doing a release next week. Sorry for any problems this announce may have caused.


So, that's it!

Stay tuned!

2nd Skin for 11th Design - styleshout-envision

I've completed the second skin of 3 for the 11th design of my 11 design campaign, styleshout-envision which can be seen on demo.mojoportal.com. Of course since its a public demo site, someone may come along and change it, but you can change it back or checkout the different skins by (key icon) Administration Menu > Site Settings.

styleshout-envision skin screen shot

Coming up next,

styleshout-coolwater

.



Joe Audette  ...

May 09

11th Design Completed - styleshout-refresh

I've completed one skin of 3 for the 11th design of my 11 design campaign, styleshout-refresh which can be seen on demo.mojoportal.com. Of course since its a public demo site, someone may come along and change it, but you can change it back or checkout the different skins by (key icon) Administration Menu > Site Settings.

There are 2 more skins coming, styleshout-coolwater, and styleshout-envision, but they are really just variations on the same design.

styleshout-refresh skin screen shot

This will be in svn trunk later today for developers and will be in the next release of mojoPortal for everyone else.



Joe Audette  ...

Inversion Tables



Has anyone ever tried one of these? My back has been totally killing me for the last couple weeks and none of the usual stuff is helping.

It's funny. I always thought that DRM should be used as a way to make life difficult for people pirating software/music. I never though it would be used as a way to convince people that pirating software is the better way:

http://www.theinquirer.net/gb/inquirer/news/2008/05/07/mass-effect-wins-award-worst-pc

Seriously, what are these people thinking?

Compiler Intrinsics

Most compilers have some (or in some cases many) intrinsic functions. HotSpot has a number of them (see here, search for "intrinsics known to the runtime") as does the CLR JIT. IKVM has had a couple as well (System.arraycopy(), AtomicReferenceFieldUpdater.newUpdater(), String.toCharArray()). These were sort of hacked into the compiler and I finally decided to clean that up a little and add more scalable support for adding intrinsincs. The trigger to do this was that I added four more intrinsics: Float.floatToRawIntBits(), Float.intBitsToFloat(), Double.doubleToRawLongBits() and Double.longBitsToDouble().

Benchmark

Here's a micro benchmark:

public class test {
  public static void main(String[] args) {
    long sum = 1;
    long start = System.currentTimeMillis();
    for (int i = 0; i < 10000000; i++) {
      sum += Double.doubleToRawLongBits(sum);
    }
    long end = System.currentTimeMillis();
    System.out.println(end - start);
    System.out.println(sum);
  }
}

Here are the results:

         x86 (aligned)     x86 (unaligned)                      x64
JDK 1.6 HotSpot Server VM    287   109
JDK 1.6 HotSpot Client VM 335    
IKVM 0.36 .NET 1.1 479 565  
IKVM 0.36 .NET 2.0 570 704 124
IKVM 0.37 338 468 101


Since the x86 .NET results are highly sensitive as to whether the double on the stack happens to be aligned or not, I included both results.

Implementation

Here's the MSIL that IKVM generates for the loop:

IL_000b:   ldloc.2
IL_000c:   ldc.i4    0x989680
IL_0011:   bge       IL_0028
IL_0016:   ldloc.0
IL_0017:   ldloc.0
IL_0018:   conv.r8
IL_0019:   ldloca.s  V_3
IL_001b:   call      int64 [IKVM.Runtime]IKVM.Runtime.DoubleConverter::ToLong(float64,
                     valuetype [IKVM.Runtime]IKVM.Runtime.DoubleConverter&)
IL_0020:   add
IL_0021:   stloc.0
IL_0022:   ldloc.2
IL_0023:   ldc.i4.1
IL_0024:   add
IL_0025:   stloc.2
IL_0026:   br.s      IL_000b

The conversion isn't actually inlined, but instead a local variable of value type IKVM.Runtime.DoubleConverter is added to the method and a static method on that type that takes the value to be converted and a reference to the local variable is called. Here's the code for IKVM.Runtime.DoubleConverter:

[StructLayout(LayoutKind.Explicit)]
public struct DoubleConverter
{
  [FieldOffset(0)]
  private double d;
  [FieldOffset(0)]
  private long l;

  public static long ToLong(double value, ref DoubleConverter converter)
  {
    converter.d = value;
    return converter.l;
  }

  public static double ToDouble(long value, ref DoubleConverter converter)
  {
    converter.l = value;
    return converter.d;
  }
}

It uses the .NET feature that allows you to explicitly control the layout of a struct  to overlay the double and long fields. Note that this construct is fully verifiable.

For comparison, the standard System.BitConverter.DoubleToInt64Bits() uses unsafe code and looks something like this:

public static unsafe long DoubleToInt64Bits(double value)
{
  return *((long*)&value);
}

For some reason (probably because it isn't verifiable) the JIT doesn't like this so much and doesn't inline this method.

JIT Code

Here's the x86 code generated by the .NET 2.0 SP1 JIT:

049E15CE  cmp    ebx,989680h
049E15D4  jge    049E1600
049E15D6  lea    ecx,[esp+8]
049E15DA  mov    dword ptr [esp+10h],esi
049E15DE  mov    dword ptr [esp+14h],edi
049E15E2  fild   qword ptr [esp+10h]
049E15E6  fstp   qword ptr [esp+10h]
049E15EA  fld    qword ptr [esp+10h]
049E15EE  fstp   qword ptr [ecx]
049E15F0  mov    eax,dword ptr [ecx]
049E15F2  mov    edx,dword ptr [ecx+4]
049E15F5  add    eax,esi
049E15F7  adc    edx,edi
049E15F9  mov    esi,eax
049E15FB  mov    edi,edx
049E15FD  inc    ebx
049E15FE  jmp    049E15CE

Here's the x64 code generated by the .NET 2.0 SP1 JIT:

00000642805B8A90  cmp        ecx,989680h
00000642805B8A96  jge        00000642805B8AB1
00000642805B8A98  cvtsi2sd   xmm0,rdi
00000642805B8A9D  lea        rax,[rsp+20h]
00000642805B8AA2  movsd      mmword ptr [rax],xmm0
00000642805B8AA6  mov        rax,qword ptr [rax]
00000642805B8AA9  add        rdi,rax
00000642805B8AAC  add        ecx,1
00000642805B8AAF  jmp        00000642805B8A90

In both cases the construct is inlined properly. It is also obvious why the x64 code is so much faster, it uses SSE (as we've seen before) and only uses one memory store/load combination.

HotSpot

For completeness, here's the code generated by HotSpot x64:

0000000002772EA0  cvtsi2sd   xmm0,r11
0000000002772EA5  add        ebp,10h
0000000002772EA8  movsd      mmword ptr [rsp+20h],xmm0
0000000002772EAE  mov        r10,qword ptr [rsp+20h]
0000000002772EB3  add        r10,r11
0000000002772EB6  cvtsi2sd   xmm0,r10
0000000002772EBB  movsd      mmword ptr [rsp+20h],xmm0
0000000002772EC1  mov        r11,qword ptr [rsp+20h]
0000000002772EC6  add        r11,r10
0000000002772EC9  cvtsi2sd   xmm0,r11
0000000002772ECE  movsd      mmword ptr [rsp+20h],xmm0
0000000002772ED4  mov        r10,qword ptr [rsp+20h]
0000000002772ED9  add        r10,r11
[...]
0000000002772FC0  cvtsi2sd   xmm0,r10
0000000002772FC5  movsd      mmword ptr [rsp+20h],xmm0
0000000002772FCB  mov        r11,qword ptr [rsp+20h]
0000000002772FD0  add        r11,r10
0000000002772FD3  cmp        ebp,r9d
0000000002772FD6  jl         0000000002772EA0

It actually unrolled the loop 16 times (which appears not be helping in the case), but otherwise the code generated is pretty similar to what we saw on the CLR. Of course, in HotSpot Double.doubleToRawIntBits() is also an intrinsic because in Java the only alternative would be to write it in native code and the JNI transition would add significant overhead in this case.

May 08

Towards Extensible Parsing

Almost four years ago the first feature request was entered into the boo issue tracker.

There should be a way to extend the parser so it could recognize custom measurement unit literals such as 1kg and 2cm.

Since then boo has improved a lot but with no solution for BOO-1 in the horizon.

I think I'm getting close to solve it in a interesting way using PEGs implemented as a graph of expression objects.

PEGs are very likable. Conceptually simple and composable.

Take the PEG that recognizes integer expressions involving the + and * operators:

grammar <- spaces addition eof
addition <- term ("+" spaces term)*
term <- factor ("*" spaces factor)*
factor <- [0-9]+ spaces
spaces <- (' ' / '\t')*
eof <- !.

where:

() means grouping.

* means zero or more matches.

+ means one or more matches.

/ is the prioritized choice operator. If the first expression succeeds, the whole expression succeeds. If the first expression fails, it backtracks and evaluates the second expression.

! is the not predicate operator which succeeds if its operand fails. It never consumes any input.

. matches any input.

The grammar can be translated to boo very simply using the peg macro from Boo.Pegs:

import Boo.Pegs

peg:
    grammar = spaces, addition, eof
    addition = term, --("+", spaces, term)
    term = factor, --("*", spaces, factor)
    factor = ++[0-9], spaces
    spaces = --(' ' / '\t')
    eof = not any()
    
assert grammar.Match(PegContext("  6*6 + 6 "))

I had to be a little creative in mapping the PEG operators to valid boo expressions because as it must be clear by now boo doesn't allow the introduction of completely new syntax and that's what the fuss is all about here.

I actually like the way it looks.

Implementing something more useful such as expression evaluation on top of that requires a few semantic actions operating a stack:

import Boo.Pegs
import System.Collections.Generic

stack = Stack[of int]()
push = stack.Push
pop = stack.Pop

peg:
    grammar = spaces, addition, eof
    addition = term, --("+", spaces, term, { push(pop() + pop()) })
    term = factor, --("*", spaces, factor, { push(pop() * pop()) })
    factor = ++[0-9], { push(int.Parse($text)) }, spaces
    spaces = --(' ' / '\t')
    eof = not any()
    
assert grammar.Match(PegContext("  6*6 + 6 "))
assert 42 == pop()

Semantic actions are just closures that get executed as matching succeeds. $text returns the text matched so far by the current rule.

Beautiful.

The underlying implementation based on a graph of expression objects really shines when one considers what it takes to extend the grammar above with support for hexadecimal literals:

peg:
    // rebind
    factor.Expression = hex_number / factor.Expression
    hex_number = "0x", ++hex_digit, { push(int.Parse($text[2:], NumberStyles.HexNumber)) }, spaces
    hex_digit = [0-9, a-f, A-F]
assert grammar.Match(PegContext("  0xa*2 + 11*0x02"))
assert 42 == pop()

It's not yet clear how this extensibility mechanism will be exposed at the boo language level but the simplicity at the peg level is encouraging.

One last feature worth pointing out is the ability to match based on a previously matched rule. For instance, the closing tag of a xml element must match the name in the starting tag:

import Boo.Pegs

peg:
    element = '<', tag, '>', content, '', @tag, '>'
    tag = ++(a-z)
    content = --(element / text)
    text = not "<", any()
    
assert element.Match(PegContext("<foo><bar>Hello</bar></foo>"))

I've found the idea for the last match operator @ first described in this article. Great idea.

I've been also greatly inspired by conversations I've had with Massi who's exploring similar territory and Jb during the last Mono Meeting in Barcelona and with Cedric over a beer in Paris. I think Massi will be pleased to know that I haven't given any thoughts to performance leaving all the fun to him.

Extensible parsing. Soon in a boo compiler close to you.


Banshee Podcast Support Coming in Beta 2

First, a quick note to people using the Ubuntu Banshee 1.0 PPA packages. Unfortunately, the packager messed up and at first released packages without iPod or MTP support. And now it has come to my attention (via comments and bugs from disappointed users) that the packages include the podcast extension, when it is pre-alpha and should not have been included. Hopefully the Ubuntu guys will get fixed packages out soon, and be more careful with packaging in the future. Jorge is working to make things right.

We do expect to have the podcast extension ready by Beta 2. And Beta 2 will have auto-rip support which I just committed last night. After enabling it in your Preferences, whenever you insert a CD it will automatically begin importing it, if it's not already in your library and if MusicBrainz information can be found for it. Very useful if you are ripping many CDs.

10th Design of 11 Completed - styleshout-stylevantage and styleshout-cistrusisland

I've completed the 10th design of my 11 design campaign, which resulted in 2 skins, styleshout-stylevantage and styleshout-citrusisland, which can be seen on demo.mojoportal.com. Of course since its a public demo site, someone may come along and change it, but you can change it back or checkout the different skins by (key icon) Administration Menu > Site Settings.

styleshout-stylevantage skin screen shot

styleshout-citrusisland skin screen shot



Joe Audette  ...

9th Design of 11 Completed - styleshout-brightsideoflife

I've completed the 9th design of my 11 design campaign, styleshout-brightsideoflife, which can be seen on demo.mojoportal.com. Of course since its a public demo site, someone may come along and change it, but you can change it back or checkout the different skins by (key icon) Administration Menu > Site Settings.

styleshout-brightsideoflife skin screen shot

This will be in svn trunk later today for developers and will be in the next release of mojoPortal for everyone else, hopefully available sometime this weekend.



Joe Audette  ...

May 07

8th Design of 11 Completed - snop-plasticboy-reflection

I've now completed 11 skins based on 8 designs of my 10 design campaign. The newest is snop-plasticboy-reflection, which can currently be seen on demo.mojoportal.com. Of course since its a public demo site, someone may come along and change it, but you can change it back or checkout the different skins by (key icon) Administration Menu > Site Settings.

snop-plasticboy-reflection skin screen shot

A few of the designs I've made alternate versions of which accounts for 11 skins so far. I really only need 2 more designs to meet my original goal but I've decided to do 1 extra design. The 3 remaining designs will actually result in 6 more skins. These are the designs I've chosen to complete this skinning campaign:

styleshout-brightsideoflife
styleshout-citrusisland and  styleshout-stylevantage (which I consider as variations on the same design)
styleshout-refresh, styleshout-envision, and styleshout-coolwater, which are all variations on the same design in my opinion.

Hopefully, I can complete all of these by sometime this weekend and then ship a new release with all these new skins.

 



Joe Audette  ...

May 06

Banshee 1.0 Beta 1 Released

We have just released Banshee 1.0 Beta 1, aka 0.99.1! This release adds some major features and lots of polish.


MTP and iPod device support have landed! Both MTP and iPod support album artwork, on-the-fly transcoding (converting between file formats), and video support!

Animation showing Banshee playing music, transferring files to a MTP device, and showing large cover art.
Banshee playing music, showing cover art, and transferring to an MTP device

Other features and fixes include:
  • Fullscreen video playback (go to Now Playing and press f or hit the Fullscreen button)
  • Extensions can be enabled and disabled in the new Mange Extensions tab within your Preferences.
  • Banshee can be scripted using Boo
  • Improved gstreamer error handling (for missing files, codecs, etc)
  • A bug with play counts, introduced in Alpha 3, has been fixed
  • Writing metadata to file was not working in the Alphas, is fixed
  • Issues with the play queue should all be resolved
  • Limiting smart playlists by file size or duration works
  • Shuffle and repeat are automatically disabled while playing Last.fm

Default smart playlists in Banshee
Default Smart Playlists
This release also features default smart playlists, created for new users and users with zero smart playlists. There is a more extensive list of predefined smart playlists, including the defaults, available in the New Smart Playlist dialog.

Thanks to Aaron Bockover, Alexander Hixon, Bertrand Lorentz, Christopher Rogers, Scott Peterson, Sebastian Dröge, and Wouter Bolsterlee for code contributions for this release, and to Daniel Nylander (sv), Gabor Kelemen (hu), Jordi Mas (ca), and Wouter Bolsterlee (nl) for updated translations! And to Jorge Castro for testing and release notes help, and Michael Monreal and Andrew Conkling for testing and bugzilla work!

You can follow the posts of Banshee contributors on Planet Banshee. We are a friendly, vibrant community and always glad to have people join us! If you have been wanting to contribute back to free software and GNOME, I think you'll find Banshee's code and C# a pleasure to work in, and a healthy amount of support and encouragement from a very active community. Join us on our mailing list, in our IRC chatroom, and on our wiki!

Digg It!

Well Isn’t That Qt

I and a few others have been poking at our widget layer for the past few weeks, looking at adding Qt support.  There was an earlier attempt at a Qt backend, but it never really got maintained, and there wasn't much interest in it back then.  Recently, though, Qt has made great strides on embedded [...]

Cross-platform, standalone Silverilght Applications

Tamir Khason published an interesting approach at hosting standalone Silverlight applications.

His solution is a Windows.Forms application that hosts a Windows.Forms.WebControl and inside the WebControl he hosts Silverlight.

Unlike my proposal for standalone Silverlight Applications that is currently Moonlight-specific (and currently limited to Linux/X11) this approach works on Windows with .NET and with Linux using Mono and Moonlight:

Left side: .NET hosting WebControl and Silverlight on Windows; Right side: Mono hosting WebControl and Moonlight running on Linux.

In addition to hosting the WebControl for hosting Silverlight, a thread is running to dispatch http requests locally using HttpListener. HttpListener is an embeddable HTTP server that is part of the class libraries, and exposes a very limited API. You can host ASP.NET with HttpListener by doing the bindings by hand, or you could use our Mono.WebServer library (part of our XSP/mod_mono distribution) to allow your applications to have a fully hosted ASP.NET server.

Mono.WebServer is what iFolder uses to embed the ASP.NET server to expose SOAP-based WebServices to clients.

Of course, this currently does not work on MacOS X as we do have no implementation of WebControl for Windows.Forms on OSX, something that a contributor might want to look into.

You can get the source for the sample from Tamir's page.

Consulting Gig at Novell

We are looking for consultants to work on a six to nine month project at Novell to write a prototype for a Visual Studio addin in C# or C++ that will connect Visual Studio and its debugging infrastructure to a remote Linux machine running Mono and the Mono Debugger.

If you are interested in working with us in this project, you must have good C# and C++ skills, experience with networking and protocol design, knowledge of COM and assembly language programming are pluses.

We are looking to bring two consultants for the duration of this project. If you are interested, please click this link and attach your resume, pointers to some existing projects of yours and so on.

Now Gnash is to Flash what Mono is to .NET

And we have to thank the cool Adobe's Open Screen Project for this. Why is this positive (extracted originally from here)?

1) Projects that seek to implement this standard (like Gnash), won't have to do reverse engineering anymore (unless the spec is not enough for some things, or the official Adobe software contradicts the specs because of bugs/typos).

2) These projects will provide implementations for architectures that are not supported by the official Adobe propietary software.

3) The implementations will no longer be considered risky because of future patents or intellectual property violations.

But, BEWARE:

a) this doesn't mean that Flash is now free/open source. This only means that projects like Gnash are analogous as Mono right now: they are open source projects that follow a standard published by a company with an open spec.

b) this doesn't mean that any flash content is patent-free either, because you can still embed proprietary formats inside it like MP3.

What I'll do now is start supporting Gnash, firstly by testing it and reporting any bugs I find. Fortunately I have some packages ready for OpenSUSE!

This news is positive, of course, but now let me give my technical opinion of this technology:

- The programming languages you can use with it are very few (some months ago I think the only one was ActionScript, which has the majority of limitations of JavaScript) and still today AFAIK there's no statically typed language you can use.
- AFAIK it's not accessible (and I mean for disabled people and for automation technologies like search-engine-bots).

However, with Moonlight, you already know that you can use C# with it so the first of these disadvantages doesn't affect it. And in respect to the last item, well, the second phase of my project in Novell is bring accessibility support to it so this item will be hopefully solved soon.

Will this mean the end of the Flash monopoly? Will this force Adobe to open its software too?

BTW, is Moonlight/Silverlight one of the reasons for publishing Flash specs freely? All I can see is that in Adobe they are start to changing their minds quickly. One of the most important facts of this is the liberation of the Tamarin project, which has supposed a big step forward in the Mozilla community (FYI, the Mono VM was also a candidate for the Tamarin current job, but unfortunately wasn't considered in the end).

Well, and how's the progress of the first phase of the A11Y project? We're progressing slowly, but hopefully cooking the base for the ton of work we already lack. Many issues are because we needed to complete Atk#, and other ones are appearing which may be related with the runtime (hopefully not, but here they are if you want to have a look: 386802, 387221). I have to thank Mike Kestner for all his help in this side (thanks to him I'm learning a lot about bindings, and about how delicate :) are the glib/gtk/atk bindings in particular; I love when someone is so meticulous for maintaining a project!), and Sandy for all the help on the bridge (which recently got a nice refactoring, but I already got some additional ideas I need to share...). Mike Gorse seems to progress a lot (and now there will be cooperation with Nokia as well on the CORBA->DBUS migration!), and Mario is starting with us these days, welcome Mario! Unfortunately I don't deal too much with the rest of the team (Brian, Calen, Neville, Ray) but they seem very busy too all the time!

May 05

7th Skin of 10 Completed andreasviklund-02

I've completed the 7th skin of my 10 skin campaign, andreasviklund-02, which can be seen on demo.mojoportal.com. Of course since its a public demo site, someone may come along and change it, but you can change it back or checkout the different skins by (key icon) Administration Menu > Site Settings.

Actually I made 2 skins from this design and named the second one andreasviklund-02-alt1. The interesting thing about this skin is that it has 2 levels of tabbed menus and then a vertical menu for any pages deeper than that. In my alt1 version I took it a step further and used 3 levels of tabs and then a vertical menu to show anything deeper. This screen shot shows the alt version with 3 levels of tabs and a vertical menu for pages below that.

screen shot of andreasviklund-02-alt1 skin

This will be available in svn trunk later today for developers and will be in the next release of mojoPortal for everyone else.



Joe Audette  ...

IKVM 0.36 Update 2 Release Candidate 1

A couple of fixes.

Changes:

  • Remapped exceptions with explicit remapping code now call suppressFillInStackTrace (to make sure the proper stack trace is captured).
  • Fixed memory mapped file bug (mapping at a non-zero file offset would fail).
  • Fixed .NET type name mangling for nested types that contain a dot in their name (which the C# 3.0 compiler generates for some private helper types).
  • Fixed java.io.File.getCanonicalPath() to swallow System.NotSupportedException (thrown when the path contains a colon, other than the one following the drive letter).
  • Fixed bug in deserialization of double arrays.

Binaries available here: ikvmbin-0.36.0.12.zip
Sources (+ binaries):ikvm-0.36.0.12.zip

May 04

Top 10 authors with pathetic Amazon Kindle representation

Here are some authors who have fundamentally influenced my life, and who might not effect yours if the Amazon Kindle were the only access you had to their works: Italo Calvino (only _Hermit in Paris_) Albert Camus (zero) Richard Dawkins (only _The God Delusion_) Umberto Eco (zero) William Faulkner (zero) Allen Ginsberg (zero) Joseph Heller (only _Catch as Catch Can_) Vladimir Nabokov (zero) George [...]

NAnt and ASP.NET on Mono

Most of my personal projects are built on top of ASP.NET, Mono and Lighttpd. One of the benefits of keeping them all running on the same stack (as opposed to mixing Python, Mono and PHP together) is that I don't need to maintain different infrastructure bits to keep them all up and running. Two key pieces that keep it easy to dive back into the the side-project whenever I have some (spurious) free time are my NAnt scripts and my push scripts.

NAnt
I use my NAnt script for a bit more than just building my web projects, more often than not I use it to build, deploy and test everything related to the site. My projects are typically laid out like:

  • bin/ Built DLLs, not in Subversion
  • configs/ Web.config files per-development machine
  • libraries/ External libraries, such as Memcached.Client.dll, etc.
  • schemas/ Files containing the SQL for rebuilding my database
  • site/ Fully built web project, including Web.config and .aspx files
  • sources/ Actual code, .aspx.cs and web folder (htdocs/ containing styles, javascript, etc)

Executing "nant run" will build the entire project and construct the full version of the web application in the site/ and finally fire up xsp2 on localhost for testing. The following NAnt file is what I've been carrying from project to project.

  1. <?xml version="1.0"?>
  2. <project name="MyProject" default="library" basedir=".">
  3. <property name="debug" value="true" overwrite="false" />
  4. <property name="project.name" value="MyProject"/>
  5. <property name="project.version" value="1.0.0"/>
  6. <property name="library" value="MyProject.dll"/>
  7. <tstamp property="build.date" pattern="yyyyMMdd" verbose="true" />
  8.  
  9. <!-- These are being definde for posterity's sake, as they may change in the future -->
  10. <property name="bin_dir" value="bin"/>
  11. <property name="src_dir" value="sources"/>
  12. <property name="lib_dir" value="libraries"/>
  13. <property name="site_dir" value="site"/>
  14. <property name="deps_dir" value="deps/"/>
  15. <property name="contrib_dir" value="contrib/"/>
  16.  
  17. <!-- xsp specific properties -->
  18. <property name="xsp_port" value="8088"/>
  19. <property name="xsp_root" value="${site_dir}"/>
  20. <property name="xsp_apps" value="/:../${bin_dir}"/>
  21. <!--// End properties -->
  22.  
  23. <target name="library" description="Basic MyProject build task" >
  24. <echo message="Building ${project.name}-${project.version}"/>
  25. <csc target="library" output="${bin_dir}/${library}">
  26. <sources>
  27. <include name="${src_dir}/**.cs"/>
  28. </sources>
  29. <references>
  30. <include name="Npgsql.dll"/>
  31. </references>
  32. </csc>
  33. </target>
  34. <target name="clean" description="Clean up MyProject">
  35. <echo message="Cleaning ${project.name}"/>
  36. <delete>
  37. <fileset>
  38. <include name="${bin_dir}/**.dll"/>
  39. <include name="${site_dir}/**.dll"/>
  40. <include name="${site_dir}/**.aspx"/>
  41. </fileset>
  42. </delete>
  43. </target>
  44. <target name="site" description="Populate the site/ directory">
  45. <copy todir="${site_dir}">
  46. <fileset basedir="${src_dir}/htdocs">
  47. <include name="**"/>
  48. </fileset>
  49. </copy>
  50. <copy todir="${site_dir}/contrib">
  51. <fileset basedir="${contrib_dir}">
  52. <include name="**"/>
  53. </fileset>
  54. </copy>
  55. <copy todir="${bin_dir}">
  56. <fileset basedir="${lib_dir}">
  57. <include name="*"/>
  58. </fileset>
  59. </copy>
  60. <!-- Copying bin/ into the site/ directory sucks, but xsp2 is buggy
  61.   with the applications parameter
  62.   -->
  63. <copy todir="${site_dir}">
  64. <fileset>
  65. <include name="bin/*.dll"/>
  66. </fileset>
  67. </copy>
  68. </target>
  69. <target name="run" description="Runs the xsp2 web server on the port cited above" depends="library, site">
  70. <echo message="Starting the xsp2 web server running on port ${xsp_port}"/>
  71. <exec program="xsp2" failonerror="true" commandline="--port ${xsp_port} --root ${xsp_root}"/>
  72. </target>
  73. </project>

The Push Script
Since I usually build and deploy on the same machine, I use a simple script called "push.sh" to handle rsyncing data from the development part of my machine into the live directories.

  1. #!/bin/bash
  2. ###############################
  3. ## Push script variables
  4. export NANT='/usr/bin/nant'
  5. export STAGE=`hostname`
  6. export SOURCE='site/'
  7. export LIVE_TARGET='/serv/www/domains/myproject.com/htdocs/'
  8. export BETA_TARGET='/serv/www/domains/beta.myproject.com/htdocs/'
  9. export TARGET=$BETA_TARGET
  10. ###############################
  11.  
  12. ###############################
  13. ## Internal functions
  14. function output {
  15. echo "===> $1"
  16. }
  17. function build {
  18. ${NANT}|> && ${NANT}|> site
  19. }
  20. ###############################
  21.  
  22. ###############################
  23. ## Build the site first
  24. output "Building the site..."
  25. build
  26. if [ $? -ne 0 ]; then
  27. output "Looks like there was an error building! abort!"
  28. exit 1
  29. fi
  30.  
  31. ###############################
  32. ## Start actual pushing
  33. if [ "${1}" = 'live' ]; then
  34. output " ** PUSHING THE LIVE SITE ***"
  35. export TARGET=$LIVE_TARGET
  36. else
  37. output "Pushing the beta site"
  38. fi
  39.  
  40. output "Using Web.config-${STAGE}"
  41. output "Pushing to: ${TARGET}"
  42. &n