Room of a pleinolijf

Ask yourself this: how do I want to be remembered ?


1 Comment

Deleting Files and Folders With Paths/Names That Are Too Long for Windows

As a follow-up on the previous post, I found a better alternative to do this if you already use node.js. There’s a util available on GitHub, called rimraf, that seems to exist purely to help you and me out with this irritating problem (on a Windows machine).

And it’s easy-peasy. Simply open your favourite node.js prompt (I like to set up everything in the excellent Cmder, btw), and install rimraf like so:

npm install -g rimraf

Then, to actually see the ‘magic’ happen, execute:

rimraf <directory_to_delete>

Could it be any easier ?

Advertisements


4 Comments

Unable to Delete File when Source Path Name Too Long

I regularly suffer from this annoying Windows treat: being unable to delete files that are located in a path which name is too long. Specifically, this occurs on files created by Node.js. Maybe that might be the reason. But it’s still illogical, since the file was allowed to be written by the OS in the first place.

2015-06-02 12_39_43-path name too long at DuckDuckGo

An example: C:\SourceTree\dso\node_modules\grunt-spritesmith\node_modules\spritesmith\node_modules\pixelsmith\node_modules\get-pixels\node_modules\ndarray-pack\node_modules\cwise-compiler\node_modules\uniq\test

You would want to do that if you want to ‘clean’ your npm install folder, for example.

With tips and tricks suggested on support forums, -at least in my case- I was unable to delete this file/folder. Nothing will work, not even an Adminstrator PowerShell console.

The only solution ? 7-Zip. Yep, that’s right, the popular compression tool. When you do Shift-Del (bypassing the Recycle Bin), it actually uses it’s own internal file engine to delete the files, instead of hooking into the operating system. As a bonus, it deletes the files faster as well.

How ? Simply open the 7-Zip File Manager, and navigate to the big bad folder (containing the files) in question. Select what you want to see gone, and press Shift-Del. Done and done.


Leave a comment

Alphabetical Regular Expression for Non-English Languages

Just a quick tip I want to put out there. Whenever you need to match alphabetical characters using a RegEx in an environment that will contain non-english languages (which have diacritics like à, é, õ, Ü, ç, etc…) you can do so like this:

[a-zA-ZÀ-ÿ]

By the way, don’t make my mistake of shortening it to :

[A-ÿ]

Because that will include a number of special characters like the dollar and ampersand signs.

You can use the pattern as an input filter to disallow any characters that are not alphabetic (but allow an apostrophe and a whitespace for example):

([^a-zA-ZÀ-ÿ’\s])+


Leave a comment

Be wary of closures when using delegates

Just recently, I got caught out by a closure.  A closure is a piece of code that can be ‘executed later’, while still retaining the environment in which it was created.  A lot of developers mistakenly think anonymous delegates, like lambda expressions, are by definition closures.  They can be, but don’t have to (and usually aren’t).

I’ll illustrate with the actual code snippet that caught me out.  Unfortunately, at my current client, I can’t make use of the excellent Visual Studio add-in ReSharper, which would have alerted me on this with a “Access to modified closure” warning.

foreach (string keyword in keywords)
{
   ToolStripMenuItem keywordTsmi = new ToolStripMenuItem(text: keyword, image: null,
      onClick: (sender, e) => Clipboard.SetText(keyword));
   keywordsTsmi.DropDownItems.Add(keywordTsmi);
}

In this bit, I am filling up a context menu with new sub menu items, containing keywords that are copied to the clipboard when clicked on.

Obviously, this compiles just fine, and the submenu is correctly filled with all the distinct keywords.  However, no matter which keyword you click, it would always copy the last keyword in the list.  With this functionality being not-very-much-in-your-face, it slipped through (user) testing.  I’ll be the first to admit we need more unit tests 😉

The solution is dead-simple:

foreach (string keyword in keywords)
{
   var keyw = keyword;
   ToolStripMenuItem keywordTsmi = new ToolStripMenuItem(text: keyw, image: null,
      onClick: (sender, e) => Clipboard.SetText(keyw));
   keywordsTsmi.DropDownItems.Add(keywordTsmi);
}

By assigning the value to a local-scope variable, the compiler will save a separate reference for each keyword, instead of only one that gets modified with each loop (hence the ReSharper warning).  Because the latter is simply the standard behaviour when you use a delegate with a variable like that.


Leave a comment

Suppress Compiler Warnings in Visual Studio

Just a quick post to put this out there.  Chances are you already know of this, but I can imagine far from everybody does.

 

When building a project or solution, Visual Studio will report on what’s happening in the Output window.  (By the way, you can control the verbosity of said window in the Tools – Options… – Projects and Solutions – Build and Run screen.  And the first thing I do on a new system configuration, is enable the ‘Show Output window when build starts’ option in the screen before that.)  It will print informational lines of text, but also, and more importantly, warnings and errors while compiling.

Obviously, your attention should be focused on the errors, as they will likely prevent you from running your application.  Call it neurotical behaviour, but I always aim to have an as clear Output window as I can, so the warnings receive equal attention from me (although not as diligently of course).

But sometimes warnings will keep being generated by Visual Studio, even though you intentionally wrote the code the way you did.  An example can be fields that are declared and assigned, but only used in a

#if (!DEBUG)

statement, like a bunch of license key registrations meant for production.

 

 

To keep the warnings from always popping up in the Output window when building, use the #pragma preprocessor directive.

#pragma warning disable 414, 3021

You can get the warning numbers by building  your code. If you can’t or won’t, you can also wrap the code in question in a

#pragma warning disable

and

#pragma warning restore

‘block’. This will disable all warnings in between, so use with caution !

 

PS: VSCommands by Squared Infinity is a great extension for VS that will color-code the lines in the output window to increase readability.  You can even define your own custom formatting.


4 Comments

Connecting Oracle SQL Developer to database without tnsnames.ora

Just a quick tip if you need to reconfigure an Oracle database connection for use in Oracle’s SQL Developer.

I recently had to reinstall Windows on my computer, and sighed heavily when I realised that meant I also had to reconfigure the connection to an Oracle database I use. That meant installing XEClient, creating a tnsnames.ora file in the right location, and adding the service connection.

But it only took me a couple of minutes to search the Internet for an easier solution that required only setting up a connection string in SQL Developer and be done with it.

In SQL Developer, you can connect in several different ways, and one of them is ‘advanced’. When you select that, you get only one textbox in which you can form a JDBC URL. This is how it should look like:

jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=<ip-address or hostname>)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=<service-name>)))

Aaand done. Wish I figured this out sooner, instead of messing around with the infamous tnsnames.ora file.


2 Comments

HttpContext.Current.Session is null, but it shouldn’t be

Annoying issue yesterday.  I was meaning to write a dead-simple web application in .NET 4.0 that talks simultaneously to a referenced .NET 3.5 assembly, and uses an in-house .NET 4.0 framework of services (also referenced).  The goal was to test the correct operation between these different .NET version assemblies.  In most cases, that’s not even a thing to consider, but we wanted to be absolutely sure.

When calling a method of the referenced 3.5 assembly, which acts as a facade between a client and a web service, there is code that uses the HttpContext.Current.Session.  I was assuming that with my test client, being a web application, this would be all fine and dandy, but apparently not.  The HttpContext Session was null.

The solution ?  Adding

<sessionState mode="InProc" />

to the client application’s web.config, in the <system.web> section.

 

It’s not clear to me what the cause of this is.  I strongly doubt it’s default configuration behaviour, and I’m sure it has nothing to do with the code of the referenced assembly.  From what I know and have read on the subject, the session would have been instantiated by starting the application…

If you have a clue, be sure to leave it in the comments.