Subscribe: DotNetGerman Bloggers
http://blogs.dotnetgerman.com/mainfeed.aspx
Added By: Feedage Forager Feedage Grade B rated
Language: German
Tags:
angular  app  build  code  core  die  mit  net core  net standard  net  new  preview  studio  und  visual studio  visual 
Rate this Feed
Rate this feedRate this feedRate this feedRate this feedRate this feed
Rate this feed 1 starRate this feed 2 starRate this feed 3 starRate this feed 4 starRate this feed 5 star

Comments (0)

Feed Details and Statistics Feed Statistics
Preview: DotNetGerman Bloggers

DotNetGerman Bloggers



Alle Blogs von DotNetGerman.com



Copyright: Copyright 2004-2014 DotNetGerman.com
 



The Angular Bundle Optimizer under the Hoods

Thu, 27 Jul 2017 00:00:00 +0100

p a {text-decoration: underline} Thanks to Filipe Silva who reviewed this article and to Rob Wormald for a lot of insights regarding this technology. In my last article, I've shown that the Angular Build Optimizer transforms the emitted JavaScript Code to make tree shaking more efficient. To demonstrate this, I've created a simple scenario that includes two modules of Angular Material without using them. After using the Bundle Optimizer, the CLI/ webpack was able to reduce the bundle size by about the half leveraging tree shaking: If you are wondering how such amazing results are possible, you can find some answers in this article. Please note that when writing this the Angular Build Optimizer is still experimental. Nethertheless, the results show above are very promising. Tree Shaking and Side Effects The CLI uses webpack for the build process and to make tree shaking possible, webpack marks exports that are not used and can therefore be safely excluded. In addition to this, a typical webpack configuration uses UglifyJS for removing these exports. Uglify tries to be on the safe side and does not remove any code that could be need at runtime. For instance, when Uglify finds out that some code could produce side effects, it keeps it in the bundle. Look at the following (artificial and obvious) example that demonstrates this: (function(exports){ exports.pi = 4; // Let's be generous! })(...); Unfortunately, when transpiling ES2015+/TypeScript classes down to ES5, the class declaration results in imperative code and UglifyJS as well as other tools cannot make sure that this code isn't producing side effects. A good discussion regarding this can be found here on GitHub. That's why the code in question stays in the bundle even though it could be removed. To assure myself about this fact, I've created a simple npm based Angular Package using the Jurgen Van de Moere's Yeoman generator for Angular libraries as well as a CLI based application that references it. The package's entry point exports an Angular module with an UnusedComponent that -- as it's name implies -- isn't used by the application. It also exports an UnusedClass. In addition to that, it exports an other UnusedClass as well as an UsedClass from the same file (ES Module). export {UnusedClass} from './unused'; export {OtherUnusedClass, UsedClass} from './partly-used'; export {SampleComponent} from './sample.component'; export {UnusedComponent} from './unused.component'; @NgModule({ imports: [ CommonModule ], declarations: [ SampleComponent, UnusedComponent ], exports: [ SampleComponent, UnusedComponent ] }) export class SampleModule { } When building the whole application without the Angular Build Optimizer, none of the unused classes are tree shaken off. One reason for this is that -- as mentioned above -- Uglify cannot make sure that the transpiled classes don't introduce side effects. Marking pure Code Blocks To compensate for the shown issue, the Angular Build Optimizer marks transpiled class declarations that are not producing side effects with a special /*@__PURE__*/ comment. UglifyJS on the other side respects those comments and removes such code blocks if not referenced. Using this technique, we can get rid of unused classes but not of the unused component. The reason for this is, as the next section shows, Angular's module system. Removing Angular Decorators As the NgModule-Decorator defines an Array with its Components, Directives, Pipes and Services, there is always a reference to them when importing the module. This prevents tools from tree shaking unused building blocks off. But we are lucky, because after AOT compilation Angular's decorators are not needed anymore and therefore the Angular Bundle Optimizer removes them all. This leads to code that isn't referencing unneeded stuff anymore and allows to shake it off. Static Members For static members transpiled code is often introducing side effects preventing tree shaking too. For instance, look at the following example taken from the samples of the Optimizer'[...]



Shrinking Angular Bundles with the Angular Build Optimizer

Wed, 26 Jul 2017 17:00:00 +0100

p a { text-decoration: underline; } Thanks to Filipe Silva who reviewed this article and to Rob Wormald for a lot of insights regarding this technology. Also thanks to Sander Elias who gave important feedback. Beginning with version 1.3.0-rc.0, the Angular CLI makes use of the Angular Build Optimizer. This is a nifty tool that transforms the emitted JavaScript code to make tree shaking more efficient. This can result in huge improvements regarding bundle size. In this post I'm describing some simple scenarios that show the potential of this newly introduced tool. If you want to reproduce these scenarios, you find the source code used in my GitHub repository. Please note that the Angular Build Optimizer was still experimental when writing this. Therefore, it is subject to change. Nevertheless, as shown below, it comes with a high potential for shrinking bundles. Scenario 1 To demonstrate the power of the Angular Build Optimizer, I'm using a simple Angular Application I've created with the Angular CLI. After scaffolding, I've added the MdButtonModule and the MdCheckboxModule from Angular Material as well as Angular's NoopAnimationsModule and FormsModule: import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { AppComponent } from './app.component'; import { MdButtonModule, MdCheckboxModule } from '@angular/material'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { FormsModule } from "@angular/forms"; @NgModule({ declarations: [ AppComponent ], imports: [ BrowserModule, FormsModule, NoopAnimationsModule, MdButtonModule, MdCheckboxModule ], providers: [], bootstrap: [AppComponent] }) export class AppModule { } Please note that I'm using none of the added modules. I've just added them to find out how good the CLI/ webpack is in combination with the Angular Build Optimizer when it comes to shake them off. After this, I've created a production build without using the Build Optimizer and another one using it. For the latter one, I've leveraged the new -bo command line option: ng build --prod -bo The results of this are amazing: As this figure shows, using the Angular Build Optimizer the bundle size after tree shaking is about the half. This fits to my observations I've written down here some months ago: There are situations that prevent tree shaking implementations from doing their job as well as they can. The Build Optimizer seems to compensate this. Scenario 2 After this, I've added one component from each of the two included Angular Material modules to find out whether this is influencing tree shaking: Checked This led to the following results: Of course, both bundles are bigger, because now I'm using more parts of the bundles included. But, as before, using the Angular Build Optimizer our Bundles are about half as big. Scenario 3 Perhaps you are wondering what's the overhead introduced by the two Angular Material modules in the scenarios above. To find this out, I've removed referenced to their Angular Modules and created two more build -- one with and one without the Angular Bundle Optimizer: Compared to Scenario 1 this shows that when using the Build Optimizer, it is possible to shake off most parts of the Material Design Modules when they are imported but not used. Current Limitations As mentioned above, when writing this the Angular Build Optimizer was still experimental and therefore subject to change. Currently, it can introduce some issues when transforming the source code. For instance currently source maps are broken when creating a (production) build with the Optimizer. There is also an issue with rxjs operators and console logs. Another issue can arise when using getters with side effects as the optimizer leverages UglifyJS' pure_getters option. This option m[...]



Creating an email form with ASP.NET Core Razor Pages

Wed, 26 Jul 2017 00:00:00 Z

In the comments of my last post, I got asked to write about, how to create a email form using ASP.NET Core Razor Pages. The reader also asked about a tutorial about authentication and authorization. I'll write about this in one of the next posts. This post is just about creating a form and sending an email with the form values. Creating a new project To try this out, you need to have the latest Preview of Visual Studio 2017 installed. (I use 15.3.0 preview 3) And you need .NET Core 2.0 Preview installed (2.0.0-preview2-006497 in my case) In Visual Studio 2017, use "File... New Project" to create a new project. Navigate to ".NET Core", chose the "ASP.NET Core Web Application (.NET Core)" project and choose a name and a location for that new project. In the next dialogue, you probably need to switch to ASP.NET Core 2.0 to see all the new available project types. (I will write about the other ones in the next posts.) Select the "Web Application (Razor Pages)" and pressed "OK". That's it. The new ASP.NET Core Razor Pages project is created. Creating the form It makes sense to use the contact.cshtml page to add the new contact form. The contact.cshtml.cs is the PageModel to work with. Inside this file, I added a small class called ContactFormModel. This class will contain the form values after the post request was sent. public class ContactFormModel { [Required] public string Name { get; set; } [Required] public string LastName { get; set; } [Required] public string Email { get; set; } [Required] public string Message { get; set; } } To use this class, we need to add a property of this type to the ContactModel: [BindProperty] public ContactFormModel Contact { get; set; } This attribute does some magic. It automatically binds the ContactFormModel to the view and contains the data after the post was sent back to the server. It is actually the MVC model binding, but provided in a different way. If we have the regular model binding, we should also have a ModelState. And we actually do: public async Task OnPostAsync() { if (!ModelState.IsValid) { return Page(); } // create and send the mail here return RedirectToPage("Index"); } This is an async OnPost method, which looks pretty much the same as a controller action. This returns a Task of IActionResult, checks the ModelState and so on. Let's create the HTML form for this code in the contact.cshtml. I use bootstrap (just because it's available) to format the form, so the HTML code contains some overhead:

Contact us

<[...]



New Visual Studio Web Application: The ASP.NET Core Razor Pages

Mon, 24 Jul 2017 00:00:00 Z

I think, everyone who followed the last couple of ASP.NET Community Standup session heard about Razor Pages. Did you try the Razor Pages? I didn't. I focused completely on ASP.NET Core MVC and Web API. With this post I'm going to have a first look into it. I'm going to try it out. I was also a little bit skeptical about it and compared it to the ASP.NET Web Site project. That was definitely wrong. You need to have the latest preview on Visual Studio 2017 installed on your machine, because the Razor Pages came with ASP.NET Core 2.0 preview. It is based on ASP.NET Core and part of the MVC framework. Creating a Razor Pages project Using Visual Studio 2017, I used "File... New Project" to create a new project. I navigate to ".NET Core", chose the "ASP.NET Core Web Application (.NET Core)" project and I chose a name and a location for that project. In the next dialogue, I needed to switch to ASP.NET Core 2.0 to see all the new available project types. (I will write about the other one in the next posts.) I selected the "Web Application (Razor Pages)" and pressed "OK". Program.cs and Startup.cs I you are already familiar with ASP.NET core projects, you'll find nothing new in the Program.cs and in the Startup.cs. Both files look pretty much the same. public class Program { public static void Main(string[] args) { BuildWebHost(args).Run(); } public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup() .Build(); } The Startup.cs has a services.AddMvc() and an app.UseMvc() with a configured route: public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseBrowserLink(); } else { app.UseExceptionHandler("/Error"); } app.UseStaticFiles(); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); } That means the Razor Pages are actually part of the MVC framework, as Damien Edwards always said in the Community Standups. The solution But the solution looks a little different. Instead of a Views and a Controller folders, there is only a Pages folder with the razor files in it. Even there are known files: the _layout.cshtml, _ViewImports.cshtml, _ViewStart.cshtml. Within the _ViewImports.cshtml we also have the import of the default TagHelpers @namespace RazorPages.Pages @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers This makes sense, since the Razor Pages are part of the MVC Framework. We also have the standard pages of every new ASP.NET project: Home, Contact and About. (I'm going to have a look at this files later on.) As every new web project in Visual Studio, also this project type is ready to run. Pressing F5 starts the web application and opens the URL in the browser: Frontend For the frontend dependencies "bower" is used. It will put all the stuff into wwwroot/bin. So even this is working the same way as in MVC. Custom CSS and custom JavaScript ar in the css and the js folder under wwwroot. This should all be familiar for ASP.NET Corer developers. Also the way the resources are used in the _Layout.cshtml are the same. Welcome back "Code Behind" This was my first thought for just a second, when I saw the that there are nested files under the Index, About, Contact and Error pages. At the first glimpse this files are looking almost like Code Behind files of Web Form based ASP.NET Pages, but are completely different: public class ContactModel : PageModel { public string Message { get; set; } public void OnGet() { Message = "Your contact page."; } } They are not called Page, but Model and they have something like an handler in it, to do something on a specific action. Actually it is not a handler, it is an an method which gets automati[...]



LightCore is back - LightCore 2.0

Mon, 17 Jul 2017 00:00:00 Z

Until now it is pretty hard to move an existing more complex .NET Framework library to .NET Core or .NET Standard 1.x. More complex in my case just means, e. g. that this specific library uses reflection a little more than maybe some others. I'm talking about the LightCore DI container. I started to move it to .NET Core in November 2015, but gave up halve a year later. Because it needs much more time to port it to NET Core and because it makes much more sense to port it to the .NET Standard than to .NET Core. And the announcement of .NET Standard 2.0 makes me much more optimistic to get it done with pretty less effort. So I stopped moving it to .NET Core and .NET Standard 1.x and was waiting for .NET standard 2.0. LightCore is back Some weeks ago the preview version of .NET Standard 2.0 was announced and I tried it again. It works as expected. The API of .NET Standard 2.0 is big enough to get the old source of LightCore running. Also Rick Strahl did some pretty cool and detailed post about it: Upgrading to .NET Core 2.0 Preview Multi-Targeting and Porting a .NET Library to .NET Core 2.0 The current status I created .NET Standard 2.0 libraries for the most of the projects. I didn't change most parts of the code. The XAML configuration stuff was an exception. I also ported the existing unit tests to .NET Core Xunit test libraries and the tests are running. That means LightCore is definitely running with .NET Core 2.0. We'll get one breaking change: I moved the file based configuration from XAML to JSON, because the XAML serializer is not (maybe not yet) supported in .NET Standard. We'll get another breaking change: I don't want to support Silverlight anymore. Silverlight users should use the old packages instead. Sorry about that. Roadmap I don't really want to release the new version until the .NET Standard 2.0 is released. I don't want to have the preview versions of the .NET Standard libraries referenced in a final version of LightCore. That means, there is still some time to get the open issues done. 2.0.0-preview1 End of July 2017 Uses the preview versions of .NET Standard 2.0 and .NET Core 2.0 2.0.0-preview2 End of August 2017 Uses the preview versions of .NET Standard 2.0 and .NET Core 2.0. Maybe the finals, if they are released until that. 2.0.0 September 2017 depends on the release of .NET Standard 2.0 and .NET Core 2.0 Open issues The progress is good, but there is still something to do, before the release of the first preview: We need to have the same tests in .NET Framework based unit tests to be sure https://github.com/JuergenGutsch/LightCore/issues/4 We need to finalize the ASP.NET integration package to get it running again in ASP.NET 4.x Should be small step, because it is almost done: The WebAPI integration and the sample application is needed. https://github.com/JuergenGutsch/LightCore/issues/4 We need to complete the ASP.NET Core integration package to get it running in ASP.NET Core Needs some more time, because it needs a generic and proper way to move the existing service registrations from the ASP.NET Core's IServiceCollection to LightCore https://github.com/JuergenGutsch/LightCore/issues/6 Continuous integration and deployment using AppVeyor should be set-up https://github.com/JuergenGutsch/LightCore/issues/2 https://github.com/JuergenGutsch/LightCore/issues/3 Documentation should be set-up on GitHub https://github.com/JuergenGutsch/LightCore/issues/3 Contributions I'd like to call for contributions. Try LightCore, raise Issues, create PRs and whatever is needed to get LightCore back to life and whatever is needed to make it a lightweight, fast and easy to use DI container.[...]



.NET Stammtisch in Linz

Fri, 14 Jul 2017 09:10:48 Z

Der .NET Stammtisch in Linz hat sein zweites Treffen angekündigt: Event-URL (mit Details): https://www.facebook.com/events/1003694579733452/ Termin: Mittwoch, 26. Juli um 18:30 Location: Coworking Cube, Obere Landstr. 19 Pucking, Oberosterreich, Austria Rainer Stropek spricht über "Dockerizing .NET Apps" .NET und C# sind für sich schon tolle Werkzeuge, um moderne Softwareprodukte umzusetzen. Gibt man aber noch ein wenig...



Directly upgrading from AngularJS 1.x to Angular without preparing the existing Code Base

Fri, 14 Jul 2017 00:00:00 +0100

p a {text-decoration: underline; } When upgrading from AngularJS 1.x to Angular (2/4/5 etc.), we usually prepare our AngularJS 1.x code base first: This can involve leveraging new AngularJS 1.x techniques like components. Additionally, introducing TypeScript as well as module loaders like SystemJS or webpack are further tasks to prepare the existing code. The goal behind this is to draw near Angular in order to allow a better integration. But in some situations preparing the existing code is too costly. For instance, think about situations where we just want to write new parts of the application with Angular without the need to modify much of the existing AngularJS 1.x code. When this holds true for your project, skipping the preparation phase could be a good idea: This post shows step by step, how this approach can be accomplished. Like the official and well written upgrading tutorial which includes preparing the code base, it upgrades the popular AngularJS 1.x Phone Catalog Sample. Even though this sample leverages AngularJS components introduced with AngularJS 1.5, everything shown here also works with more "traditional" AngularJS code using controllers and directives. The whole sample can be found in my GitHub repository. In order to make following everything easier, I've also created one commit for each of the steps described here. Step 1: Creating the new Angular Application As a starting point this article assumes that we are scaffolding a new Angular application with the Angular CLI: ng new migrated To make the structure of this new solution clearer, create one folder for the existing AngularJS code and another one for the new Angular code within src. In the sample presented here, I've used the names ng1 and ng2: After this, move every generated file except the shown tsconfig.app.json, tsconfig.spec.json, favicon.ico and index.html into the ng2 folder. To inform the CLI's build task about this new structure, adopt the file .angular-cli.json. Using the assets section in this file, we can also tell the CLI to directly copy the ng1 folder to the output directory: { "$schema": "./node_modules/@angular/cli/lib/config/schema.json", "project": { "name": "migrated" }, "apps": [ { "root": "src", "outDir": "dist", "assets": [ "ng1", "assets", "favicon.ico" ], "index": "index.html", "main": "ng2/main.ts", "polyfills": "ng2/polyfills.ts", "test": "ng2/test.ts", "tsconfig": "tsconfig.app.json", "testTsconfig": "tsconfig.spec.json", "prefix": "app", "styles": [ "ng2/styles.css" ], "scripts": [], "environmentSource": "ng2/environments/environment.ts", "environments": { "dev": "ng2/environments/environment.ts", "prod": "ng2/environments/environment.prod.ts" } } ], "e2e": { "protractor": { "config": "./protractor.conf" } }, "lint": [ { "project": "tsconfig.app.json" }, { "project": "tsconfig.spec.json" }, { "project": "tsconfig.e2e.json" } ], "test": { "karma": { "config": "./karma.conf" } }, "defaults": { "styleExt": "css", "component": {} } } Now copy the whole AngularJS 1.x application into the ng1 folder but omit it's index.html. To make the existing application work with the adopted folder structure, we have to update it. This involves updating every reference to a template as well as references to JSON files and images. After this, we can merge the existing index.html with the new one in the folder src: Migrated



Folien zum Vortrag Lernen durch Üben

Thu, 13 Jul 2017 09:00:54 Z

Ich habe meine Folien zum Vortrag „Lernen durch Üben“, den ich auf der DWX 2017 gehalten habe, zu Speakerdeck hochgeladen.    

Der Beitrag Folien zum Vortrag Lernen durch Üben erschien zuerst auf Refactoring Legacy Code.




Folien zum Vortrag Nextlevel Clean Code Development

Tue, 11 Jul 2017 07:40:39 Z

Die Folien zu meinem Vortrag „Nextlevel Clean Code Development“ sind online bei Speakerdeck zu finden.    

Der Beitrag Folien zum Vortrag Nextlevel Clean Code Development erschien zuerst auf Refactoring Legacy Code.




Interview von der DWX17 zu Nextlevel Clean Code Developer

Mon, 10 Jul 2017 09:18:32 Z

Während der DWX 2017 in Nürnberg hat Tilman Börner, Chefredakteur der dotnetpro, mich interviewt. Im Interview plaudern wir über die Entwicklung der Clean Code Developer Initiative.    

Der Beitrag Interview von der DWX17 zu Nextlevel Clean Code Developer erschien zuerst auf Refactoring Legacy Code.




Technische Schulden verfolgen mit NDepend 2017.2

Mon, 10 Jul 2017 06:24:09 Z

NDepend nutzte ich mittlerweile häufig zur Analyse meiner Anwendungen. Die statische Codeanalyse liefert zwar kein vollständiges Bild zum Zustand einer Anwendung, aber man erhält genügend Informationen um Probleme frühzeitig zu erkennen. Die früheren Versionen hatte ich bereits hier und hier beschrieben. In der neusten Version kommt nun das Thema der technischen Schulden grosse Beachtung. Ein … Technische Schulden verfolgen mit NDepend 2017.2 weiterlesen(image)



Three times in a row

Mon, 10 Jul 2017 00:00:00 Z

On July 1st, I got the email from the Global MVP Administrator. I got the MVP award the third time in a row :)

I'm pretty proud about that and I'm happy to be part of the great MVP community one year more. I'm also looking forward to the Global MVP Summit in March to meet all the other MVPs from around the world.

(image)

Not really a fan-boy...?

I'm also proud of that, because I don't really call me a Microsoft fan-boy. And sometimes, I also criticize some tools and platforms built by Microsoft (feel like a bad boy). But I like most of the development tools build by Microsoft and I like to use the tools, and frameworks and I really like the new and open Microsoft. The way how Microsoft now supports more than its own technologies and platforms. I like using VSCode, Typescript and Webpack to create NodeJS applications. I like VSCode and .NET Core on Linux to build Applications on a different platform than Windows. I also like to play around with UWP Apps on Windows for IoT on a Raspberry PI.

There are much more possibilities, much more platforms, much more customers to reach, using the current Microsoft development stack. And this is really fun to play with it, to use it in real project, to write about it in .NET magazines, in this blog and to talk about it in the user groups and on conferences.

Thanks

But I wouldn't get honored again without such a great development community. I wouldn't continue to contribute to the community without that positive feedback and without that great people. This is why the biggest "Thank You" goes to the development community :)

Sure, I also need to say "Thank You" to my great family (my lovely wife and my three kids) which supports me in spending som much time to contribute to the community. I also need to say Thanks to my company and my boss for supporting me and allowing me to use parts of my working time to contribute the the community.

(image)



Webpack 2 Parameterübergabe and den Buildprozess auf der Konsole

Fri, 07 Jul 2017 21:00:11 Z

Die meisten Beispiele für Webpack enthalten fertige Konfigurationen die als npm scripte hinterlegt sind. Wenn man aber einen automatisierten Build Prozess verwendet z.B. über den TFS, dann möchte man evtl. einige Variablen von außen an den Buildprozess übergeben. Dazu könnte z.B. die “baseUrl” gehören, wenn die Anwendung nicht im Root des Webserver gehostet wird. Wenn […](image)



CSS IntelliSense in Visual Studio mit Angular und Resharper

Fri, 07 Jul 2017 17:37:31 Z

Manchmal könnte man sagen “früher” war alles besser. Zumindest war es mit Angular 1 und dem “alten” System in dem man noch direkt JavaScript und Styles eingebunden hat, einfacher im HTML die passende IntelliSense für die CSS Klassen mit der Hilfe von Resharper zu erhalten. Dabei handelte es sich z.B. um Bootstrap und font awesome […](image)



Angular Fundamentals Workshop in Karlsruhe

Thu, 06 Jul 2017 11:22:19 Z

Zur Unterstützung des NOSSUED Software Entwicklungs Open Space bieten wir den ersten 2 Teilnehmern, die uns eine Kopie ihres Tickets an schulung@co-IT.eu zukommen lassen, die Teilnahme an unserem 3-tägigen Angular 4 Fundamentals Workshop kostenlos an. Das Training ist vom 11-13. Juli in unseren modernen, klimatisierten Büros mit höhenverstellbaren Tischen im Herzen von Karlsruhe. Unser Firmenprofil verrät euch mehr. …(image)



#NOSSUED SOFTWARE ENTWICKLUNGS OPEN SPACE 2017

Thu, 06 Jul 2017 08:47:56 Z

Es ist mal wieder so weit: Zum achten Mal findet #nossued, der Software Open Space der .NET Usergroup in Karlsruhe statt. Termin ist der 14-16 Juli. Zur Anmeldung geht es hier. Der Teilnahmebeitrag kann wie immer frei gewählt werden. Impressionen der letzten Open Spaces findet ihr in meinem Blog. Meinen Artikel zum Open Space Format hat die dotnetpro freundlicherweise …(image)



DWX2017: Inhalte zum meinen Sessions

Mon, 03 Jul 2017 17:17:00 Z

(image)

Wie jedes Jahr fand auch in diesem Jahr wieder mit der Developer Week die größte deutsche Entwicklerkonferenz im NCC Ost in Nürnberg statt. An dieser Stelle möchte ich nun alle Inhalte zu meinen Sessions und Workshops zum Download anbieten. Im Archiv enthalten sind alle Inhalte, die während meiner Session erzeugt wurden, also Folien, Notizen in OneNote sowie alle Projekte aus Visual Studio (2017).

Sessions

Workshops
Wichtiger Hinweis: Das Archiv zum Workshop ist mit einem Passwort versehen, welches allen Teilnehmern während dem Workshop bekannt gegeben wurde. Falls es jemand vergessen haben sollte, kann dies per Email erfragt werden.

Ich möchte mich auf diesem Wege noch einmal bei allen Teilnehmern meiner Sessions und des Workshops bedanken, es war wirklich wieder eine wahnsinnig tolle und spaßige Veranstaltung.




Autoscaling Azure Web Apps

Mon, 03 Jul 2017 08:48:36 Z

Recent changes in Azure brought some significant changes in autoscaling options for Azure Web Apps (i.e. Azure App Service to be precise as scaling happens on App Service plan level and has effect on all Web Apps running in that App Service plan). This article describes how you can configure basic autoscaling based on CPU...



DevOps – technische Ressourcen

Mon, 03 Jul 2017 08:16:22 Z

Es gibt eine neue Bibliothek rund um das Thema DevOps. Ihr findet dort alles was ihr braucht, um möglichst schnell von 0 auf DevOps zu kommen. Auf der Seite wird sowohl die strategische Bedeutung von DevOps für die Software-Entwicklung erläutert, … Weiterlesen



Non-cryptographic hash functions for .NET

Fri, 30 Jun 2017 00:15:00 Z

Creating hashs is quite common to check if content X has changed without looking at the whole content of X. Git for example uses SHA1-hashs for each commit. SHA1 itself is a pretty old cryptographic hash function, but in the case of Git there might have been better alternatives available, because the “to-be-hashed” content is not crypto relevant - it’s just content marker. Well… in the case of Git the current standard is SHA1, which works, but a ‘better’ way would be to use non-cryptographic functions for non-crypto purposes.

Why you should not use crypto-hashs for non-crypto

I discovered this topic via a Twitter-conversation and it started with this Tweet:

The author of this awesome package is Brandon Dahler, who created .NET versions of the most well known algorithm and published them as NuGet packages.

The source and everything can be found on GitHub.

Lessons learned

If you want to hash something and it is not crypto relevant, then it would be better to look at one of those Data.HashFunctions - some a pretty crazy fast.

I’m not sure which one is ‘better’ - if you have some opinions please let me know. Brandon created a small description of each algorithm on the Data.HashFunction documentation page.

(my blogging backlog is quite long, so I needed 6 month to write this down ;) )

(image)



ibiola - Mobilität neu erFAHREN!

Tue, 27 Jun 2017 08:14:07 Z

Möchten Sie Ihren Mitarbeitern ein Mehr an Mobilität bieten und dabei Ihre Fuhrparkkosten um 35% reduzieren? Dann ist Corporate Carsharing das Richtige für Sie. Und wenn alles einfach laufen soll, dann ist ibiola® die richtige Lösung! Was bereitet Fuhrparkmanagern Kopfzerbrechen? Unausgelastete Flotte (hohe Stillstandzeiten) - Sie zahlen zu hohe Fixkosten - jede Stunde, jeden Tag...






Xamarin Exception: Could not load file or assembly mono.posix beim Debugging

Mon, 26 Jun 2017 14:03:38 +0200

Nach einem der letzten Updates zu Visual Studio 2017.2 erhielt ich folgende Fehlermeldung beim Debugging einer Android App:

EXCEPTION: Mono.Debugging.Soft.DisconnectedException: The connection with the debugger has been lost. The target application may have exited. ---> System.IO.FileNotFoundException: Can not load 'Mono.Posix, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756' or its dependencies. File not found.
   at Mono.Debugging.Soft.SoftDebuggerSession.ResolveSymbolicLink(String path)
   at Mono.Debugging.Soft.SoftDebuggerSession.PathsAreEqual(String p1, String p2)
   at Mono.Debugging.Soft.SoftDebuggerSession.FindLocationByMethod(MethodMirror method, String file, Int32 line, Int32 column, Boolean& insideTypeRange)
   at Mono.Debugging.Soft.SoftDebuggerSession.FindLocationByType(TypeMirror type, String file, Int32 line, Int32 column, Boolean& genericMethod, Boolean& insideTypeRange)
   at Mono.Debugging.Soft.SoftDebuggerSession.ResolveBreakpoints(TypeMirror type)
   at Mono.Debugging.Soft.SoftDebuggerSession.HandleTypeLoadEvents(TypeLoadEvent[] events)
   at Mono.Debugging.Soft.SoftDebuggerSession.HandleEventSet(EventSet es)
   at Mono.Debugging.Soft.SoftDebuggerSession.EventHandler()

Eine Lösung des Problems war glücklicherweise schnell gefunden. Wie man auf der Xamarin Release Seite nachlesen kann, wird die Datei Mono.Posix.dll tatsächlich durch den Visual Studio Installer nicht mit intstalliert.

Bis das Problem mit einem Update behoben ist hilft folgender Workarround, der aus dem obigen Link entnommen wurde:

  • Download der fehlenden Datei Mono.Posix.
  • Entpacken des Archivs
  • In den Eigenschaften der Mono.Posix.dll prüfen ob die Datei durch Xamarin Inc. signiert wurde
  • Datei ggfs. im Tab Allgmemein der Eigenschaften “Entblocken”
  • Unter: Visual Studio 2017: Datei Mono.Posix.dll in das “Xamarin.VisualStudio” Erweiterungs-Verzeichnis kopieren. Bei mir lag das unter: C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\Extensions\Xamarin.VisualStudio
  • Visual Studio beenden und neustarten falls es während des Kopiervorgangs lief.

Das Problem sollte zum Glück nur temporär bestehen, da es im Xamarin Bugzilla bereits auf den Status gelöst gesetzt wurde. Mit Visual Studio 2017.3 sollte sich das Problem also erledigt haben.

(image)



Build Recap17–Folien der Vortragenden

Mon, 26 Jun 2017 08:58:02 Z

Hier findet ihr die Folien bzw. hilfreiche Links von unserem Community Event "Build Recap 17"



Kann Microsoft HoloLens die Angst vor Strahlentherapie mindern?

Fri, 23 Jun 2017 06:57:42 Z

Kann Virtual Reality die Rehabilitation erfolgreich unterstützen? Diese und andere Fragen werden beim build.well.being. Digital Healthcare Networking Event der FH St. Pölten diskutiert. Technik revolutioniert den Healthcare-Sektor. Bei der build.well.being.-Veranstaltung wird ein Querschnitt der aktuellsten Themen im Bereich Digital Healthcare präsentiert. Wann: 30. Juni 2017, 14:00 – 17:00 Uhr Wo: FH St. Pölten, Matthias Corvinus-Straße 15, A-3100 St. Pölten Anmeldung: https://buildwellbeing.fhstp.ac.at/



Git einsetzen mit verschiedenen E-Mail Adressen

Thu, 22 Jun 2017 17:32:48 Z

Als Freiberufler bin ich regelmäßig bei verschiedenen Kunden im Einsatz. Teilweise auch parallel. Viele nutzen davon auch Git zur Versionskontrolle. Dies ist generell ein gute Entwicklung die ich beobachte.

Globale E-Mail Konfiguration

Jedoch habe ich lange Zeit in der global git config immer meine E-Mail Adresse eingetragen, ist ja so




GraphQL end-point Middleware for ASP.NET Core

Thu, 22 Jun 2017 00:00:00 Z

The feedback about my last blog post about the GraphQL end-point in ASP.NET Core was amazing. That post was mentioned on reddit, many times shared on twitter, lInked on http://asp.net and - I'm pretty glad about that - it was mentioned in the ASP.NET Community Standup. Because of that and because GraphQL is really awesome, I decided to make the GraphQL MiddleWare available as a NuGet package. I did some small improvements to make this MiddleWare more configurable and more easy to use in the Startup.cs NuGet Currently the package is a prerelease version. That means you need to activate to load preview versions of NuGet packages: Package name: GraphQl.AspNetCore Version: 1.0.0-preview1 https://www.nuget.org/packages/GraphQl.AspNetCore/ Install via Package Manager Console: PM> Install-Package GraphQl.AspNetCore -Pre Install via dotnet CLI: dotnet add package GraphQl.AspNetCore --version 1.0.0-preview1 Using the library You still need to configure your GraphQL schema using the graphql-dotnet library, as described in my last post. If this is done open your Startup.cs and add an using to the GraphQl.AspNetCore library: using GraphQl.AspNetCore; You can use two different ways to register the GraphQl Middleware: app.UseGraphQl(new GraphQlMiddlewareOptions { GraphApiUrl = "/graph", // default RootGraphType = new BooksQuery(bookRepository), FormatOutput = true // default: false }); app.UseGraphQl(options => { options.GraphApiUrl = "/graph-api"; options.RootGraphType = new BooksQuery(bookRepository); options.FormatOutput = false; // default }); Personally I prefer the second way, which is more readable in my opinion. The root graph type needs to be passed to the GraphQlMiddlewareOptions object, depending on the implementation of your root graph type, you may need to inject the data repository or a EntityFramework DbContext, or whatever you want to use to access your data. In this case I reuse the IBookRepository of the last post and pass it to the BooksQuery which is my root graph type. I registered the repository like this: services.AddSingleton(); and needed to inject it to the Configure method: public void Configure( IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IBookRepository bookRepository) { // ... } Another valid option is to also add the BooksQuery to the dependency injection container and inject it to the Configure method. Options The GraphQlMiddlewareOptions are pretty simple. Currently there are only three properties to configure RootGraphType: This configures your GraphQL query schema and needs to be set. If this property is unset an ArgumentNullException will be thrown. GraphApiUrl: This property defines your GraphQL endpoint path. The default is set to /graph which means your endpoint is available under //yourdomain.tld/graph FormatOutput: This property defines whether the output is prettified and indented for debugging purposes. The default is set to false. This should be enough for the first time. If needed it is possible to expose the Newtonsoft.JSON settings, which are used in GraphQL library later on. One more thing I would be happy, if you try this library and get me some feedback about it. A demo application to quickly start playing around with it, is available on GitHub. Feel free to[...]



AOT und Tree Shaking mit Angular - Folien und Beispiel von meiner Session auf EnterJS in Darmstadt

Thu, 22 Jun 2017 00:00:00 +0100

Nachfolgend die Folien und Beispiele zum Vortrag "AOT und Tree Shaking mit Angular":




IEC 61131-3: Additional language extensions

Sat, 17 Jun 2017 08:38:00 Z

The focus of my post has been the object-oriented extensions so far. But there are several general, usually not so far-reaching innovations within TwinCAT 3. Below, they are briefly described. Array initialization If a declared array has to be initialized, the list with the initialization values should be set into square brackets. So far, the […](image)



LEGO® Robotik: Neues Projekt online

Fri, 16 Jun 2017 21:08:25 Z

Nach langer Zeit gibt es mal wieder einen Blogpost von mir. 🙂 Allerdings auch nur einen ganz kleinen, in dem ich Ankündigen möchte, dass ab nun alle LEGO®-Robotik-Themen auf https://www.legorobotik.de anzutreffen sind. Ich werde die bestehenden Beiträge auf diesem Blog nicht löschen oder auf LEGO® Robotik neu veröffentlichen, aber neue Beiträge zu diesem Thema dürft […](image)



TFS 2017 Update 2 (RC1)

Wed, 14 Jun 2017 09:38:47 Z

Für den Visual Studio Team Foundation Server, TFS (die lokale Variante der Visual Studio Team Services, VSTS) kommt ein eher ungewöhnlich großes Funktionsupdate. Derzeit ist das Update 2 als Release Candidate verfügbar. Viele neue Funktionen, wie zum Beispiel die Delivery Plans, werden nun auch im Server verfügbar. Wie immer gilt, die Visual Studio Team Services...



pwnwin - die eSports Plattform für Alle

Tue, 13 Jun 2017 14:38:22 Z

pwnwin, die weltweit führende Plattform für eSports Wettbewerbe mit über 100.000 aktiven Nutzern monatlich, hat soeben ihren Marketplace eröffnet. Wir haben pwnwin im Dezember 2015 in Mondsee gegründet und uns zum Ziel gesetzt, den Markt für eSports Wettbewerbe zu erobern. Mit weltweit über 700.000 registrierten Benutzern und über 100.000 monatlich aktiven Benutzern sind wir auch...



Abhängigkeiten reduzieren

Mon, 12 Jun 2017 14:16:06 Z

Abhängigkeiten sind das Grundübel der Softwareentwicklung. Viele Entwickler nehmen sie als gegeben hin. Doch wir können Abhängigkeiten so reduzieren, dass Testbarkeit, Lesbarkeit und damit die Wandelbarkeit deutlich verbessert werden.

Der Beitrag Abhängigkeiten reduzieren erschien zuerst auf Refactoring Legacy Code.




Podcast für Fachinformatiker

Sun, 11 Jun 2017 07:41:38 Z

Stefan Macke präsentiert schon einige Zeit seinen Podcast für Fachinformatiker Anwendungsentwicklung. Er hat mich zum Thema Clean Code Developer interviewt.

Der Beitrag Podcast für Fachinformatiker erschien zuerst auf Refactoring Legacy Code.




Dependency Manager – Abkündigung der XAML-Build-Aktivitäten

Thu, 08 Jun 2017 16:03:21 Z

Das neue Build-System in Visual Studio Team Services (VSTS) bzw. im Team Foundation Server (TFS) gewinnt immer mehr an Bedeutung. Deshalb haben wir uns nach reiflicher Überlegung entschieden, die Unterstützung der XAML-Build-Aktivitäten CleanDependencies und GetDependencies im AIT Dependency Manager abzukündigen. An der aktuellen Produktversion ändert sich nichts, alles funktioniert wie gewohnt. Bei zukünftigen Releases werden wir […]



WiX: Automatische Fragmenterzeugung mit Heat

Thu, 08 Jun 2017 07:00:53 Z

Das WiX Toolset ist ein mächtiges Werkzeug um Installationsroutinen mit Hilfe von XML zu erzeugen. Herzstück eines WiX Projektes ist das Product Element. Innerhalb diesem werden die Elemente der Installationsroutine definiert. Um außerhalb des Product Elements Installationselemente wie Components oder Directorys zu definieren wird ein Fragment Element benötigt, in welchem die einzelnen Elemente angelegt werden. […]



C3 Loyalty Services - die neue Kunst der Kundenbindung

Tue, 06 Jun 2017 12:35:28 Z

Was macht C3 Loyalty Services? Das österreichische Unternehmen C3 Loyalty Services entwickelt einen neuen und innovativen CRM-Ansatz, mit dem insbesondere international agierende Handelskonzerne den vielschichtigen Herausforderungen der Digitalisierung begegnen können. Die dringend notwendige und aktuell stark diskutierte „digitale Transformation“ im stationären Handel hat einen entscheidenden Einfluss auf das zukünftige Kundenbeziehungsmanagement – und somit auf die...



//BUILD on Tour Neuigkeiten für Devs und IT-Pros - UPDATE

Mon, 05 Jun 2017 11:30:39 Z

WANN: 21. Juni 2017 | 08:30 Uhr - 17:30 Uhr WO: Microsoft Österreich, Am Euro Platz 3, 1120 Wien UPDATE - FINAL AGENDA!



Shrinking Angular Bundles with Closure

Sat, 03 Jun 2017 00:00:00 +0100

p a { text-decoration: underline; } Big thanks to Alex Eagle from the Angular Team and to Carmen Popoviciu for reviewing this post. Closure is said to be the most sophisticated JavaScript compiler available today. Its advanced optimization mode goes far beyond the tree shaking capabilities of other tools and allows for shrinking bundles to a minimum. Google uses it to improve the performance of its own products like Google Docs and even Microsoft is using it meanwhile for Office 365. However, it's considered to be an expert tool and therefore difficult to configure. In addition to that, it assumes that the underlying JavaScript code has been written in a specific way. Currently, the Angular team is working hard on making Angular work together with Closure as well as with its build tool Bazel. There are some first examples available, e. g. the Example Alex Eagle from the Angular Team created. This post uses the mentioned example to show how to use the Closure compiler as well as the advantages it brings regarding bundle sizes. Furthermore, this post explains how to add own and existing packages to a Closure based project. Building a base line with the Angular CLI In order to create a baseline for comparing Closure with a 'traditional' build task for Angular, let's create a new Hello World application with the Angular CLI: ng new baseline cd baseline Now, let's create a production build: ng build --prod The generated bundles have a size of about 394K: 1.460 inline.093de888567e5146835d.bundle 9.360 main.0d097609144c942cc763.bundle 60.845 polyfills.d90888e283bda7f009a0.bundle 322.320 vendor.765bef7fc0b73d2d51d7.bundle 393.985 Bytes As the Closure sample in the next sections is directly importing the zone polyfill and not importing any other ones, we should omit the polyfills bundle from this observation: 1.460 inline.093de888567e5146835d.bundle 9.360 main.0d097609144c942cc763.bundle 322.320 vendor.765bef7fc0b73d2d51d7.bundle 333.140 Bytes This leaves about 333K. After this we are installing Angular Material as well as the Animation package which Angular Material depends on: npm i @angular/material --save npm i @angular/animations --save To import it into the application, its AppModule is referencing some of Angular Material's Modules: import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { FormsModule } from '@angular/forms'; import { HttpModule } from '@angular/http'; import { AppComponent } from './app.component'; import { MdButtonModule, MdAutocompleteModule, MdCheckboxModule, MdDatepickerModule, MdCardModule, MdRadioModule, MdChipsModule, MdListModule, MdSnackBarModule, MdSliderModule, MdDialogModule, MdMenuModule, MdSidenavModule } from '@angular/material'; @NgModule({ imports: [ BrowserModule, FormsModule, HttpModule, MdButtonModule, MdAutocompleteModule, MdCheckboxModule, MdDatepickerModule, MdCardModule, MdRadioModule,[...]



DevOps mit Microsoft Azure (für Partner)

Thu, 01 Jun 2017 18:42:01 Z

Die Kollegen von Microsoft Central & Estern Europe bieten ein kostenloses Partner-Onlinetraining zum Thema DevOps mit Microsoft Azure an. Das Online-Training wird in englischer Sprache abgehalten:   Date:               6, June 2017 Time:               11:30-13:30 (GMT+2) Registration:  https://www.microsoftevents.com/profile/form/index.cfm?PKformID=0x2108488a43c Training Agenda First part: What is DevOps? Using "the cloud" as a development tool Visual Studio for DevOps How...



Entity Framework SaveChanges beschleunigen

Thu, 01 Jun 2017 10:19:50 Z

SaveChanges eines Entity Framework-Kontextes ist gerade bei vielen Änderungen oder vielen Inserts sehr langsam. Dieser Artikel zeigt Optimierungsmöglichkeiten auf.

The post Entity Framework SaveChanges beschleunigen appeared first on Norbert Eder.




Moderne Security-Lösungen mit Angular, OAuth 2 und OpenID Connect: Folien und Beispiel von XPC 2017 (München, Online)

Thu, 01 Jun 2017 00:00:00 +0100

Nachfolgend meine Folien und mein Beispiel von der XPC 2017:




Extend your Xamarin.Android app with OpenStreetMap

Wed, 31 May 2017 00:00:00 Z

In my last post I described how you can use OpenStreetMaps within your Xamarin.iOS app. Please read that article first, if you don't know what OpenStreetMaps is. Today I show you how you can make use of OpenStreetMaps in your Xamarin.Android app.



A first glimpse into .NET Core 2.0 Preview 1 and ASP.​NET Core 2.0.0 Preview 1

Tue, 30 May 2017 00:00:00 Z

At the Build 2017 conference Microsoft announced the preview 1 versions of .NET Core 2.0, of the .NET Standard 2.0 and ASP.NET Core 2.0. I recently had a quick look into it and want to show you a little bit about it with this post. .NET Core 2.0 Preview 1 Rich Lander (Program Manager at Microsoft) wrote about the release of the preview 1, .NET Standard 2.0, tools support in this post: Announcing .NET Core 2.0 Preview 1. It is important to read the first part about the requirements carefully. Especially the requirement of Visual Studio 2017 15.3 Preview. At the first quick look I was wondering about the requirement of installing a preview version of Visual Studio 2017, because I have already installed the final version since a few months. But the details is in the numbers. The final version of Visual Studio 2017 is the 15.2. The new tooling for .NET Core 2.0 preview is in the 15.3 which is in preview currently. So if you want to use .NET Core 2. preview 1 with Visual Studio 2017 you need to install the preview of 15.3 The good thing is, the preview can be installed side by side with the current final of Visual Studio 2017. It doesn't double the usage of disk space, because both versions are able share some SDKs, e.g. the Windows SDK. But you need to install the add-ins you want to use for this version separately. After the Visual Studio you need to install the new .NET Core SDK which also installs NET Core 2.0 Preview 1 and the .NET CLI. The .NET CLI After the new version of .NET Core is installed type dotnet --version in a command prompt. It will show you the version of the currently used .NET SDK: Wait. I installed a preview 1 version and this is now the default on the entire machine? Yes. The CLI uses the latest installed SDK on the machine by default. But anyway you are able to run different .NET Core SDKs side by side. To see what versions are installed on our machine type dotnet --info in a command prompt and copy the first part of the base path and past it to a new explorer window: You are able to use all of them if you want to. This is possible by adding a "global.json" to your solution folder. This is a pretty small file which defines the SDK version you want to use: { "projects": [ "src", "test" ], "sdk": { "version": "1.0.4" } } Inside the folder "C:\git\dotnetcore", I added two different folders: the "v104" should use the current final version 1.0.4 and the "v200" should use the preview 1 of 2.0.0. to get it working I just need to put the "global.json" into the "v104" folder: The SDK Now I want to have a look into the new SDK. The first thing I do after installing a new version is to type dotnet --help in a command prompt. The first level help doesn't contain any surprises, just the version number differs. The most interestin[...]



Using Visual Studio Code & Team Foundation Version Control (TFVC)

Mon, 29 May 2017 23:45:00 Z

Recently we start working on a Angular 4 app but all other parts of the application (e.g. the backend stuff) were stored in a good old TFVC based repository (inside a Team Foundation Server 2015) . Unfortunately building an Angular app with the full blown Visual Studio with the “default” Team Explorer workflow is not really practical. Another point for using Visual Studio Code was that most other online resources about learning Angular are using VS Code. Our goal was to keep one repository, otherwise it would be harder to build and maintain. First plan: Migrate to Git First we tried to migrate our complete code base to Git with this generally awesome tool. Unfortunately for us it failed because of our quite large branch-tree. I tried it on a smaller code base and it worked without any issues. At this point we needed another solution, because we wanted to get started on the actual application - so we tried to stick with TFVC. Important: I always would recommend Git over TFVC, because it’s the way our industry is currently moving and at some point in the future we will do this too. If you have similar problems like us: Read on! Second plan: Get the TFVC plugin working in Visual Studio Code Good news: Since April 2017 there is a Visual Studio Team Services extension for Visual Studio Code that also supports TFVC! Requirements: Team Foundation Server 2015 Update 2 A existing local workspace configuration (at least currently, check this GitHub issue for further information) The actual extension Be aware: Local Workspaces! Even I’m using TFS since a couple of years I just recently discovered that the TFS supports to different “workflows”. The “default” workflow always needs a connection to the TFS to checkout files etc. There is an alternative mode called “local” mode which seems to work like SVN. The difference is, that you can create a local file and the TFVC-client will “detect” those changes. Read more about the differences here. Configuration In our OnPremise TFS 2015 world I just needed only this configuration line in my user settings: ... "tfvc.location": "C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Professional\\Common7\\IDE\\CommonExtensions\\Microsoft\\TeamFoundation\\Team Explorer\\TF.exe", ... Action! Now when I point VS Code to my local workspace folder, the TFVC plugin will kick in and I see the familiar “change”-tracking: It is not perfect, because I still need to setup and “manage” (e.g. get the history etc.) via the full blown Visual Studio, but with this setup it is “do-able”.[...]



Exploring GraphQL and creating a GraphQL endpoint in ASP.NET Core

Mon, 29 May 2017 00:00:00 Z

A few weeks ago, I found some time to have a look at GraphQL and even at the .NET implementation of GraphQL. It is pretty amazing to see it in actions and it is easier than expected to create a GraphQL endpoint in ASP.NET Core. In this post I'm going to show you how it works. The Graph Query Language The GraphQL was invented by Facebook in 2012 and released to the public in 2015. It is a query language to tell the API exactly about the data you wanna have. This is the difference between REST, where you need to query different resources/URIs to get different data. In GrapgQL there is one single point of access about the data you want to retrieve. That also makes the planning about the API a little more complex. You need to think about what data you wanna provide and you need to think about how you wanna provide that data. While playing around with it, I created a small book database. The idea is to provide data about books and authors. Let's have a look into few examples. The query to get the book number and the name of a specific book looks like this. { book(isbn: "822-5-315140-65-3"){ isbn, name } } This look similar to JSON but it isn't. The property names are not set in quotes, which means it is not really a JavaScript Object Notation. This query need to be sent inside the body of an POST request to the server. The Query gets parsed and executed against a data source on the server and the server should send the result back to the client: { "data": { "book": { "isbn": "822-5-315140-65-3", "name": "ultrices enim mauris parturient a" } } } If we want to know something about the author, we need to ask about it: { book(isbn: "822-5-315140-65-3"){ isbn, name, author{ id, name, birthdate } } } This is the possible result: { "data": { "book": { "isbn": "822-5-315140-65-3", "name": "ultrices enim mauris parturient a", "author": { "id": 71, "name": "Henderson", "birthdate": "1937-03-20T06:58:44Z" } } } } You need a list of books, including the authors? Just ask for it: { books{ isbn, name, author{ id, name, birthdate } } } The list is too large? Just limit the result, to get only 20 items: { books(limit: 20) { isbn, name, author{ id, name, birthdate } } } Isn't that nice? To learn more about GraphQL and the specifications, visit http://graphql.org/ The Book Database The book database is just fake. I love to use GenFu to generate dummy data. So I did the same for the books and the authors and created a BookRepositor[...]



Microsoft Envision Workshop: Innovation in Entwicklung mit Microsoft Azure

Fri, 26 May 2017 08:58:06 Z

Datum: Donnerstag, 29. Juni 2017 | 09:00 - 12:30 Uhr Ort: Microsoft Österreich GmbH Zentrale, Am Euro Platz 3, 1120 Wien Jetzt kostenlos registrieren!



Einstieg in Azure Resource Manager

Tue, 23 May 2017 17:12:50 Z

Moderne Applikationen, die in Azure gehostet werden, bestehen aus vielen verschiedenen Komponenten / Services, die untereinander kommunizieren, Daten austauschen und zwischen denen eine mehr oder minder große Abhängigkeit besteht. Schon einfache Anwendungen bestehen aus einer Datenbank, einem Cache, einer API, einer Webseite usw.  – also vielen einzelnen Komponenten, die gemanaget sein wollen. Azure Portal Um … Weiterlesen Einstieg in Azure Resource Manager (image)



5 kostenlose eBooks über Machine Learning

Tue, 23 May 2017 09:15:03 Z

Tagtäglich erscheinen Artikel zu Thema Künstliche Intelligenz bzw. Machine Learning. Was hat das aber mit UI-Design und...



Nach Update: Sharing von Laufwerken mit Docker nicht mehr möglich

Mon, 22 May 2017 12:14:41 Z

Das Problem Ich setze Docker schon eine ganze Weile sowohl privat, als auch beruflich für die unterschiedlichsten Themen ein und bin mit dem Tooling unter Windows mittlerweile sehr zufrieden. Docker integriert sich unauffällig in das Windows Betriebssystem und läuft in der Regel reibungslos. Vor kurzem wurde jedoch nach einem Windows Update beim Start eines Containers, … Weiterlesen Nach Update: Sharing von Laufwerken mit Docker nicht mehr möglich (image)