Jul 16 2012

Synology announcement for official Windows Phone 7 DS audio app

Great news, everyone !

Synology is releasing an official app for DS audio  on windows phone 7, pretty much  like Open Syno.

(source : http://www.synology.com/support/beta_dsm4.1.php?lang=enu )

It is not yet available on the marketplace as I write those lines, but I find it really thrilling that now the Windows Phone 7 platform is becoming attractive enough to get those guys onboard.

Whether the guys over at synology got inspired by Open Syno is unknown, so I have no idea yet how is the app working.

That leads to the one big question : Are you guys still interested on getting updates for Open Syno, or will you just use the official app anyway ?

Yes, those guys can work on it full-time.

Yes, those guys can give you a proper support

But also, I have no Idea what their plans are regarding playlist offlining (I’m working on it at the moment)  or Last.Fm Scrobbling (It was supposed to be the next big thing in the pipe for Open Syno.)

so.. Yeah… I guess the question is : is anyone still interested in Open Syno ?

Go ahead and add comments to speak your mind :)

 


Mar 12 2012

Reisende Bücher

Disclaimer : Sorry, my German is very, very bad, but I’ll try ;)

 

Für alle Deutschsprecher-in

Ich habe vor einige Monate dieses Buch auf Amazon gekauft :

Ishmael

Leider, habe ich es auf Französisch bestellen, zwei Kopie um das mitzuteilen, aber leider habe ich eine Fehler gemacht und das Buch ist auf Deutsch gekommen.

Natürlich wie sie merken können, mein Deutsch ist nicht so toll, so habe ich die entscheidung um aus diesem buch ein “Livre Voyageur” machen : ein Reisendes Buch.

Das Konzept ist einfach :

Ein Buch
Ein Zug
Das Bedürfnis zu teilen

und das ist alles. Falls sie diese Seite erreichen haben, dann warscheinlich haben sie dieses Buch gefunden.

Und jetzt ? was ist los ?

Zuerst, Lesen-Sie dieses Buch, weil das ist echt toll und jeder Mensch soll dieses Buch lesen mindestens einmal im leben.

Dann, wann sie mit dem Buch fertig sind, lassen sie es in einder Zug oder ein anderes öffentlicherverkehrsmittel oder ein Freund der wird genau das gleich machen.

Ich habe auch QR Code augedrückt so Leute können die Reise dieses Buch folgen : wieviel leute haben das Buch gefunden ? wo war es ? diese information können sie mit dem QR code und ihre smartphone ingeben.

Falls sie kein smartphone haben, dann können sie einfach ein Kommentar auf dieser Seite lassen.

Danke für die Kultur mitzuteilen und shöne Reise :)

- Fabio


Jan 28 2012

Open Syno Gets Mangoed

Good news everyone,

After quite a lot of work and hearing an amazing amount of your feedbacks, seesharp.ch is proud to release the new version of open syno. It is now supporting playback music, has a few UI improvements, a small integration of last.fm, ( no scrobbler yet, but it is planned) and quite a lot of bug fixes. This update involved a complete rewrite of how the tracks are rendered, and should therefore avoid a few very frustrating app crash.

We hope you will enjoy this release, and keep us posted if something’s wrong or if you want to have new features regarding Audio Station’s support on Open Syno.

The app will be available for download shortly at this address

 


Oct 19 2011

Jumping through hoops with the JumpViewer

Windows 8^HDeveloper Preview is out, yay !

 

And with it, comes a whole lot of new toys to play with : Visual Studio 11, Blend 5, but most important : the Metro Ui goodness is also available for desktop developers to play with !

And along with new shiny Ui’s come new paradigms, new API’s, and new User controls.

The one we’re going to have a look today is the JumpViewer : a new control that works a little bit like a Master-Detail view, only there is only one view shown at once, and the user can Switch back and forth by tapping master items and “zoom-pinching out” the detail view.

Okay, enough for the concept, after all, there is a whole lot of videos around from the latest Build conference : What we are interested in is how we will actually code an app that uses our new toy.

The usual way to go is to take microsoft’s examples, look how they’ve done it, mimic, copy, paste, adapt, smile, and voilà : you know everything about your new friend.

Only this time, I wasn’t exactly thrilled by the way Microsoft had set up their example :

For those who don’t know the JumpViewer : there are two views : one called JumpView, the other ContentView.

In microsoft’s example, which you can find here, the  ContentView’s ItemsSource was bound to a CollectionViewSource, using a regular data binding, but the JumpView’s – the master, if you will – was simply not even set. A little bit of investigation will show that the ItemSource property is set in the codebehind, and in my book, that spells code smell.

So, from there, how would we make it MVVM friendly ?

My first attempt was to try to use the exact same binding on the JumpView. It required creating a Template for the Group items, and collapse the Items themselves. Unfortunately, it seems the internals of the JumpViewer control bases its navigation between the two views on the collectionView’s CollectionGroups. To make it simple : the item clicked in the JumpView must be the group of the ContentView, in order to navigate to it.

Therefore, using the same binding for both views would not expose such hierarchy, and even though the visual result would be OK, the navigation would not work.

The second attempt was to edit the binding to provide an additional Path in the JumpView’s binding in order to try an reach the CollectionGroups, but for some reason, the CollectionGroups was never reached. Adding a converter to allow us to set a breakpoint in the middle of the binding was also a failure : The breakpoint was never hit, meaning that the binding could not reach the CollectionGroups.

Reverting to the same binding as in the ContentView with the DebuggerConverter still applied to the binding would show that the passed value, the CollectionViewSource, was a Windows Runtime object. In other words : a COM object. I can only guess that the CollectionGroups was lost in the marshalling of the system object.

The third and last approach was to use a ValueConverter for the JumpView’s binding : since the CollectionGroups property was not reachable through a binding, but was reachable, after an explicit cast in C#, it was then a no-brainer : we could use a ValueConverter to join the dots and return the CollectionGroups property that was not accessible with a plain binding. The converter would then look like this:

publicclassGroupedCollectionToGroupsCollectionConverter : IValueConverter

 

{

 

publicobject Convert(object value, string typeName, object parameter, string language)

 

{

 

return ((ICollectionView)(value)).CollectionGroups;

}

 

       publicobject ConvertBack(object value, string typeName, object parameter, string language)

       {

           thrownewNotImplementedException();

 

        }

}

 


Sep 4 2011

Open Syno Loves Resharper !

Great news.

Open Syno has been granted an Open Source licence for ReSharper

To the developers out there, just know that this is the best tool money can buy (for commercial projects) and the best is that the guys at jetbrains kindly offer some Open Source licences to support the Open Source community !

Way to go, Jetbrains !

If you’re a dev, download the 30 days trial and don’t forget apply to their Open Source licneces programm if you’re working on an Open Source project :)

 


Sep 3 2011

Open Syno 0.4 is out

What’s new this time ?

The much awaited SSL support is here, so if your Synology is protected by a valid trusted Certificate Authority, then you’ll be one happy Synologist !

What else ?

After some feedback from the community – thank you, community – I realized that the User Interface maybe was not very intuitive…

Buttons for starting playback have been moved around and renamed so it should be more explicit.

by the way, just a little tip : if you want to invert the selection of your album’s tracks, just tap the album’s cover !

Oh, and one more thing. As the Mango update release date gets closer and closer, I will focus on a Mango version from now on. That means that this update should be the last one that will be supported by NoDo.

but in the meantime… get the app and enjoy your music !


Aug 21 2011

Open Syno with https : need a little help, please :)

Hi there,

Following a quite a lot of requests from the community, we’ve decided to implement https support for ssl-encrypted connection to the Synology server.

Unfortunately, as it has been pointed out here, self-signed certificates don’t work out of the box on windows phone 7. Furthermore, the trusted certicicate authorities are not the same on windows phone 7 as on windows.

A list of the trusted Certificate Authorities can be found there.

If you happen to have your synology server set-up to use a certificate issued by such Certificate Authority, please let me know so I can test my code against it.

Note : manually installing a certificate authority for startssl doesn’t seem to work for an app, but it does work in a browser. That’s why I need to test https support with a legit Certificate Authority which is supported by default on Windows Phone 7.

Thanks in advance for those of you ho will step up :)


Jul 12 2011

Open Syno : All apologies

Hi there,

First of all, the first two weeks of Open Syno have been very successful. Far more than expected to say the least. in the first week of its public availability, Open Syno has been installed on more than 300 phones, and that is really awesome. What is even more awesome, is that we also have received an amazing number of feedbacks from the community.

Among those feedbacks, some users had troubles decoding the audio properly, reporting glitches in the playback. We’ve found and fixed the problem : the reason was we didn’t bundle the right version of a third party dll : Managed Media Helpers.

So, now that it’s fixed, we are just waiting for Microsoft to finish the certification for the updated version.

We are deeply sorry for what happened, and we are looking forward to hear from you if the fix worked as expected for you. To make your voice heard, don’t hesitate to comment to this blog post !

The applied fix focuses on Wireless connectivity and 3G connection might not work perfectly yet, but we are working on it Winking smile

As usual, just a reminder : you can find us on github and on idea informer to post your issues and your ideas.

Cheers


Jun 30 2011

Open Syno : It’s finally out !

Tonght’s the night : Open Syno just hit the marketplace !

After a few failed certifications (seriously, the test guys at Microsoft do an amazing job when it comes to testing and writing test reports, with repro steps, expected behavior and actual behavior… That’s awesome because it makes the bug fixing much much simpler !)

Anyway, here we are, still on time to deliver it before the end of June : that was our own personal Milestone; we did it, and we’re pretty excited to hear about your feedback !

… And about the feedback : don’t forget to use our Idea Informer !

Keep in min though, that this first release is still at a  very early beta stage, and that you *will* run into bugs. We’ve tried to make it easy for you to give us a feedback by e-mail when an unknown error occurs, so please, be kind and send us your error reports when the app asks you : those are very valuable information, they’re anonymous, and it won’t cost you a dime Winking smile

So far, in order to keep the app as stable as possible, we focused on getting it to work with Wireless connectivity in mind. You can give it a try with 3G connection, but it is really not recommended… but don’t worry, we still have a few tricks up our sleeves and we’ll try to pull one or two rabbits out of them to be published on the Marketplace !

In the meantime, go grab it, and have fun with your Synology Nas !

 

ss-splash

Oh ! … and I can never thank her enough : a huge thanks to liliboude for her awesome graphics… (seriously : if you’re a kids-book publisher, you’d better get interested in her works before someone else does !)

 

Note : link to the marketplace download should become active anytime now … That one is not on me anymore Winking smile


Jun 29 2011

Unity + MEF + Prism + MEFContrib == Sweet + me.Sweaty;

Allright, so I have been pretty quiet if not silent on this blog the last few weeks.

A few articles in the Draft box, but – we’ve all been there – not the time to proof-read it before unleashing it in the wild…

But that one definitely had to go on the fast track, so here it is :

Context

I was working on a project last week where I had to deal with discoverability – in my book, that spells MEF - while still using the principles that are near and dear to my heart, and here, I’m thinking about Dependency Injection (DI) and Inversion of Control (IoC).

Of course, this was in a WPF project, so I wanted to use my beloved Prism.

If I remember correctly, I came across a newsgroup where Glenn The MEF guy Block stated that you should use your favorite IoC container for known dependencies, such as factories, services, and other "built-in" bricks for which you might want to change the implementation one day (let’s say for blendability purposes, switchable alternative business logic or whatever good reason suits you) and MEF for all those dependencies you don’t know / can’t know beforehand.

… And I absolutely agree with Glenn : in the past, I’ve tried to use MEF as an IoC, but don’t even bother trying this at home : you’ll end up overriding GetExports methods in your homebrew custom Catalog to get there… not a good idea.

So, since using MEF as an IoC would require its fair share of arm twisting, why not using the right tools for the right job ? after all, Glenn Block even said so in this two-parts article

The article looks promising, since it is supposed to answers some question such as : how do I get known dependencies to be injected in the constructors of unknown dependencies : in other words : how do I get two containers (IoC + MEF) to tap into each others to resolve the types they require !
Interesting stuff, can’t wait to read it, you might think…

The only problem is just that now, one year and a half later, Part 2 where the theory would be applied in practice has still not been published.

In the meantime, though, a few happy coders (including Glenn himself ) teamed up to create the MefContrib project on codeplex, but don’t jump around too quickly.. there’s a catch ;)

First Steps with MefContrib

After spending some time across outdated code snippets on blogs and outdated code samples on the official repositories (some samples are still meant for .net 3), I realized that I was missing an assembly reference (thanks Resharper !) so… really, if you’re going to try : do yourself a favor, note that the samples on the documentation page are calling a method called :

Container.RegisterCatalog(catalog);

Try not going crazy when you don’t find it, it’s just because it’s an extension method… And you can find it in MefContrib.Integration.Unity.UnityContainerExtensions

With that one out of the way, use the UnityBootstrapper as a base class to write your Prism bootstrapper and let’s try to use it.

If you’re lucky, everything will be fine and you can go on living happily ever after.

If you’re not lucky, you’ll get this sweet little exception which will make you go insane

Microsoft.Practices.Prism.Regions.Behaviors.RegionCreationException was unhandled by user code

  Message=An exception occurred while creating a region with name ‘MainContent’. The exception was: System.Collections.Generic.KeyNotFoundException: controlType

The annoying thing with that one is that if you had regions before using MefContrib, they were working absolutely fine before you start trying to get MEF and Unity to work together through MefContrib… Don’t believe me ? just go ahead, remove the RegisterCatalog method from the container and the sky is back to being sunny with birds singing in the trees.

The problem is actually absolutely not related to regions, but rather to a set of coincidences involving Prism’s Unity extensions and the order in which MEFContrib resolves the types from Unity and MEF.

Analyzing the culprit

if we pay close attention to the region mappings, we’ll see that the XAML is parsed, regions are found, and they are added to the mappings. The problem is that when the exception is raised, we can see that the mappings list is empty. Analyzing the code shows no place where the mappings get cleared, the only reasonable reason would be that mappings are still in the mappings list, but the mappings isn’t here : calling GetHashCode on the mappings list both when elements are added to the list and before the exception is thrown will confirm that we are not working with the same object !

In order to know why, I just added a constructir to RegionAdapterMappings and set a breakpoint.

Surprise ! the constructor gets called twice : once in the Microsoft.Practices.Prism.Bootstrapper class (in the ConfigureRegionAdapterMappings method) and a second time when the MefDelayedRegionCreationBehavior class is instanciated.

If we have a closer look at its constructor, we’ll see that the type of the injected RegionAdapterMappings object is actually a MefRegionAdapterMappings object.

We are then dealing with two MEF objects which are bridges to expose prism classes through Mef part exports, even though we were using a UnityBootstrapper : There is definitely something wrong here.

The reason

First : you most certainly know it if you’re using such advanced MEF scenarios : if an assembly that exports parts is seen by the right catalog, all its parts will be available for import and automatic constructor injections, so the shoer answer to "Why does that happen" is "Because there are MEF parts that are interfering with the other Unity types and that get picked before.

Just remove the Prism.MefExtensions from your project references and your folders and you’re all set, but chances are you still need this dll and you can’t get rid of it that easily. Of course, you can always try to fiddle with catalogs, for instance, the DirectoryCatalog lets you set a patterns to match the filenames to consider in the imports, but there’s only so much you can do that way. Plus, if you want to use some Prism-related MEF attributes, such as ExportModuleAttribute, you’re out of luck with this solution… but at least, now you know you are on the right path.

Let’s take a step back : We use the UnityBootstrapper to register in the IoC the objects that Prism creates behind the scene. That means that Prism creates a RegionAdapterMappings object and makes it available for Unity. The annoying thing here, is that we have seen that when a RegionAdapterMappings is required by a constructor injection, the MEF+Unity type resolution returns a MefRegionAdapterMappings object, that is : a bridge to a RegionAdapterMappings as exposed by MEF when a MefBootstrapper is used instead of a UnityBootstrapper : At some point, a UnityBootstrapper-instanciated object is being ignored only to be replaced by a MefBootstrapper-instanciated counterpart.

What is really disturbing is that if one takes a deep dive in the gitHub repository for MefContrib, he will come across this comment, stating that Unity components always take precedence over MEF. Obviously there something inconsistent here, right ? Well not really : If we look at the base types for DelayedRegionCreationBehavior and RegionAdapterMappings, we will see that they don’t implement any interface. That also means that unity cannot register a type for a specific interface. Instead, it looks like Unity considers there is no need to register anything, since RegionAdapterMappings has a default parameterless constructor and therefore, can be instanciated by itself. It all works well if only Unity is competing for a specific type, but since MEF is also exporting his own version of the type, Unity is overtaken by MEF.

If you stop a minute to think about it, it kind of makes sense, since if we wanted to let Unity resolve any implicitly registered types, MEF would almost never be able to export his objects, even though he would export them explicitly and Unity implicitly.

Fixing it !

There are three approach to fix this :

  1. Yourself : in your Bootstrapper, when configuring the catalogs, before calling the ConfigureCatalogs from the base class, just register it explicitly, the method in the base class will handle a prior registration properly and use it to add new region mappings.

    Container.RegisterType<DelayedRegionCreationBehavior, DelayedRegionCreationBehavior>();
  2. Unity : If the guys at Pattern & Practices agree with me, they could register those types explicitly in the base bootstrapper class instead of forcing every developer using MefContrib to do it themselves in their own bootstrapper.
  3. MefContrib : Maybe they could add a workaround so no changes to Unity would be required, and so the developer using MefContrib would not have to explicitly register all the problematic types. The idea would be to list all those types and register them when the  RegisterCatalog extension method is called.

After having done so, it is possible to resolve a type that has been registered in one container and use the automatic constructor injection even for types to inject that have been registered in the other container… and still using regions and still having the MefExtensions dll in the scope of a MEF catalog.

Happy coding !