You are here

Feed aggregator

Video Streaming with a custom IRandomAccessStream on Windows and Windows Phone (Universal App)

MSDN Blogs - Sat, 07/12/2014 - 08:09




We encountered a challenge on our project where we wanted to play videos in MediaElement but the MP4 file was stored in Sharepoint which required user credentials for authentication. If you pass a URL to the MediaElement on Windows Phone 8.1 then it just tried to access the file without passing any authentication information and there is no easy way to intercept this. We escalated this to the Product Group and got the response that this was by design.


We came up with the idea of writing a custom IRandomAccessStream and setting it on top of WebClient so we could manipulate the http requests going out, and we wanted to use range headers so we could request just a sequence of bytes from the server and would not need to download the whole MP4 file in order to stream it. Although simple in concept, this proved quite challenging and took many complete rewrites of our solution and a team effort where we were all
contributing ideas and code, but we finally got it working, so I’m posting it here.

There were three really tough problems –

  1. Get the IRandomAccessStream implemented properly so that MediaElement would stream and play it
  2. Get the http RangeHeaders working so that we didn’t need to download the whole file before it started
  3. Figuring out the mix of IAsyncOperationWithProgress and the async/Task feature so we could do async
    operations in the middle of data requests

We actually got each of the three pieces working separately before combining them into the working solution. The web proved very little help as there seemed to be a lot of people struggling with this but nobody seemed to get it working so
hence this blog post. We also saw people trying custom MediaStreamSource implementations but that looked much more complex than the custom IRandomAccessStream if we could get it to work.

The solution posted here uses Universal apps and has a Phone project and a Windows 8.1 project so works on both platforms. Most of the files in the solution are pretty much just the standard template files with the exception of StreamingRandomAccessStream.cs and the following lines in MainPage.xaml.cs:

protected async override void OnNavigatedTo(NavigationEventArgs e)
    var uri = new Uri("");
    var headers = await StreamingRandomAccessStream.GetHeaders(uri);
    ulong length = (ulong)headers.ContentLength;
    string mimeType = headers.ContentType.MediaType;
    var stream = new StreamingRandomAccessStream(null, uri, length);
    mediaElement.SetSource(stream, mimeType);

Here you see us fetching the headers from the MP4 file and creating a new instance of StreamingRandomAccessStream which is where the magic happens. Note that the sample Gilligan’s Island video does not actually need authentication but it was useful to test with as it is quite large. You’ll need to replace the dummy usernames and passwords in the sample to use the authentication piece.

The StreamingRandomAccessStream has some static methods for managing the http traffic but where it all happens is really this method:

public IAsyncOperationWithProgress<IBuffer, uint> ReadAsync(IBuffer buffer, uint count, InputStreamOptions options)
    return AsyncInfo.Run<IBuffer, uint>(async (cancellationToken, progress) =>
        if (_stream == null)
            var netStream = await GetStreamWithRange(_requestedUri, _requestedPosition, _requestedPosition + count);
            _stream = netStream.AsInputStream();

        return await _stream.ReadAsync(buffer, count, options).AsTask(cancellationToken, progress);

This method is called through the IRandomAccessStream interface by the MediaElement to request the bytes of the video. The really tough bit that took a lot of wrestling with was getting the delegate signatures right and figuring out how
to do an await in the middle of an IAsyncOperation.

Anyhow, hoping this blog post helps you and thanks to the team – Lestyn Jones, Simon Middlemiss and Paul Tallett.



REST APIs in App Studio Part 1- Building the Shell

MSDN Blogs - Sat, 07/12/2014 - 07:52

In this series, I am going to talk about how to add support for REST APIs with projects built in App Studio.  If you have never used App Studio before, I would recommend taking a quick look at some of the documentation and videos.  You can check out the “How to” page, the “Sample Apps Page”, or just start exploring the App Studio Website.  Additionally, a coworker of mine, Joshua Drew, has a pretty good post on an introduction to App Studio, here

All in all, App studio is a quick and easy tool to build Windows Phone 8 Apps and/or Universal Apps that support both Windows Phone 8.1 and Windows 8.1.  Furthermore, one of the greatest benefits of App Studio, is that you can actually download the source code for your project in C# and XAML, and then extend from there.  That means that you can build something in App Studio quickly, download the source code, and then add on in code.  Being able to add on to an App Studio Project is what got me thinking about the possibility of extending it to add support for REST APIs.  In my first couple of posts and demos, I will be working with data about movies from the Rotten Tomatoes API.  I would recommend that you check out my previous post on the Rotten Tomatoes API to get a feel for the API as well as to sign up for your API Key.  It is not required to use this API, but it will make following along with the demo easier.

My plan is to use App Studio to set up a shell that will take care of a lot of the tedious work, the layout, the data binding, the structure of the bound objects, etc.  We will be creating a dynamic collection that typically App Studio stores for you.  Because it sets all of that work up, we will just need to go into the source code and change the source of the data from the database that App Studio stores for us, to information coming back from an API.  That’s the basic idea here, so let’s go ahead and get started at the App Studio Website.

If you aren’t already, go ahead and click sign in at the top right.  After you have done so, let’s go ahead and click on “Start" New Project”.  From there, we will have the choice to create an empty app or start from a template, but we are just going to start with an empty app.  So, go ahead and select the “Empty App” option.

Then, click “Create”.

And then we will be brought to the content page, where will add all of the content to our page.  We are going to keep this “shell” very simple by just adding one dynamic collection.  So go ahead and click to add a collection at the bottom of the page.

The “Add Collection Section” menu will pop up next.  You will need to give it a name (remember it too because we will reference that name in code).  I am going to name my section, “In Theaters”, because I will be displaying a list of movies that are currently in Theaters from the RT API.  Along the same lines, I will edit the columns of my collection to include Title, Rating, ImageUrl, and Synopsis as shown below where all are strings except the ImageUrl, which is of type image.  Once you have that, go ahead and click “Confirm”.

Now that we have that section added to our project as shown below, we want to click “Save”, and then click to edit our new section. 

Here we will be changing the layout of our section as well its data bindings. 

My “In Theaters” section will have  two pages; a list of movies, displaying the title, rating, and image, and a details page, displaying the title, synopsis, and image, of a selected movie.  The first page is already selected, so you can go down to the bottom “Bindings section, to change the bindings appropriately.  Title should be set to Context.Title, Subtitle to Context.Rating, and Image to Context.ImageUrl as shown below.  Additionally, I have chosen a layout (fourth from the left) that I fee fits most accurately.  You could choose any of these, but keep in mind, that the controls for data binding might change too.


Now, we similarly change the details page that will display information about a selected movie.  Choose one of the layouts, and then set the Title to Context.Title, the Description to Context.Synopsis, and the Image to Context.ImageUrl.  Keep in mind again, that if you use a different layout than the one I am using there might not be the same bindings available.

Once you have the layout and bindings set for both of those pages, you can go ahead and click to save your project.

Now, there is a ton more that we could do in App Studio at this point, but I am just focusing on building the simple shell that we talked about earlier.  This is all we need for that shell at this point, so go ahead and click on “Finish” in the top right now.

Then, click generate.

Choose to target both platforms as shown below.

Once App Studio is done generating your source code, you can download it at the bottom of the page by clicking “Download Source Code”.   Then click the downward arrow to the left of the stuff about Visual Studio.

Then click “Download”.

Once you click to download, you be given the option to save, so go ahead and save the zip file somewhere you can find it.  Then, go ahead and extract the files from that folder, and if you look inside, you should find a Visual Studio Solution like so.

Perfect, stay tuned for part 2, where we will open the project up in Visual Studio and start making the necessary changes to add REST API support for the Rotten Tomatoes API.

As always comment below with questions, comments, or concerns, and feel free to follow me on twitter @jquickwit.

我們宣佈與 Google 及 Docker 合作以在 Microsoft Azure 上支援新的開源專案

MSDN Blogs - Sat, 07/12/2014 - 07:41

原文發表於 Announcing Collaboration with Google and Docker to Support New Open Source Projects on Microsoft Azure

在上個月,我們宣佈支援部署 Docker 上 Azure 虛擬機器上,並且應用我們的技術,讓客戶能夠盡快地使用 Docker 的威力。為了持續為我們的客戶提供更好的支援,我們宣佈將與 Google 及 Docker 合作,預計將在 Microsoft Azure 上支援 Kubernetes 及 libswarm 這兩個開源專案。

Kubernetes 這個專案發表於今年六月份,它是一種「宣告式容器管理解決方案」,原本是在 Google Compute Engine 上管理 Docker 的工具,在 Microsoft Open Technology 於這個專案的 GitHub 專案上的貢獻後,也讓這項工具支援在 Microsoft Azure 的 Linux 虛擬機器上運作。這讓使用 Microsoft Azure 來建置 Linux 虛擬機器的用戶多了一個管理工具的選項。

同樣地,MS Open Tech 也開始貢獻 Docker 的命令式管理工具 -- libswarm 專案,Microsoft Azure 也有了原生的支援,能夠在 Azure 虛擬機器上部署 Docker 容器。

這項宣佈呼應了我們 Microsoft Azure 一貫對客戶的承諾 -- 回應客戶的需要,並且支援多樣的系統、技術及語言(從 Windows, SQL, .NET 到 Python, Ruby, Node.js, Java, Hadoop, Linux, 以及 Oracle ),讓客戶能夠快速在 Microsoft Azure 提供的公有雲服務上建置及部署應用。同樣我們也持續打造 Microsoft Azure 為開放的平台,如同最近宣佈支援的 Puppet, Chef 及其它開源專案一樣。在 Microsoft,我們一向看重與開發人員、合作夥伴以及客戶在複雜 IT 環境的需求,也期待能從您的需求中瞭解什麼對您是最重要的事。

這篇文章原始發佈於「Microsoft Azure 中文部落格」

Get ready for Microsoft Cloud Day 2014

MSDN Blogs - Sat, 07/12/2014 - 06:57

Hello developers,IT pros, IT enthusiasts and everyone reading this post.

If you are into Public cloud, then you don't want to miss this event and the chance to learn about the latest on Microsoft Azure from the recent Azure User Group summer conference in London. The event, brought to you by Microsoft Virtual Academy is a fast-paced live virtual session on July the 14th evening time for the folks in the Gulf. 
The London conference brought together Microsoft's global experts and Most Valued Professionals to share their insights on the newest features and to show examples of how to get the most from the Azure platform. During both the recorded and live sessions, you''ll see new user demos, hear how to get free Azure services with BizSpark, and learn how companies large and small are scaling their growth with the cloud! Also during this live session, the community conversation will continue so you can get practical instruction, tips, and demos on Microsoft Azure, plus live Q&A with Mark Russinovich and other experts who will teach you to create websites, a mobile back-end, and cloud services in minutes. 

Note that there is no prior Microsoft Azure experience required. The event should provide you with the basic skills and knowledge to get started on the platform.

The course out line will be as the following:


                Watch the recordings from Microsoft Cloud Day here to share real-world examples from users working with Azure today.

PART 2: LIVE LEARNING ON JULY 14 at 18:00 Dubai Time (+4 GMT)

    • 18:00: Get Started with Azure
    • 19:00: Meet the Users
    • 19:15: Q&A with Mark and Azure Experts
    • 20:00: Close
Register Here

Azure Import/Export Service Error: The provided file doesn’t contain valid drive information

MSDN Blogs - Sat, 07/12/2014 - 03:13

The Windows Azure Import/Export Service enables you to move large amount of data in or out of your Microsoft Azure storage accounts. It does this by enabling you to securely ship hard disk drives directly to our Microsoft Azure datacenters. Once we receive the drives we’ll transfer the data to or from your Microsoft Azure Storage account.

For more information on Windows Azure Import/Export Service please refer to this article:

For each hard drive that you prepare with the Azure Import/Export tool, the tool will create a single journal file. You will need the journal files from all of your drives to create the import job. The journal file can also be used to resume drive preparation if the tool is interrupted.

You might come across the following error when you are adding a journal file while creating a new import job using the Azure Management Portal.

“Error: The provided file doesn’t contain valid drive information”.



This issue is caused due to incorrect date format in the journal file. When the .jrn file is opened in a text editor, you will find the date format is different from the expected format. The date format in the journal file will be “2014.07.06 11:52:53.704” but the expected date format is “2014/07/06 11:52:53.704”. The date format by default on Windows machine has “/” for the separator but this could be changed in the Regional Settings. If you have made changes in the regional settings to the date format then you may see this error.

We are aware of this issue and are working towards a fix. As a workaround edit the journal file using a text editor to find and replace all the dates in incorrect format from 2014.07.06 to 2014/07/06 format.



Local Games: Matchingo

MSDN Blogs - Fri, 07/11/2014 - 22:14

A couple of days ago I had the distinctive pleasure to talk with Roger Peters, a local developer that was excited to show us his latest invention: Matchingo - A Memory Matching Game 


You can Download it for FREE here!!


I had a great time with the game and I think it is awesome that we can see games like this in the area.

To do the game some justice I will proceed to use Roger's words to describe the game and then I will give you my quick review:

  • Memory matching fun with varying difficulty
  • The best looking matching game ever made
  • Dozens of custom backgrounds and image sets to unlock
  • Support for English, Spanish, Portuguese, French, and German languages
  • Totally free!




My Thoughts

I do see a lot of potential for this game. The mechanics are not complicated and Roger is stating that is suitable for young kinds, but I am almost certain that with a few additions it could be incredibly addictive for all ages.

The graphics are simple but quite polished, they deliver and do not detract from the experience.

Roger has already published the game in several platforms and I would not be surprised if the lessons he learns with a broad audience will improve this, and futures games, incredibly.


Give the game a couple of your minutes and let your thoughts find Roger's way using the rating section in the store. 


Now go back to your deserve weekend break and wait for some news links from me soon.






Multi MediaElement - A Playlist Solution (next item no waiting)

MSDN Blogs - Fri, 07/11/2014 - 20:49

We get quite a few questions in the forums about how to handle playlists when using the MediaElement. I’m defining playlist as a series of songs, videos, etc. that play sequentially one after another. Unfortunately the MediaElement doesn’t support native playlist capability. This is an interesting omission because Media Foundation has a rather elaborate playlist or as it is called sequencing system.

Luckily it is rather easy to wire up a simple playlist solution with the MediaElement. Unfortunately most naive solutions can cause long delays between playlist items. This is because we need to open and load every item in the playlist before we can start playing it. So if you are fine with the overhead of opening and loading the next playlist item the simple solution is recommended because you know… it is simple.

However, if you want each item to start immediately after the pervious item has finished then you need something a bit more complex. One solution is to use two MediaElements. One MediaElemet is always playing and the second is opening and loading the next track in the background ready to start playback as soon as it is needed. When one playlist item ends we can immediately start playback of the next. Then the one that was just playing starts to queue the next item. Sounds simple right?

The key to making any playlist solution work with the MediaElement is to handle the “MediaEnded” event. When we receive this event we know that the item is done playing. We can then check the playlist and start the next item playing. Luckily unlike with the Media Player SDK, the MediaElement guarantees that we will always get the “MediaEnded” event. Without this a playlist solution would be impossible.

If we are using two MediaElemets we look at the first two items in the playlist. We set the source of the first MediaElement (current) and the second MediaElement (next) to the first and second items in the playlist. We start playback of the first MediaElement and allow the second to load, open and then pause. When the current MediaElement finishes playing we swap it with the next MediaElement so next becomes current and current becomes next. We start playback of the current MediaElement and queue the next item in the list using the next MediaElemnt.

Still with me? Good!

This works great until you start skipping around in the list. Let’s say I have a playlist with four items, one, two, three and four. I start playback at the beginning of the playlist, item one. Naturally item two is queued and ready to play. Now what happens if the user skips directly from the currently playing item, item one, to the third item in the playlist, item three? We have item two queued and ready to go but we can’t use it because we skipped to item three. Those darn users always trying to muck about with a simple and elegant solution.

If we allow this common behavior we need to come up with some way to handle this scenario in our code. There are lots of different possible implementations. In the sample code included below I do some tricky (okay maybe hackey) stuff with the “Tag” properties of the MediaElements to keep track of what playlist item the MediaElements correspond to. In other words, if MediaElement two has playlist item two queued and ready to go and the user clicks on playlist item three we compare the currently selected playlist item, item three, with the index of the item that is actually queued in the MediaElement, item two. Since they are not the same we can’t just start playback of item two so we have to chuck item two and load item three and four into our two MediaElements.

Still with me? Yeah, I know it gets a bit complex. Take a look at the code. I think that will help get you back on track.


Using the Speech API to convert speech to text

MSDN Blogs - Fri, 07/11/2014 - 18:21

Some time ago I created a "listen.exe" tool which used SAPI's ISpRecoContext to listen to the microphone and dump any recognized text to the console.

Today I had to debug an issue with SAPI reading from a .wav file, so I updated it to accept a listen.exe --file foo.wav argument; this consumes the audio in the .wav file instead of listening to the microphone.

Pseudocode for the difference:


Also, we have to tell the ISpRecoContext that we're interested in SPEI_END_SR_STREAM events as well as SPEI_RECOGNITION events.

Full source and binaries attached.

A gotcha: the .wav file has to have a WAVEFORMATEX.wFormatTag = WAVE_FORMAT_PCM. If it's anything else, ISpRecoGrammar::SetDictationState fails with SPERR_UNSUPPORTED_FORMAT. Neither WAVE_FORMAT_IEEE_FLOAT nor (WAVE_FORMAT_EXTENSIBLE with SubFormat = KSDATAFORMAT_SUBTYPE_PCM) work.

Visualizing Retailer DSR Data using PowerBI

MSDN Blogs - Fri, 07/11/2014 - 17:49
Consumer Goods Companies strive to be more demand driven to improve revenue while reducing Out-Of-Stock issues. CG Companies rely on Demand Signal Repositories (DSR) to streamline the supply chain.  A DSR is a demand data warehouse of retailer and consumer demand activity, including demand, replenishment, merchandising, sales, and marketing. A DSR combines many varied sources of information, such as syndicated data, ERP shipments and budgets, retailer forecasts, trade promotions, demographics...(read more)

New Windows developer program for IoT

MSDN Blogs - Fri, 07/11/2014 - 17:15

Posted By Windows Embedded Team

Earlier today, Microsoft announced a new Windows Developer Program for IoT – further evidence of our commitment to developing great technologies for the Internet of Things, and bring Windows to ever-smaller devices. We’ve also introduced a new Windows Developer for IoT portal, with documentation and examples to support the developer kits that will be shipped in small batches.

The goal of the program is to garner feedback from developers, and it’s rolling out gradually. You can read more about it on the Windows blog, and read more about Microsoft’s vision for the Internet of Your Things here.

Issue with Application Insights F5 Experience - 7/11- Resolved

MSDN Blogs - Fri, 07/11/2014 - 17:07

During an upgrade of the F5 web hosted service, 3 of the 4 nodes behind the VIP started returning HTTP 500s after the VIP swap.  Prior to the VIP swap, 12 consecutive tests against the staging slot passed.  The previous deployment was restarted and VIP swapped back in to mitigate.  The team will investigate why this has happened in the F5 hosted service but the same code was successful in 4 other hosted services (including one in the same region/VNet).

Start Date & Time: 07/11/2014 23:44:45 (UTC)
End Date & Time: 07/11/2014 23:50:08 (UTC)

We apologize for the inconvenience this may have caused.

- Application Insights Service Delivery Team


Azure Automation の詳細: Runbook の作成

MSDN Blogs - Fri, 07/11/2014 - 16:00

このポストは、7 月 3 日に投稿した Azure Automation in Depth: Runbook Authoring の翻訳です。


Microsoft Azure の新しい Automation サービス (英語) がリリースされました。これにより、開発者や運用管理者は複数のシステムやプロセスにまたがる反復的で時間のかかるタスクを自動化して、Azure の運用をさらに効率化できるようになりました。Azure Automation が提供するこの価値は、Runbook と呼ばれる概念に支えられています。Runbook は IT およびビジネス プロセスを自動化するロジックを格納した PowerShell ワークフローです。

Runbook の活用は、最初は大変ですが、少しトレーニングを積めば簡単にマスターできます。この記事では、Runbook の効率的な作成と使用に役立つ Azure Automation の機能をいくつか詳しく見ていき、次に、Runbook をマスターするために役立つベスト プラクティスやヒントをご紹介します。Automation や Automation Runbook のことをよくご存知でない方は、//build の Azure Automation のプレゼンテーション (英語) Runbook の概念 (英語) に関する記事をご覧いただき、概要を把握してからこの記事を読み進めていただくことをおすすめします。

Runbook のライフサイクル

Azure Automation が提供する Runbook の作成機能と編集機能について説明する前に、本番環境で未完成の Runbook をだれかに誤って実行されてしまうことがないように、まず Runbook の管理方法について説明したいと思います。Azure Automation の Runbook には「発行 (Published)」と「ドラフト (Draft)」という概念があります。Runbook を新規作成/インポートする場合、または既存の本番用 Runbook を改良する場合は、Runbook の「ドラフト」を使用します。Runbook のドラフトは、だれかが (または自分がうっかりして) 本番のリソースを実行してしまうことを心配することなく、好きなだけ作業できます。保存を繰り返したり、ブラウザーを終了したり、後でまた作業を再開しても問題ありません。Runbook のドラフトの準備ができたら、発行します。ポータル、コマンドレット (英語)、または別の Runbook から開始すると、この発行されたバージョンの Runbook が実行されます。

1 つ注意すべき点として、過去に発行されたバージョンがある Runbook のドラフトを発行した場合も、既に実行されている Runbook ジョブでは過去に発行されたバージョンがそのまま使用されます。そのジョブを一時停止して再開した場合も同様です。現在実行中の既存のジョブで障害が発生するのを防ぐために、新たに発行された Runbook を使用するのは、そのドラフトが発行された後に開始された新しいジョブに限られます。Azure Automation は過去に発行された Runbook をバックエンドで保存し続けますが、Runbook を過去に発行された古いバージョンに戻す手段は現時点では提供していません。古いバージョンの Runbook がどうしても必要な場合は、それを使用した古いジョブを Azure ポータルで検索します。そのジョブの [History] タブをクリックし、[View Source] をクリックすると、そのジョブで実行された Runbook のバージョンのソースが表示されます。

下のスクリーンショットには、Runbook の 3 つの状態 ([New]、[In edit]、[Published]) が表示されています。[New] は、Runbook のドラフトのみ存在し、本番用の Runbook が存在しないことを示しています (この Runbook は最近作成したばかりか、インポートしたばかりと考えられます)。[Published] は、本番用の Runbook のみ存在し、現在作業中のドラフトは存在しないことを示しています。[In edit] は、本番用の Runbook と、現在作成中のドラフトが存在することを示しています。スクリーンショットで選択されている Runbook は [New] で、実行可能な発行済みのバージョンが存在しないため [START] ボタンは無効になっています。[Published] または [In edit] の Runbook は、作成者が正しく機能することを確認した発行済みのバージョンがあるので開始することができます。


Runbook をドリルダウンして [AUTHOR] タブを選択すると、Runbook の発行済みバージョンとドラフトを確認できますが、編集および発行できるのはドラフトのみです (下のスクリーンショットを参照)。この Runbook を AUTHOR ページの [TEST] ボタン以外 (例: [START] ボタン、スケジュール設定、コマンドレット、または別の Runbook でのインライン呼び出し) で開始すると、発行済みの Runbook が実行されます。


Runbook のドラフトで子 Runbook を使用する場合、AUTHOR ページの [TEST] ボタンを使用してこの親 Runbook のドラフトを実行しても、子 Runbook の発行済みバージョンが実行されます。このため、親子の Runbook のセットを更新し、そのそれぞれに変更を加えなければならない場合は、子 Runbook の更新、テスト、発行を最初に行い、親 Runbook をテストする際に最新の子 Runbook が使用されるようにすることがベスト プラクティスとなります。また、この子 Runbook のドラフトを発行すると、Runbook が呼び出されるたびにこの新たに発行されたバージョンが実行されてしまうので、子 Runbook を後方互換にして、子 Runbook を呼び出す発行済みの Runbook で障害が発生しないようにしてください。


ここで、「でも、作業中のドラフト版の Runbook を他のユーザーが編集しようとしたらどうなるんだろう」という疑問が出てくるかもしれません。もちろんその問題も解決済みです。複数のユーザーで Azure サブスクリプションや Azure Automation アカウントを共有している場合を想定して、他のだれかが作業している Runbook の編集を禁止するのではなく、Runbook を編集時は [In edit] とはっきり表示するようにしました (この記事の最初のスクリーンショットがその例です)。ベスト プラクティスとしては、[In edit] と表示されている場合、その Runbook のドラフトを作成したのが自分でなければ作業するのを控えるようにします。Runbook が [Published] になる、つまりドラフトがなくなり、この Runbook の新しいバージョンを作成できるようになるまで待つか、または Runbook のドラフトの所有者に頼んでドラフトに必要な更新を行ってもらうか、自分で更新できるようにドラフトを破棄してもらいます。

Runbook 作成機能

では、Runbook の作成ページを開いて、Runbook の作成を簡単にする便利な機能について見ていきましょう。


上の画像を見るとわかるように、AUTHOR ページの [DRAFT] タブは 4 つのセクションに分かれています。

  1. EDITOR PANE: PowerShell ワークフローを使用して Runbook をテキストで作成するための領域です。
  2. OUTPUT PANE: Runbook のドラフトの直近のテスト ジョブのステータスと出力が表示されます。
  3. コマンド バー: Runbook の作成を支援するコマンドが表示されます。
  4. Runbook 一覧: ご使用の Automation アカウントのすべての Runbook が表示されます。異なる Runbook の AUTHOR ページにすばやく移動できます。

AUTHOR ページのコマンド バーを使うと、次のタスクを実行できます。

  • MANAGE: Runbook でアセットが必要になった場合に、作成環境でそのままモジュールをインポートしたり、設定を作成したりすることができます。
  • INSERT: アクティビティや Runbook、設定を Runbook の定義に挿入できます。このタスクについては後述します。
  • SAVE: Runbook のドラフトを保存します。前回の作業場所から作業を再開できます。
  • DISCARD DRAFT: この Runbook を更新する必要がなくなった場合にドラフトを削除して、他のユーザ���がこの Runbook のドラフトを独自に作成できるようにします。ドラフトの作成者に限らず、この Automation アカウントが含まれる Azure サブスクリプションを利用可能なユーザーであればだれでも Runbook のドラフトを破棄できます。ただし、この記事の「同時編集」セクションで説明したベスト プラクティスに従い、自分が作成者ではない Runbook のドラフトは削除しないようにしてください。
  • TEST: テストとして、この Runbook のドラフトを本番どおりに実行します。Runbook のドラフトが実行され、OUTPUT PANE に出力が表示されます。このテストは仮想的なものではなく、実際のリソースに対して実際の処理が行われます。このため、Runbook のテストは本番用以外のリソースに対して実行してください。テストについてはまた後ほど取り上げます。
  • PUBLISH: Runbook が完成し正しく機能することを承認し、現在のドラフトをこの Runbook の最新版として発行します。
Runbook エディター

AUTHOR ページでは、EDITOR PANE で作業する時間が最も多くなります。EDITOR PANE には Visual Studio Online の「Monaco」コントロールを利用した強力な作成ツールが備わっています。このエディターを使用すると、PowerShell ISE と同じようにブラウザーで Runbook を作成できます。エディターには、PowerShell 構文の色分け表示、自動インデント、閉じ括弧の自動補完、参照の強調表示、オートコンプリート、開発用キーボード ショートカット、機能が制限された IntelliSense が用意されています。

次に、EDITOR PANE ですぐに使えるヒントをご紹介します。

  • 入力し始めると、オートコンプリートが動作します。Tab キーを押すとオートコンプリートの候補が表示されるので、右方向キーを押して候補の選択を決定するか、Ctrl キーを押しながら Space キーを押してオートコンプリートの候補をすべて表示し、スクロールして候補を選択します。


  • コードの単語をクリックすると、Runbook 内のその単語がすべて見やすく強調表示されます。

  • 一般的な開発環境と同じキーボード ショートカットを使用できます。たとえば次のものです。
    • 検索 (Find)/置換 (Replace): Ctrl + F
    • すべて選択 (Select All): Ctrl + A
    • 切り取り (Cut): Ctrl + X
    • コピー (Copy): Ctrl + C
    • 貼り付け (Paste): Ctrl + V
    • 元に戻す (Undo): Ctrl + Z
    • やり直し (Redo): Ctrl + Y
    • 現在入力中の単語のオートコンプリートの候補一覧を表示: Ctrl + Space
  • Ctrl キーを押しながら F キーを押して [Find] メニューを開き、[Find] テキストボックスの左にある灰色の領域をクリックすると [Replace] メニューが表示されます。Enter キーを押すと次の単語に移動します。ESC キーを押すと [Find] メニューが閉じます。


ここで 1 つ注意すべき点として、オートコンプリートの候補を表示する IntelliSense は、PowerShell 全般ではなくエディター内の内容しか認識していません。そのため、オートコンプリートの候補として表示されるのは、この Runbook で既出のコードに限られます。たとえば、前出のスクリーンショットを見ると、オートコンプリートのドロップダウン メニューには Runbook で既に使用している単語が候補として表示されています。PowerShell の「Write-Progress」コマンドレットも候補としてこのドロップダウンに表示されてもおかしくないはずですが、この Runbook では使用されていなかったため候補として表示されません。今後のリリースで IntelliSense の精度を改善していく予定です。


OUTPUT PANE も、よく使用する機能です。Runbook の作成では、コマンド バーの [TEST] ボタンを使用して Runbook のドラフトの内容のテストを行うのが一般的です。OUTPUT PANE には Runbook のドラフトの直近のテストのステータスと出力が表示されます。OUTPUT PANE は Runbook エディターと同じページに表示されるので、テストを実行しながら Runbook の作成を続けることができます。テストが完了したら、出力を確認して Runbook のドラフトを適宜修正します。ページを切り替える必要はありません。OUTPUT PANE は上部の青いバーをクリックすると拡大/縮小できるので、不要なときは縮小しておくと Runbook を作成するためのスペースが広くなります。


OUTPUT PANE は PowerShell コンソールの外観にできるだけ似せており、上のスクリーンショットを見るとわかるように、PowerShell コンソールと同様、Runbook のストリーム出力はストリームごとに色分けして表示されます。また、Runbook は必要に応じて停止または一時停止できます。一時停止した Runbook や、例外の発生により一時停止した Runbook は再開することができます。EDITOR PANE と同様に、OUTPUT PANE をクリックして Ctrl キーを押しながら F キーを押すと、[Find] メニューが表示され、Runbook 出力をすばやく検索できます。

Runbook ドラフトのテストやトラブルシューティングといった OUTPUT PANE の高度な使用方法については、ブログで近く取り上げます。それまで待てない方は、Service Management Automation の Runbook のテストおよびトラブルシューティングに関する記事 (英語) をお読みください。Service Management Automation はローカルにインストール可能な Azure Automation と同等の機能です。Service Management Automation と Azure Automation は基本的に同じサービスで、提供の方法が異なるだけで中身はほぼ同じです。


もう 1 つの便利な機能として、[INSERT] オプションを紹介します。下のスクリーンショットに示すように、Runbook、アクティビティ (Activity)、設定 (Setting) を挿入することができます。


先に進む前に、ここで、アセット、設定、アクティビティ、コマンドレット、統合モジュール、PowerShell モジュールなどの用語について説明しておきましょう。似たような用語ばかりなので混乱してしまわないよう、よくご確認ください。

  • アセット – 単一または複数の Runbook が依存する要素です。要素には、統合モジュール、資格情報、スケジュール、接続、証明書、変数があります。各アセットの詳細については、近く公開予定の Ravi 氏のブログ記事を参照してください。
  • 設定 – Runbook 内で単一または複数のアクティビティによって使用される単一または複数の情報が格納されたアセットです。アセットのうち、資格情報、接続、証明書、変数は設定になります。統合モジュールとスケジュールは設定ではありません。
  • PowerShell ワークフローのアクティビティ - PowerShell の専門家にとって「アクティビティ」は PowerShell ワークフローのアクティビティを意味します。PowerShell ワークフローのアクティビティは PowerShell コマンドレットとは異なります。コマンドレットは Runbook 内の関数やインライン スクリプトから呼び出すことができますが、PowerShell ワークフローのアクティビティは呼び出すことはできません。Azure Automation で使用するもののほとんどはコマンドレットまたはコマンドレットと PowerShell ワークフローのアクティビティの両方として実装されているため、区別する必要はありません。ただし、Runbook 開発の肝である RunbookConstructs 統合モジュールのすべてのアクティビティは、PowerShell ワークフローのアクティビティとしてのみ実装されるので、Runbook 内でインライン スクリプトまたは関数として使用することはできません。PowerShell ワークフローのアクティビティの詳細については、Don Jones 氏によるこちらの記事を参照してください。これらの Automation で提供されている PowerShell ワークフローのアクティビティは次のとおりです。
    • Get-AutomationCertificate
    • Get-AutomationConnection
    • Get-AutomationPSCredential
    • Get-AutomationVariable
    • Set-AutomationVariable
  • Azure Automation アクティビティ Runbook 内の一機能です。Azure Automation では「アクティビティ」は PowerShell コマンドレットまたは PowerShell ワークフローのアクティビティを意味します。元は System Center Orchestrator の用語だった「アクティビティ」が、System Center Service Management Automation や Azure Automation でも使用されています。
  • PowerShell モジュール – PowerShell コマンドレットと PowerShell ワークフローのアクティビティの集合です。PowerShell スクリプト、ワークフロー、Runbook から使用できます。
  • 統合モジュール – Runbook のアクティビティで使用する Automation 接続の種類を指定したメタデータ ファイルをオプションで含む PowerShell モジュールです。オプションの外部ファイルを持つ PowerShell モジュールであることから、Azure Automation 担当者の間では単純に「モジュール」と呼んでいます。「統合モジュール」という名称は、Orchestrator の「統合パック」と PowerShell の「PowerShell モジュール」を組み合わせた言葉です。Azure Automation の統合モジュールについて詳しく取り上げた記事が近く公開される予定です (または、ほぼ同じ内容について書かれた Service Management Automation の記事 (英語) を参照してください)。


では、挿入機能に話題を戻します。[Insert] タスクを使うと、Runbook で使用可能なすべての Runbook、設定、アクティビティを把握できます。また、その構文を挿入できるので便利です。たとえば次のスクリーンショットでは、INSERT SETTING ウィザードで「TestVariable」という変数を選択して、Runbook に追加しています。設定の説明と値が表示されています。


チェックマークをクリックすると、実行時にこの設定を取得する構文が Runbook 内の現在のカーソル位置に挿入されます。


インラインの INSERT RUNBOOK ウィザードは、INSERT SETTING ウィザードに似ています。


次に進む矢印をクリックすると、Runbook の構文が表示されるので、使用したい Runbook かどうかを確認します。


チェックボックスをクリックすると、全構文が Runbook に挿入されます。後はパラメーターを入力して、編集中の Runbook 内からインラインでこの Runbook を呼び出します。


最後は INSERT ACTIVITY ウィザードです。Azure Automation システムのすべてのモジュールと、選択したモジュールのすべてのアクティビティが表示されます。


このウィザードに標準の検索機能はありませんが、ブラウザーの検索機能 (Ctrl + F) を使用してコマンドレットを検索できます。これは INSERT SETTING ウィザードや INSERT RUNBOOK ウィザードでも可能です。


アクティビティをクリックすると、このコマンドレット用に PowerShell モジュールで指定されている場合は、説明とヘルプ リンクが表示されます。


[View detailed help] をクリックすると、このコマンドレットの使用方法に関する有用な情報が詰まったオンライン ヘルプ ページが表示されます。下はその例です。


INSERT ACTIVITY ウィザードの [next] ボタンをクリックすると、INSERT RUNBOOK ウィザードの構文ビューと似たメニューが表示されます。このアクティビティに複数のパラメーター セットがある場合は、Runbook で使用したいものを選択します。すると、選択したパラメーター セットの構文のみ挿入されます。


この記事では、Azure Automation に用意されているさまざまな支援機能をご紹介しました。これらの機能を使用することで、複数の Runbook 作成者や運用担当者が同時に作業している環境でも、優れた Runbook をすばやく簡単に作成できることがおわかりいただけたのではないでしょうか。この知識を身に付ければ、Automation Runbook をマスターする日が来るのも遠くはないでしょう!

まだ Azure Automation をご利用でない方は、プレビュー版にサインアップしていただき、スタートアップ ガイド (英語) をご覧ください。

Planning your chart of accounts in AX 2012 (Part 4 of 7)

MSDN Blogs - Fri, 07/11/2014 - 15:10

Account Structures

Part 1 of this series provided a high level overview of the components that make up the chart of accounts in Microsoft Dynamics AX 2012. Part 2 focused in on the chart of accounts components. Part 3 talked about the financial dimensions. This posting is going to focus on the new account structures that were introduced in AX 2012. The components I will discuss in this blog are the following from the conceptual model provided in Part 1:

Account structures determine what the segments are for the account number combination and the valid combination rules. They also determine the order of entry of the segment values in the account entry control when editing the distributions on source documents or entering new journal entries. The cool thing about account structures is that you can set up as many as you need and only the segments in the account structure will be available in the account entry control. This allows you to set up minimal segments for the balance sheet accounts yet allows you to get more detailed with your revenue and expense accounts.

If you plan to budget against a financial dimension, that financial dimension will need to be a segment in an account structure as budgeting does NOT integrate with advanced rules. Another area that does not use the constraints of the account structure is the default dimensions setup. The lookups for the default dimensions will display all the dimension values and there is no validation that the combination of default dimension values is valid.

The main account segment is required in an account structure, but it does not have to be the first segment. The main account segment is always considered a point of disambiguation when there are multiple accounts structures for a company (in AX 2012, the account structures were associated with a chart of accounts; in AX 2012 R2, the account structures are associated with a ledger). So what does this mean? When selecting the account structures for the ledger, the system will validate that all segments prior to the point of disambiguation are the same and that there are no overlapping ranges of main accounts between the selected account structures. The reason for this validation is so the system will know which account structure to use when validating the account number without forcing the user to select which account structure to use. The majority of the end users of the system won't typically know what an account structure is.

The Configure account structure form can only support a maximum of 11 segments. This is a technical limitation with the form and not a limitation to the number of segments you can have for an account number. If you need additional segments, you would add those using advanced rules. I'll discuss advanced rules in a future post.

It is also important to get the segment order correct prior to entering any constraints on the segments. You can move the segments at any time but the system will drop any constraints you may have entered as the parent child relationship in the account structure hierarchy will have been broken when moving the segments.

The expression for the constraint(s) of the selected node in the account structure hierarchy tree can be entered by either manually typing in the expression using standard AX syntax or you can select the filter button on the node. This will open the expression builder form which will help you enter the constraint(s) in an easy sentence format. One thing to understand about the constraint expressions in the account structure - they are considered OR expressions. A value can be in one constraint rule or another and as long as there are no overlapping rules, the system will be able to determine which rule is in play when validating an account number combination.

Be sure to activate the account structure once you have completed entering the constraints. This action will update any unposted source documents and journal entries to either add new or drop existing segments (based on the edits to the account structure). An account number combination that may have been valid prior to the edits to the account structure may now fail when attempting to post to the general ledger if the constraints disallow the combination.

An account structure containing only the main account segment for all values will be created for each company as part of the upgrade to AX 2012. Upgrading from a release prior to AX 2012 (such as AX 4 or AX 2009), will create any defined dimension set hierarchy rules or account dimension rules as advanced rules in AX 2012. This allows you to be able to do data entry after the upgrade without having to set up all the rules in the account structure. You can then make the changes to the account structure(s) over time.

The next post for this blog series will discuss the relationship of an account structure with the organization hierarchies.



Modifying hard coded URL for sub-reports, embedded datasource reference etc. in SSRS reports

MSDN Blogs - Fri, 07/11/2014 - 14:20

I recently faced an issue while migrating our SSRS reports from one server farm to another with reports having an embedded data source, sub-report URL etc. in them. Needless to say but both the farms had different URLs:

For instance:

“Farm A” URL (Source) was something like:

And, “Farm B” URL (Destination) was similar to: 

The issue could have been easily dealt with had the number of reports been small. In such a case manually editing the reports could have been an easier fix.

In our situation we had several thousand or reports and manually editing all of those seemed to be a daunting task and might have been error prone too.

Hence, to automate the process, I tried using the native web service exposed by report server in custom Power-Shell / C# code but could not find a way to modify sub-report URL. However, we did found out how to re-point our reports to the new data source using a combination of report server web service and Power-Shell script.

I tried binging a lot but could not find a tool relevant for our purpose which could provide a single solution to fix my entire problem.

So, did my problem get fixed? If yes, then how?

These are the set of questions you might be having by now. Well, the answer is to think about the unconventional ways to fix the problem and that's what I did.

We created our own tool to fix the problem. Click here to download the tool.



How does the tool look like? The tool looks like as shown in the screenshot below: 

 How to I use this tool? Please enlist the steps.

Well, it’s very easy to use to tool. Please find the usage steps below: 

  1. Download all the reports at a single location on your local machine. For example: C:\users\testuser\Desktop (Desktop of testuser)
  2. The reports can be saved all the root level of a folder or any structure within a folder.
  3. Click “Browse” button corresponding to “Select Report Folder” textbox to select the source folder location where you have saved the reports from steps above.
  4. Click “Browse” button corresponding to “Save Reports Location” textbox to select the target folder location to save the modified reports.
  5. Modify the contents of textbox labeled as “Search Text”, with the value you wish to find and replace in the reports.
  6. Modify the contents of textbox labeled as “Replace Text”, with the value you wish to replace “Search Text” within the reports.
  7. Select the checkbox “Do you wish to modify data source?”, in case you wish to modify embedded data source references within the reports.
  8. Click the “Run” button.
  9. The execution might take some time based on the number of reports you’re trying to modify. 


The output will be in the form of the new reports those will be created at the destination path specified in the step# 4.

I re-deployed the new reports to SharePoint 2010 and they seem to reflect the correct references.

Please Note:

I tested the tool to work with reports deployed to Report Server in SharePoint integrated mode. However, the tool should also work fine for reports deployed to Report Server in Native Mode.


Happy Coding!


Issue with Application Insights Diagnostics data Pipeline - 7/11- Resolved

MSDN Blogs - Fri, 07/11/2014 - 14:19

During the window of 07/11/2014 19:40:48 (UTC) and 07/11/2014 20:25:48 (UTC). Application Insights Diagnostics Data Pipeline had service impact due to a planned service change. Customers could not send diagnostics streaming data during this 45 minutes period. Affected users will see a gap in their diagnostics streaming data for
the impact window.  The change has been rolled back and the service has recovered to healthy state.

Usage data was not affected by this outage.

We apologize for the inconvenience this may have caused.

- Application Insights Service Delivery Team


Subscribe to Randy Riness @ SPSCC aggregator
Drupal 7 Appliance - Powered by TurnKey Linux