(ASP.NET) How create master UserControl

There are cases when you want your ASP.NET usercontrols all look the same. For example, to add a header and footer to all your popup, and these header-footer needs always looks the same.

You know you can do it by creating a header.ascx footer.ascx, then add them in all your UC. But, you will still need to maintain all the containers for these, and keep them in sync.

You want it to be as easy as using masterPages + web form.

I had to do that recently, I searched for solutions. I only found complicated solution involving inheritance and lot of code behind script.

But now, I have working solution, that uses real contentplaceholders, and absolutely no code behind.

The only prerequisites is that you need to load these userControl from Ajax. You can’t add directly on another page, as you did with a normal usercontrol.

My solution is to just use the standard master page / asp.net webform!

When you create a masterPage, it is filled with all page content: html, head, body, form, … and all the stuff required for viewState to work. But, you can delete all that content.

Create your masterUserControl, let’s call it popup.master. In Visual Studio, just create a normal MasterPage.

By default, it is filled with that content:

<%@ Master Language="VB" CodeFile="popup.master.vb" Inherits="ucTest_popup" %>
<!DOCTYPE html>
<html>
<head runat="server">
    <title></title>
    <asp:ContentPlaceHolder id="head" runat="server">
    </asp:ContentPlaceHolder>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:ContentPlaceHolder id="ContentPlaceHolder1" runat="server">
        
        </asp:ContentPlaceHolder>
    </div>
    </form>
</body>
</html>

But, you don’t create a page, you create a master for your userControls.  So. remove all page-related content, and only add your common usercontrol html.  It will look like this:

<%@ Master Language="VB" CodeFile="popup.master.vb" Inherits="ucTest_popup" %>
<div>
   <header>My common header</header>
      <article>
         <asp:contentplaceholder id="cph1" runat="server">
         </asp:contentplaceholder>
      </article>
   <footer>My Common Footer</footer>
</div>

The designer indicates an error on the asp:contentplaceholder item, but just ignore it.

Then, create some popup, as asp.net webpages, and select that popup.master.

Add specific code in the contentPlaceHolder:

<asp:Content ID="Content1" ContentPlaceHolderID="cph1" Runat="Server">
   Popup1 Content
</asp:Content>

You can now test that page directly in your browser, and look at its source: It contains only the html of the master embedded with your specific content.

<div>
   <header>My common header</header>
   <article>
      Popup1 Content
   </article>
   <footer>My Common Footer</footer>
</div>

Finally, to use it in your app, you will need to load it from ajax, because you can’t add it directly like a normal usercontrol.

A simple jquery call can do the job:

$('#myDiv').load("/popup/popup1.aspx")

The “myDiv” div now contains the userControl + master html! Just use your favorite popup manager to show it now, e.g.

$('#myDiv').kendoWindow({}).center().show()

Happy coding with these “master usercontrol”!

How to fix PowerSeeker 127eq tripod

As many of you, I was amazed by the very low price of the Celestron PowerSeeker 127EQ. And, I really liked it for a few weeks.

But after a while, it starts to be very hard to adjust it using slow motion wheels.

I balanced it horizontally, vertically, I thought the weight was not correctly centered.

But, everything was fine, and it was still very hard to turn it using the wheel that should be help to follow a moving star or planet easily

Then, I found the magic solution! What you need to add in your amateur astronomer kit is a ratchet with a 11/16 inch box.

And, when it starts to be very hard to adjust your telescope using slow motion wheel, just use your ratchet in the hole behind the larger wheel, turn it a little bit, and wow, you can now use that tripod again!

I have to do that very time I use it, as it seems to loose itself very often.

Apple TV vs Raspberry PI (Steam link)

tl;dr: Use SteamLink on a Raspberry Pi.  It just don’t work on an Apple TV (4th gen).

I have a PS4 and I prefer play in the living room on the couch with a remote.  I recently decided to finally use Steam a little more, because they have good deals on their store that are sometimes very cheaper than those on the Playstation Store.   But I prefer play on the couch in front of the TV instead of near the Desktop PC, where I usually work, not play.

To do that, I can use the Steam Link service, to stream my desktop PC  to the living room TV.

SteamLink app is available for both Apple TV and Raspberry Pi, and I have both.

Because I already set my Raspberry to play games, with RetroPie, I tried it first.  I bought a Logitech F310 controller and plug it to the PI.

The app is easy to install on Raspbian, just search it in the “add or remove programs” section.

To play, you need to start the Steam app on your PC first.  Then start the app on the Pi.  I would like to be able to start the app using the controller, but I can’t.

So I need to use my Logitech K400+ wireless keyboard+touchpad to start the app.

Everything works fine, I can play for hours at Assassins Creed Unity.

But, because I also have an Apple TV 4th gen (model A1625, 2015), and I want make it easier to start the Steam Link for the family, I tried to do the same using the new Steam Link app for TVOS.

My network and host configuration is exactly the same for both client… wired network, a pc with an Intel i3 + GTX1060 gpu.

I can’t use any of the remote I have at home with the Apple TV, because, they only support MFI (Made For I(pod-pad-phone)) controllers. So, I bought the SteelSeries Nimbus from Amazon.

TVOS 13: you will be able to use ps4 and xbox controller on the Apple TV Soon…

The Nimbus is easy to sync from the bluetooth config, and automatically sync very quickly after when turning it on. Also, it’s easier to start the steam link app from the Apple TV menu, because I can do all from the Nimbus controller without using the Apple TV remote.

While connecting to my PC, the steamlink app show a warning about 4 buttons that are not available on the Nimbus: Select, Start, L3, R3.  The default config for them is Menu+A,B,X,Y.  I accept the default settings.

Then, I start to play.  The same game, with all settings set to default, as I did with the Raspberry Pi.  

Suddenly, the game starts to freeze.  It locks for 0.5-1 second, every 10 seconds.  And the sound start to cut.  The resolution automatically lower, and it’s still the same.

I started the real-time monitoring of informations, and the fps were moving between 30 and 60, and suddenly switch to 1-2 when I get the freeze. And the status bar on the right show a huge peak.

I restarted all devices, and I went to the settings options, telling the steam link app to use “fastest” config, and I set the maximum resolution to 720p.  Still same result, it’s unplayable.

My conclusion is simple: the Apple TV 4th gen CAN’T be used with Steam Link.  I don’t know about the 5th gen “4k” Apple TV.

The SteelSeries Nimbus is a good device, looks solid, and works very well with all native ios games. The issue is only when using the Steam Link app, nothing else. And it’s not related to the controller.

Because I bought the SteelSeries Nimbus ONLY to play Steam Link, and I can’t, I returned the controller to Amazon. But, again, it’s a good controller for all native TVOS games.

My suggestion is to buy a cheap Raspberry Pi 3 (or the new 4), and use any compatible controller you want, but I strongly suggest the Logitech F310, or a genuine Xbox controller (wired).

how-to fix “usb read error” on toyota mp3 player

I have a 2012 Toyota Yaris, that can play mp3 / aac audio files from an USB key.

So, I bought a 128G usb key, load it with my audio files on it, and it works fine for months.

Then, I decided to update the usb key with new songs. Before copying my files to it, I format it using Windows format utility. Then, I copy all my new mp3 files on it.

And now, what? I can’t read them! My car player always displays the “USB READ ERROR” message. I thought I put too much files on the USB key, so I tried with only 1 album, with the same result.

After lot of research, I found that, using the windows format tool, I changed the original “FAT32” partition, to a exFAT partition type. And, most car player can’t read that partition type.

So, I tried to format it using the command prompt: “format f: /fs:FAT32”. It took almost 1 hour, before completing with the error: “The volume is too big for FAT32”. I tried the “/q” method before, with the same result. That’s why I retry without the /q, but don’t lost your time, it doesn’t work.

I searched again… then I found that, only third party apps can format a large USB key with the real FAT32 format. There were lot of tools that can do that, but I choosed the one that looks the more simple, as I don’t always trust apps from unknown sources…

The app I used is this one: FAT32 guiFormat from Ridgecrop Consultants.

It was just simple, nothing to setup, and does the job perfectly.

I was able to copy all my mp3-aac, and now my can read read them!

Now, I strongly suggest you to make them a donation on their web site if you like this tool.

How to revert “low blue light” mode on Benq monitor

I just got 2 new Benq monitors. One 24 inch GW2470 set as landscape, and a GW2765 set as portrait mode. They are wonderful on my desktop! And that portrait mode will help me develop web apps with the “developer mode” visible in the bottom of the screen.

I really like the low blue light feature, specially in low light environment like a small room, when there’s no other lights over or behind me.

There a “quick action” button that allow to choose between 4 type of “low blue light” preset.

The level of blue light is not the same on both, so I set the first one at 30%, but I did not set it on the second one, as the white level is not as strong as it is on the first screen.

But now, how can I reset that blue light mode ?!?!? As you see in the previous picture, we can choose between 4 modes, but there’s 1 missing: “DISABLE”! Once you set it, it looks like you have to keep it forever!
I searched the web and found some people having the same issue, and their solution was to “reset all settings” in the menu.

But, there’s a better method, for those who can read the manual!

Go in the menu, then select “Picture Advanced”, and “Picture Mode”. There, you will see that “blue light” is one settings between others. You can then move to “standard”, “movie”, … So, the 4 blue light settings are sub-items of the “blue light” picture mode!

That’s it! enjoy your new Benq monitors.

How to use jQuery “$” in WordPress

If you add javascript into WordPress, you will certain try execute some jQuery functions sooner or later.

And, you will get an error telling that $ is undefined.

I think that jQuery embedded into wordpress do not declare the “$” variable, as it may confuse some users with all the $ server-side variables from PHP.

All jQuery functions can be run using “jQuery” variable instead of “$”.

But, if you want to use “$” as you did before, be warned that just typing:
$ = jQuery;
can interfere with some existing functions that may use the $ variables for other purposes.

So, what I propose is to encapsulate all your functions inside a self-called function like this:

(function($){
   ...
   $('body').addClass("cool");
   ...
 })(jQuery);

You put all your code inside that function, the “$” is available, and it doesn’t interfere with all other code.

Best MySQLdump options

I recently had to configure an automated backup procedure for MySQL databases, related to wordpress sites.

I am a long-time user of MS SQL Server, so I was surprised to find that there is no “binary” option of MySQL backup, only text script version.

Then, I quickly found that MySQLDump is what I need.   So, I start using it as-is, without any doc reading.  

mysqldump --all-databases > backup.sql

Finally, to make sure it works fine, I tried to restore it.

My first surprise was to find lot of invalid data in my backup!  What?

Then, I learned that mysqldump, by default, is NOT set to backup everything the correct way.

Because I use some wordpress plugins that store their data into “blobs”, I need to add this very important option: 

--hex-blob

In fact, I don’t understand why it’s not included in the default --opt option, as it MUST be used to get blob correctly backed up.

Also, I read at some places that I should use the --opt settings, because it enables all of these: --add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick --set-charset

But, you don’t need to, as –opt is a “default” option automatically applied when you run mysqldump.exe.

Now, is there others options I need to enable to make sure I backup everything?  Yes, I found 3. And, mysqldump give us warning to enable them if we need to get a full backup!  So, once again, why aren’t they enable it by default?

These options are: –routines, –events and –triggers.

In some versions of mysqldump, using “–all-databases” automatically enabled the --routines and --events, but not if you backup 1 single database.  And, in the version 8+, these options are NOT set by default.

So, don’t take chances, add them.

One last thing: If you want to avoid problems with file encoding, I suggest to use --result-file=filename.sql, instead of > filename.sql, to prevent different encoding between systems.

Finally, the backup options I use are: 

mysqldump.exe --defaults-extra-file=config.txt --all-databases --hex-blob --routines --events --triggers --result-file=backup.sql

The “–trigger” option is ambiguous.  The documentation (5.7 / 8.0) say it is enabled by default, but if you don’t add it, the warning message suggests to add it.  So, don’t take chances, just add it.

The --defaults-extra-file= is used to set my host / uid / pwd in an external file.

How to make your server-side javascript code private in IIS

You learned that you can use Server-Side Javascript mixed in our ASP Classic VBScript application.

Next, you want to create tons of javascript files, and mix them with your old ASP. You can name them “.asp”, or “.inc”, like you did with your old VBScript files.  But, what about using intellisense in a standard editor from these extensions?

The best way to use intellisense in your favorite editor, like Visual Studio Code or anything else, is to name these files with the .js extension.

But, there’s a security issue.  If you name these files like that, they should be returned to your client in plain text if called from a web browser.  You don’t want your server-side code to be exposed through IIS.

What you need to do, is just put all these files in a specific folder, in which you will disable all IIS handlers, by using the following steps.

  1. In your application root, create a folder called private.
  2. In that folder, create a web.config file, and add this content:
<system.webServer>
  <handlers>
    <clear />
  </handlers>
</system.webServer>

You can now add all your server-side JS in that folder, and they will private to your ASP code.

If you call that js file in the browser, you will get a 404:

From your ASP page in the root, include them like this:

<script runat="server" language="javascript" src="private/code.js"></script>

That’s all! Happy Coding.

How to use Try Catch in ASP Classic

The worst part of Classic ASP in VBScript is Error Handling.

You need to type “on error resume next”, then, check, on every line, check if the previous one generates an error using [If Err.Number <> 0 then …]. That’s a real pain.

When you need solid error handling inside an ASP – VBScript sub or function, there’s a very simple method you can apply.

Just turn your existing error-handling-needed function into JavaScript, and use Try-Catch!
What? Javascript in ASP Classic?
Yes you can! It’s called JScript, it’s ECMAScript 3 compatible, and it just works.

Also, it’s totally compatible with your existing VBScript application, that will be able to call that JS method without any issue.  Even all your application VBScript variables will be shared between VB and JS.

Sample:
100% VBScript file:

<%
function fct1
	fct1 = true
	on error resume next
	' do something that can crash
	dim i : i = 1
	i = i / 0
	if err.number <> 0 then
		fct1 = false
		response.write err.number & "<br>"
		response.write err.description & "<br>"
	end if
	on error goto 0
end function

sub sub1
	dim value : value = fct1()
	response.write "result: " & value
end sub

call sub1()
%>

Now, the same, using mixed VBScript/ Javascript

<script runat="server" language="javascript"> 
function fct1(){
	try{
		// do something that can crash 
		var i = 1;
		i = parseINT(i); // <- typo
		return true;
	}
	catch(e){
		Response.Write(e.message);
		return false;
	}
}
</script>
<%
sub sub1
	dim value : value = fct1()
	response.write value
end sub

call sub1()
%>

Now, go and start converting your Classic ASP functions in JavaScript!
Just, watch out as JScript is case sensitive, VBScript is not.
vb: response.write "txt"
js: Response.Write("txt");

 

How to mix Classic ASP and Server-Side Javascript

Sometimes I need to fix some old Classic ASP applications or add small new features to them.

Because I do Javascript or C# every day for new apps, it hurts to get back to VBScript for these old apps!

That’s why I try to do these using Server-Side Javascript instead.  But wait, how can I mix NodeJS and VBScript?  The answer is, you can’t.  But, there was Server-Side JS before NodeJS exists!

Now, look at this.

You have a ASP Classic site like this:

<body>
<% dim product : product = "apple"
response.write product %>
...

And you need to create a new function to get the product name.

But, you don’t want to do it in VBScript, because you prefer JavaScript.

All you need to do is to create an “include” file, in pure javascript, like this:

includeJS.inc:

function getProduct(){
	var product = "banana";
	return product;
}

And, add it to your existing ASP file:

<script runat="server" language="javascript" src="includeJS.js" ></script>

Finally, you can fix your existing code like this:

<% dim product : product = getProduct()
response.write product %>

Yes, the VB code can call JS function directly.
Also, your JS code can also use already existing VBScript functions and variables.

(edit 2020-12-23) I just added a working sample for this, that you can download, including web.config “urlrewrite” to keep your js-code hidden from browser direct call.