You are here

Feed aggregator

Bringing Your Core Business Applications to SharePoint

MSDN Blogs - Thu, 11/20/2014 - 09:29

Guest post from MVP Vincent Biret

Introduction

It has been a long time question: should we or not bring our core business applications to SharePoint? What are the benefits? What are the risks? Is it hard? ...

Well, we’ll try to answer this question taking into consideration all the new capabilities coming out lately.

For the rest of this post, when I’m referring to SharePoint, understand it as SharePoint on-premises or online or even Office 365 globally. Of course some features are available only online or on-premises but I’ll try to focus on the general idea.

What is a core business application?

First we have to back off a little bit and take a better look at the big picture. What is it that the company you are working at (or your division) is doing for living? To what are they adding value? Why customers are willing to pay and what are they expecting?

Once you start analyzing that and answering to these questions you are beginning to have a first idea of the picture: people at your company have one or many roles and in their everyday work they are a part of one or many processes.

Some of these processes are more critical than other for example if a car constructor company suddenly cannot produce cars anymore, there is a big chance they run out of business pretty soon. But if their expenses reports to not reach the accounting department anymore, they will be able to survive.

Some of these processes might already be covered by existing products, others by custom applications, some delegated to contractors and other ones might still exist only on paper/people’s mind/some hidden excel spreadsheet/…

For example if we take a law consulting firm, it is very likely they already purchased a software for all HR and payroll related processes but maybe they don’t have anything more than paper files for customers’ requests tracking.

To recap a core business application is something that your company does to earn (or save) money, that can be represented and treated digitally. Some applications/processes will be more or less critical to your company. Some of these processes will rely on existing products/services and others won’t exist as such or your needs will be too custom to be met by the existing products.

Why bringing your core business apps to SharePoint?

First of all you’ll notice I wrote “to” SharePoint and not “in” SharePoint and I’ll detail why at a later time.

Microsoft has demonstrated us over the years that SharePoint is a great product (and even a greater service). It’s already a place in a lot of companies where people collaborate, store their documents, publish sites/data and do even a lot of other things.

But from a developer perspective what are the perks of developing with SharePoint:

  • It handles security (authentication, roles, groups, permissions…) for you and it is easily customizable by power users/IT Pros.
  • It allow users to store a lot of content
  • It has a search engine
  • It relies on an extensible data model
  • It provides a lot of services (machine translation, word automation, workflows, connectivity to external data sources, business intelligence capabilities,..)
  • It provides lot of social features (well this one is probably going to evolve a lot in the next years with the integration of Yammer)

Of course all these features are easily integrated within your applications using SharePoint’s API.

But most of all, SharePoint is becoming the central place of the company. I’m pretty sure you’ve all seen a typical SharePoint intranet with corporate news, a few applications links, and a few other things, where nobody goes. They just directly jump to their collaboration, social or search subsite and start working. Why is that? Because people have been given less time to do more things so they want to be productive.

Providing the link to your corporate applications on the corporate intranet site is a great first step of integration but why not directly providing the application itself when possible? Your users would then access their core business data integrated with the built-in features of SharePoint. They would have a central place to look for things they need.

I’m sure you can already imagine all the productivity (understand money) gained by having:

  • Less time spent on searching things
  • Less time spent authenticating/try to remember passwords/…
  • Less time spent managing rights
  • Better presentation (and understanding) of data
  • Better follow up and reporting of even smallest tasks
  • Business processes formalized and centralized
What’s changed in SharePoint (Office 365) development?

For those of you who are not SharePoint developers you might not be aware that Microsoft developed a whole new development model about two years ago. We used to have to develop with SharePoint’s context which meant:

  • We could only use compatible technologies (reduced set of all the .NET technologies)
  • Our application could slow down SharePoint (or in other words SharePoint could slow down our application)
  • Learning curve was huge
  • Testing was complicated
  • - …

And I’m pretty sure developers having experienced SharePoint could come with a lot of other reasons avoiding SharePoint development.

It’s over now! With the new app model you have two main choices:

  • JavaScript only applications (for small apps not very adapted to business applications)
  • Provider hosted applications

Using the second one you can use nearly any technology (Microsoft or not) and you communicate with SharePoint via a set of RESTFul API’s. Your application is hosted outside of SharePoint but works with SharePoint, setting you free of previous limitations.

Then your application is “presented” in SharePoint via:

  • Links/tiles in the site
  • Custom actions on SharePoint data
  • Actions in the ribbon
  • Full pages
  • App parts (new version of web parts)
  • Remote event receivers

So just consider SharePoint like something taking care of most part of the security for you, exposing you a set of useful services and data, and presenting/notifying your application. Other than that you are free to use anything you need inside your application. That includes all the services offered by the Microsoft Azure platform, obviously they are designed to work great with office 365 and office 365 partially relies on some of its services.

Another great thing about this new app model is that it has been extended to the whole Office 365 service/suite which means your app could be available for: Office programs, SharePoint, Office online (soon)…

Not convinced yet? Need an example? Here you go!

One of the sessions I give during SharePoint/Office 365 events has an example, so I thought I just might reuse it.

Snow Pro Corporation (fake, don’t Bing it ;-) ) is a ski equipment company. They design, produce and ship skis, snowboards, coats, etc. They have 3 factories in Canada, some warehouses across USA, and a few partners/sales offices spread around the world. One of their core business applications is the one tracking production and shipment of items. Right now each factory/warehouse has its own instance of the application running on-premises. Every time someone needs stock info, to ship something to customers, to move stock from factories to warehouses they need to give a call to the person in charge at the location.

The first effort has been to move and merge SQL databases to the Azure SQL Database service so now we have a global representation of stocks, production etc. (we can either directly connect the existing software to Azure or use SQL Data Sync, but SQL Data Sync is still in preview)

People in factories and in warehouses are not using Office 365 because they spend most of their days in front of machines and not in front of computers, however they have kiosks display the factory/warehouse application. We only had to do minor modifications to this app and they already know how to use it, so they’ll stick to that for now.

On the other hand people from Marketing have always been complaining that’s it’s complicated to know what our available stock is when they need to put together some events/demonstrations. So we’ll build them a shipment application with these main features: know in real time stock status, order a shipment, follow the shipment status. And this app will be on Office 365.

You can download my sample (and see how it is simple) from GitHub here. You’ll need to create a Azure SQL Database, create an Azure Website, publish the compiled version, and register the app to your Office 365 tenant.

You can also check out this video that I created:

Again once, I’m using Office 365 + Azure capabilities. Here is what I could add to this application:

  • Task tracking via work management service
  • Search capabilities via azure search
  • Translation
  • Worklow (actions, conditions, validations, notifications… basically everything related to processes)
  • Business intelligence with power BI (we actually do that in the session)
Conclusion and Next Steps

I hope going through the above you now understand that SharePoint (and in general Office 365 + Azure) is now a great platform to support and expose your business applications providing you a lot of features out of the box. It is now way simpler to integrate your business application with SharePoint using your favorite technologies and Visual Studio.

If you want to start learning how to create amazing enterprise applications, check out the following resources:

Tracking Windows Performance Counters by application

MSDN Blogs - Thu, 11/20/2014 - 08:19
1 Introduction

This blog describe a basic console application written in C# to track Performance Counters in Windows.

Counters are used in windows OS to provide information as to how well the operating system or an application, service, or driver is performing. The counter data can help determine system bottlenecks. The operating system, network, and devices provide counter data that an application can consume to provide user with a graphical view of how well the system is performing.

The System.Diagnostics namespace provides classes that allow you to interact with performance counters. The PerformanceCounter Class has different constructors; in our code we use the constructor with the following format:

public PerformanceCounter(
string categoryName,
string counterName,
string instanceName
)

where:

  • categoryName: it is the name of the performance counter category (performance object) with which this performance counter is associated.
  • counterName: The name of the performance counter.
  • instanceName: The name of the performance counter category instance, or an empty string (""), if the category contains a single instance.

This constructor initializes the performance counter and associates the instance with an existing counter on the local computer. The values that you pass in for the CategoryName, CounterName, and InstanceName properties must point to an existing performance counter on the local computer.

Below some performance counters to track processor utilization, disk I/O, Memory, and networking

PerformanceCounter("Processor", "% Processor Time", "_Total");

PerformanceCounter("Processor", "% Privileged Time", "_Total");

PerformanceCounter("Processor", "% Interrupt Time", "_Total");

PerformanceCounter("Processor", "% DPC Time", "_Total");

PerformanceCounter("Memory", "Available MBytes", null);

PerformanceCounter("Memory", "Committed Bytes", null);

PerformanceCounter("Memory", "Commit Limit", null);

PerformanceCounter("Memory", "% Committed Bytes In Use", null);

PerformanceCounter("Memory", "Pool Paged Bytes", null);

PerformanceCounter("Memory", "Pool Nonpaged Bytes", null);

PerformanceCounter("Memory", "Cache Bytes", null);

PerformanceCounter("Paging File", "% Usage", "_Total");

PerformanceCounter("PhysicalDisk", "Avg. Disk Queue Length", "_Total");

PerformanceCounter("PhysicalDisk", "Disk Read Bytes/sec", "_Total");

PerformanceCounter("PhysicalDisk", "Disk Write Bytes/sec", "_Total");

PerformanceCounter("PhysicalDisk", "Avg. Disk sec/Read", "_Total");

PerformanceCounter("PhysicalDisk", "Avg. Disk sec/Write", "_Total");

PerformanceCounter("PhysicalDisk", "% Disk Time", "_Total");

PerformanceCounter("Process", "Handle Count", "_Total");

PerformanceCounter("Process", "Thread Count", "_Total");

PerformanceCounter("System", "Context Switches/sec", null);

PerformanceCounter("System", "System Calls/sec", null);

PerformanceCounter("System", "Processor Queue Length", null);

 

2 Performance counters CategoryName

Here a short description of some performance counters.

2.1 CategoryName: Processor

 

 PerformanceCounter("Processor", "% Processor Time", "_Total");

The Processor\% Processor Time counter determines the percentage of time the processor is busy by measuring the percentage of time the thread of the Idle process is running and then subtracting that from 100 percent. This measurement is the amount of processor utilization


PerformanceCounter("Processor", "% Interrupt Time", "_Total");

The rate, in average number of interrupts in incidents per second, at which the processor received and serviced hardware interrupts. It does not include deferred procedure calls, which are counted separately.


PerformanceCounter("Processor", "% DPC Time", "_Total");

The percentage of time that the processor spent receiving and servicing deferred procedure calls during the sample interval. Deferred procedure calls are interrupts that run at a lower priority than standard interrupts.

 

PerformanceCounter("Processor", "% Privileged Time", "_Total");

The percentage of non-idle processor time spent in privileged mode. Privileged mode is a processing mode designed for operating system components and hardware-manipulating drivers. It allows direct access to hardware and all memory. The alternative, user mode, is a restricted processing mode designed for applications, environment subsystems, and integral subsystems. The operating system switches application threads to privileged mode to gain access to operating system services. This includes time spent servicing interrupts and deferred procedure calls (DPCs). A high rate of privileged time might be caused by a large number of interrupts generated by a failing device. This counter displays the average busy time as a percentage of the sample time.

 

2.2 CategoryName: Memory

 

PerformanceCounter("Memory", "Available MBytes", null);

This measures the amount of physical memory, in megabytes, available for running processes. If this value is less than 5 percent of the total physical RAM, that means there is insufficient memory, and that can increase paging activity.

 

 PerformanceCounter("Memory", "Committed Bytes", null);

it shows the amount of virtual memory, in bytes, that can be committed without having to extend the paging file(s). Committed memory is physical memory which has space reserved on the disk paging files. There can be one or more paging files on each physical drive. If the paging file(s) are expanded, this limit increases accordingly.

 

PerformanceCounter("Memory", "Commit Limit", null);

it shows the amount of virtual memory, in bytes, that can be committed without having to extend the paging file(s). Committed memory is physical memory which has space reserved on the disk paging files. There can be one or more paging files on each physical drive. If the paging file(s) are expanded, this limit increases accordingly.

 

PerformanceCounter("Memory", "% Committed Bytes In Use", null);

it shows the ratio of Memory\ Committed Bytes to the Memory\ Commit Limit. Committed memory is physical memory in use for which space has been reserved in the paging file so that it can be written to disk. The commit limit is determined by the size of the paging file. If the paging file is enlarged, the commit limit increases, and the ratio is reduced.

 

PerformanceCounter("Memory", "Pool Paged Bytes", null);

it shows the size, in bytes, of the paged pool. Memory\ Pool Paged Bytes is calculated differently than Process\ Pool Paged Bytes, so it might not equal Process(_Total )\ Pool Paged Bytes.

 

PerformanceCounter("Memory", "Pool Nonpaged Bytes", null);

it shows the size, in bytes, of the nonpaged pool. Memory\ Pool Nonpaged Bytes is calculated differently than Process\ Pool Nonpaged Bytes, so it might not equal Process(_Total )\ Pool Nonpaged Bytes.

 

PerformanceCounter("Memory", "Cache Bytes", null);

it shows the sum of the values of System Cache Resident Bytes, System Driver Resident Bytes, System Code Resident Bytes, and Pool Paged Resident Bytes.

 

2.3 CateroryName: PhysicalDisk

 

PerformanceCounter("PhysicalDisk", "Disk Read Bytes/sec", "_Total");

PerformanceCounter("PhysicalDisk", "Disk Write Bytes/sec", "_Total");

it captures the total number of bytes sent to the disk (write) and retrieved from the disk (read) during write or read operations.

 

PerformanceCounter("PhysicalDisk", "Avg. Disk sec/Read", "_Total");

PerformanceCounter("PhysicalDisk", "Avg. Disk sec/Write", "_Total");

it captures the average time, in seconds, of a read/write of data from/to the disk.

 

PerformanceCounter("System", "Context Switches/sec", null);

A context switch occurs when the kernel switches the processor from one thread to another—for example, when a thread with a higher priority than the running thread becomes ready. Context switching activity is important for several reasons. A program that monopolizes the processor lowers the rate of context switches because it does not allow much processor time for the other processes' threads. A high rate of context switching means that the processor is being shared repeatedly—for example, by many threads of equal priority. A high context-switch rate often indicates that there are too many threads competing for the processors on the system. The System\Context Switches/sec counter reports systemwide context switches.

 

2.4 CategoryName: Process

Each process provides the resources needed to execute a program. A process has a virtual address space, executable code, open handles to system objects, a security context, a unique process identifier, environment variables, a priority class, minimum and maximum working set sizes, and at least one thread of execution. Each process is started with a single thread, often called the primary thread, but can create additional threads from any of its threads.

A thread is the entity within a process that can be scheduled for execution. All threads of a process share its virtual address space and system resources. In addition, each thread maintains exception handlers, a scheduling priority, thread local storage, a unique thread identifier, and a set of structures the system will use to save the thread context until it is scheduled. The thread context includes the thread's set of machine registers, the kernel stack, a thread environment block, and a user stack in the address space of the thread's process. Threads can also have their own security context, which can be used for impersonating clients. (for more information  see "About Processes and Thread" http://msdn.microsoft.com/en-us/library/windows/desktop/ms681917%28v=vs.85%29.aspx)

 

PerformanceCounter("Process", "Thread Count", "_Total");

The number of threads created by the process. This counter does not indicate which threads are busy and which are idle. It displays the last observed value, not an average.

 

PerformanceCounter("Process", "Handle Count", "_Total");

the value reports the number of handles that processes opened for objects they create. Handles are used by programs to identify resources that they must access. The value of this counter tends to rise during a memory leak.

 

PerformanceCounter("Process", "Thread Count", "_Total");

the value reports over time how many threads the processes create.

 

2.5 CategoryName: System

 

PerformanceCounter("System", "Context Switches/sec", null);

A context switch occurs when the kernel switches the processor from one thread to another. A context switch might also occur when a thread with a higher priority than the running thread becomes ready or when a running thread must wait for some reason (such as an I/O operation). The Thread\Context Switches/sec counter value increases when the thread gets or loses the time of the processor.

 

PerformanceCounter("System", "System Calls/sec", null);

This is the number of system calls being serviced by the CPU per second. By comparing the Processor's Interrupts/sec with the System Calls/sec we can get a picture of how much effort the system requires to respond to attached hardware. On a healthy system, the Interrupts per second should be negligible in comparison to the number of System Calls per second. When the system has to repeatedly call interrupts for service, it's indicative of a hardware failure.

 

PerformanceCounter("System", "Processor Queue Length", null);

The System\Processor Queue Length counter is a rough indicator of the number of threads each processor is servicing.

 

3 Structure of the application to track Performance Counters

The basic structure of the application to track a set of PerfomanceCounter() is reported in figure:

 

Figure 1: main structure of application

The main purpose of application is catch a specific sample interval a list of Performance Counters.

When the main program starts, the first action is to read two XML files: SysField.XML file and app.config file. Behavior of application depends on parameter values stored in these two files.

Structured of SysField.XML is shown below:

<?xml version="1.0" encoding="utf-8" ?>

<AppValues>

<FolderPath>C:\SysParamsLog2\</FolderPath>

<FileName>Log.txt</FileName>

<WriteToLogFile>true</WriteToLogFile>

<MaxNumberRecordsInLogFile>30</MaxNumberRecordsInLogFile>

<PollingSysParamsInterval>1</PollingSysParamsInterval>

</AppValues>

 

SysField.XML file specifies all the parameters required to store the PerformanceCounter() values in a log file and the sampling time of performance counters. In particular:

   <FolderPath>: it is the folder where the application store the log file

   <FileName>: it is the filename fo the log file

   <WriteToLogFile>: it is a Boolean value that specify

   <MaxNumberRecordsInLogFile>: it is the max number of records stored in a single log file

   <PollingSysParamsInterval>: it is the sampling interval of PerformanceCounter()

To generate a log file per day, we need to set the MaxNumberRecordsInLogFile equal to:

MaxNumberRecordsInLogFile =(Second in a day)/ PollingSysParamsInterval

i.e.

if we sample every 1 second (PollingSysParamsInterval =1),  MaxNumberRecordsInLogFile =86400secondi/ (1 second)=86400

 

Using the parameters stored in app.config is possible to define which counters parameters we want to be include in the sampling and the structure of the performance counters (order).

The full structure of app.config is reported below:

 <?xml version="1.0"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
  </startup>
  <appSettings>
    <add key="SamplingTime" value="true" />
    <add key="NodeName" value="false" />
    <add key="CPUProcessorTime" value="true" />
    <add key="CPUPrivilegedTime" value="true" />
    <add key="CPUInterruptTime" value="true" />
    <add key="CPUDPCTime" value="true" />
    <add key="MEMAvailable" value="true" />
    <add key="MEMCommited" value="true" />
    <add key="MEMCommitLimit" value="true" />
    <add key="MEMCommitedPerc" value="true" />
    <add key="MEMPoolPaged" value="true" />
    <add key="MEMPoolNonPaged" value="true" />
    <add key="MEMCached" value="true" />
    <add key="PageFile" value="true" />
    <add key="ProcessorQueueLengh" value="true" />
    <add key="DISCQueueLengh" value="true" />
    <add key="DISKRead" value="true" />
    <add key="DISKWrite" value="true" />
    <add key="DISKAverageTimeRead" value="true" />
    <add key="DISKAverageTimeWrite" value="true" />
    <add key="DISKTime" value="true" />
    <add key="HANDLECountCounter" value="true" />
    <add key="THREADCount" value="true" />
    <add key="CONTENTSwitches" value="true" />
    <add key="SYSTEMCalls" value="true" />
    <add key="NumProcess" value="true" />
    <add key="NetTrafficSend" value="true" />
    <add key="NetTrafficReceive" value="true" />   
  </appSettings>
</configuration>

The meaning of key value is self-explanatory, and the value associated to every key is boolean:

  • the value equal to “true” means that value of the performance counter is tracked
  • the value equal to “false” means that value of the performance counter can be skipped   

When you compile your application, Visual Studio will automatically create a file called <your application name>.exe.config in your bin\debug folder. The contents of the app.config will be automatically copied to this new config file when you compile the application. When you deliver the application to the end user, you have to deliver the exe and this new config file called <your application name>.exe.config and NOT the app.config. Users can modify the data in <your application name>.exe.config file and application will read the data from the config file, when restarted. Change the order of (key,value) in app.config determines a different order of performance counter print out to the console and in log file.

The project use a public class named SysParams to store all the Performance counters.

  public class SysParams
    {
        public string NodeName { get; set; }
        public float CPUProcessorTime { get; set; }
        public float CPUPrivilegedTime { get; set; }
        public float CPUInterruptTime { get; set; }
        public float CPUDPCTime { get; set; }
        public float MEMAvailable { get; set; }
        public float MEMCommited { get; set; }
        public float MEMCommitLimit { get; set; }
        public float MEMCommitedPerc { get; set; }
        public float MEMPoolPaged { get; set; }
        public float MEMPoolNonPaged { get; set; }
        public float MEMCached { get; set; }
        public float PageFile { get; set; }
        public float ProcessorQueueLengh { get; set; }
        public float DISCQueueLengh { get; set; }
        public float DISKRead {get; set;}
        public float DISKWrite { get; set; }
        public float DISKAverageTimeRead { get; set; }
        public float DISKAverageTimeWrite { get; set; }
        public float DISKTime { get; set; }
        public float HANDLECountCounter { get; set; }
        public float THREADCount { get; set; }
        public int CONTENTSwitches { get; set; }
        public int SYSTEMCalls { get; set; }
        public float NetTrafficSend { get; set; }
        public float NetTrafficReceive { get; set; }      
        public DateTime SamplingTime { get; set; }

        private PerformanceCounter cpuProcessorTime = new PerformanceCounter("Processor", "% Processor Time", "_Total");
        private PerformanceCounter cpuPrivilegedTime = new PerformanceCounter("Processor", "% Privileged Time", "_Total");
        private PerformanceCounter cpuInterruptTime = new PerformanceCounter("Processor", "% Interrupt Time", "_Total");
        private PerformanceCounter cpuDPCTime = new PerformanceCounter("Processor", "% DPC Time", "_Total");
        private PerformanceCounter memAvailable = new PerformanceCounter("Memory", "Available MBytes", null);
        private PerformanceCounter memCommited = new PerformanceCounter("Memory", "Committed Bytes", null);
        private PerformanceCounter memCommitLimit = new PerformanceCounter("Memory", "Commit Limit", null);
        private PerformanceCounter memCommitedPerc = new PerformanceCounter("Memory", "% Committed Bytes In Use", null);
        private PerformanceCounter memPollPaged = new PerformanceCounter("Memory", "Pool Paged Bytes", null);
        private PerformanceCounter memPollNonPaged = new PerformanceCounter("Memory", "Pool Nonpaged Bytes", null);
        private PerformanceCounter memCached = new PerformanceCounter("Memory", "Cache Bytes", null);
        private PerformanceCounter pageFile = new PerformanceCounter("Paging File", "% Usage", "_Total");
        private PerformanceCounter processorQueueLengh = new PerformanceCounter("System", "Processor Queue Length", null);
        private PerformanceCounter diskQueueLengh = new PerformanceCounter("PhysicalDisk", "Avg. Disk Queue Length", "_Total");
        private PerformanceCounter diskRead = new PerformanceCounter("PhysicalDisk", "Disk Read Bytes/sec", "_Total");
        private PerformanceCounter diskWrite = new PerformanceCounter("PhysicalDisk", "Disk Write Bytes/sec", "_Total");
        private PerformanceCounter diskAverageTimeRead = new PerformanceCounter("PhysicalDisk", "Avg. Disk sec/Read", "_Total");
        private PerformanceCounter diskAverageTimeWrite = new PerformanceCounter("PhysicalDisk", "Avg. Disk sec/Write", "_Total");
        private PerformanceCounter diskTime = new PerformanceCounter("PhysicalDisk", "% Disk Time", "_Total");
        private PerformanceCounter handleCountCounter = new PerformanceCounter("Process", "Handle Count", "_Total");
        private PerformanceCounter threadCount = new PerformanceCounter("Process", "Thread Count", "_Total");
        private PerformanceCounter contentSwitches = new PerformanceCounter("System", "Context Switches/sec", null);
        private PerformanceCounter systemCalls = new PerformanceCounter("System", "System Calls/sec", null);
        private PerformanceCounterCategory performanceNetCounterCategory;
        private PerformanceCounter[] trafficSentCounters;
        private PerformanceCounter[] trafficReceivedCounters;
        private string[] interfaces = null;

        public void initNetCounters()
        {
            // PerformanceCounter(CategoryName,CounterName,InstanceName)
            performanceNetCounterCategory = new PerformanceCounterCategory("Network Interface");
            interfaces = performanceNetCounterCategory.GetInstanceNames();

            int length = interfaces.Length;

            if (length > 0)
            {
                trafficSentCounters = new PerformanceCounter[length];
                trafficReceivedCounters = new PerformanceCounter[length];
            }

            for (int i = 0; i < length; i++)
            {
                // Initializes a new, read-only instance of the PerformanceCounter class.
                // 1st paramenter: "categoryName"-The name of the performance counter category (performance object) with which
                //                                this performance counter is associated.
                // 2nd paramenter: "CounterName" -The name of the performance counter.
                // 3rd paramenter: "instanceName" -The name of the performance counter category instance, or an empty string (""), if the category contains a single instance.
                trafficReceivedCounters[i] = new PerformanceCounter("Network Interface", "Bytes Sent/sec", interfaces[i]);
                trafficSentCounters[i] = new PerformanceCounter("Network Interface", "Bytes Sent/sec", interfaces[i]);
            }

            // List of all names of the network interfaces
            for (int i = 0; i < length; i++)
            {
                Console.WriteLine("Name netInterface: {0}", performanceNetCounterCategory.GetInstanceNames()[i]);
            }
        }
        public void getProcessorCpuTime()
        {
            float tmp = cpuProcessorTime.NextValue();
            CPUProcessorTime = (float)(Math.Round((double)tmp, 1));
            // Environment.ProcessorCount: return the total number of cores
            //            CPUProcessorTime = cpuProcessorTime.NextValue() / Environment.ProcessorCount;
        }

        public void getCpuPrivilegedTime()
        {
            float tmp = cpuPrivilegedTime.NextValue();
            CPUPrivilegedTime = (float)(Math.Round((double)tmp, 1));
        }

        public void getCpuinterruptTime()
        {
            float tmp = cpuInterruptTime.NextValue();
            CPUInterruptTime = (float)(Math.Round((double)tmp, 1));
        }

        public void getcpuDPCTime()
        {
            float tmp = cpuDPCTime.NextValue();
            CPUDPCTime = (float)(Math.Round((double)tmp, 1));
        }

        public void getPageFile()
        {
            PageFile = pageFile.NextValue();
        }

        public void getProcessorQueueLengh()
        {
            ProcessorQueueLengh = processorQueueLengh.NextValue();
        }

        public void getMemAvailable()
        {
            MEMAvailable = memAvailable.NextValue();
        }

        public void getMemCommited()
        {
            
            MEMCommited = memCommited.NextValue() / (1024 * 1024);
        }
        public void getMemCommitLimit()
        {
            
            MEMCommitLimit = memCommitLimit.NextValue() / (1024 * 1024);
        }
        public void getMemCommitedPerc()
        {
            float tmp = memCommitedPerc.NextValue();
            // return the value of Memory Commit Limit
            MEMCommitedPerc = (float)(Math.Round((double)tmp, 1));
        }

        public void getMemPoolPaged()
        {
            float tmp = memPollPaged.NextValue() / (1024 * 1024);
            MEMPoolPaged = (float)(Math.Round((double)tmp, 1));
        }
        public void getMemPoolNonPaged()
        {
            float tmp = memPollNonPaged.NextValue() / (1024 * 1024);
            MEMPoolNonPaged = (float)(Math.Round((double)tmp, 1));
        }

        public void getMemCachedBytes()
        {   // return the value of Memory Cached in MBytes
            MEMCached = memCached.NextValue() / (1024 * 1024);
        }

        public void getDiskQueueLengh()
        {
            DISCQueueLengh = diskQueueLengh.NextValue();
        }

        public void getDiskRead()
        {
            float tmp=diskRead.NextValue()/1024;
            DISKRead = (float)(Math.Round((double)tmp,1));
        }
        public void getDiskWrite()
        {
            float tmp=diskWrite.NextValue()/1024;
            // round 1 digit decimal
            DISKWrite = (float)(Math.Round((double)tmp,1));
        }

        public void getDiskAverageTimeRead()
        {
            float tmp = diskAverageTimeRead.NextValue() * 1000;
            // round 1 digit decimal
            DISKAverageTimeRead = (float)(Math.Round((double)tmp, 1));
        }
        public void getDiskAverageTimeWrite()
        {
            float tmp = diskAverageTimeWrite.NextValue()*1000;
            // round 1 digit decimal
            DISKAverageTimeWrite = (float)(Math.Round((double)tmp, 1));
        }
        public void getDiskTime()
        {
            float tmp = diskTime.NextValue();
            DISKTime = (float)(Math.Round((double)tmp, 1));
        }


        public void getHandleCountCounter()
        {
            HANDLECountCounter = handleCountCounter.NextValue();
        }
        public void getThreadCount()
        {
            THREADCount = threadCount.NextValue();
        }
        public void getContentSwitches()
        {
            // convert to integer
            CONTENTSwitches = (int)Math.Ceiling(contentSwitches.NextValue());
        }
        public void getsystemCalls()
        {
            // convert to integer
            SYSTEMCalls = (int)Math.Ceiling(systemCalls.NextValue());
        }

        public void getCurretTrafficSent()
        {
            int length = interfaces.Length;
            float sendSum = 0.0F;

            for (int i = 0; i < length; i++)
            {
                sendSum += trafficSentCounters[i].NextValue();
            }
            float tmp = 8 * (sendSum / 1024);
            NetTrafficSend = (float)(Math.Round((double)tmp, 1));
        }
        public void getCurretTrafficReceived()
        {
            int length = interfaces.Length;
            float receiveSum = 0.0F;

            for (int i = 0; i < length; i++)
            {
                receiveSum += trafficReceivedCounters[i].NextValue();
            }
            float tmp = 8 * (receiveSum / 1024);
            NetTrafficReceive = (float)(Math.Round((double)tmp, 1));

        }
 
        public void getSampleTime()
        {
            SamplingTime = DateTime.Now;
        }
    }

 A description of program workflow is reported in figure 2 and figure 3

 

Figure 2: program workflow

 

 

Figure 3: program workflow

 You can run the program on your Window 8 laptop or Azure IaaS VM with Windows 2012 R2 (you do not need to install any further package, transfer the list of files under the binary folder and run it).

Here how look like a typical output:

 

Figure 4: Performance counters parameters on the console

Program has small CPU impact; on Azure IaaS VM –A1 (basic tier) with Windows 2012 R2 the CPU consumption is between 1% and 5% as shown in figure 4 and figure 5.

 

Figure 5: CPU consumption of program

 

  Figure 6: CPU consumption of program

To control the record format stored in log file we can change the content in app.config file

 

3.1 Tracking CPU and Network performance counters only

 To monitor the CPU and network traffic counters is enough to change the app.config file structure:

 <?xml version="1.0"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
  </startup>
  <appSettings>
    <add key="SamplingTime" value="true" />
    <add key="NodeName" value="false" />
    <add key="CPUProcessorTime" value="true" />
    <add key="CPUPrivilegedTime" value="true" />
    <add key="CPUInterruptTime" value="true" />
    <add key="CPUDPCTime" value="true" />
    <add key="MEMAvailable" value="false" />
    <add key="MEMCommited" value="false" />
    <add key="MEMCommitLimit" value="false" />
    <add key="MEMCommitedPerc" value="false" />
    <add key="MEMPoolPaged" value="false" />
    <add key="MEMPoolNonPaged" value="false" />
    <add key="MEMCached" value="false" />
    <add key="PageFile" value="false" />
    <add key="ProcessorQueueLengh" value="false" />
    <add key="DISCQueueLengh" value="false" />
    <add key="DISKRead" value="false" />
    <add key="DISKWrite" value="false" />
    <add key="DISKAverageTimeRead" value="false" />
    <add key="DISKAverageTimeWrite" value="false" />
    <add key="DISKTime" value="false" />
    <add key="HANDLECountCounter" value="false" />
    <add key="THREADCount" value="false" />
    <add key="CONTENTSwitches" value="false" />
    <add key="SYSTEMCalls" value="false" />
    <add key="NumProcess" value="false" />
    <add key="NetTrafficSend" value="true" />
    <add key="NetTrafficReceive" value="true" />   
  </appSettings>
</configuration>

 or differently we can cut out all the pairs (key, value) that we do not want to track:

 <?xml version="1.0"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
  </startup>
  <appSettings>
    <add key="SamplingTime" value="true" />
    <add key="NodeName" value="false" />
    <add key="CPUProcessorTime" value="true" />
    <add key="CPUPrivilegedTime" value="true" />
    <add key="CPUInterruptTime" value="true" />
    <add key="CPUDPCTime" value="true" />
    <add key="NetTrafficSend" value="true" />
    <add key="NetTrafficReceive" value="true" />   
  </appSettings>
</configuration>

 

we get a log file look like:

Sampling
  Time

CPU time %

CPU Privileged %

CPU Interrupt %

CPU deferred %

NetTrafficSent

(kbps)

NetTrafficRecv

(kbps)

2014-11-20-18.35.28

0

0

0

0

0

0

2014-11-20-18.35.29

20

5

0

0

26.5

27.1

2014-11-20-18.35.30

10.4

1.5

0

0

41.7

69.5

2014-11-20-18.35.31

2.7

1.5

0

0

72.3

43.3

2014-11-20-18.35.32

4.5

3

0

0

34.6

34.7

2014-11-20-18.35.33

36

11.9

0

0

424.1

424.3

2014-11-20-18.35.34

1.7

3

0

0

219

218.2

2014-11-20-18.35.35

19.5

11.9

0

1.5

48.5

48.5

2014-11-20-18.35.36

21.8

15

0

1.5

43.2

43.4

2014-11-20-18.35.37

0.7

1.5

0

0

21.7

23.5

2014-11-20-18.35.38

11.8

7.3

0

0

31.1

29.5

2014-11-20-18.35.39

4.7

3

0

0

22.8

22.7

2014-11-20-18.35.40

1.6

1.5

0

0

15.3

15.3

2014-11-20-18.35.41

5.2

3

0

0

29

28.9

2014-11-20-18.35.42

2.2

1.5

0

0

28.4

28.5

2014-11-20-18.35.43

6.6

4.5

0

0

27.5

27.3

2014-11-20-18.35.44

6.3

3

0

0

23.9

24

2014-11-20-18.35.45

7.6

3

0

0

25.7

25.8

2014-11-20-18.35.46

1.1

0

0

0

22.4

22.3

2014-11-20-18.35.48

5.6

2.9

0

0

20.9

20.9

 

To change the sequence of performance counters in the log file is enough to change the order in app.config

<?xml version="1.0"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
  </startup>
  <appSettings>
    <add key="SamplingTime" value="true" />
    <add key="NodeName" value="false" />
    <add key="NetTrafficSend" value="true" />
    <add key="NetTrafficReceive" value="true" />
    <add key="CPUProcessorTime" value="true" />
    <add key="CPUPrivilegedTime" value="true" />
    <add key="CPUInterruptTime" value="true" />
    <add key="CPUDPCTime" value="true" />   
  </appSettings>
</configuration>

To reset the default parameters of app.config you can delete the file or set the content to:

<?xml version="1.0"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
  </startup>
  <appSettings>
  </appSettings>
</configuration>

 

4 Azure Files to store performance counter log of multiple Azure Windows VM

If we want to Tracking Performance Counters on single Azure Windows VM, it is enough to copy the binary in the Azure windows VM and run it.

Azure Files is a great feature that exposes file shares using the standard SMB 2.1 protocol.  As pointed out from the Azure storage product team an Azure File share can also be used to save diagnostic files like logs, metrics, and crash dumps. Multiple Azure VMs can mount the same file share an write the log file in different folders.

The diagram in Figure 7 shows how to use Azure File as repository of Performance counters log files generated from different Azure VMs.

 

Figure 7: store Performance Counters log files in Azure File

Azure File can be defined through Azure powershell with simple basic command:

Import-Module Azure
Select-AzureSubscription –SubscriptionName [[SubscriptionName]]
Get-AzureSubscription –current
New-AzureStorageAccount -StorageAccountName [[AzureStorageAccountName]] -Label [[AzureStorageAccountName]] -Location "North Europe“

# To find out the version of the module you're using
(get-module azure).version

$ctx=New-AzureStorageContext <account name> <account key>
$ctx = New-AzureStorageContext -StorageAccountName [[AzureStorageAccountName]] -StorageAccountKey [[AzureStorageAccountKey]]

# create a new share
$s = New-AzureStorageShare <share name> -Context $ctx

 In our case we define a share name equal to “logshare1”:

$s = New-AzureStorageShare logshare1 -Context $ctx

 

To mount the shared folder in the Azure Windows VM we can use the command in both azure Windows VMs:

 

net use z: \\[[AzureStorageAccountName]].file.core.windows.net\logshare1 /u:[[AzureStorageAccountName]] [[AzureStorageAccountKey]]

 

This command mount the shared folder “logshare1” of Azure Storage account as driver Z:

To store the log files in different folder we can change the value <FolderPath> in  SysField.XML file

 

Content of SysField.XML file in test01 Azure VM:

<?xml version="1.0" encoding="utf-8" ?>

<AppValues>

<FolderPath>Z:\SysParamsLog1\</FolderPath>

<FileName>fftest01.txt</FileName>

<WriteToLogFile>true</WriteToLogFile>

<MaxNumberRecordsInLogFile>20</MaxNumberRecordsInLogFile>

<PollingSysParamsInterval>1</PollingSysParamsInterval>

</AppValues>

 

Content of SysField.XML file in test02 Azure VM:

<?xml version="1.0" encoding="utf-8" ?>

<AppValues>

<FolderPath>Z:\SysParamsLog2\</FolderPath>

<FileName>fftest02.txt</FileName>

<WriteToLogFile>true</WriteToLogFile>

<MaxNumberRecordsInLogFile>20</MaxNumberRecordsInLogFile>

<PollingSysParamsInterval>1</PollingSysParamsInterval>

</AppValues>

 You can download the SysParams project here:

SysParams.zip

 

5 Reference

PhysicalDisk Object: http://msdn.microsoft.com/en-us/library/ms804035.aspx

Monitoring Threads: http://technet.microsoft.com/en-us/library/cc776966(v=ws.10).aspx

Memory Object: http://msdn.microsoft.com/en-us/library/ms804008.aspx

http://blogs.technet.com/b/askcore/archive/2012/03/16/windows-performance-monitor-disk-counters-explained.aspx

 

My first post

MSDN Blogs - Thu, 11/20/2014 - 07:04

Hello Everyone!

This first blog post is more of a test for me since this is my first blog.  I hope to continue posting on this over time with some additional tips, tricks and information about AX for Retail that I want to share with the greater community.

A little about me:

I have been working with AX since 2004.   I have spent my entire career working in the retail industry.   I started out working in retail operations at various retail and direct-to-consumer catalog companies.  I moved into the technology world in 1999 with another retail software company.   In 2004 I started working with AX and have always focused my attention to building out solutions on AX for retail organizations.   I was a product manager for many years and built a lot of IP for AX in the retail and Omni-channel order management space.   Now I work at Microsoft as a pre-sales specialist on the National Retail team.   On a daily basis I am working with the AX Retail product and helping to evangelize the benefits of the platform to retailers all over the country. 

Since I have spent so many years working with AX and in the retail industry, I wanted to create this blog as a place to share some thoughts, ideas and tips.  Before Microsoft acquired all of the various IP solutions and released their first version of a retail solution in AX back in 2009, I had already been out in the field working with and writing specs/product managing many of the products that were acquired by Microsoft.  I want to utilize my years of product and industry experience to hopefully share additional information about our retail solutions and ideas to help you better implement or sell the solution.

That's all for now - in my next post I plan to review some of the new Call Center capabilities of R3!!!

-Holly

 

A library loaded via LOAD_LIBRARY_AS_DATAFILE (or similar flags) doesn't get to play in any reindeer module games

MSDN Blogs - Thu, 11/20/2014 - 07:00

If you load a library with the LOAD_LIBRARY_AS_DATA­FILE flag, then it isn't really loaded in any normal sense. In fact, it's kept completely off the books.

If you load a library with the LOAD_LIBRARY_AS_DATA­FILE, LOAD_LIBRARY_AS_DATA­FILE_EXCLUSIVE, or LOAD_LIBRARY_AS_IMAGE_RESOURCE flag (or any similar flag added in the future), then the library gets mapped into the process address space, but it is not a true module. Functions like Get­Module­Handle, Get­Module­File­Name, Enum­Process­Modules and Create­Toolhelp32­Snapshot will not see the library, because it was never entered into the database of loaded modules.

These "load library as..." flags don't actually load the library in any meaningful sense. They just take the file and map it into memory manually without updating any module tracking databases. This functionality was overloaded into the Load­Library­Ex function, which in retrospect was probably not a good idea, because people expect Load­Library­Ex to create true modules, but these flags create pseudo-modules, a term I made up just now.

It would have been less confusing in retrospect if the "load library as..." functionality were split into another function like Load­File­As­Pseudo­Module. Okay, that's a pretty awful name, but that's not the point. The point is to put the functionality in some function that doesn't have the word library in its name.

Okay, so now that we see that these pseudo-modules aren't true modules, and they don't participate in any reindeer module games. So what use are they?

Basically, the only thing you can do with a pseudo-module is access its resources with functions like Find­Resource, Load­Resource, and Enum­Resource­Types. Note that this indirectly includes functions like Load­String, and Format­Message which access resources behind the scenes.

So maybe a better name for the function would have been Load­File­For­Resources, since that's all the pseudo-module is good for.

Die Microsoft Showcase Schulen und Expert Educators stehen fest

MSDN Blogs - Thu, 11/20/2014 - 06:28

Weltweit bereichern engagierte Lehrkräfte und Schulleiter Unterricht und Schulalltag durch den Einsatz von Technologie. Für sie rief Microsoft die Programme "Expert Educators" und "Showcase Schulen" ins Leben. Jetzt stehen die Teilnehmer für das Schuljahr 2014/2015 fest.

Auf dem Microsoft in Education Global Forum in Miami/Florida Anfang November verkündete Microsoft die neue Gruppe der Showcase Schulen und Expert Educators für das Jahr 2014/2015. Insgesamt wurden mehr als 150 Schulen und über 800 Pädagoginnen und Pädagogen aus aller Welt für die exklusiven einjährigen Unterstützungsprogramme von unabhängigen Juroren ausgewählt. Besonders freuen wir uns darüber, dass dieses Jahr sechs Schulen und 29 Lehrerinnen und Lehrer aus Deutschland darunter sind. Sie haben mit ihren Bewerbungen überzeugend dargestellt, dass sie eine klare Vorstellung davon haben, wie sie ihre Schule und ihren Unterricht durch den Einsatz von Informations- und Kommunikationstechnologien entwickeln und innovative Lernumgebung schaffen wollen.

Als Teil dieser exklusiven weltweiten Community werden sie in 2014/2015 eng mit Microsoft zusammenarbeiten, ihre Ideen und neuen Ansätze zur Integration neuer Medien in den Schulalltag mit Kolleginnen und Kollegen aus aller Welt teilen und damit zu Vorbildern und Unterstützern für andere Lehrkräfte und Schulen werden.

"Die Microsoft Expert Educators und Showcase Schulen sind inspirierende Beispiele dafür, wie mit dem Einsatz von Technologie die Produktivität der Lernenden erhöht und die für das Arbeitsleben notwendigen Fähigkeiten entwickelt werden können", betont Anthony Salcito; Vice President Worldwide Education Microsoft Corporation. "Mit der innovativen Verwendung von Technologien verändern diese Lehrkräfte und Schulen Lernumgebungen und bieten dadurch ihren Schülerinnen und Schülern ein individuelleres Lernen, das ihnen erlaubt, mehr zu tun und mehr zu erreichen".

Die Showcase Schulen 2014/2015 aus Deutschland sind:
     Erich-Gutenberg-Berufskolleg (Köln)
     Hermann-Nohl-Schule (Berlin)
     Internatsschule Schloss Neubeuern
     Landesschule Pforta (Naumburg)
     Berufskolleg Hattingen
     Erich-Kästner Schule (Bochum)

Die Expert Educators 2014/2015 aus Deutschland sind:
Frauke Amberg, Martin Beer, Christian Burek, Thomas Dahnke, Marion Emig, Felix Fähnrich, Michael Fees, Ute Feller, Holger Fröhlich, Sebastian Görlitz, Miriam Gronert, David Grosvenor, Jasmin Gülland, Andreas Hermes, Sebastian Holberg, Christian Hoppe, Tobias Huebner, Tanya Kaya, Monika Kirchner, Frank Kisser, Witold Lohmann, Jürgen Möller, Heike Proviak, Frank Röhr, Jennifer Schatz, Heinz-Peter Schmitz, Detlef Steppuhn, Carsten Thein, Sercin Zorlu.

Weitere Informationen zu den deutschen Expert Educators und zu den Showcase Schulen finden Sie auf unserem Partners in Learning Portal und im Blogpost von Anthony Salcito, Vice President Worldwide Education bei Microsoft.

Special Offers from Visual Studio Partners

MSDN Blogs - Thu, 11/20/2014 - 06:06

Last week at our Connect(); event in New York City, we made some big announcements regarding our ecosystem from a developer as well as a partner point of view.  In addition to those announcements, I wanted to call your attention to special offers for MSDN subscribers from some of our top Visual Studio partners.  You can also check out this short video on Channel 9 to learn more about the partner ecosystem and these great offers. 

These offers are live on the MSDN Special offers page and include:

 

Connect LeanKit Kanban boards to a VSO account

Offer: 20% off annual LeanKit subscription for Visual Studio Online.

Generate formal requirements from Office products

Offer: SmartOffice4TFS new family member: RequirementsToolkit4TFS. Get it for 30% off.  Migrate on-premise TFS and other ALM products to VSO

Offer: Get OpsHub Quick Start Package for only US$9,999.  Test on a real device in the cloud, issues show up as Work items in VSO

Offer: Improve Quality and Speed Up Your Mobile App Test Cycles on Real Devices in the Cloud.  Analytics Workbench hosted in Azure for all types of apps

 

Offer: Our Chance at a First Impression. 30% off of PreEmptive Analytics App Launch Service.  Sync and integration of VSO with Jira and 23 other products

Offer: Up to 85% off Tasktop Integration for TFS and VS Online.

Trigger VSO builds of .NET and other apps in TeamCity

Offer: 50% off New TeamCity Enterprise Server Licenses.

Integrate community feedback into VSO

Offer: 50% off all UserVoice plans for the 1st year.  Real-time interactive sharing of VSO backlogs, code reviews, builds, test, deployment etc.

Offer: 2 Months FREE VS Anywhere for Visual Studio from Azure Store.

Whether you are an ISV who wants to integrate a product of service with Visual Studio or Visual Studio Online, or if you are a developer or customer who wants to take advantage of these great special offers, here are some links that you will find useful.

 

Thanks,

Brian

Cumulative Update 8 para Microsoft Dynamics AX 2012 R3 disponible!

MSDN Blogs - Thu, 11/20/2014 - 05:55
¿Qué está incluido en CU8

CU8 para AX 2012 R3 incluye:

Cómo instalar CU8

Para comenzar con la instalación de CU8, siga estos pasos:

  1. Revise los Requisitos del sistema para asegurarse de que su entorno soporta CU8.
  2. Descargar CU8 en la sección Revisión descarga disponible en la página de descarga CU8.
  3. Instalar CU8 siguiendo las instrucciones paso a paso en la Guía de instalación de Microsoft Dynamics AX 2012 R3 acumulativa actualización 8.

Завтра в 10:00 (МСК) смотрите трансляцию конференции Russian App Day

MSDN Blogs - Thu, 11/20/2014 - 05:39


21 ноября в 10:00 (МСК) подключайтесь к трансляции конференции Russian App DayБеседы о будущем технологий. Мы расскажем всё про мобильные тренды и возможности для бизнеса.

#AppDay – новое индустриальное мероприятие о приложениях, облачных и мобильных технологиях, организуемое Microsoft при поддержке РАЭК и Apps4All. От ведущих экспертов индустрии вы узнаете обо всех популярных платформах (iOS, Android и Windows) и развитии экосистемы мобильных приложений в России в целом, о растущих трендах и возможных направлениях развития в будущем.


В треке «Новый бизнес» эксперты индустрии расскажут о том, как развиваются различные отрасли в контексте адаптации мобильных платформ. В программе мероприятия: уникальные лекции и беседы о новом телевидении и новых медиа, трансформациях рынка телекома и платежных сервисов, развитии банков и ритейла, а также новых возможностях для малого бизнеса. 
Среди приглашенных экспертов: 

  • Алексей Пивоваров – Директор направления ТВ и трансмедийных проектов СТС Медиа,
  • Софья Соколова – ректор Школы новых медиа и главный редактор портала Звуки.ру,
  • Илья Макаров – менеджер проектов группы развития бесконтактных платежей МТС,
  • Федор Овчинников – основатель инновационной пиццерии «Додо Пицца»,
  • Егор Дроздов – руководитель проектов ДИТ г. Москвы.



Доклады трека «Тренды приложений» посвящены всем аспектам растущего рынка мобильных приложений, начиная с продвижения бренда с помощью приложений, и заканчивая тем, что нас ждет в будущем – интерактивная среда и умные устройства, соединенные с облаком. Хотите знать, что думают лидеры рынка? 

Приходите слушать:

  • Всеволода Леонова – Директора по партнерским программам Google,
  • Александра Круглова – Директора по работе с клиентами Вконтакте,
  • Дарью Золотухину – руководителя отдела маркетинга Яндекс.Такси,
  • Дмитрия Халина – Директора департамента технологической политики Microsoft,
  • Дмитрия Карпова – куратора курса «Дизайн в интерактивной среде» Британской высшей школы дизайна.



И это лишь малая часть приглашенных экспертов! Полная программа конференции по ссылке.
Во время трансляции смотрите прямые включения с интерактивной выставки конференции и специального трека для детей, а также интервью с ключевыми спикерами и участниками конференции. Подробнее об участниках выставки читайте здесь.


Ждем вас на трансляции 21 ноября в 10:00!

www.russianappday.ru
#appday

Skitch Touch in Education – articulating thoughts through image annotation

MSDN Blogs - Thu, 11/20/2014 - 05:30

Expressing arguments with Skitch Touch

A vital skill that high school, college and even university students sometimes struggle with is expressing their opinions and arguments in an academic context. Not everyone has a supple handling of words and so for some students, having the tool to express their arguments visually could be really effective.

Skitch Touch is an app developed for touch devices that enables students to annotate photos, screen grabs and maps and to create their own illustrations. It can even be used by students to visually illustrate their understanding of academic processes by recording their annotations! You can choose different pen colours and sizes to draw squiggles and rough sketches and there are also inbuilt fonts and shapes to annotate content.

There are a number of ways this could be used academically:

University

For modules where students have to analyse theoretical frameworks, such as Maths, Philosophy or Psychology, Skitch Note would give students a simple environment to screen-grab a framework and then annotate it with arrows and text. From a marking perspective, the interpreted framework would make it clearer for the professor to make sense of the students' written argument if their English or grammar weren't brilliant, which would give the student a better chance at getting a higher mark. I could see this being particularly attractive to international students who are less apt with their written English.

College

For those vocational college courses such as engineering, sports science or cooking, students would also have the tools to be able to make their own edits on diagrams or recipes from online sources, through effortlessly screen-grabbing the source in Skitch Touch. On another level, if they had to design proto-types and models in a subject like engineering or fashion, the opportunity would be there for them to digitally integrate sketches into submissions or proposals by taking a photo of that illustration through Skitch Touch and adding diagrammatical measurements with the arrow tools. Of course, they could include measurements in the sketch, but the advantage of annotating with Skitch Touch is that it gives work a more polished, professional finish

School

For final year students at primary school, Skitch Touch would provide a fun environment to develop their abilities of expressing themselves, with the novelty of annotating work in a touch-enabled environment. Whether it be a science or geography lesson, it would simplify the challenge of analysing and interpreting content in purely written words, and add a visual learning experience. To illustrate this idea in a geography lesson, a picture of the map of the world could be annotated to show for example which countries of the world have the highest populations and what the populations are, using the text and annotate features.

At high school level, subjects which involve a lot of memory-work such as Biology can be daunting to students who don't naturally find it easy to recall lots of content. Skitch Touch can provide an interactive environment for students to learn about a subject area, such as the heart in the image below, and help melt the perceived difficulty of the challenge at hand, making it more fun. The beauty of the app is that when learning complex processes such as the circulation system, students can record their visual interpretation of how the heart and circulation system works, and then save the video and share it with their teacher to get feedback of their interpretation.

To learn more about the features and functions of Skitch Touch in a learning environment, look at the videos below, and download Skitch Touch for free. You can find out about more Windows 8.1 apps for education here.

Skitch Touch in Education – articulating thoughts through image annotation

MSDN Blogs - Thu, 11/20/2014 - 05:30

Expressing arguments with Skitch Touch

A vital skill that high school, college and even university students sometimes struggle with is expressing their opinions and arguments in an academic context. Not everyone has a supple handling of words and so for some students, having the tool to express their arguments visually could be really effective.

Skitch Touch is an app developed for touch devices that enables students to annotate photos, screen grabs and maps and to create their own illustrations. It can even be used by students to visually illustrate their understanding of academic processes by recording their annotations! You can choose different pen colours and sizes to draw squiggles and rough sketches and there are also inbuilt fonts and shapes to annotate content.

There are a number of ways this could be used academically:

University

For modules where students have to analyse theoretical frameworks, such as Maths, Philosophy or Psychology, Skitch Note would give students a simple environment to screen-grab a framework and then annotate it with arrows and text. From a marking perspective, the interpreted framework would make it clearer for the professor to make sense of the students' written argument if their English or grammar weren't brilliant, which would give the student a better chance at getting a higher mark. I could see this being particularly attractive to international students who are less apt with their written English.

College

For those vocational college courses such as engineering, sports science or cooking, students would also have the tools to be able to make their own edits on diagrams or recipes from online sources, through effortlessly screen-grabbing the source in Skitch Touch. On another level, if they had to design proto-types and models in a subject like engineering or fashion, the opportunity would be there for them to digitally integrate sketches into submissions or proposals by taking a photo of that illustration through Skitch Touch and adding diagrammatical measurements with the arrow tools. Of course, they could include measurements in the sketch, but the advantage of annotating with Skitch Touch is that it gives work a more polished, professional finish

School

For final year students at primary school, Skitch Touch would provide a fun environment to develop their abilities of expressing themselves, with the novelty of annotating work in a touch-enabled environment. Whether it be a science or geography lesson, it would simplify the challenge of analysing and interpreting content in purely written words, and add a visual learning experience. To illustrate this idea in a geography lesson, a picture of the map of the world could be annotated to show for example which countries of the world have the highest populations and what the populations are, using the text and annotate features.

At high school level, subjects which involve a lot of memory-work such as Biology can be daunting to students who don't naturally find it easy to recall lots of content. Skitch Touch can provide an interactive environment for students to learn about a subject area, such as the heart in the image below, and help melt the perceived difficulty of the challenge at hand, making it more fun. The beauty of the app is that when learning complex processes such as the circulation system, students can record their visual interpretation of how the heart and circulation system works, and then save the video and share it with their teacher to get feedback of their interpretation.

To learn more about the features and functions of Skitch Touch in a learning environment, look at the videos below, and download Skitch Touch for free. You can find out about more Windows 8.1 apps for education here.

Skitch Touch in Education – articulating thoughts through image annotation

MSDN Blogs - Thu, 11/20/2014 - 05:30

Expressing arguments with Skitch Touch

A vital skill that high school, college and even university students sometimes struggle with is expressing their opinions and arguments in an academic context. Not everyone has a supple handling of words and so for some students, having the tool to express their arguments visually could be really effective.

Skitch Touch is an app developed for touch devices that enables students to annotate photos, screen grabs and maps and to create their own illustrations. It can even be used by students to visually illustrate their understanding of academic processes by recording their annotations! You can choose different pen colours and sizes to draw squiggles and rough sketches and there are also inbuilt fonts and shapes to annotate content.

There are a number of ways this could be used academically:

University

For modules where students have to analyse theoretical frameworks, such as Maths, Philosophy or Psychology, Skitch Note would give students a simple environment to screen-grab a framework and then annotate it with arrows and text. From a marking perspective, the interpreted framework would make it clearer for the professor to make sense of the students' written argument if their English or grammar weren't brilliant, which would give the student a better chance at getting a higher mark. I could see this being particularly attractive to international students who are less apt with their written English.

College

For those vocational college courses such as engineering, sports science or cooking, students would also have the tools to be able to make their own edits on diagrams or recipes from online sources, through effortlessly screen-grabbing the source in Skitch Touch. On another level, if they had to design proto-types and models in a subject like engineering or fashion, the opportunity would be there for them to digitally integrate sketches into submissions or proposals by taking a photo of that illustration through Skitch Touch and adding diagrammatical measurements with the arrow tools. Of course, they could include measurements in the sketch, but the advantage of annotating with Skitch Touch is that it gives work a more polished, professional finish

School

For final year students at primary school, Skitch Touch would provide a fun environment to develop their abilities of expressing themselves, with the novelty of annotating work in a touch-enabled environment. Whether it be a science or geography lesson, it would simplify the challenge of analysing and interpreting content in purely written words, and add a visual learning experience. To illustrate this idea in a geography lesson, a picture of the map of the world could be annotated to show for example which countries of the world have the highest populations and what the populations are, using the text and annotate features.

At high school level, subjects which involve a lot of memory-work such as Biology can be daunting to students who don't naturally find it easy to recall lots of content. Skitch Touch can provide an interactive environment for students to learn about a subject area, such as the heart in the image below, and help melt the perceived difficulty of the challenge at hand, making it more fun. The beauty of the app is that when learning complex processes such as the circulation system, students can record their visual interpretation of how the heart and circulation system works, and then save the video and share it with their teacher to get feedback of their interpretation.

To learn more about the features and functions of Skitch Touch in a learning environment, look at the videos below, and download Skitch Touch for free. You can find out about more Windows 8.1 apps for education here.

Evolving ASP.NET Apps – Updating jQuery

MSDN Blogs - Thu, 11/20/2014 - 04:40

This post is a continuation of the Evolving ASP.NET series:

Evolving ASP.NET Apps - Introduction
Evolving ASP.NET Apps – Evaluating the Code
Evolving ASP.NET Apps – Moving to a Web Application
Evolving ASP.NET Apps – Dealing with Dependencies
Evolving ASP.NET Apps – Updating Search

jQuery was a revolution in how we use JavaScript. I'm not at all surprised to see that jQuery is included in BugTracker.Net.  As we discussed in section 2 there are a number of different versions of jQuery included in the project.

- jquery-1.3.2.min.js
- jquery-1.8.2.min.js
- jquery-1.9.0.min.js

We would like to cut that down to a single, up to date, version. The latest version of jQuery, as of writing, is either 1.11.1 or 2.1.1.  About a year ago the jQuery foundation decided to branch jQuery into to two versions. The 1.X branch is designed to work on older versions of Internet Explorer up until IE8. The 2.X branch drops a lot of the dirty code that was needed to support old browsers. The uncompressed version of the 2.x branch is about 30 kib larger than the 1.x version as a result.

So now we have a decision to make: do we want to support older versions of Internet Explorer? It is a tough decision. If you're working on updating a production website then you can take a look at the logs to see which browsers are the most prevalent. That should give you some foundation on which to make a decision.

We don't have a production website at the moment so we don't have the best data available on which to make a decision. There are plenty of sites out there with browser statistics. The vary greatly from site to site and from region to region. For instance IE is very popular in South Korea due to government websites requiring it. Google and a number of other large companies have adopted a last two version policy. As IE 11 is the latest this would mean that IE 10 would be the oldest browser we would support.

Because of the general age of the code base I think it likely that some of the users will still be on older software. We'll stick with the 1.X branch for now but keep an eye on stats to see when we can upgrade.

Let's start by taking a look at how well used jQuery is before we start upgrading. The jQuery site suggests using a migration plugin for updating older code bases. If the usage of jQuery is sufficiently basic then there may be no need to do so.

jQuery Usage

Weirdly the lack of master pages on the site is actually very helpful to us. Had the jQuery been included on a master page we would have had to check every part of the site. As it stands jQuery is only included in 10 files. This limits our search greatly. In fact there is no reference to the 1.9.0 version of jQuery so we can delete that right away.

The reset of the references seem to fall into 2 categories. Either jQuery is being used to do simple selection using CSS selectors or it is being used to support a jQuery plugin.

The plugins are

  • jQuery UI 1.7.2
  • jQuery Mobile 1.2.0
  • jQuery TextAreaResizer

The first two are fairly well known jQuery plugins. As expected the versions in BugTracker.NET are pretty old ones. The latest jQuery UI is 1.11 and jQuery Mobile is at 1.4.3 at the time of writing. TextAreaResizer is a more difficult prospect.

The version of the plugin included in BugTracker.NET is compressed and has comments stripped out. This means that there is no real way to figure out a source for the plugin. Googling around it seems like the plugin might be used to add resize handles to text areas. I was surprised by this as it was my understanding that this functionality was built into browsers. It seems that back in the IE8 days this didn't exist. A lone demo page was all I could find of the plugin. As we've decided to support browsers that old then we are going to need to keep this functionality.

It is likely that we'll be able to replace the TextAreaResizer with a newer and better documented project.

In every case the usage of jQuery is either simplistic or it is tied to a plugin. If we update the plugins in line with the jQuery then there should be relatively little risk of breaking the plugin functionality.

Updating jQuery

Now we have an idea of the problems with which we're dealing. Let's dive in and see if we can get jQuery updated.

To start with let's use the latest 1.X version of jQuery. This is available in nuget and we can install it with

Install-Package jQuery -version 1.11.1

This will create a Scripts directory at the base of the project. This is different from the directory that contains the existing jQuery files; they exist in a jquery directory. I like the scripts directory far more than a jquery directory. As we add more and more scripts that are not jQuery related naming the directory jquery does not make sense.

Now we can go through the application and replace all the script tags referencing old versions of jQuery with new ones.

View the Commit >>

Updating jQuery UI

Up next is to replace the old version of jQuery UI with a newer one. The latest is, coincidentally, also numbered 1.11.1. jQuery UI contains a large number of different controls. However, it is built in a way that permits assembling custom builds that only reference a couple of these widgets. If we open up the existing jQuery UI it looks like a lot of components are referenced.

View the Code >>

However most of the components listed are actually behaviours like draggable, resizable and selectable. The only widgets we're actually using are

  • Dialog
  • Tabs
  • DatePicker

Packages for the individual jQuery UI widgets exist in nuget, however they are pretty out of date. In fact they are barely any newer than the version we have. We're going to need to assemble our own version. This can be done using the jQuery UI download builder.

The package we download contains JavaScript, CSS and images. In the current version of BugTracker.NET these files are all included in the jquery directory. If we put all of them into the scripts directory we've added then we introduce confusion by mixing style and script.

Let's create a new directory called Content and add script and image directories under it. We've chosen to call the directory Content as that is a bit of a standard that has been established by ASP.NET MVC projects. It isn't as hard of a standard as the one that Maven established in the Java world, but it will still help future developers find things.

View the Commit >>

Again we need to do a pass through the application and update all the jQuery UI references.

View the Commit >>

Because we've put the images in a different directory from the CSS we'll need to update the CSS to reference the new path.

View the Commit >>

Now we can jump to some of the pages that use jQuery UI as well as jQuery and check if they work. search.aspx is a prime candidate. Indeed as we click around that page the data picker works as does everything else. I couldn't actually find anywhere that uses either the dialog or the tabs. Perhaps these were intended for future use. I'll leave the jQuery UI we added with those additional widgets for now, but we'll keep it in mind and review it again in a little while.

You don't have to make all the changes to a project at once. As I mentioned some time ago updating an application is like paying down a mortgage: chip away at it. It is, however, worth keeping around some notes.

Updating jQuery Mobile

The latest of jQuery mobile is 1.4.4. Again this is a package that contains a number of components and we can pick and choose them. Let's poke about inside BugTracker.NET and see if we can figure out which components are being used.

It seems that jQuery mobile is only referenced in three places

  • mbug.aspx
  • mbugs.aspx
  • mlogin.aspx

Looking at all of these files I see that the library relies on the use of data-* attributes. Looking through the list of components in jQuery mobile I'm not sure which ones are needed.  I tried a few combinations but was unable to find one that actually worked.  I wasn't willing to expend any more effort on it so I included the entire library.

View the Commit >>

This actually brings up a good point: if you're expending more effort on an update task than you're getting back, abandon it. The goal here is not to make the project perfect but to remove pain points, security risks or code that is preventing rapid evolution of the project.

Updating jQuery TextAreaResizer

The final component we need to update is the TextAreaResizer. Unfortunately I was unable to find any updated package, or in fact any page that mentioned the original page. This is actually worrying as the code is likely unmaintained. While the situation is not as dire as the library is inherently open source due to it being JavaScript it is still worrying. However there may actually be no need to use this plugin. jQuery UI includes a resizable behaviour that can be applied to the text areas.

Thus all we need to is delete any existing references to TextAreaResizer and in its place add

$('textarea').resizable()

View the Commit >>

All Done

We've successfully upgraded jQuery and all of its dependencies to the latest version and actually trimmed out an entire library. The JavaScript organization in the project could use some real love. JavaScript is included haphazardly in a jumble of JavaScript and C#. There is no structure to the JavaScript code, no namespaces or even a directory structure. There are even some places where the C# code emits JavaScript.

While we've improved the jQuery it is really only a foundation for a future effort in which we clean up the JavaScript. Stay tuned!

Utilizando Apache Cordova en Visual Studio

MSDN Blogs - Thu, 11/20/2014 - 03:48

Crear aplicaciones que funcionen en cualquier plataforma es una buena solución para algunos desarrollos. Para ello tenemos varias herramientas de la cuales destaca Apache Cordova y cómo comentamos en el blog de MSDN, se puede integrar perfectamente en Visual Studio.

¿Qué es Apache Cordova?

Es la herramienta más famosa para crear apps en HTML5 que funcionen en cualquier dispositivo táctil.

Además nos provee de una serie de APIs de JavaScript que nos ayudan a interactuar con los elementos internos de nuestro dispositivo, por ejemplo con la cámara, los contactos, etc.

Al tener estas APIs a nosotros no nos va a importar la plataforma para la que desarrollamos y solo vamos a preocuparnos de nuestra aplicación.

¿Aplicaciones nativas o híbridas?

Una de las características más destacadas de la herramienta es que no te tienes que preocupar de si el dispositivo para el cual haces la aplicación tiene soporte nativo o solo híbrido de las aplicaciones en JavaScript.

Entendemos por híbridas aquellas en las cuales vamos a utilizar un webview y no interactuamos directamente con el motor del navegador.

Actualmente, para las plataformas más conocidas serían:

  • Android: Híbrida
  • Apple: Híbrida
  • Blackberry 10: Nativa
  • Firefox OS: Nativa
  • Windows 8.x: Nativa
  • Windows Phone 8: Híbrida
  • Windows Phone 8.1: Nativa
Integración con Visual Studio

Para realizar una integración completa de Apache Cordova en Visual Studio solo hace falta instalar ‘Tools for Apache Cordova’ (Que ya puedes instalar por defecto a partir de Visual Studio 2015 Preview)

Gracias a estas herramientas, los desarrolladores pueden utilizar todos sus conocimientos en HTML y JavaScript para crear aplicaciones con Apache Cordova.

Crear un nuevo proyecto es tan fácil como en cualquier otro tipo de proyecto:

¿Qué nos aporta esta integración?

Una pregunta es clara, ¿Qué me aporta utilizar Visual Studio para programar con Apache Cordova? Pues la respuesta es sencilla, nos ayuda a trabajar cómodamente con la herramienta sin necesitar depender de otros programar o herramientas y tenerlo todo en un mismo sitio.

Crear código es tan fácil como en cualquier proyecto que utilizamos con Visual Studio.

Puedes depurar y analizar el código de tu app de una manera muy sencilla.

Pre visualizar y probar el resultado de nuestro trabajo es tan fácil que solo has de apretar un botón.

Puedes obtener más información y ejemplos en el siguiente enlace.

_____________________________

Quique Fernández

Technical Evangelist Intern

@CKGrafico

How to implement 'Dynamic File Receiving' with BizTalk?

MSDN Blogs - Thu, 11/20/2014 - 02:27

The Problem:

================================

Sometimes we may need to read some files from various of sources but the BizTalk File adapter doesn't natively support 'Dynamic Receive'. In other words, we cannot use File adapter on a two-way send port whose URIs can be changed in orchestrtion code.

Then how can achieve such goal?

 

Solution:

================================

A workable approach is that we can write a .net class to call BizTalk WMI provider to modify the URL of a receive location. The code can be very simple as below:

 

publicvoid SetFileAddress(string FileAddress)

        {           

       ReceivePortCollection ReceivePorts = BizTalkCatalog.ReceivePorts;           

       ReceiveLocation ReceiveLocation = ReceivePorts["DynamicReceivePort"].ReceiveLocations["DynamicReceiveRL"];

            ReceiveLocation.Address = FileAddress;

            ReceiveLocation.Enable = true;

            BizTalkCatalog.SaveChanges();

        }

 

However, the challenge is on multi-threading/multiple instance part. You will find such WMI operations cannot handle muti-threading situation. This means if there are many concurrent calls to the WMI provider, most of the calls will fail or ever worse, the invokers will cause WMI service instance(WmiPrvSE.exe) crash... and unexpected hang of BizTalk Admin console. So the most important part is that we must implement a singleton convoy/pattern in our orchestration to avoid concurrent calls. A good example can be found at:

 

Implementing Singleton pattern with BizTalk Orchestrations

http://www.moustafarefaat.com/MoustafaPWS/singletonorchestrations.aspx

 

Best regards,

WenJun Zhang

Azure Storage サービスのサービス中断について

MSDN Blogs - Thu, 11/20/2014 - 02:25
このポストは、11 月 19 日に投稿された Update on Azure Storage Service Interruption の翻訳です。 太平洋標準時間の昨日、Azure Storage サービスで米国、ヨーロッパ、およびアジアの一部にかけてサービス中断が発生し、該当するリージョンでホストされている複数の Cloud Services に影響がありました。まず、サービス中断の発生につきまして、深くお詫びを申し上げます。平素よりお客様には多大な信頼をお寄せいただいており、マイクロソフトは今回の件について非常に重く受け止めております。この記事では、今回発生した問題の背景についてご説明いたします。 Azure Storage に適用するパフォーマンス関連の更新の中に問題が発見され、このために、Virtual Machines、Visual Studio Online、Websites、Search、などの Azure Storage を使用するマイクロソフトのサービス全般でキャパシティが低下しました。このパフォーマンス関連の更新を適用する前に、お客様向けの Azure...(read more)

Recovering Azure VM by attaching OS disk to another Azure VM

MSDN Blogs - Thu, 11/20/2014 - 01:43

If you are unable to administer an Azure VM because of RDP or SSH failures, in many cases rebooting or resizing the VM may resolve the issue.

You can troubleshoot the VM by attaching the OS disk as a data disk to a different Azure VM using the steps below.

  1. First make sure you have a working VM in the same location (region) that you can use to attach the OS disk of the problem VM. If you don’t have one in the same region, you can create one temporarily.

    To verify the location, click Virtual Machines and look at the Location column. As long as the second VM has the same location, whether in parenthesis or not (i.e. East US or <affinity group> (East US)), you can use it for this process.



     
  2. After creating a new VM in the same location or confirming a second VM already exists in that location, select Virtual Machines on the left, click the problem VM on the right, then click Dashboard.


  3. Make note of the OS disk name in the Disks section at the bottom of the dashboard, since you will be using it later to redeploy the VM. The disk name is under the Disk column on the far left.



     
  4. Click Delete at the bottom right of the page to delete the VM. This is necessary so the OS disk is not in use and can be attached to another VM.




    Note Deleting the VM does not delete the VHD file. The VHD remains as-is in your storage account.

  5. Click Virtual Machines on the left, and click the Disks tab at the top right.


    Find the disk name from Step 2, and wait for the Attached To column to be blank. This can take up to 5 minutes after deleting the VM.


  6. Click Virtual Machines on the left, and select the second VM that you will use to attach the OS disk of the problem VM, select Dashboard, then select Attach and then Attach Disk at the bottom of the dashboard.



     
  7. In the Attach a disk to the virtual machine dialog, select Available Disks and choose the disk from the problem VM (you made note of the disk name in Step 2). Leave the Host Cache Preference on the default setting of None, and click OK.





    If you do not see the disk here, either this second VM is in a different location than the problem VM (i.e. in West US and the problem VM is in East US), or the disk has not yet been freed up for reuse and the Attached To column still shows the problem VM name instead of being blank.

     
  8. When the disk is attached to the second VM you will see a message in the portal Successfully attached disk <disk name> to virtual machine <name of second VM>.
      
  9. Click Connect to make an RDP connection to the second VM.
     
      
  10. In the second VM, go to Start, Search, type diskmgmt.msc <enter> to bring up the Disk Management tool.
     
     
  11. The disk you just added should show up as Offline, so right-click it and select Online.


  12. If your OS Disk has only 1 partition then follow step 13. If the Disk has 2 partition then follow step 14.
      
  13. Disk with 1 partition:

    Assuming that the partition got G: drive (please note the drive letter may be different in the VM that you are working on)  Open an elevated command prompt and run the following commands:

    chkdsk G: /F

    bcdedit /store G:\boot\bcd /set {default} recoveryenabled Off  (disables the recovery mode)

    bcdedit /store G:\boot\bcd /enum  (to confirm recoveryenabled is set to No)
     
    move G:\windows\system32\config\system G:\windows\system32\config\system_org (saves current system registry hive)
     
    copy G:\windows\system32\config\Regback\system G:\windows\system32\config\system (replaces system registry hive with the backup)
     
     
  14. Disk with 2 partition:

    Assuming that the partition with boot manager (~100 MB size) got G: drive and the OS partition got H: drive (please note the drive letter may be different in the VM that you are working on)  Open an elevated command prompt and run the following commands:

    chkdsk H: /F

    bcdedit /store G:\boot\bcd /set {default} recoveryenabled Off  (disables the recovery mode)
     
    bcdedit /store G:\boot\bcd /enum  (to confirm recoveryenabled is set to No)

    move H:\windows\system32\config\system H:\windows\system32\config\system_org (saves the current system registry hive)

    copy H:\windows\system32\config\Regback\system H:\windows\system32\config\system (replaces system registry hive with the backup)
     
     
  15. Back in Disk Management, right-click the disk from the problem VM and select Offline.



     
  16. Back in the portal, on the dashboard for the second VM, select Detach to detach the disk from the VM.



     
     
  17. Create a new VM with this OS disk that you just repaired. Start the VM and RDP the VM.
     
     
  18. If your VM is still not recovered, you will have to rebuild your VM and import your application specific data (if any) into the new VM by following these steps:

    Follow steps from 1 to 11 and get the old OS disk attached as a data disk to a new VM.

    Copy all your application specific data from the old OS disk to the new VM.

8 декабря в Москве состоится конференция .NEXT

MSDN Blogs - Thu, 11/20/2014 - 01:26

8 декабря в Москве состоится главное событие года для С# и .NET разработчиков — конференция .NEXT. В программе — более 20 технических докладов о настоящем и будущем платформы .NET. Среди докладчиков легендарный Дино Эспозито, автор серии книг по ASP.NET.

C техническими докладами выступят разрабочики компаний JetBrains, DevExpress, Futirice и, конечно, Microsoft.  Конференцию .NEXT обязательно стоит посетить всем .NET-разработчикам, которые хотят:

  • глубоко погрузиться в детали реализации .NET Framework;
  • подсмотреть секреты успешной разработки у лидеров индустрии -  программистов компаний JetBrains, Microsoft, DevExpress, Futurice, Luxoft и других;
  • обменяться опытом с коллегами из других компаний;
  • вживую пообщаться с лидерами российской .NET-разработки.

Подробности — на сайте конференции: http://dotnext.ru

Microsoft in Education – Understanding the real value of technology [INFOGRAPHIC]

MSDN Blogs - Thu, 11/20/2014 - 01:00

We’re all born to learn. At Microsoft, we understand that the real value of technology lies in the skills it builds, the opportunities it creates, and the horizons it broadens. That’s why we’re empowering the education community with a wide range of products, services, and programmes that help transform learning and make it more accessible.

The following infographic highlights some of the areas within education where there are Microsoft products, services or resources that can be utilised by teachers and students alike, in order to enhance and add value to experiences both inside and outside of the classroom.

Microsoft in Education UK from Microsoft Education UK

Some of the areas covered in the infographic above have subsets of resources:

Professional development for educators
- Microsoft Educator Network
- Teaching with Technology (TwT)
- Microsoft IT Academy
- Microsoft Virtual Academy

Transform the Classroom
- Devices
- Educational apps
- Skype in the Classroom
- DreamSpark
- Power BI
- Office Mix
- Sway

Many of the above resources can be used by both teachers and students, and are not mutually exclusive. We also have a community of partners who can provide education-specific solutions to help transform teaching and learning with technology. For more information please visit www.eduempowered.com.

Microsoft in Education – Understanding the real value of technology [INFOGRAPHIC]

MSDN Blogs - Thu, 11/20/2014 - 01:00

We’re all born to learn. At Microsoft, we understand that the real value of technology lies in the skills it builds, the opportunities it creates, and the horizons it broadens. That’s why we’re empowering the education community with a wide range of products, services, and programmes that help transform learning and make it more accessible.

The following infographic highlights some of the areas within education where there are Microsoft products, services or resources that can be utilised by teachers and students alike, in order to enhance and add value to experiences both inside and outside of the classroom.

Microsoft in Education UK from Microsoft Education UK

Some of the areas covered in the infographic above have subsets of resources:

Professional development for educators
- Microsoft Educator Network
- Teaching with Technology (TwT)
- Microsoft IT Academy
- Microsoft Virtual Academy

Transform the Classroom
- Devices
- Educational apps
- Skype in the Classroom
- DreamSpark
- Power BI
- Office Mix
- Sway

Many of the above resources can be used by both teachers and students, and are not mutually exclusive. We also have a community of partners who can provide education-specific solutions to help transform teaching and learning with technology. For more information please visit www.eduempowered.com.

Pages

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