Monday, June 26, 2017

Tip: Docker unable to copy bin\Debug folder to the target image.

Recently I have been playing with the Docker whereby i was trying to copy my simple Visual Studio project exe from bin\Debug to the target image location. My Docker file looks like this:
FROM microsoft/nanoserver
WORKDIR c:/
RUN DIR
COPY /bin/Debug/ /ConsoleApp2/
RUN DIR C:\ConsoleApp2
CMD ["C:\\ConsoleApp2\\ConsoleApp2.exe","",""] 

However when i executed the command docker build -t consoleapp2:dev . an error showed up: GetFileAttributesEx bin\\Debug\: The system cannot find the path specified. saying that the folder could not be found when actually the folder was there. So I digged into the .dockerignore file that accompanies the Dockerfile when I added it through Visual Studio. Inside the file there's a bunch of patterns that filter out related files or directories, so i removed everything from that file and run the Docker build command, the next thing you know it was a successful run.

* (Culprit)
!obj\Docker\publish\*
!obj\Docker\empty\

Only obj folder get copied over.
A successful run.
Sending build context to Docker daemon 123.9 kB
Step 1/6 : FROM microsoft/nanoserver
 ---> 4a8212a9c691
Step 2/6 : WORKDIR c:/
 ---> Using cache
 ---> ebcfa5b95aa7
Step 3/6 : RUN DIR
 ---> Using cache
 ---> 6dfa39dc1b7b
Step 4/6 : COPY /bin/Debug/ /ConsoleApp2/
 ---> fb65c840b3eb
Removing intermediate container 8eb904bad33a

Tuesday, February 21, 2017

Tip: Mixing SSRS Report in a MVC Application

It's very common for us to reuse whatever that's already available in a software project. This is true when we want to reuse a set of reports which are designed and developed using the SSRS report designer and we want to use it in a MVC web site. The problem with this is that MVC does not support the SSRS report viewer directly like a web form web site. There are 2 options to solve this issue: 1. Use an iframe from within the MVC view to load the web form which resides on the same domain. 2. Use an ifram from within the MVC view to load the web form which resides on a different sub-domain. As you can see the only difference between the 2 options is to use a different sub domain to host the web forms. This sounds like non-significant difference but it does make a big difference when comes to report loading performance. The first option for some reasons which i have not found out yet, will most probably unable to load some of my reports. The report viewer constantly use up the CPU for a long time without delivering any result. As for option 2 the report viewer does use a lot of CPU too, but it is able to load reports that are not "loadable" in option 1.

Monday, October 27, 2014

Tip: Dynamically updating workflow service

Recently I have come across the need to create a tool to update workflow service dynamically using the .NET FW 4.5 new Dynamic Update feature. I have spent few days looking into how I can do it with Workflow Service. However, it turned out to be a failure because the method I used is only suitable for app host type of workflow. At the edge of disappointment, I found this useful web sample provided by the Microsoft sample web site. It's a tutorial on how I can do side-by-side versioning and dynamic update to a workflow service. It's a perfect example showing how we can insert the update map into the workflow service (which is something different from the console app host method) and finally show how we can update running instances of the workflow service using the scarcely documented API WorkflowUpdateableControlClient.

WF4.5 Developer Preview - C# Expression, Workflow Versioning and Dynamic Update

Wednesday, May 14, 2014

Tip: Bootstrap 3.1.1 "dropdown-submenu" Workaround

The new bootstrap navbar does not support more than 2 levels of menu. That is to say the "dropdown-submenu" css class has been removed since Bootstrap 3.0. In order to work around that issue one can add the missing piece into another css file.

Menu HTML Notice how the css class "dropdown-submenu" is used in the HTML snippet.

Menu CSS
Notice how the CSS is put in place. In certain scenario for example when we use a centered navbar, the "!important" command is important to override the Bootstrap original behavior for the third level menu to appear correctly.

Tuesday, May 6, 2014

Tip: Workflow Serialization Issue

In Windows Workflow 4.5, serialization of a long running process saves the workflow states (variables' value) and some other information into the database. However it's important to consider carefully the type of objects that the workflow can save. object such as EntitySet and EttityRef of LINQ2SQL by default do not support serialization into database. When try to save such objects into the database, error will be thrown by the workflow runtime:

Operation 'OperationName|IServiceContract' on service instance with identifier '899be275-01f7-45c7-a8d2-ee89595522cb' cannot be performed at this time. Please ensure that the operations are performed in the correct order and that the binding in use provides ordered delivery guarantees.

then

System.Runtime.Serialization.InvalidDataContractException: Type 'System.Data.Linq.EntitySet`1[WhateverObjectType]' cannot be serialized. Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with the DataMemberAttribute attribute. If the type is a collection, consider marking it with the CollectionDataContractAttribute.

See the Microsoft .NET Framework documentation for other supported types. Microsoft does describe some of the thing about LINQ2SQL serialization at Serialization [LINQ to SQL]

We tend to pass in the LINQ2SQL object into the workflow, so one way to workaround the problem is to nullify the object before the WF goes into idle mode. Use the object as a parameter passing vehicle instead of using it to store workflow state.

Tuesday, April 22, 2014

Tip: How to embed different font files for different browser?

Scenario:
Many times you want to embed the necessary font files for the exact browsers that you want to target in order to save internet bandwidth and to improve web site performance. For example, Google Chrome uses the *.svg file to render the best quality of text but other browsers might not support that font file, so you might as well instruct the browser downloads only that font file rather than downloading everyting.

Solution:
Create several css files (i.e.browser specific) that contain the font files declaration. Determine the font file to use at the server or web site host. Here's an example using the ASP.NET MVC:


Friday, April 11, 2014

Tip: Embed open type font (otf) with CSS.

Recently got some font files from the web designer and those files are in otf format. When i tried to embed the font files into CSS i receive the following error from IE10:

         CSS3114: @font-face failed OpenType embedding permission check. Permission must be Installable.

As far i have gathered some information from Google, I need to convert the format to true type (ttf) font. I used the web site http://everythingfonts.com/otf-to-ttf to convert the font files and use the "embed" program from http://carnage-melon.tom7.org/embed/ to change the embed level of the font files so that IE can use them. I used VS2012 to do the code compilation because the original embed.exe does not work on my 64 bit machine.

 Attached here the working program. https://drive.google.com/file/d/0B0QLqsRA_p4pYWhtV2c2Z1FnaWs/edit?usp=sharing