How to pin custom app tiles on behalf of your users in Office 365

The app launcher in Office 365 is how users can quickly get to any workload no matter where they are in Office 365.  It is accessed by clicking the waffle (though I see it more as a keypad) in the upper left corner.  This image is the default tile layout for an E5 admin:

Admins can add custom tiles to the tenant that point to any URL.  These custom tiles then show up under the ALL tab for users.  Here is an example of one I added to my tenant that just points to this blog’s RSS feed (hence the icon):

You may want to not just add the tile, but also pin it to your users’ HOME tab.  Office 365 does not currently allow admins to pin tiles for users; you can only pin apps for your own account.  But that didn’t stop me from figuring out where these settings are stored and manipulating them programmatically.

App launcher settings are stored in a user’s mailbox.  This is why a user needs to have an Exchange Online mailbox in order to customize their app launcher.  The settings for the app launcher are in the PR_ROAMING_DICTIONARY property of the IPM.Configuration.Suite.Storage message at the root folder of the mailbox.  EWS has a class for working with user configuration settings that are stored in a dictionary property, so you don’t have to manually work with the binary property.  Using PowerShell and the EWS Managed API, get the value of this property (the credentials and email address of the mailbox have already been assigned to variables):

$exchangeVersion = [Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010_SP2
$exchangeService = New-Object -TypeName Microsoft.Exchange.WebServices.Data.ExchangeService($exchangeVersion)
$exchangeService.Credentials = New-Object -TypeName Microsoft.Exchange.WebServices.Data.WebCredentials($Credential)
$exchangeService.Url = 'https://outlook.office365.com/ews/exchange.asmx'
$folderId= New-Object -TypeName Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Root,$MailboxName)       
$userConfig = [Microsoft.Exchange.WebServices.Data.UserConfiguration]::Bind($exchangeService, "Suite.Storage", $folderId, [Microsoft.Exchange.WebServices.Data.UserConfigurationProperties]::All)

The Dictionary property contains a hash table:

and the app launcher settings are stored in the value for a key name of Suite/AppsCustomizationDataTEST.  Because the settings are stored as JSON, let’s convert them to a custom object:

$apps = ConvertFrom-Json $userConfig.Dictionary.Get_Item("Suite/AppsCustomizationDataTEST")

You can see that the all tiles for the Home tab are in a property called PinnedApps, which are themselves stored as custom objects. Here is the first one:In order to pin a tile, you need an object for the one you want to pin.  The easiest way to do this is to manually pin a tile in your app launcher, then use EWS to get that tile object.  Pinning a tile/app adds it to the end of the Home tab as the last item in the collection so, assuming you don’t move it after that, it will be the 24th item in the collection (index 23).  I assigned that item to a variable, so this is the object that will be added to other users’ pinned apps:

The collection of pinned apps is a fixed array, so to add a new item to it, copy the existing array to a new one plus the object for the custom tile.  Then convert the app settings object back to JSON, update the dictionary hash table with the new object, and save the changed user configuration setting back to the server:

$apps.PinnedApps = $apps.PinnedApps += $myapp
$newapps = ConvertTo-Json $apps
$userConfig.Dictionary.Set_Item("Suite/AppsCustomizationDataTEST",$newapps)
$userConfig.Update()

If the user is already logged in, refresh the browser and open the app launcher to see the newly added tile:

You can modify the above code to loop through any number of mailboxes and add the custom tile object to their app launcher.  You can also manipulate the size and placement of the tile if you want, but my example is to show you how it can be added.  It should be noted that, while all of this does work, it is unsupported, so programmatically customize at your own risk.

Rio Receiver software can’t read Unicode ID3 tags

I have four Rio Receivers, which use Rio’s Audio Receiver Manager software on a host PC to serve music. Over the years, certain tracks wouldn’t be listed in the database. I had looked at the encoder used, what ID3 tags were present, coexistence of v1 and v2.x tags, filenames. But I couldn’t figure it out.

I have since tried several of the alternate ARM programs out there: MediaNet, JReceiver, rioplay, and there may have been one or two others. But I could never get any of them to work. I got close recently with JReceiver, but instructions that date back to 2003 do not account for today’s versions of the various components.

I decided to take another look at why some tracks don’t show up in the database. Forum postings indicate it should have no problem with ID3v2.x. All of my tracks have v2.3 and no v1.x tags. And most tracks are indexed fine. So I started reading about the history of ID3, the details of the different versions, and notable incompatibilities such as Windows Media Player 12 still won’t read v2.4 tags.

The text encoding available in ID3v2 made me think because I know of some programs can’t read a Unicode text file; it must stored in ANSI. So referred to my tag editing program, Tag & Rename, and there is a setting for enabling the writing of v2 tags in Unicode. But if a tag is in Unicode format, T&R doesn’t indicate this; only when a tag is rewritten will it use the appropriate format based on the setting.

I used a different tagging application, Kid3, to show which tags are in what format (down to individual tags in a track). I tested with a track and encoded all relevant fields (artist, title, album) in Unicode. When I indexed it in ARM, it didn’t show up. I used Kid3 to change the tags to ISO-8859-1, indexed again, and voila! I did further testing and determine that if you format, say, title in Unicode but the artist in ISO-8859-1, the artist will show up in the database, but not the song underneath the artist. So ARM still reads all the tags in a track; it is just those that are encoded in Unicode are not added to the database (the individual tags).

Since I am not trying to use international characters sets there is nothing really to be gained by storing in Unicode. I have asked the developer of T&R to add the ability to see what format a given tag is in (similar to Kid3), but in the meantime I have been rewriting my tags without the Unicode setting enabled as I check for album art in my tags.

Replace the starter string on a Ryobi 875r trimmer

For the second time since I have owned it, the starter string on my Ryobi multi-attachment trimmer broke.  Must be poor design causing too much friction and slowing wearing down the nylon until it frays and breaks.

One of the difficult parts to remove, if you haven’t done it before, is the clutch drum.  To do so, you need to remove spark plug and insert a screw driver into the combustion chamber to keep the piston from moving.  Then use a Torx 15 driver and insert it into the whole in the front of the drum.  Turn the driver counter-clockwise while holding the engine/chassis still to remove the screw holding the drum in place.

After you remove the springs holding the clutch together, loosen the clutch with a wrench and remove it.  Then you can remove the gray plastic cover that houses the starter string, pulley, and spring.  When you remove the pulley retaining parts, you can lift out the pulley.  You need to be careful when doing so because the spring will uncoil all over the place if you don’t reign it in while lifting the pulley out.

I slowly let the spring uncoil so I can work with the pulley.  Now you can replace the broken string.  The frustrating part for me at this point was keeping the spring in place while trying to attache the pulley.  After several failed attempts, I figured out a better way.  I was trying to mount the pulley with the string wound around it, which means that the spring has to be uncoiled a bit.  But this leads to the spring not wanting to remain flat when the pulley is being mounted on the shaft.  The better thing to do is to unwind the the starter string so it is fully extended.  You can then wind the spring as tight as it will go around the pulley (less one or two revolutions).

Even though the spring has more potential energy at this point, there is enough friction between each revolution of the spring that it makes it less prone to want to jump off the pulley.  I found it much easier to mount the pulley when the spring is wound tighter around it.

I hope this trick will help you if you need to replace the starter string on your Ryobi trimmer.

So what is this Something?

I haven’t had any updates in awhile because I have been looking at different blogging software.  simpleblog, while easy to implement and customize, lacks features common to other solutions that I would like.  So several months ago I began trying different programs in a test site, but none of them ultimately worked for me.  Among the ones I tried:

  • dBlog – This offered some features I have been looking for, but the default locale is Italian.  There is a translation for English which changes titles and headers, but things like the calendar remain in Italian.  There isn’t a lot of documentation in English, so I was left to doing a lot of manual code search-and-replace.
  • DotNetNuke – This is one of the primo open-source CMS solutions available.  It is an immensely powerful application that uses modules to offer the features you want: blog, document library, file library, ecommerce, forums, feeback, etc.  The application is geared for more commercial or multi-user sites, not a one-off blog, so the portal is a bit too much for what I am looking for.
  • Nukedit – A solution ready to go pretty much right out of the box.  But it lacks some of the features that even simpleblog offers.
  • WordPress – Probably the most popular blog software out there.  But it uses PHP and mySQL, whereas I prefer ASP and Access since I know how to write in VBScript.  I installed PHP and mySQL and tried to get WordPress working, but ultimately could not.

I have been using simpleblog 2.3 for awhile, and 2.2 before that.  Version 3 is available and after looking at it before all the others, I decided to look at it again.  It has the advantage that I am already familiar with the code that Johann has used for 2.x.  While it still lacks the features I have been looking for, I grew tired of trying all the other solutions.  So I have upgraded sidefumbling to simpleblog 3.0.

Pros:

  • Very simple installation using ASP with VBScript and an MSAccess database.
  • Built-in RSS feed.
  • Version 3 adds a sidebar for recent posts.
  • Version 3 uses FCKeditor for creating posts, which is a customizable WYSIWYG editor.
  • Easy to integrate it into your site by editing ASP files and including your own scripts.
  • Use of CSS for easy manipulation of global settings for font, layout, etc.

Cons:

  • No use of categories or the ability to group/search for posts based on keywords.
  • No search engine.
  • No notification of pending comments.
  • No use of CAPTCHA for comment spam-prevention.
  • Difficult to use code blocks for using literal code in posts, though I have figured out in FCKeditor how to do this.
  • Admin interface is limited to accessing previous posts by using calendar to access posts written on specific date, i.e., you cannot just browse a list of your posts for the one you one; you have to use the calendar to find the day you want and then bring up any posts for that single day only.
  • Cross-browser support is limited, mostly by layout issues.
  • No built-in way for posting from a mobile device, which is nice when traveling or making posts while at a conference, etc.
  • Not regularly updated.

Despite the cons, I offer my thanks to Johann for creating a free solution that has obviously worked for me.