You are here

MSDN Blogs

Subscribe to MSDN Blogs feed
from ideas to solutions
Updated: 28 min ago

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

Fri, 07/25/2014 - 10:31

Advanced Rules

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. Part 4 focused on the new account structures that were introduced in AX 2012. Part 5 discussed the relationship of an organization hierarchy with an account structure. This posting discusses the advanced rules for an account structure. The components I will discuss in this blog are the following from the conceptual model provided in Part 1:

So what is an advanced rule? How is it different than an account structure? Why would I set up an advanced rule? These are just a few of the questions we get on this topic and I will use this blog post to help answer them.

So what is an advanced rule? You can think of an advanced rule as appending another structure to an account structure. Basically, it is just another type of dimension hierarchy that determines if a dimension value is required, and if entered, if it is valid. The financial dimensions added as part of an advanced rule are segments of an account number. If an advanced rule adds a financial dimension that is already included in the associated account structure, the user will only see and be able to enter the value once. The advanced rule does get used when validating the combination with the most restrictive between the account structure and the advanced rule as the winner.

How is it different than an account structure? At least one account structure is required for data entry whereas an advanced rule is an optional setup component. The main account is a required segment in an account structure, but is not allowed as a segment in an advanced rule structure. An account structure can have a relationship with an organization hierarchy when two or more of its segments are organization units (BusinessUnit, Department, CostCenter, LegalEntity or ValueStream) but this relationship cannot be set up using an advanced rule. Budgeting currently only supports financial dimensions defined in the account structures and does not support any financial dimensions defined using advanced rules.

Why would I set up an advanced rule? The intent of the feature was to be able to add additional segments for a small range of accounts without having to create another account structure. For example, tracking the VIN number when entering against the vehicle maintenance expense account or tracking the campaign with the revenue accounts. Some have used the advanced rules to define the combination rules between the segments of the account structure. Some just have the main account in the account structure and use the advanced rules to add the dimensions. Note that this is how the dimension hierarchies and rules upgrade into AX 2012 so there is some familiarity to this setup for existing customers. Thinking of usability and maintenance, I would recommend only creating advanced rules when you want to track additional dimensions for a subset of accounts and build the primary constraints using the account structure(s).

Advanced rules are set up per account structure. You can have multiple advanced rules for an account structure but the advanced rules cannot be shared across multiple account structures. When you select to add a new advanced rule to an account structure or edit an existing one, the associated account structure is put into a draft status for you. This means you need to activate the account structure in order for the advanced rules to be used.

Any segment of the account structure can be used as a filter for the advanced rules, but you can only define one filter for a specific segment as the rules are considered "AND" rules. This means that if you want to create two filters for the MainAccount segment, for example, Where MainAccount is 110180 and Where MainAccount is between and includes 40000 and 499999, you will need to create two advanced rules. If you do not add a filter to the advanced rule, the advanced rule is always in play with the associated account structure.

The advanced rule example below is stating that when the MainAccount segment is between and includes accounts 606000 through 606800, add the financial dimensions defined in the Project advanced rules structure.

Advanced rule structures are similar to account structures in the setup and user experience with the difference of advanced rule structures do not allow the MainAccount segment and account structures require it. You can have as many segments (up to 11) in an advanced rule structure and you can define the constraints for each node similar to how you define them for an account structure node.

Multiple advanced rule structures can be included in an advanced rule. The segments will be added to the account entry control in segment order for the advanced rule structures which are in alphabetical order.

The next, and final post for this blog series will discuss balances functionality for AX 2012.



Why cant PS run loop fast ?

Fri, 07/25/2014 - 10:09

So recently I had to write a PS script for a customer to loop through a large file and process every character. Seems simple enough and worked great on sample files, but as soon as you give large files to process the performance of PS script was really bad. I assumed it was due to some FileOption parameter that i was not specifying or Filebuffer size not being appropriate. After some debugging I was able to repro the problem even without a file operation. So basically running a loop in PS is slow. Take a look at this:

So here is what I do: Declare an array, go through each item of array. The difference is almost 200 times in perf. 6 sec in .net and 10 minutes in PS.  

PS Code (10 minutes)

.net CODE (6 sec)

$num = 0
$buffersize = 4096*1024*200 

# declare a buffer

[Byte[]]$ba = new-object Byte[] $buffersize
$linecount = 1
$start = [System.DateTime]::Now
  if ($ba[$num] -eq 10) { $linecount++}

   }while ($num -lt $buffersize)

$end = [System.DateTime]::Now
$time = $end - $start
write-host "Time taken -" $time

static void testloop()

  System.DateTime  start = DateTime.Now;
  int  buffer = 4096*1024*200;     
  byte[] b =  new byte[buffer];
  int count  = 1;
  int  lastcount = 0;     
  do  {
            if  (b[lastcount] == 10) { count++; }     
  } while
  (lastcount < buffer);
  Console.WriteLine("Time Taken - "  + (DateTime.Now  - start));


After discussion with the PS product team. Found out the reason. So since PS is interpreted vs a compiled .net you would expect some perf difference. But internally what PS does is if a loop iterates for more than 16 times, then on the 16th iteration the content of the loop is compiled dynamically as a .net code and the dynamic method is then invoked inside the loop. Great. The only gotcha being that the dynamically invoked method could be a security risk (think viruses duplicating itself) so .net runs a security check on the stack and that is what is slowing the loop down for long running loops in PS.

We can declare .net code inside PS using the Add-type command. And this way the dynamically invoked method will encapsulate the loop and the iteration so the security check is only done once. Running the code below I consistently got performance similar to .net if not better in few cases.

# declare a buffer
[Byte[]]$ba = new-object Byte[] $buffersize
$linecount = 1
$ba[30] = 10
$ba[300] = 10
$start = [System.DateTime]::Now

$source = @"
   public class myArrayIterator
                public static int GetCount(byte[]b, byte tofind)
                    int count = 1;
            int lastcount = 0;
                    int max = b.Length ;
                    if (b[lastcount] == tofind) { count++; }
            } while (lastcount < max);
                   return count ;

Add-Type -TypeDefinition $source

$count = [myArrayIterator]::GetCount($ba, 10)
write-host "Count - " $count

$end = [System.DateTime]::Now
$time = $end - $start
write-host "Time taken -" $time


Hope this helps with your long running loops in Powershell.

My OSCON 2014 Presentation and More

Fri, 07/25/2014 - 10:01
What an exciting week at OSCON? It’s extremely informative and fun! Just to name a few. Had great discussion and lunch with many web developers at OSCON JavaScript Junkie table. Participated at Code2Challenge activity at Microsoft Open Technologies booth. I also had the honor to present for over 200 open source developers at my favorite subject “Developing High Performance Websites and Modern Apps with JavaScript and HTML5”. Many of you have asked me to share my presentation with...(read more)

The Drag of Old Mental Models on Innovation and Change

Fri, 07/25/2014 - 09:06

“Don’t worry about people stealing your ideas. If your ideas are any good, you’ll have to ram them down people’s throats.” — Howard Aiken

It's not a lack of risk taking that holds innovation and change back. 

Even big companies take big risks all the time.

The real barrier to innovation and change is the drag of old mental models.

People end up emotionally invested in their ideas, or they are limited by their beliefs or their world views.  They can't see what's possible with the lens they look through, or fear and doubt hold them back.  In some cases, it's even learned helplessness.

In the book The Future of Management, Gary Hamel shares some great insight into what holds people and companies back from innovation and change.

Yesterday’s Heresies are Tomorrow’s Dogmas

Yesterday's ideas that were profoundly at odds with what is generally accepted, eventually become the norm, and then eventually become a belief system that is tough to change.

Via The Future of Management:

“Innovators are, by nature, contrarians.  Trouble is, yesterday's heresies often become tomorrow's dogmas, and when they do, innovation stalls and the growth curve flattens out.”

Deeply Held Beliefs are the Real Barrier to Strategic Innovation

Success turns beliefs into barriers by cementing ideas that become inflexible to change.

Via The Future of Management:

“... the real barrier to strategic innovation is more than denial -- it's a matrix of deeply held beliefs about the inherent superiority of a business model, beliefs that have been validated by millions of customers; beliefs that have been enshrined in physical infrastructure and operating handbooks; beliefs that have hardened into religious convictions; beliefs that are held so strongly, that nonconforming ideas seldom get considered, and when they do, rarely get more than grudging support.”

It's Not a Lack of Risk Taking that Holds Innovation Back

Big companies take big risks every day.  But the risks are scoped and constrained by old beliefs and the way things have always been done.

Via The Future of Management:

“Contrary to popular mythology, the thing that most impedes innovation in large companies is not a lack of risk taking.  Big companies take big, and often imprudent, risks every day.  The real brake on innovation is the drag of old mental models.  Long-serving executives often have a big chunk of their emotional capital invested in the existing strategy.  This is particularly true for company founders.  While many start out as contrarians, success often turns them into cardinals who feel compelled to defend the one true faith.  It's hard for founders to credit ideas that threaten the foundations of the business models they invented.  Understanding this, employees lower down self-edit their ideas, knowing that anything too far adrift from conventional thinking won't win support from the top.  As a result, the scope of innovation narrows, the risk of getting blindsided goes up, and the company's young contrarians start looking for opportunities elsewhere.”

Legacy Beliefs are a Much Bigger Liability When It Comes to Innovation

When you want to change the world, sometimes it takes a new view, and existing world views get in the way.

Via The Future of Management:

“When it comes to innovation, a company's legacy beliefs are a much bigger liability than its legacy costs.  Yet in my experience, few companies have a systematic process for challenging deeply held strategic assumptions.  Few have taken bold steps to open up their strategy process to contrarian points of view.  Few explicitly encourage disruptive innovation.  Worse, it's usually senior executives, with their doctrinaire views, who get to decide which ideas go forward and which get spiked.  This must change.”

What you see, or can’t see, changes everything.

You Might Also Like

The New Competitive Landscape

The New Realities that Call for New Organizational and Management Capabilities

Who’s Managing Your Company

Bing Maps REST and SOAP Services Imagery Styling Improvements Now Live!

Fri, 07/25/2014 - 09:00

Today, we are pleased to announce the following rendering and styling improvements to Bing Maps REST and SOAP Services imagery.

Gradient Land Color

We introduced a new gradient coloring for land areas that adjusts the brightness to your zoom level. The land color will now be lighter when zoomed out and get darker when zoomed in at higher levels of detail. Not only do these updates improve the overall aesthetic appeal of the maps, but they also help increase the contrast, making streets and other features more visible.




Park Trails and Pathways

New styling helps clearly differentiate park trails and pathways from roads.




- Bing Maps Team

Create an Image or capture some HTML in JavaScript - Windows 8.1

Fri, 07/25/2014 - 08:31

I've been building some Windows 8 apps this week and stumbled across 3 ways in which you can create an image in Windows 8.1 HTML and JavaScript apps. One is to use a canvas element, construct the image as you want it and the use the BitMapEncoder to output a PNG. The second is to use the Windows 8 Webview Control and call the capturePreviewToBlobAsync() function. The third is to use the toBlob() function of the canvas element.

Method 1: BitMapEncoder

If you want to draw an image from scratch pixel by pixel in a bitmap sort of fashion, it’s probably best to use the canvas element. Once you've drawn the content you want on your canvas you can create a bitMapEncoder and convert the stream you get from the canvas function getImageData(). The benefit of this approach is that you could switch out the PNG encoder for a JPEG, GIF, TIFF, BMP or JPEG-XR one. Here's is an extract from my SegoeSymbol project which take my canvas element and creates a PNG then saves that to disk.

You can find the working project over on GitHub

var canvas = //draw your canvas here var ctx = canvas.getContext("2d"); var imgData = ctx.getImageData(0, 0, canvas.width, canvas.height); Windows.Graphics.Imaging.BitmapEncoder.createAsync(Windows.Graphics.Imaging.BitmapEncoder.pngEncoderId, stream) .done(function (encoder) { //Set the pixel data in the encoder encoder.setPixelData(Windows.Graphics.Imaging.BitmapPixelFormat.rgba8, Windows.Graphics.Imaging.BitmapAlphaMode.straight, width, height, 96, 96, new Uint8Array(; //Go do the encoding encoder.flushAsync().done(function () { stream.close() }); })}) Method 2: capturePreviewToBlobAsync

On Windows 8.1 using the new WebView control, render some HTML or just navigate to a webpage. One the page has loaded you can then call the Webview.capturePreviewToBlobAsync() function.

It captures everything that's displayed in the Webview and because it's a direct capture anything that can be displayed in IE11 can be captured including third party libraries like or

I wrote a simple sample app a moment ago and was able to capture a website to an Image using the following code, the full app can be found over on GitHub

function printeWebViewToDiskThenDisplay() { var wc = document.getElementById("webview"); Windows.Storage.ApplicationData.current.localFolder.createFileAsync("webview.png", Windows.Storage.CreationCollisionOption.replaceExisting).then(function (file) { file.openAsync(Windows.Storage.FileAccessMode.readWrite).then(function (stream) { var capturePreview = wc.capturePreviewToBlobAsync(); capturePreview.oncomplete = function (completeEvent) { var inputStream =; Windows.Storage.Streams.RandomAccessStream.copyAsync(inputStream, stream).then(function () { stream.flushAsync().done(function () { inputStream.close(); stream.close(); var image = new Image(); image.src = URL.createObjectURL(file); result.innerHTML = ""; result.appendChild(image); }); }); }; capturePreview.start(); }); }); } Method 3: toBlob

If you’re working in the browser rather than in a Windows 8 app you can use blobs to achieve image saving.

Once you have your canvas set up as you want it, call msToBlob (other browsers will obviously not use the ms vendor prefix)

var blob = canvas.msToBlob(); // This will work in Windows 8… You can then save this blob to disk

In a browser you can simply call the msSaveBlob function and the user will be prompted to download the blob as a PNG image.

window.navigator.msSaveBlob(blob, 'tile.png'); // this will only work in browser currently.

We have a great example of this working over here:

Issue with Application Insights Data Platform - 7/25 15:00 UTC - Resolved

Fri, 07/25/2014 - 08:07

Final Update 15:23 7/25 UTC

The team found a data node in a bad state on the backend.   We have mitigated the issue by restarting the service on the affected node.  The team will continue to drive root cause to determine why the node was in a bad state.

We apologize for the inconvenience this may have caused.

-Application Insights Service Delivery Team


Initial Update 15:00 7/25 UTC:

The Application Insights data platform team is looking into issues that are causing the F5 pipeline to be delayed.  Root cause has not be determined.

We apologize for the inconvenience this may be causing.

-Application Insights Service Delivery Team

FileTypeAssociation Logo sizes for Windows Phone 8.1 modern apps

Fri, 07/25/2014 - 08:02


  The MSDN documentation on “How to handle file activation”, for Windows and Windows Phone 8.1 applications says that Logo images should be of sizes 16, 32, 48, and 256 pixels square.  The MSDN documentation on “Auto-launching apps using file and URI associations for Windows Phone 8” says that Logo images should be of sizes 33, 69, and 176 pixels square.

  However, none of these sized images work correctly when used in a Windows Phone 8.1 (XAML) application.  Instead you need to use image sizes: 36, 129, and 336 pixels square. Since this is phone specific you should add these to the Windows Phone specific assets of your Universal project.  The filename must be in the form: <name>.targetsize-<size>.png, for example:



You need to reference this set of files in your Windows Phone 8.1 projects’ “Package.appxmanifest” file using just the first and last parts of the file name, without the “targetsize-*”, for example: “Logo.png”. 


  FYI: “Display name” and “Content type” fields are not required but nice to have.

  Now, after you deploy the app to your phone any files with registered extension (“.alsdkcs” in this case) should show on of your Logo images in applications which support display of the file type logo like the Office Hub.

  NOTE: if multiple applications are registered for the same file extension then you will see a search icon: instead of either applications’ logo.


Don’t forget to follow the Windows Store Developer Solutions team on Twitter @wsdevsol. Comments are welcome, both below and on twitter.

On the ADA’s Anniversary Work Remains to Make Workplaces Accessible

Fri, 07/25/2014 - 07:31

Twenty-four years ago, the Americans with Disabilities Act (ADA) promised a new generation of workers opportunities to join the U.S. workforce. But as we celebrate the anniversary of the act Saturday, a reportoffers a sobering reminder that many members of this ADA generation still face high barriers when looking for a job.

Today, more than two-thirds of Americans with disabilities are not in the workforce and employment of workers with disabilities hasn’t improved since the act was passed in 1990, according to the congressional report released last year by Sen. Tom Harkin, D-Iowa. The report proposed a bold plan to help the ADA generation make easier transitions from school to work.

...(read more)

How do I obtain the computer manufacturer's name from C++?

Fri, 07/25/2014 - 07:00

Some time ago, I gave a scripting solution to the problem of obtaining the computer manufacturer and model. But what if you want to do this from C++?

I could translate the script into C++, or I could just point you to Creating a WMI Application Using C++ in MSDN. In particular, one of the WMI C++ Sample Applications does exactly what you want: Example: Creating a WMI Application. The only things you need to do are

  • change SELECT * FROM Win32_Process to SELECT * FROM Win32_ComputerSystem, and
  • change Name to Manufacturer, and then again to Model.

Come and meet us at the WOW Hack in Gothenburg

Fri, 07/25/2014 - 05:58

Members of the Xbox Music team are excited to attend and co-sponsor WOW Hack 2014. We will present our complete set of RESTful APIs that give access to Xbox Music’s ~38 million track catalog in 23 countries.  We are excited to see what the participants of this event can create.

With this API set, developers can browse and search the catalog for artists, albums and tracks; access country specific tops lists; and deliver 30-second previews or even full songs. Additionally, developers can look up extra metadata for any piece of content, such as an artist’s album list or song list. Related, developers are able to access an extensive set of artist and album images, as well as deep-links into existing Xbox Music applications across the wide range of platforms, including Windows, Windows Phone, Xbox, Web, iOS, and Android. 

Lastly, we have an affiliation offer that generates revenue for every content purchase or Xbox Music Pass subscription signup that are driven from your experiences to ours.  We have generous affiliate payouts at 5% for purchased and a recurring 10% referral payout for subscriptions – that’s $1 per user per month!  Check out the Xbox Music developer site to find out more about the API.

Hope to see you there in Sweden, or at the next music Hackathon we attend!

Næste AX brugergruppemøde er den 24. september hos Phase One på Frederiksberg

Fri, 07/25/2014 - 03:25

Information til dine AX-kunder

Anja B. Grosen, Danske Fragtmænd og Jette Stade, M-Seals har planlagt næste AX brugergruppemøde den 24. september hos AX-kunden Phase One.

Programmet for dagen vil være:

  • KL. 10-11:             Kreditor faktura flow i standard AX2012 inkl. Scales Pakke, præsentation ved Kenn Basse, Scales
  • KL. 11-12:             Præsentation af Phase One og deres daglige brug af standard kreditor faktura flow i AX2012 ved Controller Anja Christensen, Phase One
  • KL. 12-12.30:        Frokost             
  • KL. 12.30 -13.30   Nyeste funktionaliteter i Budgettering i AX2012 ved Bitten Hvam, Scales
  • KL. 13.30-14.00    Networking

AX brugergruppemødet er kun for AX-kunder, men det kan være, at du har nogle AX-kunder, der er interesseret i emnerne, så kan du fortælle det videre. Tilmelding for AX-kunderne er her.
Partnere og konsulenthuse har ikke mulighed for at deltage. 

Visual Studio Tipps & Tricks, Teil 38: Break ohne Breakpoint (Ctrl+F10)

Fri, 07/25/2014 - 02:53

Ich gebe zu, dieser Tipp hat ein klein wenig magisches Flair – taugt also gegebenenfalls auch zum Beeindrucken von Kollegen. Und aus gegebenem Anlass möchte ich auch kurz darauf hinweisen, dass die Übersetzung von “Breakpoint” nicht “Brechpunkt” ist, sondern “Haltepunkt”. In freier Wildbahn höre ich aber eigentlich nur “Breakpoint”.

Eine Breakpoint setzt man ja gewöhnlich mit F9 oder eventuell mit der Maus per Klick in die Linke Randleiste des Codeeditorfensters. Dann schubst man die Ausführung des Codes mit F5 an.

Die Ausführung des Codes stoppt dann an genau der markierten Zeile Code, dafür sind Breakpoints ja da. Nach dem Anhalten kann ich mit F5 die Ausführung des Codes wieder anstoßen – der Code läuft dann solange, bis er nichts mehr zu tun hat oder eben der nächste Breakpoint im Weg steht.

Sehr häufig passiert es mir, dass ich einen Breakpoint zu früh setze – sicher ist sicher, man will ja den entscheidenden Moment im Code nicht verpassen. Ich lasse den Code dann anhalten und entscheide dann – vielleicht auch basierend auf Werten von Variablen – wo der nächste wichtige Zwischenstopp wäre. Dort wird dann der nächste Breakpoint gesetzt.

Das führt dazu, dass man irgendwann viele Breakpoints hat, die man eigentlich alle gar nicht benötigt. Man darf sie dann alle wieder löschen… wer will da schon?

Jetzt kommt der Kniff: Man kann Visual Studio anweisen an einer Bestimmten Stelle anzuhalten, ohne einen Breakpoint zu setzen – indem man Visual Studio mitteilt, einfach den Code bis zur aktuellen Position des Cursors laufen zu lassen. Der Zugehörige Shortcut ist CTRL+F10. Das heißt auch, dass ich eine neue Debugging Session starten kann, indem ich den Cursor in eine Zeile Code stelle und dann einfach Ctrl+F10 nutze – die App wird kompiliert, ausgeführt und in der Zeile des Cursors bleibt der Debugger stehen.

Das hält die Anzahl meiner Breakpoints übersichtlich und erlaubt es spontan und “spurlos” zu Debuggen, ohne am Ende wieder aufräumen zu müssen.



Mit Ctrl+F10 wird die Ausführung der Applikation im Debugger an der Stelle angehalten, an der gerade der Cursor steht.



Kurzer Text am Rande:

Dieser Post ist Teil einer längeren Serie, in der ich ein paar der vielleicht nicht ganz so bekannten Features von Visual Studio vorstellen werde. Ich hoffe, für Euch ist der ein oder andere Kniff dabei, den Ihr noch nicht kanntet. Und wenn ihr ihn doch schon kennt: Seid stolz auf Euch und verratet den Trick auch dem Entwickler neben Euch.

[Sample Of July 25] How to change the content type of Windows Azure blob storage

Fri, 07/25/2014 - 02:21
July 25

Sample :

This code snippet shows how to change the content type of Windows Azure blob storage. In some cases, a lot of media files stored on blob are in different formats - mp4, image file, etc. Sometimes, all these files are set as one content type: application/octet-stream, which causes issues in media playback and progress bar. Many users would like to know how to set the appropriate Content-type for files stored on blob (like - video/mp4, video/ogg, video/webm)—not to do it manually for each file through blob interface. This script will help users easily batch change the content type of blob storage.


You can find more code samples that demonstrate the most typical programming scenarios by using Microsoft All-In-One Code Framework Sample Browser or Sample Browser Visual Studio extension. They give you the flexibility to search samples, download samples on demand, manage the downloaded samples in a centralized place, and automatically be notified about sample updates. If it is the first time that you hear about Microsoft All-In-One Code Framework, please watch the introduction video on Microsoft Showcase, or read the introduction on our homepage

移轉資料至 Microsoft Azure 檔案服務

Fri, 07/25/2014 - 02:16

原文發表自 Migrating Data to Microsoft Azure Files

關於 Microsoft Azure 檔案服務(Files)

Microsoft Azure 檔案服務是一個以雲端平台為基礎的檔案服務,並且提供 SMB2.1 協定,讓使用者能透過雲端分享檔案。在 Azure 上的應用程式現在可以很輕易地在虛擬機器間、使用熟悉的檔案系統 API 如:ReadFile 及 WriteFile 來分享檔案。除此之外,這些檔案也可以透過 REST API 的方式來存取,使其應用情境更多元。如同現有的其它儲存體服務如:Blob, Table, Queue Services 等一樣,Azure 檔案服務一樣有可延展性、高可靠度、地理複本備援等雲端平台的特性。目前這個服務還在預覽階段,關於詳細的技術內容可以參考這篇部落格文章


當您開始使用 Azure 檔案服務,你可能會需要搬移大量的既有資料到 Azure 檔案服務中,搬移的方式有很多種,這取決於您的資料放在哪裡,這篇文章接下來會介紹幾種方式,並且介紹如何獲取最大的效能。

1. 透過網際網路將既有機房的檔案搬上 Azure

您可以使用 Microsoft Azure 提供的 AzCopy 工具來複製檔案,AzCopy 優化了複製檔案的操作以達到最好的效能(例如:平行上傳、多執行緒、正確處理流量傳輸等等)。

AzCopy 的命令列操作格式如下:

AzCopy <source path> <destination URL> [optional filespec] /S /DestKey:<YourKey>


source path 是要複製的檔案路徑

destination URL 指的是要複製的目標目錄 URL

filespec 可以是任何檔案篩選條件 (預設是 *.*)

YourKey 是你儲存體帳戶的金鑰

/S 是一個選項用來複製整個目錄、包含子目錄的內容

AzCopy 還有很多其它的命令列參數,您可以根據您的需求來選擇使用,��於 AzCopy 的詳情可以參考這篇部落格文章

底下是一個範例,是將 e:\data 目錄下的內容複製到 Azure 檔案服務:

AzCopy c:\data *.* /S /DestKey:myStorageAccountKey

2. 從 Azure IaaS 虛擬機器磁碟到 Azure 檔案服務

使用 Azure 虛擬機器來做檔案伺服器的人來說,Azure 檔案服務應該是非常有吸引力的,因為如此一來就不必再自己管理檔案伺服器了。

要將檔案移轉到 Azure 檔案服務,需要:

  1. 在虛擬機器中連接磁碟機
  2. 掛載 Azure 檔案服務
  3. 使用 robocopy 來複製檔案

Robocopy 是 Windows 上免費且強大的複製工具,用來處理大檔案的複製。


Robocopy <source path> <dest path> [optional filespec] /MIR /MT:16


source path 是要複製的檔案路徑

dest path 指的是要複製的目標目錄路徑

filespec 可以是任何檔案篩選條件 (預設是 *.*)

MT 是使用的執行緒數量

當使用 robocopy 時,您可以使用 "/mt" 參數來增加工作效率,它讓你可以使用多執行緒來處理檔案的複製,並且控制 IO 處理的佇列深度。如果執行緒數目太少,則可能會無法填滿佇列,但卻可以利用到 Azure 儲存體的平行架構;而要是執行緒數目太多,可能會有伺服器端傳輸切換過於頻繁而反而造成傳輸效能降低的問題。在我們的測試之下,最好的執行緒數目是在 16 ~ 32 之間可取得最大的效能。


我們發現雖然可以使用 xcopy 或是檔案總管來處理大檔案的複製到 Azure 檔案服務,而且在 NTFS 的檔案系統下表現良好,但是這些工具缺乏足夠的平行處理能力,由於 Azure 檔案服務提供了高平行化的 I/O 處理,所以使用像 robocopy 這樣的工具,並搭配多執行緒的處理將可以得到更好的傳輸效能,以節省資料傳輸的時間。

3. 從 Azure Blob 到 Azure 檔案服務

從 Azure Blob 搬資料到 Azure 檔案服務最快的方法就是使用 AzCopy,你可以在與 Azure 檔案服務相同的資料中心上建一個虛擬機器來做複製的操作。

底下是一個從 Azure Blob 傳資料到 Azure 檔案服務的指令操作:

AzCopy z:\mydirectory *.* /SourceKey:myStorageAccountKey

(在這裡我們假設 Azure 檔案服務連接到 Z 磁碟機)

在這個方法之下,資料會先下載到虛擬機器後,再上傳到 Azure 檔案服務中。

4. 從 Cloud Drive 到 Azure 磁碟

Cloud Drive 在 2010 年時預覽釋出,它讓用戶可以使用 Azure 雲端服務來掛載一個 page blob 作為 Web 或 Worker role 的磁碟機。在 Azure 檔案服務釋出後,幾乎可以取代所有 Cloud Drive 的應用情境,而且還有更好的功能及效能。同時,Cloud Drive 將在 2015 年停止服務,所以我們建議使用 Cloud Drive 的用戶可以移轉資料到 Azure 檔案服務上。搬移的方法與使用 VHDs 來從 Azure 虛擬機器中搬資料類似。

  1. 使用 Cloud Drive 掛載一個 blob
  2. 在虛擬機器中,將 Azure 檔案服務掛載為一個磁碟機。(可參考這篇部落格文章)
  3. 使用 Robocopy 來複製檔案。

我們希望這些方法都能幫助您將資料移轉到 Azure 檔案服務上,並且提供您新的應用情境來滿足您的商務需求。

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

Web ブラウザーから使う、WinJS2.1 入門(導入とコントロールの配置)

Fri, 07/25/2014 - 02:04

今年の Build 2014 で発表されたとおり、それまで Windows ストア アプリ (HTML+JavaScript) の専用フレームワークであった WinJS はオープンソースとなり、Web ブラウザー上で動作する HTML5 アプリのフレームワークとして生まれ変わりました。

このブログでは、新しくなった WinJS の使い方について、数回にわけて紹介していきます。

なお、ここで紹介する内容は、最新の Internet Explorer だけでなく Chrome、Firefox でも動作します。

  WinJS とは?

WinJS の正式名称は Windows Library for JavaScript と言い、以前は Windows ストア アプリ専用のフレームワークでした。

WinJS はデータバインドやテンプレート、マークアップによるリッチなコントロール、非同期実行のモデル、ページのナビゲーションモデルや HTTP 呼び出しなど、HTML + JavaScript でアプリケーションを開発する際に必要となってくるさまざまな機能を提供します。

現在、WinJS の機能を実際に さまざまなモダンWeb ブラウザーから体験できるページが用意されています。

Try BuildWinJS

(Try BuildWinJS の画面)

WinJS の入手

WinJS は GitHub から入手することができます。

使用している PC が git が動作するように構成されているのであれば、GitHub の WinJS のページに記載されている手順にしたがって WinJS ライブラリを入手してください。

GitHub - winjs/winjs

Git を使用したことがない、そもそも Git がなにか知らない、という方は以下の記事の内容にしたがい WinJS ライブラリを入手してください。

オープンソースになった WinJS を GitHub から取得する方法

  HTML ファイルからの参照のしかた

HTML ファイルから WinJS ファイルを参照するには、Microsoft.WinJS.2.1 フォルダ下のある以下のファイルをそれぞれ link タグ、script タグで参照します。

  • css/ui-light.css (もしくは ui-light.css) --- ページと WinJS が提供するコントロール用の CSS
  • js/base.js --- WinJS の基本機能を提供するライブラリ
  • js/ui.js --- WinJS の UI コントロール用のライブラリ


(WinJS を使用する際に必要なファイルの参照)

Visual Studio 2013 を使用すると、Microsoft.WinJS.2.1 フォルダをソリューションエクスプローラーにドラックしてプロジェクトに追加し、各ファイルを HTML エディタ上にドラックするだけで参照タグを挿入してくれるので簡単です、

  WinJS コントロールの追加

WinJS はさまざまな機能を提供しますが、もっとも手軽に使用することができるのはリッチなコントロールです。

WinJS が提供するコントロールをページ内に表示するには  div タグの data-win-control 属性に WinJS のコントロールのクラス名を記述し、WinJS.UI クラスの processAll メソッドを実行します。

例えば以下は WinJS が提供するレイティング (評価) コントロールの記述例です。

(レイティング コントロールを表示するための HTML の記述)


(WinJS によって提供されるレイティングコントロール)

コントロールは静的なものでなく、タッチやクリック、JavaScript によって操作することが可能です。

ただし、前述しましたが、WinJS が提供するコントロールを表示するためには、div タグの data-win-control 属性にクラス名を記述するだけでなく WinJS.UI クラスの processAll メソッドを実行する必要があります。

  WinJS.UI .processAll メソッド を実行するタイミング

WinJS.UI .processAll メソッドは、div タグにコントロールを生成する処理を行うので、ターゲットとなる div タグが Web ブラウザーに読み込まれ、JavaScript からアクセスできるタイミングで実行する必要があります。

ドキュメントが Web ブラウザーにロードされた際のイベントとして、従来から Windows オブジェクトの load イベントや document タグの onload 属性が使用されてきましたが、Internet Explorer 9 あたりからのモダン Web ブラウザーでは DOMContentLoaded イベントを使用することができるようになっています。

DOMContentLoaded イベントは window.onload イベントと同じく、参照している CSS ファイルなどが読み込まれ準備完了となった際に発生しますが、DOMContentLoaded イベントが発生するのは純粋に DOM の読み込み完了についてのみであり、window.onload イベントのように画像ファイルのロード完了までは待ちません。そのため画像の読み込みが遅い Web ページでは DOMContentLoaded イベン��を使用したほうが迅速に DOM への処理を開始することができます。このへんについての詳細な説明は以下のドキュメントをご覧ください。

アプリのライフサイクルの最適化 (HTML)

DOMContentLoaded イベントでの processAll メソッドの呼び出しの具体的な記述は以下のとおりです。

document.addEventListener("DOMContentLoaded", function () {


<!DOCTYPE html>
< html xmlns="">
< head>
< meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="Microsoft.WinJS.2.1/css/ui-light.css" rel="stylesheet" />
    <script src="Microsoft.WinJS.2.1/js/base.js"></script>
    <script src="Microsoft.WinJS.2.1/js/ui.js"></script>
        (function () {
            //DOM の準備ができたら
                function () {
< /head>
< body>
     <!—レイティング(評価)コントロール –>
    <div id="ratingCtrl"
         data-win-options="{maxRating: 10, averageRating:5}">
< /body>
< /html>
  WinJS コントロールにアクセスするタイミング

WinJS は、data-win-control 属性 が設定されている div タグ上に提供するコントロールを生成します。そのため、これら WinJS コントロールに JavaScript からアクセス可能になるタイミングは、通常の HTML エレメントとは異なります。

たとえば、前述の document オブジェクトの DOMContentLoaded イベントのハンドラ内では、JavaScript から div タグや input タグで記述されたエレメントのプロパティやメソッドにアクセスできますが、WinJS の提供するコントロールにはアクセスすることはできません。これは、WinJS がコントロールの生成を完了していないためです。

WinJS の提供するコントロールに JavaScript からのアクセスが可能になるのは、 WinJS.UI .processAll メソッドの完了後です。 WinJS.UI .processAll メソッドの完了を知らせるイベントは用意されていませんが、同メソッドは promise オブジェクトを返すので、then もしく done メソッドの引数としてコールバッグ関数を渡すことができます。


//done メソッドを使用した場合 
document.addEventListener("DOMContentLoaded", function () {

function initialize() { /*WinJS コントロールにアクセスする処理*/ };


//then メソッドを使用した場合 
document.addEventListener("DOMContentLoaded", function () {
    WinJS.UI.processAll().then(initialize, errorHandle);

function initialize() { /*WinJS コントロールにアクセスする処理*/ };

function errorHandle(e) { /*エラーが発生した際の処理*/ };

promise オブジェクトthen メソッドと done メソッドの違いは、大まかにいって then ではエラー処理が指定でき、返り値として promise オブジェクトが返されるのに対し、done メソッドでは指定されたメソッドの実行のみ行われる、といったところですので目的にあっているほうを使用してください。

  WinJS コントロール独自のプロパティへのアクセス

WinJS が提供するコントロールへのイベントハンドラの設定は、以下のように通常の HTML エレメントに行うものととくに違いはありません。

    function () {

しかし、WinJS コントロールが持っている独自のプロパティやメソッドにアクセスする場合には、ホスト要素であるコントロールの winControl プロパティを介してプロパティにアクセスする必要があります。

たとえば、WinJS が提供するレイティングコントロールの userRating プロパティにアクセスするには以下のように記述します。

var ratingValue = document.getElementById("ratingCtrl").winControl.userRating;

ここまでの点を踏まえ、WinJS の提供するレイティングコントロールで、ユーザーが値を変更した場合にその値を表示するコードは以下のようになります。

//DOM の準備ができたら
document.addEventListener("DOMContentLoaded", function () {

function initialize() {
    document.getElementById("ratingCtrl").addEventListener("change", function () {

今回はオープンソースとなり、HTML5 アプリのフレームワークとなった WinJS2.1 の導入の仕方と、WinJS が提供しているコントロールの表示の仕方と、JavaScript からアクセスする方法について紹介しました。

今回の記事では、わかりやすさを優先し、単純に使用できるレイティングコントロールを使用しましたが、同様の方法で WinJS が提供するさまざまなコントロールを使用することができます。

以下のページには、より詳しいコントロールの追加方法と、WinJS が提供しているコントロールの一覧がありますので、ぜひご覧になり他のコントロールもお試しください。

クイック スタート: WinJS コントロールとスタイルの追加 (HTML)


次回は WinJS を使用したデータバインディングについて書きたいと思います。



サインイン出来ない時のトラブルシューティング part1

Fri, 07/25/2014 - 01:59

こんばんは。Lync サポートの久保です。


Lync というプロダクトは、そのプロダクトの特性からネットワーク レイヤーの技術とは切っても切れないアプリケーションとなっています。

今後、Lync に関わらず全てのアプリケーションで、ネットワーク レイヤーと合わせて問題解決が出来るスキルは加速度的に必要不可欠になっていくことは想像に難くありません。

IT エンジニアにとって特定のアプリケーションだけを理解していれば良い時代は既に終焉を迎えました。


今回はサインインが出来ない問題について、Network Monitor 3.4 を使用したトラブル シューティングの手順を順を追ってみていきたいと思います。


例: 以下のようなエラーが出た際のネットワーク モニターを用いてのトラブルシューティングを行ってみたいと思います。

1. ネットワーク モニターを起動します。この際、管理者権限で起動しないと、ネットワーク カードがバインドできずパケットの取得はできません。

2. ネットワーク アダプダが読み込めている事を確認し、データを取得するネットワーク カードを選択します。

3. コマンドプロンプトより、ipconfig /flushdns を実行します。

4. [New Capture] をクリックし、[Start] をクリックします。

6. Lync クライアントを起動し、キャプチャを開始し、エラーを発生させます。

7. エラーが出力されたのを確認し、キャプチャーを停止します。

8. DNS 名前解決の動作を確認するためにプロトコルでフィルターをします。任意のパケットをクリックし、プロロトコルにカーソルを合わせ、右クリックから "Add 'Protocol Name' to Display Filter" をクリックします。

9. 追加された Filter 条件を "DNS" に変更します。

10. [Apply] をクリックします。名前解決の様子が確認できます。

この例では、 の SRV レコードの名前解決を行い、 の IP アドレスを取得しています。

11. Lync クライアントが接続先の IP アドレスを DNS から取得できたので、IP アドレスでフィルターを行います。



12. [Apply] を再度クリックします。IP アドレスでフィルターが行われ、 との通信のみが表示されます。

この例では、Syn パケットに対する Ack/Syn が無く、SynReTransmit が行われています。

この場合は、フロントエンド サーバーからの返答がないため、フロントエンド サーバー上でもネットワーク パケットを取得し、

Syn パケットが到達しているかどうか確認する必要があります。


上記のように Network Monitor を使う事により、名前解決は出来ているか、パケットの送信先の IP アドレスは正しいかなど、



非常に基本的な Network Monitor 3.4 の使い方となりますが、最初はここから始めていただければと思います。


引き続き快適な Lync ライフをお楽しみください。




The English Computing curriculum and Microsoft products

Fri, 07/25/2014 - 01:33

Useful overview from our recent Computer Science in the National Curriculum eBook (written in conjunction with Miles Berry) that aligns various Microsoft products and services with key stages in the curriculum.

The section from the eBook is shown below:

The full eBook, including the curriculum mapping section above, can be downloaded/viewed for free via our SlideShare channel.

Internet of Things 関連情報

Fri, 07/25/2014 - 00:19

Azure上のIoT向けサービス、Intelligent Systems Service(ISS)のPreviewのパブリック公開が待ち遠しい今日この頃ですが、Internet of Thingsを実現するのにつかわれるサービスが幾つかPreview公開されているので、簡単に紹介しておきます。

Internet of Thingsを構成する要素をざっくりと書くと、

こんな感じです。先週はEvent HubとML(Machine Learning)のPreviewが公開されました。

Event Hub :

Machine Learning:

どちらも、Internet of Things専用のサービスというわけではありませんが、膨大な数の組込み機器からばらばらと送られてくるセンサー計測値や機械の状態などをきちんとクラウドで受けるためのサービスとして、高速リアルタイム通信向けのサービスバス、Event Hubが用意されています。また、例えば、WWPCで紹介されtエレベーターや、ロンドン地下鉄のように、計測されたデータから今後の機械の状況を予測したりアラートを発したりするための自動学習サービスMLが、Internet of Thingsのシナリオで利用されます。

Event Hubによる機器との接続には、通常のHTTP REST形式だけでなく、現時点では、メッセージ指向のプロトコルAMQP(Advanced Message Queuing Protocol)もサポートしています。詳しくは、  を見てください。図を見ると、かなりIoTが意識されてますね。

AMQPでEvent Hubと通信するサンプルが、Windows Embedded 8(デスクトップアプリ含む)、Windows Embedded Compact、.NET Micro Framework、Windows Runtime API向けに から提供されています。私のブログをよく見ている.NET Gadgeteer持っている方、試してみてください。

 Intelligent Systems ServiceのLimited Previewを使ってみたいと云う方は、 から申し込んでみてくださいね。


プログラミング Windows 第6版 第2章 WPF編

Thu, 07/24/2014 - 23:40

この記事では、「プログラミング Windows 第6版」を使って WPF XAML の学習を支援することを目的にしています。この目的から、書籍と併せて読まれることをお勧めします。

最初に、WPF アプリケーションを開発する上で Visual Studio 2013 で設定しておいた方が良いトピックを紹介します。 Visual Studio 2013 を起動して、[ツール]-[外部ツール] を使って Blend for Visual Studio からプロジェクトを開けるように設定します。設定方法は、以下のようにします。

  • コマンド:C:\Program Files (x86)\Microsoft Visual Studio 12.0\Blend\Blend.exe
  • 引数:$(SolutionDir)$(SolutionFileName)
  • 初期ディレクトリー:$(SolutionDir)

このように設定しておくことで、Visual Studio で開いているプロジェクトをいつでも Blend で開けるようになります。Windows ストア アプリ プロジェクトの場合は、ソリューション エクスプローラーのコンテキスト メニューから Blend で開けるようになっていますが、 WPF アプリケーション プロジェクトでは Blend で開くという コンテキスト メニューが表示されないための対策です。

第2章 XAML 構文 2.1(P33) グラデーションブラシ:コード

この節で説明している GradientBrushCode サンプルは、第1章で説明したようにPage を Windowへ、組み込みのスタイルを個別指定へと読み替えることで WPF へと置き換えることができます。次に実行結果を示します。

WinRT XAML との大きな違いは、名前空間を読み替えることです。WinRT XAML は Windows.UI.Xaml で始まる名前空間で定義をしており、 WPF は System.Windows で始まる名前空間で定義しています。したがって、SolidColorBrush などのブラシは、System.Windows.Media 名前空間で定義されており、WebView クラスは WPF では WebBrowser クラスとなり System.Windows.Controls 名前空間で定義されているという形式になります。 WebViewBrush 相当のクラスは、WPF では定義されていませんので、ご注意ください。

2.2(P36) プロパティ要素構文

この節では、XAML におけるプロパティの記述方法を説明しています。基本的な記述方法は、「<TextBlock Background="Red" />」のように XML の属性を使用します。属性に使用するのは、単一の値と覚えておけば良いでしょう。例として記述した Background プロパティを明示的に SolidColorBrush オブジェクトとして定義するには、次のように記述します。

<TextBlock> <TextBlock.Backgound> <SolidColorBrush Color="Red" /> </TextBlock.Backgound> </TextBlock>


「<要素名.プロパティ名>」タグを使うことで、新しいタグを使ってプロパティを設定できるようになります。XML の属性を使った記述方法でも、リソースやバインディング構文を使うことで他のオブジェクトなどを設定することもできますが、これらの記述方法は本書を読み進めていくことで理解できるようになります。

2.3(P40) コンテント プロパティ

この節では、最初に Content プロパティの説明が行われています。Windows Forms と考え方が大きく違う点でもあるので、具体的に説明します。WPF のコンテンツ モデルは、MSDN にドキュメントがありますので参照してください。

コントロール名 プロパティ名 説明 ContentControl Content 1つの任意のオブジェクトを設定するすることができます。
たとえば、Window クラスは Contentを持ちますし、Button コントロールもContent を持ちます。よって、Button.Content="ボタン"とすれば文字列オブジェクトを設定したので、ボタンに文字列が表示されるようになります。つまり、Windows Forms のButton.Text プロパティや Image プロパティに相当することになります。 ItemsControl Children オブジェクトのコレクションを設定することができます。
たとえば、Grid クラス、Canvasクラス、StackPanel クラスなどは Children を持ちます。このプロパティが、Windows Forms の Form.Controls プロパティに相当します。

これらのことを踏まえて書籍を読めば良いでしょう。この節で使用している GradientBrushMarkup サンプルも、第1章で説明したようにPage を Windowへ、組み込みのスタイルを個別指定へと読み替えることで WPF へと置き換えることができます。

2.4(P44) TextBlock のコンテント プロパティ

この節では、TextBlock クラスの Content プロパティを詳細に説明しています。Windows Forms では Label クラスに相当すると説明しましたが、この説明はとても単純化したものになります。より正確に表現するのであれば、Windows Forms のRitchTextBox クラスを読み取り専用にしたようなクラスと考えるのが妥当になります。なぜなら、Inline オブジェクトのコレクションを持っており、設定するテキストに対する装飾も行うことができるからです。もちろん、WPF にも RitchTextBox クラスは存在します。

この節で使用している TextFormatting サンプルも、第1章で説明したようにPage を Windowへ、組み込みのスタイルを個別指定へと読み替えることで WPF へと置き換えることができます。次に実行例を示します。

これが、TextBlock クラスで表現できています。Windows Forms の Label クラスで同じことをしようとすれば、手間がかかることを容易に想像できることでしょう。このことは、XAML という UI 技術の豊かな表現力の一端を示しています。

2.5(P47) ブラシの共有

この節では、XAML におけるリソースの考え方を説明しています。XAML のリソース システムは、柔軟であり、XML のツリー構造を利用したスコープの概念も備えています。

図に示したオブジェクトごとにリソースを定義することができます。リソースを定義したオブジェクトによって、 そのオブジェクトより下の階層(Content やChildren)がリソースを参照することができるようになります(スコープ)。つまり、アプリケーション全体で使用するリソー���であれば、App.xaml で定義すれば良いということを意味します。

それでは、SharedBrush プロジェクトのMainWindow.xaml の抜粋を示します。

<Window ... xmlns:x="" xmlns:clr="clr-namespace:System;assembly=mscorlib" ... > <Window.Resources> <clr:String x:Key="appName">Shared Brush App</clr:String> <LinearGradientBrush x:Key="rainbowBrush"> <GradientStop Offset="0" Color="Red" /> <GradientStop Offset="0.17" Color="Orange" /> <GradientStop Offset="0.33" Color="Yellow" /> <GradientStop Offset="0.5" Color="Green" /> <GradientStop Offset="0.67" Color="Blue" /> <GradientStop Offset="0.83" Color="Indigo" /> <GradientStop Offset="1" Color="Violet" /> </LinearGradientBrush> <FontFamily x:Key="fontFamily">Times New Roman</FontFamily> <clr:Double x:Key="fontSize">96</clr:Double> </Window.Resources> ... </Window>


すでに説明した Page を Windows クラスへ変更しただけでなく、この変更に伴って WinRT XAML の 「<Page.Resources>」というリソース定義を「<Window.Resources>」に変更しています。また、名前空間に「xmlns:clr="clr-namespace:System;assembly=mscorlib"」を追加している点も注目してください。この名前空間の追加に伴って、WinRT XAML の「<x:String x:Key="appName">」定義を「<clr:String x:Key="appName">」へと変更しています。

WinRT XAML における「x:String」という型が何なのかというところから説明します。この記法は、「x:型」という記法で共通の XAML 言語プリミティブの組み込み型で説明されています。このドキュメントで、x:String を調べると XAML 2009の言語プリミティブで定義されていると記述されていますが、同じドキュメント上で WPF のサポートにおいては「マークアップ コンパイルされない XAML のみのサポート」とあります。つまり、コンパイルする WPF アプリケーションでは未サポートということになります。これが、名前空間として「xmlns:clr」を追加した理由になります。一方で、WinRT XAML ではx:Stringの記法が許可されていることから、XAML 2009 言語プリミティブをサポートしているように見えますが、実は WinRT XAML だけの限定的なサポートであることが、XAML 名前空間(x:)の言語機能というドキュメントに記載されています。要は、WPF XAML をリリースしてから、Silverlight や Windows Phone などの経験からプログラミングとして必要と思われる言語機能だけを XAML 2009 より WinRT XAML で実装したということになります。これなどは、WPF XAML と互換性を持たない機能になりますので、「x:Type」という記述を見つけたら読み替えないといけないということになるのです。

ここまで説明したこと以外は、SharedBrush プロジェクトのMainWindow.xaml は同じですから次に実行結果を示します。

この節で補足するとすれば、スタイル リソースとテーマ リソースということになります。WinRT XAML では、generic.xaml(Windows 8 プロジェクトでは StandardStyles.xaml) というスタイル シートが Visual Studio 2013 の Windows 8.1 用の Windows ストア アプリ プロジェクトでは、ビルド時に自動的に組み込まれます(Windows 8 プロジェクトでは、プロジェクトに含まれます)。また、利用できる テーマ リソースとして、themeresources.xaml も自動的に組み込まれることになります。これが、RequestedTheme プロパティに指定できるテーマ リソースを定義しています(デフォルトでは、Dark テーマ)。一方で、WPF の場合は標準のスタイル シートの提供はなく、テーマ リソースが提供されているだけになります。含まれているテーマは、以下のアセンブリになります。

  • PresentationFramework.Luna.dll
  • PresentationFramework.Aero.dll
  • presentationframework.aero2.dll
  • presentationframework.aerolite.dll
  • PresentationFramework.Classic.dll
  • PresentationFramework.Royale.dll

これらのアセンブリに対する名前空間を定義することで、テーマ リソースを WPF で利用できるようになります。または、オープン ソースとして公開されているスタイル シートやテーマもありますので、自分が使いたいと思えるスタイル シートやテーマを探すか、作成してもよいでしょう。

2.6(P51) リソースは共有される

この節では、SharedBrush サンプルに対してコードで操作することで、リソースが共有されることを確認しています。この動きは、WPF でも同じなので自分で確認してみてください。

2.7(P52) ベクター グラフィックスの操作

この節で説明している Spiral プロジェクトの MainWindpow.xaml の抜粋を示します。

<Grid> <Polyline Name="polyline" Stroke="Black" StrokeThickness="3" HorizontalAlignment="Center" VerticalAlignment="Center" /> </Grid>


ここまで説明してきた通りで、Stroke プロパティに指定していたリソースを「Black」に変更するだけで WPF で動作します。実行結果を示します。

この描画されている内容が、ベクター グラフィックスになっている点が、Windows Forms と異なる点になります。Windows Forms で描画した図形は、GDI ベースになっていますからピクセルをベースにしたビットマップ画像であると言っても良いでしょう。ビットマップ画像に対して、WPF の描画ではベクター グラフィックスになります。ベクター グラフィックスのメリットは、拡大や縮小しても画像が滑らかになるという点です。UX の観点から、読み難いとユーザーが感じればピンチ操作などで拡大しようと試みることでしょう。拡大した時に、ドットが表示されてカクカクになったコーナーを目にすることは、ユーザー エクスペリエンスを損ないます。つまり、ベクター グラフィックスの採用そのもの ユーザー エクスペリエンスを向上させる目的を達成するためなのです。

次の StretchedSpiral プロジェクトも Spiral プロジェクトと同じ対応を行うことで、WPF で動作します。実行結果を示します。

Spiral サンプルに Stretch プロパティを設定したのが、StreachedSpiral サンプルですが、このサンプルによってベクター グラフィックスのメリットを確認することができることでしょう。

この節で説明しているサンプルとして、ImageBrushedSpiral、HelloVectorGraphics、HelloVectorGraphicsPath プロジェクトはここまでに説明してきた内容を踏まえて書き換えれば(Page を Windowへ、スタイルを固定値へ)、問題なく WPF で動作します。以下に実行結果を示します。

次に説明している Path マークアップ構文を使った PathMarkupSyntaxCode サンプルでは、ここまでに説明してきた内容に加えてコードを少しだけ書き換える必要がありますので、MainWindow.xaml.cs の抜粋を示します。

Geometry PathMarkupToGeometry(string pathMarkup) { string xaml = "<Path " + "xmlns=''>" + "<Path.Data>" + pathMarkup + "</Path.Data></Path>"; Path path = XamlReader.Parse(xaml) as Path; // Load を Parseへ // Detach the PathGeometry from the Path Geometry geometry = path.Data; path.Data = null; return geometry; }


書き換えたのは、XamlReaderクラスの Load メソッドを Parse メソッドにしたことです。これは、WinRT XAML における XamlReader クラスと WPF の XamlReader クラスの違いによるものです。正確に表現するのであれば、WPF の XamlReader クラスのほうが高機能であり、WinRT XAML の XamlReader は機能を限定していることが原因になります。もちろん、書き換えても実行結果は同じになります。

2.8(P62) ViewBox による拡大と縮小

この節で説明している TextStretch、VectorGraphicsStretch サンプルも、ここまでの説明に従って書き換えることで、問題なく WPF で動作します。節のタイトルにある ViewBox コントロールとは、配置したコントロールを自動的に枠内に拡大・縮小することで枠からはみ出さないようにするものになります。

2.9(P65) スタイル

こ���節では、XAML のスタイル定義に関して説明しています。2.5 ブラシの共有で説明した内容に従って、リソース定義などを書き換えるだけで WPF で動作させることができます。書き換えた SharedBrushWithStyle プロジェクトの MainWindow.xaml の抜粋を示します。

<Window.Resources> <clr:String x:Key="appName">Shared Brush with Style</clr:String> <LinearGradientBrush x:Key="rainbowBrush"> <GradientStop Offset="0" Color="Red" /> <GradientStop Offset="0.17" Color="Orange" /> <GradientStop Offset="0.33" Color="Yellow" /> <GradientStop Offset="0.5" Color="Green" /> <GradientStop Offset="0.67" Color="Blue" /> <GradientStop Offset="0.83" Color="Indigo" /> <GradientStop Offset="1" Color="Violet" /> </LinearGradientBrush> <Style x:Key="rainbowStyle" TargetType="TextBlock"> <Setter Property="FontFamily" Value="Times New Roman" /> <Setter Property="FontSize" Value="96" /> <Setter Property="Foreground" Value="{StaticResource rainbowBrush}" /> </Style> </Window.Resources>


2.5 ブラシの共有と同じように、名前空間で clr を定義することで x:Type という記述を書き換えています。そして、ImplicitStyle サンプルも同様に書き換えることで、WPF で動作させることができます。

2.10(P71) データ バインディング

この節では、データ バインディングの基本的な記述方法を説明しています。データ バインディングの基本的な記述方法は、WinRT XAML も WPF も同じになります。従って、ここまでに説明したきたように書き換えることで WPF で問題なく動作させることができます(Page を Window へ、リソースの定義方法、x:Type 記述)。特に注意して頂きたいのは、2.5 ブラシの共有で説明した XAML 名前空間(x:) の言語機能になります。これは、WinRT XAML 固有の機能になりますので、WPF では .NET Framework のデータ型を利用しなければならないという点になります。
しかしながら、「Background="{x:Null}"」という null を指定する場合は、WPF も WinRT XAML と同じ指定をすることになります。

ここまで説明してた違いを意識しながら、第2章を読むことで WPF にも書籍の内容を応用することができるようになることでしょう。


Drupal 7 Appliance - Powered by TurnKey Linux