IIS Site Slow to Load on First Visit/Load (SiteFinity)

I had to deploy a new website that was done by a web design company, it was created in Sitefinity. I didn’t have the option to install it, I simply was given the site files and the database. I think had to figure out a way to update the database configuration file, of which Sitefinity doesn’t really have much documentation on. I will post if I find anything related on how to update the Sitefinity database connection strings in the Sitefinity configuration file.

I was able to get Sitefinity working, and the content was displaying properly. However after a little while the site would begin to load slowly, but only on the first page load. I could tell it had something to do with the idle timeout for the application pool in IIS 7.5

Digging further I found the following article that talks about auto start for ASP.NET applications.

http://weblogs.asp.net/scottgu/archive/2009/09/15/auto-start-asp-net-applications-vs-2010-and-net-4-0-series.aspx

I also find this article about Sitefinity and auto start but not much information on how to implement it properly.

http://patrickdunn.me/blog/posts/2012/10/18/auto-start-sitefinity-iis

I then found the following two articles.

http://scottrozman.net/blog/12-07-27/Sitefinity_5_x_Performance.aspx
http://www.techbubbles.com/aspnet/auto-start-web-applications-in-aspnet-40/

The last article from techbubbles.com talks about the preloadEnabled=”true” and preloadProvider=”PrewarmMyCache” of which just cause IIS 7.5 not to start. Because its not valid XML. The error was 

1
2
3
</p>
<p>The worker process for application pool 'site' encountered an error 'Configuration file is not well-formed XML ' trying to read global module configuration data from file '\\?\C:\inetpub\temp\apppools\site\site.config', line number '3'. Worker process startup aborted.</p>
<p>

I later found out this is because preloadEnabled is actually is a property for the “Application Initalization” module.

http://www.iis.net/downloads/microsoft/application-initialization

This property is available by default in IIS 8.0, hence why you might see some documentation talking about it but no the ”Application Initalization” module.

So, if you want to be able to use the preloadEnabled property you will need to install the “Application Initalization” module. Just a note on the installation, you will need the x64 binary which is available under “Additional Downloads” at the bottom of the page. You will also be asked to reboot, so if this is a production server, schedule a maintenance.

The following page will go over how to use the Application Initialization Module.

http://blogs.iis.net/wadeh/archive/2012/05/01/application-initialization-part-2.aspx

That’s it!

Changing the Thumbnail on a YouTube Video to a Custom Image

The following code will allow you to use a custom image for the thumbnail on a YouTube video.

1
2
3
4
5
6
7
8
9
10
11
<div style="float: right; padding: 20px;" onclick="thevid=document.getElementById('thevideo'); thevid.style.display='block'; this.style.display='none'">
<img style="cursor: pointer;" src="/wp-content/uploads/2012/10/iframeyoutubevideo.png" alt="" />
</div>
<div id="thevideo" style="display: none; float: right; padding: 20px;">
<object width="460" height="259" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" />
<param name="allowscriptaccess" value="always" />
<param name="src" value="http://www.youtube.com/v/tX4l7aPoYLU?version=3&amp;hl=en_US&amp;rel=0&amp;autoplay=1&amp;autohide=1" />
<param name="allowfullscreen" value="true" />
<embed width="460" height="259" type="application/x-shockwave-flash" src="http://www.youtube.com/v/tX4l7aPoYLU?version=3&amp;hl=en_US&amp;rel=0&amp;autoplay=1&amp;autohide=1" allowFullScreen="true" allowscriptaccess="always" allowfullscreen="true" />
</object>
</div>

Here is an example of what the video would look like.

WordPress SEO plugin by Yoast

I recently installed the plugin Wordpres SEO by Yoast on my this blog, and others. It was recommended by one of those top 10-20-50 WordPress Plugin posts you find all over the place.

You can read more about Yoast and their plugin on their website http://yoast.com/articles/wordpress-seo/

One of the features that comes in handy quite often when writing a new post or page, is the Snippet Preview as seen below:

It hangs out just below the content box when you’re writing up your page or post, and it provides a preview of what your article will look like when its posted on Facebook or other sites that take a preview of your article.

How to fix the Asus Zenbook trackpad

I have an Asus Zenbook for work, and its awesome. Small. light and fast!

Since day 1, the trackpad has been a huge issue. It didn’t perform like some previous laptops I had, nor like my Macbook. For instance when you single tap on the left or right buttons on the track pad, they register as single clicks. This messes things up from time to time. There are some other issue as well, my palm getting in the way and causing issues.

Anyways, I found somewhat of a solution to some of the issues. A personal blog provides some registry changes you can make to reveal more settings from the Elan trackpad program.

http://alonsrants.blogspot.ca/2012/01/asus-zenbook-touchpad-hack.html

The only problem is that when you save your settings after enabling the registry keys and re-open the Elan application, the extra options are removed. So I’ve provided a registry file that you simply run each time.

Zenbook/Elan Extra Features Registry Key Enabler (1292)

Cheat Sheet for Administrating a PostgreSQL Database/Server

PostgreSQL Interactive Terminal

 

Postgresql is similar to MySQL in that it uses an interactive terminal. To gain access type the following as root

1
su - postgres -c psql

You’re now logged into the Postgresql interactive terminal and interacting with the local server.

Common Shell Commands

 

Dump a database.

When dumping and restoring a database, you have to work within the postgres user, this is the default setup. The home directory for the postgres user is /var/lib/postgresql

1
pg_dump -U username database -f file.sql

 

Restore a database.

In order to restore the database you will need to ensure that the database name exist, for instance if it was dropped.

1
psql -U username -d database -f file.sql

 

Common Interactive Terminal Commands

 

Connect to a database, like “use database” in MySQL.

1
connect databasename;

 

View current databases on local server

1
select datname from pg_database;

 

View current databases on local server

1
\l

 

 Show current roles

1
select rolname from pg_roles;

 

Create a user.

1
create user ramesh with password 'tmppassword';

 

Create a database.

1
CREATE DATABASE mydb WITH OWNER ramesh;

 

Drop database.

1
DROP DATABASE mydb;

If you notice that you’re unable to drop a database because of connections, then run the following.

1
2
3
4
5
6
SELECT
pg_terminate_backend(procpid)
FROM
pg_stat_activity
WHERE -- don't kill my own connection!
procpid &lt;&gt; pg_backend_pid();

If it’s a busy database then you may need to run the following first.

1
REVOKE CONNECT ON DATABASE dbname FROM PUBLIC, username;

MikroTik – DynDNS Update Script

This is a script for ensuring that your DynDNS hostname is updated when your IP changes on your MikroTik router. Unfortunately the script from the MikroTik Wiki doesn’t work and is broken.

http://wiki.mikrotik.com/wiki/Dynamic_DNS_Update_Script_for_dynDNS

  • There is a question mark within the URL that posts the update to members.dyndns.org and it gets removed when you paste and run the code through telnet/ssh. To fix it you will need to put a slash in-front of the question mark for it to be passed correctly.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/system script add name=dyndns source={
# Set needed variables
:local username "YOURUSER"
:local password "YOURPASWORD"
:local hostname "YOURHOSTNAME.dyndns.org"

:global dyndnsForce
:global previousIP

# print some debug info
:log info ("UpdateDynDNS: username = $username")
:log info ("UpdateDynDNS: password = $password")
:log info ("UpdateDynDNS: hostname = $hostname")
:log info ("UpdateDynDNS: previousIP = $previousIP")

# get the current IP address from the internet (in case of double-nat)
/tool fetch mode=http address="checkip.dyndns.org" src-path="/" dst-path="/dyndns.checkip.html"
:delay 1
:local result [/file get dyndns.checkip.html contents]

# parse the current IP result
:local resultLen [:len $result]
:local startLoc [:find $result ": " -1]
:set startLoc ($startLoc + 2)
:local endLoc [:find $result "</body>" -1]
:local currentIP [:pick $result $startLoc $endLoc]
:log info "UpdateDynDNS: currentIP = $currentIP"

# Remove the # on next line to force an update every single time - useful for debugging,
# but you could end up getting blacklisted by DynDNS!

#:set dyndnsForce true

# Determine if dyndns update is needed
# more dyndns updater request details http://www.dyndns.com/developers/specs/syntax.html

:if (($currentIP != $previousIP) || ($dyndnsForce = true)) do={
   :set dyndnsForce false
   :set previousIP $currentIP
   :log info "$currentIP or $previousIP"
   /tool fetch user=$username password=$password mode=http address="members.dyndns.org" \
      src-path="nic/update?system=dyndns&hostname=$hostname&myip=$currentIP&wildcard=no" \
      dst-path="/dyndns.txt"
   :delay 1
   :local result [/file get dyndns.txt contents]
   :log info ("UpdateDynDNS: Dyndns update needed")
   :log info ("UpdateDynDNS: Dyndns Update Result: ".$result)
   :put ("Dyndns Update Result: ".$result)
} else={
   :log info ("UpdateDynDNS: No dyndns update needed")
}
}
/system scheduler add name=dyndns interval=00:01 on-event="dyndns"

MikroTik – Backing Up Your MikroTik & Routerboard Config

Another great script that will email you a copy of your MikroTik/Routerboard device config. You can find the source on the MikroTik Wiki below.

http://wiki.mikrotik.com/wiki/Send_Backup_email

Some notes about the script on the MikroTik wiki and below.

  • I had to modify the script on the MikroTik website, it had used /tool e-mail set address instead of /tool e-mail set server.
  • Ensure that you specify an IP Address for sending an email, a host name will fail.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/system script add name=backup source={/export file=([/system identity get name] . "-" . \
[:pick [/system clock get date] 7 11] . [:pick [/system clock get date] 0 3] . [:pick [/system clock get date] 4 6]); \
/tool e-mail send to="[email protected]" subject=([/system identity get name] . " Backup " . \
[/system clock get date]) file=([/system identity get name] . "-" . [:pick [/system clock get date] 7 11] . \
[:pick [/system clock get date] 0 3] . [:pick [/system clock get date] 4 6] . ".rsc"); :delay 10; \
/file rem [/file find name=([/system identity get name] . "-" . [:pick [/system clock get date] 7 11] . \
[:pick [/system clock get date] 0 3] . [:pick [/system clock get date] 4 6] . ".rsc")]; \
:log info ("System Backup emailed at " . [/sys cl get time] . " " . [/sys cl get date])}
{
:global namE;
:set namE ("<".[/sys identity get name]."@YOURDOMAIN.com>");
/tool e-mail set server=IP.OF.YOUR.SMTP from=$namE;
:put $namE;
}
/system scheduler
add name="sched_backup" on-event="backup" start-date=jan/01/1970 start-time=07:30:00 interval=7d \
comment="" disabled=no
/

Please note: The code above was incorrectly formatted and may have had some characters changed or stripped when it was first posted. I have since updated the above code and it should be correct, if you have any issues then post a comment. -Jordan @ 09/12/12

MikroTik – Automatically creating DNS record for each DHCP lease/client

You’ll notice that when you first get your MikroTik router, that it doesn’t create DNS records for each DHCP client that successfully receives a lease. The below article provides the necessary script to create a DNS record for each DHCP Client. I’ve provided a link to the Mikrotik Wiki article so you can see the original source.

http://wiki.mikrotik.com/wiki/Setting_static_DNS_record_for_each_DHCP_lease

The script does need to be modified (white spaces taken out) so that it will run correctly on the MikroTik. I’ve done this already and provided the script below. Also, make sure that you change :local zone “local”; to your network domain name or dns search suffix.

You will also have to create this script via telnet/ssh as webfig will mess up line 11 and remove the “\\” and leave “\”. If you don’t know how to add a script via telnet/ssh, simply type system script add name=”dhcp-dns” soruce={ at which point you can then paste the script content below. You will then have to complete the line by entering in again.

Viola! Execute the script to ensure it runs without errors system scripts run name=dhcp-dns. Lastly we want to run this script often, to ensure the records are created and updated. Lets set a schedule run system scheduler add name=dhcp-dns-run interval=5m on-event=dhcp-dns and now the script should be running every 5 minutes. To confirm the scheduler is working, wait 5 minutes and then run system scheduler print and look at the “RUN-COUNT” value, which should be greater than 0.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
:local zone "local";
:local ttl "00:05:00"
:local hostname
:local ip
:local dnsip
:local dhcpip
:local dnsnode
:local dhcpnode

/ip dns static;
:foreach i in=[find where name ~ (".*\\.".$zone) ] do={
  :set hostname [ get $i name ];
  :set hostname [ :pick $hostname 0 ( [ :len $hostname ] - ( [ :len $zone ] + 1 ) ) ];
  /ip dhcp-server lease;
  :set dhcpnode [ find where host-name=$hostname ];
  :if ( [ :len $dhcpnode ] > 0) do={
    :log debug ("Lease for ".$hostname." still exists. Not deleting.");
  } else={
# theres no lease by that name. Maybe this mac has a static name.
    :local found false
    /system script environment
    :foreach n in=[ find where name ~ "shost[0-9A-F]+" ] do={
       :if ( [ get $n value ] = $hostname ) do={
         :set found true;
       }
    }
    :if ( found ) do={
      :log debug ("Hostname ".$hostname." is static");
    } else={
      :log info ("Lease expired for ".$hostname.", deleting DNS entry.");
      /ip dns static remove $i;
    }
  }
}

/ip dhcp-server lease;
:foreach i in=[find] do={
  :set hostname ""
  :local mac
  :set dhcpip [ get $i address ];
  :set mac [ get $i mac-address ];
  :while ($mac ~ ":") do={
    :local pos [ :find $mac ":" ];
    :set mac ( [ :pick $mac 0 $pos ] . [ :pick $mac ($pos + 1) 999 ] );
  };
  :foreach n in=[ /system script environment find where name=("shost" . $mac) ] do={
    :set hostname [ /system script environment get $n value ];
  }
  :if ( [ :len $hostname ] = 0) do={
    :set hostname [ get $i host-name ];
  }
  :if ( [ :len $hostname ] > 0) do={
    :set hostname ( $hostname . "." . $zone );
    /ip dns static;
    :set dnsnode [ find where name=$hostname ];
    :if ( [ :len $dnsnode ] > 0 ) do={
# it exists. Is its IP the same
      :set dnsip [ get $dnsnode address ];
      :if ( $dnsip = $dhcpip ) do={
        :log debug ("DNS entry for " . $hostname . " does not need updating.");
      } else={
        :log info ("Replacing DNS entry for " . $hostname);
        /ip dns static remove $dnsnode;
        /ip dns static add name=$hostname address=$dhcpip ttl=$ttl;
      }
    } else={
# it doesnt exist. Add it
      :log info ("Adding new DNS entry for " . $hostname);
      /ip dns static add name=$hostname address=$dhcpip ttl=$ttl;
    }
  }
}

Upgrading Zen Theme Foundation (Confluence) Brand from 3 to 4.1.4

If you have a custom brand for your Zen Theme Foundation plugin, and upgraded the plugin from version 3 to 4.14. You might have noticed that some images are missing, or you might not even noticed them missing because no missing image is displayed.

To fix this, I just copied over the missing images from the Breeze template. Here is a list of them.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
check-large.png
non-master.gif
non-master-hover.gif
tack-on.png
tack.png
trash.gif
trash-hover.gif
trash-large.png
toolbar-background.gif
toolbar-hide-on.png
toolbar-hide.png
toolbar-show-on.png
toolbar-show.png
master-draft.png
master.gif
master-hover.gif
master-watermark.png

Cisco ASA Lost Config After Power Cycle

I ran into this recently where a Cisco ASA was powered off accidentally, and lost a whole month of config changes. The firewall still operated because it still had a config, just nothing from a month ago.

I then decided to log into the Cisco ASA and type “write mem” and got the following error.

1
2
3
4
5
6
7
<p lang="en-US">Result of the command: "write mem"</p>
<p lang="en-US">Building configuration...</p>
<p lang="en-US">Cryptochecksum: 22387bc0 13130870 b142ffd2 c97d2014</p>
<p lang="en-US">%Error opening disk0:/.private/startup-config (Read-only file system)</p>
<p lang="en-US">Error executing command</p>
<p lang="en-US">[FAILED]</p>
<p lang="en-US">This is what Cisco had to say about the issue.</p>

 

Error when wr mem command issued

This error appears when you try to save the configuration with the wr mem command:

%Error opening disk0:/.private/startup-config (Read-only file system)

Error executing command

In order to resolve this, perform a filesystem check so that the error can be removed. This command sequence is presented for your reference.

CiscoASA# wr mem
Building configuration…
Cryptochecksum: 2e24ca48 2496fe80 51a4ecbb 81a2dba5

%Error opening disk0:/.private/startup-config (Read-only file system)
Error executing command
[FAILED]
CiscoASA# fsck disk0

fsck of disk0: complete
CiscoASA#
pehac-a0-df01# fsck flash

fsck of flash: complete
CiscoASA# wr mem
Building configuration…
Cryptochecksum: 2e24ca48 2496fe80 51a4ecbb 81a2dba5

22851 bytes copied in 3.400 secs (7617 bytes/sec)
[OK]

What really grinds my gears is that I didn’t get a notification from ASDM GUI that the “write mem” command failed!

Here’s more information from Ciscos website:

http://www.cisco.com/en/US/products/ps6120/products_tech_note09186a0080b95d3d.shtml