<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6597645530249322915</id><updated>2012-02-16T20:38:47.016-06:00</updated><category term='blogger widget'/><category term='compatability'/><category term='firefox'/><category term='scripting'/><category term='windows'/><category term='javascript'/><category term='web'/><category term='vista'/><category term='programming'/><category term='batch'/><title type='text'>John's Computer Journal</title><subtitle type='html'>if ( !rocket_science &amp;&amp; !obvious ) { it = computer_science; }</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://johnscomputerjournal.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6597645530249322915/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://johnscomputerjournal.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>John</name><uri>http://www.blogger.com/profile/13568415846137179048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>18</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6597645530249322915.post-7144067218190208889</id><published>2008-05-28T21:47:00.006-06:00</published><updated>2008-05-28T22:19:54.349-06:00</updated><title type='text'>Ctrl - Alt - H to Show and Hide Hidden Files</title><content type='html'>Hidden files can quickly be shown and hidden again using the the following VBScript.  The script has only been tested in Windows Vista, but should work in other versions of Windows.

&lt;code&gt;&lt;/code&gt;&lt;pre&gt;
'showHiddenFiles.vbs
'http://johnscomputerjournal.blogspot.com

Dim WSHShell, n, p, itemtype, MyBox
Set WSHShell = WScript.CreateObject("WScript.Shell")

p = "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Hidden"

itemtype = "REG_DWORD"

n = WSHShell.RegRead (p)
errnum = Err.Number

if errnum &lt;&gt; 1 then

WSHShell.RegWrite p, 2, itemtype
End If

If n = 2 Then ' currently hidden

down = 9

'   WshShell.RegWrite p, 1, itemtype

End If

If n = 1 Then ' currently shown

down = 8

'   WshShell.Regwrite p, 2, itemtype

End If

WshShell.Run "RunDll32.exe shell32.dll,Options_RunDLL 7"
WScript.Sleep 500

WshShell.SendKeys "{TAB}"

'8 to hide
'9 to show
For i=1 to down

WshShell.SendKeys "{DOWN}"

Next

WshShell.SendKeys " {TAB}{TAB}{ENTER}"

Set WshShell = Nothing


&lt;/pre&gt;

After saving the VBScript, create a shortcut to the script someplace in your start menu.  Right click the shortcut and assign the shortcut keys Ctrl - Alt - H.
&lt;p&gt;
Open up a folder and press Ctrl - Alt - H to show hidden files.  Press Ctrl - Alt - H again to hide the files.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6597645530249322915-7144067218190208889?l=johnscomputerjournal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnscomputerjournal.blogspot.com/feeds/7144067218190208889/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6597645530249322915&amp;postID=7144067218190208889&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6597645530249322915/posts/default/7144067218190208889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6597645530249322915/posts/default/7144067218190208889'/><link rel='alternate' type='text/html' href='http://johnscomputerjournal.blogspot.com/2008/05/ctrl-alt-h-to-show-and-hide-hidden.html' title='Ctrl - Alt - H to Show and Hide Hidden Files'/><author><name>John</name><uri>http://www.blogger.com/profile/13568415846137179048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6597645530249322915.post-2810726734471961651</id><published>2008-05-28T21:26:00.003-06:00</published><updated>2008-05-28T21:42:41.132-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>Simple Tomboy like Notes in Windows</title><content type='html'>Until Tomboy is properly ported to Windows, similar functionality can be achieved with tools already provided by windows.

&lt;ol&gt;&lt;li&gt;Open up your &lt;span style="font-weight: bold;"&gt;Documents&lt;/span&gt; folder and create a folder called &lt;span style="font-weight: bold;"&gt;Quick Notes&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;Create a shortcut to Notepad (or similar text editor application) in the Quick Notes folder.
&lt;/li&gt;&lt;li&gt;Right click the shortcut to Notepad and select &lt;span style="font-weight: bold;"&gt;Properties&lt;/span&gt;.  Put the full path to the Quick Notes folder in the &lt;span style="font-weight: bold;"&gt;Start in:&lt;/span&gt; field.
&lt;/li&gt;&lt;li&gt;Right click on your task bar and go to &lt;span style="font-weight: bold;"&gt;Toolbars &gt; New Toolbar ...  &lt;/span&gt;and select the Quick Notes folder.&lt;/li&gt;&lt;/ol&gt;Voila! Quick and easy access to your notes.
&lt;span style="font-weight: bold;"&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6597645530249322915-2810726734471961651?l=johnscomputerjournal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnscomputerjournal.blogspot.com/feeds/2810726734471961651/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6597645530249322915&amp;postID=2810726734471961651&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6597645530249322915/posts/default/2810726734471961651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6597645530249322915/posts/default/2810726734471961651'/><link rel='alternate' type='text/html' href='http://johnscomputerjournal.blogspot.com/2008/05/simple-tomboy-like-notes-in-windows.html' title='Simple Tomboy like Notes in Windows'/><author><name>John</name><uri>http://www.blogger.com/profile/13568415846137179048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6597645530249322915.post-4245459354287944360</id><published>2008-03-27T17:30:00.004-06:00</published><updated>2008-04-08T17:48:06.846-06:00</updated><title type='text'>RIFE framework analysis</title><content type='html'>&lt;div class="Section1"&gt;
&lt;p style="margin: 0pt;"&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt;The RIFE framework is a fully featured web application framework.&lt;/span&gt;&lt;/p&gt;
&lt;ul style="margin-top: 0pt; margin-bottom: 0pt;" type="disc"&gt;
&lt;li style="margin-top: 0pt; margin-bottom: 0pt;" value="1"&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Key Components:&lt;/span&gt; RIFE handles content management, database, meta data, templating, web, life-cycle management, external interfaces (like &lt;span style="color: rgb(255, 0, 0);"&gt;web services&lt;/span&gt;), and common services.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style="margin-top: 0pt; margin-bottom: 0pt;" value="2"&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Request Routing: &lt;/span&gt;Requests are routed through RIFE's web engine. The web engine handles data and logic flow and ties together the components. The web engine is also features what it calls '&lt;span style="color: rgb(255, 102, 102);"&gt;continuations&lt;/span&gt;' which are capable of ensuring idempotent and navagatable form submissions.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;

&lt;li style="margin-top: 0pt; margin-bottom: 0pt;" value="3"&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;View Handling:&lt;/span&gt; RIFE has a &lt;span style="color: rgb(255, 102, 102);"&gt;template component&lt;/span&gt; that handles displaying dynamic web content. RIFE's template code does not include commands for anything more than presentation.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style="margin-top: 0pt; margin-bottom: 0pt;" value="4"&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Model Handling:&lt;/span&gt; RIFE has support for several databases through &lt;span style="color: rgb(255, 102, 102);"&gt;JDBC&lt;/span&gt; and a &lt;span style="color: rgb(255, 102, 102);"&gt;content management system&lt;/span&gt; for handling binary files, e.g, images. RIFE can automatically &lt;span style="color: rgb(255, 102, 102);"&gt;initiate a database structure &lt;/span&gt;based plain old java objects, i.e, pojos and ensure they are used correctly via constraint meta data.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="margin: 0pt;"&gt;&lt;span style="font-weight: bold;font-family:verdana;font-size:85%;"  &gt;Stability&lt;/span&gt;&lt;/p&gt;
&lt;ul style="margin-top: 0pt; margin-bottom: 0pt;" type="disc"&gt;
&lt;li style="margin-top: 0pt; margin-bottom: 0pt;" value="1"&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Robustness:&lt;/span&gt; The framework forces developers to develop a well structured application that is maintainable and easy to understand.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;

&lt;li style="margin-top: 0pt; margin-bottom: 0pt;" value="2"&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Scalability:&lt;/span&gt; RIFE should easily scale for high-volume data and traffic. The developers of RIFE have used it to build an IRC bot capable of tracking, recording, and displaying IRC channel conversations from multiple channels.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="margin: 0pt;"&gt;&lt;span style="font-weight: bold;font-family:verdana;font-size:85%;"  &gt;Framework Type&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0pt;"&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt;The RIFE application framework uses elements of both request-based and component-based models. The RIFE framework may be the current top &lt;span style="color: rgb(255, 102, 102);"&gt;hybrid framework&lt;/span&gt; that provides request-based control. A quick search on google for 'request based framework' returns RIFE as the first result.&lt;/span&gt;&lt;/p&gt;
&lt;ul style="margin-top: 0pt; margin-bottom: 0pt;" type="disc"&gt;
&lt;li style="margin-top: 0pt; margin-bottom: 0pt;" value="1"&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Request-based usage&lt;/span&gt;: RIFE uses a request-based model to handle the entire data and logic flow. By handling the data and logic flow in a request-based method developers are able to have &lt;span style="color: rgb(255, 102, 102);"&gt;full control&lt;/span&gt; over URLs, forms, parameters, cookies and pathinfos. The request-based model is very close to the original CGI specification.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;

&lt;li style="margin-top: 0pt; margin-bottom: 0pt;" value="2"&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Component-based usage:&lt;/span&gt; RIFE uses a component-based approach to map actions and controllers to requests. The abstract, higher level approach provided by the component model allows consistent behavior among individual pages, forwarded pages, and integrable content, e.g., widgets and page fragments. Components can be &lt;span style="color: rgb(255, 102, 102);"&gt;easily distributed and re-used &lt;/span&gt;and embeded in other RIFE applications.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="margin: 0pt;"&gt;&lt;span style="font-weight: bold;font-family:verdana;font-size:85%;"  &gt;Ease of Use&lt;/span&gt;&lt;/p&gt;
&lt;ul style="margin-top: 0pt; margin-bottom: 0pt;" type="disc"&gt;
&lt;li style="margin-top: 0pt; margin-bottom: 0pt;" value="1"&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Getting started&lt;/span&gt;: &lt;span style="color: rgb(255, 102, 102);"&gt;RIFE/Jumpstart &lt;/span&gt;contains source code for developers to quickly get started using RIFE. RIFE/Jumpstart supports many common development environments including &lt;span style="color: rgb(255, 102, 102);"&gt;Eclipse&lt;/span&gt; and NewBeans and comes with a &lt;span style="color: rgb(255, 102, 102);"&gt;Jetty &lt;/span&gt;servlet container and other components.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style="margin-top: 0pt; margin-bottom: 0pt;" value="2"&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Learning Curve:&lt;/span&gt; RIFE requires certain declarations to be implemented in a handful of configuration files before an application can function correctly. RIFE's developers claim that the declarations increase productivity and reduce maintenance issues. Overall the learning curve isn't too difficult, but still uses slightly different terminology than other frameworks any may be difficult to quickly pick up and understand. Documentation, examples, and a user guide can all be found on RIFE's official website.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;

&lt;li style="margin-top: 0pt; margin-bottom: 0pt;" value="3"&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Support:&lt;/span&gt; RIFE's official website and wiki site provides a few good examples and tutorials of how to use RIFE. The examples and tutorials &lt;span style="color: rgb(255, 102, 102);"&gt;don't seem to be updated too frequently&lt;/span&gt;. Sources of &lt;span style="color: rgb(255, 102, 102);"&gt;public support outside of RIFE's official and affiliated sites are difficult to locate&lt;/span&gt; if they exist at all.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="margin: 0pt;"&gt;&lt;span style="font-weight: bold;font-family:verdana;font-size:85%;"  &gt;Sites&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0pt;"&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt;RIFE's official site &lt;/span&gt;&lt;a href="http://rifers.org/rifespotting"&gt;&lt;span style="text-decoration: underline; color: rgb(0, 52, 176);font-family:verdana;font-size:85%;"  &gt;http://rifers.org/rifespotting&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt; lists a few high-traffic sites. However, none of the sites listed were familiar to me. A few blogs mention developers that have chosen to develop using the RIFE framework, but I couldn't find many in the 'wild' that use the framework.&lt;/span&gt;&lt;/p&gt;
&lt;ul style="margin-top: 0pt; margin-bottom: 0pt;" type="disc"&gt;

&lt;li style="margin-top: 0pt; margin-bottom: 0pt;" value="1"&gt;&lt;a href="http://www.blablalist.com/"&gt;&lt;span style="text-decoration: underline; color: rgb(0, 52, 176);font-family:verdana;font-size:85%;"  &gt;http://www.blablalist.com/&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt; - Sharable to-do list&lt;/span&gt;&lt;/li&gt;
&lt;li style="margin-top: 0pt; margin-bottom: 0pt;" value="2"&gt;&lt;a href="http://moochspot.com/"&gt;&lt;span style="text-decoration: underline; color: rgb(0, 52, 176);font-family:verdana;font-size:85%;"  &gt;http://moochspot.com/&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt; - Track shared expenses, built by Facebook to demonstrate the use of Facebook API&lt;/span&gt;&lt;/li&gt;
&lt;li style="margin-top: 0pt; margin-bottom: 0pt;" value="3"&gt;&lt;a href="http://drone.codehaus.org/"&gt;&lt;span style="text-decoration: underline; color: rgb(0, 52, 176);font-family:verdana;font-size:85%;"  &gt;http://drone.codehaus.org/&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt; - IRC bot&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p style="margin: 0pt;"&gt;&lt;span style="font-weight: bold;font-family:verdana;font-size:85%;"  &gt;Thoughts&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0pt;"&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt;RIFE provides all the tools needed to quickly develop and maintain a Java web application. The feature set is impressive and the ability to integrate with other frameworks, libraries, tools, and APIs allow RIFE to be a great base for application development.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0pt;"&gt;&lt;span style="font-family:verdana;"&gt;
&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0pt;"&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt;The difficulty in finding websites that use RIFE and the few blog posts discussing RIFE lead me to believe RIFE is being overlooked by many web developers in favor of other frameworks. I was not able to indicate any particular drawback of using RIFE over another framework.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0pt;"&gt;&lt;span style="font-family:verdana;"&gt;
&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p style="margin: 0pt;"&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt;The last update to RIFE code was sometime last summer. It may be possible that the infrequent updates to supporting documentation and core RIFE code development are causing some developers to shy away from using the framework.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0pt;"&gt;
&lt;/p&gt;&lt;p style="margin: 0pt;"&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt;
&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;iframe src='http://docs.google.com/EmbedSlideshow?docid=dd5rf467_55hfwgbpcb' frameborder='0' width='410' height='342'&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6597645530249322915-4245459354287944360?l=johnscomputerjournal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnscomputerjournal.blogspot.com/feeds/4245459354287944360/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6597645530249322915&amp;postID=4245459354287944360&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6597645530249322915/posts/default/4245459354287944360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6597645530249322915/posts/default/4245459354287944360'/><link rel='alternate' type='text/html' href='http://johnscomputerjournal.blogspot.com/2008/03/rife-framework-analysis.html' title='RIFE framework analysis'/><author><name>John</name><uri>http://www.blogger.com/profile/13568415846137179048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6597645530249322915.post-6386657191461849833</id><published>2007-06-04T06:29:00.000-06:00</published><updated>2007-06-04T07:28:42.359-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='scripting'/><title type='text'>Dynamic Image Sizing (Zoom) for Firefox</title><content type='html'>The following javascript code will setup a HTML document so that in Firefox when the fontsize is increased or decreased, the images will increase or decrease in size as well.  The code can be appended to the end of any HTML document you wish or possibly made into a Firefox extension.

&lt;h4&gt;Usage&lt;/h4&gt;
After appending the following code to any HTML document use the &lt;code&gt;Ctrl+Mouse Wheel&lt;/code&gt;, the &lt;code&gt;View -&gt; Text Size&lt;/code&gt;, &lt;code&gt;Ctrl++&lt;/code&gt;, &lt;code&gt;Ctrl+-&lt;/code&gt;, or &lt;code&gt;Ctrl+0&lt;/code&gt; menus and or accelerators in Firefox to zoom the page in or out.  Internet Explorer and Opera already have the ability to zoom text and images and as far as I know are unaffected by the code.

&lt;h4&gt;Limitations&lt;/h4&gt;
The code does not resize images that are displayed as part of the CSS style.

&lt;h4&gt;Javascript Code&lt;/h4&gt;
&lt;pre&gt;
&lt;font color="#80a0b0"&gt;&amp;lt;!&lt;/font&gt;&lt;font color="#80a0b0"&gt;-- dynamic image sizing - set image size according to font size {{{&lt;/font&gt;
&lt;font color="#80a0b0"&gt;     Copyright (C) 2007 John Elkins&lt;/font&gt;

&lt;font color="#80a0b0"&gt;     LISCENSE&lt;/font&gt;

&lt;font color="#80a0b0"&gt;     This program is free software; you can redistribute it and/or modify it&lt;/font&gt;
&lt;font color="#80a0b0"&gt;     under the terms of the GNU General Public License as published by the&lt;/font&gt;
&lt;font color="#80a0b0"&gt;     Free Software Foundation; either version 2 of the License, or (at your&lt;/font&gt;
&lt;font color="#80a0b0"&gt;     option) any later version.&lt;/font&gt;

&lt;font color="#80a0b0"&gt;     This program is distributed in the hope that it will be useful, but&lt;/font&gt;
&lt;font color="#80a0b0"&gt;     WITHOUT ANY WARRANTY; without even the implied warranty of&lt;/font&gt;
&lt;font color="#80a0b0"&gt;     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General&lt;/font&gt;
&lt;font color="#80a0b0"&gt;     Public License for more details.&lt;/font&gt;

&lt;font color="#80a0b0"&gt;     You should have received a copy of the GNU General Public License along&lt;/font&gt;
&lt;font color="#80a0b0"&gt;     with this program; if not, write to the Free Software Foundation, Inc.,&lt;/font&gt;
&lt;font color="#80a0b0"&gt;     51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA. &lt;/font&gt;

&lt;font color="#80a0b0"&gt;     REQUIREMENTS&lt;/font&gt;
&lt;font color="#80a0b0"&gt;            &lt;/font&gt;
&lt;font color="#80a0b0"&gt;            Firefox web browser.  IE and Opera already have an image zoom&lt;/font&gt;
&lt;font color="#80a0b0"&gt;            functionality.&lt;/font&gt;

&lt;font color="#80a0b0"&gt;     USAGE&lt;/font&gt;

&lt;font color="#80a0b0"&gt;            Place the following code at the END of the document.  After all&lt;/font&gt;
&lt;font color="#80a0b0"&gt;            images have finished loading.&lt;/font&gt;

&lt;font color="#80a0b0"&gt;     LIMITATIONS&lt;/font&gt;
&lt;font color="#80a0b0"&gt;            &lt;/font&gt;
&lt;font color="#80a0b0"&gt;            Images defined by CSS styles are not resized&lt;/font&gt;

&lt;font color="#80a0b0"&gt;     Version 1&lt;/font&gt;
&lt;font color="#80a0b0"&gt;        &lt;/font&gt;
&lt;font color="#80a0b0"&gt;     4 June 2007&lt;/font&gt;
&lt;font color="#80a0b0"&gt;--&lt;/font&gt;&lt;font color="#80a0b0"&gt;&amp;gt;&lt;/font&gt;
&lt;font color="#009acd"&gt;&amp;lt;&lt;/font&gt;&lt;span style="background-color: #103040"&gt;&lt;font color="#a0ffa0"&gt;&lt;b&gt;style&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;&lt;font color="#009acd"&gt; &lt;/font&gt;&lt;font color="#a0a0ff"&gt;type&lt;/font&gt;&lt;font color="#009acd"&gt;=&lt;/font&gt;&lt;span style="background-color: #103040"&gt;&lt;font color="#00ffff"&gt;&amp;quot;text/css&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#009acd"&gt;&amp;gt;&lt;/font&gt;
&lt;font color="#80a0b0"&gt;&amp;lt;!--&lt;/font&gt;
    &lt;font color="#66cdaa"&gt;&lt;b&gt;.&lt;/b&gt;&lt;/font&gt;em_test_hidden &lt;font color="#009acd"&gt;{&lt;/font&gt;
        &lt;font color="#a0a0ff"&gt;position&lt;/font&gt;:&lt;font color="#a0a0ff"&gt;absolute&lt;/font&gt;;
        &lt;font color="#a0a0ff"&gt;left&lt;/font&gt;:&lt;span style="background-color: #103040"&gt;&lt;font color="#00ffff"&gt;0px&lt;/font&gt;&lt;/span&gt;;
        &lt;font color="#a0a0ff"&gt;top&lt;/font&gt;:&lt;span style="background-color: #103040"&gt;&lt;font color="#00ffff"&gt;-500px&lt;/font&gt;&lt;/span&gt;;
        &lt;font color="#a0a0ff"&gt;width&lt;/font&gt;:&lt;span style="background-color: #103040"&gt;&lt;font color="#00ffff"&gt;1px&lt;/font&gt;&lt;/span&gt;;
        &lt;font color="#a0a0ff"&gt;overflow&lt;/font&gt;:&lt;font color="#a0a0ff"&gt;hidden&lt;/font&gt;;
    &lt;font color="#009acd"&gt;}&lt;/font&gt;
&lt;font color="#80a0b0"&gt;--&amp;gt;&lt;/font&gt;
&lt;font color="#009acd"&gt;&amp;lt;/&lt;/font&gt;&lt;span style="background-color: #103040"&gt;&lt;font color="#a0ffa0"&gt;&lt;b&gt;style&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;&lt;font color="#009acd"&gt;&amp;gt;&lt;/font&gt;
&lt;font color="#009acd"&gt;&amp;lt;&lt;/font&gt;&lt;span style="background-color: #103040"&gt;&lt;font color="#a0ffa0"&gt;&lt;b&gt;script&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;&lt;font color="#009acd"&gt; &lt;/font&gt;&lt;font color="#a0a0ff"&gt;type&lt;/font&gt;&lt;font color="#009acd"&gt;=&lt;/font&gt;&lt;span style="background-color: #103040"&gt;&lt;font color="#00ffff"&gt;&amp;quot;text/javascript&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#009acd"&gt;&amp;gt;&lt;/font&gt;
&lt;font color="#80a0b0"&gt;&amp;lt;!--&lt;/font&gt;



&lt;font color="#80a0b0"&gt;// Create the test image&lt;/font&gt;
&lt;font color="#009acd"&gt;var&lt;/font&gt;&lt;font color="#66cdaa"&gt;&lt;b&gt; element = &lt;/b&gt;&lt;/font&gt;&lt;span style="background-color: #103040"&gt;&lt;font color="#a0ffa0"&gt;&lt;b&gt;document&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;&lt;font color="#66cdaa"&gt;&lt;b&gt;.createElement&lt;/b&gt;&lt;/font&gt;(&lt;span style="background-color: #103040"&gt;&lt;font color="#00ffff"&gt;'img'&lt;/font&gt;&lt;/span&gt;)&lt;font color="#66cdaa"&gt;&lt;b&gt;;&lt;/b&gt;&lt;/font&gt;
&lt;font color="#66cdaa"&gt;&lt;b&gt;element.setAttribute&lt;/b&gt;&lt;/font&gt;(&lt;span style="background-color: #103040"&gt;&lt;font color="#00ffff"&gt;&amp;quot;src&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#66cdaa"&gt;&lt;b&gt;, &lt;/b&gt;&lt;/font&gt;&lt;span style="background-color: #103040"&gt;&lt;font color="#00ffff"&gt;&amp;quot;&amp;quot;&lt;/font&gt;&lt;/span&gt;)&lt;font color="#66cdaa"&gt;&lt;b&gt;;&lt;/b&gt;&lt;/font&gt;
&lt;font color="#66cdaa"&gt;&lt;b&gt;element.setAttribute&lt;/b&gt;&lt;/font&gt;(&lt;span style="background-color: #103040"&gt;&lt;font color="#00ffff"&gt;&amp;quot;style&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#66cdaa"&gt;&lt;b&gt;,&lt;/b&gt;&lt;/font&gt;&lt;span style="background-color: #103040"&gt;&lt;font color="#00ffff"&gt;&amp;quot;height:1em;&amp;quot;&lt;/font&gt;&lt;/span&gt;)&lt;font color="#66cdaa"&gt;&lt;b&gt;;&lt;/b&gt;&lt;/font&gt;
&lt;font color="#66cdaa"&gt;&lt;b&gt;element.setAttribute&lt;/b&gt;&lt;/font&gt;(&lt;span style="background-color: #103040"&gt;&lt;font color="#00ffff"&gt;&amp;quot;class&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#66cdaa"&gt;&lt;b&gt;,&lt;/b&gt;&lt;/font&gt;&lt;span style="background-color: #103040"&gt;&lt;font color="#00ffff"&gt;&amp;quot;em_test_hidden&amp;quot;&lt;/font&gt;&lt;/span&gt;)&lt;font color="#66cdaa"&gt;&lt;b&gt;;&lt;/b&gt;&lt;/font&gt;
&lt;font color="#66cdaa"&gt;&lt;b&gt;element.setAttribute&lt;/b&gt;&lt;/font&gt;(&lt;span style="background-color: #103040"&gt;&lt;font color="#00ffff"&gt;&amp;quot;id&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#66cdaa"&gt;&lt;b&gt;,&lt;/b&gt;&lt;/font&gt;&lt;span style="background-color: #103040"&gt;&lt;font color="#00ffff"&gt;&amp;quot;em_test_element&amp;quot;&lt;/font&gt;&lt;/span&gt;)&lt;font color="#66cdaa"&gt;&lt;b&gt;;&lt;/b&gt;&lt;/font&gt;

&lt;span style="background-color: #103040"&gt;&lt;font color="#a0ffa0"&gt;&lt;b&gt;document&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;&lt;font color="#66cdaa"&gt;&lt;b&gt;.body.appendChild&lt;/b&gt;&lt;/font&gt;(&lt;font color="#66cdaa"&gt;&lt;b&gt;element&lt;/b&gt;&lt;/font&gt;)&lt;font color="#66cdaa"&gt;&lt;b&gt;;&lt;/b&gt;&lt;/font&gt;

&lt;font color="#66cdaa"&gt;&lt;b&gt;element.&lt;/b&gt;&lt;/font&gt;&lt;span style="background-color: #103040"&gt;&lt;font color="#a0ffa0"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;&lt;font color="#66cdaa"&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&lt;span style="background-color: #103040"&gt;&lt;font color="#00ffff"&gt;&amp;quot;em_test_hidden&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#66cdaa"&gt;&lt;b&gt;;&lt;/b&gt;&lt;/font&gt;

&lt;font color="#80a0b0"&gt;// Use the test image to determine the pixels per em&lt;/font&gt;
&lt;font color="#009acd"&gt;var&lt;/font&gt;&lt;font color="#66cdaa"&gt;&lt;b&gt; px_per_em = &lt;/b&gt;&lt;/font&gt;&lt;span style="background-color: #103040"&gt;&lt;font color="#a0ffa0"&gt;&lt;b&gt;document&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;&lt;font color="#66cdaa"&gt;&lt;b&gt;.getElementById&lt;/b&gt;&lt;/font&gt;(&lt;span style="background-color: #103040"&gt;&lt;font color="#00ffff"&gt;&amp;quot;em_test_element&amp;quot;&lt;/font&gt;&lt;/span&gt;)&lt;font color="#66cdaa"&gt;&lt;b&gt;.height;&lt;/b&gt;&lt;/font&gt;

&lt;font color="#80a0b0"&gt;// Set all image heights to change relative to the em&lt;/font&gt;
&lt;font color="#009acd"&gt;var&lt;/font&gt;&lt;font color="#66cdaa"&gt;&lt;b&gt; image = &lt;/b&gt;&lt;/font&gt;&lt;span style="background-color: #103040"&gt;&lt;font color="#a0ffa0"&gt;&lt;b&gt;document&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;&lt;font color="#66cdaa"&gt;&lt;b&gt;.getElementsByTagName&lt;/b&gt;&lt;/font&gt;(&lt;span style="background-color: #103040"&gt;&lt;font color="#00ffff"&gt;&amp;quot;img&amp;quot;&lt;/font&gt;&lt;/span&gt;)&lt;font color="#66cdaa"&gt;&lt;b&gt;;&lt;/b&gt;&lt;/font&gt;
&lt;span style="background-color: #103040"&gt;&lt;font color="#4eee94"&gt;for&lt;/font&gt;&lt;/span&gt;&lt;font color="#66cdaa"&gt;&lt;b&gt; &lt;/b&gt;&lt;/font&gt;(&lt;font color="#009acd"&gt;var&lt;/font&gt;&lt;font color="#66cdaa"&gt;&lt;b&gt; i=&lt;/b&gt;&lt;/font&gt;0&lt;font color="#66cdaa"&gt;&lt;b&gt;; i&amp;lt;image.length; i++&lt;/b&gt;&lt;/font&gt;)&lt;font color="#66cdaa"&gt;&lt;b&gt; &lt;/b&gt;&lt;/font&gt;&lt;font color="#009acd"&gt;{&lt;/font&gt;

&lt;font color="#66cdaa"&gt;&lt;b&gt;    &lt;/b&gt;&lt;/font&gt;&lt;font color="#009acd"&gt;var&lt;/font&gt;&lt;font color="#66cdaa"&gt;&lt;b&gt; dynamic_em_height=image&lt;/b&gt;&lt;/font&gt;&lt;font color="#009acd"&gt;[&lt;/font&gt;&lt;font color="#66cdaa"&gt;&lt;b&gt;i&lt;/b&gt;&lt;/font&gt;&lt;font color="#009acd"&gt;]&lt;/font&gt;&lt;font color="#66cdaa"&gt;&lt;b&gt;.height/px_per_em;&lt;/b&gt;&lt;/font&gt;
&lt;font color="#66cdaa"&gt;&lt;b&gt;    &lt;/b&gt;&lt;/font&gt;&lt;font color="#009acd"&gt;var&lt;/font&gt;&lt;font color="#66cdaa"&gt;&lt;b&gt; dynamic_em_width=image&lt;/b&gt;&lt;/font&gt;&lt;font color="#009acd"&gt;[&lt;/font&gt;&lt;font color="#66cdaa"&gt;&lt;b&gt;i&lt;/b&gt;&lt;/font&gt;&lt;font color="#009acd"&gt;]&lt;/font&gt;&lt;font color="#66cdaa"&gt;&lt;b&gt;.width/px_per_em;&lt;/b&gt;&lt;/font&gt;

&lt;font color="#66cdaa"&gt;&lt;b&gt;    image&lt;/b&gt;&lt;/font&gt;&lt;font color="#009acd"&gt;[&lt;/font&gt;&lt;font color="#66cdaa"&gt;&lt;b&gt;i&lt;/b&gt;&lt;/font&gt;&lt;font color="#009acd"&gt;]&lt;/font&gt;&lt;font color="#66cdaa"&gt;&lt;b&gt;.style.height = dynamic_em_height+&lt;/b&gt;&lt;/font&gt;&lt;span style="background-color: #103040"&gt;&lt;font color="#00ffff"&gt;&amp;quot;em&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#66cdaa"&gt;&lt;b&gt;;&lt;/b&gt;&lt;/font&gt;
&lt;font color="#66cdaa"&gt;&lt;b&gt;    image&lt;/b&gt;&lt;/font&gt;&lt;font color="#009acd"&gt;[&lt;/font&gt;&lt;font color="#66cdaa"&gt;&lt;b&gt;i&lt;/b&gt;&lt;/font&gt;&lt;font color="#009acd"&gt;]&lt;/font&gt;&lt;font color="#66cdaa"&gt;&lt;b&gt;.style.width  = dynamic_em_width+&lt;/b&gt;&lt;/font&gt;&lt;span style="background-color: #103040"&gt;&lt;font color="#00ffff"&gt;&amp;quot;em&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#66cdaa"&gt;&lt;b&gt;;&lt;/b&gt;&lt;/font&gt;

&lt;font color="#009acd"&gt;}&lt;/font&gt;

&lt;font color="#80a0b0"&gt;// change the document so it also resizes accordingly&lt;/font&gt;
&lt;span style="background-color: #103040"&gt;&lt;font color="#a0ffa0"&gt;&lt;b&gt;document&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;&lt;font color="#66cdaa"&gt;&lt;b&gt;.body.style.width = &lt;/b&gt;&lt;/font&gt;&lt;span style="background-color: #103040"&gt;&lt;font color="#a0ffa0"&gt;&lt;b&gt;document&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;&lt;font color="#66cdaa"&gt;&lt;b&gt;.width/px_per_em+&lt;/b&gt;&lt;/font&gt;&lt;span style="background-color: #103040"&gt;&lt;font color="#00ffff"&gt;&amp;quot;em&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#66cdaa"&gt;&lt;b&gt;;&lt;/b&gt;&lt;/font&gt;

&lt;font color="#80a0b0"&gt;--&amp;gt;&lt;/font&gt;
&lt;font color="#009acd"&gt;&amp;lt;/&lt;/font&gt;&lt;span style="background-color: #103040"&gt;&lt;font color="#a0ffa0"&gt;&lt;b&gt;script&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;&lt;font color="#009acd"&gt;&amp;gt;&lt;/font&gt; &lt;font color="#80a0b0"&gt;&amp;lt;!&lt;/font&gt;&lt;font color="#80a0b0"&gt;--}}}--&lt;/font&gt;&lt;font color="#80a0b0"&gt;&amp;gt;&lt;/font&gt;
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6597645530249322915-6386657191461849833?l=johnscomputerjournal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnscomputerjournal.blogspot.com/feeds/6386657191461849833/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6597645530249322915&amp;postID=6386657191461849833&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6597645530249322915/posts/default/6386657191461849833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6597645530249322915/posts/default/6386657191461849833'/><link rel='alternate' type='text/html' href='http://johnscomputerjournal.blogspot.com/2007/06/dynamic-image-sizing-zoom-for-firefox.html' title='Dynamic Image Sizing (Zoom) for Firefox'/><author><name>John</name><uri>http://www.blogger.com/profile/13568415846137179048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6597645530249322915.post-3453609259320627706</id><published>2007-05-28T19:22:00.000-06:00</published><updated>2007-05-30T22:47:48.781-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='scripting'/><category scheme='http://www.blogger.com/atom/ns#' term='blogger widget'/><title type='text'>Summarize and TOC Blogger Widget</title><content type='html'>The following widget uses javascript to automatically summarize an article and provide a table of contents when not summarized.  During summarization the widget will remove all HTML tags and display by default up to 255 characters or a new line (whichever comes first).  When creating a table of contents the widget will search for header tags, add the appropriate anchors, and generate a table of contents with links to the headers in the article.

&lt;h4&gt;Requirements&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Blogger (Beta) Blog
&lt;li&gt;Using the layouts templates
&lt;li&gt;Javascript
&lt;li&gt;Use H1 - H6 to denote section headings
&lt;/ul&gt;

&lt;h4&gt;Usage&lt;/h4&gt;

&lt;h5&gt;Summarize&lt;/h5&gt;
By default the summarize widget will display up to 255 characters or a new line (whichever comes first).  To adjust the amount of characters shown in the summary, change the &lt;i&gt;summarize_length&lt;/i&gt; variable to the desired length.  The summarize_length variable can be accessed through the widget settings screen.

&lt;h5&gt;Table of Contents (TOC)&lt;/h5&gt;
The table of contents is displayed only if there are heading tags within the article.  By default headings H1 - H3 are used by blogger to display the article title, date, and comments headings.  So, I use H4 - H6 in articles to make things a little easier to read; however H1 - H3 could be use too depending on the style you want.

&lt;p&gt;To change the way the table of contents is displayed edit the .tocH* CSS classes found within the widget settings.

&lt;h4&gt;Examples&lt;/h4&gt;
The summarize and table of contents widget was built for use on John's Computer Journal.  You can take a look around and see the widget doing its thing.

&lt;h5&gt;Summarize&lt;/h5&gt;
Check out a non-article page for an example of summarize in action.  The &lt;a href="/"&gt;index (main)&lt;/a&gt; and search pages will summarize all post content.

&lt;h5&gt;Table of Contents&lt;/h5&gt;
Check out the top of this page for an example of the table of contents in action.  The table of contents at the top of this page has been dynamically created by the widget's javascript code without having to be hardcoded into the page.

&lt;h4&gt;Install&lt;/h4&gt;


&lt;style&gt;.add-widget textarea{height:0px;width:0px;border:0px;}&lt;/style&gt;
&lt;form class="add-widget" method="POST" action="http://www.blogger.com/add-widget"&gt;

    &lt;textarea name="widget.title"&gt;
    Summarize and Table of Contents
    &lt;/textarea&gt;

    &lt;textarea name="infoUrl"&gt;
    http://johnscomputerjournal.blogspot.com/2007/05/summarize-and-toc-blogger-widget.html
    &lt;/textarea&gt;

    &lt;textarea name="logoUrl"&gt;
    &lt;!--logoURL--&gt;
    &lt;/textarea&gt;    

    &lt;textarea name="widget.template"&gt;
    &amp;lt;b:includable id='main'&amp;gt;
  &amp;lt;!-- only display title if it's non-empty --&amp;gt;
  &amp;lt;b:if cond='data:title != ""'&amp;gt;
    &amp;lt;!--&amp;lt;h2 class='title'&amp;gt;&amp;lt;data:title/&amp;gt;&amp;lt;/h2&amp;gt;--&amp;gt;
  &amp;lt;/b:if&amp;gt;
  &amp;lt;div class='widget-content'&amp;gt;
    &amp;lt;data:content/&amp;gt;
    &amp;lt;b:if cond='data:blog.pageType == "item"'&amp;gt;
      &amp;lt;script&amp;gt;
 document.write(unescape('%3Cscript%3E%0A%20%20%20%20%20%20%20%20window.onload%3Ddo_toc%3B%0A%20%20%20%20%20%20%3C/script%3E')); 
&amp;lt;/script&amp;gt;
    &amp;lt;b:else/&amp;gt;
      &amp;lt;script&amp;gt;
 document.write(unescape('%3Cscript%3E%0A%20%20%20%20%20%20%20%20window.onload%3Ddo_summarize%3B%0A%20%20%20%20%20%20%3C/script%3E')); 
&amp;lt;/script&amp;gt;
    &amp;lt;/b:if&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/b:includable&amp;gt;
    &lt;/textarea&gt;

    &lt;textarea name="widget.content"&gt;
&amp;lt;!-- 

 Summarize and TOC Blogger Widget summarizes and provides a
 table of contents for blogger posts

 Copyright (C) 2007 John Elkins
 http://johnscomputerjournal.blogspot.com

 This program is free software; you can redistribute it
 and/or modify it under the terms of the GNU General Public
 License as published by the Free Software Foundation;
 either version 2 of the License, or (at your option) any
 later version.
 
 This program is distributed in the hope that it will be
 useful, but WITHOUT ANY WARRANTY; without even the implied
 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
 PURPOSE.  See the GNU General Public License for more
 details.
 
 You should have received a copy of the GNU General Public
 License along with this program; if not, write to the Free
 Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 Boston, MA  02110-1301, USA.

 Version 1

 29 May 2007

 (JE) TODO: find a way to efficiently summarize without 
            removing all or some html tags

      TODO: offer different formats for the toc, like a
            drop-down.

--&amp;gt;
    &amp;lt;script&amp;gt;
&amp;lt;!--
var summarize_length = 255;
//--&amp;gt;
&amp;lt;/script&amp;gt;

&amp;lt;!-- Table of Contents styles --&amp;gt;
&amp;lt;style&amp;gt;
  .tocH1 {margin-left: 0pt}
  .tocH2 {margin-left: 10pt}
  .tocH3 {margin-left: 20pt}
  .tocH4 {margin-left: 30pt}
  .tocH5 {margin-left: 40pt}
  .tocH6 {margin-left: 50pt}
&amp;lt;/style&amp;gt;

&amp;lt;script&amp;gt;
&amp;lt;!--
 document.write(unescape('%3Cscript%20type%3D%22text/javascript%22%3E%0A//%20getElementsByClassName%28%29%20%7B%7B%7B%0A//%20---%0A/*%0A%20%20%20%20Written%20by%20Jonathan%20Snook%2C%20http%3A//www.snook.ca/jonathan%0A%20%20%20%20Add-ons%20by%20Robert%20Nyman%2C%20http%3A//www.robertnyman.com%0A*/%0Afunction%20getElementsByClassName%28oElm%2C%20strTagName%2C%20strClassName%29%7B%0A%09var%20arrElements%20%3D%20%28strTagName%20%3D%3D%20%22*%22%20%26%26%20oElm.all%29%3F%20oElm.all%20%3A%20oElm.getElementsByTagName%28strTagName%29%3B%0A%09var%20arrReturnElements%20%3D%20new%20Array%28%29%3B%0A%09strClassName%20%3D%20strClassName.replace%28/%5C-/g%2C%20%22%5C%5C-%22%29%3B%0A%09var%20oRegExp%20%3D%20new%20RegExp%28%22%28%5E%7C%5C%5Cs%29%22%20+%20strClassName%20+%20%22%28%5C%5Cs%7C%24%29%22%29%3B%0A%09var%20oElement%3B%0A%09for%28var%20i%3D0%3B%20i%3CarrElements.length%3B%20i++%29%7B%0A%09%09oElement%20%3D%20arrElements%5Bi%5D%3B%09%09%0A%09%09if%28oRegExp.test%28oElement.className%29%29%7B%0A%09%09%09arrReturnElements.push%28oElement%29%3B%0A%09%09%7D%09%0A%09%7D%0A%09return%20%28arrReturnElements%29%0A%7D%0A//%20---%0A//%20Revised%20version%20May%2011th%202007%0Afunction%20getElementsByClassName%28className%2C%20tag%2C%20elm%29%7B%0A%09var%20testClass%20%3D%20new%20RegExp%28%22%28%5E%7C%5C%5Cs%29%22%20+%20className%20+%20%22%28%5C%5Cs%7C%24%29%22%29%3B%0A%09var%20tag%20%3D%20tag%20%7C%7C%20%22*%22%3B%0A%09var%20elm%20%3D%20elm%20%7C%7C%20document%3B%0A%09var%20elements%20%3D%20%28tag%20%3D%3D%20%22*%22%20%26%26%20elm.all%29%3F%20elm.all%20%3A%20elm.getElementsByTagName%28tag%29%3B%0A%09var%20returnElements%20%3D%20%5B%5D%3B%0A%09var%20current%3B%0A%09var%20length%20%3D%20elements.length%3B%0A%09for%28var%20i%3D0%3B%20i%3Clength%3B%20i++%29%7B%0A%09%09current%20%3D%20elements%5Bi%5D%3B%0A%09%09if%28testClass.test%28current.className%29%29%7B%0A%09%09%09returnElements.push%28current%29%3B%0A%09%09%7D%09%0A%09%7D%0A%09return%20returnElements%3B%0A%7D%0A//%20---%0A/*%0A%09Revised%20to%20support%20looking%20for%20multiple%20class%20names%2C%0A%09no%20matter%20in%20which%20order%20they%27re%20applied%20to%20the%20element%0A*/%0Afunction%20getElementsByClassName%28oElm%2C%20strTagName%2C%20oClassNames%29%7B%0A%09var%20arrElements%20%3D%20%28strTagName%20%3D%3D%20%22*%22%20%26%26%20oElm.all%29%3F%20oElm.all%20%3A%20oElm.getElementsByTagName%28strTagName%29%3B%0A%09var%20arrReturnElements%20%3D%20new%20Array%28%29%3B%0A%09var%20arrRegExpClassNames%20%3D%20new%20Array%28%29%3B%0A%09if%28typeof%20oClassNames%20%3D%3D%20%22object%22%29%7B%0A%09%09for%28var%20i%3D0%3B%20i%3CoClassNames.length%3B%20i++%29%7B%0A%09%09%09arrRegExpClassNames.push%28new%20RegExp%28%22%28%5E%7C%5C%5Cs%29%22%20+%20oClassNames%5Bi%5D.replace%28/%5C-/g%2C%20%22%5C%5C-%22%29%20+%20%22%28%5C%5Cs%7C%24%29%22%29%29%3B%0A%09%09%7D%0A%09%7D%0A%09else%7B%0A%09%09arrRegExpClassNames.push%28new%20RegExp%28%22%28%5E%7C%5C%5Cs%29%22%20+%20oClassNames.replace%28/%5C-/g%2C%20%22%5C%5C-%22%29%20+%20%22%28%5C%5Cs%7C%24%29%22%29%29%3B%0A%09%7D%0A%09var%20oElement%3B%0A%09var%20bMatchesAll%3B%0A%09for%28var%20j%3D0%3B%20j%3CarrElements.length%3B%20j++%29%7B%0A%09%09oElement%20%3D%20arrElements%5Bj%5D%3B%0A%09%09bMatchesAll%20%3D%20true%3B%0A%09%09for%28var%20k%3D0%3B%20k%3CarrRegExpClassNames.length%3B%20k++%29%7B%0A%09%09%09if%28%21arrRegExpClassNames%5Bk%5D.test%28oElement.className%29%29%7B%0A%09%09%09%09bMatchesAll%20%3D%20false%3B%0A%09%09%09%09break%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%09if%28bMatchesAll%29%7B%0A%09%09%09arrReturnElements.push%28oElement%29%3B%0A%09%09%7D%0A%09%7D%0A%09return%20%28arrReturnElements%29%0A%7D%0A//%20---%0A//%20Array%20support%20for%20the%20push%20method%20in%20IE%205%0Aif%28typeof%20Array.prototype.push%20%21%3D%20%22function%22%29%7B%0A%09Array.prototype.push%20%3D%20ArrayPush%3B%0A%09function%20ArrayPush%28value%29%7B%0A%09%09this%5Bthis.length%5D%20%3D%20value%3B%0A%09%7D%0A%7D%0A//%20---%0A/*%0A%09Examples%20of%20how%20to%20call%20the%20function%3A%0A%09%0A%09To%20get%20all%20a%20elements%20in%20the%20document%20with%20a%20%22info-links%22%20class%3A%0A%20%20%20%20getElementsByClassName%28document%2C%20%22a%22%2C%20%22info-links%22%29%3B%0A%20%20%20%20%0A%09To%20get%20all%20div%20elements%20within%20the%20element%20named%20%22container%22%2C%20with%20a%20%22col%22%20and%20a%20%22left%22%20class%3A%0A%20%20%20%20getElementsByClassName%28document.getElementById%28%22container%22%29%2C%20%22div%22%2C%20%5B%22col%22%2C%20%22left%22%5D%29%3B%0A*/%0A//%20---%0A%0A//%20%7D%7D%7D%0A%0A//%20Standards-based%20Table%20of%20Contents%20dynamically%20created%20using%20w3C%20DOM%20%7B%7B%7B%0A//%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A//%20Source%3A%20http%3A//siteexperts.com/tips/contents/ts17/Demo.asp%0A//%0Afunction%20getTextForElement%28obj%29%20%7B%0A%20var%20str%3D%22%22%0A%20for%20%28var%20i%3D0%3Bi%20%3C%20obj.childNodes.length%3Bi++%29%20%7B%0A%20%20if%20%28obj.childNodes%5Bi%5D.nodeType%3D%3D1%29%0A%20%20%20str+%3DgetTextForElement%28obj.childNodes%5Bi%5D%29%0A%20%20else%20if%20%28obj.childNodes%5Bi%5D.nodeType%3D%3D3%29%0A%20%20%20str%20%3D%20obj.childNodes%5Bi%5D.data%0A%20%7D%0A%20return%20str%0A%7D%0A%0Afunction%20getHeaders%28root%29%20%7B%0A%20var%20obj%20%3D%20root.getElementsByTagName%28%22*%22%29%0A%20var%20el%20%3D%20document.createElement%28%22UL%22%29%0A%20var%20tagList%20%3D%20%22H1%3BH2%3BH3%3BH4%3BH5%3BH6%3B%22%0A%20for%20%28var%20i%3D0%3Bi%20%3C%20obj.length%3Bi++%29%0A%20%20if%20%28tagList.indexOf%28obj%5Bi%5D.tagName+%22%3B%22%29%3E%3D0%29%20%7B%0A%20%20%20var%20eLI%20%3D%20document.createElement%28%22LI%22%29%0A%20%20%20var%20eBookmark%20%3D%20document.createElement%28%22A%22%29%0A%20%20%20eBookmark.id%20%20%3D%20%22destHeader%22%20+i%0A%20%20%20var%20eALink%20%3D%20document.createElement%28%22A%22%29%0A%20%20%20eALink.href%20%3D%20%22%23%22%20+%20eBookmark.id%0A%20%20%20var%20eLIText%20%3D%20document.createTextNode%28getTextForElement%28obj%5Bi%5D%29%29%0A%20%20%20obj%5Bi%5D.appendChild%28eBookmark%29%0A%20%20%20eLI.className%3D%22toc%22%20+%20obj%5Bi%5D.tagName%0A%0A%20%20%20eALink.appendChild%28eLIText%29%20%20%0A%20%20%20eLI.appendChild%28eALink%29%0A%20%20%20el.appendChild%28eLI%29%0A%20%20%7D%0A%20return%20el%0A%7D%0A%0Afunction%20ie_getElementsByTagName%28str%29%20%7B%0A%20if%20%28str%3D%3D%22*%22%29%0A%20%20return%20document.all%0A%20else%0A%20%20return%20document.all.tags%28str%29%0A%7D%0A%0Aif%20%28document.all%29%0A%20document.getElementsByTagName%20%3D%20ie_getElementsByTagName%0A%0A//%20create_contents%28%29%20creates%20a%20table%20of%20contents%20based%20off%20headers%0A//%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20located%20within%20a%20given%20section%20of%20the%20document.%0A//%0A//%20root%20%5Bin/out%5D%20-%20An%20array%20of%20items%20from%20which%20to%20build%20the%20TOC.%20%20The%0A//%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20getElementsBy*%20functions%20will%20pass%20the%20appropriate%20%0A//%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20arguments.%0A//%0Afunction%20create_contents%28root%29%20%7B%0A%20var%20startEl%20%3D%20root%5B0%5D%3B%0A%20var%20el%20%3D%20getHeaders%28startEl%29%0A%20startEl.insertBefore%28el%2CstartEl.childNodes%5B0%5D%29%0A%7D%0A%0A//%20%7D%7D%7D%0A//%20vim%3A%20fdm%3Dmarker%0A%0Afunction%20do_toc%28%29%20%7B%0Acreate_contents%28getElementsByClassName%28document%2C%27*%27%2C%27post-body%27%29%29%3B%0A%7D%0A%0Afunction%20do_summarize%28%29%20%7B%0A%20%20%20%20%20%20%20%20var%20pattern%20%3D%20/%28http%3A%5C/%5C/.+%3F%5C.html%29/%3B%0A%20%20%20%20%20%20%20%20var%20post_titles%20%3D%20getElementsByClassName%28document%2C%27*%27%2C%27post-title%27%29%3B%0A%20%20%20%20%20%20%20%20var%20post_bodys%20%3D%20getElementsByClassName%28document%2C%27*%27%2C%27post-body%27%29%3B%0A%0A%20%20%20%20%20%20%20%20for%20%28var%20i%3D0%3B%20i%20%3C%20post_bodys.length%3B%20i++%29%20%7B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20summarize_regexp%20%3D%20new%20RegExp%28%22.%7B0%2C%22+summarize_length+%22%7D%5C%5Cb%22%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20post_bodys%5Bi%5D.innerHTML%20%3D%0A%20%20%20%20%20%20%20%20%20%20%20%20post_bodys%5Bi%5D.innerHTML.replace%28/%3C.+%3F%3E/g%2C%27%27%29.match%28summarize_regexp%29+%0A%20%20%20%20%20%20%20%20%20%20%20%20%22...%20%3Ca%20href%3D%22+post_titles%5Bi%5D.innerHTML.match%28pattern%29%5B1%5D+%22%3EMore...%3C/a%3E%22%3B%0A%20%20%20%20%20%20%20%20%7D%0A%7D%0A%3C/script%3E')); 
//--&amp;gt;
&amp;lt;/script&amp;gt;
    &lt;/textarea&gt;

    &lt;textarea&gt;
    Generated using the Widget Generator &lt;http://johnscomputerjournal.blogspot.com&gt;
    &lt;/textarea&gt;

    &lt;input type="button" name="go" title="Add Summarize and Table of Contents Widget" value="Add Summarize and Table of Contents Widget" src="http://www.blogger.com/img/add/add2blogger_sm_b.gif"/&gt;

&lt;/form&gt;



&lt;h4&gt;Limitations&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Since the summarize function removes HTML tags when summarizing, images and formatted text will not appear.  To ensure an image shows up for a post when its summarized, use an img tag within the title of the post.
&lt;li&gt;The summarize function will mess up google's beta translations.
&lt;li&gt;There will be a delay until the page has completely loaded before the summarize or toc functions load and display the results.  The delay can be fixed by ensuring the widget is placed after the posts and removing window.onload and just calling the  functions directly.
&lt;li&gt;The summarize function fails to engage when older posts are viewed through blogger's pagination.
&lt;/ul&gt;

&lt;h4&gt;References&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://siteexperts.com/tips/contents/ts17/Demo.asp"&gt;Standards Based TOC&lt;/a&gt;
&lt;li&gt;&lt;a href="http://www.robertnyman.com/2005/11/07/the-ultimate-getelementsbyclassname/"&gt;GetElementsByClassName&lt;/a&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6597645530249322915-3453609259320627706?l=johnscomputerjournal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnscomputerjournal.blogspot.com/feeds/3453609259320627706/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6597645530249322915&amp;postID=3453609259320627706&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6597645530249322915/posts/default/3453609259320627706'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6597645530249322915/posts/default/3453609259320627706'/><link rel='alternate' type='text/html' href='http://johnscomputerjournal.blogspot.com/2007/05/summarize-and-toc-blogger-widget.html' title='Summarize and TOC Blogger Widget'/><author><name>John</name><uri>http://www.blogger.com/profile/13568415846137179048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6597645530249322915.post-3449145219857550843</id><published>2007-05-27T19:50:00.000-06:00</published><updated>2007-05-29T00:44:23.965-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='scripting'/><category scheme='http://www.blogger.com/atom/ns#' term='blogger widget'/><title type='text'>Blogger Widget Generator</title><content type='html'>If you have a blogger widget you would like to share.  Fill in the forms below and click Generate! to build a web form that will allow others to easily add your widget to their own blog.

&lt;!--
\t  generates the form code so other people can add your widget to their sites
\t  Copyright (C) 2007 John Elkins
\t
\t  This program is free software; you can redistribute it and/or modify it
\t  under the terms of the GNU General Public License as published by the Free
\t  Software Foundation; either version 2 of the License, or (at your option)
\t  any later version.
\t
\t  This program is distributed in the hope that it will be useful, but
\t  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
\t  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
\t  for more details.
\t
\t  You should have received a copy of the GNU General Public License along
\t  with this program; if not, write to the Free Software Foundation, Inc., 51
\t  Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
\t
\t  John Elkins (JE) &lt;http://johnscomputerjournal.blogspot.com&gt;
\t
\t  Version 1
\t  ==========================================================================
\t  27 May 2007
\t
\t  (JE) TODO: add a selection for the add blogger icon
    (JE) FIXME: blogger really messes up scripts, so for now all scripts are
                escaped until they are read by the client.
--&gt;

&lt;script&gt;

function create_widget() {

    var title   = document.getElementsByName("title")[0].value;
    var infoURL = document.getElementsByName("infoURL")[0].value;
    var logoURL = document.getElementsByName("logoURL")[0].value;

    var content  = document.getElementsByName("content")[0].value;
    var template = document.getElementsByName("template")[0].value;

    var result_template = document.getElementsByName("result_template")[0].value;
        result_template = result_template.replace(/&lt;!--|--&gt;/g,'');
    var result_test     = document.getElementsByName("result_test")[0];
    
    var result   = document.getElementsByName("result")[0];

    //FIXME: blogger script choke workaround
    var content = content.replace(/&lt;script(.|\r?\n)*?&lt;\/script&gt;/gi,
        function($0) {return "&lt;script&gt;\n&lt;!--\n document.write(unescape('"+
                              escape($0)+"')); \n//--&gt;\n&lt;\/script&gt;";});

    content = content.replace(/&lt; script/g,'&lt;script');
    content = content.replace(/&lt;/g,'&amp;lt;');
    content = content.replace(/&gt;/g,'&amp;gt;');

    //FIXME: blogger script choke workaround
    var template = template.replace(/&lt;script(.|\r?\n)*?&lt;\/script&gt;/gi,
        function($0) {return "&lt;script&gt;\n document.write(unescape('"+
                              escape($0)+"')); \n&lt;\/script&gt;";});

    template = template.replace(/&lt; script/g,'&lt;script');
    template = template.replace(/&lt;/g,'&amp;lt;');
    template = template.replace(/&gt;/g,'&amp;gt;');

    result_template = result_template.replace(/%title%/g,title);
    result_template = result_template.replace(/%infoURL%/,infoURL);
    result_template = result_template.replace(/%logoURL%/,logoURL);
    result_template = result_template.replace(/%content%/,content);
    result_template = result_template.replace(/%template%/,template);

    document.getElementById('result_container').style.display = 'block';

    result_test.innerHTML = result_template;

    result.value = result_template;
    result.focus();
    result.select();

}

&lt;/script&gt;


&lt;style&gt;
    textarea {

        display:block;
        width:400px;
        height:150px;
    }
&lt;/style&gt;

&lt;form name="source"&gt;

&lt;h4&gt;Widget Information&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;widget.title&lt;/strong&gt; - (Optional) The title you specify will display in the user's Page Elements tab when they edit their layout. It will also be shown as part of the default widget template. The title can be up to 100 characters long, and may contain well-formed HTML.&lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;infoURL&lt;/strong&gt; - (Optional) You can use this to specify a page on your site that describes your widget or gives other information about it. It will be used as a "more info" link on the setup page people see when adding your widget.&lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;logoURL&lt;/strong&gt; - (Optional) You can add an image URL here, and the image will be displayed next to the "more info" link. It should be thumbnail sized (i.e. less than 100x100 pixels). &lt;/li&gt;
&lt;/ul&gt;
&lt;input name="title"   type="text" value="&lt;!--Widget Title--&gt;" maxlength="100" style="width:400px;" onclick="this.select();"&gt;&lt;br&gt;
&lt;input name="infoURL" type="text" value="&lt;!--infoURL--&gt;" style="width:200px;" onclick="this.select();"&gt;
&lt;input name="logoURL" type="text" value="&lt;!--logoURL--&gt;" style="width:200px;" onclick="this.select();"&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;widget.content&lt;/strong&gt; - (Required) This is the actual content of your widget, which will be displayed on the user's blog. It can include almost any well-formed code that you want, except for &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt; tags. The widget generator will escape all &amp;gt;'s and &amp;lt;'s and &lt;b&gt;encode scripts&lt;/b&gt;.
&lt;p&gt;Script encoding is a work around that will keep blogger from choking on scripts during form transfer.  To disable script encoding, put a space before the script keyword in the script tag; for example: &lt;code&gt;&amp;lt; script&amp;gt;&lt;/code&gt; will disable script encoding, &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; will enable script encoding&lt;/li&gt;
&lt;/ul&gt;
&lt;textarea name="content"&gt;
&lt;/textarea&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;widget.template&lt;/strong&gt; - (Optional) This should follow the &lt;a href="http://help.blogger.com/bin/answer.py?answer=46995"&gt;widget tag guidelines&lt;/a&gt;. You can also use any of the &lt;a href="http://help.blogger.com/bin/answer.py?answer=47270#global"&gt;globally available data tags&lt;/a&gt;. If no template is specified, it uses &lt;code&gt;&amp;lt;data:title/&amp;gt; &amp;lt;data:content/&amp;gt;&lt;/code&gt; as a default. The template is also escaped and script encoded (see widget.content above).&lt;/li&gt;
&lt;/ul&gt;
&lt;textarea name="template"&gt;
&lt;b:includable id='main'&gt;
  &lt;!-- only display title if it's non-empty --&gt;
  &lt;b:if cond='data:title != ""'&gt;
    &lt;h2 class='title'&gt;&lt;data:title/&gt;&lt;/h2&gt;
  &lt;/b:if&gt;
  &lt;div class='widget-content'&gt;
    &lt;data:content/&gt;
  &lt;/div&gt;

  &lt;b:include name='quickedit'/&gt;
&lt;/b:includable&gt;
&lt;/textarea&gt;

&lt;!-- the below style could be achieved using display:none; however blogger does
\t   not allow this attribute and removes it from all posts
\t   --&gt;
&lt;style&gt;.display_none {height:0px;width:0px;border:0px;}&lt;/style&gt;
&lt;textarea name="result_template" class="display_none"&gt;
&lt;!--
&lt;style&gt;.add-widget textarea{height:0px;width:0px;border:0px;}&lt;/style&gt;
&lt;form class="add-widget" method="POST" action="http://www.blogger.com/add-widget"&gt;

    &lt;textarea name="widget.title"&gt;
    %title%
    &lt;/textarea&gt;

    &lt;textarea name="infoUrl"&gt;
    %infoURL%
    &lt;/textarea&gt;

    &lt;textarea name="logoUrl"&gt;
    %logoURL%
    &lt;/textarea&gt;    

    &lt;textarea name="widget.template"&gt;
    %template%
    &lt;/textarea&gt;

    &lt;textarea name="widget.content"&gt;
    %content%
    &lt;/textarea&gt;

    &lt;textarea&gt;
    Generated using the Widget Generator &lt;http://johnscomputerjournal.blogspot.com&gt;
    &lt;/textarea&gt;

    &lt;input type="image" name="go" title="Add %title% Widget" value="Add %title% Widget" src="http://www.blogger.com/img/add/add2blogger_sm_b.gif"/&gt;

&lt;/form&gt;
--&gt;
&lt;/textarea&gt;

&lt;input name="go" type="button" value="Generate!" onclick="create_widget();"&gt;

&lt;/form&gt;

&lt;div id="result_container" style="display:none;"&gt;

&lt;h4&gt;Generated Widget&lt;/h4&gt;

&lt;h5&gt;Test&lt;/h5&gt;
Test the code to see if it does what you want.
&lt;div name="result_test"&gt;&lt;/div&gt;

&lt;h5&gt;Code&lt;/h5&gt;
Copy and paste the following code someplace onto your site so others can add your widget to their own blog.
&lt;textarea name="result"&gt;
&lt;/textarea&gt;

&lt;/div&gt;

&lt;h4&gt;Reference&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://help.blogger.com/bin/answer.py?answer=53219"&gt;Blogger Help: How do I create new widgets for other people to add to their layouts?&lt;/a&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6597645530249322915-3449145219857550843?l=johnscomputerjournal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnscomputerjournal.blogspot.com/feeds/3449145219857550843/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6597645530249322915&amp;postID=3449145219857550843&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6597645530249322915/posts/default/3449145219857550843'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6597645530249322915/posts/default/3449145219857550843'/><link rel='alternate' type='text/html' href='http://johnscomputerjournal.blogspot.com/2007/05/if-you-have-widget-you-would-like-other.html' title='Blogger Widget Generator'/><author><name>John</name><uri>http://www.blogger.com/profile/13568415846137179048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6597645530249322915.post-9044991087832124652</id><published>2007-05-19T20:18:00.000-06:00</published><updated>2007-05-27T23:45:46.332-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='batch'/><category scheme='http://www.blogger.com/atom/ns#' term='scripting'/><title type='text'>Batch function library loader</title><content type='html'>&lt;p&gt;I've put together a few functions that I find useful when doing batch scripting. I've attached the library of functions bellow. Included in the library are functions for multi-line out, file-prepending, and unsetting environment variables. &lt;/p&gt;   

&lt;h4&gt;Syntax  &lt;/h4&gt;
&lt;pre&gt;
call function :[function_name] [function_parameters]

[function_name]       - name of the function.
[function_parameters] - arguments to pass to the function.
&lt;/pre&gt;

&lt;p&gt;Read the function documentation within the function.bat file for further information on variables specific to each function. Examples of each function included with the attached file are provided below. &lt;/p&gt;

&lt;h4&gt;Examples  &lt;/h4&gt;
&lt;h5&gt;unset  &lt;/h5&gt;
&lt;pre&gt;
call function :unset path temp tmp username
&lt;/pre&gt;
&lt;p&gt;The above example executes the function unset with the parameters: path, temp, tmp, and username. After executing the unset function each of the environment variables path, temp, tmp, and username will no longer exist. &lt;/p&gt;

&lt;h5&gt;prepend  &lt;/h5&gt;
&lt;pre&gt;
call function :prepend history 1st I did this
call function :prepend history 2nd I did this
&lt;/pre&gt;

&lt;p&gt;The above example executes the function prepend twice with two parameters: history and a string. After executing the prepend function the file named history will have the line: "2nd I did this" (without the quotes) as the first line of the file and the line: "1st I did this" (without the quotes) as the second line of the file. &lt;/p&gt;   

&lt;h5&gt;out  &lt;/h5&gt;
&lt;pre&gt;
goto output

Hello %username%,
Do you know the ^%TIME^%?

:output

call function :out %0 output  
&lt;/pre&gt;

&lt;p&gt;The above example builds a multi-line output and executes the function out with two parameters: the current filename and the target output. Notice the % symbols are escaped for TIME to prevent out from expanding the %TIME% variable. After executing the out function the following will appear on the display: &lt;/p&gt;

&lt;pre&gt;

Hello John,
Do you know the %TIME%? 

&lt;/pre&gt;

&lt;p&gt;Note: the results of the out function can also be redirected to a file by appending the &gt; operator.  &lt;/p&gt;   

&lt;h4&gt;Adding Functions  &lt;/h4&gt; 

&lt;p&gt;New functions can be added to the function library by adding a label and goto :EOF pair where the label is the name of the new function. For example the following code will add the hello function which will simply display Hello %1 where %1 is the first argument passed to hello. &lt;/p&gt;

&lt;pre&gt;
:hello
    echo Hello %1
goto :EOF
&lt;/pre&gt;

&lt;p&gt;After adding the above code to the function.bat file and typing:  &lt;/p&gt;

&lt;pre&gt;
call function :hello World!
call function :hello %username%!
&lt;/pre&gt;

&lt;p&gt;will display:  &lt;/p&gt;

&lt;pre&gt;
Hello World!
Hello John!
&lt;/pre&gt;

A good collection of functions ready to be copied and pasted directly into the function file can be found at Ritchie Lawrence's &lt;a href="http://www.commandline.co.uk/lib/treeview/index.php"&gt;Batch Function Library&lt;/a&gt;.

&lt;h4&gt;Download&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://www.geocities.com/soulfx/function.zip" name="download"&gt;function.bat&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6597645530249322915-9044991087832124652?l=johnscomputerjournal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnscomputerjournal.blogspot.com/feeds/9044991087832124652/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6597645530249322915&amp;postID=9044991087832124652&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6597645530249322915/posts/default/9044991087832124652'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6597645530249322915/posts/default/9044991087832124652'/><link rel='alternate' type='text/html' href='http://johnscomputerjournal.blogspot.com/2007/05/batch-function-library.html' title='Batch function library loader'/><author><name>John</name><uri>http://www.blogger.com/profile/13568415846137179048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6597645530249322915.post-3314360844062795753</id><published>2007-05-03T05:24:00.000-06:00</published><updated>2007-05-28T00:53:34.735-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='compatability'/><category scheme='http://www.blogger.com/atom/ns#' term='vista'/><title type='text'>Clearlooks for Windows GTK+</title><content type='html'>&lt;p&gt;The Clearlooks theme engine for GTK+ is a great alternative to the wimp theme engine.  Because Vista introduces some bugs into the wimp engine, I've taken a look at compiling Clearlooks for use on Windows.  MinGW compiles Clearlook's code without any problems on Vista.

&lt;p&gt;For those who don't have the GTK+ toolchain setup I've attached the binary compilation of Clearlooks 0.6.2 for windows.  I've packed the binaries into an Installer that should put everything into the correct location.  If the installer doesn't work like it should, just unzip the executable and copy all the files within the Files directory into the root of the GTK 2.0 directory.

&lt;p&gt;The Installer creates a backup of the current GTK+ theme configuration, so upon uninstalling the Clearlooks theme GTK+ will switch back to the previous configuration.  Any GTK+ applications will have to be restarted before theme changes take place.
&lt;h4&gt;Download&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.geocities.com/soulfx/ClearLooks-Win32.zip"&gt;ClearLooks-Win32.zip&lt;/a&gt;
&lt;/li&gt;&lt;/ul&gt;

&lt;h4&gt;References&lt;/h4&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://clearlooks.sourceforge.net/"&gt;Clearlooks&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6597645530249322915-3314360844062795753?l=johnscomputerjournal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnscomputerjournal.blogspot.com/feeds/3314360844062795753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6597645530249322915&amp;postID=3314360844062795753&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6597645530249322915/posts/default/3314360844062795753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6597645530249322915/posts/default/3314360844062795753'/><link rel='alternate' type='text/html' href='http://johnscomputerjournal.blogspot.com/2007/05/clearlooks-for-windows-gtk.html' title='Clearlooks for Windows GTK+'/><author><name>John</name><uri>http://www.blogger.com/profile/13568415846137179048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6597645530249322915.post-1308430791736021271</id><published>2007-05-01T19:14:00.000-06:00</published><updated>2007-05-20T02:03:33.517-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vista'/><title type='text'>Single Processor Mode in Vista</title><content type='html'>Vista doesn't use boot.ini to configure the boot loader.  Instead it uses bcdedit.exe and msconfig.exe  To create a new boot entry that loads Vista in single processor mode follow the following steps:
&lt;ol&gt;&lt;li&gt;Open cmd in administrator mode (press the windows key, type cmd, and press ctrl+shift+enter)&lt;/li&gt;&lt;li&gt;Type the command:

&lt;span style="font-weight: bold;font-family:courier new;" &gt;bcdedit /copy {current} /d "Vista Single Processor"&lt;/span&gt;

&lt;span style="font-size:85%;"&gt;The command will return something like the following, but with a different number between the {}'s

&lt;/span&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;The entry was successfully copied to {68602c25-5097-11da-99de-000802209f1b}.

&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Type the following command and replace the portion that says &lt;span style="font-weight: bold;"&gt;ID&lt;/span&gt; with the number returned from the previous command.

&lt;span style="font-weight: bold;font-family:courier new;" &gt;bcdedit /displayorder {ID} /addlast&lt;/span&gt;

&lt;/li&gt;&lt;li&gt;Now type &lt;span style="font-weight: bold;font-family:courier new;" &gt;msconfig&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;Click the boot tab and check mark the &lt;span style="font-weight: bold;font-family:courier new;" &gt;Make all boot settings permanent box&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;Select the Vista Single Processor entry and the click advanced options button.&lt;/li&gt;&lt;li&gt;Put a check next to &lt;span style="font-weight: bold;font-family:courier new;" &gt;Number of processors&lt;/span&gt;, select 1, and then put a check next to &lt;span style="font-weight: bold;font-family:courier new;" &gt;Detect HAL&lt;/span&gt;. Click OK.&lt;/li&gt;&lt;li&gt;Set the Timeout value to something like 3 secs.  Click OK, click Yes, and Restart.&lt;/li&gt;&lt;li&gt;Select the Vista Single Processor Entry from the boot menu to boot Vista with one processor.
&lt;/li&gt;&lt;/ol&gt;
&lt;span style="font-weight: bold;"&gt;References&lt;/span&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/whdc/driver/tips/Debug_Vista.mspx"&gt;Debugging Windows Vista&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/windowsvista/aa905126.aspx"&gt;Boot Configuration Data Editor Frequently Asked Questions&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6597645530249322915-1308430791736021271?l=johnscomputerjournal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnscomputerjournal.blogspot.com/feeds/1308430791736021271/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6597645530249322915&amp;postID=1308430791736021271&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6597645530249322915/posts/default/1308430791736021271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6597645530249322915/posts/default/1308430791736021271'/><link rel='alternate' type='text/html' href='http://johnscomputerjournal.blogspot.com/2007/05/single-processor-mode-in-vista.html' title='Single Processor Mode in Vista'/><author><name>John</name><uri>http://www.blogger.com/profile/13568415846137179048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6597645530249322915.post-7440849879914844685</id><published>2007-05-01T16:23:00.000-06:00</published><updated>2007-05-29T02:05:07.895-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='compatability'/><category scheme='http://www.blogger.com/atom/ns#' term='vista'/><title type='text'>VLC on Vista</title><content type='html'>Vista's Aero interface messes with VLC's ability to playback some videos on default settings.  The video settings must be changed manually to DirectX video output.  In VLC:
&lt;ol&gt;&lt;li&gt;Select the &lt;span style="font-weight: bold;font-family:courier new;" &gt;Settings -&gt; Preferences&lt;/span&gt; menu.&lt;/li&gt;&lt;li&gt;Expand the &lt;span style="font-weight: bold;font-family:courier new;" &gt;Video&lt;/span&gt; Section (click the plus next to video) and select &lt;span style="font-weight: bold;font-family:courier new;" &gt;Output modules&lt;/span&gt;
&lt;/li&gt;&lt;li&gt;Check the &lt;span style="font-weight: bold;font-family:courier new;" &gt;Advanced options&lt;/span&gt; box and select &lt;span style="font-weight: bold;font-family:courier new;" &gt;DirectX video output&lt;/span&gt;.
&lt;/li&gt;&lt;li&gt;Click Save and restart VLC.&lt;/li&gt;&lt;/ol&gt;Unfortunately, setting the output to DirectX will cause windows to disable Aero when playing back videos.  The Windows GDI setting will avoid this, but won't have the hardware acceleration of DirectX and can't select menu items on DVDs.  DirectX 3D will work for DVDs, but only for certain videos.
&lt;h4&gt;References&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://computerbits.wordpress.com/2007/01/25/vlc-media-player-problem-under-vista/"&gt;VLC Media Player Problem under Vista&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6597645530249322915-7440849879914844685?l=johnscomputerjournal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnscomputerjournal.blogspot.com/feeds/7440849879914844685/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6597645530249322915&amp;postID=7440849879914844685&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6597645530249322915/posts/default/7440849879914844685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6597645530249322915/posts/default/7440849879914844685'/><link rel='alternate' type='text/html' href='http://johnscomputerjournal.blogspot.com/2007/05/vlc-on-vista.html' title='VLC on Vista'/><author><name>John</name><uri>http://www.blogger.com/profile/13568415846137179048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6597645530249322915.post-703056536114559111</id><published>2007-04-25T00:32:00.000-06:00</published><updated>2007-05-28T00:03:49.080-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vista'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>MinGW and mSYS on Vista</title><content type='html'>&lt;p&gt;MinGW doesn't work well on Vista without adding some extra environment variables. The following environment variables will allow gcc to find its sub programs, the standard include paths and libraries when linking.
&lt;/p&gt;
 
&lt;h4&gt;MinGW Variables&lt;/h4&gt;

&lt;pre&gt;
GCC_EXEC_PREFIX=c:\mingw
PATH=%GCC_EXEC_PREFIX%\libexec\gcc\mingw32\3.4.2;%PATH%
PATH=c:\mingw\bin;%PATH%
&lt;/pre&gt;

&lt;span style="font-style: italic;"&gt;MinGW &lt;/span&gt;&lt;b style="font-style: italic;"&gt;must&lt;/b&gt;&lt;span style="font-style: italic;"&gt; be installed to the root directory. For example&lt;/span&gt;&lt;span style="font-style: italic; font-family: courier new;"&gt; &lt;/span&gt;&lt;span style="font-style: italic; font-family: courier new;"&gt;c:\tools\mingw &lt;/span&gt;&lt;span style="font-style: italic;"&gt;will not work. It must be &lt;/span&gt;&lt;span style="font-style: italic; font-family: courier new;"&gt;c:\mingw&lt;/span&gt;&lt;span style="font-style: italic;"&gt;.&lt;/span&gt;

&lt;h4&gt;mSYS Variables&lt;/h4&gt;
&lt;pre&gt;
PATH=c:\msys\1.0\bin;%PATH%
HOME=%HOMEPATH%
&lt;/pre&gt;
Vista will force a User Access Control (UAC) message to elevate privileges whenever it detects a program with the words setup, install, or patch in the filename or description. However when a program is run from the command line, Vista will not bring up the (UAC) message and just deny access to the executable. To get around the problem &lt;span style="font-weight: bold;"&gt;make sure to work with elevated privileges when performing a &lt;/span&gt;&lt;span style="font-weight: bold; font-family: courier new;"&gt;make install&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;  or when patching.&lt;/span&gt;

&lt;h4&gt;Refferences&lt;/h4&gt;
&lt;ul&gt;&lt;li&gt;Giles, Aaron. "&lt;a title="Permanent Link: Solving the Windows Vista Build Issues" href="http://aarongiles.com/?p=199" rel="bookmark"&gt;Solving the Windows Vista Build Issues&lt;/a&gt;."&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6597645530249322915-703056536114559111?l=johnscomputerjournal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnscomputerjournal.blogspot.com/feeds/703056536114559111/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6597645530249322915&amp;postID=703056536114559111&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6597645530249322915/posts/default/703056536114559111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6597645530249322915/posts/default/703056536114559111'/><link rel='alternate' type='text/html' href='http://johnscomputerjournal.blogspot.com/2007/04/mingw-on-vista.html' title='MinGW and mSYS on Vista'/><author><name>John</name><uri>http://www.blogger.com/profile/13568415846137179048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6597645530249322915.post-1044313425678758683</id><published>2007-04-23T00:54:00.000-06:00</published><updated>2007-05-28T00:00:09.570-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='batch'/><category scheme='http://www.blogger.com/atom/ns#' term='scripting'/><title type='text'>Simple Batch script Program Installer</title><content type='html'>The following batch script will install a program into the Program Files directory on the computer. The batch script will create and register an uninstaller, and create a shortcut in the Start Menu. To uninstall the program simply click the program's entry in the "Add / Remove Programs" control panel.

&lt;h4&gt;Usage&lt;/h4&gt;
Pass the script the name of a directory containing an executable.  The script assumes the directory and executable have similar names.  If the names don't match, rename either the directory or the executable.

&lt;h4&gt;Requirements&lt;/h4&gt;
The batch script will run on any Windows operating system. I have tested the batch script on Vista. Windows XP and 2000 should also work.  To run the script on Windows 9x modify the startMenu variable to point to Windows 9x's start menu location.

&lt;h4&gt;Why?&lt;/h4&gt;
Some programs don't have installers.  Sometimes I'll put a program someplace and forget I have it because it doesn't show up in the start menu or in the "Add / Remove Programs" control panel.

&lt;h4&gt;Download&lt;/h4&gt;
&lt;a href="http://www.geocities.com/soulfx/quickInstall.zip"&gt;quickInstall.bat&lt;/a&gt;
&lt;iframe width=95% src="http://www.geocities.com/soulfx/quickInstall.html"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6597645530249322915-1044313425678758683?l=johnscomputerjournal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnscomputerjournal.blogspot.com/feeds/1044313425678758683/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6597645530249322915&amp;postID=1044313425678758683&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6597645530249322915/posts/default/1044313425678758683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6597645530249322915/posts/default/1044313425678758683'/><link rel='alternate' type='text/html' href='http://johnscomputerjournal.blogspot.com/2007/04/simple-batch-script-installer.html' title='Simple Batch script Program Installer'/><author><name>John</name><uri>http://www.blogger.com/profile/13568415846137179048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6597645530249322915.post-288120503126731454</id><published>2007-04-22T05:14:00.000-06:00</published><updated>2007-07-26T19:53:10.100-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vista'/><title type='text'>sudo for Vista's User Access Control (UAC)</title><content type='html'>&lt;p&gt;By setting a SHELLEXECUTEINFO's lpVerb value to "runas" a call to ShellExecuteEx will cause the UAC to elevate the run privileges for a given program.  The concept can be implemented into a simple program so that a behavior similar to linux's sudo command can be achieved.&lt;/p&gt;

&lt;h4&gt;Methods of Implementation&lt;/h4&gt;
&lt;p&gt;
The ShellExecuteEx runas method can be implemented by any method that interfaces with the ShellExecuteEx API.  The code provided below for download was written using c++.  Within a visual basic script the ShellExecute function of the Shell.Application object can be used to invoke runas.
&lt;/p&gt;

&lt;p&gt;
The command line tool `runas' provides similar functionality.  However, the `runas' command is different enough that it can be confusing for users to use in Vista.  The obvious difference is the command line vs. the graphical interface.  Other differences include the inability for the `runas' command to accept empty passwords and recognize when the user already has elevated permissions.
&lt;/p&gt;

&lt;h4&gt;Issues&lt;/h4&gt;

&lt;h5&gt;Directory Change&lt;/h5&gt;
&lt;p&gt;When the runas verb is passed to ShellExecuteEx the current directory always gets reset to the %systemroot%/system32 directory.  The lpDirectory variable has no effect.  Therefore, to maintain the correct directory the directory must become part of the command that ShellExecuteEx runs.  By wrapping the command to execute using runas within a &lt;code&gt;%comspec% /c cd /d "directory" start /d "directory"&lt;/code&gt; call the correct directory is used when the command or file is executed.  &lt;/p&gt;

&lt;h5&gt;User Context&lt;/h5&gt;
&lt;p&gt;
The ShellExecuteEx runas method suffers from the same user context problems that haunt the command line tool `runas'.  The context switch can cause problems for programs that access user specific areas and variables such as the username, home directory, desktop, or registry.  For example, if an installation program is launched through `runas' by a non-administrative user an option such as "create desktop shortcut for local user" will create the shortcut on the administrators desktop NOT the desktop of the user that initialized the installation through the runas command.
&lt;/p&gt;

&lt;p&gt;There is a workaround to the context problem that would require the user to provide an administrative username and password and then provide their own non-administrative username and password.  Aaron Margosis introduced the concept in his "Non-Admin" WebLog where he introduced his &lt;a href="http://blogs.msdn.com/aaron_margosis/archive/2005/03/11/394244.aspx"&gt;MakeMeAdmin&lt;/a&gt; batch script.&lt;/p&gt;


&lt;h4&gt;Download&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.geocities.com/soulfx/addo/addo.zip"&gt;addo.zip&lt;/a&gt; - Binary and Source (40.7 KB)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.geocities.com/soulfx/addo/Readme.txt"&gt;Readme.txt&lt;/a&gt; - Usage and Examples&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;References &lt;/h4&gt;
TweakUAC has a package of functions to handle UAC events. The &lt;a href="http://www.tweak-uac.com/programming/vista-tools/"&gt;VistaTools.cxx &lt;/a&gt;package clued me into setting the lpVerb to "runas".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6597645530249322915-288120503126731454?l=johnscomputerjournal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnscomputerjournal.blogspot.com/feeds/288120503126731454/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6597645530249322915&amp;postID=288120503126731454&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6597645530249322915/posts/default/288120503126731454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6597645530249322915/posts/default/288120503126731454'/><link rel='alternate' type='text/html' href='http://johnscomputerjournal.blogspot.com/2007/04/sudo-for-vistas-user-access-control-uac.html' title='sudo for Vista&apos;s User Access Control (UAC)'/><author><name>John</name><uri>http://www.blogger.com/profile/13568415846137179048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6597645530249322915.post-4668709756952176543</id><published>2007-04-20T23:56:00.000-06:00</published><updated>2007-05-27T23:51:28.593-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='batch'/><category scheme='http://www.blogger.com/atom/ns#' term='scripting'/><title type='text'>Nested Environment Variables</title><content type='html'>&lt;p&gt;The following workaround example shows how to nest environment variables inside of each other in a batch file. The nested variables can be used for specifying sub-string indices or replacements dynamically during runtime.&lt;/p&gt;  &lt;p&gt;For example to remove the current directory from the path environment variable:&lt;/p&gt; &lt;pre&gt;set path=%PATH:%CD%=%
&lt;/pre&gt; &lt;p&gt;does &lt;strong&gt;not&lt;/strong&gt; work.  However, the following code:
&lt;/p&gt; &lt;pre&gt;for /f "delims=" %%i in ('echo %%PATH:%CD%^=%%') do set path=%%i
&lt;/pre&gt; &lt;p&gt;will work fine.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;References
&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;Veli-Pekka Tätilä's &lt;a href="http://www.student.oulu.fi/%7Evtatila/batch_tutorial.html"&gt;A Modern Batch Programming Tutorial &lt;/a&gt;introduced the problem.&lt;/li&gt;&lt;li&gt;Mac's hint in &lt;a href="http://www.differentpla.net/content/2004/05/getting-hold-of-the-current-directory-in-a-batch-file"&gt;Getting hold of the current directory in a batch file&lt;/a&gt; clued me into the technique.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6597645530249322915-4668709756952176543?l=johnscomputerjournal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnscomputerjournal.blogspot.com/feeds/4668709756952176543/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6597645530249322915&amp;postID=4668709756952176543&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6597645530249322915/posts/default/4668709756952176543'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6597645530249322915/posts/default/4668709756952176543'/><link rel='alternate' type='text/html' href='http://johnscomputerjournal.blogspot.com/2007/04/nested-environment-variables.html' title='Nested Environment Variables'/><author><name>John</name><uri>http://www.blogger.com/profile/13568415846137179048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6597645530249322915.post-268335139608104675</id><published>2007-04-20T01:16:00.000-06:00</published><updated>2007-05-27T23:54:49.178-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='batch'/><category scheme='http://www.blogger.com/atom/ns#' term='scripting'/><title type='text'>Change the System Path from CMD</title><content type='html'>The batch file provided below will change the system path from the command line. Pass the batch script a directory and it will add it to the system path. If the directory is already in the path it will remove it.

&lt;h4&gt;System Requirements&lt;/h4&gt;
The script runs on any MS Windows OS that has uses the registry to store the system path. Windows NT, 2000, XP, and Vista all store the system path in the registry. For windows Vista the script will need to be run as an Administrator.

&lt;p&gt;For information on how to run a batch file as an Administrator in Vista check out:
&lt;a href="http://www.vistaclues.com/run-a-batch-file-as-an-administrator/"&gt;http://www.vistaclues.com/run-a-batch-file-as-an-administrator/&lt;/a&gt;

&lt;h4&gt;Why?&lt;/h4&gt;
Having important executables in the path can make command line work easier. Some applications that have been ported from the Linux environment are easier to work with if the system paths are setup correctly. Developers and administrators may find this script helpful.

&lt;h4&gt;Limitations&lt;/h4&gt;
After updating the path the system does not refresh the current path variable to reflect the change.  The system must be manually refreshed.

&lt;h4&gt;References&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;For those using Windows 95 or those who wish to check out a similar program can check out Modify Path: &lt;a href="http://legroom.net/software/modpath"&gt;http://legroom.net/software/modpath&lt;/a&gt;
&lt;/ul&gt;

&lt;h4&gt;Download&lt;/h4&gt;
&lt;a href="http://www.geocities.com/soulfx/UpdatePath.zip"&gt;UpdatePath&lt;/a&gt;
&lt;iframe src="http://www.geocities.com/soulfx/UpdatePath.html" width="95%"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6597645530249322915-268335139608104675?l=johnscomputerjournal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnscomputerjournal.blogspot.com/feeds/268335139608104675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6597645530249322915&amp;postID=268335139608104675&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6597645530249322915/posts/default/268335139608104675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6597645530249322915/posts/default/268335139608104675'/><link rel='alternate' type='text/html' href='http://johnscomputerjournal.blogspot.com/2007/04/change-system-path-from-cmd.html' title='Change the System Path from CMD'/><author><name>John</name><uri>http://www.blogger.com/profile/13568415846137179048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6597645530249322915.post-4369042836232787130</id><published>2007-04-03T03:51:00.000-06:00</published><updated>2007-05-27T23:11:54.411-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='compatability'/><category scheme='http://www.blogger.com/atom/ns#' term='vista'/><title type='text'>MyHD on Vista</title><content type='html'>I am currently running a MyHD 100 card on Windows Vista without disabling the security features in Vista. The following is a list of steps and hints that can serve as a guide and reference.

&lt;h4&gt;Installation&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Download the latest driver. The latest driver can be found either on &lt;a href="http://www.digitalconnection.com/Support/cn_myhd_15.asp"&gt;Digital Connection&lt;/a&gt; or on the &lt;a href="http://www.avsforum.com/avs-vb/showthread.php?p=7176218&amp;&amp;amp;#post7176218"&gt;AVS Forum&lt;/a&gt;.
&lt;li&gt;Install the driver using Windows XP compatibility mode.
&lt;li&gt;Set both the MyIRC and MyHD executables to run in Windows XP compatibility mode and as an administrator.
&lt;/ol&gt;
&lt;h4&gt;Annoyances&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;The MyIRC executable must be explicitly allowed to run every time the computer starts.
&lt;li&gt;Time Shifting must be manually enabled.  See the issue below.
&lt;/ul&gt;
&lt;h4&gt;Issues&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Do not enable "Full Time Shift." Enabling the Full Time Shift function will cause either an error message or a massive memory leak. &lt;/li&gt;
&lt;li&gt;The drivers (1.66.1) I used do not properly support hibernate and suspend in Vista. Make sure to not use suspend or hibernate or the system will blue screen and reboot. Disable suspend in the power control panel. &lt;/li&gt;&lt;li&gt;Some functionality may not work as expected. It has been noted both on &lt;a href="http://www.digitalconnection.com/Support/cn_myhd_1.asp"&gt;Digital Connection's MyHD FAQ&lt;/a&gt; and the &lt;a href="http://www.avsforum.com/avs-vb/showthread.php?p=7176592&amp;&amp;amp;#post7176592"&gt;MyHD FAQ on the AVS Forum&lt;/a&gt; that the DVD player and other functionality is disabled by the myHD program with Dual-Processor (DP)/HyperThreading (HT) (no matter what OS). The FAQ on the AVS Forum suggests disabling a processor/core or hyperthreading from either the bios or Windows boot.ini.

Simply setting the process affinity will not work because the MyHD program specifically checks if the processor is DP or HT enabled.  It may be possible to hack the binary to disable the DP and HT checking.&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6597645530249322915-4369042836232787130?l=johnscomputerjournal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnscomputerjournal.blogspot.com/feeds/4369042836232787130/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6597645530249322915&amp;postID=4369042836232787130&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6597645530249322915/posts/default/4369042836232787130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6597645530249322915/posts/default/4369042836232787130'/><link rel='alternate' type='text/html' href='http://johnscomputerjournal.blogspot.com/2007/04/myhd-on-vista.html' title='MyHD on Vista'/><author><name>John</name><uri>http://www.blogger.com/profile/13568415846137179048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6597645530249322915.post-9125219537743182486</id><published>2007-03-03T14:44:00.000-06:00</published><updated>2007-05-27T23:08:24.113-06:00</updated><title type='text'>Program Categories</title><content type='html'>&lt;p&gt;The programs in the applications menu (start menu) can be organized into a standard arrangement that can reduce the effort needed to locate programs and related application files.&lt;/p&gt;

&lt;p&gt;Freedesktop.org maintains a suggested standard for application categories. The latest can be found at &lt;&lt;a href="http://standards.freedesktop.org/menu-spec/latest/apa.html"&gt;http://standards.freedesktop.org/menu-spec/latest/apa.html&lt;/a&gt;&gt;&lt;/p&gt;

&lt;p&gt;The application categories I use are:&lt;/p&gt;

&lt;pre&gt;
Accessories (Utilities)
-----------------------
Development
-----------
Games
-----
Graphics
--------
Multimedia (Sound &amp; Video, Audio &amp;amp; Video)
------------------------------------------
Network (Internet)
------------------
Office
------
Startup
-------
System (System Tools)
---------------------
&lt;/pre&gt;

&lt;p&gt;The preceding list was developed by comparing KDE and GNOME application categories present in default installations of Ubuntu, SUSE, and Mandriva distributions. The list contains common elements found within the distributions and the freedesktop standard.&lt;/p&gt;

&lt;p&gt;&lt;span style="font-style: italic;"&gt;Side Note:&lt;/span&gt;
Recent application launchers now allow instant searching for a desired application which may supersede the need to keep an organized application launch structure. Users of Windows XP also can obtain the instant application search and launch functionality through the use of third party tools such as Google Desktop and Launchy.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6597645530249322915-9125219537743182486?l=johnscomputerjournal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnscomputerjournal.blogspot.com/feeds/9125219537743182486/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6597645530249322915&amp;postID=9125219537743182486&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6597645530249322915/posts/default/9125219537743182486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6597645530249322915/posts/default/9125219537743182486'/><link rel='alternate' type='text/html' href='http://johnscomputerjournal.blogspot.com/2007/03/program-categories.html' title='Program Categories'/><author><name>John</name><uri>http://www.blogger.com/profile/13568415846137179048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6597645530249322915.post-3993383722479024190</id><published>2007-02-15T15:12:00.002-06:00</published><updated>2008-04-11T14:16:44.308-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='scripting'/><title type='text'>Portable GVIM with Cream</title><content type='html'>The following steps can be taken to create a portable GVIM with the Cream configuration.&lt;h4&gt;Download&lt;/h4&gt;&lt;ul&gt;  &lt;li&gt;Portable GVIM from &lt;a href="http://portablegvim.sourceforge.net/"&gt;http://portablegvim.sourceforge.net/&lt;/a&gt;  &lt;/li&gt;  &lt;li&gt;&lt;span style="font-weight: bold;"&gt;cream source&lt;/span&gt; from &lt;a href="http://cream.sourceforge.net/download.html"&gt;http://cream.sourceforge.net/download.html&lt;/a&gt;  &lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;Setup&lt;/h4&gt;&lt;ol&gt;  &lt;li&gt;Extract the GVIM portable into a folder.&lt;/li&gt;  &lt;li&gt;Create a folder in the &lt;span style="font-weight: bold;"&gt;GVimPortable\App\vim\vim71&lt;/span&gt;directory called &lt;span style="font-weight: bold;"&gt;cream&lt;/span&gt;.  &lt;/li&gt;  &lt;li&gt;Extract the Cream source files into the folder created in the previous step.&lt;/li&gt;  &lt;li&gt;Create a batch file in the same folder as the GVimPortable executable with the following information:    &lt;pre&gt;@echo off
set location=%~d0%~p0
start "" "%location%\GVimPortable.exe" -u "%location%\App\vim\vim71\cream\creamrc" -i "%location%\Data\settings\.viminfo" -U NONE "--servername" "CREAM" "%*"&lt;/pre&gt;  &lt;/li&gt;&lt;/ol&gt;&lt;h4&gt;Note&lt;/h4&gt;&lt;ul&gt;  &lt;li&gt;This tutorial was originally written for vim70 and a version of cream older than 4.0 but has since been updated to work with vim71 and cream 4.0.&lt;/li&gt;  &lt;li&gt;For future versions, change the paths to correctly reflect the vim version and modify the start line of the batch file as needed.. The correct start line can be derived from inspecting the line after the :RUNCREAM label within the cream.bat file located within the cream source files.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6597645530249322915-3993383722479024190?l=johnscomputerjournal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnscomputerjournal.blogspot.com/feeds/3993383722479024190/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6597645530249322915&amp;postID=3993383722479024190&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6597645530249322915/posts/default/3993383722479024190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6597645530249322915/posts/default/3993383722479024190'/><link rel='alternate' type='text/html' href='http://johnscomputerjournal.blogspot.com/2007/02/portable-gvim-with-cream.html' title='Portable GVIM with Cream'/><author><name>John</name><uri>http://www.blogger.com/profile/13568415846137179048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
