Sunday, June 23, 2019

Tip: How to copy file(s) from Ubuntu to Windows 10

The following is the step by step instruction to copy file(s) from Ubuntu to Windows 10 using the WSL windows feature. Assuming that you have WSL and Ubuntu installed in your windows 10 machine.

1. Open up a command prompt with admin privilege.
2. Type "wsl" to enter the Ubuntu default Linux system.
3. use the following command to copy file:
                cp UBUNTU_FILES_OR_DIR WINDOWS10_DIR -r
                example: cp opencv-4.0.0/build/CMakeFiles /mnt/c/Temp -r

From the example, notice the use of /mnt to access to Windows 10 file system. "c" means c drive.

Tip: For guaranteed network drive map/access using "Net Use"

The following script can be used to map a network drive or to access a folder in a network drive such as NASH or File Server


Friday, September 14, 2018

Tip: ExcelDataReader returns "Invalid File Signature" when reading an Excel file.

Just happen to notice this problem when i am trying to load multiple Excel files from the same directory. The root cause for such error is simple for me, whenever I populate the file names using the "Directory.EnumerateFiles", it returns the Excel temporary file also, which the file name always start with a "~". So this file actually is not a valid Excel file, that's the reason when "AsDataset" function is called, it always throw error when the codes tried to load that extra file.

So the solution for me is to always exclude file names that start with a "~".

Wednesday, July 4, 2018

Tip: OpenCV 4.0 Library Files Inclusion

C++ Configuration in Visual Studio 2017

opencv_videostab400d.lib 
opencv_calib3d400d.lib 
opencv_core400d.lib 
opencv_dnn400d.lib 
opencv_features2d400d.lib 
opencv_flann400d.lib 
opencv_highgui400d.lib 
opencv_imgcodecs400d.lib 
opencv_imgproc400d.lib 
opencv_ml400d.lib 
opencv_objdetect400d.lib 
opencv_photo400d.lib 
opencv_shape400d.lib 
opencv_stitching400d.lib 
opencv_superres400d.lib 
opencv_ts400d.lib 
opencv_video400d.lib 
opencv_videoio400d.lib

Tuesday, June 5, 2018

Tip: How to properly setup the EmguCV/OpenCV OCR in Visual Studio.

Running the OpenCV OCR against an image requires setup that reads the related language file from a pre-defined directory in your machine. Usually if you did not specify any path, it will look from the application path if you are building an exe file. Below is a sample code that reads an image and write the text to the console.
using System;
using System.IO;
using Emgu.CV;
using Emgu.CV.OCR;
using Emgu.CV.Structure;
 
namespace ConsoleOCR
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            using (var image = new Image<Bgr, byte>(Path.GetFullPath("testImage.png")))
            {
                using (var tesseractOcrProvider = new Tesseract(@"", "eng", OcrEngineMode.Default)) //point to TESSDATA_PREFIX env variable.
                {
                    tesseractOcrProvider.SetImage(image);
                    tesseractOcrProvider.Recognize();
                    var text = tesseractOcrProvider.GetBoxText().TrimEnd();
                    Console.WriteLine(text);
                }
            }
        }
    }
}

I am using EmguCV 3.4.1 for the testing. In Visual Studio, you have to include the reference to the .NET wrapper dll Emgu.CV.World dll.

You need to create a new folder with the name "tessdata" inside your running application folder, for example the "debug" folder. In this folder you have to put in the language file which you can download from Language Files.. In this case i downloaded the "eng.traineddata" because the picture that i wants to read is in English language. After you compile the application, you should be able to see something like this:

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.