Create a discussion board for Mindtouch wiki

A recent comment on my Mindtouch intro page asked how I built the discussion board.

I originally got the code from the Mindtouch Developer site here, however I can’t seem to find the complete source code anymore. Either way, I’m pretty sure neilw, a valuable contributor to the Mindtouch community is the author of this code and full credit goes to him.

The actual implementation is very simple. You just need to make a couple of templates.

First, create the discussion board page template, or topic list:

Template:/ForumTopicList

 
<div block="var homepath=(args.path ?? '/Forum_Topics');
if (homepath[0] == '/') {
let homepath = page.path .. homepath;
}">
	<p>{{wiki.create(&quot;Create New Topic&quot;,homepath,(args.template ?? &quot;ForumTopic&quot;),true,&quot;Put Your Title Here&quot;)}}</p>
	<table block="var homepage = wiki.getpage(homepath);
    var empty = true;
    if (homepage != nil) {
    let empty = (#homepage.subpages == 0);
    }
    var topics = [];
    if (!empty) {
    foreach (var p in homepage.subpages) {
    var entry = wiki.page(p.path);
    var originator = entry['//*[@id=\'ForumEntryOriginator\']'];
    if (xml.text(originator) == nil) { let originator = web.link(p.author.uri, p.author.name); }
    var lastAuthor = p.author;
    var lastDate = p.date;
    var lastChange = string.contains(p.editsummary, 'page created') ? '(new)' : '(E)';
    if (#p.comments != 0) {
    var lastComment = list.reverse(p.comments)[0];
    if (date.isafter(lastComment.date, p.date)) {
    let lastAuthor = lastComment.author;
    let lastDate = lastComment.date;
    let lastChange = '(C)';
    }
    }
    let lastAuthor = web.link(lastAuthor.uri, lastAuthor.name);
    let lastDate = date.format(lastDate, 's');
    var sticky = (p.tags.sticky != nil ? 'STICKY!' : '');
    let lastDate = (sticky != '' ? 'z' : 'a') .. lastDate;
    let topics ..= [ { page:p, originator:originator, author:lastAuthor, date:lastDate, change:lastChange, sticky:sticky } ];
    }
    let topics = list.sort(topics, 'date', true);
    }" border="1" cellpadding="4" cellspacing="0" class="table">
		<tbody>
			<tr>
				<th style="width: 55%" valign="top">Topic</th>
				<th style="text-align: center; width: 10%" valign="top">Starter</th>
				<th style="text-align: center; width: 5%" valign="top">Replies</th>
				<th style="text-align: center; width: 25%" valign="top">Last Comment(C) or Edit(E)</th>
				<th style="width: 5%" valign="top">Views</th>
			</tr>
			<tr class="{{__count % 2 == 0 ? 'bg1' : 'bg2'}}" foreach="var t in topics" if="!empty">
				<td valign="top"><font size="1" style="font-size: 16px"><strong><font style="color: #598527; font-size: 10px">{{t.sticky}}</font> {{web.link(t.page.uri, t.page.title)}}</strong></font><br />
					&nbsp;</td>
				<td style="text-align: center; vertical-align: top">{{ t.originator; }}</td>
				<td style="text-align: center; vertical-align: top">{{#t.page.comments}}</td>
				<td style="text-align: center" valign="top"><font style="font-size: 12px">{{date.format(string.substr(t.date,1),'yyyy-M-d H:mm');' '; if (t.change != '(new)') { 'by '; t.author; ' '; } t.change; }}<br />
					</font></td>
				<td style="text-align: center" valign="top">{{t.page.viewcount}}</td>
			</tr>
			<tr if="empty">
				<td colspan="5"><font style="font-size: 14px"><strong>(no topics yet)</strong></font></td>
			</tr>
		</tbody>
	</table>
	<br />
	&nbsp;</div>

Then call this template somewhere on your page, with this:

{{ template("ForumTopicList") }}

Now, you need to create the template for the actual new topic post:

Template:/ForumTopic

<table border="0" cellpadding="5" cellspacing="0" style="border-bottom: black thin solid; border-left: black thin solid; background-color: #eeeeee; width: 100%; border-top: black thin solid; border-right: black thin solid">
	<tbody style="vertical-align: top">
		<tr>
			<td>Created by <span id="ForumEntryOriginator">{{ edit: web.link(user.uri, user.name) }}</span> on {{ edit:&quot;{{ save:date.now}}&quot; }}<br />
				&nbsp;</td>
			<td style="text-align: center; vertical-align: top"><span style="color: #598527; font-weight: bold">{{ if (page.tags.sticky != nil) { &quot;STICKY&quot;; } }}</span></td>
			<td style="background-image: none; text-align: right; vertical-align: top">{{ web.link(page.feed, &quot;Track this page&quot;) }}<br />
				&nbsp;</td>
		</tr>
	</tbody>
</table>
<p>&nbsp;&nbsp;</p>
<p>&nbsp;</p>
<table border="1" cellpadding="5" cellspacing="0" class="comment" style="background-color: #ffdddd; border-collapse: separate; vertical-align: top">
	<tbody style="vertical-align: top">
		<tr>
			<td style="width: 100%">
				<p><span class="comment"><font style="font-size: 21px"><strong>Instructions:</strong></font></span></p>
				<ol>
					<li><span class="comment">These instructions will only appear while you are editing.&nbsp; No need to delete them!</span></li>
					<li style="font-weight: bold"><span class="comment">Please enter your Subject in the title above.</span></li>
					<li><span class="comment">Enter the content of your message in whatever form you like below.</span></li>
					<li><span class="comment"><span style="font-weight: bold">Adding comment: </span><em>If you're not the original creator of this topic, please reply by using the &quot;Add Comment&quot; field at the bottom of the page. </em>The comment added will be tabulated in the &quot;Reply&quot; field.<br />
						&nbsp;</span></li>
				</ol>
			</td>
		</tr>
	</tbody>
</table>
<p>&nbsp;</p>
<p>&lt;enter your topic message/description here&gt;</p>

You can modify this template to include whatever instructions you like.

That’s it! To create a new topic, navigate to the page that you call the ForumTopicList template, and click the “Create New Topic” button:

When others comment on the page that’s created, it will count as “replies” and show in the topic list.

Thoughts on my career path

A post by Ned Pyle was just released on the AskDS blog, which is excellent and should be read immediately:

http://blogs.technet.com/b/askds/archive/2011/09/02/accelerating-your-it-career.aspxLadder image from www.sxc.hu

Reading through this got me thinking about my own career, my abilities and attributes. I consider myself good at my job, and invaluable to my company, but reading pretty much anything by Ned or other respected IT personalities (those at the top of the Serverfault reputation list come to mind) leave me wishing I had more.

More knowledge, more skills, more time to study, play in a lab, read more books. More motivation to excel and be more creative for my company.

 

I find that it is difficult to really retain knowledge and gain expertise on technology with which you don’t have any real interaction with, and I’m always afraid of spending time learning and mastering something, just to have that knowledge wither and die. When I graduated from SAIT in 2005, I had my CCNA, was trained for CCNP and would have passed the test easily but never took it because my first job was entry level system admin. Since then I haven’t touched a real routing protocol, or any Cisco device for that matter, and those skills have atrophied. I’m fearful that things I spend time on that have no relevance in my current position will be a waste of time.

Perhaps my perspective on all this is a little skewed, since at this medium sized company there are only two IT staff (myself included) and every area of IT falls under my responsibility. I’m directly responsible for (and have implemented myself) Exchange, Hyper-V, SQL, Windows Server and client OS, networking, backups, purchasing, policy making, documentation, monitoring, the list goes on. In addition, I’m beginning to learn C# and ASP.net for developing in-house tools at my company.

Just as Ned mentioned, it’s hard to be an expert in everything, but since I deal with everything, sometimes its hard to be an expert in anything. We’re hiring for a help-desk position in the near future so hopefully that will remove some lower end duties, giving me a bit of free time for some real learning and professional development.

 

All that being said, I start thinking about the things I am involved in at work, and can see many areas of improvement. Exchange and Hyper-V both come to mind, as those have both been my implementations, but I am in no way an expert for either. They’re also both critical to my company, and that in itself is a good motivator for improvement.

 

Either way, knowing there is room for improvement is powerful, and there’s a lot of helpful links from Mr. Pyle that I’ll be following up on.

Shut down without installing updates – Windows 7

Shutdown with updates
What if I don't want to install updates?

An annoying attribute of Windows 7 is that when updates are waiting to be installed, if you choose to shut down, you MUST install the updates at the time.

While there are workarounds to shut down without installing the update (Ctrl+Alt+Del and the shutdown option there), they’re not suitable for an entire organization.

I understand the point of this being a default, but when one of the updates is Office 2010 SP1, and you have laptop users waiting to pick up and go it is not desired.

Fortunately there’s a Group Policy setting to give you the option to shut down without installing updates.

You can find this at:

User Configuration > Policies > Administrative Template > Windows Components > Windows Updates

 

Do not adjust default option to ‘Install Updates and Shut Down’ in Shut Down Windows dialog box.

If this option is enabled, you will get a regular shut down button, along with an extra option to “Install Updates and Shut Down” from the start menu shutdown arrow options:

 

Redirect HTTP to HTTPS with IIS

I’ve got an internal website that runs in IIS 6, for which I have enabled SSL. Due to the nature of this website, and the login credentials used, I want to make sure any access is always encrypted, but still allow my users to access it at http:// for ease of use.

 

Fortunately I found a pretty simple way of doing this with IIS 6 (I don’t know whether it’s still supported in IIS 7, but I imagine it would).

First, create a file called sslredirect.htm, with the contents as:

<SCRIPT type=text/javascript>
<!--
if (location.protocol != 'https:')
{
window.location = 'https://'+ location.host + location.pathname + location.search;
//alert(location.host + location.pathname + location.search); Just for sanity check
 
}
// -->
</SCRIPT>

 

Then, go into the properties of your IIS site, and on the Custom Errors tab, change error 403:4 to point to your sslredirect.htm file.

IIS custom error configuration
 

Now, if someone opens up http://www.website.com, it will automatically redirect them to https://www.website.com.

BigBlueButton Update & Nefsis


So after a month or two encouraging my users to make use of our BigBlueButton implementation for virtual boardrooms, it looks like we’ll be slowly moving away from it in favor of Nefsis.

Logo's for Nefis and BigBlueButton

BBB was working well for general use such as brown bag sessions and impromptu meetings, however I’ve recently had a use-case pop up of remote collaboration between two offices, with some requirements that BBB just can’t meet (yet?).

Specifically the things that have prompted me to look elsewhere:

  • Lack of remote control support
  • Incomplete document sharing support (file formats)
  • Poor full-screen document sharing, desktop sharing
  • Poor user reception (Not a shortcoming on BBB in my opinion, just hard to please personnel with emotional attachment to brand names)

I found Nefsis during my last go-round at finding a web conferencing solution, and was very impressed by the trial I was involved in. After some more inspection and user showcasing, we found Nefsis operated better than Webex, with a more user friendly and discoverable interface.

One of the best features about Nefsis is the full support for almost any document type. What they appear to do is convert it on the fly to either a set of slides, or perhaps even a PDF. This gives us the ability to share Office documents, Wordperfect, AutoCAD DWG files and many more. One of the primary uses is discussion-led mark-up so having all these formats available is key.
Overall I’m disappointed we had to go for a paid (and expensive) solution, and by the fact that good solutions aren’t being utilized simply due to name recognition.  Perhaps I have to find a better way to introduce this type of software.