You are here

Feed aggregator

Wrapping up WPC with renewed excitement for the IoT opportunity

MSDN Blogs - 1 hour 23 min ago

Posted By Karen Roberts
Senior Partner Marketing Manager

What an exciting week for partners at this year’s Worldwide Partner Conference (WPC) 2014! In the heart of the U.S. capital, we were blessed start to finish with great weather, delicious food, fantastic entertainment (what a soccer match!) and, best of all, enthusiastic and energetic partners executing against the Internet of Things (IoT).

Read More...

Comments Internet of Things

...(read more)

Can't connect to Visual Studio Online from any version of in VS: "The underlying connection was closed: An unexpected error occurred on a send."

MSDN Blogs - 1 hour 23 min ago
Interesting one today. PROBLEM Customer reported not being able to connect to VSO from any VS version. Kept getting this: The server returned the following error: TF400324: Team Foundation services are not available from server <ACCOUNT>.visualstudio.com\DefaultCollection. Technical information (for administrator): The underlying connection was closed: An unexpected error occurred on a send. TROUBLESHOOTING The customer could connect successfully using a web browser, so server...(read more)

SQL Server and SQL Server Agent Service Account(Startup Account) and Permissions

MSDN Blogs - 1 hour 32 min ago

SQL Server and SQL Server Agent service account(Startup Account) and Permissions

1.Does service account need sysadmin role?

 [SQL Server(Database Engine)]
 沒有文件說明一定需要sysadmin role
 no document found saying No or Yes explicitly about if sql service account need to be a member of sysdamin role
 (1)SQL 2005,service account is always granted with sysadmin by default (e.g. if we pick Local System as our service account, then we would have NT Authority/System having sysadmin in the SQL instance).
   How to change the SQL Server or SQL Server Agent service account without using SQL Enterprise Manager in SQL Server 2000 or SQL Server Configuration Manager in SQL Server 2005
   http://support.microsoft.com/kb/283811
   Base on KB283811 for SQL 2005, When changing new SQL service Account, sysadmin role is a must

 (2)SQL 2008,in Windows 2008 R2, Virtual Accounts(SQL Server Per-service SID)=NT SERVICE\<SERVICENAME>is always granted with sysadmin by default
   Configure Windows Service Accounts and Permissions
   http://msdn.microsoft.com/en-us/library/ms143504.aspx

 基於以上文件,建議將SQL Server service accoount(startup account)加入sysadmin role

 

 [SQL Server Agent]
 雖然SQL Server Agent service的啟動帳戶不是sysadmin role也能啟動SQL Server Agent,但可能會限制某些功能。

 (1)必須是sysadmin role
   From Books Online and Training kit 70-462
   The SQL Server Agent service startup account must be a member of the SQL Server sysadmin fixed server role, and if multiserver job processing is used, the account must also be a member of the msdb database role TargetServersRole on the master server.
   Set the Service Startup Account for SQL Server Agent (SQL Server Configuration Manager)
   http://msdn.microsoft.com/en-us/library/ms186264.aspx

   From Training kit 70-462
 (2)The account you assign for the SQL Server Agent service during installation is added automatically to the sysadmin fixed server role during installation.
   PS.但是經測試SQL 2008 R2安裝過程時所指定一個local or domain user account也不會自動加入sysadmin role

 (3)If you modify the account used by the SQL Server Agent service at a later point, SQL Server Configuration Manager does not automatically add the account to sysadmin role.
   PS.透過SQL Server Configuration Manager修改啟動帳戶,只會給予需要的權限,不會自動加sysadmin role

 

 

2.Does service account need Windows Administrator Permission?(local Administrators Group member)

 [SQL Server(Database Engine)]
 (1)不需要一定是Administrators group member
 (2)視需求選擇其中一種account
    Domain User Account
    Local User Account
    Local Service Account(NT AUTHORITY\LOCAL SERVICE)
    Network Service Account(NT AUTHORITY\NETWORK SERVICE)
    Local System Account(NT AUTHORITY\SYSTEM)

    Windows 7 and Windows Server 2008 R2 have two new types of service accounts called managed service accounts (MSA) and virtual accounts.
    Virtual Accounts
    Managed Service Accounts
  
    Configure Windows Service Accounts and Permissions
    http://msdn.microsoft.com/en-us/library/ms143504.aspx

 

 [SQL Server Agent]
 (1)Beginning with SQL 2005, 不需要是Administrators Group member
    Beginning with SQL Server 2005, SQL Server Agent no longer requires that the service startup account be a member of the Microsoft Administrators group.
    However, there are some restrictions associated with using a non-administrative account for the SQL Server Agent service. For more information, see Service Account Types Supported for SQL Server Agent.
    http://msdn.microsoft.com/en-us/library/ms345380(v=sql.105).aspx


 (2)如果是domain account可能需要以下權限
    From Training kit 70-462
    When choosing to use a domain-based security account, ensure that the account has the following permissions:
    ■ The logon as a service right. You assign this right by using Group Policy.
    ■ Membership of the Pre-Windows 2000 Compatible Access security group at the domain level. If you do not add the domain-based security account used for the SQL Server Agent service to this group, any jobs owned by domain users who are not members of the local Administrators group on the host computer will fail.

 

PS.

1.Default provisioning login after SQL Server setup finish

2.Default provisioning windows groups

What you need to know about privacy and security in OneDrive

MSDN Blogs - 2 hours 20 min ago

OneDrive is free online storage that's built into Windows 8.1 and Windows RT 8.1. Add files from your PC to OneDrive, and then easily access your photos, music, documents, and other files on all the devices you use.

How you can help protect your privacy and security in OneDrive

Create a strong password for your Microsoft Account. You sign into OneDrive with your Microsoft Account. Here is some basic guidance on how to create a strong password for that account. Different sites have different rules for passwords that they’ll accept, but this guidance should work anywhere you need to create a password:

  • Length. Make your passwords at least eight (8) characters long.
  • Complexity. Include a combination of at least three (3) uppercase and/or lowercase letters, punctuation, symbols, and numerals. The more variety of characters in your password, the better.
  • Variety. Don't use the same password for everything. Cybercriminals can steal passwords from websites that have poor security and then use those same passwords to target more secure environments, such as banking websites. Check the strength of your password.

Manage who can view or edit your OneDrive files. By default, your OneDrive files are available to you, although you can choose to share photos, documents, and other files. To share files or folders, right-click them and choose how you want to share them.

Add security info to your Microsoft account. You can add information like your phone number, an alternate email address, and a security question and answer to your account. That way, if you ever forget your password or your account gets hacked, we can use your security info to verify your identity and help you get back into your account. Go to the Security info page.

Use two-step verification. This helps protect your account by requiring you to enter an extra security code whenever you sign in on a device that isn’t trusted. For more information about two-step verification, see Two-step verification: FAQ.

Back up your OneDrive files. For details about using File History in Windows, see Set up a drive for File History.

For more information about how Microsoft helps keep your files safe in the cloud, see Privacy in OneDrive.

Añadir IP a Azure SQL DB con PowerShell

MSDN Blogs - 3 hours 15 min ago

Azure brinda enormes ventajas; entre ellas, la posibilidad de poder configurarlo y administrarlo desde cualquier parte del mundo. Sin embargo en ambientes como el de SQLDB (antes conocido como SQL Azure) para poder entrar a administrar la DB la ip de nuestra máquina de trabajo ha de estar autorizada; así que cada vez que nos conectamos desde una IP nueva, debemos entrar al portal a autorizarla… y esto me parece una pérdida de tiempo que puede ahorrarse a través de las herramientas de automatización que Azure provee tanto para línea de comandos multiplataforma (Windows, Linux, MacOS) como para PowerShell (únicamente en Windows)

Las interfaces de comandos cross platform están basadas en JavaScript y requieren de NodeJS; las puedes descargar de aquí:

Pero; aunque hasta aquí vamos bien, podemos ir mejor! Y es que en Windows, como lo mencioné existe PowerShell que ofrece muchas más utilidades que la simple consola de comandos. Así que también se publicaron los cmdlets (así se llaman los comandos en PowerShell) para esta plataforma y los pueden descargar de aquí. El poder de PowerShell lo lleva hasta a integrarse a Visual Studio 2013, tal como lo ilustro en este post.

Los nombres técnicos que adquirieron cada uno de estos conjuntos de interfaces fueron azure-sdk-tools para PowerShell y  azure-sdk-tools-xplat  para las consolas cross platform. Y, siguiendo los links citados, podrán observar que además de todo, tanto el código C# para PowerShell como el código JavaScript para xplat ha sido abierto y publicado en GitHub.

Y bien, ya que los empapé con el contexto que gira alrededor de mi solución para el problemilla aquel de agregar la IP a mi servidor de SQLDB, les comento que decidí usar PowerShell con el fin de aprovechar que ahora puedo editar código PowerShell desde el mismísimo Visual Studio 2013, aprovechando características como IntelliSense y demás que hacen la codificación más agradable. Para lograr esto, instalé PowerShell Tools for Visual Studio 2013, que es una extensión para nuestro editor preferido. (Si quieres saber cómo construir tu propia extensión, haz clic aquí).

Luego de esto, de una manera bastante cómoda escribí las siguientes líneas de código, que con fines ilustrativos comentaré de manera extensiva:

# # SQLDBAuthCurrentIP.ps1 #=========================== #By: @WarNov 7/12/2014 - 18:12 #This script adds to the Specified SQL DB Server Database the IP #of this machine as a new firewallrule Param( #Nombre del servidor SQLDB ej. p5x8y4oi1z [string]$serverName, #Nombre de la regla de firewall que se insertará. A pesar de ser
#obligatorio en el comando de Azure, en este script es opcional #si se omite, el script produce un GUID como nombre
#y lo pasa a Azure
[string]$ruleName, #La ruta donde el archivo *.publishsettings está localizado con
#la información de la suscripción de Azure a la que accederemos
[string]$publish ) #Hacemos referencia a la suscripción de Azure, sencillamente
#importando el archivo



Import-AzurePublishSettingsFile -PublishSettingsFile $publish #Procesamos el nombre de la regla. Si viene vacío,
#creamos un GUID. Observen el manejo que se da a los comparadores
if($ruleName.Length -eq 0){
#A través de .NET instanciamos la clase guid y asignamos
$ruleName=[guid]::NewGuid(); } #Ahora obtendremos la ip que queremos agregar. #Dado que no hay forma de obtener la ip externa usada por nuestro
#cliente es necesario usar una herramienta online que nos informe
#cual es nuestra ip; en este caso, usaré una que construí yo mismo
#y que corre en Azure basada en un Generic Handler sencillo de
#ASP.NET; con esta sencilla línea de código:
#Request.UserHostAddress #Luego a través de .NET creamos un WebClient #y ejecutamos un downloadstring especificando la url $ipAddress=(New-Object Net.WebClient).
DownloadString('http://warnov.com/@ip') #Finalmente ejecutamos el comando principal,
#que agregará la IP al servidor bajo la suscripción de Azure New-AzureSqlDatabaseServerFirewallRule -ServerName $serverName ` -RuleName $ruleName -StartIpAddress $ipAddress `
-EndIpAddress $ipAddress

Ya con este script listo, lo podemos ejecutar desde el mismo VS2013 para chequear si hay posibles errores.
Una vez depurado, lo podemos llamar desde la consola de comandos, pasando como parámetro el nombre del servidor, el nombre de la regla (opcional) y la ruta del archivo de .publishsettings de Azure que se requiere para que tengamos acceso a la suscripción desde nuestra máquina. Este archivo se descarga una sola vez con este comando: azure account download

Un ejemplo de ejecución:

Y, como en la mayoría de casos tanto el nombre del servidor como el archivo de settings es el mismo, lo que podemos es hacer otro script que ponga estos parámetros automáticamente por nosotros, así cuando necesitemos agregar la IP solo llamamos a este segundo script sin necesidad de poner parámetros.

Así pues, hemos visto cómo mediante PowerShell podemos automatizar tediosas tareas como la de agregar la IP a Azure como una regla de firewall cada vez que queremos administrar nuestras bases de datos SQL DB desde una máquina distinta.

He abierto el código de este pequeño proyecto en Github, donde también podrán encontrar por ejemplo, una rutina que permite borrar todas las reglas de firewall que tengamos para un servidor SQL DB dado, a través de PowerShell:

When I send a WM_GETFONT message to a window, why don't I get a font?

MSDN Blogs - 3 hours 44 min ago

A customer reported that the WM_GET­FONT message was not working. Specifically, they sent the message to a window, and they can plainly see that the window is rendering with a particular font, yet the WM_GET­FONT message returns 0. Why isn't the window returning the correct font handle?

The WM_SET­FONT and WM_GET­FONT messages are not mandatory. A window may choose to support them, or it may choose not to, or it may even choose to support one but not the other. (Though if it supports WM_SET­FONT, it probably ought to support WM_GET­FONT.)

For example, our scroll bar program creates a custom font for the items in the list, but it does not implement the WM_SET­FONT or WM_GET­FONT messages. If you try to change the font via WM_SET­FONT, nothing happens. If you ask for the font via WM_GET­FONT, you get nothing back.

A control might ignore your attempt to change the font if it already has its own notion of what font it should be using. Or maybe the control shows content in multiple fonts, so the concept of "the" font does not map well to the render model. (What would WM_GET­FONT on an HTML control return?) Or maybe the control doesn't use GDI fonts at all. (Maybe it uses Direct­Write.)

That's one of the reasons why the rules for the WM_SET­FONT are set up the way they are. Since there is no way to tell whether a window did anything in response to the WM_SET­FONT message, there would be no way to know whether responsibility for destroying the font should be transferred to the control or retained by the caller.

Controls that are designed to be used in dialog boxes are the ones most likely to support the WM_SET­FONT message, since that's the message the dialog manager uses to tell each control the font specified in the dialog box template. The hope is that all of the controls will respect that font, so that the controls on the dialog box have a consistent appearance. But there's nothing preventing a control from saying, "Screw you. I'm drawing with OCR-A and there's nothing you can do to stop me."

Creating Local Users

MSDN Blogs - 3 hours 44 min ago
I’m helping some of our test teams more and more.  In one case, we need to create local users in bulk. I’m surprised PSH doesn’t have something for this.  function New-LocalUser { <# .syopsis Creates a local user account .parameter UserName Username of local user to be created. Ignored if -Credential specified. Legal username characters are A-Z, a-z, 0-9, _, and - characters. If length is greater than 15, it will be truncated to 15 characters. Defaults to [DateTime...(read more)

Sample code: create an HDInsight cluster, run job, remove the cluster

MSDN Blogs - 3 hours 58 min ago

In a previous post, I gave an example of a simple automation job. Here is a more interesting one.

Here is a sample Azure Automation code that creates an HDInsight cluster, runs a job, and removes the cluster.

I used it for a demonstration at the French Hadoop User Group. You can find the video (in French) where I explain what is does here:

 

 

When you start it, you can specify the options you want to activate:

The code is the following:

workflow HDInsightJob { param( [Parameter(Mandatory=$false)] [bool]$createCluster=$false, [Parameter(Mandatory=$false)] [bool]$runJob=$true, [Parameter(Mandatory=$false)] [bool]$removeCluster=$false ) $subscription = 'Azdem169A44055X' $azureConnection=Get-AutomationConnection -Name $subscription $subscriptionId=$azureConnection.SubscriptionId $azureCertificate=Get-AutomationCertificate -Name 'azure-admin.3-4.fr' $clusterCredentials=Get-AutomationPSCredential -Name 'HDInsightClusterCredentials' InlineScript { echo "RunBook V140629c" echo $PSVersionTable import-module azure get-module azure $createCluster=$using:createCluster $runJob=$using:runJob $removeCluster=$using:removeCluster $subscription=$using:subscription $subscriptionId=$using:subscriptionId $azureCertificate=$using:azureCertificate $clusterCredentials=$using:clusterCredentials $defaultStorageAccount='monstockageazure' $clusterName = 'monclusterhadoop' $clusterContainerName = 'monclusterhadoop' $clusterVersion='3.0' #3.1, 3.0, 2.1, 1.6 Set-AzureSubscription -SubscriptionName $subscription -SubscriptionId $subscriptionID -Certificate $azureCertificate -CurrentStorageAccount $defaultStorageAccount Select-AzureSubscription -Current $Subscription $storageAccount1 = (Get-AzureSubscription $Subscription).CurrentStorageAccountName $key1 = Get-AzureStorageKey -StorageAccountName $storageAccount1 | %{ $_.Primary } $storageAccount2Name = "wasbshared" $storageAccount2Key = (Get-AzureStorageKey -StorageAccountName $storageAccount2Name).Secondary if ($createCluster) { echo "will create cluster $clusterName" New-AzureHDInsightClusterConfig -ClusterSizeInNodes 3 | Set-AzureHDInsightDefaultStorage -StorageAccountName "${storageAccount1}.blob.core.windows.net" -StorageAccountKey $key1 -StorageContainerName $clusterContainerName | Add-AzureHDInsightStorage -StorageAccountName $storageAccount2Name -StorageAccountKey $storageAccount2Key | New-AzureHDInsightCluster -Name $clusterName -Version $clusterVersion -Location "North Europe" -Credential $clusterCredentials echo "cluster created" } $wasbdemo = "wasb://demo@monstockageazure.blob.core.windows.net" Use-AzureHDInsightCluster $clusterName if ($runJob) { echo "will start job" $pigJob = New-AzureHDInsightPigJobDefinition -File "$wasbdemo/scripts/iislogs-pig-jython/iislogs-client-ip-time.pig" $pigJob.Files.Add("$wasbdemo/scripts/iislogs-pig-jython/iislogs-client-ip-time-helper.py") $pigJob.Files.Add("$wasbdemo/scripts/iislogs-pig-jython/jython-2.5.3.jar") $startedPigJob = $pigJob | Start-AzureHDInsightJob -Credential $clusterCredentials -Cluster $clusterName echo "will wait for the end of the job" $startedPigJob | Wait-AzureHDInsightJob -Credential $clusterCredentials echo "--- log ---" Get-AzureHDInsightJobOutput -JobId $startedPigJob.JobId -TaskSummary -StandardError -StandardOutput -Cluster $clusterName echo "job done" } if ($removeCluster) { echo "will remove cluster" Remove-AzureHDInsightCluster -Name $clusterName echo "removed cluster" } echo "done" } }

 

Here is a sample log of that job:

RunBook V140629c Name Value ---- ----- PSRemotingProtocolVersion 2.2 BuildVersion 6.3.9600.16406 PSCompatibleVersions {1.0, 2.0, 3.0, 4.0} PSVersion 4.0 CLRVersion 4.0.30319.19455 WSManStackVersion 3.0 SerializationVersion 1.1.0.1 ModuleType Version Name ExportedCommands PSComputerName ---------- ------- ---- ---------------- -------------- Binary 0.8.0 azure {Remove-AzureStorageAccount,... localhost will create cluster monclusterhadoop PSComputerName : localhost PSSourceJobInstanceId : b7a8dc2b-3e11-467f-8dad-2a1ac76da33f ClusterSizeInNodes : 3 ConnectionUrl : https://monclusterhadoop.azurehdinsight.net CreateDate : 6/29/2014 7:57:56 AM DefaultStorageAccount : monstockageazure.blob.core.windows.net HttpUserName : cornac Location : North Europe Name : monclusterhadoop State : Running StorageAccounts : {} SubscriptionId : 0fa85b4c-aa27-44ba-84e5-fa51aac32734 UserName : cornac Version : 3.0.3.234.879810 VersionStatus : Compatible cluster created Successfully connected to cluster monclusterhadoop will start job will wait for the end of the job PSComputerName : localhost PSSourceJobInstanceId : b7a8dc2b-3e11-467f-8dad-2a1ac76da33f Cluster : monclusterhadoop ExitCode : 0 Name : PercentComplete : 100% complete Query : State : Completed StatusDirectory : 54d76c5f-a0a3-4df8-84d3-8b58d05f51fd SubmissionTime : 6/29/2014 8:12:17 AM JobId : job_1404029421644_0001 --- log --- 2014-06-29 08:12:28,609 [main] INFO org.apache.pig.Main - Apache Pig version 0.12.0.2.0.9.0-1686 (r: unknown) compiled Jun 10 2014, 17:27:26 2014-06-29 08:12:28,609 [main] INFO org.apache.pig.Main - Logging error messages to: C:\apps\dist\hadoop-2.2.0.2.0.9.0-1686\logs\pig_1404029548609.log SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/C:/apps/dist/hadoop-2.2.0.2.0.9.0-1686/share/hadoop/common/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/C:/apps/dist/pig-0.12.0.2.0.9.0-1686/pig-0.12.0.2.0.9.0-1686.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory] 2014-06-29 08:12:29,609 [main] INFO org.apache.pig.impl.util.Utils - Default bootup file D:\Users\hdp/.pigbootup not found 2014-06-29 08:12:29,844 [main] INFO org.apache.hadoop.conf.Configuration.deprecation - mapred.job.tracker is deprecated. Instead, use mapreduce.jobtracker.address 2014-06-29 08:12:29,844 [main] INFO org.apache.hadoop.conf.Configuration.deprecation - fs.default.name is deprecated. Instead, use fs.defaultFS 2014-06-29 08:12:29,844 [main] INFO org.apache.pig.backend.hadoop.executionengine.HExecutionEngine - Connecting to hadoop file system at: wasb://monclusterhadoop@monstockageazure.blob.core.windows.net 2014-06-29 08:12:30,515 [main] INFO org.apache.hadoop.conf.Configuration.deprecation - fs.default.name is deprecated. Instead, use fs.defaultFS 2014-06-29 08:12:30,547 [main] INFO org.apache.pig.scripting.jython.JythonScriptEngine - created tmp python.cachedir=D:\Users\hdp\AppData\Local\Temp\pig_jython_8612239229935485131 2014-06-29 08:12:32,781 [main] WARN org.apache.pig.scripting.jython.JythonScriptEngine - pig.cmd.args.remainders is empty. This is not expected unless on testing. 2014-06-29 08:12:34,828 [main] INFO org.apache.pig.scripting.jython.JythonScriptEngine - Register scripting UDF: helper.date_time_by_the_minute 2014-06-29 08:12:34,828 [main] INFO org.apache.pig.scripting.jython.JythonScriptEngine - Register scripting UDF: helper.new_uuid 2014-06-29 08:12:35,594 [main] INFO org.apache.pig.scripting.jython.JythonFunction - Schema 'hit_date_time:chararray' defined for func date_time_by_the_minute 2014-06-29 08:12:35,750 [main] INFO org.apache.pig.tools.pigstats.ScriptState - Pig features used in the script: GROUP_BY,ORDER_BY,FILTER 2014-06-29 08:12:35,812 [main] INFO org.apache.pig.newplan.logical.optimizer.LogicalPlanOptimizer - {RULES_ENABLED=[AddForEach, ColumnMapKeyPrune, DuplicateForEachColumnRewrite, GroupByConstParallelSetter, ImplicitSplitInserter, LimitOptimizer, LoadTypeCastInserter, MergeFilter, MergeForEach, NewPartitionFilterOptimizer, PartitionFilterOptimizer, PushDownForEachFlatten, PushUpFilter, SplitFilter, StreamTypeCastInserter], RULES_DISABLED=[FilterLogicExpressionSimplifier]} 2014-06-29 08:12:35,844 [main] INFO org.apache.hadoop.conf.Configuration.deprecation - mapred.textoutputformat.separator is deprecated. Instead, use mapreduce.output.textoutputformat.separator 2014-06-29 08:12:36,078 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MRCompiler - File concatenation threshold: 100 optimistic? false 2014-06-29 08:12:36,219 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.CombinerOptimizer - Choosing to move algebraic foreach to combiner 2014-06-29 08:12:36,297 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MultiQueryOptimizer - MR plan size before optimization: 3 2014-06-29 08:12:36,297 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MultiQueryOptimizer - MR plan size after optimization: 3 2014-06-29 08:12:36,594 [main] INFO org.apache.hadoop.yarn.client.RMProxy - Connecting to ResourceManager at headnodehost/100.85.198.84:9010 2014-06-29 08:12:36,734 [main] INFO org.apache.pig.tools.pigstats.ScriptState - Pig script settings are added to the job 2014-06-29 08:12:36,750 [main] INFO org.apache.hadoop.conf.Configuration.deprecation - mapred.job.reduce.markreset.buffer.percent is deprecated. Instead, use mapreduce.reduce.markreset.buffer.percent 2014-06-29 08:12:36,750 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.JobControlCompiler - mapred.job.reduce.markreset.buffer.percent is not set, set to default 0.3 2014-06-29 08:12:36,750 [main] INFO org.apache.hadoop.conf.Configuration.deprecation - mapred.output.compress is deprecated. Instead, use mapreduce.output.fileoutputformat.compress 2014-06-29 08:12:36,750 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.JobControlCompiler - Reduce phase detected, estimating # of required reducers. 2014-06-29 08:12:36,750 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.JobControlCompiler - Using reducer estimator: org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.InputSizeReducerEstimator 2014-06-29 08:12:36,750 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.InputSizeReducerEstimator - BytesPerReducer=1000000000 maxReducers=999 totalInputFileSize=-1 2014-06-29 08:12:36,750 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.JobControlCompiler - Could not estimate number of reducers and no requested or default parallelism set. Defaulting to 1 reducer. 2014-06-29 08:12:36,750 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.JobControlCompiler - Setting Parallelism to 1 2014-06-29 08:12:36,750 [main] INFO org.apache.hadoop.conf.Configuration.deprecation - mapred.reduce.tasks is deprecated. Instead, use mapreduce.job.reduces 2014-06-29 08:12:37,347 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.JobControlCompiler - creating jar file Job1668949293984769897.jar 2014-06-29 08:12:46,909 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.JobControlCompiler - jar file Job1668949293984769897.jar created 2014-06-29 08:12:46,909 [main] INFO org.apache.hadoop.conf.Configuration.deprecation - mapred.jar is deprecated. Instead, use mapreduce.job.jar 2014-06-29 08:12:46,940 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.JobControlCompiler - Setting up single store job 2014-06-29 08:12:46,987 [main] INFO org.apache.pig.data.SchemaTupleFrontend - Key [pig.schematuple] is false, will not generate code. 2014-06-29 08:12:46,987 [main] INFO org.apache.pig.data.SchemaTupleFrontend - Starting process to move generated code to distributed cache 2014-06-29 08:12:46,987 [main] INFO org.apache.pig.data.SchemaTupleFrontend - Setting key [pig.schematuple.classes] with classes to deserialize [] 2014-06-29 08:12:47,112 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - 1 map-reduce job(s) waiting for submission. 2014-06-29 08:12:47,112 [main] INFO org.apache.hadoop.conf.Configuration.deprecation - mapred.job.tracker.http.address is deprecated. Instead, use mapreduce.jobtracker.http.address 2014-06-29 08:12:47,112 [JobControl] INFO org.apache.hadoop.yarn.client.RMProxy - Connecting to ResourceManager at headnodehost/100.85.198.84:9010 2014-06-29 08:12:47,206 [JobControl] INFO org.apache.hadoop.conf.Configuration.deprecation - fs.default.name is deprecated. Instead, use fs.defaultFS 2014-06-29 08:12:49,043 [JobControl] INFO org.apache.hadoop.mapreduce.lib.input.FileInputFormat - Total input paths to process : 71 2014-06-29 08:12:49,043 [JobControl] INFO org.apache.pig.backend.hadoop.executionengine.util.MapRedUtil - Total input paths to process : 71 2014-06-29 08:12:49,090 [JobControl] INFO org.apache.pig.backend.hadoop.executionengine.util.MapRedUtil - Total input paths (combined) to process : 12 2014-06-29 08:12:49,293 [JobControl] INFO org.apache.hadoop.mapreduce.JobSubmitter - number of splits:12 2014-06-29 08:12:49,621 [JobControl] INFO org.apache.hadoop.mapreduce.JobSubmitter - Submitting tokens for job: job_1404029421644_0002 2014-06-29 08:12:49,621 [JobControl] INFO org.apache.hadoop.mapreduce.JobSubmitter - Kind: mapreduce.job, Service: job_1404029421644_0001, Ident: (org.apache.hadoop.mapreduce.security.token.JobTokenIdentifier@5b531130) 2014-06-29 08:12:49,636 [JobControl] INFO org.apache.hadoop.mapreduce.JobSubmitter - Kind: RM_DELEGATION_TOKEN, Service: 100.85.198.84:9010, Ident: (owner=cornac, renewer=mr token, realUser=hdp, issueDate=1404029526385, maxDate=1404634326385, sequenceNumber=1, masterKeyId=2) 2014-06-29 08:12:50,058 [JobControl] INFO org.apache.hadoop.yarn.client.api.impl.YarnClientImpl - Submitted application application_1404029421644_0002 to ResourceManager at headnodehost/100.85.198.84:9010 2014-06-29 08:12:50,121 [JobControl] INFO org.apache.hadoop.mapreduce.Job - The url to track the job: http://headnodehost:9014/proxy/application_1404029421644_0002/ 2014-06-29 08:12:50,121 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - HadoopJobId: job_1404029421644_0002 2014-06-29 08:12:50,121 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - Processing aliases logs_date_cip,logs_date_cip_with_headers,logs_date_time_cip,logs_date_time_cip_count,logs_date_time_cip_group,logs_raw 2014-06-29 08:12:50,121 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - detailed locations: M: logs_raw[4,11],logs_date_cip_with_headers[5,29],logs_date_cip[6,16],logs_date_time_cip[7,21],logs_date_time_cip_count[9,27],logs_date_time_cip_group[8,27] C: logs_date_time_cip_count[9,27],logs_date_time_cip_group[8,27] R: logs_date_time_cip_count[9,27] 2014-06-29 08:12:50,168 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - 0% complete 2014-06-29 08:13:33,534 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - 4% complete 2014-06-29 08:13:36,784 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - 11% complete 2014-06-29 08:13:39,034 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - 16% complete 2014-06-29 08:13:39,566 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - 20% complete 2014-06-29 08:13:41,258 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - 33% complete 2014-06-29 08:13:46,533 [main] INFO org.apache.pig.tools.pigstats.ScriptState - Pig script settings are added to the job 2014-06-29 08:13:46,533 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.JobControlCompiler - mapred.job.reduce.markreset.buffer.percent is not set, set to default 0.3 2014-06-29 08:13:46,533 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.JobControlCompiler - Reduce phase detected, estimating # of required reducers. 2014-06-29 08:13:46,533 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.JobControlCompiler - Using reducer estimator: org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.InputSizeReducerEstimator 2014-06-29 08:13:46,533 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.InputSizeReducerEstimator - BytesPerReducer=1000000000 maxReducers=999 totalInputFileSize=-1 2014-06-29 08:13:46,533 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.JobControlCompiler - Could not estimate number of reducers and no requested or default parallelism set. Defaulting to 1 reducer. 2014-06-29 08:13:46,533 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.JobControlCompiler - Setting Parallelism to 1 2014-06-29 08:13:47,042 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.JobControlCompiler - creating jar file Job8669508224269273799.jar 2014-06-29 08:13:56,229 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.JobControlCompiler - jar file Job8669508224269273799.jar created 2014-06-29 08:13:56,261 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.JobControlCompiler - Setting up single store job 2014-06-29 08:13:56,276 [main] INFO org.apache.pig.data.SchemaTupleFrontend - Key [pig.schematuple] is false, will not generate code. 2014-06-29 08:13:56,276 [main] INFO org.apache.pig.data.SchemaTupleFrontend - Starting process to move generated code to distributed cache 2014-06-29 08:13:56,276 [main] INFO org.apache.pig.data.SchemaTupleFrontend - Setting key [pig.schematuple.classes] with classes to deserialize [] 2014-06-29 08:13:56,307 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - 1 map-reduce job(s) waiting for submission. 2014-06-29 08:13:56,307 [JobControl] INFO org.apache.hadoop.yarn.client.RMProxy - Connecting to ResourceManager at headnodehost/100.85.198.84:9010 2014-06-29 08:13:56,386 [JobControl] INFO org.apache.hadoop.conf.Configuration.deprecation - fs.default.name is deprecated. Instead, use fs.defaultFS 2014-06-29 08:13:57,318 [JobControl] INFO org.apache.hadoop.mapreduce.lib.input.FileInputFormat - Total input paths to process : 1 2014-06-29 08:13:57,318 [JobControl] INFO org.apache.pig.backend.hadoop.executionengine.util.MapRedUtil - Total input paths to process : 1 2014-06-29 08:13:57,318 [JobControl] INFO org.apache.pig.backend.hadoop.executionengine.util.MapRedUtil - Total input paths (combined) to process : 1 2014-06-29 08:13:57,505 [JobControl] INFO org.apache.hadoop.mapreduce.JobSubmitter - number of splits:1 2014-06-29 08:13:57,630 [JobControl] INFO org.apache.hadoop.mapreduce.JobSubmitter - Submitting tokens for job: job_1404029421644_0003 2014-06-29 08:13:57,630 [JobControl] INFO org.apache.hadoop.mapreduce.JobSubmitter - Kind: mapreduce.job, Service: job_1404029421644_0001, Ident: (org.apache.hadoop.mapreduce.security.token.JobTokenIdentifier@3c124a75) 2014-06-29 08:13:57,630 [JobControl] INFO org.apache.hadoop.mapreduce.JobSubmitter - Kind: RM_DELEGATION_TOKEN, Service: 100.85.198.84:9010, Ident: (owner=cornac, renewer=mr token, realUser=hdp, issueDate=1404029526385, maxDate=1404634326385, sequenceNumber=1, masterKeyId=2) 2014-06-29 08:13:57,755 [JobControl] INFO org.apache.hadoop.yarn.client.api.impl.YarnClientImpl - Submitted application application_1404029421644_0003 to ResourceManager at headnodehost/100.85.198.84:9010 2014-06-29 08:13:57,771 [JobControl] INFO org.apache.hadoop.mapreduce.Job - The url to track the job: http://headnodehost:9014/proxy/application_1404029421644_0003/ 2014-06-29 08:13:57,771 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - HadoopJobId: job_1404029421644_0003 2014-06-29 08:13:57,771 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - Processing aliases logs_date_time_cip_count_ordered 2014-06-29 08:13:57,771 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - detailed locations: M: logs_date_time_cip_count_ordered[10,35] C: R: 2014-06-29 08:14:16,338 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - 50% complete 2014-06-29 08:14:24,487 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - 66% complete 2014-06-29 08:14:28,544 [main] INFO org.apache.pig.tools.pigstats.ScriptState - Pig script settings are added to the job 2014-06-29 08:14:28,544 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.JobControlCompiler - mapred.job.reduce.markreset.buffer.percent is not set, set to default 0.3 2014-06-29 08:14:28,544 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.JobControlCompiler - Reduce phase detected, estimating # of required reducers. 2014-06-29 08:14:28,544 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.JobControlCompiler - Setting Parallelism to 1 2014-06-29 08:14:29,021 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.JobControlCompiler - creating jar file Job3067576297837929164.jar 2014-06-29 08:14:38,100 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.JobControlCompiler - jar file Job3067576297837929164.jar created 2014-06-29 08:14:38,115 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.JobControlCompiler - Setting up single store job 2014-06-29 08:14:38,115 [main] INFO org.apache.pig.data.SchemaTupleFrontend - Key [pig.schematuple] is false, will not generate code. 2014-06-29 08:14:38,115 [main] INFO org.apache.pig.data.SchemaTupleFrontend - Starting process to move generated code to distributed cache 2014-06-29 08:14:38,115 [main] INFO org.apache.pig.data.SchemaTupleFrontend - Setting key [pig.schematuple.classes] with classes to deserialize [] 2014-06-29 08:14:38,162 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - 1 map-reduce job(s) waiting for submission. 2014-06-29 08:14:38,193 [JobControl] INFO org.apache.hadoop.yarn.client.RMProxy - Connecting to ResourceManager at headnodehost/100.85.198.84:9010 2014-06-29 08:14:38,256 [JobControl] INFO org.apache.hadoop.conf.Configuration.deprecation - fs.default.name is deprecated. Instead, use fs.defaultFS 2014-06-29 08:14:39,129 [JobControl] INFO org.apache.hadoop.mapreduce.lib.input.FileInputFormat - Total input paths to process : 1 2014-06-29 08:14:39,129 [JobControl] INFO org.apache.pig.backend.hadoop.executionengine.util.MapRedUtil - Total input paths to process : 1 2014-06-29 08:14:39,145 [JobControl] INFO org.apache.pig.backend.hadoop.executionengine.util.MapRedUtil - Total input paths (combined) to process : 1 2014-06-29 08:14:39,333 [JobControl] INFO org.apache.hadoop.mapreduce.JobSubmitter - number of splits:1 2014-06-29 08:14:39,442 [JobControl] INFO org.apache.hadoop.mapreduce.JobSubmitter - Submitting tokens for job: job_1404029421644_0004 2014-06-29 08:14:39,442 [JobControl] INFO org.apache.hadoop.mapreduce.JobSubmitter - Kind: mapreduce.job, Service: job_1404029421644_0001, Ident: (org.apache.hadoop.mapreduce.security.token.JobTokenIdentifier@6791a1a0) 2014-06-29 08:14:39,442 [JobControl] INFO org.apache.hadoop.mapreduce.JobSubmitter - Kind: RM_DELEGATION_TOKEN, Service: 100.85.198.84:9010, Ident: (owner=cornac, renewer=mr token, realUser=hdp, issueDate=1404029526385, maxDate=1404634326385, sequenceNumber=1, masterKeyId=2) 2014-06-29 08:14:40,604 [JobControl] INFO org.apache.hadoop.yarn.client.api.impl.YarnClientImpl - Submitted application application_1404029421644_0004 to ResourceManager at headnodehost/100.85.198.84:9010 2014-06-29 08:14:40,610 [JobControl] INFO org.apache.hadoop.mapreduce.Job - The url to track the job: http://headnodehost:9014/proxy/application_1404029421644_0004/ 2014-06-29 08:14:40,610 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - HadoopJobId: job_1404029421644_0004 2014-06-29 08:14:40,610 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - Processing aliases logs_date_time_cip_count_ordered 2014-06-29 08:14:40,610 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - detailed locations: M: logs_date_time_cip_count_ordered[10,35] C: R: 2014-06-29 08:14:55,976 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - 83% complete 2014-06-29 08:15:11,394 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - 100% complete 2014-06-29 08:15:11,597 [main] INFO org.apache.pig.tools.pigstats.SimplePigStats - Script Statistics: HadoopVersion PigVersion UserId StartedAt FinishedAt Features 2.2.0.2.0.9.0-1686 0.12.0.2.0.9.0-1686 hdp 2014-06-29 08:12:36 2014-06-29 08:15:11 GROUP_BY,ORDER_BY,FILTER Success! Job Stats (time in seconds): JobId Maps Reduces MaxMapTime MinMapTIme AvgMapTime MedianMapTime MaxReduceTime MinReduceTime AvgReduceTime MedianReducetime Alias Feature Outputs job_1404029421644_0002 12 1 33 16 29 31 20 20 20 20 logs_date_cip,logs_date_cip_with_headers,logs_date_time_cip,logs_date_time_cip_count,logs_date_time_cip_group,logs_raw GROUP_BY,COMBINER job_1404029421644_0003 1 1 7 7 7 7 5 5 5 5 logs_date_time_cip_count_ordered SAMPLER job_1404029421644_0004 1 1 5 5 5 5 7 7 7 7 logs_date_time_cip_count_ordered ORDER_BY /wasbwork/iislogs-client-ip, Input(s): Successfully read 592234 records from: "wasb://demo@monstockageazure.blob.core.windows.net/data/iislogs" Output(s): Successfully stored 712 records in: "/wasbwork/iislogs-client-ip" Counters: Total records written : 712 Total bytes written : 0 Spillable Memory Manager spill count : 0 Total bags proactively spilled: 0 Total records proactively spilled: 0 Job DAG: job_1404029421644_0002 -> job_1404029421644_0003, job_1404029421644_0003 -> job_1404029421644_0004, job_1404029421644_0004 2014-06-29 08:15:31,611 [main] INFO org.apache.hadoop.ipc.Client - Retrying connect to server: workernode0/100.85.210.91:49416. Already tried 0 time(s); maxRetries=3 2014-06-29 08:15:51,619 [main] INFO org.apache.hadoop.ipc.Client - Retrying connect to server: workernode0/100.85.210.91:49416. Already tried 1 time(s); maxRetries=3 2014-06-29 08:16:11,631 [main] INFO org.apache.hadoop.ipc.Client - Retrying connect to server: workernode0/100.85.210.91:49416. Already tried 2 time(s); maxRetries=3 2014-06-29 08:16:31,768 [main] INFO org.apache.hadoop.mapred.ClientServiceDelegate - Application state is completed. FinalApplicationStatus=SUCCEEDED. Redirecting to job history server 2014-06-29 08:16:54,015 [main] INFO org.apache.hadoop.ipc.Client - Retrying connect to server: workernode1/100.85.164.84:49580. Already tried 0 time(s); maxRetries=3 2014-06-29 08:17:14,021 [main] INFO org.apache.hadoop.ipc.Client - Retrying connect to server: workernode1/100.85.164.84:49580. Already tried 1 time(s); maxRetries=3 2014-06-29 08:17:34,027 [main] INFO org.apache.hadoop.ipc.Client - Retrying connect to server: workernode1/100.85.164.84:49580. Already tried 2 time(s); maxRetries=3 2014-06-29 08:17:54,161 [main] INFO org.apache.hadoop.mapred.ClientServiceDelegate - Application state is completed. FinalApplicationStatus=SUCCEEDED. Redirecting to job history server 2014-06-29 08:17:56,525 [main] INFO org.apache.hadoop.ipc.Client - Retrying connect to server: workernode2/100.85.206.85:49658. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=3, sleepTime=1 SECONDS) 2014-06-29 08:17:58,543 [main] INFO org.apache.hadoop.ipc.Client - Retrying connect to server: workernode2/100.85.206.85:49658. Already tried 1 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=3, sleepTime=1 SECONDS) 2014-06-29 08:18:00,583 [main] INFO org.apache.hadoop.ipc.Client - Retrying connect to server: workernode2/100.85.206.85:49658. Already tried 2 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=3, sleepTime=1 SECONDS) 2014-06-29 08:18:01,705 [main] INFO org.apache.hadoop.mapred.ClientServiceDelegate - Application state is completed. FinalApplicationStatus=SUCCEEDED. Redirecting to job history server 2014-06-29 08:18:01,908 [main] WARN org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - Encountered Warning ACCESSING_NON_EXISTENT_FIELD 330 time(s). 2014-06-29 08:18:01,908 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - Success! job done will remove cluster removed cluster done

 

Benjamin (@benjguin)

Termine im Windows Phone per API anlegen - ohne Broker

MSDN Blogs - 4 hours 24 min ago

Windows Phone erlaubt das Anlegen von Terminen im Kalender des Anwender aus der App heraus – auch ohne Benutzerinteraktion, also ohne Verwendung der Brokered APIs sondern mit dem direkten Zugriff. “Gebrokered” nennen wir ja immer die Zugriffe, die vorsichtshalber noch einmal den Benutzer fragen, ob er die Aktion auch wirklich will.
Für den direkten Zugriff gibt es eine API, die man anzapfen kann, wenn man nur die “Appointment” Capability im App-Manifest gesetzt hat. Das wiederum ist der Handel auf den wir uns als Entwickler einlassen müssen – wer nicht den Broker nutzt, muss zumindest angeben, dass er auf den Kalender zugreifen will – was ja auch fair ist.
Warum ich diesen Blogpost schreibe? Weil ich mal wieder erstaunt bin, wie einfach es ist – seht Euch den Code an:

async private Task CreateCalenderEntry()
        {
            // 1. get access to appointmentstore
            var appointmentStore = await AppointmentManager.RequestStoreAsync(AppointmentStoreAccessType.AppCalendarsReadWrite);

            // 2. get calendar
            var appCustomApptCalendar = await appointmentStore.CreateAppointmentCalendarAsync("MyCalendar");

            // 3. create new Appointment
            var appo = new Windows.ApplicationModel.Appointments.Appointment();

            // appointment properties
            appo.AllDay = true;
            appo.Subject = "Mein Termin";           
            appo.StartTime = DateTime.Now;

            //  4. add
            await appCustomApptCalendar.SaveAppointmentAsync(appo);
        }

Es geht hier also – quasi netto – um 4 Zeilen Code (das Setzen der Appointment Properties zählt nicht, finde ich). Bitte nicht vergessen die Capability im App Manifest zu setzen:     Besteht jetzt die Gefahr, dass eine App den Kalender des Anwenders zumüllt? Ein bisschen schon – allerdings hat der Anwender die Möglichkeit hier den Riegel vorzuschieben. Die App schreibt hier in einen eigenen Kalender, das heißt, der Anwender hat die Möglichkeit diesen Kalender wieder auszublenden. Das funktioniert ganz einfach über die Kalendereinstellungen.  

Besonders erwähnenswert finde ich, dass man mit Windows Phone 8.1 solche Aktionen jetzt auch über Push Notifications triggern kann – d.h. eine App, die nicht im Vordergrund ist, ist auch in der Lage per Push dazu angestoßen zu werden Kalendereinträge vorzunehmen.

Die Asynchronität in der Verarbeitung des Push Events bekommt Ihr in der Run-Methode des Background-Tasks über das Deferral in den Griff:

async public void Run(IBackgroundTaskInstance taskInstance)
  {

BackgroundTaskDeferral deferral = taskInstance.GetDeferral();           
await CreateCalenderEntry();
deferral.Complete();

}

Kleiner Hinweis noch zum Code oben: Wenn Ihr diesen Code mehrfach ausführt, werden mehrere Kalender angelegt. Hier bietet es sich natürlich an, statt CreateAppointmentCalendarAsync bei Bedarf einfach GetAppointmentCalendarAsync zu nutzen.

Azure Automation: What is running on my subscriptions

MSDN Blogs - 4 hours 42 min ago
the result

I regulalry need to check if my Azure virtual machines are turned off before leaving. Besides virtual machines, I also want to know in which pricing level my web sites, Azure SQL Databases, etc are running. I want to know if I have an HDInsight cluster running.

So I created an Azure automation job that checks the subscriptions at 6pm every day.

Here is how it looks:

How to start

You can start using Azure automation by following the instructions available here:

http://azure.microsoft.com/en-us/documentation/articles/automation-create-runbook-from-samples/

Credentials

The script will need to get access to the subscriptions.

So I created a management certificate. One way to do so is explained in this blog post by Keith Mayer.

In my case, here is how my environment looks:

In Azure automation, the same certificate is declared in the assets:

The script

Here is how the script itself:

workflow Inventory { # Get the Azure management certificate that is used to connect to this subscription $Certificate = Get-AutomationCertificate -Name 'azure-admin.3-4.fr' if ($Certificate -eq $null) { throw "Could not retrieve '$AzureConn.AutomationCertificateName' certificate asset. Check that you created this first in the Automation service." } InlineScript { $Certificate = $using:Certificate $subscriptions = (('Azdem169A44055X','0fa8xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'), ('Azure bengui','b4edxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'), ('APVX','0ec1xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'), ('demos-frazurete','4b57xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx')) foreach ($subscription in $subscriptions) { $subscriptionName = $subscription[0] $subscriptionId = $subscription[1] echo "------- Subscription $subscriptionName ----------" # Set the Azure subscription configuration Set-AzureSubscription -SubscriptionName $subscriptionName -SubscriptionId $subscriptionId -Certificate $Certificate Select-AzureSubscription -Current $subscriptionName $vms = @() foreach ($s in Get-AzureService) { $vms += Get-AzureVm -ServiceName $s.ServiceName } echo "--- Virtual Machines ---" $vms | select servicename, Name, PowerState | format-table $hclusters=Get-AzureHDInsightCluster echo "--- HDInsight clusters ---" $hclusters | format-table $webs=Get-AzureWebSite echo "--- Web Sites ---" $webs | select Name, SiteMode | sort Name | format-table $dbs = @() foreach ($s in Get-AzureSqlDatabaseServer) { $dbs += Get-AzureSqlDatabase -ServerName $s.ServerName } echo "--- SQL Databases ---" $dbs | select Name, Edition, MaxSizeinGb | format-table } } }

NB: I have obfuscated the subscription ids.

Make it your own

You can change the script for your own usage. You would need to change the certificate name (mine is azure-admin.3-4.fr), the names and ids of your subscriptions).

 

Benjamin (@benjguin)

From the Classroom to the Cloud – Skype and the Future of Learning

MSDN Blogs - 8 hours 45 min ago

Originally posted on Skype’s Social Good Blog

How do children learn in places so remote there is no formal access to teachers or schools? How do children with learning disabilities prosper?  How do children with a passion to learn more than is expected in class, stay inspired and engaged?  Do children learn more working in groups or working alone?  These kinds of questions have been asked by researchers and educators for decades.  Hypotheses are tested every day throughout the world, and thanks to innovation, philanthropy, and technology, great progress is being made.  Children are learning in ways they never could before.

Another tool has now entered the sphere of innovation around learning that begins to address many of the questions above.  It won’t arrive in a box or in a student’s backpack.  And it won’t cost a thing.  This new offering comes in a cloud – the School in The Cloud.  This is the work of Professor Sugata Mitra, Professor of Educational Technology at Newcastle University in England.  The School in the Cloud is a free web platform where groups of young children join volunteer educators via a Skype video call to find the answers to “big questions”, using the internet and their own collective brainpower.  The educators, “Skype Grannies” as they are referred to by the children, are there to encourage curiosity and give support, but not to teach.  The children teach themselves.  Sugata calls it self-organized learning.

SOLE opening in England with Skype Granny

Sugata started testing this approach in India nearly 14 years ago and with Newcastle University has continued researching its effectiveness around the world.  His work has shown learning happens and literacy improves for children in a variety of demographics, setting a path toward a better future.  This is why in 2013 Sugata Mitra won the TED Prize to build seven research labs to further his research.  Microsoft and the Skype Social Good team are partnering with Made by Many, the product design company behind Skype in the Classroom, to build the web platform that will connect Skype Grannies and children. Building off the early research at Newcastle University, together they are helping to turn Sugata’s vision into a movement.

A School in the Cloud can be set up anywhere.  In a community center, library, classroom, or a home where families or neighbourhood children gather.  All it takes is a computer, a camera, and a connection to the internet.  It is designed to complement other learning in schools or offer learning where there are no schools.  The only investment is one of time. Time spent by volunteer Skype Grannies, the facilitators who help set up School in the Cloud sessions, and the enthusiastic students searching for answers to questions that quickly grow by number and complexity. Skype Grannies are currently available to support Sugata’s labs, but we are hoping to soon expand this so that Skype Grannies can support educators anywhere in the future. If you’re interested in becoming a Skype Granny you can find out more and register your interest here.

Last week at the 30th annual TED conference in Vancouver, TED Curator Chris Anderson updated the TED community on School in the Cloud progress, announcing the launch of the web platform and releasing the trailer for the Sundance funded documentary being made about the project.  And at the Skype Conversation Space at TED, Sugata discussed the future of learning.

Every day we hear from thousands of teachers in over 200 countries and territories how Skype is being used to inspire and deepen learning in their classrooms.  Whether it’s interacting with guest speakers, collaborating with other schools around the world, or taking virtual field trips, teachers tell us the impact on student engagement is significant. Skype Grannies are now part of the growing community of educators using Skype to create meaningful moments for children.  The only difference is, they won’t be in a classroom.

Knowing the importance of alternative learning formats through our years of investment in Skype in the classroom, we immediately answered the call from Sugata and TED to innovate and help build the web platform for the School in the Cloud.  Our support is part of the Microsoft YouthSpark commitment to empower 300 million young people with opportunities for education, employment, and entrepreneurship.  We are proud to be working with Sugata and hopeful that our partnership with the School in the Cloud will give children a new way of accessing learning that will make those opportunities a reality.

I encourage innovative teachers who already understand the value of using Skype in your classroom to visit the School in the Cloud, sign up as a facilitator, and try this approach with your students.  Educators everywhere are welcome to be part of this global research project to understand how children learn together in new ways.  And while you allow the Skype Grannies to take over for a bit, you’ll have a moment to schedule your next Skype in the classroom session.

[Sample Of July 24] How to create a snapshot of blob in Windows Azure

MSDN Blogs - 8 hours 52 min ago
July 24

Sample : http://code.msdn.microsoft.com/How-to-create-a-snapshot-f6558876

 

This Code Snippet shows how to create a snapshot of blob in Windows Azure.

For developers, the best way to prevent accidental deletion or modification is creating a snapshot of blob.A snapshot is a read-only version of a blob that's taken at a point in time. Once a snapshot has been created, it can be read, copied, or deleted, but not modified. Snapshots provide a way to back up a blob as it appears at a moment in time. A snapshot of a blob has the same name as the base blob from which the snapshot is taken, with a DateTime value appended to indicate the time at which the snapshot was taken. A blob may have any number of snapshots. Snapshots persist until they are explicitly deleted. A snapshot cannot outlive its source blob. You can enumerate the snapshots associated with your blob to track your current snapshots.

This script can help developers easily create a snapshot of a specific blob storage. 

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

アプリの高DPI(High DPI)対応について 第2回 ~ アプリケーションの高DPIへの対応レベル ~

MSDN Blogs - 9 hours 3 sec ago

マイクロソフトの田中達彦です。
本連載では、今後3年以内に避けて通れないと予測される高DPI(High DPI)への対応について連載します。


[DPI対応アプリケーションの種類]
アプリケーションが高DPIに対応しているかどうかは、以下の3つのレベルで示されます。

Not DPI Aware : 高DPIに対応していないアプリケーション
System DPI Aware : 高DPIに対応しているアプリケーション。ただし、モニターごとのDPIには対応していません。
Per monitor DPI Aware : Windows 8.1でサポートされたモニターごとのDPIの設定にも対応しています。

Not DPI Awareアプリは、96DPIのモニターで表示されることを前提にしたアプリです。
もしこのアプリを、144DPI相当すなわち150%のDPIスケールのモニターで表示させると、OS側が自動的にアプリを拡大して表示します。
この自動的に拡大する機能は、Windows Vista以降でサポートされています。
アプリを自動的に拡大する場合は、一旦96DPI相当で描画した後に150%に拡大します。
そのため、Not DPI Awareアプリを150%などに設定しているモニターで表示させると、文字などのUI要素がぼやけてしまうことがあります。
アプリケーションの設定によっては、自動的に拡大しないようにもできます。
この方法は後述します。

System DPI Awareアプリは、システムで設定したDPIのスケールに対応したアプリです。System DPI Awareアプリの場合は、OSによって自動的に拡大/縮小されずに表示されます。
ただし、DPIが動的に変わることに対しては対応していません。

Per Monitor DPI-Awareアプリは、DPIのスケールが動的に変わることに対応したアプリです。
DPIが動的に変わることは、モニターごとに異なるDPIを設定していて、アプリがモニター間を移動するときに発生します。
例えばプライマリモニターが100%、セカンダリモニターが150%に設定されているとき、プライマリモニターに表示しているアプリをセカンダリモニターに移動させると、その途中でDPIのスケールが100%から150%に変わります。
モニターごとのDPIに対応していないWindows 8以前のOSでは、DPIスケールが動的に変わることはありません。


[各テクノロジの高DPIへの対応]
UIを構築するテクノロジは、それぞれデフォルトで以下のような高DPIの対応レベルになっています。

Windowsフォーム : Not DPI Aware
WPF : System DPI Aware
MFC : System DPI Aware
Windowsストアアプリ : Per Monitor DPI Aware

これらは、最新のバージョン(現段階でVisual Studio 2013に搭載されているライブラリ)を使用したときの対応レベルです。
例えばVisual Studio 2008でMFCを使って作られたアプリケーションは、System-DPI Awareにはなっていません。


[自動拡大をオフにする]
Windowsフォームを使用したアプリなどNot DPI Awareアプリは、100%以外のDPIスケールのモニターで表示させたときに以下のようにUI要素がぼやけてしまい、くっきりと表示されない場合があります。



前述したように、OSが自動的に拡大/縮小させているからです。
この拡大/縮小は、互換性のプロパティを変更することによって自動的に動作しないようにできます。
エクスプローラー上で該当する.exeファイルを右クリックし、表示されたコンテキストメニューのプロパティを選択します。
ダイアログが表示されたら、互換性のタブをクリックします。
下のほうにある、[高DPI設定では画面のスケーリングを無効にする]にチェックを入れます。



このようにすると、OSが自動的に拡大/縮小を行わなくなりますので、以下のように文字がくっきりと表示されます。



ただし、UIのレイアウトが崩れてしまうことがあります。
今回使用したアプリの例でも、タイトルバーに表示されている「Form1」という文字の位置が少しずれています。
よく見ると、各コントロールの幅も微妙に違っています。

このように、互換性のプロパティを変更することは手軽ですが、レイアウトが崩れていないかどうかなどを確認する必要があります。


[Webアプリの場合]
Webアプリの場合は、それを動かしているWebブラウザに依存します。
Webブラウザが高DPIに対応していないと、その中に表示されるコンテンツがぼやけてしまうからです。
有名なWebブラウザのDPI対応レベルは、それぞれ最新版で以下のようになっています。
それぞれのブラウザの画像は、上がシングルモニターの150%スケールで動作させたとき、下の画像がマルチモニタでプライマリ100%、セカンダリ150%に設定しているときのセカンダリモニターでの画像です。

Internet Explorer : Per Monitor DPI Aware
(シングルモニターの150%スケール)


(マルチモニターのセカンダリモニター上で、150%スケールで表示)



Firefox : System DPI Aware
(シングルモニターの150%スケール)


(マルチモニターのセカンダリモニター上で、150%スケールで表示)



Chrome : Not DPI Awre
(シングルモニターの150%スケール)


(マルチモニターのセカンダリモニター上で、150%スケールで表示)



[おまけ]
Surface Pro 3のデフォルトのDPIスケールは150%でした。


[次回]
次回は、DPI対応レベルをアプリレベルで変更する方法を説明します。


[前後の記事]
第1回 高DPIとは
http://blogs.msdn.com/b/ttanaka/archive/2014/07/16/dpi-high-dpi-1-dpi.aspx


マイクロソフト
田中達彦

Windows 8 アプリの画面デザインをPowerPoint で

MSDN Blogs - 9 hours 10 min ago

 

新しくなって、Windows 8 と Windows Phone が統合された Windows デベロッパーセンター。眺めているといろいろ面白いものがあります。そのひとつが画面一番下にあるリンクです。サイトへのリンク以外にもテンプレートやサンプルのリンクなども用意されています。

たとえば、PowerPoint 用のデザイン テンプレート

Windows 8 のアプリケーションのための基本ページデザインパターンだけでなく、様々なコントロールがPowerPoint のパーツとして用意されています。

こちらはコントロール類。

なんとなく眺めてデザインするもよし、オリジナルを考えるのもいいですね。これを使って直接デザインするのもいいし、薄くして印刷して、実際にペンで書き込みをしながらデザインするのもおすすめ。

Surface Pro 3 なら画面とペンでデザインを進めることもOKです。

Line numbers in Visual Studio not shown?

MSDN Blogs - 10 hours 12 min ago

 

At times, you see that line numbers are not coming up in Visual Studio. In fact, this is a setting which can be customized as per your need. You can even enable or disable this feature as per the file types.

Go to Tools –> Options and select Text Editor and enable line numbers as shown below.

 

You can see that it is also showing all other languages. You can customize a lot of other settings related to editors. You can also explore them. :)

 

Thanks

Gaurav

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

MSDN Blogs - Wed, 07/23/2014 - 23:12

前回のエントリーで、WPF を学習するのに「プログラミング Windows 第6版」という書籍を紹介しました。この書籍は、Windows ストア アプリを中心にしている関係で、WinRT XAML という WPF XAML のサブセットを使った説明となっています。したがって、WPF XAML とは色々な面で異なる箇所があります。この異なる差異を乗り越えて WPF を学習するために、サンプルを移植しながら解説を試みるのが今回のテーマとなります。目標は、プログラミング Windows 第6版 の上巻をカバーすることで、下巻は自分で WPF に置き換えて学習ができるようになることです。このように考えていますので、以下のようなエントリーを考えています。

  1. XAML とは何か
  2. 第1章 マークアップとコード
  3. 第2章 XAML 構文
  4. 第3章 基本的なイベント処理
  5. 第4章 パネルを使った表示
  6. 第5章 コントロールとのやりとり
  7. 第6章 WinRT と MVVM
  8. 第7章 非同期性
  9. 第8章 アプリ バーとポップアップ
  10. 第9章 アニメーション
  11. 第10章 座標変換
  12. 第11章 3つのテンプレート
  13. 第12章 ページとナビゲーション

利用するサンプルは、以下で公開されています。

今回の記事は、私がプログラミング Windows 第6版 をの Windows 8.1 対応作業を実施した時に考えていた目的でもあります。WPF XAML を学習する書籍などで、最新環境(.NET Framework 4.5x)に対応した日本語の書籍がほぼ無い状況だったことから、Windows プログラミングを学ぶ上での王道とも言える書籍が WinRT XAML に対応したことも理由です(個人的には、時代の変遷を感じています)。

第1章 マークアップとコード 1.1(P3) 最初のプロジェクト

WPF アプリケーションを作成するには、Visual Studio 2013 を起動してから、[新しいプロジェクト]-[Visual C#]-[Windows デスクトップ]-[WPF アプリケーション] を選択します。

※プロジェクト テンプレートには、「WPF アプリケーション」の他に「WPF カスタム コントロール ライブラリ」「WPF ユーザー コントロール ライブラリ」があります。

書籍では、Hello プロジェクトを作成し、プロジェクトの構造とコード、および XAML の説明が続きますので、WPF で作成した場合の基本的な要素を説明します。最初に、ソリューション エクスプローラーの状態を示します。

Windows ストア アプリとの違いは、「Assetsフォルダー」、「Common フォルダー」、「Hello_Temporarykey.pfx」および「Package.appxmanifest」が無いことになります。また、参照設定の内容が大きく異なっています。具体的には、WPF では次の3 種類のアセンブリが参照設定されています。

  • PresentationCore.dll
  • PresentationFramework.dll
  • WindowsBase.dll

これは、Windows Forms アプリケーションが「System.Windows.Forms.dll」と「System.Drawing.dll」へ参照を持つことと同じで、WPF にとって必要なものだと理解すれば良いでしょう。

それでは、MainWindow.xaml.cs(WinRT XAMLでは MainPage.xaml.csです) のコードを次に示します。

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace Hello { /// <summary> /// MainWindow.xaml の相互作用ロジック /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } } }

 

WinRT XAML との大きな違いは、MainWindow クラスが Window クラスを継承しているところになります。WinRT XAML では、Window クラスを提供しておらず、Page クラスを使用するのが普通だからです。一方で、WPF ではナビゲーションを使用する場合のみに Page クラスを使用するだけで(具体的に第11章で説明する予定です)、基本になるウィンドウとして Window クラスを使用します。名前空間は、WinRT と違って System で始まっています。たとえば、System.Windows、System.Windows.Controls などになります。また、MainWindow クラスに partial キーワードが付与されている点に注意してください。これは、MainWindow.xaml がビルド時にパーシャル クラスである MainWindowのコードを生成し、生成したコードの中に InitializeComponent メソッドが含まれていることを意味するからです。

今度は、MainWindow.xaml を示します。

<Window x:Class="Hello.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Hello" Height="350" Width="525" WindowState="Maximized"> <Grid Background="Black"> <TextBlock Text="Hello, Windows 8!" FontFamily="Times New Roman" FontSize="96" FontStyle='Italic' Foreground='Yellow' HorizontalAlignment='Center' VerticalAlignment='Center' /> </Grid> </Window>

 

ルート要素が、WinRT XAML と異なり Window になっています。また、WindowsState プロパティ(属性)に「Maximized(最大化)」が設定されている点にもご注意ください。これは、Windows ストア アプリが常に全画面であるのに対して、WPF は任意のウィンドウ サイズを設定できることから、意図的にフルスクリーンに設定しています。これ以外には、Grid 要素の Background属性を静的リソースから「Black」に変更しています。これは、WPF は WinRT XAML と違って標準でスタイル シートを組み込まないためです。次に XAML 構文で WinRT XAML との大きな違いは、名前空間の宣言方法になります(MainWindow.xaml には示していません)。

  • WinRT XAMLでは、「xmlns:local=”using Hello” 」
  • WPF XAML では、「xmlns:local=”clr-namespace:Hello”」
    より正確には、「xmlns:プレフィックス=”clr-namespace:使用する名前空間;assembly=アセンブリ名”」と指定します。

上記で示したように、自分で定義したクラスなどを使用する場合の名前空間の指定方法に大きな違いがあります。今度は、Windows Forms と比較したものを示します。

  • Form クラスに相当するのが、Window クラス
    Controls コレクション に相当するプロパティを Window クラスは持ちません。
    Text プロパティに相当するのが、Title プロパティになります。
  • Label クラスに相当するのが、TextBlock クラス
  • Grid クラスに相当するものは、Windows Forms にはありません。
    Controls コレクションに相当するプロパティとして Children があります。

次に、App.xaml のプロパティを示します。

注目して欲しいのが、ビルド アクションが「ApplicationDefinition」になっていることです。次に、App.xaml.cs を示します。

using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Linq; using System.Threading.Tasks; using System.Windows; namespace Hello { /// <summary> /// App.xaml の相互作用ロジック /// </summary> public partial class App : Application { } }

 

App クラスは、Application クラスを継承するだけ、コード自体は何も記述されていません。実は、App クラスが WPF アプリケーションのエントリー ポイントになっています。一般的にエントリー ポイントであれば、Main メソッドが存在します。実は、App.xamlのビルド アクションが「ApplicationDefinition」になっているのは、ビルド時にMainメソッドを自動生成するようになっているためなのです。エントリー ポイントで何らかの処理を行うのであれば、ビルド アクションを「Page」に変更して、自分で Main メソッドを定義する必要があります。これは、第1章の最後で説明します。Hello プロジェクトの実行結果を示します。

ウィンドウの形式を除けば、WinRT XAML と同じ結果が得られました。ここまでの説明で、WinRT XAML との大きな違いを以下の点に集約できると思います。

  • Window クラスを基本とする
  • 名前空間の記述方法が異なる
  • ウィンドウ サイズは、自分で設定する
  • 参照するアセンブリが異なる

今度は、Windows Forms の Form クラスと WPF のWindow クラス のサイズ関係の違いを次に示します。

  Form Window 説明 Width 幅(Size) 描画時の推奨値 描画時に指定する幅で、描画後には変化しません。 Height 高さ(Size) 描画時の推奨値 描画時に指定する幅で、描画後には変化しません。 ActualWidth 無し 実際の幅 描画された大きさです。 ActualHeight 無し 実際の高さ 描画された大きさです。

さらに、Window クラスには「SizeToContent」プロパティがあり、これを「WidthAndHeight」に設定することでWindow 内部に配置したコントロールに応じてウィンドウ サイズを決定することができるようになっています。また、WPF において Windows Forms と決定的に異なるのは座標の取り扱いにあります。

  • Windows Forms は、ピクセル座標を扱います。
  • WPFは、論理座標(1/96 DPI)を扱います。

たとえば、Width や Height プロパティには「Auto」という値を設定することもできます。これは、設定されたコントロールが持つコンテンツに応じて描画時の推奨サイズを決定してくださいという値になります。つまり、WPF では Width や Height を使ってレンダリング エンジンに対して描画して欲しいサイズを伝えることはできますが、最終的に描画されるサイズはコントロールが配置されたパネル コントロールなどによって変化することを意味します。よって、最終的に描画されたサイズを取得するには ActualWidth やActualHeight プロパティを使用するしかないことになります。これは、Windows Forms などの GDI 技術と大きく違う点になりますし、論理座標を使うことで 高DPI などに対応するスケーリングのメリットを受けられることに他なりません。

この節の最後では、ビルドした結果の生成物の違いを少しだけ説明します。WPF XAMLでは、ビルド結果として XAML が BAML という埋め込みリソースとして作成されます。BAMLは、XAMLをビルドして作成されたバイナリーになり、起動時間の短縮などを目的としています。一方で、WinRT XAML では、ビルド結果として XAML が XBF というパッケージ コンテンツ(Windows 8.1)になります。XBFは、BAML と同じ目的でWindows ストア アプリの起動時間などの短縮を目的としています。

1.2(P10) グラフィカルなプロジェクト:XAML

HelloImage プロジェクトの MainWindow.xaml の抜粋を以下に示します。

<Grid Background="Black"> <Image Source="http://www.charlespetzold.com/pw6/PetzoldJersey.jpg" /> </Grid>

 

XAML そのものは、WinRT XAML と同じになります。もちろん、すでに説明したように Page クラスを Window クラスに置き換えています。逆に、Windows Forms の PictureBox クラスが Image クラスに置き換わります。さらに、プロパティの構造も大きく異なります。たとえば、PictureBox では ImageLocation とImage プロパティがありますが、Image は Source プロパティのみになります。また、SizeMode プロパティに相当するものとして、Stretch プロパティがあります。Stretch プロパティは、書籍に説明がありますので内容をご確認ください。HelloImage の実行結果を次に示します。

次にローカル リソースである画像を使ったHelloLocalImage プロジェクトを説明します。 WPF でプロジェクト内に含める画像などのアセットは、2 種類の扱い方があります。1 つは、プロジェクトのリソースとする方法と、もう1つは WinRT XAML で説明しているコンテンツにする方法です。WPF では、コンテンツとは、ローカルに配置したファイルへアクセスすることと同じ意味になりますので、ここではリソースに設定しているプロパティを示します。

プロジェクトに画像を配置して、ビルド アクションを「Resource」に設定するだけになります。こうすることで、出力するアセンブリ内に画像が埋め込まれることになります。この時の、MainWindow.xaml の抜粋を示します。

<Grid Background="Black"> <Image Source="Images/Greeting.png" Stretch="None" /> </Grid>


Source プロパティに URL を指定した時と同じように、埋め込みリソースを記述することもできます。リソースなどを指定する URI の詳細については、リソース(WPF)を参照してください。

1.3(P14) テキストのアレンジ

この節には、WrappedText、OverlappedStackedText、InternatinalHelloWorld プロジェクトがありますが、すでに説明した内容(Page を Windowへ、組み込みのスタイルを個別指定へ)で読み替えることで問題なく WPF に置き換えることができます。例として、実行結果だけを示します。

1.4(P23) メディアを使ったプロジェクト

この節には、HelloAudio、HelloVideo プロジェクトがありますが、すでに説明した内容(Page を Windowへ、組み込みのスタイルを個別指定へ)で読み替えることで問題なく WPF に置き換えることができます。WinRT XAML の MediaElement クラスには、Windows 8.1 よりAreTransportControlsEnabled プロパティが追加されています。このプロパティは、WPF XAML はサポートしていませんので注意してください。

Windows Forms では、ビデオやオーディオを統合するには工夫をする必要があります。一方で、XAML 環境では MediaElement クラスを使うことで、アプリケーションに統合することが簡単にできます。

1.5(P25) コードを使ったプロジェクト

XAML で UI を定義することと同じことが、コードだけでも実現することができます。最初に HelloCode プロジェクトの MainWindow.xaml.cs(MainPage.xaml.cs)の抜粋を示します。

public MainWindow() { InitializeComponent(); TextBlock txtblk = new TextBlock(); txtblk.Text = "Hello, Windows 8!"; txtblk.FontFamily = new FontFamily("Times New Roman"); txtblk.FontSize = 96; txtblk.FontStyle = FontStyles.Italic; // FontStyle.Italic を変更 txtblk.Foreground = new SolidColorBrush(Colors.Yellow); txtblk.HorizontalAlignment = HorizontalAlignment.Center; txtblk.VerticalAlignment = VerticalAlignment.Center; contentGrid.Children.Add(txtblk); }

 

WinRT XAML との違いは、FontStyle プロパティに設定して値を変更したことです。WinRT XAMLでは、FontStyle列挙になるりますが、WPF では FontStyles 列挙となります。Windows Forms では、Font.Style プロパティを使用しますが、WPF では Font プロパティではなく、FontFamily、FontSize、FontStyle プロパティが用意されており、しかも、System.Drawing.FontStyle 列挙ではなく、System.Windows.FontStyles 列挙となります。これは、WPF が System.Drawing 名前空間を使用するのではなく、WPF 独自の名前空間を使用しているからです。クラス名や列挙名だけを比べると同じ名前が WPF にありますが、実態は別の名前空間で定義されていることがありますので、ご注意ください。

1.6(P28) グラフィカルなプロジェクト:コード

この節には、HelloImageCode、HelloLocalImageCode プロジェクトがあります。基本的には、すでに説明した内容(Page を Windowへ、組み込みのスタイルを個別指定へ)で読み替えることで問題なく WPF に置き換えることができます。しかしながら、HelloLocalImageCode プロジェクトでは、イメージへのパスを書き換える必要がありますので、MainWindow.xaml.cs の抜粋を示します。

public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); // パスを変更 ms-appx:///Images/Greeting.png image.Source = new BitmapImage(new Uri("Images/Greeting.png", UriKind.Relative)); } }

 

これは、WinRT XAML と WPF XAML におけるリソースの取り扱い方による違いになります。WinRT XAML プロジェクトでのイメージはビルド アクションがコンテンツに指定されており、アプリ パッケージ内のリソースとなっていることから、「ms-appx:///」プレフィックスを使用しています。これに対して、WPF XAML プロジェクトではHelloLocalImage プロジェクトと同じように埋め込みリソースにしています。このため、XAML に記述するとのと同じパス表記をすることができています。

1.7(P31) ページですらない

WinRT XAMLでは、Page クラスが基本ですが、WPF では Window クラスを基本にするという説明をすでにしました。このことをコードのみでページを作って説明するというのが、この節の主題になっています。ここでは、App.xaml.cs を示します。

using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Linq; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Media; namespace StrippedDownHello { /// <summary> /// App.xaml の相互作用ロジック /// </summary> public partial class App : Application { [STAThreadAttribute()] public static void Main(string[] args) { var app = new App(); TextBlock txtblk = new TextBlock { Text = "Stripped-Down Windows 8", FontFamily = new FontFamily("Lucida sans Typewriter"), FontSize = 96, Foreground = new SolidColorBrush(Colors.Red), HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center }; var window = new Window { Title = "StrippedDownHello", WindowState = WindowState.Maximized, Content = txtblk }; app.Run(window); } } }

 

すでに説明してきた考え方をコードで示しています。このコードは、次のようなことを行っています。

  • App クラスのインスタンスを作成。
  • TextBlock クラスのインスタンスを作成。
  • Window クラスのインスタンスを作成し、Content プロパティに TextBlock のインスタンスを設定。
  • App クラスのRun メソッドに Window クラスのインスタンスを引数として渡す。

こうすることで、UI 定義の XAML がないアプリケーションを作成することができます。今度は、このようなプロジェクトの作成手順を示します。

  • 新しいプロジェクトで、WPF アプリケーション テンプレートを選択してプロジェクトを作成します。
  • MainWindow.xaml を削除します。
  • App.xaml のプロパティでビルド アクションを「ApplicationDefinition」から「Page」に変更します。
  • App.xaml を開いて、StartupUri プロパティを削除します。
  • App.xaml.cs へ Main メソッドの定義と必要なコードを記述します。

このようにすることで、アプリケーションのエントリー ポイントである Main メソッドをビルド タスクに任せることなく自分で定義できるようになります。この方法を使えば、Window を表示する前に何らかの処理を行うことができるようになります。

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

Pages

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