<?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-2959498105239183642</id><updated>2012-01-10T04:13:43.232+10:00</updated><category term='saml'/><category term='jdeveloper'/><category term='owsm'/><category term='oracle'/><title type='text'>Today, guess what ...</title><subtitle type='html'>Techniques and thoughts worth documenting.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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>39</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2959498105239183642.post-3607221105593373080</id><published>2011-04-19T10:45:00.001+10:00</published><updated>2011-04-19T13:29:10.985+10:00</updated><title type='text'>dircolors – color ls unix directory listings – danger of overriding shell built-ins</title><content type='html'>&lt;p&gt;I ran in to a crazy issue today that stemmed from a built-in function override configuration setting that I have leveraged for the best part of a decade. I’m amazed that this is the first time I actually noticed it!&lt;/p&gt;  &lt;p&gt;I have a environment setup script for one of my installations like the following ...    &lt;br /&gt;    &lt;br /&gt;&lt;font face="courier new" size="2"&gt;export MW_HOME=/u01/app/oracle/product/Middleware      &lt;br /&gt;export JAVA_HOME=&amp;quot;`ls -d ${MW_HOME}/jdk16*`&amp;quot;       &lt;br /&gt;export PATH=$JAVA_HOME/bin:$PATH       &lt;br /&gt;&lt;/font&gt;    &lt;br /&gt;The JDK path is not hardcoded as this is a pre-release environment, and the JDK is often patched and the directory name changes as a result. &lt;/p&gt;  &lt;p&gt;A script I was invoking had a simple test like the following:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800080" size="2"&gt;#!/bin/sh      &lt;br /&gt;if [ x${PATH} != x ]; then       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; PATH=$ORACLE_HOME/bin:$PATH       &lt;br /&gt;fi       &lt;br /&gt;&lt;/font&gt;    &lt;br /&gt;When I ran the shell script from plain vt100 terminal, everything worked perfectly.&amp;#160; When I fired the script up from an xterm running inside VNC, I hit an error like the following:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#ff0000"&gt;./test.sh: line 2: [: too many arguments      &lt;br /&gt;&lt;/font&gt;    &lt;br /&gt;The reason for the error, the string JAVA_HOME ended up containing ANSI characters when run from xterm. &lt;/p&gt;  &lt;p&gt;For example, from an XTERM    &lt;br /&gt;    &lt;br /&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;echo `ls -d /tmp` &amp;gt; file.txt      &lt;br /&gt;&lt;/font&gt;    &lt;br /&gt;&lt;font face="Courier New" size="2"&gt;file.txt&lt;/font&gt; contained ... &lt;font face="Courier New"&gt;^[[00m^[[00;34m/tmp^[[00m ^[[m      &lt;br /&gt;&lt;/font&gt;    &lt;br /&gt;, whereas from the VT100 terminal:     &lt;br /&gt;    &lt;br /&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;echo `ls -d /tmp` &amp;gt; file.txt &lt;/font&gt;    &lt;br /&gt;    &lt;br /&gt;&lt;font face="Courier New" size="2"&gt;file.txt&lt;/font&gt; contained ... &lt;font face="Courier New"&gt;/tmp      &lt;br /&gt;&lt;/font&gt;    &lt;br /&gt;It turns out, I had a zsh function setup-for/overriding the &lt;font face="Courier New"&gt;ls&lt;/font&gt; command so as to use color listings when invoked from an xterm by passing the &lt;font face="Courier New"&gt;--color&lt;/font&gt; option.&amp;#160; The function was as follows:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800080" size="2"&gt;ls ()      &lt;br /&gt;{       &lt;br /&gt;&amp;#160; [[ $TERM = (&lt;b class="moz-txt-star"&gt;&lt;span class="moz-txt-tag"&gt;*&lt;/span&gt;xterm&lt;span class="moz-txt-tag"&gt;*&lt;/span&gt;&lt;/b&gt;|ansi|linux|dtterm) ]] &amp;amp;&amp;amp; set -- &lt;strong&gt;--color&lt;/strong&gt; &amp;quot;$@&amp;quot;       &lt;br /&gt;&amp;#160; command ls -v &amp;quot;$@&amp;quot;       &lt;br /&gt;}       &lt;br /&gt;&lt;/font&gt;    &lt;br /&gt;The fix was to change the &lt;font face="courier new"&gt;--color&lt;/font&gt; option to be &lt;font face="courier new"&gt;--color=auto&lt;/font&gt; so that the ANSI escape sequences were only output if the standard output is a terminal (but not for things like scripts etc).&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800080" size="2"&gt;ls ()      &lt;br /&gt;{       &lt;br /&gt;&amp;#160; [[ $TERM = (&lt;b class="moz-txt-star"&gt;&lt;span class="moz-txt-tag"&gt;*&lt;/span&gt;xterm&lt;span class="moz-txt-tag"&gt;*&lt;/span&gt;&lt;/b&gt;|ansi|linux|dtterm) ]] &amp;amp;&amp;amp; set -- &lt;strong&gt;--color=auto&lt;/strong&gt; &amp;quot;$@&amp;quot;       &lt;br /&gt;&amp;#160; command ls -v &amp;quot;$@&amp;quot;       &lt;br /&gt;}       &lt;br /&gt;&lt;/font&gt;    &lt;br /&gt;Moral of the story, be extremely careful using shell functions to override standard built-in commands, and make sure you understand the impact of switches!     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;Update&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;So my good mate and colleague Dragos states:&lt;/p&gt;  &lt;p&gt;You should not rely on '&lt;font face="Courier New" color="#800080"&gt;ls&lt;/font&gt;' (or any other command), as it can be an alias or function to anything else.&lt;/p&gt;  &lt;p&gt;The fix is in your environment script to use &lt;font face="Courier New" color="#800080"&gt;/bin/ls&lt;/font&gt; or &lt;font face="Courier New" color="#800080"&gt;=ls&lt;/font&gt;, yes &amp;quot;equal sign ls&amp;quot;&lt;/p&gt;  &lt;p&gt;There's a way to force filename expansion too:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;JAVA_HOME=(${MW_HOME}/jdk16*) &lt;/font&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2959498105239183642-3607221105593373080?l=todayguesswhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/3607221105593373080/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://todayguesswhat.blogspot.com/2011/04/dircolors-color-ls-unix-directory.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/3607221105593373080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/3607221105593373080'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/2011/04/dircolors-color-ls-unix-directory.html' title='dircolors – color ls unix directory listings – danger of overriding shell built-ins'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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-2959498105239183642.post-1171194549266176244</id><published>2011-04-07T13:27:00.001+10:00</published><updated>2011-04-07T13:32:16.307+10:00</updated><title type='text'>Online Open Port Check Tool</title><content type='html'>&lt;p&gt;The RCCB / Residual Current Device in my place has a nasty habit of tripping whenever the house is vacant for more than a couple of days. For the remaining 99% of the time that I’m home, it never trips.&amp;#160; I haven’t been able to isolate exactly what triggers it, but upon my return I’m faced with a fridge/freezer full of ruined food.&lt;/p&gt;  &lt;p&gt;Anyway, given the electricity is completely lost when this RCCB triggers, I really need a simple tool that polls my router (like a ping) to see if it responds, and if not, gives me some type of warning.&lt;/p&gt;  &lt;p&gt;I run OpenVPN on the router over TCP port 443, and it appears the various online port scanning tools are able to detect the presence of the port being open.&lt;/p&gt;  &lt;p&gt;The following is a list of sites that I’ve found that &lt;strong&gt;allow&lt;/strong&gt; one to scan a specific &lt;strong&gt;remote&lt;/strong&gt; host and port (that differs to the host/proxy of the incoming client):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://ping.eu/port-chk/"&gt;http://ping.eu/port-chk/&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://www.subnetonline.com/pages/network-tools/online-port-scanner.php"&gt;http://www.subnetonline.com/pages/network-tools/online-port-scanner.php&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://www.digitalcoding.com/tools/open-port-check.html"&gt;http://www.digitalcoding.com/tools/open-port-check.html&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://www.yougetsignal.com/tools/open-ports/"&gt;http://www.yougetsignal.com/tools/open-ports/&lt;/a&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;My favourite is the latter, as it allows you to potentially bookmark the location; for example, to check if google port 80 open:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.yougetsignal.com/tools/open-ports/php/check-port.php?portNumber=80&amp;amp;remoteAddress=www.google.com"&gt;http://www.yougetsignal.com/tools/open-ports/php/check-port.php?portNumber=80&amp;amp;remoteAddress=www.google.com&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;If anyone knows a site out there that offers remote port polling with SMS/email notification in the event the service is down, let me know!&lt;/p&gt;  &lt;p&gt;I may have to build something otherwise on Google App Engine using the URL fetch capabilities &lt;/p&gt;  &lt;p&gt;Here is the API&lt;a href="http://www.yougetsignal.com/tools/open-ports/php/check-port.php?portNumber=443&amp;amp;remoteAddress=mshannon.blogsite.org"&gt;&amp;nbsp;&lt;/a&gt;&amp;#160; &lt;a href="http://code.google.com/appengine/docs/java/urlfetch/overview.html"&gt;http://code.google.com/appengine/docs/java/urlfetch/overview.html&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/2959498105239183642-1171194549266176244?l=todayguesswhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/1171194549266176244/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://todayguesswhat.blogspot.com/2011/04/online-open-port-check-tool.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/1171194549266176244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/1171194549266176244'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/2011/04/online-open-port-check-tool.html' title='Online Open Port Check Tool'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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-2959498105239183642.post-8285651435956892937</id><published>2011-03-29T18:24:00.001+10:00</published><updated>2011-03-29T18:24:41.865+10:00</updated><title type='text'>Tools to locate class file in JAR / CLASSPATH</title><content type='html'>&lt;p&gt;There are a number of different approaches for obtaining the location (jar/directory) of a class at runtime.&amp;#160; The following approach work pretty well…&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new"&gt;Class c = ...     &lt;br /&gt;System.out.println(c.getProtectionDomain().getCodeSource().getLocation().toString());&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;You could also try VM debug options at startup such as:&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new"&gt;-XX:-TraceClassLoading     &lt;br /&gt;&lt;/font&gt;Trace loading of classes.&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new"&gt;-XX:-TraceClassLoadingPreorder     &lt;br /&gt;&lt;/font&gt;Trace all classes loaded in order referenced (not loaded).&lt;/p&gt;  &lt;p&gt;In terms of static/offline location of classes, most people will suggest &lt;a href="http://jarbrowser.sourceforge.net/"&gt;jarbrowser&lt;/a&gt;, &lt;a href="http://jarminator.sourceforge.net/"&gt;jarminator&lt;/a&gt;, or brute force by leveraging a combination of the unix &lt;font face="courier new"&gt;find&lt;/font&gt; command, &lt;font face="courier new"&gt;unzip –l&lt;/font&gt;, and &lt;font face="courier new"&gt;grep&lt;/font&gt;.&lt;/p&gt;  &lt;p&gt;I’ve created a derivative of the offline approach.&amp;#160; Essentially I have three scripts:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;font face="courier new"&gt;jarclasspath &lt;/font&gt; is a shell script/java class combo used to formulate a valid and complete list of libraries and directories that are referenced from the specified source JAR by way of &lt;font face="Courier New"&gt;META-INF/MANIFEST.MF&lt;/font&gt; &lt;font face="Courier New" color="#0000ff" size="2"&gt;Class-Path&lt;/font&gt; directives. A classpath containing a single JAR file could ultimately expand to hundreds of libraries, should that top-level archive specify &lt;font face="Courier New"&gt;Class-Path&lt;/font&gt; directives, and in-turn the dependent libraries provide &lt;font face="courier new"&gt;Class-Path&lt;/font&gt; directives and so-on.&amp;#160; See this &lt;a href="http://todayguesswhat.blogspot.com/2011/03/jar-manifestmf-class-path-referencing.html"&gt;post&lt;/a&gt; for more details regarding manifest classpath attributes.&lt;/li&gt;    &lt;li&gt;&lt;font face="Courier New"&gt;jarcheck &lt;/font&gt; is a simple perl script that checks for presence of the specified class file in the specified JAR file/or directory. Note that &lt;font face="Courier New"&gt;Class-Path&lt;/font&gt; manifest directives can reference JAR files and/or directories. This tool supports searching both.&lt;/li&gt;    &lt;li&gt;&lt;font face="Courier New"&gt;jarwhich &lt;/font&gt; is a demonstration shell script that shows how to leverage the &lt;font face="courier new"&gt;jarclasspath&lt;/font&gt; and &lt;font face="courier new"&gt;jarcheck&lt;/font&gt; scripts above.&amp;#160; This particular script will search the &lt;font face="courier new"&gt;CLASSPATH&lt;/font&gt; (and dependent libraries/directories based on &lt;font face="Courier New"&gt;Class-Path&lt;/font&gt; directives) to locate the requested class file.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;u&gt;Testing…&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;Using my UCM flavoured WebLogic Server as the basis for the test, I sourced &lt;font face="courier new"&gt;$DOMAIN_HOME/bin/setDomainEnv.sh&lt;/font&gt; to set &lt;font face="courier new"&gt;CLASSPATH&lt;/font&gt;.&lt;/p&gt;  &lt;p&gt;This resulted in a CLASSPATH containing just 16 entries, however, all is not as it seems! :&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800080" size="2"&gt;% echo $CLASSPATH     &lt;br /&gt;/u01/app/oracle/product/Middleware/oracle_common/modules/oracle.jdbc_11.1.1/ojdbc6dms.jar: ...      &lt;br /&gt;/u01/app/oracle/product/Middleware/wlserver_10.3/server/lib/weblogic.jar: ...      &lt;br /&gt;/u01/app/oracle/product/Middleware/modules/features/weblogic.server.modules_10.3.4.0.jar:      &lt;br /&gt; ...      &lt;br /&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800080" size="2"&gt;% echo $CLASSPATH | tr &amp;quot;:&amp;quot; &amp;quot;\n&amp;quot; | wc -l     &lt;br /&gt;16&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;The &lt;font face="courier new"&gt;weblogic.server.modules_10.3.4.0.jar&lt;/font&gt; referenced above in the CLASSPATH however has a &lt;font face="courier new"&gt;Class-Path manifest &lt;/font&gt;directive referencing some 180 additional dependent JAR files:&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" color="#800080" size="2"&gt;% echo $CLASSPATH | tr &amp;quot;:&amp;quot; &amp;quot;\n&amp;quot; | grep weblogic.server.modules&amp;#160; &lt;br /&gt;/u01/app/oracle/product/Middleware/modules/features/weblogic.server.modules_10.3.4.0.jar&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" color="#800080" size="2"&gt;% unzip -l /u01/app/oracle/product/Middleware/modules/features/weblogic.server.modules_10.3.4.0.jar     &lt;br /&gt;Archive:&amp;#160; weblogic.server.modules_10.3.4.0.jar      &lt;br /&gt;&amp;#160; Length&amp;#160;&amp;#160;&amp;#160;&amp;#160; Date&amp;#160;&amp;#160; Time&amp;#160;&amp;#160;&amp;#160; Name      &lt;br /&gt; --------&amp;#160;&amp;#160;&amp;#160; ----&amp;#160;&amp;#160; ----&amp;#160;&amp;#160;&amp;#160; ----      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 8880&amp;#160; 03-23-11 05:00&amp;#160;&amp;#160; META-INF/MANIFEST.MF      &lt;br /&gt; --------&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; -------      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 8880&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1 file      &lt;br /&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" color="#800080" size="2"&gt;% unzip -d /tmp /u01/app/oracle/product/Middleware/modules/features/weblogic.server.modules_10.3.4.0.jar META-INF/MANIFEST.MF     &lt;br /&gt;Archive:&amp;#160; weblogic.server.modules_10.3.4.0.jar      &lt;br /&gt;&amp;#160; inflating: /tmp/META-INF/MANIFEST.MF&amp;#160; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" color="#800080" size="2"&gt;% cat /tmp/META-INF/MANIFEST.MF|more     &lt;br /&gt;Manifest-Version: 1.0      &lt;br /&gt;Implementation-Vendor: BEA Systems      &lt;br /&gt;Implementation-Title: Oracle WebLogic Server Module Dependencies 10.3       &lt;br /&gt; Thu Oct 28 06:03:12 PDT 2010       &lt;br /&gt;Implementation-Version: 10.3.4.0      &lt;br /&gt;Feature-Name: weblogic.server.modules      &lt;br /&gt;Source-Repository-Change-Id: 1374366      &lt;br /&gt;Class-Path: weblogic.server.modules.wlsve_10.3.4.0.jar ../com.bea.core      &lt;br /&gt; .antlr.runtime_2.7.7.jar ../com.bea.core.descriptor.j2ee_1.5.0.0.jar       &lt;br /&gt; ../com.bea.core.descriptor.j2ee.binding_1.5.0.0.jar ../com.bea.core.d      &lt;br /&gt; escriptor.wl_1.3.3.0.jar ../com.bea.core.descriptor.wl.binding_1.3.3.      &lt;br /&gt; 0.jar ../com.bea.core.datasource6_1.9.0.0.jar ../com.bea.core.datasou      &lt;br /&gt; rce6.binding_1.9.0.0.jar ../com.bea.core.beangen_1.7.0.0.jar ../com.b      &lt;br /&gt; ea.core.descriptor.settable.binding_1.7.0.0.jar ../com.bea.core.diagn      &lt;br /&gt; ostics.accessor_1.5.0.0.jar ../com.bea.core.diagnostics.accessor.bind      &lt;br /&gt; ing_1.5.0.0.jar ../com.bea.core.management.core_2.8.0.0.jar ../com.be      &lt;br /&gt; a.core.management.core.binding_2.8.0.0.jar ../com.bea.core.ejbgen_1.1      &lt;br /&gt; .0.2.jar ../org.apache.ant_1.7.1/lib/ant-all.jar ../com.bea.core.repa      &lt;br /&gt; ckaged.apache.bcel_5.2.1.0.jar ../com.bea.core.repackaged.jdt_3.5.2.0      &lt;br /&gt; .jar ../com.bea.core.apache.commons.collections_3.2.0.jar ../com.bea.      &lt;br /&gt; core.apache.commons.lang_2.1.0.jar ../com.bea.core.apache.commons.poo      &lt;br /&gt; l_1.3.0.jar ../com.bea.core.apache.commons.io_1.0.0.0_1-4.jar ../com.      &lt;br /&gt; bea.core.apache.commons.fileupload_1.0.0.0_1-2-1.jar ../com.bea.core.      &lt;br /&gt; apache.dom_1.0.0.0.jar ../com.bea.core.apache.logging_1.0.0.0.jar ../      &lt;br /&gt; org.apache.openjpa_1.2.0.0_1-1-1-SNAPSHOT.jar ../com.bea.core.xml.xml      &lt;br /&gt; beans_2.1.0.0_2-5-1.jar ../com.bea.core.logging_1.8.0.0.jar ../com.be      &lt;br /&gt; a.core.bea.opensaml_1.0.0.0_6-1-0-0.jar ../com.bea.core.bea.opensaml2      &lt;br /&gt; _1.0.0.0_6-1-0-0.jar ../com.bea.core.monitoring.harvester.api_2.3.0.0      &lt;br /&gt; .jar ../com.bea.core.monitoring.harvester.jmx_2.3.0.0.jar ../com.bea.      &lt;br /&gt;.....      &lt;br /&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;As you can see above, this short 16 entry CLASSPATH soon expands to something massive.&amp;#160; In fact, it expanded to 412 unique entries (primarily JAR files, but also directories)!&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Let us run some tests:&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" color="#800080" size="2"&gt;% ~/bin/jarwhich oracle.jdbc.driver.OracleDriver     &lt;br /&gt;/u01/app/oracle/product/Middleware/oracle_common/modules/oracle.jdbc_11.1.1/ojdbc6dms.jar: oracle/jdbc/driver/OracleDriver.class      &lt;br /&gt;##Match Found.      &lt;br /&gt;/u01/app/oracle/product/Middleware/wlserver_10.3/server/lib/ojdbc6.jar: oracle/jdbc/driver/OracleDriver.class      &lt;br /&gt;##Match Found.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;font face="courier new" color="#800080" size="2"&gt;% ~/bin/jarwhich javax.mail.internet.MimeUtility     &lt;br /&gt;/u01/app/oracle/product/Middleware/modules/javax.mail_1.1.0.0_1-4-1.jar: javax/mail/internet/MimeUtility.class      &lt;br /&gt;##Match Found.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;And finally, here are the scripts:&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff"&gt;jarclasspath&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="1"&gt;#!/bin/sh     &lt;br /&gt;#      &lt;br /&gt;# Copyright (c) 2011, Matt Shannon.      &lt;br /&gt;#      &lt;br /&gt;#&amp;#160;&amp;#160;&amp;#160; NAME&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jarclasspath      &lt;br /&gt;#&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="1"&gt;if [ -z &amp;quot;${JAVA_HOME}&amp;quot; ]; then     &lt;br /&gt;&amp;#160; printf &amp;quot;\n\nError: Ensure JAVA_HOME environment variable is set.\n&amp;quot;      &lt;br /&gt;&amp;#160; exit 1      &lt;br /&gt;fi&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="1"&gt;# Checks error     &lt;br /&gt;checkerror()      &lt;br /&gt;{      &lt;br /&gt;&amp;#160; RESULTCODE=$?      &lt;br /&gt;&amp;#160; if [ ${RESULTCODE} -ne 0 ];then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; exit 1      &lt;br /&gt;&amp;#160; fi      &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="1"&gt;JAVARUNCMD=&amp;quot;${JAVA_HOME}/bin/java&amp;quot;     &lt;br /&gt;JAVACMPCMD=&amp;quot;${JAVA_HOME}/bin/javac&amp;quot;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="1"&gt;## note - need to be careful with dollar signs and backslashes!&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="1"&gt;cat &amp;gt; /tmp/JarClasspath.java &amp;lt;&amp;lt;EOF     &lt;br /&gt;import java.io.File;      &lt;br /&gt;import java.io.FileInputStream;      &lt;br /&gt;import java.io.FileNotFoundException;      &lt;br /&gt;import java.io.InputStream;      &lt;br /&gt;import java.io.IOException;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="1"&gt;import java.util.List;     &lt;br /&gt;import java.util.ArrayList;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="1"&gt;import java.util.jar.Attributes;     &lt;br /&gt;import java.util.jar.JarFile;      &lt;br /&gt;import java.util.jar.Manifest;&lt;/font&gt;&lt;/p&gt; &lt;font face="Courier New" size="1"&gt;   &lt;p&gt;     &lt;br /&gt;public class JarClasspath      &lt;br /&gt;{      &lt;br /&gt;&amp;#160; public static void main(String[] args)      &lt;br /&gt;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if (args.length &amp;lt; 0)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.err.println(&amp;quot;Usage: arg0 = /path/to/jar&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.exit(-1);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; String sourceJar = args[0];&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; List&amp;lt;String&amp;gt; jars = new ArrayList&amp;lt;String&amp;gt;();&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; try     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; File entry = new File(sourceJar);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; String entryPath = entry.getCanonicalPath();&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (entry.isDirectory())     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.out.println(entryPath);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else if (entry.isFile())      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if ((entryPath.toLowerCase().endsWith(&amp;quot;.jar&amp;quot;) ||       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; entryPath.toLowerCase().endsWith(&amp;quot;.zip&amp;quot;)))      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.out.println(entryPath);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jars.add(entryPath);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printManifestClasspathEntries(jars, entry);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; catch (Exception e)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; e.printStackTrace();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.exit(-1);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160; }&lt;/p&gt;    &lt;p&gt;&amp;#160; public static void printManifestClasspathEntries(     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; List&amp;lt;String&amp;gt; jars,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; File sourceJar      &lt;br /&gt;&amp;#160; ) throws Exception      &lt;br /&gt;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; File[] entries = getManifestClasspathEntries(sourceJar);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int length = (entries == null) ? 0 : entries.length;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; for (int i = 0 ; i &amp;lt; length; i++)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; File entry = entries[i];      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (entry == null)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; continue;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; String entryPath = entry.getCanonicalPath();&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (entry.isDirectory())     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.out.println(entryPath);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else if (entry.isFile())      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if ((entryPath.toLowerCase().endsWith(&amp;quot;.jar&amp;quot;) ||&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; entryPath.toLowerCase().endsWith(&amp;quot;.zip&amp;quot;)))      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (! jars.contains(entryPath))      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jars.add(entryPath);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.out.println(entryPath);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printManifestClasspathEntries(jars, entry);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160; }&lt;/p&gt;    &lt;p&gt;     &lt;br /&gt;&amp;#160; public static File[] getManifestClasspathEntries(File file)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; throws IOException, FileNotFoundException      &lt;br /&gt;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; File[] results = null;&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; InputStream is = null;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; try      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; is = new FileInputStream(file);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; JarFile jarfile = new JarFile(file);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Manifest manifest = jarfile.getManifest();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (manifest != null)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Attributes attributes = manifest.getMainAttributes();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (attributes != null)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; String cp = attributes.getValue(Attributes.Name.CLASS_PATH);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (cp != null)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; String[] entries = cp.split(&amp;quot;&lt;a&gt;\\\\s&lt;/a&gt;&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int length = (entries == null) ? 0 : entries.length;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (length &amp;gt; 0)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; results = new File[length];      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (int i = 0 ; i &amp;lt; length; i++)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if ((entries[i] == null) || (entries[i].trim().length() == 0))      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; continue;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; File f = new File(file.getParentFile(), entries[i]);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; results[i] = f;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; finally      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (is != null)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; try      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; is.close();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; catch (Exception ignore)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; is = null;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; return results;      &lt;br /&gt;&amp;#160; }      &lt;br /&gt;}      &lt;br /&gt;EOF&lt;/p&gt;    &lt;p&gt;CP=/tmp&lt;/p&gt;    &lt;p&gt;# Compile tool     &lt;br /&gt;${JAVACMPCMD} -classpath ${CP} -d &amp;quot;/tmp&amp;quot; /tmp/JarClasspath.java      &lt;br /&gt;checkerror&lt;/p&gt;    &lt;p&gt;# Process arguments     &lt;br /&gt;for jar in &amp;quot;$@&amp;quot;; do      &lt;br /&gt;&amp;#160; ${JAVARUNCMD} -classpath ${CP} JarClasspath &amp;quot;${jar}&amp;quot;      &lt;br /&gt;&amp;#160; checkerror      &lt;br /&gt;done      &lt;br /&gt;&lt;/p&gt; &lt;/font&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff"&gt;jarcheck&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="1"&gt;#!/usr/bin/perl -w     &lt;br /&gt;#      &lt;br /&gt;# Checks if specified class is found in provided jar/directory      &lt;br /&gt;#      &lt;br /&gt;use Getopt::Std;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="1"&gt;$0 =~ /([^\/]+)$/ ; # Pattern match; 1 or more chars at end of perl script file name (after the last / if present)      &lt;br /&gt;$SCRIPT = $1 ; # Contains the subpattern from the first set of parentheses in the last pattern matched&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="1"&gt;# Get the class argument.     &lt;br /&gt;getopts('s');&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="1"&gt;unless (((scalar @ARGV) == 2) &amp;amp;&amp;amp;     &lt;br /&gt; (defined ($class = $ARGV[0])) &amp;amp;&amp;amp; ($class =~ /^[\w\.\/]+$/) &amp;amp;&amp;amp;      &lt;br /&gt; (defined ($jar = $ARGV[1])) &amp;amp;&amp;amp; ($jar =~ /^[\w\.\/\-]+$/))      &lt;br /&gt;{      &lt;br /&gt;&amp;#160; die(&amp;quot;Usage: $SCRIPT [-s] &amp;lt;class&amp;gt; &amp;lt;jar&amp;gt;\nwhere:&amp;quot;,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;\t&amp;lt;class&amp;gt; is the fully-qualified, dot or slash delimited name of a Java class.\n&amp;quot;,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;\t&amp;lt;jar&amp;gt; is the fully-qualified jar file or directory to search.\n&amp;quot;,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;\t-s tells jarcheck that the full class name is not provided\n&amp;quot;);      &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="1"&gt;# Get the partial name of the .class file for this class.     &lt;br /&gt;$classFile = $class ;      &lt;br /&gt;$classFile =~ s/\./\//g ;      &lt;br /&gt;$classFile .= &amp;quot;.class&amp;quot; ;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="1"&gt;# If the jar is a file, Search it for the class file name.     &lt;br /&gt;if ((-f $jar) &amp;amp;&amp;amp; (open(ARCHIVE, &amp;quot;unzip -l $jar|&amp;quot;)))      &lt;br /&gt;{      &lt;br /&gt;&amp;#160; while(defined ($line = &amp;lt;ARCHIVE&amp;gt;))      &lt;br /&gt;&amp;#160; {      &lt;br /&gt; # escape any $ in the class file name      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $escaped = $classFile;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $escaped =~ s/\$/\\\$/;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="1"&gt;&amp;#160;&amp;#160;&amp;#160; # \b allows you to perform a &amp;quot;whole words only&amp;quot; search using a regular expression     &lt;br /&gt; if($line =~ /\b$escaped\b/)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160; print(&amp;quot;$jar: &amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160; if (defined($opt_s))      &lt;br /&gt;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $line =~ /[_\w\/\$]+$classFile/;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; print($&amp;amp;);      &lt;br /&gt;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160; else      &lt;br /&gt;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; print($classFile);      &lt;br /&gt;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160; print(&amp;quot;\n&amp;quot;);&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="1"&gt;&amp;#160;&amp;#160; exit(0);     &lt;br /&gt; }      &lt;br /&gt;&amp;#160; }      &lt;br /&gt;}      &lt;br /&gt;# If the jar is infact a directory, see if the .class file is under it.      &lt;br /&gt;elsif(-d $jar)      &lt;br /&gt;{      &lt;br /&gt;&amp;#160; if (-f &amp;quot;$jar/$classFile&amp;quot;)      &lt;br /&gt;&amp;#160; {      &lt;br /&gt; print(&amp;quot;$jar/$classFile\n&amp;quot;);      &lt;br /&gt; exit(0);      &lt;br /&gt;&amp;#160; }      &lt;br /&gt;&amp;#160; elsif (defined($opt_s))      &lt;br /&gt;&amp;#160; {      &lt;br /&gt; $classFile =~ /[_\w]+\.class/;      &lt;br /&gt; $maxdepth = ($jar eq &amp;quot;.&amp;quot;)? &amp;quot;-maxdepth 1&amp;quot;:&amp;quot;&amp;quot;;      &lt;br /&gt; $results = `find $jar $maxdepth | grep -w $&amp;amp;`;      &lt;br /&gt; if (!$?)      &lt;br /&gt; {      &lt;br /&gt;&amp;#160;&amp;#160; print $results;      &lt;br /&gt;&amp;#160;&amp;#160; exit(0);      &lt;br /&gt; }      &lt;br /&gt;&amp;#160; }      &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="1"&gt;exit(1);     &lt;br /&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff"&gt;jarwhich&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="1"&gt;#!/bin/sh     &lt;br /&gt;#      &lt;br /&gt;# Copyright (c) 2011, Matt Shannon.      &lt;br /&gt;#      &lt;br /&gt;#&amp;#160;&amp;#160;&amp;#160; NAME&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jarwhich      &lt;br /&gt;#&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="1"&gt;if [[ $# -ne 1 ]]; then     &lt;br /&gt;&amp;#160; printf &amp;quot;\nUsage: $0 &amp;lt;class&amp;gt;\n&amp;quot;      &lt;br /&gt;&amp;#160; printf &amp;quot;&amp;#160; where &amp;lt;class&amp;gt; is the fully-qualified, dot or slash delimited name of\n&amp;quot;      &lt;br /&gt;&amp;#160; printf &amp;quot;&amp;#160; the Java class to locate. e.g. oracle.jdbc.driver.OracleDriver\n&amp;quot;      &lt;br /&gt;&amp;#160; exit      &lt;br /&gt;fi&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="1"&gt;if [ -z &amp;quot;${CLASSPATH}&amp;quot; ]; then     &lt;br /&gt;&amp;#160; printf &amp;quot;\nError: Ensure CLASSPATH environment variable is set.\n&amp;quot;      &lt;br /&gt;&amp;#160; exit 1      &lt;br /&gt;fi&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="1"&gt;DIRNAMECMD=`which dirname`     &lt;br /&gt;SCRIPT_DIR=&amp;quot;`${DIRNAMECMD} $0`/&amp;quot;      &lt;br /&gt;SCRIPT_DIR=&amp;quot;`cd \&amp;quot;${SCRIPT_DIR}\&amp;quot; &amp;amp;&amp;amp; pwd`&amp;quot;&lt;/font&gt;&lt;/p&gt; &lt;font face="Courier New" size="1"&gt;   &lt;p&gt;     &lt;br /&gt;jarCheck()      &lt;br /&gt;{      &lt;br /&gt;&amp;#160; &amp;quot;${SCRIPT_DIR}&amp;quot;/jarcheck &amp;quot;$1&amp;quot; &amp;quot;$2&amp;quot;      &lt;br /&gt;&amp;#160; return      &lt;br /&gt;}&lt;/p&gt;    &lt;p&gt;file=/tmp/out$$     &lt;br /&gt;echo $CLASSPATH | tr &amp;quot;:&amp;quot; &amp;quot;\n&amp;quot; | sort -u | xargs &amp;quot;${SCRIPT_DIR}&amp;quot;/jarclasspath | sort -u &amp;gt; $file&lt;/p&gt;    &lt;p&gt;for line in `cat $file`; do     &lt;br /&gt;&amp;#160; jarCheck $1 &amp;quot;${line}&amp;quot;      &lt;br /&gt;&amp;#160; if [[ $? -eq 0 ]]; then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; printf &amp;quot;##Match Found.\n&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; # exit 0      &lt;br /&gt;&amp;#160; fi      &lt;br /&gt;done &lt;/p&gt;    &lt;p&gt;&lt;/p&gt; &lt;/font&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2959498105239183642-8285651435956892937?l=todayguesswhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/8285651435956892937/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://todayguesswhat.blogspot.com/2011/03/tools-to-locate-class-file-in-jar.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/8285651435956892937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/8285651435956892937'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/2011/03/tools-to-locate-class-file-in-jar.html' title='Tools to locate class file in JAR / CLASSPATH'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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-2959498105239183642.post-4883478319206720307</id><published>2011-03-29T11:24:00.001+10:00</published><updated>2011-03-29T12:36:55.496+10:00</updated><title type='text'>JAR : MANIFEST.MF Class-Path referencing a directory</title><content type='html'>&lt;p&gt;Leveraging Java &amp;quot;1.6.0_24&amp;quot; on Windows XP, I performed some quick tests to determine if a JAR's manifest (&lt;font face="courier new"&gt;META-INF/MANIFEST.MF&lt;/font&gt;) &lt;font face="Courier New"&gt;Class-Path&lt;/font&gt; attribute could reference a directory, thereby automatically picking up any contained classes/jars within that directory.&lt;/p&gt;  &lt;p&gt;The result... &lt;em&gt;INTERESTING&lt;/em&gt;..&lt;/p&gt;  &lt;p&gt;My directory tree contents were as follows:&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;font face="Courier New" color="#800080"&gt;/test      &lt;br /&gt;/test/test.jar       &lt;br /&gt;/test/lib       &lt;br /&gt;/test/lib/abc.jar&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;the &amp;quot;&lt;font face="Courier New"&gt;test.jar&lt;/font&gt;&amp;quot; found in the top level &amp;quot;&lt;font face="Courier New"&gt;test&lt;/font&gt;&amp;quot; directory contained a single file entry:     &lt;br /&gt;&lt;font face="Courier New"&gt;META-INF/MANIFEST.MF&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;the &amp;quot;&lt;font face="Courier New"&gt;abc.jar&lt;/font&gt;&amp;quot; found in the &amp;quot;&lt;font face="Courier New"&gt;lib&lt;/font&gt;&amp;quot; directory contained a single file entry; a class named &amp;quot;&lt;font face="Courier New"&gt;Testing&lt;/font&gt;&amp;quot; :-&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800000" size="2"&gt;public class Testing      &lt;br /&gt;{       &lt;br /&gt;&amp;#160; public static void main(String args[])       &lt;br /&gt;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; System.out.println(&amp;quot;found me&amp;quot;);       &lt;br /&gt;&amp;#160; }       &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;To prove our Testing class can be located, we set test.jar's &lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;font size="3"&gt;MANIFEST.MF&lt;/font&gt; &lt;/font&gt;&lt;/font&gt;contents initially to:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;Manifest-Version: 1.0      &lt;br /&gt;Class-Path: lib/abc.jar       &lt;br /&gt;Created-By: 1.6.0_24 (Sun Microsystems Inc.)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;(Note, following the &lt;font face="Courier New" color="#0000ff"&gt;Created-By:&lt;/font&gt; ... line, there are two newlines.)&lt;/p&gt;  &lt;p&gt;Invoking the following java command line, we see the Testing class was successfully triggered:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="2"&gt;C:\test&amp;gt;java -cp test.jar Testing      &lt;br /&gt;found me&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;I did some additional testing with relative and absolute paths in the &lt;font face="Courier New"&gt;MANIFEST.MF&lt;/font&gt;, the results of which were:&lt;/p&gt;  &lt;p&gt;works:&amp;#160; &lt;font face="Courier New" size="2"&gt;Class-Path: ./lib/abc.jar      &lt;br /&gt;&lt;/font&gt;works:&amp;#160; &lt;font face="Courier New" size="2"&gt;Class-Path: /C:/test/lib/abc.jar      &lt;br /&gt;&lt;/font&gt;works:&amp;#160; &lt;font face="Courier New" size="2"&gt;Class-Path: \C:\test\lib\abc.jar      &lt;br /&gt;&lt;/font&gt;fails:&amp;#160; &lt;font face="Courier New" size="2"&gt;Class-Path: C:\test\lib\abc.jar&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;Next, I altered the &lt;font face="Courier New"&gt;MANIFEST.MF&lt;/font&gt; contents to:&lt;/p&gt;  &lt;p&gt;&lt;font face="courier " color="#0000ff" size="2"&gt;Manifest-Version: 1.0      &lt;br /&gt;Class-Path: lib/       &lt;br /&gt;Created-By: 1.6.0_24 (Sun Microsystems Inc.)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier " color="#0000ff" size="2"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;and re-issued the java command:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="2"&gt;C:\test&amp;gt;java -cp test.jar Testing      &lt;br /&gt;Exception in thread &amp;quot;main&amp;quot; java.lang.NoClassDefFoundError: Testing       &lt;br /&gt;Caused by: java.lang.ClassNotFoundException: Testing       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; at java.net.URLClassLoader$1.run(Unknown Source)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; at java.security.AccessController.doPrivileged(Native Method)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; at java.net.URLClassLoader.findClass(Unknown Source)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; at java.lang.ClassLoader.loadClass(Unknown Source)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; at java.lang.ClassLoader.loadClass(Unknown Source)       &lt;br /&gt;Could not find the main class: Testing.&amp;#160; Program will exit.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Thus, it appeared jar files in the lib directory would not be automatically included in the classpath.    &lt;br /&gt;To be overly thorough, I decided to run some additional tests, the results of which were:&lt;/p&gt;  &lt;p&gt;fails:&amp;#160; &lt;font face="Courier New" size="2"&gt;Class-Path: lib      &lt;br /&gt;&lt;/font&gt;fails:&amp;#160; &lt;font face="Courier New" size="2"&gt;Class-Path: lib/      &lt;br /&gt;&lt;/font&gt;fails:&amp;#160; &lt;font face="Courier New" size="2"&gt;Class-Path: ./lib      &lt;br /&gt;&lt;/font&gt;fails:&amp;#160; &lt;font face="Courier New" size="2"&gt;Class-Path: ./lib/      &lt;br /&gt;&lt;/font&gt;fails:&amp;#160; &lt;font face="Courier New" size="2"&gt;Class-Path: \C:\test\lib\      &lt;br /&gt;&lt;/font&gt;fails:&amp;#160; &lt;font face="Courier New" size="2"&gt;Class-Path: \C:\test\lib      &lt;br /&gt;&lt;/font&gt;fails:&amp;#160; &lt;font face="Courier New" size="2"&gt;Class-Path: /C:/test/lib/      &lt;br /&gt;&lt;/font&gt;fails:&amp;#160; &lt;font face="Courier New" size="2"&gt;Class-Path: /C:/test/lib&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;At this point, I was of the opinion that a directory specified as part of a manifest Class-Path attribute/directive would simply be ignored.&lt;/p&gt;  &lt;p&gt;WRONG!&lt;/p&gt;  &lt;p&gt;I decided to extract (and subsequently delete) abc.jar.&amp;#160; The contents of my directory tree were thus:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800080"&gt;/test      &lt;br /&gt;/test/test.jar       &lt;br /&gt;/test/lib       &lt;br /&gt;/test/lib/Testing.class&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;I set the &lt;font face="Courier New"&gt;MANIFEST.MF &lt;/font&gt;contents to:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;Manifest-Version: 1.0      &lt;br /&gt;Class-Path: lib/       &lt;br /&gt;Created-By: 1.6.0_24 (Sun Microsystems Inc.)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;and re-issued the java command:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="2"&gt;C:\test&amp;gt;java -cp test.jar Testing      &lt;br /&gt;found me&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;SUCCESS. It had located the class. What was even more interesting came out in the subsequent tests I performed:&lt;/p&gt;  &lt;p&gt;fails:&amp;#160; &lt;font face="Courier New" size="2"&gt;Class-Path: lib      &lt;br /&gt;&lt;/font&gt;fails:&amp;#160; &lt;font face="Courier New" size="2"&gt;Class-Path: ./lib      &lt;br /&gt;&lt;/font&gt;fails:&amp;#160; &lt;font face="Courier New" size="2"&gt;Class-Path: \C:\test\lib      &lt;br /&gt;&lt;/font&gt;fails:&amp;#160; &lt;font face="Courier New" size="2"&gt;Class-Path: /C:/test/lib      &lt;br /&gt;&lt;/font&gt;works:&amp;#160; &lt;font face="Courier New" size="2"&gt;Class-Path: lib/      &lt;br /&gt;&lt;/font&gt;works:&amp;#160; &lt;font face="Courier New" size="2"&gt;Class-Path: ./lib/      &lt;br /&gt;&lt;/font&gt;works:&amp;#160; &lt;font face="Courier New" size="2"&gt;Class-Path: \C:\test\lib\      &lt;br /&gt;&lt;/font&gt;works:&amp;#160; &lt;font face="Courier New" size="2"&gt;Class-Path: /C:/test/lib/&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Hence, if an explicit directory name is provided as part of the &lt;font face="Courier New"&gt;Class-Path&lt;/font&gt; attribute, it must have a trailing slash in order to be recognized!&lt;/p&gt;  &lt;p&gt;If a directory entry ends with &amp;quot;&lt;font face="courier new"&gt;.&lt;/font&gt;&amp;quot;&amp;#160; or &amp;quot;&lt;font face="courier new"&gt;..&lt;/font&gt;&amp;quot;&amp;#160; no trailing slash is required.&amp;#160; For example, if&amp;#160; &lt;font face="courier new"&gt;test.jar&lt;/font&gt; was moved to &lt;font face="courier new"&gt;/test/lib&lt;/font&gt;, and had its &lt;font face="Courier New"&gt;MANIFEST.MF&lt;/font&gt; &lt;font face="courier new"&gt;Class-Path&lt;/font&gt; set to &lt;font face="Courier New"&gt;../..&lt;/font&gt;&amp;#160; , then &lt;font face="Courier New"&gt;Testing.class&lt;/font&gt;&lt;font face="Georgia"&gt; would be found if it resided in &amp;quot;&lt;font face="courier new"&gt;/&lt;/font&gt;&amp;quot;.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;As a final test, and just to be doubly certain that relative paths specified in a &lt;font face="Courier New"&gt;MANIFEST.MF&lt;/font&gt; are in no way influenced by the java invoking end-user's working directory, I ran the following:&lt;/p&gt;  &lt;p&gt;(with &lt;font face="Courier New"&gt;MANIFEST.MF&lt;/font&gt; &lt;font face="courier new"&gt;Class-Path&lt;/font&gt; set to &lt;font face="Courier New"&gt;lib/&lt;/font&gt;&amp;#160; and &lt;font face="Courier New"&gt;lib&lt;/font&gt; containing &lt;font face="Courier New"&gt;Testing.class&lt;/font&gt;)&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="2"&gt;C:\&amp;gt;java -cp test\test.jar Testing      &lt;br /&gt;found me       &lt;br /&gt;&lt;/font&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2959498105239183642-4883478319206720307?l=todayguesswhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/4883478319206720307/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://todayguesswhat.blogspot.com/2011/03/jar-manifestmf-class-path-referencing.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/4883478319206720307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/4883478319206720307'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/2011/03/jar-manifestmf-class-path-referencing.html' title='JAR : MANIFEST.MF Class-Path referencing a directory'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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-2959498105239183642.post-6244829903976830656</id><published>2011-03-21T16:15:00.001+10:00</published><updated>2011-03-22T08:12:24.122+10:00</updated><title type='text'>Malware exploiting Java Plug-In 1.6.0_22</title><content type='html'>&lt;p&gt;I learned a nasty lesson yesterday about the dangers of not having the very latest versions of browser plug-ins installed.&amp;#160; The irony is that I work for the company that developed the Plug-in. I had installed the Sun (Oracle) JDK / JRE Standard Edition 6 Update 22 which was released only back in October 2010. This includes a Java Plug-In that will allow applets to be invoked from the browser.&lt;/p&gt;  &lt;p&gt;Running the current latest version of Firefox (3.6.15) on Windows XP, I opened the top few sites returned from a Google search for UFC 128 title fight video in separate tabs. I was immediately called away to tend to my son, and returned to find my wife in front of the laptop with a multitude of Internet Explorer windows popped-up. I proceeded to chastise her and give her the ‘WTF are you doing’ / ‘What have you done’ spiel – only to be told she hasn’t pressed a key/or button.&lt;/p&gt;  &lt;p&gt;Bugger!&lt;/p&gt;  &lt;p&gt;Malware.&lt;/p&gt;  &lt;p&gt;I immediately ripped the network cable from the back of the computer, and proceeded to start Task Manager along with a program called TaskInfo (by Iarsn) – and kill any and all processes that didn’t look right. Unfortunately I had recently got a bit lazy/blaze about what runs on my laptop and hadn’t taken too much notice regarding any new drivers/services that were installed (i.e. HP Universal Print Driver / Canon Scanner / OpenVPN network adapter etc).&amp;#160; So I was struggling to work out what was legit and what was not.&lt;/p&gt;  &lt;p&gt;In the few short minutes I was gone from the computer, the Malware well and truly set its hooks in installing crap such as Offerbox and various browser plug-ins/extensions. My AVG Anti-Virus Free Edition version 2011 unfortunately caught very little of this malware that was being installed.&lt;/p&gt;  &lt;p&gt;Fortunately I also had installed on my machine two additional free programs.&amp;#160; The first being CCleaner &lt;a href="http://www.piriform.com/ccleaner"&gt;http://www.piriform.com/ccleaner&lt;/a&gt;, and the second, a very old version of Unlocker developed by Cedrick Collomb.&amp;#160; Unlocker is an extremely useful tool that is capable of releasing various locks on files that are being held by system and application processes. Using CCleaner, I was able to see *some* of the additional startup programs that had been added. Using Unlocker, I was able to delete a lot of malware running, and also delete the “C:\Program Files\Java” directory as well. After removing some of the malware, I ran CCleaner’s Registry Cleaner tool which provided me some locations in the registry that were invalid (pointing to missing shared DLLS/applications paths broken etc).&amp;#160; Those entries identified by CCLeaner which corresponded to Malware, gave me a starting point for my manual registry “cleaning”.&lt;/p&gt;  &lt;p&gt;I also stumbled in to the Windows “Prefetch” directory that gave me a basic timeline of the crap that got installed on my machine when I was away, and also some other programs to try and identify and delete.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_fb84xkhr8q8/TYfNQo3hE7I/AAAAAAAAAIU/z0Vzk9KFDHs/s1600-h/IMG_thumb%5B2%5D%5B1%5D.png"&gt;&lt;img title="IMG_thumb[2]" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="769" alt="IMG_thumb[2]" src="http://lh5.ggpht.com/_fb84xkhr8q8/TYfNRiorCaI/AAAAAAAAAIY/fikY_8_wkGA/IMG_thumb%5B2%5D_thumb%5B1%5D.png?imgmax=800" width="598" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I cleaned and deleted as much as I could, and performed my first reboot (keeping the network cable disconnected).&amp;#160; Firing up TaskInfo after the machine started, I could see some rundll32.exe processes that had spawned that were pointing to some weird DLL files in existing legitimate directories.&amp;#160; I could see a file named “lusrmgrk.dll” that was both being invoked from the “C:\Windows” and “C:\Program Files\Pidgin” directory. I opened those directories&amp;#160; and set the Folder View Model to detailed and enabled display of both “Date Modified” and “Date Created” columns.&amp;#160; Sure enough, those files had been created/modified at exactly the time of this malware travesty. I deleted these files using Unlocker’s assitance.&amp;#160; There were other strange files in the Windows directory with similar date/times that were listed in the Prefetch folder at around the time of the Malware installation;&amp;#160; So those got deleted as well.&amp;#160; I initially set about running some MD5 checksums on the files to see if anyone had a similar virus and reported the checksum, but didn’t get any hits.&amp;#160; For example, the MD5 of “Lfeboa.exe”, which was 137216 bytes, was “014303FB5CF4F2F8A2EADD5EDD82427B”.&lt;/p&gt;  &lt;p&gt;Up until this stage, I had not reconnected the network cable on the infected laptop.&amp;#160; The Apple iPad was getting used to search google for md5 checksums and read various malware removal articles.&amp;#160; It was at this point, I really hated Apple and what it stood for. Steve Jobs and/or the marketing geniuses at Apple decided the iPad would not need any external storage support (micro SD etc). I can only speculate this is purely self-motivated so that they can get the Apple fanboys to continually upgrade to a newer device with more capacity. What this meant though, is that I had no way of getting a file from the iPad to my infected computer without establishing a network connection (or jail-breaking the device and buying a camera kit). Thankyou Apple.&lt;/p&gt;  &lt;p&gt;So the network connection on the PC had to be turned on (very very briefly).&amp;#160; I downloaded two apps:&lt;/p&gt;  &lt;p&gt;TDSSKiller (an anti-rootkit utility from Kaspersky Lab: &lt;a href="http://support.kaspersky.com/faq/?qid=208283363"&gt;http://support.kaspersky.com/faq/?qid=208283363&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;and&lt;/p&gt;  &lt;p&gt;Malwarebytes Anti-Malware (&lt;a href="http://www.malwarebytes.org/mbam-download.php"&gt;http://www.malwarebytes.org/mbam-download.php&lt;/a&gt; )&lt;/p&gt;  &lt;p&gt;Malwarebytes needed to be briefly connected to the internet so that it could update its database, but there is a workaround in future for this:&amp;#160; See issue #4: &lt;a href="http://forums.malwarebytes.org/index.php?showtopic=10138"&gt;http://forums.malwarebytes.org/index.php?showtopic=10138&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Having downloaded and installed these, the network connection was yanked and I let the programs do their jobs. Both apps found remaining malware on disk and were able to remove most* traces. I initially did the quick scan with Malwarebytes, but eventually did the full scan which detected an additional malware file.&lt;/p&gt;  &lt;p&gt;Upon reboot, I fired up the taskinfo application, but could still see two rundll32.exe processes.&amp;#160; However the processes were attempting to load DLLs that were not present on disk.&amp;#160; I decided to run the Windows Malicious Software removal tool, but it did not detect anything.&lt;/p&gt;  &lt;p&gt;My concern was that there was still some malware on disk that was causing the processes to be initiated.&lt;/p&gt;  &lt;p&gt;Taskinfo also provides an option to view the parent process ID of a task.&amp;#160; The parent process IDs&amp;#160; for the rundll32 processes were pointing to a svchost process.&amp;#160; And in particular, “C:\WINDOWS\System32\svchost.exe -k netsvcs”. &lt;/p&gt;  &lt;p&gt;See the following article for a description of svchost: &lt;a href="http://support.microsoft.com/kb/314056"&gt;http://support.microsoft.com/kb/314056&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Basically, Svchost is responsible for starting services at startup. If you were to view task manager, you would see there are a number of svchost processes, each of which is starting services from a particular service group.&amp;#160; The “netsvcs” group encompasses some 20 or so services:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_fb84xkhr8q8/TYbs2ElIuCI/AAAAAAAAAHM/6OXO5JWaUh8/s1600-h/snap1028%5B11%5D.png"&gt;&lt;img title="snap1028" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="298" alt="snap1028" src="http://lh4.ggpht.com/_fb84xkhr8q8/TYbs3ULAMuI/AAAAAAAAAHQ/llDQAO7t39I/snap1028_thumb%5B11%5D.png?imgmax=800" width="704" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_fb84xkhr8q8/TYbs4fk6pmI/AAAAAAAAAHU/qCIZi2qevsk/s1600-h/snap1027%5B8%5D.png"&gt;&lt;img title="snap1027" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="681" alt="snap1027" src="http://lh3.ggpht.com/_fb84xkhr8q8/TYbs6M5UdBI/AAAAAAAAAHY/E2cqC4woA-8/snap1027_thumb%5B8%5D.png?imgmax=800" width="704" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;One of the services in the group was ultimately triggering the rundll32 processes.&amp;#160; I just wasn’t sure how.&amp;#160; It could be that a malware service had been added; or maybe an existing legitimate service had been compromised; or maybe an existing service had a dependency on some other service that was compromised etc.&lt;/p&gt;  &lt;p&gt;Unfortunately I could not find an easy way to work out which service was triggering the rundll32 processes.&amp;#160; So I decided to basically stop them in blocks and restart the computer and try and isolate which service was somehow responsible.&lt;/p&gt;  &lt;p&gt;Bingo; Task Scheduler was somehow a part of this! I had read up about Malware creating and scheduling tasks to spawn their evil crap.&amp;#160;&amp;#160; I had looked in the C:\Windows\Tasks directory, but it was empty. This was from Windows Explorer with all options set to show hidden files.&amp;#160; So I was concerned that the Task Scheduler process itself maybe compromised, or a dependant service (Remote Procedure Call).&lt;/p&gt;  &lt;p&gt;I decided to do one final check from command prompt supplying the “/ah” option to the “dir” command. Wow; there were some .job files in the directory.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_fb84xkhr8q8/TYbs7EST_sI/AAAAAAAAAHc/W2iJ41ROpEI/s1600-h/tasks%5B3%5D.png"&gt;&lt;img title="tasks" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="634" alt="tasks" src="http://lh3.ggpht.com/_fb84xkhr8q8/TYbs8diX55I/AAAAAAAAAHg/QmOolWhei6U/tasks_thumb%5B3%5D.png?imgmax=800" width="704" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Using the “Xcacls.vbs” tool, &lt;a href="http://support.microsoft.com/kb/825751/en-us"&gt;http://support.microsoft.com/kb/825751/en-us&lt;/a&gt; I was able to give my local administrator user “full control” on the two .job files. Having done this, I was able to change the file permissions so they were no longer hidden etc.&lt;/p&gt;  &lt;p&gt;At this point, the tasks became visible from Windows Explorer, and they could be deleted:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_fb84xkhr8q8/TYbwSwOTceI/AAAAAAAAAIE/5IDIkOeGYQc/s1600-h/snap1025b%5B1%5D.png"&gt;&lt;img title="snap1025b" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="772" alt="snap1025b" src="http://lh3.ggpht.com/_fb84xkhr8q8/TYbwT6ANrhI/AAAAAAAAAII/IfYr274ZCBM/snap1025b_thumb%5B1%5D.png?imgmax=800" width="829" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_fb84xkhr8q8/TYbwU9KfedI/AAAAAAAAAIM/4-KTlhaXsUM/s1600-h/snap1025%5B4%5D.png"&gt;&lt;img title="snap1025" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="772" alt="snap1025" src="http://lh3.ggpht.com/_fb84xkhr8q8/TYbwWDZQZAI/AAAAAAAAAIQ/sToREMHGf1w/snap1025_thumb%5B4%5D.png?imgmax=800" width="483" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_fb84xkhr8q8/TYbs_dTlPnI/AAAAAAAAAHs/4S-MP2ki5Kg/s1600-h/snap1026%5B2%5D.png"&gt;&lt;img title="snap1026" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="301" alt="snap1026" src="http://lh5.ggpht.com/_fb84xkhr8q8/TYbtAraAaOI/AAAAAAAAAHw/b4f7j_VEhkU/snap1026_thumb%5B2%5D.png?imgmax=800" width="704" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;A quick reboot, and the processes were no more.&amp;#160; &lt;/p&gt;  &lt;p&gt;I’ll never know If I’ve removed all the Malware; But one thing is for sure, I’m going to be much more anal when it comes to Browser plug-ins.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;And … if you are currently running JDK 1.6.0_23 or older, make sure you upgrade!!!!!!&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.oracle.com/technetwork/topics/security/javacpufeb2011-304611.html"&gt;http://www.oracle.com/technetwork/topics/security/javacpufeb2011-304611.html&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/2959498105239183642-6244829903976830656?l=todayguesswhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/6244829903976830656/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://todayguesswhat.blogspot.com/2011/03/malware-exploiting-java-plug-in-16022.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/6244829903976830656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/6244829903976830656'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/2011/03/malware-exploiting-java-plug-in-16022.html' title='Malware exploiting Java Plug-In 1.6.0_22'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_fb84xkhr8q8/TYfNRiorCaI/AAAAAAAAAIY/fikY_8_wkGA/s72-c/IMG_thumb%5B2%5D_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2959498105239183642.post-6194595088690129283</id><published>2011-03-16T19:18:00.001+10:00</published><updated>2011-03-16T22:09:26.563+10:00</updated><title type='text'>Tomato – Adding Custom Packages - NVRAM vs JFFS vs USB Stick</title><content type='html'>&lt;p&gt;I made the mistake last night of visiting the &lt;a href="http://www.linksysinfo.org/forums/forumdisplay.php?f=160"&gt;Tomato forum&lt;/a&gt; using my new (but actually second-hand) generation 1 iPad. It was late, and I desperately needed the sleep, but what the hell. Unfortunately I came across a forum thread titled &lt;a href="http://www.linksysinfo.org/forums/showthread.php?t=64245"&gt;My utilities web site revived&lt;/a&gt;.&amp;#160; Some two and a bit hours later (and well into the next day), I put the iPad down having read the thread from start to finish.&amp;#160; I gleaned so much useful and interesting bits of information from that that thread that I felt compelled to write a blogpost. This was mostly for my own future reference, but also to share the knowledge.&lt;/p&gt;  &lt;p&gt;All I can say is that ‘rhester72’ is a porting/compilation stud and by the looks of it one generous and smart dude.&amp;#160; Tomato community are very lucky to have him.&amp;#160; &lt;/p&gt;  &lt;p&gt;Me personally – well I’m one of the 4 billion java developer drones. I haven’t actively coded in C/C++ for a number of years. I miss these languages; mostly I miss&amp;#160; the forgotten skills to properly harness and control these languages – compiler directives / linking /make files / best practices etc.&amp;#160;&amp;#160; My foray into iPad application development will at least see me leveraging C once more.&lt;/p&gt;  &lt;p&gt;Anyway, returning to blog topic …&lt;/p&gt;  &lt;p&gt;rhester72 has gone to the trouble/effort of compiling a number of very useful packages/applications for the Tomato environment (MIPS processor series / running 2.6 Linux kernel/and to a lesser extent 2.4 kernel). These packages add some nice bells and whistles that may come in very handy. For example,&amp;#160; the torrent client (transmission) means you can potentially turn off your power-sucking gaming box and leave it to your ~10 watt ASUS RT-N16 :)&lt;/p&gt;  &lt;p&gt;The binaries come in two styles:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;static linked &lt;/li&gt;    &lt;li&gt;dynamic linked &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Static linked binaries are generally much bigger in size, as the dependent libraries are linked/packaged directly in the resulting binary. It is not however always possible to produce a static binary for certain types of packages due to their architecture.&lt;/p&gt;  &lt;p&gt;Dynamic linked binaries on the other hard should be smaller, as they are linked at runtime to dependent shared libraries.&amp;#160; The issue with these style of binaries is actually finding the the shared libraries themself at runtime:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;the shared library may actually be missing from the machine, or not available in the shared library search path (meaning the binary cannot be run) &lt;/li&gt;    &lt;li&gt;an incompatible version of the shared library may be located in the shared library search path (causing some type of conflict resulting in the binary not behaving correctly) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Dynamic linked binaries can however reduce memory footprint and save valuable space should multiple packages that you plan on running leverage same versions of specific shared libraries.&lt;/p&gt;  &lt;p&gt;Space and memory permitting, it is often simpler to take the static binary.&lt;/p&gt;  &lt;p&gt;Check out rhester72’s list of packages at the following URL:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.multics.minidns.net/tomato/"&gt;http://www.multics.minidns.net/tomato/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Be sure to view the &lt;a href="http://www.multics.minidns.net/tomato/DESCRIPTIONS.txt"&gt;descriptions&lt;/a&gt;, &lt;a href="http://www.multics.minidns.net/tomato/NOTES.txt"&gt;notes&lt;/a&gt;, and most importantly the &lt;a href="http://www.multics.minidns.net/tomato/00README_FIRST.txt"&gt;readme&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;When using dynamically linked binaries, it is not always obvious what the required shared library dependences are. Fortunately, the “&lt;font face="Courier New"&gt;ldd&lt;/font&gt;” command can be used to help out.&lt;/p&gt;  &lt;p&gt;&lt;a href="mailto:root@asus:/tmp"&gt;&lt;font face="Courier New" size="2"&gt;root@asus:/tmp&lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New" size="2"&gt;# wget &lt;/font&gt;&lt;a href="http://www.multics.minidns.net/tomato/PRECOMPILED/atop"&gt;&lt;font face="Courier New" size="2"&gt;http://www.multics.minidns.net/tomato/PRECOMPILED/atop&lt;/font&gt;&lt;/a&gt;     &lt;br /&gt;&lt;a href="mailto:root@asus:/tmp"&gt;&lt;font face="Courier New" size="2"&gt;root@asus:/tmp&lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New" size="2"&gt;# chmod u+x atop      &lt;br /&gt;&lt;/font&gt;&lt;a href="mailto:root@asus:/tmp"&gt;&lt;font face="Courier New" size="2"&gt;root@asus:/tmp&lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New" size="2"&gt;# ldd atop      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; libncurses.so.5 =&amp;gt; not found       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; libm.so.0 =&amp;gt; /lib/libm.so.0 (0x2aabf000)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; libz.so.1 =&amp;gt; not found       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; libgcc_s.so.1 =&amp;gt; /lib/libgcc_s.so.1 (0x2aadd000)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; libc.so.0 =&amp;gt; /lib/libc.so.0 (0x2aafc000)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ld-uClibc.so.0 =&amp;gt; /lib/ld-uClibc.so.0 (0x2aaa8000)       &lt;br /&gt;&lt;/font&gt;&lt;a href="mailto:root@asus:/tmp"&gt;&lt;font face="Courier New" size="2"&gt;root@asus:/tmp&lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New" size="2"&gt;# &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Above, you can see that &lt;font face="Courier New"&gt;libncurses.so.5&lt;/font&gt; and &lt;font face="courier new"&gt;libz.so.1&lt;/font&gt; are missing.&amp;#160; Lets rectify this …&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="mailto:root@asus:/tmp"&gt;&lt;font face="Courier New" size="2"&gt;root@asus:/tmp&lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New" size="2"&gt;# wget &lt;/font&gt;&lt;a href="http://www.multics.minidns.net/tomato/PRECOMPILED/lib/libncurses.so.5"&gt;&lt;font face="Courier New" size="2"&gt;http://www.multics.minidns.net/tomato/PRECOMPILED/lib/libncurses.so.5&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="mailto:root@asus:/tmp"&gt;&lt;font face="Courier New" size="2"&gt;root@asus:/tmp&lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New" size="2"&gt;# wget &lt;/font&gt;&lt;a href="http://www.multics.minidns.net/tomato/PRECOMPILED/lib/libz.so.1"&gt;&lt;font face="Courier New" size="2"&gt;http://www.multics.minidns.net/tomato/PRECOMPILED/lib/libz.so.1&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="mailto:root@asus:/tmp"&gt;&lt;font face="Courier New" size="2"&gt;root@asus:/tmp&lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New" size="2"&gt;# ldd atop      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; libncurses.so.5 =&amp;gt; not found       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; libm.so.0 =&amp;gt; /lib/libm.so.0 (0x2aabf000)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; libz.so.1 =&amp;gt; not found       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; libgcc_s.so.1 =&amp;gt; /lib/libgcc_s.so.1 (0x2aadd000)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; libc.so.0 =&amp;gt; /lib/libc.so.0 (0x2aafc000)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ld-uClibc.so.0 =&amp;gt; /lib/ld-uClibc.so.0 (0x2aaa8000)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;This still did not work; Why?&lt;/p&gt;  &lt;p&gt;The answer is the shared library search path.&lt;/p&gt;  &lt;p&gt;In Linux, Shared Libraries are searched (in order) from the following locations until a match is located: &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;LD_LIBRARY_PATH environment variable (if set) &lt;/li&gt;    &lt;li&gt;A specific rpath location encoded in to the dynamically linked ELF binary (or shared library) at compilation time (if set) &lt;/li&gt;    &lt;li&gt;System default paths defined in /etc/ld.so.conf &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;On my specific stock tomato instance, LD_LIBRARY_PATH is not set.&amp;#160; &lt;/p&gt;  &lt;p&gt;Using the &lt;font face="Courier New" size="2"&gt;readelf&lt;/font&gt; command on the &lt;font face="Courier New" size="2"&gt;atop&lt;/font&gt; binary, I can see the Library rpath is set to &lt;font face="courier new"&gt;/opt/lib:/opt/usr/lib&lt;/font&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_fb84xkhr8q8/TYCAVZgsZ7I/AAAAAAAAAGs/6jUBGV79WOo/s1600-h/rpath%5B1%5D.png"&gt;&lt;img title="rpath" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="253" alt="rpath" src="http://lh5.ggpht.com/_fb84xkhr8q8/TYCAWs1SPbI/AAAAAAAAAGw/mK7K-y0VRSU/rpath_thumb%5B1%5D.png?imgmax=800" width="644" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The contents of &lt;font face="courier new"&gt;ld.so.conf&lt;/font&gt; on my instance are:&lt;/p&gt;  &lt;p&gt;&lt;a href="mailto:root@asus:/tmp"&gt;&lt;font size="2"&gt;root@asus:/tmp&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt;# cat /etc/ld.so.conf      &lt;br /&gt;/opt/lib       &lt;br /&gt;/opt/usr/lib       &lt;br /&gt;/lib       &lt;br /&gt;/usr/lib&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Thus, I need to modify the instance so that the&amp;#160; &lt;font face="Courier New"&gt;libncurses.so.5&lt;/font&gt; and &lt;font face="courier new"&gt;libz.so.1&lt;/font&gt;&lt;font face="Georgia"&gt; libraries can be found.&amp;#160; For the time being, I’m going to manually set LD_LIBRARY_PATH to the /tmp directory which is where I downloaded the files in the first place:&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="mailto:root@asus:/tmp"&gt;&lt;font face="Courier New" size="2"&gt;root@asus:/tmp&lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New" size="2"&gt;# export LD_LIBRARY_PATH=/tmp&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="mailto:root@asus:/tmp"&gt;&lt;font face="Courier New" size="2"&gt;root@asus:/tmp&lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New" size="2"&gt;# ldd atop      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; libncurses.so.5 =&amp;gt; /tmp/libncurses.so.5 (0x2aabf000)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; libm.so.0 =&amp;gt; /lib/libm.so.0 (0x2ab12000)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; libz.so.1 =&amp;gt; /tmp/libz.so.1 (0x2ab30000)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; libgcc_s.so.1 =&amp;gt; /lib/libgcc_s.so.1 (0x2ab53000)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; libc.so.0 =&amp;gt; /lib/libc.so.0 (0x2ab72000)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ld-uClibc.so.0 =&amp;gt; /lib/ld-uClibc.so.0 (0x2aaa8000)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;As you can see above, the dependent libraries are now found, and we can at least attempt to invoke the atop binary!&lt;/p&gt;  &lt;p&gt;Now that you know how to add the packages, the question is where to install them:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Recall that the /tmp directory on the Tomato router is volatile; It is essentially a ramdisk created in available RAM of the router, and is blown away upon reboot. &lt;/li&gt;    &lt;li&gt;Non-volatile available/free flash memory on the router, if sufficient, can potentially be leveraged with important caveats. &lt;/li&gt;    &lt;li&gt;Another recommended choice (if available with your router) it to leverage an external USB stick/drive &lt;/li&gt;    &lt;li&gt;Possibly you may be able to even utilize network attached storage. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Flash memory is obviously very convenient, but it comes in a variety of sizes. The Linksys WRT54G series came in 2MB, 4MB and 8MB varieties. It is hard enough getting a distribution like Tomato on a router with such little flash memory, let alone using it for custom packages and the like. &lt;/p&gt;  &lt;p&gt;The ASUS RT-N16 on the other hand has 32 MB of flash. Even with the full-blown VPN 2.6 Tomato bundle installed, there is still some 25MB available for potential JFFS2 use. There is also a special area in the flash memory known as the NVRAM segment. This is essentially the very last segment in the flash memory and is at minimum one “erase block” in size. Although the erase block size is typically 64KB (or 128KB as is the case with the RT-N16), the actual NVRAM is programmatically restricted to 32KB.&lt;/p&gt;  &lt;p&gt;Tomato does support a special “&lt;font face="Courier New"&gt;nvram setfile2nvram&lt;/font&gt;” command that will allow you to store a very small file in any remaining NVRAM space (such that, within the 32KB not the full erase block segment size i.e. 128KB on the RT-N16).&amp;#160; However, this option should be leveraged as one of the last resorts. If you have free flash memory available, then JFFS2 is a better option.&amp;#160; Even better again is to leverage a USB stick if your router supports it.&amp;#160; &lt;/p&gt;  &lt;p&gt;The reasons for this is best explained by OpenWRT developer/CoFounder MBM’s post at the following location: &lt;a href="https://forum.openwrt.org/viewtopic.php?id=10083"&gt;https://forum.openwrt.org/viewtopic.php?id=10083&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;To quote him directly:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;“The flash chip is broken up into sections called erase blocks. On a 4M chip it's usually 64k and on an 8M chip it's 128k. Each erase block is rated at about 100,000-1,000,000 erase/write cycles depending on vendor.      &lt;br /&gt;      &lt;br /&gt;This just means that on a 4M chip you have to have to erase 64k and rewrite it even if you only want to change one byte of the 64k. After that 64k block has been erased 100,000 times you risk failure where it won't store the data properly.       &lt;br /&gt;      &lt;br /&gt;The problem with the NVRAM implementation is that it's exactly one erase block at the very end of the flash. When you boot, the NVRAM data is copied to a buffer in ram; with the exception of &amp;quot;nvram commit&amp;quot;, all the nvram commands are using the copy in ram. When you do an &amp;quot;nvram commit&amp;quot; it writes the contents of ram to the flash. So, when you have a chip rated for 100,000 cycles, you'll probably have a failure around the 100,000th &amp;quot;nvram commit&amp;quot;.       &lt;br /&gt;”&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Although leveraging JFFS2 will still result in wear due to erase cycles, this file system is specifically designed with flash devices in mind.&amp;#160; It is engineered is such a way to make “&lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/JFFS2"&gt;wear-levelling more even and prevent erasures from being too concentrated&lt;/a&gt;&lt;/em&gt;”.&lt;/p&gt;  &lt;p&gt;Once again though MBM&amp;#160; makes an important point:&lt;/p&gt;  &lt;p&gt;“&lt;em&gt; Suppose we have a jffs2 filesystem with two types of files, files that never change and files that change frequently. Common sense says that the erase blocks containing the files that never change or contain free space will only be written once and will remain untouched while the blocks containing the other files will change frequently; wear leveling means that all of the blocks within the jffs2 filesystem will be used equally, so all of the blocks in the above example would be written to equally even if it means moving data that hasn't changed&lt;/em&gt;“&lt;/p&gt;  &lt;p&gt;Thus, if you anticipate files being updated /writes occurring on the JFFS2 partition at a considerable rate, you are eventually going to ruin your flash chip.&amp;#160; In such scenarios you must absolutely use something like USB.&amp;#160; You must also be very careful that any custom packages you install are not repeatedly writing (e.g. log messages) to a location that is stored in the JFFS2 partition.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_fb84xkhr8q8/TYCAXfkr15I/AAAAAAAAAG0/mMf7JDoFJ9o/s1600-h/tomato%20jffs2%5B2%5D.png"&gt;&lt;img title="tomato jffs2" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="484" alt="tomato jffs2" src="http://lh4.ggpht.com/_fb84xkhr8q8/TYCAYNBn3yI/AAAAAAAAAG4/0XrzhG1GlWY/tomato%20jffs2_thumb%5B2%5D.png?imgmax=800" width="630" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Here is an ugly script I wrote designed for Tomato 1.28 to get details of flash memory allocation/distribution; Note that I have enabled JFFS2 support on my router from the Tomato UI (Administration &amp;gt; JFFS page):&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;cat &amp;gt; /tmp/flashinfo.sh &amp;lt;&amp;lt;EOF      &lt;br /&gt;#!/bin/sh&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;# Tomato 1.28 Flash Info Script by Matt Shannon&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;echo &amp;quot;Router model: &amp;quot; \`nvram get t_model_name\`      &lt;br /&gt;uname -a       &lt;br /&gt;echo &amp;quot;&amp;quot;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;dmesg | grep nvram      &lt;br /&gt;dmesg | grep jffs2       &lt;br /&gt;echo &amp;quot;&amp;quot;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;cat /proc/mtd      &lt;br /&gt;echo &amp;quot;&amp;quot;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;ERASEBLOCKSIZE=0x\`cat /proc/mtd | grep nvram | cut -f3 -d &amp;quot; &amp;quot;\`      &lt;br /&gt;echo &amp;quot;Erase Block size is&amp;quot; \`awk 'BEGIN{printf(&amp;quot;%d&amp;quot;, '\$ERASEBLOCKSIZE' / 1024)}\` kilobytes       &lt;br /&gt;echo &amp;quot;&amp;quot;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;NVRAMSEGMENT=0x\`cat /proc/mtd | grep nvram | cut -f2 -d &amp;quot; &amp;quot;\`      &lt;br /&gt;echo &amp;quot;NVRAM Full Segment size is&amp;quot; \`awk 'BEGIN{printf(&amp;quot;%d&amp;quot;, '\$NVRAMSEGMENT' / 1024)}\` kilobytes&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;NVRAMSUMMARY=\`nvram show | tail -1\`      &lt;br /&gt;NVRAMUSED=\`echo \$NVRAMSUMMARY | cut -d &amp;quot;,&amp;quot; -f2 | cut -d &amp;quot; &amp;quot; -f2\`       &lt;br /&gt;NVRAMFREE=\`echo \$NVRAMSUMMARY | cut -d &amp;quot;,&amp;quot; -f3 | cut -d &amp;quot; &amp;quot; -f2\`       &lt;br /&gt;echo &amp;quot;NVRAM Actual Size Available to firmware is&amp;quot; \`awk 'BEGIN{printf(&amp;quot;%d&amp;quot;, ('\$NVRAMUSED' + '\$NVRAMFREE') / 1024)}\` kilobytes       &lt;br /&gt;echo &amp;quot;NVRAM Summary: \$NVRAMSUMMARY&amp;quot;       &lt;br /&gt;echo &amp;quot;&amp;quot;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;JFFSSIZE=0x\`cat /proc/mtd | grep jffs2 | cut -f2 -d &amp;quot; &amp;quot;\`      &lt;br /&gt;echo &amp;quot;JFFS2 size is&amp;quot; \`awk 'BEGIN{printf(&amp;quot;%d&amp;quot;, '\$JFFSSIZE' / 1048576)}\` megabytes       &lt;br /&gt;echo &amp;quot;&amp;quot;       &lt;br /&gt;EOF&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;chmod 744 /tmp/flashinfo.sh&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;/tmp/flashinfo.sh      &lt;br /&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;sample output:&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" color="#800080" size="2"&gt;Router model:&amp;#160; Asus RT-N16      &lt;br /&gt;Linux asus 2.6.22.19 #8 Tue Nov 30 14:58:27 EST 2010 mips GNU/Linux&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" color="#800080" size="2"&gt;0x01fe0000-0x02000000 : &amp;quot;nvram&amp;quot;      &lt;br /&gt;0x006e0000-0x01fe0000 : &amp;quot;jffs2&amp;quot;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" color="#800080" size="2"&gt;dev:&amp;#160;&amp;#160;&amp;#160; size&amp;#160;&amp;#160; erasesize&amp;#160; name      &lt;br /&gt;mtd0: 00040000 00020000 &amp;quot;pmon&amp;quot;       &lt;br /&gt;mtd1: 01fa0000 00020000 &amp;quot;linux&amp;quot;       &lt;br /&gt;mtd2: 005aec00 00020000 &amp;quot;rootfs&amp;quot;       &lt;br /&gt;mtd3: 01900000 00020000 &amp;quot;jffs2&amp;quot;       &lt;br /&gt;mtd4: 00020000 00020000 &amp;quot;nvram&amp;quot;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" color="#800080" size="2"&gt;Erase Block size is 128 kilobytes&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" color="#800080" size="2"&gt;NVRAM Full Segment size is 128 kilobytes      &lt;br /&gt;NVRAM Actual Size Available to firmware is 32 kilobytes       &lt;br /&gt;NVRAM Summary: 852 entries, 21155 bytes used, 11613 bytes free.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" color="#800080" size="2"&gt;JFFS2 size is 25 megabytes&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Recall from above that rhester72’s dynamically linked binary &lt;font face="courier new"&gt;atop&lt;/font&gt; hardcodes an rpath to &lt;font face="courier new"&gt;/opt/lib:/opt/usr/lib&lt;/font&gt;. If you were to SSH in to your router however, you will likely find that the &lt;font face="courier new"&gt;/opt&lt;/font&gt; directory is empty.&amp;#160; Rhester72 leverages an init script (Tomato UI &amp;gt; Administration &amp;gt; Scripts &amp;gt; Init)&amp;#160; to attempt to automatically bind the &lt;font face="Courier New"&gt;/opt&lt;/font&gt; location to a directory “&lt;font face="Courier New"&gt;opt&lt;/font&gt;” found in the &lt;font face="Courier New"&gt;/jffs&lt;/font&gt; mount location. &lt;em&gt;(Note, when enabling JFFS2 in Tomato, the JFFS partition is automatically mounted at startup under the &lt;font face="Courier New"&gt;/jffs&lt;/font&gt; directory). &lt;/em&gt;Here is his script which will try for 30 seconds to bind the opt directory:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800000" size="2"&gt;t=0      &lt;br /&gt;while [[ ! -d /jffs/opt &amp;amp;&amp;amp; $t -lt 30 ]];do       &lt;br /&gt;sleep 1       &lt;br /&gt;t=$(($t+1))       &lt;br /&gt;done&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800000" size="2"&gt;if [ -d /jffs/opt ];then      &lt;br /&gt;mount -o bind /jffs/opt /opt       &lt;br /&gt;else       &lt;br /&gt;logger -t /jffs -p err did not mount within $t seconds       &lt;br /&gt;fi       &lt;br /&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;If the bind fails, a message will be written to &lt;font face="courier new"&gt;/var/log/messages&lt;/font&gt;.&amp;#160; To utilize such an approach you will need to do the following:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;enable JFFS2 &lt;/li&gt;    &lt;li&gt;once the jffs partition is mounted, &lt;font face="Courier New"&gt;mkdir /jffs/opt&lt;/font&gt; &lt;/li&gt;    &lt;li&gt;make appropriate subdirectories &lt;font face="courier new" size="1"&gt;mkdir -p /jffs/opt/bin /jffs/opt/lib /jffs/opt/sbin /jffs/opt/usr/bin /jffs/opt/usr/lib /jffs/opt/usr/sbin /jffs/opt/usr/share&lt;/font&gt;&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Refer to his &lt;a href="http://www.multics.minidns.net/tomato/00README_FIRST.txt"&gt;readme&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Leveraging the above directory structure to store binaries and shared libraries should give you good results (remember &lt;font face="Courier New"&gt;/opt&lt;/font&gt; will be bound to &lt;font face="Courier New" size="2"&gt;/jffs/opt&lt;/font&gt;):&lt;/p&gt;  &lt;p&gt;&lt;a href="mailto:root@asus:/tmp/home/root"&gt;&lt;font face="Courier New" size="2"&gt;root@asus:/tmp/home/root&lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New" size="2"&gt;# echo $PATH | tr &amp;quot;:&amp;quot; &amp;quot;\n&amp;quot;     &lt;br /&gt;/bin      &lt;br /&gt;/usr/bin      &lt;br /&gt;/sbin      &lt;br /&gt;/usr/sbin      &lt;br /&gt;/home/root      &lt;br /&gt;/mmc/sbin      &lt;br /&gt;/mmc/bin      &lt;br /&gt;/mmc/usr/sbin      &lt;br /&gt;/mmc/usr/bin      &lt;br /&gt;/opt/sbin      &lt;br /&gt;/opt/bin      &lt;br /&gt;/opt/usr/sbin      &lt;br /&gt;/opt/usr/bin&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="mailto:root@asus:/tmp/home/root"&gt;&lt;font face="Courier New" size="2"&gt;root@asus:/tmp/home/root&lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New" size="2"&gt;# cat /etc/ld.so.conf | grep /opt     &lt;br /&gt;/opt/lib      &lt;br /&gt;/opt/usr/lib&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;As a final note, be careful with setting &lt;font face="courier new"&gt;LD_LIBRARY_PATH&lt;/font&gt; in any profile.&amp;#160; Also it is worth inspecting the &lt;font face="courier new"&gt;/etc/profile&lt;/font&gt; script, you will see that it attempts to source both &lt;font face="courier new"&gt;/jffs/etc/profile&lt;/font&gt; and &lt;font face="courier new"&gt;/opt/etc/profile&lt;/font&gt; (if they exist).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_fb84xkhr8q8/TYCAZJ-3rLI/AAAAAAAAAG8/ljNrBAVaNQ8/s1600-h/profile%5B1%5D.png"&gt;&lt;img title="profile" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="196" alt="profile" src="http://lh4.ggpht.com/_fb84xkhr8q8/TYCAZ8dsTHI/AAAAAAAAAHA/7Ad1dM6goVw/profile_thumb%5B1%5D.png?imgmax=800" width="644" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Thanks again to rhester72; &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2959498105239183642-6194595088690129283?l=todayguesswhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/6194595088690129283/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://todayguesswhat.blogspot.com/2011/03/tomato-adding-custom-packages-nvram-vs.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/6194595088690129283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/6194595088690129283'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/2011/03/tomato-adding-custom-packages-nvram-vs.html' title='Tomato – Adding Custom Packages - NVRAM vs JFFS vs USB Stick'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_fb84xkhr8q8/TYCAWs1SPbI/AAAAAAAAAGw/mK7K-y0VRSU/s72-c/rpath_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2959498105239183642.post-5422240774388661023</id><published>2011-03-14T18:39:00.001+10:00</published><updated>2011-03-15T06:47:30.822+10:00</updated><title type='text'>Quick &amp; simple VPN setup guide: using OpenVPN on a ‘Tomato’ router</title><content type='html'>&lt;p&gt;Before the advent of custom firmware on consumer-priced/graded routers (Linksys/Netgear etc), obtaining secure remote access to a network resource using stock firmware was somewhat an art.&amp;#160; Circa 2002, I remember geeking it up in front of my work colleagues by remotely accessing my home machine’s desktop to download mp3 over Napster. Back then, I was using a combination of port-forwarding, VNC, and SSH; amazingly this setup was able to be tunnelled through work’s HTTP proxy server.&lt;/p&gt;  &lt;p&gt;Even today, many people still leverage such approaches.&amp;#160; The following links give a bit of a history and overview:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://members.shaw.ca/nicholas.fong/vnc/"&gt;http://members.shaw.ca/nicholas.fong/vnc/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://nodivisions.com/tech/vnc/" href="http://nodivisions.com/tech/vnc/"&gt;http://nodivisions.com/tech/vnc/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Modern custom router firmwares (DD-WRT / Tomato / etc) make it even simpler by bundling some of the required software.&amp;#160; Here is a link that describes an updated approach to the above:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.dreamdevil.com/index.php/2008/09/06/remote-desktop-through-ssh-with-putty-and-tomato-firmware/"&gt;http://blog.dreamdevil.com/index.php/2008/09/06/remote-desktop-through-ssh-with-putty-and-tomato-firmware/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Anyway…&lt;/p&gt;  &lt;p&gt;A friend whom runs a small business on a tight technology budget recently asked me what I would suggest that would allow his employees remote access to the office “files”.&amp;#160; He and his colleagues are regularly travelling for days at a time and require access both at customer sites, and also from hotels.&amp;#160; Most of the sites he visits do allow him to connect his laptop to the customer network; but not all. Thus, we needed a solution that would wherever possible allow him to leverage the customer’s office internet connection. For those sites that prevent such access, he would leverage a 3G solution using either a USB dongle, or 3G Wi-Fi Hotspot.&lt;/p&gt;  &lt;p&gt;Immediately, &lt;a href="http://en.wikipedia.org/wiki/OpenVPN"&gt;OpenVPN&lt;/a&gt; sprung to mind as a possible solution – mostly cause it was free, and also had client support on Windows, Mac, and Linux. The icing on the cake however was the fact that the DD-WRT and Tomato router firmwares happened to provide special VPN builds that bundled the OpenVPN server application.&amp;#160; Thus, assuming we could locate a router with sufficient grunt that could run such a firmware, there would be no need to have a dedicated separate OpenVPN server machine.&lt;/p&gt;  &lt;p&gt;Basically, three main routers sprung to mind:&lt;/p&gt;  &lt;p&gt;Asus RT-N16&lt;/p&gt;  &lt;p&gt;Linksys (Cisco) E3000&lt;/p&gt;  &lt;p&gt;Netgear WNDR3700&lt;/p&gt;  &lt;p&gt;The first two routers (Asus &amp;amp; Linksys) are supported by Tomato.&amp;#160; All three routers are supported by DD-WRT.&lt;/p&gt;  &lt;p&gt;I’ve had great success with Tomato in the past, so I suggested to my friend to purchase the Linksys E3000. This can be purchased here in Australia for about $170.&lt;/p&gt;  &lt;p&gt;It just so happened that I had an Asus RT-N16 at home, hence I was able to test out the VPN configuration on my home environment, before messing with my friends office network. I liked it so much (having a VPN), that I decided to keep it and refine it!&lt;/p&gt;  &lt;p&gt;The main decisions when leveraging OpenVPN are:&lt;/p&gt;  &lt;p&gt;1) Does your router have a static WAN IP address?&lt;/p&gt;  &lt;p&gt;If you router does not have a static IP address, then you are at the mercy of your internet provider whom may or may not reissue you the same IP address upon lease expiration/reboot etc. It is best to play it safe and configure your router to use a Dynamic DNS. Sign up for a free account at an appropriate provider (e.g. &lt;a href="http://www.dyndns.com"&gt;http://www.dyndns.com&lt;/a&gt;), and then configure your router with the appropriate DDNS account details.&amp;#160; Your router will subsequently register your dynamic IP address with the provider whenever your WAN connection comes up/changes. This way, you can configure your OpenVPN client configuration with a static hostname (e.g. todayguesswhat.dyndns.org)&lt;/p&gt;  &lt;p&gt;2) Do I TUN (network TUNnel) or TAP (network tap)?&lt;/p&gt;  &lt;p&gt;TAP &amp;gt; runs at layer 2 (&lt;a href="http://en.wikipedia.org/wiki/OSI_model"&gt;OSI model&lt;/a&gt;)&amp;#160; - bridge mode ; effectively the VPN client will appear to be on the same network subnet as the destination. Packets broadcast on destination network will be received by client.&lt;/p&gt;  &lt;p&gt;TUN &amp;gt; runs at layer 3 (&lt;a href="http://en.wikipedia.org/wiki/OSI_model"&gt;OSI model&lt;/a&gt;) – router mode; effectively the VPN client is on a different network to the destination; routing rules are used to allow the client to access the destination network.&amp;#160; Packets broadcast on destination network won’t be received by VPN client.&lt;/p&gt;  &lt;p&gt;3) What protocol: &lt;a href="http://en.wikipedia.org/wiki/Transmission_Control_Protocol"&gt;TCP&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/User_Datagram_Protocol"&gt;UDP&lt;/a&gt;?&lt;/p&gt;  &lt;p&gt;SgtPepper (Tomato guru) over at the LinksysInfo forum clarified/corrected my understanding of what this option means. Initially I assumed &lt;strong&gt;incorrectly&lt;/strong&gt; that the choice between TCP and UDP came down to what application layer network protocols you planned on using over the VPN.&amp;#160; Such that, if you wanted FTP/Telnet/SSH HTTP/HTTPS/SMTP/IMAP/SMB-over-TCP/NFS-over-TCP/ you chose TCP, whereas VoIP and Network Games, then UDP.&amp;#160; &lt;strong&gt;WRONG!&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;To Quote SgtPepper directly “&lt;em&gt;Choosing TCP vs UDP should have nothing to do with the application type you're using. OpenVPN tunnels TCP and UDP traffic over whichever protocol you choose. Tunneling TCP over TCP is extremely inefficient, so TCP should only be chosen if you absolutely have to. That should only be if you have to go through an HTTP proxy, trick a firewall, or have a very flaky connection and have problems with UDP. If you have the option, you should absolutely 100% use UDP.&lt;/em&gt;”&lt;/p&gt;  &lt;p&gt;4) What port for the server to listen on?&lt;/p&gt;  &lt;p&gt;The default port is 1194. But if 443 is available, I would suggest using this. The use of port 443 is particularly pertinent to TCP-based OpenVPN configurations whereby client access to the VPN may require tunnelling through a proxy server. Proxy servers are much more likely to accept traffic destined for port 443 versus something like 1194. Port 443 is the default port used by secure HTTP (aka HTTPS), and as such most proxy servers should allow it unimpeded.&lt;/p&gt;  &lt;p&gt;5) What LAN subnet/segment should the router be leveraging?&lt;/p&gt;  &lt;p&gt;Most routers ship with a default IP address of 192.168.1.1, and subnet mask 255.255.255.0. Chances are, one of the destinations you visit will also be leveraging such a topology. The problem occurs when the destination network is the same as the actual client network you are connecting from. For example, if my network at home is 192.168.1.x, and I’m at a client site that is using 192.168.1.x, and I attempt to make VPN connection to home, the routing tables get completely messed up. There are probably some crazy network mask and routing rule/metric options you can leverage to work around such a situation, but my advice is to avoid it in the first place.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;For my home VPN, I decided to leverage TAP (interface type), TCP (protocol), 443 (port), and 192.168.192.1/24 (&lt;a href="http://en.wikipedia.org/wiki/CIDR_notation"&gt;CIDR Notation&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;The reason I chose TAP is to theoretically support broadcast traffic, but mostly so as to appear on the same network as my destination. If your client has no business to receive the broadcast traffic, and you are expecting large amounts of broadcast traffic on the destination network subnet, then it is best to switch to TUN.&lt;/p&gt;  &lt;p&gt;The reason I chose TCP is that OpenVPN natively supports tunnelling of the TCP traffic over a HTTP proxy. This means that if we are stuck behind a HTTP proxy without direct internet access, we can still hopefully access the VPN by tunnelling through the proxy server. Refer to SgtPepper’s quote from above however regarding efficiency and only choose this option if you have to!&lt;/p&gt;  &lt;p&gt;I chose port 443 likewise to increase my odds of a proxy server connection working, and also so that it looks legitimate from an auditing perspective.&lt;/p&gt;  &lt;p&gt;I chose 192.168.192.x/255.255.255.0 network for my LAN, as this network has less chance of being leveraged on a client site (unlike for example 192.168.1.x).&lt;/p&gt;  &lt;p&gt;One interesting point to make is that Tomato natively supports &lt;strong&gt;two&lt;/strong&gt; OpenVPN server processes running at the same time.&amp;#160; Thus there is nothing stopping you running TCP and TAP for one instance, and UDP with TUN/TAP on the other instance.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Now… on to the VPN setup:&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;If you are running a Linksys E3000, I suggest obtaining and installing the following firmware (or newer):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://sourceforge.net/projects/tomatousb/files/Experimental%20%28beta%29/K26-MIPSR2/tomato-E3000USB-1.28.9054MIPSR2-beta-vpn3.6.rar/download"&gt;tomato-E3000USB-1.28.9054MIPSR2-beta-vpn3.6.bin&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;the above firmware can be installed directly over the top of the factory firmware.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;If you are running an Asus RT-N16, I suggest obtaining and installing the following firmware (or newer):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://sourceforge.net/projects/tomatousb/files/Experimental%20%28beta%29/K26-MIPSR2/tomato-K26USB-1.28.9054MIPSR2-beta-vpn3.6.rar/download"&gt;tomato-K26USB-1.28.9054MIPSR2-beta-vpn3.6.trx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Note: With the RT-N16, to upgrade from a stock firmware you must first flash the router with the following:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.dd-wrt.com/routerdb/de/download/Asus/RT-N16/-/dd-wrt.v24-14896_NEWD-2_K2.6_mini_RT-N16.trx/3763"&gt;http://www.dd-wrt.com/routerdb/de/download/Asus/RT-N16/-/dd-wrt.v24-14896_NEWD-2_K2.6_mini_RT-N16.trx/3763&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Next, you must download and install the &lt;a href="http://openvpn.net/index.php/open-source/downloads.html"&gt;OpenVPN software&lt;/a&gt; specific for your OS (client)&lt;/p&gt;  &lt;p&gt;For Windows, this is currently: &lt;a href="http://swupdate.openvpn.net/community/releases/openvpn-2.1.4-install.exe"&gt;http://swupdate.openvpn.net/community/releases/openvpn-2.1.4-install.exe&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;As we only need the client components and RSA certificate management scripts, be sure to DESELECT “OpenVPN Service”.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_fb84xkhr8q8/TX3T23pMkVI/AAAAAAAAAFM/Nx-V1whP9qg/s1600-h/openvpn%5B1%5D.png"&gt;&lt;img title="openvpn" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="484" alt="openvpn" src="http://lh3.ggpht.com/_fb84xkhr8q8/TX3T4GJJGCI/AAAAAAAAAFQ/9nwmhyETc4o/openvpn_thumb%5B1%5D.png?imgmax=800" width="618" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Next, we will generate the various keypairs…&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;font face="courier ne" color="#0000a0" size="2"&gt;CD /D &amp;quot;%ProgramFiles%\OpenVPN\easy-rsa&amp;quot;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;##&amp;#160;&amp;#160; create vars.bat and openssl.cnf from templates    &lt;br /&gt;&lt;font face="Courier New" color="#0000a0" size="2"&gt;init-config.bat&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;##&amp;#160;&amp;#160; Update the values in vars.bat as appropriate, specifically:    &lt;br /&gt;##&amp;#160;&amp;#160; KEY_COUNTRY, KEY_PROVINCE, KEY_CITY, KEY_ORG, KEY_EMAIL     &lt;br /&gt;##&amp;#160;&amp;#160; If requiring stronger keys, change KEY_SIZE from 1024 to 2048     &lt;br /&gt;##&amp;#160;&amp;#160; Use WordPad to edit the file, as it leverages UNIX line breaks     &lt;br /&gt;&lt;font face="Courier New" color="#0000a0" size="2"&gt;&amp;quot;%ProgramFiles%\Windows NT\Accessories\wordpad.exe&amp;quot; &amp;quot;%ProgramFiles%\OpenVPN\easy-rsa\vars.bat&amp;quot;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_fb84xkhr8q8/TX3T40lmnMI/AAAAAAAAAFU/zKudYcwnDh0/s1600-h/vars%5B1%5D.png"&gt;&lt;img title="vars" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="484" alt="vars" src="http://lh6.ggpht.com/_fb84xkhr8q8/TX3T5_T1D-I/AAAAAAAAAFY/zQ_83W-5eeE/vars_thumb%5B1%5D.png?imgmax=800" width="291" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;##&amp;#160;&amp;#160; Invoke vars.bat to set environment     &lt;br /&gt;&lt;font face="Courier New" color="#0000a0" size="2"&gt;vars&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;##&amp;#160;&amp;#160; CAUTION - deletes any existing keys / reset SERIAL and INDEX.TXT     &lt;br /&gt;&lt;font face="Courier New" color="#0000a0" size="2"&gt;clean-all&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;##&amp;#160;&amp;#160; Construct Certificate Authority keypair, set commonName to be CA     &lt;br /&gt;&lt;font face="Courier New" color="#0000a0" size="2"&gt;build-ca&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_fb84xkhr8q8/TX3T60ynwFI/AAAAAAAAAFc/M0Q0-xPaQqc/s1600-h/ca%5B2%5D.png"&gt;&lt;img title="ca" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="350" alt="ca" src="http://lh3.ggpht.com/_fb84xkhr8q8/TX3T7yGut_I/AAAAAAAAAFg/4kd4It9-Wss/ca_thumb%5B2%5D.png?imgmax=800" width="644" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;##&amp;#160;&amp;#160; Construct server keypair, set commonName to VPNServer     &lt;br /&gt;&lt;font face="Courier New" color="#0000a0" size="2"&gt;build-key-server server&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_fb84xkhr8q8/TX3T8tTwzNI/AAAAAAAAAFk/8ZUNkGH-8EE/s1600-h/server%5B5%5D.png"&gt;&lt;img title="server" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="484" alt="server" src="http://lh6.ggpht.com/_fb84xkhr8q8/TX3T9zJhmPI/AAAAAAAAAFo/E4dzaZP1He8/server_thumb%5B5%5D.png?imgmax=800" width="532" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;##&amp;#160;&amp;#160; Construct client keypair for user 'matt', set commonName as appropriate (e.g. matt)     &lt;br /&gt;&lt;font face="courier new" color="#0000a0" size="2"&gt;build-key client_matt&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_fb84xkhr8q8/TX3T-vMIFgI/AAAAAAAAAFs/JLmcPw4AuQM/s1600-h/client%5B1%5D.png"&gt;&lt;img title="client" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="484" alt="client" src="http://lh3.ggpht.com/_fb84xkhr8q8/TX3T_0N-ecI/AAAAAAAAAFw/EePn-24_BHs/client_thumb%5B1%5D.png?imgmax=800" width="537" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;...&lt;/p&gt;  &lt;p&gt;##&amp;#160;&amp;#160; Construct client keypair for user 'louise', set commonName as appropriate (e.g. louise)    &lt;br /&gt;## build-key client_louise&lt;/p&gt;  &lt;p&gt;##&amp;#160;&amp;#160; NOTE - if you have specified a challenge password in your certificate when you created it,    &lt;br /&gt;##&amp;#160;&amp;#160; you will be required to provide that password should you ever want to request to revoke the certificate&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;##&amp;#160;&amp;#160; The keys directory will contain private keys / certificates / index file stating     &lt;br /&gt;##&amp;#160;&amp;#160; issued certificates / serial file containing next serial number to leverage etc.     &lt;br /&gt;##&amp;#160;&amp;#160; !!! KEEP THEM IN A SAFE PLACE. !!!!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_fb84xkhr8q8/TX3UAwCtxwI/AAAAAAAAAF0/1hqj8HD8mcU/s1600-h/keys%5B5%5D.png"&gt;&lt;img title="keys" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="484" alt="keys" src="http://lh5.ggpht.com/_fb84xkhr8q8/TX3UB3awCoI/AAAAAAAAAF4/NG5sIaOcIAo/keys_thumb%5B5%5D.png?imgmax=800" width="507" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;##&amp;#160;&amp;#160; Generate Diffie Hellman parameters     &lt;br /&gt;##&amp;#160;&amp;#160; This will generate dh1024.pem in keys folder (or dh2048.pem files, depending on KEY-SIZE variable)     &lt;br /&gt;&lt;font face="Courier New" color="#0000a0" size="2"&gt;build-dh&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_fb84xkhr8q8/TX3UClboBRI/AAAAAAAAAF8/1J3rZufm_Gs/s1600-h/dh%5B1%5D.png"&gt;&lt;img title="dh" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="484" alt="dh" src="http://lh6.ggpht.com/_fb84xkhr8q8/TX3UDgR-7CI/AAAAAAAAAGA/C0WYjdvzc0s/dh_thumb%5B1%5D.png?imgmax=800" width="507" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Next, we will configure Tomato…&lt;/p&gt;  &lt;p&gt;From the Tomato Administration UI, choose “VPN Tunnelling” &amp;gt; &amp;quot;Server”&lt;/p&gt;  &lt;p&gt;Refer to screenshots for detailed settings.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Basic Settings:&lt;/em&gt;     &lt;br /&gt;&lt;font face="courier new" size="2"&gt;Start with WAN: &amp;lt;checked&amp;gt;      &lt;br /&gt;Interface Type: TAP       &lt;br /&gt;Protocol: TCP       &lt;br /&gt;Port: 443       &lt;br /&gt;Firewall: Automatic       &lt;br /&gt;Authorization Mode: TLS       &lt;br /&gt;Extra HMAC authorization (tls-auth): Disabled       &lt;br /&gt;Client address pool: DHCP &amp;lt;checked&amp;gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;a href="http://lh6.ggpht.com/_fb84xkhr8q8/TX3UEWp_-6I/AAAAAAAAAGE/SUf1aBsYukw/s1600-h/tomato1%5B4%5D.png"&gt;&lt;img title="tomato1" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="484" alt="tomato1" src="http://lh3.ggpht.com/_fb84xkhr8q8/TX3UFemkKBI/AAAAAAAAAGI/Gg6ageCZIzk/tomato1_thumb%5B4%5D.png?imgmax=800" width="636" border="0" /&gt;&lt;/a&gt; &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Advanced Settings:      &lt;br /&gt;&lt;/em&gt;&lt;font face="Courier New" size="2"&gt;Poll Interval: 0      &lt;br /&gt;Direct clients to redirect internet traffic: &amp;lt;NOT checked&amp;gt;       &lt;br /&gt;Respond to DNS: &amp;lt;NOT checked&amp;gt;       &lt;br /&gt;Encryption cipher: Use Default       &lt;br /&gt;Compression: Adaptive       &lt;br /&gt;TLS Renegotiation Time: -1       &lt;br /&gt;Manage Client-Specific Options: &amp;lt;checked&amp;gt;       &lt;br /&gt;Allow Client&amp;lt;-&amp;gt;Client: &amp;lt;checked&amp;gt;       &lt;br /&gt;Allow Only These Clients: &amp;lt;NOT checked&amp;gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Custom Configuration**:      &lt;br /&gt;&lt;/em&gt;&lt;font face="courier new" size="2"&gt;script-security 3      &lt;br /&gt;auth-user-pass-verify /etc/verify.sh via-env&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;a href="http://lh6.ggpht.com/_fb84xkhr8q8/TX3UGbKjBbI/AAAAAAAAAGM/hUVqo3EcZZw/s1600-h/tomato2%5B1%5D.png"&gt;&lt;img title="tomato2" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="484" alt="tomato2" src="http://lh5.ggpht.com/_fb84xkhr8q8/TX3UHcO6V2I/AAAAAAAAAGQ/ffvyoz8tr2g/tomato2_thumb%5B1%5D.png?imgmax=800" width="631" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Keys&lt;/em&gt;     &lt;br /&gt;&lt;font face="Courier New" size="2"&gt;Certificate Authority: &amp;lt;paste contents of ca.crt&amp;gt;      &lt;br /&gt;Server Certificate: &amp;lt;paste contents of server.crt from -----BEGIN CERTIFICATE----- through-----END CERTIFICATE----- inclusive&amp;gt;       &lt;br /&gt;Server Key: &amp;lt;paste contents of server.key&amp;gt;       &lt;br /&gt;Diffie Hellman parameters: &amp;lt;paste contents of dh1024.pem&amp;gt;       &lt;br /&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_fb84xkhr8q8/TX3UIMOmE9I/AAAAAAAAAGU/pdFI13FgSOM/s1600-h/tomato3%5B1%5D.png"&gt;&lt;img title="tomato3" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="484" alt="tomato3" src="http://lh4.ggpht.com/_fb84xkhr8q8/TX3UJKQGTuI/AAAAAAAAAGY/h8idKaDm6S0/tomato3_thumb%5B1%5D.png?imgmax=800" width="507" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;All the above OpenVPN configuration options ultimately get stored in NVRAM. Tomato will dynamically generate the appropriate configuration file and keys/certificates in the “/tmp/etc/openvpn”&amp;#160; area based on these NVRAM values.&lt;/p&gt;  &lt;p&gt;If you were to SSH/Telnet in to the router, and issue an “&lt;font face="Courier New"&gt;nvram show | grep vpn_server1&lt;/font&gt;” command, you should see the various configuration values stored in NVRAM from above.&lt;/p&gt;  &lt;p&gt;The dynamically constructed files are as follows:&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" size="2"&gt;/tmp/etc/openvpn/server1/ [ca.crt | config.ovpn | dh.pem | server.crt | server.key]      &lt;br /&gt;/tmp/etc/openvpn/fw/server1-fw.sh&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;The &lt;font face="courier new"&gt;server1-fw.sh&lt;/font&gt; file contains the iptables entries.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_fb84xkhr8q8/TX3UJyBpi-I/AAAAAAAAAGc/0hE7wQyeOiQ/s1600-h/tomato%20generated%20vpn%20files%5B1%5D.png"&gt;&lt;img title="tomato generated vpn files" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="320" alt="tomato generated vpn files" src="http://lh6.ggpht.com/_fb84xkhr8q8/TX3UKqZqsEI/AAAAAAAAAGg/_NF04Boc_7I/tomato%20generated%20vpn%20files_thumb%5B1%5D.png?imgmax=800" width="338" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;**&lt;/u&gt;&lt;/strong&gt; You will notice the “Advanced” tab &amp;gt; “Custom Configuration” option for the Server VPN Tunnelling is populated with a &lt;font face="Courier New"&gt;script-security&lt;/font&gt; and &lt;font face="courier new"&gt;auth-user-pass-verify&lt;/font&gt; entry.&amp;#160; These options are adding an additional level of security by requiring the VPN client not only hold a valid keypair, but also present a valid username/password.&amp;#160; The client supplied username/password is provided to a custom script (that we must create) named verify.sh.&amp;#160; This script must return exit status 0 in order for the VPN client connection to be successful (assuming they had a valid keypair in the first place).&lt;/p&gt;  &lt;p&gt;Unfortunately the /tmp folder is erased and recreated every time the router is rebooted. (/etc is a symbolic link to /tmp/etc).&amp;#160; We need a mechanism to ensure shell scripts for custom authentication survive reboot. There are three options:&lt;/p&gt;  &lt;p&gt;1) enable the JFFS feature and essentially leverage the unused portion of the router's NVRAM and turn it in to a mountable and writable space &lt;a href="http://tomatousb.org/doc:jffs"&gt;http://tomatousb.org/doc:jffs&lt;/a&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;2) leverage init scripts in the tomato UI to recreate the various shell scripts required in the /tmp directory at boot time.&lt;/p&gt;  &lt;p&gt;3) use the &amp;quot;nvram setfile2nvram &amp;lt;filename&amp;gt;&amp;quot; command to save small files in nvram.&amp;#160; The files will be automatically restored on start-up.&lt;/p&gt;  &lt;p&gt;We will leverage the latter option (#3) for our custom authentication script; SSH/telnet in to the router as root and issue the following:&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;font face="Courier New" color="#0000a0" size="2"&gt;cd /etc&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000a0" size="2"&gt;cat &amp;gt; /etc/generate.sh &amp;lt;&amp;lt;EOF      &lt;br /&gt;#!/bin/sh&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000a0" size="2"&gt;HASHPASS=\`echo -n &amp;quot;\$1\$2&amp;quot; | md5sum | sed s'/\&amp;#160; -//'\`      &lt;br /&gt;i=0       &lt;br /&gt;while [ \$i -lt 10 ]; do       &lt;br /&gt;&amp;#160; HASHPASS=\`echo -n \$HASHPASS\$HASHPASS | md5sum | sed s'/\&amp;#160; -//'\`       &lt;br /&gt;&amp;#160; i=\`expr \$i + 1\`       &lt;br /&gt;done       &lt;br /&gt;echo \$1:\$HASHPASS       &lt;br /&gt;exit 1       &lt;br /&gt;EOF&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000a0" size="2"&gt;chmod 755 /etc/generate.sh&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000a0" size="2"&gt;nvram setfile2nvram /etc/generate.sh&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000a0" size="2"&gt;cat &amp;gt; /etc/verify.sh &amp;lt;&amp;lt;EOF      &lt;br /&gt;#!/bin/sh       &lt;br /&gt;# echo &amp;quot;\${username}&amp;quot;       &lt;br /&gt;hash=\`/etc/generate.sh &amp;quot;\${username}&amp;quot; &amp;quot;\${password}&amp;quot;\`&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000a0" size="2"&gt;USERS=\`cat /etc/vpnusers\`      &lt;br /&gt;for u in \$USERS; do       &lt;br /&gt;&amp;#160; test &amp;quot;\${hash}&amp;quot; == &amp;quot;\${u}&amp;quot; &amp;amp;&amp;amp; exit 0       &lt;br /&gt;done       &lt;br /&gt;exit 1       &lt;br /&gt;EOF&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000a0" size="2"&gt;chmod 755 /etc/verify.sh&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000a0" size="2"&gt;nvram setfile2nvram /etc/verify.sh&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;To generate password hashes for the users (first argument is username, second argument is password):&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000a0" size="2"&gt;/etc/generate.sh matt test1234 &amp;gt;&amp;gt; /etc/vpnusers&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Persist the vpnusers file:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000a0" size="2"&gt;nvram setfile2nvram /etc/vpnusers&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_fb84xkhr8q8/TX3ULWdBzcI/AAAAAAAAAGk/Wp8s5krAL7o/s1600-h/tomato4%5B1%5D.png"&gt;&lt;img title="tomato4" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="484" alt="tomato4" src="http://lh3.ggpht.com/_fb84xkhr8q8/TX3UMGZh2MI/AAAAAAAAAGo/3UZ9mN7IZ7s/tomato4_thumb%5B1%5D.png?imgmax=800" width="572" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;To test the verify script:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="2"&gt;export username=matt      &lt;br /&gt;export password=test1234       &lt;br /&gt;/etc/verify.sh       &lt;br /&gt;echo $?&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;If the output is 0 from the above command, the matt/test1234 credential was found in the vpnusers file.&amp;#160; If the output is 1, something is broken!&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;The hard part is now done. Reboot the router!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;The &lt;strong&gt;final&lt;/strong&gt; task is creation of the client configuration file and adding the client keypair and CA:&lt;/p&gt;  &lt;p&gt;1) Make a directory &amp;quot;&lt;font face="Courier New"&gt;config&lt;/font&gt;&amp;quot; under &amp;quot;&lt;font face="courier new"&gt;%ProgramFiles%\OpenVPN&lt;/font&gt;&amp;quot; if not already present.&lt;/p&gt;  &lt;p&gt;2) Within the &amp;quot;&lt;font face="Courier New"&gt;config&lt;/font&gt;&amp;quot; directory, make a subdirectory, e.g &amp;quot;&lt;font face="Courier New"&gt;homevpn&lt;/font&gt;&amp;quot;&lt;/p&gt;  &lt;p&gt;3) Copy to the &amp;quot;&lt;font face="Courier New"&gt;homevpn&lt;/font&gt;&amp;quot; directory &lt;font face="Courier New"&gt;ca.crt&lt;/font&gt;, and the appropriate client keypair (e.g. &lt;font face="Courier New"&gt;client_matt.key / client_matt.crt&lt;/font&gt;).&lt;/p&gt;  &lt;p&gt;4) Within the &amp;quot;&lt;font face="Courier New"&gt;config&lt;/font&gt;&amp;quot; directory, create an openvpn client config file, e.g. &amp;quot;&lt;font face="Courier New"&gt;homevpn.ovpn&lt;/font&gt;&amp;quot;; The contents of &amp;quot;&lt;font face="Courier New"&gt;homevpn.ovpn&lt;/font&gt;&amp;quot; based on the above server configuration above are as follows:&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;font face="Courier New" color="#000080" size="2"&gt;# The hostname/IP and port of the server. You can have multiple remote entries to load balance between the servers.      &lt;br /&gt;remote todayguesswhat.dyndns.org 443&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#000080" size="2"&gt;# Specify that we are a client and that we will be pulling certain config file directives from the server.      &lt;br /&gt;client&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#000080" size="2"&gt;ns-cert-type server&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#000080" size="2"&gt;# On most systems, the VPN will not function unless you partially or fully disable the firewall for the TUN/TAP interface.      &lt;br /&gt;dev tap21 &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#000080" size="2"&gt;# Are we connecting to a TCP or UDP server?      &lt;br /&gt;proto tcp&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#000080" size="2"&gt;# Keep trying indefinitely to resolve the host name of the OpenVPN server.&amp;#160; Useful for machines which are not permanently connected to the internet such as laptops.      &lt;br /&gt;resolv-retry infinite&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#000080" size="2"&gt;# Most clients don't need to bind to a specific local port number.      &lt;br /&gt;nobind&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#000080" size="2"&gt;# Try to preserve some state across restarts.      &lt;br /&gt;persist-key       &lt;br /&gt;persist-tun &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#000080" size="2"&gt;# --float tells OpenVPN to accept authenticated packets from any address, not only the address which was specified in the --remote option.      &lt;br /&gt;# Useful if you're using round-robin DNS.&amp;#160; Also useful if your server has a dynamic IP address which the ISP could change.       &lt;br /&gt;# I use float so I can connect from inside AND outside my router.       &lt;br /&gt;float&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#000080" size="2"&gt;# If the pushed routes appear not to be added on windows hosts, add the following:      &lt;br /&gt;# route-delay 30&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#000080" size="2"&gt;# SSL/TLS parms.      &lt;br /&gt;ca &amp;quot;C:\\Program Files\\OpenVPN\\config\\homevpn\\ca.crt&amp;quot;       &lt;br /&gt;cert &amp;quot;C:\\Program Files\\OpenVPN\\config\\homevpn\\client_matt.crt&amp;quot;       &lt;br /&gt;key &amp;quot;C:\\Program Files\\OpenVPN\\config\\homevpn\\client_matt.key&amp;quot;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#000080" size="2"&gt;# Enable compression on the VPN link.      &lt;br /&gt;# Don't enable this unless it is also       &lt;br /&gt;# enabled in the server config file.       &lt;br /&gt;comp-lzo&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#000080" size="2"&gt;# Set log file verbosity.      &lt;br /&gt;verb 3&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#000080" size="2"&gt;# Silence repeating messages      &lt;br /&gt;mute 20&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#000080" size="2"&gt;# prompt for username and password      &lt;br /&gt;auth-user-pass&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;You should hopefully now be able to establish a VPN connection!&amp;#160; Good luck.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2959498105239183642-5422240774388661023?l=todayguesswhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/5422240774388661023/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://todayguesswhat.blogspot.com/2011/03/quick-simple-vpn-setup-guide-using.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/5422240774388661023'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/5422240774388661023'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/2011/03/quick-simple-vpn-setup-guide-using.html' title='Quick &amp;amp; simple VPN setup guide: using OpenVPN on a ‘Tomato’ router'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_fb84xkhr8q8/TX3T4GJJGCI/AAAAAAAAAFQ/9nwmhyETc4o/s72-c/openvpn_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2959498105239183642.post-1645893313296815787</id><published>2011-02-10T16:33:00.001+10:00</published><updated>2011-03-14T09:12:50.152+10:00</updated><title type='text'>javac – file not found – wildcards and spaces in directory names</title><content type='html'>&lt;p&gt;Calling the javac command from Windows XP with the source files argument containing a wildcard in quotes – e.g. &lt;font face="Courier New" color="#0080ff"&gt;javac &amp;quot;*.java&amp;quot;&lt;/font&gt; will result in the error:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#ff0000"&gt;javac: file not found:&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Whereas with no quotes – e.g.&amp;#160; &lt;font face="Courier New" color="#0080ff"&gt;javac *.java&lt;/font&gt; , no error is produced.&lt;/p&gt;  &lt;p&gt;Consider a source files argument containing both a path and wildcard combined&amp;#160; – e.g. &lt;font face="Courier New" color="#0080ff"&gt;javac C:\temp\*.java &lt;/font&gt;, this is perfectly fine and no error is produced.&lt;/p&gt;  &lt;p&gt;The following however will fail –e.g. &lt;font face="Courier New" color="#0080ff"&gt;javac &amp;quot;C:\my documents\*.java&amp;quot;&lt;/font&gt; , due to the wildcard in quotes issue above.&lt;/p&gt;  &lt;p&gt;Some may argue that this is perfectly reasonable, given that java does not allow spaces in package names.&amp;#160; But what if the java files above in the “my documents” folder are top-level classes without&amp;#160; package qualification – such as the file below:&lt;/p&gt;  &lt;p&gt;e.g.&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new"&gt;class Test      &lt;br /&gt;{       &lt;br /&gt;&amp;#160; public static void main(String[] args)       &lt;br /&gt;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; System.out.println(&amp;quot;Hello World!&amp;quot;);       &lt;br /&gt;&amp;#160; }       &lt;br /&gt;}       &lt;br /&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Consider a simple java kit that you deliver to folks with the following structure:-&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;MyApplication\&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160; bin\compile.bat      &lt;br /&gt;&amp;#160; lib\utilities.jar       &lt;br /&gt;&amp;#160; lib\resources.jar       &lt;br /&gt;&amp;#160; src\com\acme\myapp\Main.java       &lt;br /&gt;&amp;#160; src\com\acme\myapp\utils\Utils.java       &lt;br /&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;If the kit above is extracted to some folder/directory without spaces, it should be pretty easy to compile from the command-line. Whereas if it were extracted to the standard Windows desktop location as shown below, more care must be taken:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;C:\Documents and Settings\Administrator\Desktop\MyApplication\&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160; bin\compile.bat      &lt;br /&gt;&amp;#160; lib\utilities.jar       &lt;br /&gt;&amp;#160; lib\resources.jar       &lt;br /&gt;&amp;#160; src\com\acme\myapp\Main.java       &lt;br /&gt;&amp;#160; src\com\acme\myapp\utils\Utils.java       &lt;br /&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;One will not be able to run &lt;font color="#0080ff"&gt;javac &amp;quot;C:\Documents and Settings\Administrator\Desktop\MyApplication\src\com\acme\myapp\*.java&amp;quot;&lt;/font&gt; .&amp;#160; They must instead change directory to an appropriate location whereby the javac source files argument can be supplied without including quotes.&amp;#160; For example:&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0080ff"&gt;cd /D &amp;quot;C:\Documents and Settings\Administrator\Desktop\MyApplication&amp;quot;      &lt;br /&gt;javac src\com\acme\myapp\*.java&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;Below is a sample windows java compile batch script that I’ve created that should work with the application structure above regardless of what destination directory the kit is extracted to:-&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;&lt;u&gt;compile.bat&lt;/u&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800080" size="2"&gt;@ECHO off&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800080" size="2"&gt;REM Changes made to an Environment Variable after SETLOCAL has been issued are local to the batch file.      &lt;br /&gt;REM Issuing an ENDLOCAL command will restore the previous environment variables.       &lt;br /&gt;SETLOCAL&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800080" size="2"&gt;REM Commands      &lt;br /&gt;SET JAVACMPCMD=%JAVA_HOME%\bin\javac.exe       &lt;br /&gt;SET JARCMD=%JAVA_HOME%\bin\jar.exe&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800080" size="2"&gt;REM library files and source location      &lt;br /&gt;SET PROJECT_LIB=%~dp0..\lib       &lt;br /&gt;SET PROJECT_SRC=%~dp0..\src       &lt;br /&gt;REM source base package path       &lt;br /&gt;SET BASE_PKG_PATH=%PROJECT_SRC%\com\acme\myapp&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800080" size="2"&gt;REM classes directory      &lt;br /&gt;SET PROJECT_CLASSES=%~dp0..\classes&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800080" size="2"&gt;REM generated library destination path and file      &lt;br /&gt;SET DEST_JAR_FILE=%~dp0..\myapp.jar&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800080" size="2"&gt;REM classpath for compilation      &lt;br /&gt;SET CP=%PROJECT_LIB%\utilities.jar;%PROJECT_LIB%\resources.jar&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800080" size="2"&gt;REM ************      &lt;br /&gt;REM MAIN PROGRAM       &lt;br /&gt;REM ************&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800080" size="2"&gt;REM Verify whether required variables are set      &lt;br /&gt;IF &amp;quot;%JAVA_HOME%x&amp;quot;==&amp;quot;x&amp;quot; GOTO errjava&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800080" size="2"&gt;REM Preparation ...      &lt;br /&gt;IF EXIST &amp;quot;%DEST_JAR_FILE%&amp;quot; DEL /q &amp;quot;%DEST_JAR_FILE%&amp;quot;       &lt;br /&gt;IF EXIST &amp;quot;%PROJECT_CLASSES%&amp;quot; RMDIR /s /q &amp;quot;%PROJECT_CLASSES%&amp;quot;       &lt;br /&gt;MKDIR &amp;quot;%PROJECT_CLASSES%&amp;quot;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800080" size="2"&gt;ECHO.      &lt;br /&gt;ECHO Compiling code ...&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800080" size="2"&gt;PUSHD &amp;quot;%BASE_PKG_PATH%&amp;quot;      &lt;br /&gt;&amp;quot;%JAVACMPCMD%&amp;quot; -target 1.6 -classpath &amp;quot;%CP%&amp;quot; -d &amp;quot;%PROJECT_CLASSES%&amp;quot; *.java utils\*.java       &lt;br /&gt;SET ERR=%ERRORLEVEL%       &lt;br /&gt;POPD       &lt;br /&gt;IF NOT &amp;quot;%ERR%&amp;quot;==&amp;quot;0&amp;quot; GOTO errcomp&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800080" size="2"&gt;ECHO.      &lt;br /&gt;ECHO Creating jar file ...&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800080" size="2"&gt;&amp;quot;%JARCMD%&amp;quot; cfM &amp;quot;%DEST_JAR_FILE%&amp;quot; -C &amp;quot;%PROJECT_CLASSES%/&amp;quot; .      &lt;br /&gt;IF NOT &amp;quot;%ERRORLEVEL%&amp;quot;==&amp;quot;0&amp;quot; GOTO errjar&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800080" size="2"&gt;REM Cleanup ...      &lt;br /&gt;RMDIR /s /q &amp;quot;%PROJECT_CLASSES%&amp;quot;       &lt;br /&gt;GOTO end&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800080" size="2"&gt;REM JAVA_HOME is not set      &lt;br /&gt;:errjava       &lt;br /&gt;ECHO.       &lt;br /&gt;ECHO Set the following environment variables:       &lt;br /&gt;ECHO.       &lt;br /&gt;ECHO JAVA_HOME&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (Absolute path to jdk directory)       &lt;br /&gt;GOTO end&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800080" size="2"&gt;:errcomp      &lt;br /&gt;ECHO.       &lt;br /&gt;ECHO Compilation did not succeed.       &lt;br /&gt;ECHO Note: If receiving read errors, ensure folder path does not contain whitespace.       &lt;br /&gt;GOTO end&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800080" size="2"&gt;:errjar      &lt;br /&gt;ECHO.       &lt;br /&gt;ECHO Jar creation did not succeed.       &lt;br /&gt;GOTO end&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800080" size="2"&gt;:end      &lt;br /&gt;ECHO.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800080" size="2"&gt;&amp;#160;&lt;/font&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2959498105239183642-1645893313296815787?l=todayguesswhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/1645893313296815787/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://todayguesswhat.blogspot.com/2011/02/javac-file-not-found-wildcards-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/1645893313296815787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/1645893313296815787'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/2011/02/javac-file-not-found-wildcards-and.html' title='javac – file not found – wildcards and spaces in directory names'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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-2959498105239183642.post-354119724937136399</id><published>2011-01-08T13:38:00.001+10:00</published><updated>2011-01-08T13:38:49.060+10:00</updated><title type='text'>vi – range replace – indent block of lines</title><content type='html'>&lt;p&gt;example 1: &lt;/p&gt;  &lt;p&gt;from line 10 through 50, insert two spaces at the start of the line&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff"&gt;&lt;em&gt;&amp;lt;esc&amp;gt;&lt;/em&gt;:10,50s/^/&amp;#160; /      &lt;br /&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;example 2: &lt;/p&gt;  &lt;p&gt;from line 10 through 50, replace the two spaces at the start of the line with empty&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff"&gt;&lt;em&gt;&amp;lt;esc&amp;gt;&lt;/em&gt;:10,50s/^&amp;#160; //&lt;/font&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2959498105239183642-354119724937136399?l=todayguesswhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/354119724937136399/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://todayguesswhat.blogspot.com/2011/01/vi-range-replace-indent-block-of-lines.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/354119724937136399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/354119724937136399'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/2011/01/vi-range-replace-indent-block-of-lines.html' title='vi – range replace – indent block of lines'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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-2959498105239183642.post-4615718845708220859</id><published>2010-12-29T09:51:00.001+10:00</published><updated>2010-12-29T09:52:22.954+10:00</updated><title type='text'>Additional Batch PDFill AutoIt Scripts</title><content type='html'>&lt;p&gt;&lt;strong&gt;Merge all JPG image files in the source directory to a single PDF file in the output directory:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;; Script by Matt Shannon - Dec 2010&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;$srcDirectory = 'C:\Documents and Settings\Administrator\Desktop\source'     &lt;br /&gt;$destDirectory = 'C:\Documents and Settings\Administrator\Desktop\output'&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;; change current directory to src directory     &lt;br /&gt;FileChangeDir($srcDirectory)      &lt;br /&gt;$search = FileFindFirstFile(&amp;quot;*.jpg&amp;quot;)&amp;#160; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;If $search = -1 Then     &lt;br /&gt;&amp;#160; MsgBox(0, &amp;quot;Error&amp;quot;, &amp;quot;No files/directories matched the search pattern&amp;quot;)      &lt;br /&gt;&amp;#160; Exit      &lt;br /&gt;EndIf&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;RunPDFill()&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;$dest = ''&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;While 1     &lt;br /&gt;&amp;#160; $file = FileFindNextFile($search)      &lt;br /&gt;&amp;#160; If @error Then ExitLoop      &lt;br /&gt;&amp;#160; ; MsgBox(4096, &amp;quot;File:&amp;quot;, $file)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; $dest = StringReplace($file, &amp;quot;.jpg&amp;quot;, -1, 0) &amp;amp; &amp;quot;.pdf&amp;quot;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; AddImg($srcDirectory, $file)     &lt;br /&gt;&amp;#160; &lt;br /&gt;WEnd&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;; Close the search handle     &lt;br /&gt;FileClose($search)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;SaveToPDF($destDirectory, $dest)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;Func RunPDFill()&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; Run('C:\Program Files\PlotSoft\PDFill\PDFill_PDF_Tools.exe', &amp;quot;&amp;quot;, @SW_MAXIMIZE)     &lt;br /&gt;&amp;#160; WinWaitActive(&amp;quot;[REGEXPTITLE:PDFill PDF Tools 7.0.*]&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; ControlClick(&amp;quot;[REGEXPTITLE:PDFill PDF Tools 7.0.*]&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;[CLASS:Button; TEXT: 9. Convert Images to PDF]&amp;quot;)     &lt;br /&gt;&amp;#160; WinWaitActive(&amp;quot;[TITLE:Free PDF Tools: Convert images to PDF]&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; ; set paper size output to A4     &lt;br /&gt;&amp;#160; ControlClick(&amp;quot;[TITLE:Free PDF Tools: Convert images to PDF]&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;[CLASS:ComboBox; INSTANCE:1]&amp;quot;)      &lt;br /&gt;&amp;#160; Send(&amp;quot;A{ENTER}&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; ; set margins to 0     &lt;br /&gt;&amp;#160; ControlClick(&amp;quot;[TITLE:Free PDF Tools: Convert images to PDF]&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;[CLASS:Edit; INSTANCE:3]&amp;quot;)      &lt;br /&gt;&amp;#160; Send(&amp;quot;{HOME}{SHIFTDOWN}{END}{SHIFTUP}{DEL}0&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; ControlClick(&amp;quot;[TITLE:Free PDF Tools: Convert images to PDF]&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;[CLASS:Edit; INSTANCE:4]&amp;quot;)     &lt;br /&gt;&amp;#160; Send(&amp;quot;{HOME}{SHIFTDOWN}{END}{SHIFTUP}{DEL}0&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; ControlClick(&amp;quot;[TITLE:Free PDF Tools: Convert images to PDF]&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;[CLASS:Edit; INSTANCE:5]&amp;quot;)     &lt;br /&gt;&amp;#160; Send(&amp;quot;{HOME}{SHIFTDOWN}{END}{SHIFTUP}{DEL}0&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; ControlClick(&amp;quot;[TITLE:Free PDF Tools: Convert images to PDF]&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;[CLASS:Edit; INSTANCE:6]&amp;quot;)     &lt;br /&gt;&amp;#160; Send(&amp;quot;{HOME}{SHIFTDOWN}{END}{SHIFTUP}{DEL}0&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;EndFunc&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;Func AddImg($srcdir, $srcfile)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; ; add an image     &lt;br /&gt;&amp;#160; ControlClick(&amp;quot;[TITLE:Free PDF Tools: Convert images to PDF]&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;[CLASS:Button; TEXT:Add an Image]&amp;quot;)      &lt;br /&gt;&amp;#160; WinWaitActive(&amp;quot;[TITLE:Select Image files to add into PDF]&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; ; send image location followed by enter     &lt;br /&gt;&amp;#160; ControlClick(&amp;quot;[TITLE:Select Image files to add into PDF]&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;[CLASS:Edit; INSTANCE:1]&amp;quot;)      &lt;br /&gt;&amp;#160; Send($srcdir &amp;amp; &amp;quot;\&amp;quot; &amp;amp; $srcfile &amp;amp; &amp;quot;{ENTER}&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; ; wait for window to return     &lt;br /&gt;&amp;#160; WinWaitActive(&amp;quot;[TITLE:Free PDF Tools: Convert images to PDF]&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;EndFunc &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;Func SaveToPDF($destdir, $destfile)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; ; click save-as     &lt;br /&gt;&amp;#160; ControlClick(&amp;quot;[TITLE:Free PDF Tools: Convert images to PDF]&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;[CLASS:Button; TEXT:Save As ...]&amp;quot;)      &lt;br /&gt;&amp;#160; WinWaitActive(&amp;quot;[TITLE:Save all the images as ... ]&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; ; send pdf output location followed by enter     &lt;br /&gt;&amp;#160; ControlClick(&amp;quot;[TITLE:Save all the images as ... ]&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;[CLASS:Edit; INSTANCE:1]&amp;quot;)      &lt;br /&gt;&amp;#160; Send($destdir &amp;amp; &amp;quot;\&amp;quot; &amp;amp; $destfile &amp;amp; &amp;quot;{ENTER}&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; ; wait for adobe to open - and then close it down     &lt;br /&gt;&amp;#160; WinWaitActive(&amp;quot;[TITLE:&amp;quot; &amp;amp; $destfile &amp;amp; &amp;quot; - Adobe Reader]&amp;quot;)      &lt;br /&gt;&amp;#160; WinClose(&amp;quot;[TITLE:&amp;quot; &amp;amp; $destfile &amp;amp; &amp;quot; - Adobe Reader]&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; ; wait for pdf image tools to return - and then close it down     &lt;br /&gt;&amp;#160; WinWaitActive(&amp;quot;[TITLE:Free PDF Tools: Convert images to PDF]&amp;quot;)      &lt;br /&gt;&amp;#160; WinClose(&amp;quot;[TITLE:Free PDF Tools: Convert images to PDF]&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; ; wait for main pdf tools to return - and then close it down     &lt;br /&gt;&amp;#160; WinWaitActive(&amp;quot;[REGEXPTITLE:PDFill PDF Tools 7.0.*]&amp;quot;)      &lt;br /&gt;&amp;#160; WinClose(&amp;quot;[REGEXPTITLE:PDFill PDF Tools 7.0.*]&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;EndFunc &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Merge all PDF files in the source directory to a single PDF file in the output directory:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;; Script by Matt Shannon - Dec 2010&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;$srcDirectory = 'C:\Documents and Settings\Administrator\Desktop\source'     &lt;br /&gt;$destDirectory = 'C:\Documents and Settings\Administrator\Desktop\output'&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;; change current directory to src directory     &lt;br /&gt;FileChangeDir($srcDirectory)      &lt;br /&gt;$search = FileFindFirstFile(&amp;quot;*.pdf&amp;quot;)&amp;#160; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;If $search = -1 Then     &lt;br /&gt;&amp;#160; MsgBox(0, &amp;quot;Error&amp;quot;, &amp;quot;No files/directories matched the search pattern&amp;quot;)      &lt;br /&gt;&amp;#160; Exit      &lt;br /&gt;EndIf&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;RunPDFill()&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;$dest = ''&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;While 1     &lt;br /&gt;&amp;#160; $file = FileFindNextFile($search)      &lt;br /&gt;&amp;#160; If @error Then ExitLoop      &lt;br /&gt;&amp;#160; ; MsgBox(4096, &amp;quot;File:&amp;quot;, $file)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; $dest = StringReplace($file, &amp;quot;.pdf&amp;quot;, -1, 0) &amp;amp; &amp;quot;_merged.pdf&amp;quot;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; AddPdf($srcDirectory, $file)     &lt;br /&gt;&amp;#160; &lt;br /&gt;WEnd&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;; Close the search handle     &lt;br /&gt;FileClose($search)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;SaveToPDF($destDirectory, $dest)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;Func RunPDFill()&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; Run('C:\Program Files\PlotSoft\PDFill\PDFill_PDF_Tools.exe', &amp;quot;&amp;quot;, @SW_MAXIMIZE)     &lt;br /&gt;&amp;#160; WinWaitActive(&amp;quot;[REGEXPTITLE:PDFill PDF Tools 7.0.*]&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; ControlClick(&amp;quot;[REGEXPTITLE:PDFill PDF Tools 7.0.*]&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;[CLASS:Button; TEXT: 1. Merge PDF Files]&amp;quot;)     &lt;br /&gt;&amp;#160; WinWaitActive(&amp;quot;[TITLE:Free PDF Tools: Merge PDF Files]&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;EndFunc&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;Func AddPdf($srcdir, $srcfile)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; ; Add a PDF File     &lt;br /&gt;&amp;#160; ControlClick(&amp;quot;[TITLE:Free PDF Tools: Merge PDF Files]&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;[CLASS:Button; TEXT:Add a PDF File]&amp;quot;)      &lt;br /&gt;&amp;#160; WinWaitActive(&amp;quot;[TITLE:Add PDF files to be Concated]&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; ; send image location followed by enter     &lt;br /&gt;&amp;#160; ControlClick(&amp;quot;[TITLE:Add PDF files to be Concated]&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;[CLASS:Edit; INSTANCE:1]&amp;quot;)      &lt;br /&gt;&amp;#160; Send($srcdir &amp;amp; &amp;quot;\&amp;quot; &amp;amp; $srcfile &amp;amp; &amp;quot;{ENTER}&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; ; wait for window to return     &lt;br /&gt;&amp;#160; WinWaitActive(&amp;quot;[TITLE:Free PDF Tools: Merge PDF Files]&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;EndFunc &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;Func SaveToPDF($destdir, $destfile)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; ; click save-as     &lt;br /&gt;&amp;#160; ControlClick(&amp;quot;[TITLE:Free PDF Tools: Merge PDF Files]&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;[CLASS:Button; TEXT:Save As ...]&amp;quot;)      &lt;br /&gt;&amp;#160; WinWaitActive(&amp;quot;[TITLE:Save the concated file as ... ]&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; ; send pdf output location followed by enter     &lt;br /&gt;&amp;#160; ControlClick(&amp;quot;[TITLE:Save the concated file as ... ]&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;[CLASS:Edit; INSTANCE:1]&amp;quot;)      &lt;br /&gt;&amp;#160; Send($destdir &amp;amp; &amp;quot;\&amp;quot; &amp;amp; $destfile &amp;amp; &amp;quot;{ENTER}&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; ; wait for adobe to open - and then close it down     &lt;br /&gt;&amp;#160; WinWaitActive(&amp;quot;[TITLE:&amp;quot; &amp;amp; $destfile &amp;amp; &amp;quot; - Adobe Reader]&amp;quot;)      &lt;br /&gt;&amp;#160; WinClose(&amp;quot;[TITLE:&amp;quot; &amp;amp; $destfile &amp;amp; &amp;quot; - Adobe Reader]&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; ; wait for pdf image tools to return - and then close it down     &lt;br /&gt;&amp;#160; WinWaitActive(&amp;quot;[TITLE:Free PDF Tools: Merge PDF Files]&amp;quot;)      &lt;br /&gt;&amp;#160; WinClose(&amp;quot;[TITLE:Free PDF Tools: Merge PDF Files]&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; ; wait for main pdf tools to return - and then close it down     &lt;br /&gt;&amp;#160; WinWaitActive(&amp;quot;[REGEXPTITLE:PDFill PDF Tools 7.0.*]&amp;quot;)      &lt;br /&gt;&amp;#160; WinClose(&amp;quot;[REGEXPTITLE:PDFill PDF Tools 7.0.*]&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;EndFunc &lt;/font&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2959498105239183642-4615718845708220859?l=todayguesswhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/4615718845708220859/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://todayguesswhat.blogspot.com/2010/12/additional-batch-pdfill-autoit-scripts.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/4615718845708220859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/4615718845708220859'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/2010/12/additional-batch-pdfill-autoit-scripts.html' title='Additional Batch PDFill AutoIt Scripts'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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-2959498105239183642.post-6047826964870523372</id><published>2010-12-24T13:57:00.001+10:00</published><updated>2010-12-24T13:57:59.699+10:00</updated><title type='text'>Batch Convert Images to PDF using PDFill and AutoIt</title><content type='html'>&lt;p&gt;I’m in the processing of completely digitalizing my filing cabinet and shredding all but the most important paper-based records. I recently purchased a Canon PIXMA MX870 Multifunction printer/scanner unit purely for its Auto Document Feeder with duplex scanning support. It turns out, the ADF duplex support isn’t all I had hoped with it regularly complaining about paper jams.&amp;#160; This really irritates me Canon! I’m furious actually.&lt;/p&gt;  &lt;p&gt;Anyway back to the digital filing cabinet …&lt;/p&gt;  &lt;p&gt;I’m leveraging three really cool pieces of software:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;FileCenter by Lucion &lt;a href="http://lucion.com/filecenter-overview.html"&gt;http://lucion.com/filecenter-overview.html&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;PDFill PDF tools (FREE) by PlotSoft&amp;#160; &lt;a href="http://www.pdfill.com/pdf_tools_free.html"&gt;http://www.pdfill.com/pdf_tools_free.html&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;AutoIt&amp;#160; &lt;a href="http://www.autoitscript.com/autoit3"&gt;http://www.autoitscript.com/autoit3&lt;/a&gt;&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;FileCenter is providing the interface to my new digital filing cabinet providing file management capabilities along with scanning and OCR (optical character recognition) features. It has a number of really useful bells and whistles including smart file (re)naming capabilities that really help with the overall organization of the filing cabinet. The standard edition which I initially purchased (on special now for $50) seems to do its job quite well.&amp;#160; The only downside is the supplied OCR engine is sometimes not up to the task. The FileCenter Pro Plus edition (on special now for $199) ships with an Advanced OCR engine that seems to have a much better job at extracting text from the various scans/images I supply it. I may persist with Standard Edition for a little longer as money is tight – but if Lucion want to give me a free upgrade please contact me :). Lucion provides a 30 day trial of FileCenter Pro Plus with no limitations whatsoever – so check it out. It’s a great piece of software.&lt;/p&gt;  &lt;p&gt;PDFill PDF tools are FREE and are without doubt some of the most useful and powerful tools I have ever come across. I use these tools regularly to do things like:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Merging PDF files together&lt;/li&gt;    &lt;li&gt;Reordering pages of PDF files&lt;/li&gt;    &lt;li&gt;Converting images to PDF&lt;/li&gt;    &lt;li&gt;Rotating PDF pages&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Whilst FileCenter appears to provide many of these capabilities, the level of customization and tweaking that the PDFill PDF tools provide is unmatched. The only downside to these tools is they are all GUI based requiring lots of clicks and user input and don’t appear to provide any command-line based control for doing tasks like batch conversion/processing.&lt;/p&gt;  &lt;p&gt;This is where the final piece of software “AutoIt v3” comes in to its own. The guys that wrote this are studs to release it for free.&amp;#160; This tool/scripting language allows one to construct little batch file/shell script like programs that can automatically control and interact with Windows applications without any end-user input required. Thus, I can write a little program for example that simulates mouse clicks and keyboard input from a user.&lt;/p&gt;  &lt;p&gt;I have a number a JPG image files that are essentially scans of various paper-based documents that I want to convert to PDF. PDFill provides a tool &amp;quot;Convert Images to PDF&amp;quot; that allows me to manually navigate to the appropriate source image, and then specify the output PDF file along with the PDF output page size / margins / image layout etc etc. This is quite a laborious repetitive task that I decided to automate by using an AutoIT v3 script.&lt;/p&gt;  &lt;p&gt;The script essentially searches for JPG files in a particular source directory, then iterates through each image file returned supplying it automatically to the PDFill tool. Appropriate output options / output file etc get set using a combination of automated mouse gestures and keyboard input. Upon conversion completion, the script detects Adobe Reader automatically launching to preview the output and closes it down.&lt;/p&gt;  &lt;p&gt;Without further adieu – I give you the automated batched PDFill conversion script :-&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" color="#0000ff"&gt;; Script by Matt Shannon - Dec 2010&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" color="#0000ff"&gt;$srcDirectory = 'C:\Documents and Settings\Administrator\Desktop\scans'     &lt;br /&gt;$destDirectory = 'C:\Documents and Settings\Administrator\Desktop\output'&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" color="#0000ff"&gt;; change current directory to src directory     &lt;br /&gt;FileChangeDir($srcDirectory)      &lt;br /&gt;$search = FileFindFirstFile(&amp;quot;*.jpg&amp;quot;)&amp;#160; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" color="#0000ff"&gt;If $search = -1 Then     &lt;br /&gt;&amp;#160; MsgBox(0, &amp;quot;Error&amp;quot;, &amp;quot;No files/directories matched the search pattern&amp;quot;)      &lt;br /&gt;&amp;#160; Exit      &lt;br /&gt;EndIf&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" color="#0000ff"&gt;While 1     &lt;br /&gt;&amp;#160; $file = FileFindNextFile($search)      &lt;br /&gt;&amp;#160; If @error Then ExitLoop      &lt;br /&gt;&amp;#160; ; MsgBox(4096, &amp;quot;File:&amp;quot;, $file)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" color="#0000ff"&gt;&amp;#160; $dest = StringReplace($file, &amp;quot;.jpg&amp;quot;, -1, 0) &amp;amp; &amp;quot;.pdf&amp;quot;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" color="#0000ff"&gt;&amp;#160; ConvertToPDF($srcDirectory, $file, $destDirectory, $dest)     &lt;br /&gt;&amp;#160; &lt;br /&gt;WEnd&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" color="#0000ff"&gt;; Close the search handle     &lt;br /&gt;FileClose($search)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" color="#0000ff"&gt;Func ConvertToPDF($srcdir, $srcfile, $destdir, $destfile)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" color="#0000ff"&gt;&amp;#160; Run('C:\Program Files\PlotSoft\PDFill\PDFill_PDF_Tools.exe', &amp;quot;&amp;quot;, @SW_MAXIMIZE)     &lt;br /&gt;&amp;#160; WinWaitActive(&amp;quot;[REGEXPTITLE:PDFill PDF Tools 7.0.*]&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" color="#0000ff"&gt;&amp;#160; ControlClick(&amp;quot;[REGEXPTITLE:PDFill PDF Tools 7.0.*]&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;[CLASS:Button; TEXT: 9. Convert Images to PDF]&amp;quot;)     &lt;br /&gt;&amp;#160; WinWaitActive(&amp;quot;[TITLE:Free PDF Tools: Convert images to PDF]&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" color="#0000ff"&gt;&amp;#160; ; set paper size output to A4     &lt;br /&gt;&amp;#160; ControlClick(&amp;quot;[TITLE:Free PDF Tools: Convert images to PDF]&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;[CLASS:ComboBox; INSTANCE:1]&amp;quot;)      &lt;br /&gt;&amp;#160; Send(&amp;quot;A{ENTER}&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" color="#0000ff"&gt;&amp;#160; ; set margins to 0     &lt;br /&gt;&amp;#160; ControlClick(&amp;quot;[TITLE:Free PDF Tools: Convert images to PDF]&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;[CLASS:Edit; INSTANCE:3]&amp;quot;)      &lt;br /&gt;&amp;#160; Send(&amp;quot;{HOME}{SHIFTDOWN}{END}{SHIFTUP}{DEL}0&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" color="#0000ff"&gt;&amp;#160; ControlClick(&amp;quot;[TITLE:Free PDF Tools: Convert images to PDF]&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;[CLASS:Edit; INSTANCE:4]&amp;quot;)     &lt;br /&gt;&amp;#160; Send(&amp;quot;{HOME}{SHIFTDOWN}{END}{SHIFTUP}{DEL}0&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" color="#0000ff"&gt;&amp;#160; ControlClick(&amp;quot;[TITLE:Free PDF Tools: Convert images to PDF]&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;[CLASS:Edit; INSTANCE:5]&amp;quot;)     &lt;br /&gt;&amp;#160; Send(&amp;quot;{HOME}{SHIFTDOWN}{END}{SHIFTUP}{DEL}0&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" color="#0000ff"&gt;&amp;#160; ControlClick(&amp;quot;[TITLE:Free PDF Tools: Convert images to PDF]&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;[CLASS:Edit; INSTANCE:6]&amp;quot;)     &lt;br /&gt;&amp;#160; Send(&amp;quot;{HOME}{SHIFTDOWN}{END}{SHIFTUP}{DEL}0&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" color="#0000ff"&gt;&amp;#160; ; add an image     &lt;br /&gt;&amp;#160; ControlClick(&amp;quot;[TITLE:Free PDF Tools: Convert images to PDF]&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;[CLASS:Button; TEXT:Add an Image]&amp;quot;)      &lt;br /&gt;&amp;#160; WinWaitActive(&amp;quot;[TITLE:Select Image files to add into PDF]&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" color="#0000ff"&gt;&amp;#160; ; send image location followed by enter     &lt;br /&gt;&amp;#160; ControlClick(&amp;quot;[TITLE:Select Image files to add into PDF]&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;[CLASS:Edit; INSTANCE:1]&amp;quot;)      &lt;br /&gt;&amp;#160; Send($srcdir &amp;amp; &amp;quot;\&amp;quot; &amp;amp; $srcfile &amp;amp; &amp;quot;{ENTER}&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" color="#0000ff"&gt;&amp;#160; ; wait for window to return     &lt;br /&gt;&amp;#160; WinWaitActive(&amp;quot;[TITLE:Free PDF Tools: Convert images to PDF]&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" color="#0000ff"&gt;&amp;#160; ; click save-as     &lt;br /&gt;&amp;#160; ControlClick(&amp;quot;[TITLE:Free PDF Tools: Convert images to PDF]&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;[CLASS:Button; TEXT:Save As ...]&amp;quot;)      &lt;br /&gt;&amp;#160; WinWaitActive(&amp;quot;[TITLE:Save all the images as ... ]&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" color="#0000ff"&gt;&amp;#160; ; send pdf output location followed by enter     &lt;br /&gt;&amp;#160; ControlClick(&amp;quot;[TITLE:Save all the images as ... ]&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;[CLASS:Edit; INSTANCE:1]&amp;quot;)      &lt;br /&gt;&amp;#160; Send($destdir &amp;amp; &amp;quot;\&amp;quot; &amp;amp; $destfile &amp;amp; &amp;quot;{ENTER}&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" color="#0000ff"&gt;&amp;#160; ; wait for adobe to open - and then close it down     &lt;br /&gt;&amp;#160; WinWaitActive(&amp;quot;[TITLE:&amp;quot; &amp;amp; $destfile &amp;amp; &amp;quot; - Adobe Reader]&amp;quot;)      &lt;br /&gt;&amp;#160; WinClose(&amp;quot;[TITLE:&amp;quot; &amp;amp; $destfile &amp;amp; &amp;quot; - Adobe Reader]&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" color="#0000ff"&gt;&amp;#160; ; wait for pdf image tools to return - and then close it down     &lt;br /&gt;&amp;#160; WinWaitActive(&amp;quot;[TITLE:Free PDF Tools: Convert images to PDF]&amp;quot;)      &lt;br /&gt;&amp;#160; WinClose(&amp;quot;[TITLE:Free PDF Tools: Convert images to PDF]&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" color="#0000ff"&gt;&amp;#160; ; wait for main pdf tools to return - and then close it down     &lt;br /&gt;&amp;#160; WinWaitActive(&amp;quot;[REGEXPTITLE:PDFill PDF Tools 7.0.*]&amp;quot;)      &lt;br /&gt;&amp;#160; WinClose(&amp;quot;[REGEXPTITLE:PDFill PDF Tools 7.0.*]&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" color="#0000ff"&gt;EndFunc &lt;/font&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2959498105239183642-6047826964870523372?l=todayguesswhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/6047826964870523372/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://todayguesswhat.blogspot.com/2010/12/batch-convert-images-to-pdf-using.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/6047826964870523372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/6047826964870523372'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/2010/12/batch-convert-images-to-pdf-using.html' title='Batch Convert Images to PDF using PDFill and AutoIt'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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-2959498105239183642.post-8373944088778325381</id><published>2010-11-26T10:02:00.001+10:00</published><updated>2010-11-26T10:12:32.130+10:00</updated><title type='text'>I repaired my Lelit Combi PL042QE coffee machine</title><content type='html'>&lt;p&gt;Today I finally got some free time to look at the Lelit coffee machine. It had stopped working a few weeks back with a complete loss of power. At the time, I remember thinking the machine was extremely hot and suspected the worse.&amp;#160; None of the lights on the front (power etc) would subsequently activate and I was expecting some costly repairs. I sent an email to Alan Frew from coffeeco where the machine was originally purchased (I’m the second owner).&amp;#160; Alan quickly responded with a useful link to his website for steps on troubleshooting:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.coffeeco.com.au/articles/repair.html"&gt;http://www.coffeeco.com.au/articles/repair.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Unfortunately, according to Alan’s flow chart “When I turn it on nothing happens” indicates “Your problem is serious. Return your machine for expert service”.&amp;#160; &lt;/p&gt;  &lt;p&gt;Anyway, I decided to pull the machine apart (which ultimately takes the removal of just 2 screws), to see if I could spot something visually that could indicate the cause. &lt;/p&gt;  &lt;p&gt;Nothing!&lt;/p&gt;  &lt;p&gt;Next, I did a search on google for multimeter and Lelit coffee machine to see if someone much smarter than I had done similar troubleshooting in the past.&lt;/p&gt;  &lt;p&gt;Nothing!&lt;/p&gt;  &lt;p&gt;I finally stumbled on an excellent guide for troubleshooting Rancilio Silvia machines &lt;a href="http://www.coffeegeek.com/forums/espresso/machines/312139"&gt;http://www.coffeegeek.com/forums/espresso/machines/312139&lt;/a&gt; which gave me a basis to get started.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;BEFORE CONTINUING – ENSURE THE MACHINE IS COMPLETELY DISCONNECTED FROM THE POWER SOURCE&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The Lelit that I’m in possession of is fitted with three thermostats:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;95°C thermostat for coffee &lt;/li&gt;    &lt;li&gt;125°C thermostat for steam &lt;/li&gt;    &lt;li&gt;165°C thermostat for safety over-temperature cut-off (red push button) &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;I first set my cheap $20 DickSmith multimeter to test for continuity. I set test leads on each side of the thermostat (having removed the active (brown)/netural (blue) cables). The buzzer sounded on each thermostat (which for my multimeter indicates the resistance is less than 70&lt;span id="main" style="visibility: visible"&gt;&lt;span id="search" style="visibility: visible"&gt;Ω). Pulling the little red push button upwards on the 165°C thermostat causes the buzzer to stop indicating an open circuit (which is expected).&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="visibility: visible"&gt;&lt;span style="visibility: visible"&gt;Just to be doubly sure that the thermostats appeared to be good (and not measuring more than a few ohms), I set the multimeter to measure resistance.&amp;#160; There is a note in the manual of my multimeter stating to short-circuit the test leads/input terminals before taking measurements where low-resistance precise measurement is required and record the resulting value. The value should then be subtracted from the measurement obtained when testing the particular object in question. Taking the above adjustment in to account, the resistance readings for the 95, 125, and 165 thermostats were 0.1, 0.1, and 1.x ohms respectively – all well within the “few” ohms range. The fact that the 165 thermostat was reading slightly higher had me wondering whether it was possibly bad??&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="visibility: visible"&gt;&lt;span style="visibility: visible"&gt;&lt;a href="http://lh6.ggpht.com/_fb84xkhr8q8/TO75HFInDxI/AAAAAAAAAE0/ayqcPUdkYJ0/s1600-h/IMG_0163%5B13%5D.jpg"&gt;&lt;img title="IMG_0163" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="498" alt="IMG_0163" src="http://lh4.ggpht.com/_fb84xkhr8q8/TO75IptzzlI/AAAAAAAAAE8/rTD_Tqq94ck/IMG_0163_thumb%5B11%5D.jpg?imgmax=800" width="946" border="0" /&gt;&lt;/a&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="visibility: visible"&gt;&lt;span style="visibility: visible"&gt;Next, the Silvia troubleshooting article states to test the heating coil (element) by obtaining a resistance reading across the heater terminals. Once again we remove the connecting cables and perform our test against the bare terminals. The resistance reading across the heater terminals on my machine was 50&lt;span id="main" style="visibility: visible"&gt;&lt;span id="search" style="visibility: visible"&gt;Ω&lt;/span&gt;&lt;/span&gt; . Fantastic!!! It thus looks like I hadn’t burned my element out!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="visibility: visible"&gt;&lt;span style="visibility: visible"&gt;At this stage, I decided to give Alan a call suspecting that maybe it was the 165 thermostat that could be the issue.&amp;#160; I provided him the resistance readings from the thermostat and heater, and Alan seemed to think they were fine. He mentioned a few additional troubleshooting steps that I could perform, and also told me a story of how a customer the day before had brought in to the shop a $2000&amp;#160; coffee machine for servicing that had just stopped working. The machine that had died turned out just to have a faulty main power switch.&amp;#160; A faulty power switch I thought – surely that couldn’t be my issue - switches don’t just break.&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="visibility: visible"&gt;&lt;span style="visibility: visible"&gt;Anyway I persisted with my charge that it must be the thermostat and decided to find out if there was a simple way to bypass it to see if the machine would momentarily turn on (to prove the thermostat was the issue!).&amp;#160; It turns out it is as simple as (carefully) just shorting the thermostat’s two terminals with a wire to keep the circuit closed.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="visibility: visible"&gt;&lt;span style="visibility: visible"&gt;I gingerly shorted the two terminals of the thermostat and carefully plugged the machine in to the power source and pushed the main switch.&amp;#160; NOTE – my place is fitted with a residual current device (RDC) – also known as a safety switch.&amp;#160; I would not have attempted this without such a backup.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="visibility: visible"&gt;&lt;span style="visibility: visible"&gt;Nothing!&amp;#160; No lights.&amp;#160; Still broken.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;BEFORE CONTINUING – ENSURE THE MACHINE IS COMPLETELY DISCONNECTED FROM THE POWER SOURCE&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="visibility: visible"&gt;&lt;span style="visibility: visible"&gt;At this point with nothing to lose and facing the thought of packaging my machine up and getting it serviced by the professionals, I decided to test if the main switch could be the fault.&amp;#160; The switch fitted to the machine is a DPST (double pole, single throw) – meaning two separate circuits are controlled by the switch, and the switch can either be closed (on), or open (off).&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="visibility: visible"&gt;&lt;span style="visibility: visible"&gt;I set the multimeter back to continuity and inserted each lead in to the terminals controlling the active circuit (brown wires). The buzzer sounded as I flicked the switch from off to on. So this particular circuit was intact. I next inserted the leads in to the terminals controlling the neutral circuit(blue wires). This time, the buzzer would NOT sound as I repeatedly flicked the switch from on to off (and vice-versa).&amp;#160; Wow – the switch was broken!&amp;#160; Who would have thought?&amp;#160; Maybe Alan had intentionally mentioned this switch thing for a reason (in fact I bet he did!!!).&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;I decided to set the switch to the on position and remove the neutral connecting leads and manually short them together carefully using a wire. I once again plugged the machine in to the power source.&amp;#160; &lt;/p&gt;  &lt;p&gt;LIGHTS – ACTION.&lt;/p&gt;  &lt;p&gt;The boiler light came on and a bit of excess water spat out the tubes. It worked!&amp;#160; I quickly disconnected the power source.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;BEFORE CONTINUING – ENSURE THE MACHINE IS COMPLETELY DISCONNECTED FROM THE POWER SOURCE&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;OK – so the broken switch was the reason the machine would not power up. But what had caused the switch to break in the first place? The switch is easily removed by pushing the spring-like clips on the top/bottom of the switch whilst at the same time pushing from the rear so that it pops out the front of the machine. On inspection of the switch terminals, I could see the lower terminal that accepts the incoming neutral (blue) cable from the power source was slightly melted. Why this was, I do not know. The machine had been left on for quite a considerable time (90 minutes or so) without any use. I’ll have to wait and see if the issue reproduces – and if so, get the experts involved.&lt;/p&gt;  &lt;p&gt;The rocker switch itself is rated for 16A/250V AC and T120/55 (ambient temperature). Tracking down a replacement DPST switch in Australia with similar specs was proving reasonably tricky.&lt;/p&gt;  &lt;p&gt;I found the following rocker switch SCHURTER 1301.9224&amp;#160; (red illumination) that matched the specs perfectly. The green illumination model is 1301.9215.&amp;#160; Farnell (aka element14) sell both switches for about $5 each – but there is a minimum credit card order of $10 required and a 5 day wait. &lt;a href="http://au.element14.com"&gt;http://au.element14.com&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Jaycar also sells a similar switch – although it is a DPDT! &lt;a href="http://jaycar.com.au/productView.asp?ID=SK0982"&gt;http://jaycar.com.au/productView.asp?ID=SK0982&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Eager to get my coffee machine back in order, I decided to buy switches from both places.I picked the switch up from Jaycar and installed it, and everything appears to work perfectly. I have also ordered the Schurter 1301.9224 from element14, and if motivated will probably switch the Jaycar out and replace it.&lt;/p&gt;  &lt;p&gt;Below is a pic of before and after:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_fb84xkhr8q8/TO75Keg4w2I/AAAAAAAAAEs/BkDMv_EewPc/s1600-h/beforeafter%5B4%5D.jpg"&gt;&lt;img title="beforeafter" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="386" alt="beforeafter" src="http://lh6.ggpht.com/_fb84xkhr8q8/TO75LoA9hVI/AAAAAAAAAEw/eR2pELHnDeA/beforeafter_thumb%5B2%5D.jpg?imgmax=800" width="694" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;A big thankyou to both Alan Frew from coffeeco, and also Jim Galt (author of troubleshooting Rancilio Silvia post).&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2959498105239183642-8373944088778325381?l=todayguesswhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/8373944088778325381/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://todayguesswhat.blogspot.com/2010/11/i-repaired-my-lelit-combi-pl042qe.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/8373944088778325381'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/8373944088778325381'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/2010/11/i-repaired-my-lelit-combi-pl042qe.html' title='I repaired my Lelit Combi PL042QE coffee machine'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_fb84xkhr8q8/TO75IptzzlI/AAAAAAAAAE8/rTD_Tqq94ck/s72-c/IMG_0163_thumb%5B11%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2959498105239183642.post-5721468116895357538</id><published>2010-11-16T22:38:00.001+10:00</published><updated>2010-11-16T22:38:22.080+10:00</updated><title type='text'>Example cost of running a Tivo</title><content type='html'>&lt;p&gt;Tivo apparently draws 24W continuously. &lt;/p&gt;  &lt;p&gt;Origin energy here in QLD have a standard tariff of 21.351 cents/kWH&lt;/p&gt;  &lt;p&gt;365 days per year * 24 hours per day * .024 KW * .21351 $/kWH (Origin Energy) = $44.88 per year to run.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2959498105239183642-5721468116895357538?l=todayguesswhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/5721468116895357538/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://todayguesswhat.blogspot.com/2010/11/example-cost-of-running-tivo.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/5721468116895357538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/5721468116895357538'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/2010/11/example-cost-of-running-tivo.html' title='Example cost of running a Tivo'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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-2959498105239183642.post-5944822838527505207</id><published>2010-10-06T10:24:00.001+10:00</published><updated>2010-10-06T15:00:20.251+10:00</updated><title type='text'>Big Day Out Gold Coast 2011 Direct Ticket Link</title><content type='html'>&lt;p&gt;Tonight at midnight, the following link should become active:&lt;/p&gt;  &lt;p&gt;&lt;a href="https://shopping.bdotickets.com.au/bdo2011/venue_goldcoast.php"&gt;https://shopping.bdotickets.com.au/bdo2011/venue_goldcoast.php&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I suggest using the above link directly, rather than going to the bigdayout.com website (as it will be getting hammered)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_fb84xkhr8q8/TKwCYFGjr-I/AAAAAAAAAEc/gGGlnOHVBo0/s1600-h/bdo%5B2%5D.png"&gt;&lt;img title="bdo" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="119" alt="bdo" src="http://lh6.ggpht.com/_fb84xkhr8q8/TKwCYxHu_GI/AAAAAAAAAEg/7mhh9aW-DCc/bdo_thumb.png?imgmax=800" width="244" border="0" /&gt;&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/2959498105239183642-5944822838527505207?l=todayguesswhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/5944822838527505207/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://todayguesswhat.blogspot.com/2010/10/big-day-out-gold-coast-2011-direct.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/5944822838527505207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/5944822838527505207'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/2010/10/big-day-out-gold-coast-2011-direct.html' title='Big Day Out Gold Coast 2011 Direct Ticket Link'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_fb84xkhr8q8/TKwCYxHu_GI/AAAAAAAAAEg/7mhh9aW-DCc/s72-c/bdo_thumb.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2959498105239183642.post-9199086556881628926</id><published>2010-09-24T10:56:00.001+10:00</published><updated>2010-09-24T10:56:17.338+10:00</updated><title type='text'>IP Subnetting Manual Calculation</title><content type='html'>&lt;p&gt;Here is a nifty online subnetting calculator &lt;a href="http://www.subnet-calculator.com/"&gt;http://www.subnet-calculator.com/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;And here is an excellent doc that describes how the calculation is made &lt;a href="http://www.cisco.com/en/US/tech/tk365/technologies_tech_note09186a00800a67f5.shtml"&gt;http://www.cisco.com/en/US/tech/tk365/technologies_tech_note09186a00800a67f5.shtml&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Below are some manual calculations that I performed:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="2"&gt;The machines has an ip address 10.228.137.4, with assigned subnet mask 255.255.248.0&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="2"&gt;This IP addresses falls in the Network Class A range (1.0.0.0 - 127.255.255.255)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="2"&gt;Thus, it has a standard network mask of 255.0.0.0&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="2"&gt;Representing 255.255.248.0 in binary :-&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="2"&gt;(n = standard network mask)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="2"&gt;(s = subnet bits claimed)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="2"&gt;(h = available host bits)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="2"&gt;n&amp;#160;&amp;#160; n&amp;#160;&amp;#160; n&amp;#160;&amp;#160; n&amp;#160;&amp;#160; n&amp;#160;&amp;#160; n&amp;#160;&amp;#160; n&amp;#160;&amp;#160; n&amp;#160;&amp;#160;&amp;#160;&amp;#160; s&amp;#160;&amp;#160; s&amp;#160;&amp;#160; s&amp;#160;&amp;#160; s&amp;#160;&amp;#160; s&amp;#160;&amp;#160; s&amp;#160;&amp;#160; s&amp;#160;&amp;#160; s&amp;#160;&amp;#160;&amp;#160;&amp;#160; s&amp;#160;&amp;#160; s&amp;#160;&amp;#160; s&amp;#160;&amp;#160; s&amp;#160;&amp;#160; s&amp;#160;&amp;#160; h&amp;#160;&amp;#160; h&amp;#160;&amp;#160; h&amp;#160;&amp;#160;&amp;#160;&amp;#160; h&amp;#160;&amp;#160; h&amp;#160;&amp;#160; h&amp;#160;&amp;#160; h&amp;#160;&amp;#160; h&amp;#160;&amp;#160; h&amp;#160;&amp;#160; h&amp;#160;&amp;#160; h     &lt;br /&gt;128 064 032 016 008 004 002 001&amp;#160;&amp;#160; 128 064 032 016 008 004 002 001&amp;#160;&amp;#160; 128 064 032 016 008 004 002 001&amp;#160;&amp;#160; 128 064 032 016 008 004 002 001&amp;#160; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 255&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 255&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 128+64+32+16+8 = 248&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="2"&gt;meaning 13 bits (8 + 5) are now being repurposed for subnet bits     &lt;br /&gt;2^13 = 8192 maximum subnets&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="2"&gt;8 standard network mask bits + 13 repurposed bits = 21 mask bits in total.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="2"&gt;11 bits (3 + 8) remain for hosts     &lt;br /&gt;2^11 = 2048 ; &lt;/font&gt;&lt;font face="Courier New" size="2"&gt;subtract 1 for broadcast address; subtract 1 as host ids all 0 are now allowed; = 2046 hosts per subnet&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="2"&gt;# 21 mask bits activated, 11 bits remaining for host     &lt;br /&gt;n&amp;#160;&amp;#160; n&amp;#160;&amp;#160; n&amp;#160;&amp;#160; n&amp;#160;&amp;#160; n&amp;#160;&amp;#160; n&amp;#160;&amp;#160; n&amp;#160;&amp;#160; n&amp;#160;&amp;#160;&amp;#160;&amp;#160; s&amp;#160;&amp;#160; s&amp;#160;&amp;#160; s&amp;#160;&amp;#160; s&amp;#160;&amp;#160; s&amp;#160;&amp;#160; s&amp;#160;&amp;#160; s&amp;#160;&amp;#160; s&amp;#160;&amp;#160;&amp;#160;&amp;#160; s&amp;#160;&amp;#160; s&amp;#160;&amp;#160; s&amp;#160;&amp;#160; s&amp;#160;&amp;#160; s&amp;#160;&amp;#160; h&amp;#160;&amp;#160; h&amp;#160;&amp;#160; h&amp;#160;&amp;#160;&amp;#160;&amp;#160; h&amp;#160;&amp;#160; h&amp;#160;&amp;#160; h&amp;#160;&amp;#160; h&amp;#160;&amp;#160; h&amp;#160;&amp;#160; h&amp;#160;&amp;#160; h&amp;#160;&amp;#160; h      &lt;br /&gt;128 064 032 016 008 004 002 001&amp;#160;&amp;#160; 128 064 032 016 008 004 002 001&amp;#160;&amp;#160; 128 064 032 016 008 004 002 001&amp;#160;&amp;#160; 128 064 032 016 008 004 002 001&amp;#160; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="2"&gt;# representing 10.228.137.4 as binary     &lt;br /&gt;0&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 0&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 0&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 1&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 0&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="2"&gt;# leaving the host/subnet portion unchanged, zero out the host bits     &lt;br /&gt;0&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 0&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 0&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 0&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 0       &lt;br /&gt;# = 10.228.136.0&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="2"&gt;# leaving the host/subnet portion unchanged, replace host bits with all 1's     &lt;br /&gt;0&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 0&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 0&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 1&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 1       &lt;br /&gt;# = 10.228.143.255&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="2"&gt;thus current mask 255.255.248.0 using ip 10.228.137.4 falls is in the subnet with range 10.228.136.1 through 10.228.143.254     &lt;br /&gt;&lt;/font&gt;    &lt;br /&gt;&lt;font face="Courier New" size="2"&gt;given we have 21 mask bits (8 standard network mask bits + 13 repurposed bits) .. we could write the above subnet as...&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="2"&gt;10.228.136.0/21&lt;/font&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2959498105239183642-9199086556881628926?l=todayguesswhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/9199086556881628926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://todayguesswhat.blogspot.com/2010/09/ip-subnetting-manual-calculation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/9199086556881628926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/9199086556881628926'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/2010/09/ip-subnetting-manual-calculation.html' title='IP Subnetting Manual Calculation'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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-2959498105239183642.post-8767194579508890130</id><published>2010-09-21T13:03:00.002+10:00</published><updated>2010-09-22T08:24:03.750+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='owsm'/><category scheme='http://www.blogger.com/atom/ns#' term='saml'/><category scheme='http://www.blogger.com/atom/ns#' term='jdeveloper'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>JDeveloper 11gR1 - integrated WebLogic Server and OWSM</title><content type='html'>&lt;p&gt;Documented below are the steps/tips I have employed to get JDeveloper 11g1, embedded WebLogic Server, and WSM to play nicely (on Windows).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Tip 1 -&lt;/strong&gt; Ensure the ‘User Home Directory’ is free of whitespace.&lt;/p&gt; The user home directory contains the user's preferences for Oracle JDeveloper (in the system subdirectory).   &lt;br /&gt;  &lt;p&gt;On my XP machine, the user home directory for JDeveloper gets created under the %USERPROFILE% directory.&amp;#160; For example “&lt;font face="courier new" size="2"&gt;C:\Documents and Settings\Administrator\Application Data\JDeveloper&lt;/font&gt;”&lt;/p&gt;  &lt;p&gt;The whitespace in the directory path above I have found out can be bad news and may lead to an error such as:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="2"&gt;java.net.URISyntaxException: Illegal character in path at index 18: file:/C:/Documents and Settings/....&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;To determine existing value from within Oracle JDeveloper, go to the Help menu, select About, go to Properties tab, and view the value of &lt;font face="courier new" size="2"&gt;ide.user.dir&lt;/font&gt;.&amp;#160; &lt;/p&gt;  &lt;p&gt;There are a number of different ways to override the JDeveloper user home directory; I chose to leverage the &lt;font face="courier new" size="2"&gt;JDEV_USER_HOME&lt;/font&gt; environment variable, and set it to “&lt;font face="courier new" size="2"&gt;C:\JDeveloper&lt;/font&gt;”&lt;/p&gt;  &lt;p&gt;You can explicitly set the home environment variable by adding the following line in the &amp;lt;Middleware Home&amp;gt;\jdeveloper\jdev\bin/jdev.boot file:    &lt;br /&gt;ide.user.dir = &amp;lt;Path to preferred user directory&amp;gt;&lt;/p&gt;  &lt;p&gt;The user home directory can also be specified from the command line using this command:    &lt;br /&gt;jdev.exe -J-Dide.user.dir=&amp;lt;Path&amp;gt;&lt;/p&gt;  &lt;p&gt;The home directory can also be set based on the value of an environment variable.&lt;/p&gt;  &lt;p&gt;MW_HOME/jdeveloper/jdev/bin/jdev.boot contains an entry such as:    &lt;br /&gt;ide.user.dir.var = JDEV_USER_HOME, JDEV_USER_DIR&lt;/p&gt;  &lt;p&gt;This is the default variable(s) that Oracle JDeveloper will look for at startup to determine the home directory.    &lt;br /&gt;You can define or add any environment variable that Oracle JDeveloper should use. &lt;/p&gt;  &lt;p&gt;To set the value of an environment variable from Windows:&lt;/p&gt;  &lt;p&gt;1. From Control Panel, select System, Select the Advanced tab, and then click Environment Variables.    &lt;br /&gt;3. In the User Variables section, click New.     &lt;br /&gt;4. Add JDEV_USER_HOME, or the name you chose for ide.user.dir.var, as a user variable.     &lt;br /&gt;5. Set the value of this variable to your home directory (for example, N:\users\jdoe), and click OK.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Tip 2 – &lt;/strong&gt;Embedded / Integrated WebLogic Server (Re)Creation&lt;/p&gt;  &lt;p&gt;The first time a JEE project is run/debug from JDeveloper, the integrated WebLogic Server starts and provisions a domain named “DefaultDomain”.&lt;/p&gt;  &lt;p&gt;You can find it under the JDeveloper user home directory in the &lt;em&gt;systemXXXXXX&lt;/em&gt; folder; for example:&lt;/p&gt;  &lt;p&gt;C:\JDeveloper\system11.1.1.3.37.56.60\DefaultDomain&lt;/p&gt;  &lt;p&gt;If you ever mess things up,&amp;#160; or want to start from fresh (reverting any changes you may have performed– including users / groups / credential store settings / deployments etc), you just just remove the DefaultDomain directory.&amp;#160;&amp;#160; &lt;/p&gt; 1. Shutdown your IntegratedWeblogicServer (if running) and exit JDeveloper   &lt;br /&gt;2. Delete the &lt;em&gt;systemXXXXXX&lt;/em&gt;/DefaultDomain directory   &lt;br /&gt;  &lt;p&gt;The next time you run a JEE application, JDeveloper will recreate a fresh DefaultDomain for you.&lt;/p&gt;  &lt;p&gt;Alternatively, rather than waiting for a JEE application to get run, you can get JDeveloper to create the default domain straight up.    &lt;br /&gt;1. From the View menu, choose ApplicationServerNavigator     &lt;br /&gt;2. Right click on Application Servers / IntegratedWeblogicServer, select &amp;quot;Create Default Domain...&amp;quot;     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;The Integrated WebLogic server domain in JDeveloper is by default configured with:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="2"&gt;adrs_template      &lt;br /&gt;jsf_template       &lt;br /&gt;jrf_template       &lt;br /&gt;adf_logging_fine       &lt;br /&gt;oracle.ucm.ridc_template       &lt;br /&gt;wsmpm-config-template       &lt;br /&gt;wsmpm-template       &lt;br /&gt;oracle.wc_adrs_template_11.1.1       &lt;br /&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Tip 3 – &lt;/strong&gt;Credential Store and Keystore configuration in DefaultDomain of integrated WebLogic Server&lt;/p&gt;  &lt;p&gt;Note, DOMAIN_HOME below refers to %JDEV_USER_HOME%\system11.1.1.3.37.56.60\DefaultDomain&lt;/p&gt;  &lt;p&gt;The file %DOMAIN_HOME%\config\fmwconfig\jps-config.xml contains the various service provider types and actual instance/implementations of these configured for the domain.&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;serviceProviders&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;serviceProvider type=&amp;quot;CREDENTIAL_STORE&amp;quot; name=&amp;quot;credstoressp&amp;quot; class=&amp;quot;oracle.security.jps.internal.credstore.ssp.SspCredentialStoreProvider&amp;quot;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;description&amp;gt;SecretStore-based CSF Provider&amp;lt;/description&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/serviceProvider&amp;gt;     &lt;br /&gt;…     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;serviceProvider type=&amp;quot;KEY_STORE&amp;quot; name=&amp;quot;keystore.provider&amp;quot; class=&amp;quot;oracle.security.jps.internal.keystore.KeyStoreProvider&amp;quot;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;description&amp;gt;PKI Based Keystore Provider&amp;lt;/description&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;provider.property.name&amp;quot; value=&amp;quot;owsm&amp;quot;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/serviceProvider&amp;gt;     &lt;br /&gt;…     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/serviceProviders&amp;gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;serviceInstances&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!-- JPS Credential Store Service Instance --&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;serviceInstance name=&amp;quot;credstore&amp;quot; provider=&amp;quot;credstoressp&amp;quot; location=&amp;quot;./&amp;quot;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;description&amp;gt;File Based Credential Store Service Instance&amp;lt;/description&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/serviceInstance&amp;gt;     &lt;br /&gt;…     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!-- KeyStore Service Instance --&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;serviceInstance name=&amp;quot;keystore&amp;quot; provider=&amp;quot;keystore.provider&amp;quot; location=&amp;quot;./default-keystore.jks&amp;quot;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;description&amp;gt;Default JPS Keystore Service&amp;lt;/description&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;keystore.type&amp;quot; value=&amp;quot;JKS&amp;quot;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;keystore.csf.map&amp;quot; value=&amp;quot;oracle.wsm.security&amp;quot;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;keystore.pass.csf.key&amp;quot; value=&amp;quot;keystore-csf-key&amp;quot;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;keystore.sig.csf.key&amp;quot; value=&amp;quot;sign-csf-key&amp;quot;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;keystore.enc.csf.key&amp;quot; value=&amp;quot;enc-csf-key&amp;quot;/&amp;gt;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/serviceInstance&amp;gt;     &lt;br /&gt;…     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/serviceInstances&amp;gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;jpsContexts default=&amp;quot;default&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!-- This is the default JPS context. All the mendatory services and Login Modules must be configured in this default context --&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;jpsContext name=&amp;quot;default&amp;quot;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;serviceInstanceRef ref=&amp;quot;credstore&amp;quot;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;serviceInstanceRef ref=&amp;quot;keystore&amp;quot;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;serviceInstanceRef ref=&amp;quot;policystore.xml&amp;quot;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;serviceInstanceRef ref=&amp;quot;audit&amp;quot;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;serviceInstanceRef ref=&amp;quot;idstore.ldap&amp;quot;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/jpsContext&amp;gt;     &lt;br /&gt;…     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/jpsContexts&amp;gt; &lt;/p&gt;  &lt;p&gt;The credential store instance referenced above, is a wallet-based credential store (also referred to as a file-based credential store), and will essentially be referring to a file named &lt;strong&gt;cwallet.sso&lt;/strong&gt; in the same directory as the jps-config.xml file (%DOMAIN_HOME%\config\fmwconfig)&lt;/p&gt;  &lt;p&gt;The keystore instance referenced above is a “JKS” file-based keystore, named &lt;strong&gt;default-keystore.jks&lt;/strong&gt; , and found in the same directory as the jps-config.xml file (%DOMAIN_HOME%\config\fmwconfig)&lt;/p&gt;  &lt;p&gt;When DefaultDomain in the integrated WebLogic server is provisioned, &lt;strong&gt;cwallet.sso&lt;/strong&gt; is created, whereas &lt;strong&gt;default-keystore.jks&lt;/strong&gt; is not created!!&lt;/p&gt;  &lt;p&gt;You can leverage the &lt;font face="courier new" size="2"&gt;orapki&lt;/font&gt; command to get a basic listing of the cwallet.sso contents:&lt;/p&gt;  &lt;p&gt;C:\JDeveloper\system11.1.1.3.37.56.60\DefaultDomain\config\fmwconfig&amp;gt;&lt;/p&gt;  &lt;p&gt;c:\Oracle\Middleware\oracle_common\bin\orapki wallet display -wallet cwallet.sso&lt;/p&gt;  &lt;p&gt;Oracle PKI Tool : Version 11.1.1.2.0   &lt;br /&gt;Copyright (c) 2004, 2009, Oracle and/or its affiliates. All rights reserved.&lt;/p&gt;  &lt;p&gt;Requested Certificates:   &lt;br /&gt;User Certificates:    &lt;br /&gt;Oracle Secret Store entries:    &lt;br /&gt;Trusted Certificates:    &lt;br /&gt;Subject:&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; OU=Class 1 Public Primary Certification Authority,O=VeriSign\, Inc.,C=US    &lt;br /&gt;Subject:&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; OU=Secure Server Certification Authority,O=RSA Data Security\, Inc.,C=US    &lt;br /&gt;Subject:&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; CN=Entrust.net Secure Server Certification Authority,OU=(c) 1999 Entrust.net Limited,OU=www.entrust.net/CPS incorp. by ref. (limits liab.),O=Entrust.net,C=US    &lt;br /&gt;Subject:&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; CN=GTE CyberTrust Global Root,OU=GTE CyberTrust Solutions\, Inc.,O=GTE Corporation,C=US    &lt;br /&gt;Subject:&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; OU=Class 3 Public Primary Certification Authority,O=VeriSign\, Inc.,C=US    &lt;br /&gt;Subject:&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; CN=Entrust.net Secure Server Certification Authority,OU=(c) 2000 Entrust.net Limited,OU=www.entrust.net/SSL_CPS incorp. by ref. (limits liab.),O=Entrust.net    &lt;br /&gt;Subject:&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; OU=Class 2 Public Primary Certification Authority,O=VeriSign\, Inc.,C=US    &lt;br /&gt;Subject:&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; CN=Entrust.net Certification Authority (2048),OU=(c) 1999 Entrust.net Limited,OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.),O=Entrust.net&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Tip 4 – &lt;/strong&gt;Oracle WSM – SAML Policies (wss11_saml_token_with_message_protection_service_policy) / leveraging DefaultDomain of JDeveloper integrated WebLogic Server for testing&lt;/p&gt;  &lt;p&gt;&lt;a href="http://download.oracle.com/docs/cd/E14571_01/web.1111/b32511/setup_config.htm#BABJJBFF"&gt;http://download.oracle.com/docs/cd/E14571_01/web.1111/b32511/setup_config.htm#BABJJBFF&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ultimately both the Web Service, and the Web Service client need their own private/public key pair.&lt;/p&gt;  &lt;p&gt;Additionally, both client and service need to be able to verify each other's respective public certificate by traversing the certification path until a valid root CA certificate is obtained.&lt;/p&gt;  &lt;p&gt;Note:   &lt;br /&gt; - the client sends its public key to the service as part of the request.    &lt;br /&gt; - the client must obtain the server's public certificate; It can either be published in the WSDL with latest 11g OWSM release ( &lt;a href="http://download.oracle.com/docs/cd/E14571_01/web.1111/b32511/setup_config.htm#BABJCGBC"&gt;http://download.oracle.com/docs/cd/E14571_01/web.1111/b32511/setup_config.htm#BABJCGBC&lt;/a&gt; ), or, manually added to client's keystore and referenced through recipient key alias (ClientConstants.WSS_RECIPIENT_KEY_ALIAS).    &lt;br /&gt; - with SAML Policy, we must use the RSA key mechanism, the SHA-1 algorithm, and AES-128 bit encryption to satisfy the policy requirements for the key.&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;Three Approaches for generating private/public key pair:&lt;/p&gt;  &lt;p&gt;- Self-Signed Certificate (1)   &lt;br /&gt;- Signed using Oracle Demo Certificate Authority (2)    &lt;br /&gt;- Signed using traditional Certificate Authority (3) (such that, one whom is present in the JVM's cacerts [java keystore file])&lt;/p&gt;  &lt;p&gt;1) A self-signed certificate is a certificate in which the &amp;quot;issuer&amp;quot; entity and actual &amp;quot;subject&amp;quot; entity are the same.    &lt;br /&gt;In other words, a seft-signed certificate is a certificate where the &amp;quot;issuer&amp;quot; signs his own public key with his private key. &lt;/p&gt;  &lt;p&gt;2) Oracle Provides a Demo Certificate Authority (CertGenCA - also self-signed as all root CAs are)&lt;/p&gt;  &lt;p&gt;$WL_HOME/server/lib/CertGenCA.der (public certificate)   &lt;br /&gt;$WL_HOME/server/lib/CertGenCAKey.der (private key)&lt;/p&gt;  &lt;p&gt;keytool -printcert -file C:\Oracle\Middleware\wlserver_10.3\server\lib\CertGenCA.der&lt;/p&gt;  &lt;p&gt;Owner: CN=CertGenCAB, OU=FOR TESTING ONLY, O=MyOrganization, L=MyTown, ST=MyState, C=US   &lt;br /&gt;Issuer: CN=CertGenCAB, OU=FOR TESTING ONLY, O=MyOrganization, L=MyTown, ST=MyState, C=US    &lt;br /&gt;Serial number: 234b5559d1fa0f3ff5c82bdfed032a87    &lt;br /&gt;Valid from: Fri Oct 25 01:54:45 EST 2002 until: Wed Oct 26 01:54:45 EST 2022    &lt;br /&gt;Certificate fingerprints:    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MD5:&amp;#160; A2:18:4C:E0:1C:AB:82:A7:65:86:86:03:D0:B3:D8:FE    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; SHA1: F8:5D:49:A4:12:54:78:C7:BA:42:A7:14:3E:06:F5:1E:A0:D4:C6:59    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Signature algorithm name: MD5withRSA    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Version: 3    &lt;br /&gt;...&lt;/p&gt;  &lt;p&gt;3) JDK 1.6 out of the box ships with support for most of the standard/traditional Certificate Authorities (similar to what you would find in the Browser - VeriSign etc).   &lt;br /&gt;The public certificate of the CAs can be found in the cacerts file.    &lt;br /&gt;Additionally, one can import their own CA in to the cacerts (keystore) file.&lt;/p&gt;  &lt;p&gt;To view the list of CAs ...&lt;/p&gt;  &lt;p&gt;%JAVA_HOME%\bin\keytool -list -keystore %JAVA_HOME%\jre\lib\security\cacerts -storepass &amp;quot;changeit&amp;quot; –v   &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Taking the following scenario:&lt;/p&gt;  &lt;p&gt;1) Web Service deployed to an appropriate WebLogic server on some central Linux server   &lt;br /&gt;2) Testing a Web Service client app running from JDeveloper integrated WebLogic server on local Windows machine    &lt;br /&gt;3) Using the Oracle Demo Certificate Authority&lt;/p&gt;  &lt;p&gt;the following steps would be required:&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;font face="courier new" size="2"&gt;From Server Domain (where the Web Service is running)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" size="2"&gt;1) source $DOMAIN_HOME/bin/setDomainEnv.sh&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" size="2"&gt;2) cd $DOMAIN_HOME/config/fmwconfig&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" size="2"&gt;3) Create service key-certificate pair signed by the demo CA cert &amp;quot;CertGenCA&amp;quot;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" size="2"&gt;java utils.CertGen -certfile ServerPublicCertificate -keyfile ServerPrivateKey -keyfilepass welcome1 -cn &amp;quot;`hostname -f`&amp;quot;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" size="2"&gt;4) Create service keystore with service key-certificate pair&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" size="2"&gt;java utils.ImportPrivateKey -keystore default-keystore.jks -storepass welcome1 -certfile ServerPublicCertificate.der -keyfile ServerPrivateKey.der -keyfilepass welcome1 -alias serverkey -keypass welcome1&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" size="2"&gt;5) Now add the root CA to the service keystore&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" size="2"&gt;keytool -importcert -file $WL_HOME/server/lib/CertGenCA.der -keystore default-keystore.jks -storepass welcome1&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" size="2"&gt;6) Add options to credential store (CWALLET.SSO) so as to access keys/certificates from keystore&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" size="2"&gt;$MW_HOME/Oracle_ECM1/common/bin/wlst.sh&amp;#160; (or $MW_HOME/oracle_common/common/bin/wlst.sh)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" size="2"&gt;connect('weblogic','welcome1','t3://localhost:7001')     &lt;br /&gt;createCred(map=&amp;quot;oracle.wsm.security&amp;quot;, key=&amp;quot;keystore-csf-key&amp;quot;, user=&amp;quot;n/a&amp;quot;, password=&amp;quot;welcome1&amp;quot;)      &lt;br /&gt;createCred(map=&amp;quot;oracle.wsm.security&amp;quot;, key=&amp;quot;sign-csf-key&amp;quot;, user=&amp;quot;serverkey&amp;quot;, password=&amp;quot;welcome1&amp;quot;)      &lt;br /&gt;createCred(map=&amp;quot;oracle.wsm.security&amp;quot;, key=&amp;quot;enc-csf-key&amp;quot;, user=&amp;quot;serverkey&amp;quot;, password=&amp;quot;welcome1&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" size="2"&gt;Optional:     &lt;br /&gt;listCred(map=&amp;quot;oracle.wsm.security&amp;quot;, key=&amp;quot;keystore-csf-key&amp;quot;)      &lt;br /&gt;listCred(map=&amp;quot;oracle.wsm.security&amp;quot;, key=&amp;quot;sign-csf-key&amp;quot;)      &lt;br /&gt;listCred(map=&amp;quot;oracle.wsm.security&amp;quot;, key=&amp;quot;enc-csf-key&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" size="2"&gt;7) Restart&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" size="2"&gt;-------------------------------------------------------------------------------------------------------------------------------------&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" size="2"&gt;&amp;gt;From Client Domain - JDeveloper integrated WebLogic Server (where the client is running)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" size="2"&gt;1) SET DOMAIN_HOME=%JDEV_USER_HOME%\system11.1.1.3.37.56.60\DefaultDomain&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" size="2"&gt;2) %DOMAIN_HOME%\bin\setDomainEnv.cmd&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" size="2"&gt;3) cd %DOMAIN_HOME%\config\fmwconfig&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" size="2"&gt;4) Create client key-certificate pair signed by the demo CA cert &amp;quot;CertGenCA&amp;quot;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" size="2"&gt;java utils.CertGen -certfile ClientPublicCertificate -keyfile ClientPrivateKey -keyfilepass welcome1&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" size="2"&gt;Note      &lt;br /&gt;-cn is optional argument, which determines the common name to which the certificate is issued to.       &lt;br /&gt;If this argument is skipped, the certificate is issued in the name of the hostname of the machine from which the certificate is generated&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" size="2"&gt;5) Create client keystore with client key-certificate pair&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" size="2"&gt;java utils.ImportPrivateKey -keystore default-keystore.jks -storepass welcome1 -certfile ClientPublicCertificate.der -keyfile ClientPrivateKey.der -keyfilepass welcome1 -alias clientkey -keypass welcome1&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" size="2"&gt;6) Now add the root CA to the client keystore&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" size="2"&gt;keytool -importcert -file %WL_HOME%\server\lib\CertGenCA.der -keystore default-keystore.jks -storepass welcome1&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" size="2"&gt;7) Add the service's public certificate to the client keystore.      &lt;br /&gt;(You must copy the server public certificate across to client)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" size="2"&gt;keytool -importcert -file ServerPublicCertificate.der -alias serverkey -keystore default-keystore.jks -storepass welcome1&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" size="2"&gt;(Note     &lt;br /&gt;Latest version of OWSM can expose public certificate of service directly in the service WSDL through its Service Identity Certificate Extension       &lt;br /&gt;&lt;/font&gt;&lt;a href="http://download.oracle.com/docs/cd/E14571_01/web.1111/b32511/setup_config.htm#BABJCGBC"&gt;&lt;font face="courier new" size="2"&gt;http://download.oracle.com/docs/cd/E14571_01/web.1111/b32511/setup_config.htm#BABJCGBC&lt;/font&gt;&lt;/a&gt;&lt;font face="courier new" size="2"&gt;      &lt;br /&gt;Hence, this step may not be required.      &lt;br /&gt;In older releases, the service's public certificate had to be added to the client keystore;       &lt;br /&gt;If the recipient alias property on the client was not explicitly set, then this certificate would need to have been added under the the alias &amp;quot;orakey&amp;quot;      &lt;br /&gt;It appears that a client based on the JRF WS stack supports retrieving service certificate from WSDL, whereas as client based on WLS WS stack does not!      &lt;br /&gt;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;font face="courier new" size="2"&gt;8) Add options to credential store (CWALLET.SSO) so as to access keys/certificates from keystore&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" size="2"&gt;%MW_HOME%\oracle_common\common\bin\wlst     &lt;br /&gt;connect('weblogic','weblogic1','t3://localhost:7101')      &lt;br /&gt;createCred(map=&amp;quot;oracle.wsm.security&amp;quot;, key=&amp;quot;keystore-csf-key&amp;quot;, user=&amp;quot;n/a&amp;quot;, password=&amp;quot;welcome1&amp;quot;, desc=&amp;quot;keystore access password&amp;quot;)      &lt;br /&gt;createCred(map=&amp;quot;oracle.wsm.security&amp;quot;, key=&amp;quot;sign-csf-key&amp;quot;, user=&amp;quot;clientkey&amp;quot;, password=&amp;quot;welcome1&amp;quot;, desc=&amp;quot;signing key alias and password&amp;quot;)      &lt;br /&gt;createCred(map=&amp;quot;oracle.wsm.security&amp;quot;, key=&amp;quot;enc-csf-key&amp;quot;, user=&amp;quot;clientkey&amp;quot;, password=&amp;quot;welcome1&amp;quot;, desc=&amp;quot;encryption key alias and password&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="courier new" size="2"&gt;Optional:     &lt;br /&gt;listCred(map=&amp;quot;oracle.wsm.security&amp;quot;, key=&amp;quot;keystore-csf-key&amp;quot;)      &lt;br /&gt;listCred(map=&amp;quot;oracle.wsm.security&amp;quot;, key=&amp;quot;sign-csf-key&amp;quot;)      &lt;br /&gt;listCred(map=&amp;quot;oracle.wsm.security&amp;quot;, key=&amp;quot;enc-csf-key&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Verify cwallet.sso was updated… (note the addition of the oracle.wsm.security Secret Store entries) :-&lt;/p&gt;  &lt;p&gt;C:\JDeveloper\system11.1.1.3.37.56.60\DefaultDomain\config\fmwconfig&amp;gt;&lt;/p&gt;  &lt;p&gt;c:\Oracle\Middleware\oracle_common\bin\orapki wallet display -wallet cwallet.sso&lt;/p&gt;  &lt;p&gt;Oracle PKI Tool : Version 11.1.1.2.0   &lt;br /&gt;Copyright (c) 2004, 2009, Oracle and/or its affiliates. All rights reserved.&lt;/p&gt;  &lt;p&gt;Requested Certificates:   &lt;br /&gt;User Certificates:    &lt;br /&gt;Oracle Secret Store entries:    &lt;br /&gt;&lt;a href="mailto:oracle.wsm.security@#3#@enc-csf-key"&gt;oracle.wsm.security@#3#@enc-csf-key&lt;/a&gt;    &lt;br /&gt;&lt;a href="mailto:oracle.wsm.security@#3#@keystore-csf-key"&gt;oracle.wsm.security@#3#@keystore-csf-key&lt;/a&gt;    &lt;br /&gt;&lt;a href="mailto:oracle.wsm.security@#3#@sign-csf-key"&gt;oracle.wsm.security@#3#@sign-csf-key&lt;/a&gt;    &lt;br /&gt;Trusted Certificates:    &lt;br /&gt;Subject:&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; OU=Class 1 Public Primary Certification Authority,O=VeriSign\, Inc.,C=US    &lt;br /&gt;Subject:&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; OU=Secure Server Certification Authority,O=RSA Data Security\, Inc.,C=US    &lt;br /&gt;Subject:&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; CN=Entrust.net Secure Server Certification Authority,OU=(c) 1999 Entrust.net Limited,OU=www.entrust.net/CPS incorp. by ref. (limits liab.),O=Entrust.net,C=US    &lt;br /&gt;Subject:&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; CN=GTE CyberTrust Global Root,OU=GTE CyberTrust Solutions\, Inc.,O=GTE Corporation,C=US    &lt;br /&gt;Subject:&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; OU=Class 3 Public Primary Certification Authority,O=VeriSign\, Inc.,C=US    &lt;br /&gt;Subject:&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; CN=Entrust.net Secure Server Certification Authority,OU=(c) 2000 Entrust.net Limited,OU=www.entrust.net/SSL_CPS incorp. by ref. (limits liab.),O=Entrust.net    &lt;br /&gt;Subject:&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; OU=Class 2 Public Primary Certification Authority,O=VeriSign\, Inc.,C=US    &lt;br /&gt;Subject:&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; CN=Entrust.net Certification Authority (2048),OU=(c) 1999 Entrust.net Limited,OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.),O=Entrust.net&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2959498105239183642-8767194579508890130?l=todayguesswhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/8767194579508890130/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://todayguesswhat.blogspot.com/2010/09/jdeveloper-11gr1-integrated-weblogic.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/8767194579508890130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/8767194579508890130'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/2010/09/jdeveloper-11gr1-integrated-weblogic.html' title='JDeveloper 11gR1 - integrated WebLogic Server and OWSM'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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-2959498105239183642.post-259398857749590149</id><published>2010-08-23T13:52:00.001+10:00</published><updated>2010-08-25T11:49:04.450+10:00</updated><title type='text'>XBMC CrystalHD Update #2 August 2010</title><content type='html'>&lt;p&gt;To leverage crystalhd kext, library and firmware based on r156 (&lt;a href="http://code.google.com/p/crystalhd-for-osx/updates/list"&gt;http://code.google.com/p/crystalhd-for-osx/updates/list&lt;/a&gt;), replace &lt;strong&gt;Step 2&lt;/strong&gt; in the post&lt;/p&gt;  &lt;p&gt;&lt;a href="http://todayguesswhat.blogspot.com/2010/08/xbmc-crystalhd-updated-instructions.html"&gt;http://todayguesswhat.blogspot.com/2010/08/xbmc-crystalhd-updated-instructions.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;with the following:&lt;/p&gt;  &lt;p&gt;# &lt;strong&gt;Step 2&lt;/strong&gt;: Obtain the crystalhd kext, driver, and firmware and install in to the appropriate location&lt;/p&gt;  &lt;p&gt;# run as &lt;strong&gt;root &lt;/strong&gt;(&lt;font face="Courier New"&gt;sudo -s&lt;/font&gt;)&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;cd /tmp&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;rm -rf crystalhd-for-osx-3.6.0*&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;wget &lt;/font&gt;&lt;a href="http://crystalhd-for-osx.googlecode.com/files/crystalhd-for-osx-3.6.0.zip"&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;http://crystalhd-for-osx.googlecode.com/files/crystalhd-for-osx-3.6.0.zip&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;unzip crystalhd-for-osx-3.6.0.zip crystalhd-for-osx-3.6.0/*&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;rm -rf /System/Library/Extensions/BroadcomCrystalHD.kext&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;mv crystalhd-for-osx-3.6.0/BroadcomCrystalHD.kext /System/Library/Extensions&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;chown -R root:wheel /System/Library/Extensions/BroadcomCrystalHD.kext&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;chmod -R 755 /System/Library/Extensions/BroadcomCrystalHD.kext&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;rm -rf /usr/lib/libcrystalhd.dylib&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;mv crystalhd-for-osx-3.6.0/libcrystalhd.dylib /usr/lib/&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;chmod 755 /usr/lib/libcrystalhd.dylib     &lt;br /&gt;chown root:wheel /usr/lib/libcrystalhd.dylib&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;rm -rf /usr/lib/bcm7001*fw.bin&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;mv crystalhd-for-osx-3.6.0/bcm7001*fw.bin /usr/lib/&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;chmod 644 /usr/lib/bcm7001*fw.bin     &lt;br /&gt;chown root:wheel /usr/lib/bcm7001*fw.bin&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;rm -rf /tmp/crystalhd-for-osx-3.6.0     &lt;br /&gt;rm -rf /tmp/crystalhd-for-osx-3.6.0.zip&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;# reboot&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;# check that crystalhd driver is loaded :-   &lt;br /&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;kextstat | grep crystalhd&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Output :-   &lt;br /&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160; 74&amp;#160;&amp;#160;&amp;#160; 0 0x2fff2000 0x18000&amp;#160;&amp;#160;&amp;#160; 0x17000&amp;#160;&amp;#160;&amp;#160; com.broadcom.crystalhd.driver (3.6.0) &amp;lt;5 4 3 2&amp;gt;&lt;/font&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2959498105239183642-259398857749590149?l=todayguesswhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/259398857749590149/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://todayguesswhat.blogspot.com/2010/08/xbmc-crystalhd-update-2-august-2010.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/259398857749590149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/259398857749590149'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/2010/08/xbmc-crystalhd-update-2-august-2010.html' title='XBMC CrystalHD Update #2 August 2010'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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-2959498105239183642.post-1683264960146468339</id><published>2010-08-21T11:11:00.001+10:00</published><updated>2010-08-25T11:39:03.909+10:00</updated><title type='text'>XBMC CrystalHD Updated Instructions using 2.01 driver – August 2010</title><content type='html'>&lt;p&gt;There are plenty of simpler ways to install/verify Crystal HD on the Apple TV.&amp;#160;&amp;#160; Below steps should work if you like to get your hands dirty :-&lt;/p&gt;  &lt;p&gt;(note – cut/paste blocks of colored text as a whole)&lt;/p&gt;  &lt;p&gt;# &lt;strong&gt;Step 1&lt;/strong&gt;: SSH in to the apple tv as the user frontrow using your favourite ssh client&lt;/p&gt;  &lt;p&gt;# having successfully logged in, switch to the root user    &lt;br /&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;sudo -s&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;# Note! - you will need to manually supply the ROOT password for the ABOVE command before proceeding ...&lt;/p&gt;  &lt;p&gt;# &lt;strong&gt;Step 2&lt;/strong&gt;: Obtain the crystalhd kext, driver, and firmware and install in to the appropriate location&lt;/p&gt;  &lt;p&gt;(Note, see the following post for a replacement ‘Step 2’ &lt;a href="http://todayguesswhat.blogspot.com/2010/08/xbmc-crystalhd-update-2-august-2010.html"&gt;http://todayguesswhat.blogspot.com/2010/08/xbmc-crystalhd-update-2-august-2010.html&lt;/a&gt; if you want to run a newer build based on r156 &lt;a href="http://code.google.com/p/crystalhd-for-osx/updates/list"&gt;http://code.google.com/p/crystalhd-for-osx/updates/list&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;cd /tmp&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;rm -rf crystalhd-for-osx-2.0.1*&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;wget &lt;/font&gt;&lt;a href="http://crystalhd-for-osx.googlecode.com/files/crystalhd-for-osx-2.0.1.zip"&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;http://crystalhd-for-osx.googlecode.com/files/crystalhd-for-osx-2.0.1.zip&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;unzip crystalhd-for-osx-2.0.1.zip crystalhd-for-osx-2.0.1/*&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;rm -rf /System/Library/Extensions/BroadcomCrystalHD.kext&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;mv crystalhd-for-osx-2.0.1/BroadcomCrystalHD.kext /System/Library/Extensions&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;chown -R root:wheel /System/Library/Extensions/BroadcomCrystalHD.kext&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;chmod -R 755 /System/Library/Extensions/BroadcomCrystalHD.kext&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;rm -rf /usr/lib/libcrystalhd.dylib&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;mv crystalhd-for-osx-2.0.1/libcrystalhd.dylib /usr/lib/&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;chmod 755 /usr/lib/libcrystalhd.dylib      &lt;br /&gt;chown root:wheel /usr/lib/libcrystalhd.dylib&lt;/font&gt;&lt;/p&gt; &lt;font face="Courier New" color="#0000ff" size="2"&gt;   &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;rm -rf /usr/lib/bcm7001*fw.bin&lt;/font&gt;&lt;/p&gt; &lt;/font&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;mv crystalhd-for-osx-2.0.1/bcm7001*fw.bin /usr/lib/&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;chmod 644 /usr/lib/bcm7001*fw.bin      &lt;br /&gt;chown root:wheel /usr/lib/bcm7001*fw.bin&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;rm -rf /tmp/crystalhd-for-osx-2.0.1      &lt;br /&gt;rm -rf /tmp/crystalhd-for-osx-2.0.1.zip&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;# &lt;strong&gt;Step 3&lt;/strong&gt;: to load kexts, we require Turbo's ATV or Kext enabler ...&lt;/p&gt;  &lt;p&gt;# check for presence of /sbin/turbo_atv_enabler.bin or /sbin/turbo_kext_enabler.bin    &lt;br /&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;if [ ! -f /sbin/turbo_kext_enabler.bin ] &amp;amp;&amp;amp; [ ! -f /sbin/turbo_atv_enabler.bin ]; then      &lt;br /&gt;&amp;#160; wget &lt;/font&gt;&lt;a href="http://crystalhd-for-osx.googlecode.com/files/turbo_atv_enabler.bin"&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;http://crystalhd-for-osx.googlecode.com/files/turbo_atv_enabler.bin&lt;/font&gt;&lt;/a&gt;     &lt;br /&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; mv turbo_atv_enabler.bin /sbin      &lt;br /&gt;&amp;#160; chown root:wheel /sbin/turbo_atv_enabler.bin       &lt;br /&gt;&amp;#160; chmod 755 /sbin/turbo_atv_enabler.bin       &lt;br /&gt;fi&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;# Notes crystal_atv_enabler.bin is just a copy of turbo_atv_enabler.bin (they are MD5 equivalent 6a8ec66d5174a4cefacbe12be4b1e079 - 17780 bytes)&lt;/p&gt;  &lt;p&gt;# &lt;strong&gt;Step 4&lt;/strong&gt;: Ensure that the crystalhd kext is activated at boot time !!EITHER!! by adding a new startup item under &lt;font color="#800000"&gt;/System/Library/StartupItems&lt;/font&gt; or adding an entry to &lt;font color="#808000"&gt;/etc/rc.local &lt;/font&gt;&lt;font color="#000000"&gt;; If you have installed the Crystal HD driver in the past, it is worthwhile having a quick look on disk to see which mechanism is currently being used to load the driver and continue leveraging that approach.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;# Use either &lt;font color="#800000"&gt;&lt;em&gt;method 1&lt;/em&gt;&lt;/font&gt; or&lt;font color="#808000"&gt;&amp;#160;&lt;em&gt;method 2&lt;/em&gt;&lt;/font&gt;&amp;#160; below ...&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;# Step 4 - &lt;font color="#800000"&gt;&lt;em&gt;Method 1&lt;/em&gt;&lt;/font&gt;: &lt;/strong&gt;    &lt;br /&gt;# Rather than put the kextload entry in /etc/rc.local (as in method 2) - below we make use of /System/Library/StartupItems&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800000" size="2"&gt;mkdir -p /System/Library/StartupItems/LoadCrystalHD&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800000" size="2"&gt;&lt;font face="Georgia" color="#000000" size="3"&gt;# create StartupParameters.plist file&lt;/font&gt;       &lt;br /&gt;cat &amp;gt; /System/Library/StartupItems/LoadCrystalHD/StartupParameters.plist &amp;lt;&amp;lt;EOF       &lt;br /&gt;{       &lt;br /&gt;&amp;#160; Description&amp;#160;&amp;#160;&amp;#160;&amp;#160; = &amp;quot;CrystalHD Driver Loader&amp;quot;;       &lt;br /&gt;&amp;#160; Provides&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; = (&amp;quot;CrystalHD Driver&amp;quot;);       &lt;br /&gt;&amp;#160; Uses&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; = (&amp;quot;Disks&amp;quot;);       &lt;br /&gt;}       &lt;br /&gt;EOF&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800000" size="2"&gt;&lt;font face="Georgia" color="#000000" size="3"&gt;# create LoadCrystalHD file&lt;/font&gt;       &lt;br /&gt;cat &amp;gt; /System/Library/StartupItems/LoadCrystalHD/LoadCrystalHD &amp;lt;&amp;lt;EOF       &lt;br /&gt;#!/bin/sh       &lt;br /&gt;. /etc/rc.common       &lt;br /&gt;&amp;#160; &lt;br /&gt;StartService() {       &lt;br /&gt;&amp;#160; if [ -f /sbin/turbo_atv_enabler.bin ]; then       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; /sbin/turbo_atv_enabler.bin       &lt;br /&gt;&amp;#160; else       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; /sbin/turbo_kext_enabler.bin       &lt;br /&gt;&amp;#160; fi       &lt;br /&gt;&amp;#160; /sbin/kextload -v /System/Library/Extensions/BroadcomCrystalHD.kext       &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800000" size="2"&gt;StopService() {      &lt;br /&gt;&amp;#160; return 0       &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800000" size="2"&gt;RestartService() {      &lt;br /&gt;&amp;#160; return 0       &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800000" size="2"&gt;RunService &amp;quot;\$1&amp;quot;      &lt;br /&gt;EOF&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;# update permissions/ownership    &lt;br /&gt;&lt;font face="Courier New" color="#800000" size="2"&gt;chown -R root:wheel /System/Library/StartupItems/LoadCrystalHD      &lt;br /&gt;chmod -R 755 /System/Library/StartupItems/LoadCrystalHD/LoadCrystalHD       &lt;br /&gt;chmod -R 644 /System/Library/StartupItems/LoadCrystalHD/StartupParameters.plist&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;# one can attempt to confirm startupitem script works by typing    &lt;br /&gt;# &lt;font face="courier new" size="2"&gt;SystemStarter start LoadCrystalHD&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;strong&gt;# Step 4 - &lt;font color="#808000"&gt;&lt;em&gt;Method 2&lt;/em&gt;&lt;/font&gt;:       &lt;br /&gt;&lt;/strong&gt;# Rather than add a new startup item to /System/Library/StartupItems (as in method 1) - below we ensure that the crystalhd kext is activated at boot time by adding an entry to /etc/rc.local&lt;/p&gt;  &lt;p&gt;# begin rc.local changes ...    &lt;br /&gt;&lt;font face="Courier New" color="#808000" size="2"&gt;touch /etc/rc.local      &lt;br /&gt;cp /etc/rc.local /etc/rc.local.original&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;# check if kext enabler entry missing from rc.local    &lt;br /&gt;&lt;font face="Courier New" color="#808000" size="2"&gt;if [ `grep --count -G '^/sbin/turbo_\(atv\|kext\)_enabler.bin' /etc/rc.local` -eq 0 ]; then      &lt;br /&gt;&amp;#160; if [ -f /sbin/turbo_atv_enabler.bin ]; then       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; echo &amp;quot;/sbin/turbo_atv_enabler.bin&amp;quot; &amp;gt; /tmp/rc.top       &lt;br /&gt;&amp;#160; else       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; echo &amp;quot;/sbin/turbo_kext_enabler.bin&amp;quot; &amp;gt; /tmp/rc.top       &lt;br /&gt;&amp;#160; fi&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#808000" size="2"&gt;&amp;#160; cat /tmp/rc.top /etc/rc.local.original &amp;gt; /etc/rc.local      &lt;br /&gt;&amp;#160; rm -rf /tmp/rc.top       &lt;br /&gt;fi&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;# add kexload entry to end of rc.local file if missing    &lt;br /&gt;&lt;font face="Courier New" color="#808000" size="2"&gt;if [ `grep --count -G '^/sbin/kextload -v /System/Library/Extensions/BroadcomCrystalHD.kext' /etc/rc.local` -eq 0 ]; then      &lt;br /&gt;&amp;#160; echo &amp;quot;/sbin/kextload -v /System/Library/Extensions/BroadcomCrystalHD.kext&amp;quot; &amp;gt;&amp;gt; /etc/rc.local       &lt;br /&gt;fi&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;# ensure rc.local permissions are correct    &lt;br /&gt;&lt;font face="Courier New" color="#808000" size="2"&gt;chown root:wheel /etc/rc.local      &lt;br /&gt;chmod 644 /etc/rc.local&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt; # &lt;strong&gt;Step 5&lt;/strong&gt;: Next, we want to add support from laucher for downloading XBMC nightly builds&lt;/p&gt; # exit as user root, and return as user frontrow ...   &lt;br /&gt;&lt;strong&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;exit&lt;/font&gt;&lt;/strong&gt;   &lt;p&gt;# Note! You should now be the user frontrow.&lt;/p&gt;  &lt;p&gt;# add xbmc nightly download location entry for launcher if not present ...    &lt;br /&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;defaults read com.teamxbmc.xbmclauncher XBMCAdditionalDownloadPlistURLs 2&amp;gt;/dev/null | grep --silent mirrors.xbmc.org/nightlies/osx/update_urls.plist      &lt;br /&gt;if [ $? -eq 1 ]; then       &lt;br /&gt;&amp;#160; defaults write com.teamxbmc.xbmclauncher XBMCAdditionalDownloadPlistURLs -array &lt;/font&gt;&lt;a href="http://mirrors.xbmc.org/nightlies/osx/update_urls.plist"&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;http://mirrors.xbmc.org/nightlies/osx/update_urls.plist&lt;/font&gt;&lt;/a&gt;     &lt;br /&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;fi&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;# &lt;strong&gt;Step 6&lt;/strong&gt;: From the Apple TV User Interface, Go to the launcher menu, then choose &amp;quot;Settings&amp;quot;, then choose &amp;quot;Downloads&amp;quot;     &lt;br /&gt;# - Obtain the latest xbmc download build available&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;# &lt;strong&gt;Step 7&lt;/strong&gt;: Reboot the Apple TV ...     &lt;br /&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;sudo -s      &lt;br /&gt;reboot&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;# &lt;strong&gt;Step 8&lt;/strong&gt;: After the Apple TV has rebooted, fire up XBMC from the launcher     &lt;br /&gt;# check that XBMC has detected the Crystal HD ...&lt;/p&gt;  &lt;p&gt;# Check under &amp;quot;System -&amp;gt; Video -&amp;gt; Playback -&amp;gt; there is an option selected &amp;quot;Allow hardware acceleration (CrystalHD)&amp;quot;&lt;/p&gt;  &lt;p&gt;# If no /usr/lib/libcrystalhd.dylib or no BroadcomCrystalHD.kext loaded, then CrystalHD will NOT show up above..&lt;/p&gt;  &lt;p&gt;# Optional - Basic debugging can be done in the event the Cyrstal HD was not detected:&lt;/p&gt;  &lt;p&gt;# switch to root    &lt;br /&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;sudo -s&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;# check that crystal hd hardware was detected    &lt;br /&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;dmesg&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Output :-    &lt;br /&gt;...     &lt;br /&gt;&lt;font face="Courier New"&gt;BroadcomCrystalHD::start      &lt;br /&gt;crystalhd_hw_open: setting up functions, device = Link       &lt;br /&gt;Starting Crystal HD Device       &lt;br /&gt;Opening HW. hw:0x1f28e04, hw-&amp;gt;adp:0x200e300       &lt;br /&gt;Stopping Crystal HD Device       &lt;br /&gt;BroadcomCrystalHD: Found HW and started driver SW.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;# check that crystalhd driver is loaded :-    &lt;br /&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;kextstat | grep crystalhd&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Output :-    &lt;br /&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160; 74&amp;#160;&amp;#160;&amp;#160; 0 0x30157000 0x18000&amp;#160;&amp;#160;&amp;#160; 0x17000&amp;#160;&amp;#160;&amp;#160; com.broadcom.crystalhd.driver (3.5.0) &amp;lt;5 4 3 2&amp;gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;# Check the xbmc.log when playing an appropriate movie ..     &lt;br /&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;grep -i crystal /Users/frontrow/Library/Logs/xbmc.log&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;10:52:16 T:2684407808 M: 18456576&amp;#160;&amp;#160;&amp;#160; INFO: CrystalHD(new API): device opened&lt;/font&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2959498105239183642-1683264960146468339?l=todayguesswhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/1683264960146468339/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://todayguesswhat.blogspot.com/2010/08/xbmc-crystalhd-updated-instructions.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/1683264960146468339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/1683264960146468339'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/2010/08/xbmc-crystalhd-updated-instructions.html' title='XBMC CrystalHD Updated Instructions using 2.01 driver – August 2010'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2959498105239183642.post-1872173687046451874</id><published>2010-08-17T09:10:00.001+10:00</published><updated>2010-08-17T09:10:38.698+10:00</updated><title type='text'>ADF11g Add javascript to jspx / trigger javascript onLoad event</title><content type='html'>&lt;p&gt;&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;   &lt;br /&gt;&amp;lt;jsp:root xmlns:jsp=&amp;quot;&lt;a href="http://java.sun.com/JSP/Page"&gt;http://java.sun.com/JSP/Page&lt;/a&gt;&amp;quot; version=&amp;quot;2.1&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlns:f=&amp;quot;&lt;a href="http://java.sun.com/jsf/core"&gt;http://java.sun.com/jsf/core&lt;/a&gt;&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlns:h=&amp;quot;&lt;a href="http://java.sun.com/jsf/html"&gt;http://java.sun.com/jsf/html&lt;/a&gt;&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlns:af=&amp;quot;&lt;a href="http://xmlns.oracle.com/adf/faces/rich"&gt;http://xmlns.oracle.com/adf/faces/rich&lt;/a&gt;&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;jsp:directive.page contentType=&amp;quot;text/html;charset=UTF-8&amp;quot;/&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;f:view&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;af:document id=&amp;quot;d1&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;f:facet name=&amp;quot;metaContainer&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;af:group id=&amp;quot;g1&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;af:resource type=&amp;quot;javascript&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; function someFunction()    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; alert('hello');    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/af:resource&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;af:resource type=&amp;quot;javascript&amp;quot; source=&amp;quot;xxx.js&amp;quot;/&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/af:group&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/f:facet&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;af:clientListener method=&amp;quot;someFunction&amp;quot; type=&amp;quot;load&amp;quot;/&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;af:form id=&amp;quot;f1&amp;quot;&amp;gt; …    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/af:form&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/af:document&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;/f:view&amp;gt;    &lt;br /&gt;&amp;lt;/jsp:root&amp;gt;    &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2959498105239183642-1872173687046451874?l=todayguesswhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/1872173687046451874/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://todayguesswhat.blogspot.com/2010/08/adf11g-add-javascript-to-jspx-trigger.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/1872173687046451874'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/1872173687046451874'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/2010/08/adf11g-add-javascript-to-jspx-trigger.html' title='ADF11g Add javascript to jspx / trigger javascript onLoad event'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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-2959498105239183642.post-8102230408307351930</id><published>2010-07-22T18:28:00.001+10:00</published><updated>2010-07-22T18:53:00.845+10:00</updated><title type='text'>How to query and obtain MD5 checksum for a file hosted on rapidshare.com</title><content type='html'>&lt;p&gt;How many times have you downloaded file(s) from rapidshare.com only to extract them / join them / etc and discover that the file appears to be corrupted? You then wonder was it a download issue, or was the actual file itself hosted on rapidshare the problem.&lt;/p&gt;  &lt;p&gt;My ADSL2+ internet connection here in Australia is slow by today’s internet speed standards (realworld tests, I get 500 KB/s download and 100 KB/s upload); To add insult to injury, internet quota in Australia is capped!&amp;#160; Thus, I don’t want to have to download a large file again, unless absolutely required.&lt;/p&gt;  &lt;p&gt;The solution to this problem, is to make a basic HTTP request to rapidshare and request MD5 checksum information for the specific file(s) concerned, and then compare this with the MD5 checksums of the downloaded files on your local machine.&lt;/p&gt;  &lt;p&gt;To perform MD5 checksum on your local files, first get yourself a suitable md5 hash tool for your specific OS platform concerned:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.openoffice.org/dev_docs/using_md5sums.html"&gt;http://www.openoffice.org/dev_docs/using_md5sums.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;You can then use my html script below to query rapidshare for checksum info.&amp;#160; Put in the textarea the rapidshare links to query, for example&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font face="Courier New" size="2"&gt;http://rapidshare.com/files/408093110/test.iso&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;The MD5 checksum is returned as 32-character, hexadecimal-formatted hash. Using the test.iso link above for example, the MD5 checksum component returned by rapidshare appears in bold below: &lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;408093110,test.iso,20348928,153,1,l3,&lt;b&gt;78F8244AF76C6CF9641190780A50A9D8&lt;/b&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;lt;html&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;body&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!-- Code by M.Shannon --&amp;gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var debugMode=false; // set to true to enable window alerts&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; function findURLs(refFiles, refFileNames)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var exp=/http:\/\/(www\.)?rapidshare\.com\/files\/\d+\/[\w_\-\.]+/igm;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var matches = document.getElementById(&amp;quot;urls&amp;quot;).value.match(exp);&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (matches != null)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (var i = 0; i &amp;lt; matches.length; i++)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var url = matches[i];       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (debugMode) { alert(url); }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var index1 = url.lastIndexOf(&amp;quot;/files/&amp;quot;);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var index2 = url.lastIndexOf(&amp;quot;/&amp;quot;);&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; refFiles.push(url.substring(index1 + 7, index2));      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; refFileNames.push(url.substring(index2 + 1));       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; function validate(form)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var files = new Array();       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var fileNames = new Array();&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; findURLs(files, fileNames);&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (files.length &amp;gt; 0)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (debugMode) { alert(files); alert(fileNames); }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; form.files.value = files.toString();       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; form.filenames.value = fileNames.toString();       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return true;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return false;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; &amp;lt;/script&amp;gt; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; &amp;lt;form&amp;gt;&amp;lt;textarea id=&amp;quot;urls&amp;quot; cols=&amp;quot;80&amp;quot; rows=&amp;quot;4&amp;quot;&amp;gt;paste your rapidshare hyperlinks in to this textarea&amp;lt;/textarea&amp;gt;&amp;lt;/form&amp;gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; &amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&lt;/font&gt;&lt;a href="http://api.rapidshare.com/cgi-bin/rsapi.cgi"&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;http://api.rapidshare.com/cgi-bin/rsapi.cgi&lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;quot; onsubmit=&amp;quot;return validate(this);&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;input name=&amp;quot;sub&amp;quot; type=&amp;quot;hidden&amp;quot; value=&amp;quot;checkfiles_v1&amp;quot;&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;input name=&amp;quot;incmd5&amp;quot; type=&amp;quot;hidden&amp;quot; value=&amp;quot;1&amp;quot;&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;input name=&amp;quot;files&amp;quot; type=&amp;quot;hidden&amp;quot; value=&amp;quot;&amp;quot;&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;input name=&amp;quot;filenames&amp;quot; type=&amp;quot;hidden&amp;quot; value=&amp;quot;&amp;quot;&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;input type=&amp;quot;submit&amp;quot;&amp;gt;       &lt;br /&gt;&amp;#160; &amp;lt;/form&amp;gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; document.getElementById(&amp;quot;urls&amp;quot;).focus();       &lt;br /&gt;&amp;#160; &amp;lt;/script&amp;gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; &amp;lt;/body&amp;gt;      &lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;script type="text/javascript"&gt;function findURLs(refFiles, refFileNames) { var exp=/http:\/\/(www\.)?rapidshare\.com\/files\/\d+\/[\w_\-\.]+/igm; var matches = document.getElementById("urls").value.match(exp); if (matches != null) { for (var i = 0; i &lt; matches.length; i++) { var url = matches[i]; var index1 = url.lastIndexOf("/files/"); var index2 = url.lastIndexOf("/"); refFiles.push(url.substring(index1 + 7, index2)); refFileNames.push(url.substring(index2 + 1)); } } } function validate(form) { var files = new Array(); var fileNames = new Array(); findURLs(files, fileNames); if (files.length &gt; 0) { form.files.value = files.toString(); form.filenames.value = fileNames.toString(); form.incmd5.value = "1"; form.sub.value = "checkfiles_v1"; return true; } return false; } &lt;/script&gt;&lt;form&gt;&lt;textarea id="urls"&gt;paste your rapidshare hyperlinks in to this textarea&lt;/textarea&gt;&lt;/form&gt;&lt;form onsubmit="return validate(this);" action="http://api.rapidshare.com/cgi-bin/rsapi.cgi" method="get"&gt;&lt;input type="hidden" name="sub" /&gt; &lt;input type="hidden" name="incmd5" /&gt; &lt;input type="hidden" name="files" /&gt; &lt;input type="hidden" name="filenames" /&gt; &lt;input type="submit" /&gt; &lt;/form&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2959498105239183642-8102230408307351930?l=todayguesswhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/8102230408307351930/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://todayguesswhat.blogspot.com/2010/07/how-to-query-and-obtain-md5-checksum.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/8102230408307351930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/8102230408307351930'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/2010/07/how-to-query-and-obtain-md5-checksum.html' title='How to query and obtain MD5 checksum for a file hosted on rapidshare.com'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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-2959498105239183642.post-8144606373094529566</id><published>2010-07-21T00:16:00.002+10:00</published><updated>2010-07-21T00:22:55.218+10:00</updated><title type='text'>How to prevent auto-repeat of videos in XBMC</title><content type='html'>For the best part of the last year, one annoying issue I have found with my particular XBMC setup was that videos would auto-repeat. I could not understand why this was, or where the auto-repeat setting was stored. If you pressed the TV power button mid playback of a movie, the movie would continue to play and repeat over and over.&lt;br /&gt;&lt;br /&gt;It was particularly nasty should the video be played from an external USB disk, as the disk would never go to sleep.&lt;br /&gt;&lt;br /&gt;Anyway, today I finally worked out where this setting is stored; instructions below assume an AppleTV XBMC setup :-&lt;br /&gt;&lt;br /&gt;Navigate to a movie/tv episode etc&lt;br /&gt;&lt;br /&gt;Hold down menu button until popup menu appears&lt;br /&gt;&lt;br /&gt;from popup menu, choose "Queue item"&lt;br /&gt;&lt;br /&gt;hold down menu button once more until popup menu re-appears&lt;br /&gt;&lt;br /&gt;from popup menu, choose "Now playing ..."&lt;br /&gt;&lt;br /&gt;"NOW PLAYING - VIDEOS" screen should appear&lt;br /&gt;&lt;br /&gt;press Previous/Rewind button, and a side-menu on left-hand side should appear&lt;br /&gt;&lt;br /&gt;Check the value for the REPEAT option.  If it is set to REPEAT:ALL, movie will play over and over.&lt;br /&gt;&lt;br /&gt;Set it to REPEAT:OFF&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2959498105239183642-8144606373094529566?l=todayguesswhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/8144606373094529566/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://todayguesswhat.blogspot.com/2010/07/how-to-prevent-auto-repeat-of-videos-in.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/8144606373094529566'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/8144606373094529566'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/2010/07/how-to-prevent-auto-repeat-of-videos-in.html' title='How to prevent auto-repeat of videos in XBMC'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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-2959498105239183642.post-282356336405802126</id><published>2010-07-09T22:09:00.001+10:00</published><updated>2010-07-09T22:09:56.614+10:00</updated><title type='text'>How to determine ATV Software Version Running</title><content type='html'>&lt;p&gt;-bash-2.05b$ sw_vers   &lt;br /&gt;ProductName:&amp;#160;&amp;#160;&amp;#160; Apple TV OS    &lt;br /&gt;ProductVersion: 10.4.7    &lt;br /&gt;BuildVersion:&amp;#160;&amp;#160; 8N5880&lt;/p&gt;  &lt;p&gt;AKA – Software Version 2.40&lt;/p&gt;  &lt;p&gt;According to XBMC God – S.Davilla:&lt;/p&gt;  &lt;p&gt;r1.00 -&amp;gt; 8N5107   &lt;br /&gt;r1.10 -&amp;gt; 8N5239    &lt;br /&gt;r2.00 -&amp;gt; 8N5400    &lt;br /&gt;r2.01 -&amp;gt; 8N5455    &lt;br /&gt;r2.02 -&amp;gt; 8N5461    &lt;br /&gt;r2.10 -&amp;gt; 8N5519    &lt;br /&gt;r2.20 -&amp;gt; 8N5622    &lt;br /&gt;r2.30 -&amp;gt; 8N5722 &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2959498105239183642-282356336405802126?l=todayguesswhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/282356336405802126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://todayguesswhat.blogspot.com/2010/07/how-to-determine-atv-software-version.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/282356336405802126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/282356336405802126'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/2010/07/how-to-determine-atv-software-version.html' title='How to determine ATV Software Version Running'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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-2959498105239183642.post-6188705358019952097</id><published>2010-07-09T14:54:00.001+10:00</published><updated>2010-07-09T14:54:02.683+10:00</updated><title type='text'>View ORACLE SQL query results with columns rendered vertically</title><content type='html'>&lt;p&gt;Below is a script I hacked together from various sources to render ORACLE SQL query results in a vertical fashion (column are presented vertically rather than horizontally).&lt;/p&gt;  &lt;p&gt;Tested with Oracle Database 11g Enterprise 11.2.0.1.0&lt;/p&gt;  &lt;p&gt;:-&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;REM NAME: vselect.sql - Replacement by M Shannon.     &lt;br /&gt;prompt      &lt;br /&gt;accept tname prompt &amp;quot;Enter the table or view you wish to display vertically: &amp;quot;      &lt;br /&gt;prompt      &lt;br /&gt;prompt Enter the &amp;quot;WHERE&amp;quot; clause(s)...      &lt;br /&gt;prompt - if there is no &amp;quot;WHERE&amp;quot; clause, press [Enter].      &lt;br /&gt;prompt - do not include the word, &amp;quot;WHERE&amp;quot;; just specify syntax beyond &amp;quot;WHERE&amp;quot;.      &lt;br /&gt;prompt - do not use single quotes for literals; use double quotes (&amp;quot;) to enclose literals.      &lt;br /&gt;prompt      &lt;br /&gt;accept where prompt '=&amp;gt; '      &lt;br /&gt;prompt      &lt;br /&gt;prompt Enter the &amp;quot;ORDER BY&amp;quot; clause...      &lt;br /&gt;prompt - if there is no &amp;quot;ORDER BY&amp;quot; clause, press [Enter].      &lt;br /&gt;prompt - do not include the words, &amp;quot;ORDER BY&amp;quot;; just specify syntax beyond &amp;quot;ORDER BY&amp;quot;      &lt;br /&gt;prompt - do not use single quotes for literals; use double quotes (&amp;quot;) to enclose literals.      &lt;br /&gt;prompt      &lt;br /&gt;accept orderby prompt '=&amp;gt; '      &lt;br /&gt;prompt&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;set termout on     &lt;br /&gt;set serveroutput on&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;declare     &lt;br /&gt;&amp;#160; l_where_clause&amp;#160;&amp;#160;&amp;#160; varchar2(500);      &lt;br /&gt;&amp;#160; l_orderby_clause&amp;#160; varchar2(500);      &lt;br /&gt;&amp;#160; l_cur&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; number;      &lt;br /&gt;&amp;#160; l_dtbl&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dbms_sql.desc_tab;      &lt;br /&gt;&amp;#160; l_cnt&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; number;      &lt;br /&gt;&amp;#160; l_status&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; number;      &lt;br /&gt;&amp;#160; l_val&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; varchar2(200);      &lt;br /&gt;&amp;#160; double_quote&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; char(1) := '&amp;quot;';      &lt;br /&gt;&amp;#160; two_single_quotes char(1) := chr(39);      &lt;br /&gt;begin      &lt;br /&gt;&amp;#160; if length('&amp;amp;where') &amp;gt; 0 then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; l_where_clause := 'WHERE ' || replace(ltrim(rtrim('&amp;amp;where')),double_quote,two_single_quotes);      &lt;br /&gt;&amp;#160; else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; l_where_clause := null;      &lt;br /&gt;&amp;#160; end if;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; if length('&amp;amp;orderby') &amp;gt; 0 then     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; l_orderby_clause := 'ORDER BY '|| replace(ltrim(rtrim('&amp;amp;orderby')),double_quote,two_single_quotes);      &lt;br /&gt;&amp;#160; else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; l_orderby_clause&amp;#160;&amp;#160;&amp;#160; := null;      &lt;br /&gt;&amp;#160; end if;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; l_cur := dbms_sql.open_cursor;     &lt;br /&gt;&amp;#160; dbms_sql.parse(l_cur,'select * from &amp;amp;tname '|| l_where_clause ||' '|| l_orderby_clause,dbms_sql.native);      &lt;br /&gt;&amp;#160; dbms_sql.describe_columns(l_cur,l_cnt,l_dtbl);      &lt;br /&gt;&amp;#160; for i in 1..l_cnt loop      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; dbms_sql.define_column(l_cur,i,l_val,30);      &lt;br /&gt;&amp;#160; end loop;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; l_status := dbms_sql.execute(l_cur);&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; while ( dbms_sql.fetch_rows(l_cur) &amp;gt; 0 ) loop     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; dbms_output.put_line(lpad('=',80,'='));      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; for i in 1..l_cnt loop      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dbms_sql.column_value(l_cur,i,l_val);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dbms_output.put_line(rpad(l_dtbl(i).col_name,30) ||' --&amp;gt; '||l_val);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; end loop;      &lt;br /&gt;&amp;#160; end loop;      &lt;br /&gt;&amp;#160; dbms_sql.close_cursor(l_cur);      &lt;br /&gt;end;      &lt;br /&gt;/      &lt;br /&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Sample output:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800080"&gt;SQL&amp;gt; @ /home/mshannon/other/scripts/database/vselect&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800080"&gt;Enter the table or view you wish to display vertically: dba_users&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800080"&gt;Enter the &amp;quot;WHERE&amp;quot; clause(s)...     &lt;br /&gt;- if there is no &amp;quot;WHERE&amp;quot; clause, press [Enter].      &lt;br /&gt;- do not include the word, &amp;quot;WHERE&amp;quot;; just specify syntax beyond &amp;quot;WHERE&amp;quot;.      &lt;br /&gt;- do not use single quotes for literals; use double quotes (&amp;quot;) to enclose literals.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800080"&gt;=&amp;gt; username like &amp;quot;SY%&amp;quot;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800080"&gt;Enter the &amp;quot;ORDER BY&amp;quot; clause...     &lt;br /&gt;- if there is no &amp;quot;ORDER BY&amp;quot; clause, press [Enter].      &lt;br /&gt;- do not include the words, &amp;quot;ORDER BY&amp;quot;; just specify syntax beyond &amp;quot;ORDER BY&amp;quot;      &lt;br /&gt;- do not use single quotes for literals; use double quotes (&amp;quot;) to enclose literals.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800080"&gt;=&amp;gt; username asc&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800080"&gt;...&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800080"&gt;================================================================================     &lt;br /&gt;USERNAME&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt; SYS      &lt;br /&gt;USER_ID&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt; 0      &lt;br /&gt;PASSWORD&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt;      &lt;br /&gt;ACCOUNT_STATUS&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt; OPEN      &lt;br /&gt;LOCK_DATE&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt;      &lt;br /&gt;EXPIRY_DATE&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt; 24-AUG-10      &lt;br /&gt;DEFAULT_TABLESPACE&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt; SYSTEM      &lt;br /&gt;TEMPORARY_TABLESPACE&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt; TEMP      &lt;br /&gt;CREATED&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt; 13-AUG-09      &lt;br /&gt;PROFILE&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt; DEFAULT      &lt;br /&gt;INITIAL_RSRC_CONSUMER_GROUP&amp;#160;&amp;#160;&amp;#160; --&amp;gt; SYS_GROUP      &lt;br /&gt;EXTERNAL_NAME&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt;      &lt;br /&gt;PASSWORD_VERSIONS&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt; 10G 11G      &lt;br /&gt;EDITIONS_ENABLED&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt; N      &lt;br /&gt;AUTHENTICATION_TYPE&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt; PASSWORD      &lt;br /&gt;================================================================================      &lt;br /&gt;USERNAME&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt; SYSMAN      &lt;br /&gt;USER_ID&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt; 72      &lt;br /&gt;PASSWORD&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt;      &lt;br /&gt;ACCOUNT_STATUS&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt; OPEN      &lt;br /&gt;LOCK_DATE&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt;      &lt;br /&gt;EXPIRY_DATE&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt; 24-AUG-10      &lt;br /&gt;DEFAULT_TABLESPACE&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt; SYSAUX      &lt;br /&gt;TEMPORARY_TABLESPACE&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt; TEMP      &lt;br /&gt;CREATED&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt; 13-AUG-09      &lt;br /&gt;PROFILE&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt; DEFAULT      &lt;br /&gt;INITIAL_RSRC_CONSUMER_GROUP&amp;#160;&amp;#160;&amp;#160; --&amp;gt; DEFAULT_CONSUMER_GROUP      &lt;br /&gt;EXTERNAL_NAME&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt;      &lt;br /&gt;PASSWORD_VERSIONS&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt; 10G 11G      &lt;br /&gt;EDITIONS_ENABLED&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt; N      &lt;br /&gt;AUTHENTICATION_TYPE&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt; PASSWORD      &lt;br /&gt;================================================================================      &lt;br /&gt;USERNAME&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt; SYSTEM      &lt;br /&gt;USER_ID&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt; 5      &lt;br /&gt;PASSWORD&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt;      &lt;br /&gt;ACCOUNT_STATUS&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt; OPEN      &lt;br /&gt;LOCK_DATE&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt;      &lt;br /&gt;EXPIRY_DATE&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt; 24-AUG-10      &lt;br /&gt;DEFAULT_TABLESPACE&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt; SYSTEM      &lt;br /&gt;TEMPORARY_TABLESPACE&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt; TEMP      &lt;br /&gt;CREATED&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt; 13-AUG-09      &lt;br /&gt;PROFILE&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt; DEFAULT      &lt;br /&gt;INITIAL_RSRC_CONSUMER_GROUP&amp;#160;&amp;#160;&amp;#160; --&amp;gt; SYS_GROUP      &lt;br /&gt;EXTERNAL_NAME&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt;      &lt;br /&gt;PASSWORD_VERSIONS&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt; 10G 11G      &lt;br /&gt;EDITIONS_ENABLED&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt; N      &lt;br /&gt;AUTHENTICATION_TYPE&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt; PASSWORD&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800080"&gt;PL/SQL procedure successfully completed.&lt;/font&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2959498105239183642-6188705358019952097?l=todayguesswhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/6188705358019952097/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://todayguesswhat.blogspot.com/2010/07/view-oracle-sql-query-results-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/6188705358019952097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/6188705358019952097'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/2010/07/view-oracle-sql-query-results-with.html' title='View ORACLE SQL query results with columns rendered vertically'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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-2959498105239183642.post-5991674800944233191</id><published>2010-07-07T16:32:00.001+10:00</published><updated>2010-07-07T16:32:37.244+10:00</updated><title type='text'>Mount ISO from Apple TV Command-Line-Interface CLI</title><content type='html'>&lt;p&gt;&lt;font face="Courier New"&gt;hdiutil mount Australia.iso&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;font color="#808080" size="2"&gt;/dev/disk3&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /Volumes/AUSTRALIA&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;ls /Volumes/AUSTRALIA&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;font color="#808080" size="2"&gt;AUDIO_TS&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; VIDEO_TS&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;hdiutil unmount /Volumes/AUSTRALIA&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080" size="2"&gt;&lt;em&gt;&amp;quot;disk3&amp;quot; unmounted successfully.&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2959498105239183642-5991674800944233191?l=todayguesswhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/5991674800944233191/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://todayguesswhat.blogspot.com/2010/07/mount-iso-from-apple-tv-command-line.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/5991674800944233191'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/5991674800944233191'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/2010/07/mount-iso-from-apple-tv-command-line.html' title='Mount ISO from Apple TV Command-Line-Interface CLI'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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-2959498105239183642.post-1122153104184047275</id><published>2010-06-09T17:20:00.001+10:00</published><updated>2010-06-09T17:20:47.977+10:00</updated><title type='text'>VBScript FTP Upload Sample (leverages Windows FTP client)</title><content type='html'>&lt;p&gt;Save the following as upload.vbs and execute&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;'------------------------------------------------------------------------------     &lt;br /&gt;Const appName = &amp;quot;FTP Upload Utility&amp;quot;      &lt;br /&gt;'------------------------------------------------------------------------------ &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;Const defaultHostname = &amp;quot;ftp.example.com&amp;quot;     &lt;br /&gt;Const defaultPort = 21      &lt;br /&gt;Const defaultUsername = &amp;quot;mshannon&amp;quot;      &lt;br /&gt;Const defaultPassword = &amp;quot;welcome1&amp;quot;      &lt;br /&gt;Const defaultRemoteDir = &amp;quot;/home/mshannon&amp;quot; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;' set this var to the fully qualified path of a local file to prevent file      &lt;br /&gt;' selection dialog from being displayed      &lt;br /&gt;defaultFile = &amp;quot;&amp;quot;       &lt;br /&gt;' defaultFile = &amp;quot;C:\Documents and Settings\Administrator\Desktop\SecurityFilter.zip&amp;quot; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;' if useDefaultsExclusively = True, the default values above will be leveraged      &lt;br /&gt;' as-is, meaning no override options will be prompted for.      &lt;br /&gt;Const useDefaultsExclusively = False      &lt;br /&gt;' Const useDefaultsExclusively = True &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;' if skipConfirmation = True, the upload will be attempted without requesting      &lt;br /&gt;' confirmation to commence.      &lt;br /&gt;Const skipConfirmation = False      &lt;br /&gt;' Const skipConfirmation = True &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;'------------------------------------------------------------------------------ &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;Set shell = CreateObject( &amp;quot;WScript.Shell&amp;quot; )     &lt;br /&gt;defaultLocalDir = shell.ExpandEnvironmentStrings(&amp;quot;%USERPROFILE%&amp;quot;) &amp;amp; &amp;quot;\Desktop&amp;quot;      &lt;br /&gt;Set shell = Nothing &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;hostname = GetNonEmptyValue(useDefaultsExclusively, defaultHostname, _     &lt;br /&gt;&amp;#160; &amp;quot;Enter FTP server remote hostname:&amp;quot;, &amp;quot;Hostname&amp;quot;) &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;port = GetNonEmptyValue(useDefaultsExclusively, defaultPort, _     &lt;br /&gt;&amp;#160; &amp;quot;Enter FTP server remote port:&amp;quot;, &amp;quot;Port&amp;quot;) &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;username = GetNonEmptyValue(useDefaultsExclusively, defaultUsername, _     &lt;br /&gt;&amp;#160; &amp;quot;Enter username:&amp;quot;, &amp;quot;Username&amp;quot;) &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;password = GetNonEmptyValue(useDefaultsExclusively, defaultPassword, _     &lt;br /&gt;&amp;#160; &amp;quot;Enter password:&amp;quot;, &amp;quot;Password&amp;quot;) &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;If Len(defaultFile) &amp;gt; 0 Then     &lt;br /&gt;&amp;#160; file = defaultFile      &lt;br /&gt;Else      &lt;br /&gt;&amp;#160; file = ChooseFile(defaultLocalDir)      &lt;br /&gt;&amp;#160; TestNotEmpty file, &amp;quot;Upload File&amp;quot;      &lt;br /&gt;End If &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;Set fso = CreateObject(&amp;quot;Scripting.FileSystemObject&amp;quot;)     &lt;br /&gt;localFile = fso.getFileName(file)      &lt;br /&gt;localDir = fso.getParentFolderName(file)      &lt;br /&gt;Set fso = Nothing &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;remoteDir = GetNonEmptyValue(useDefaultsExclusively, defaultRemoteDir, _     &lt;br /&gt;&amp;#160; &amp;quot;Remote upload directory:&amp;quot;, &amp;quot;Remote Directory&amp;quot;) &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;Msg = &amp;quot;You have requested to upload &amp;quot; &amp;amp; localFile &amp;amp; &amp;quot; to &lt;/font&gt;&lt;a href="ftp://&amp;quot;"&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;ftp://&amp;quot;&lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt; &amp;amp; _     &lt;br /&gt;&amp;#160; username &amp;amp; &amp;quot;@&amp;quot; &amp;amp; hostname &amp;amp; &amp;quot;:&amp;quot; &amp;amp; port &amp;amp; remoteDir &amp;amp; _      &lt;br /&gt;&amp;#160; vbCRLF &amp;amp; _      &lt;br /&gt;&amp;#160; vbCRLF &amp;amp; &amp;quot;Note - This may take quite some time!&amp;quot; &amp;amp; _      &lt;br /&gt;&amp;#160; vbCRLF &amp;amp; _      &lt;br /&gt;&amp;#160; vbCRLF &amp;amp; &amp;quot;Click OK to start upload.&amp;quot; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;' VB appears to evaluate all the &amp;quot;OR&amp;quot; conditions when using if t1 OR t2 then ...     &lt;br /&gt;' hence, it does not stop testing the conditions after the first condition       &lt;br /&gt;' it detects is true. Thus the silly logic below...      &lt;br /&gt;If skipConfirmation Then      &lt;br /&gt;&amp;#160; Upload hostname, port, username, password, localFile, localDir, remoteDir      &lt;br /&gt;ElseIf vbOK = MsgBox(Msg, vbOKCancel, appName) Then      &lt;br /&gt;&amp;#160; Upload hostname, port, username, password, localFile, localDir, remoteDir      &lt;br /&gt;End If &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;'------------------------------------------------------------------------------ &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;Function GetNonEmptyValue(useDefaultExclusively, defaultValue, prompt, dialogTitle) &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; If useDefaultExclusively Then     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; value = defaultValue      &lt;br /&gt;&amp;#160; Else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; value = InputBox(prompt, dialogTitle, defaultValue)      &lt;br /&gt;&amp;#160; End If &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; TestNotEmpty value, dialogTitle     &lt;br /&gt;&amp;#160; GetNonEmptyValue = value      &lt;br /&gt;End Function &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;'------------------------------------------------------------------------------ &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;Sub TestNotEmpty(value, description)     &lt;br /&gt;&amp;#160; If Len(value) = 0 Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; MsgBox &amp;quot;ERROR: No value provided for &amp;quot; &amp;amp; description, vbExclamation, appName      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; wscript.quit      &lt;br /&gt;&amp;#160; End If      &lt;br /&gt;End Sub &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;'------------------------------------------------------------------------------ &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;Function ChooseFile(initialDir)     &lt;br /&gt;&amp;#160; Set cd = CreateObject(&amp;quot;UserAccounts.CommonDialog&amp;quot;) &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; cd.InitialDir = initialDir     &lt;br /&gt;&amp;#160; cd.Filter = &amp;quot;ZIP files|*.zip|Text Documents|*.txt|Shell Scripts|*.*sh|All Files|*.*&amp;quot;       &lt;br /&gt;&amp;#160; ' filter index 4 would show all files by default      &lt;br /&gt;&amp;#160; ' filter index 1 would should zip files by default      &lt;br /&gt;&amp;#160; cd.FilterIndex = 1      &lt;br /&gt;&amp;#160; If cd.ShowOpen = True Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ChooseFile = cd.FileName      &lt;br /&gt;&amp;#160; Else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ChooseFile = &amp;quot;&amp;quot;      &lt;br /&gt;&amp;#160; End If      &lt;br /&gt;&amp;#160; Set cd = Nothing      &lt;br /&gt;End Function &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;'------------------------------------------------------------------------------ &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;Sub Upload(hostname, port, username, password, localFile, localDir, remoteDir) &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; Set shell = CreateObject(&amp;quot;WScript.Shell&amp;quot;)     &lt;br /&gt;&amp;#160; Set fso = CreateObject(&amp;quot;Scripting.FileSystemObject&amp;quot;) &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; tempDir = shell.ExpandEnvironmentStrings(&amp;quot;%TEMP%&amp;quot;)     &lt;br /&gt;&amp;#160; ' temporary script file supplied to Windows FTP client      &lt;br /&gt;&amp;#160; scriptFile = tempDir &amp;amp; &amp;quot;\&amp;quot; &amp;amp; fso.GetTempName      &lt;br /&gt;&amp;#160; ' temporary file to store standard output from Windows FTP client      &lt;br /&gt;&amp;#160; outputFile = tempDir &amp;amp; &amp;quot;\&amp;quot; &amp;amp; fso.GetTempName &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; 'input script     &lt;br /&gt;&amp;#160; script = script &amp;amp; &amp;quot;lcd &amp;quot; &amp;amp; &amp;quot;&amp;quot;&amp;quot;&amp;quot; &amp;amp; localDir &amp;amp; &amp;quot;&amp;quot;&amp;quot;&amp;quot; &amp;amp; vbCRLF      &lt;br /&gt;&amp;#160; script = script &amp;amp; &amp;quot;open &amp;quot; &amp;amp; hostname &amp;amp; &amp;quot; &amp;quot; &amp;amp; port &amp;amp; vbCRLF      &lt;br /&gt;&amp;#160; script = script &amp;amp; &amp;quot;user &amp;quot; &amp;amp; username &amp;amp; vbCRLF      &lt;br /&gt;&amp;#160; script = script &amp;amp; password &amp;amp; vbCRLF      &lt;br /&gt;&amp;#160; script = script &amp;amp; &amp;quot;cd &amp;quot; &amp;amp; &amp;quot;&amp;quot;&amp;quot;&amp;quot; &amp;amp; remoteDir &amp;amp; &amp;quot;&amp;quot;&amp;quot;&amp;quot; &amp;amp; vbCRLF      &lt;br /&gt;&amp;#160; script = script &amp;amp; &amp;quot;binary&amp;quot; &amp;amp; vbCRLF      &lt;br /&gt;&amp;#160; script = script &amp;amp; &amp;quot;prompt n&amp;quot; &amp;amp; vbCRLF      &lt;br /&gt;&amp;#160; script = script &amp;amp; &amp;quot;put &amp;quot; &amp;amp; &amp;quot;&amp;quot;&amp;quot;&amp;quot; &amp;amp; localFile &amp;amp; &amp;quot;&amp;quot;&amp;quot;&amp;quot; &amp;amp; vbCRLF      &lt;br /&gt;&amp;#160; script = script &amp;amp; &amp;quot;quit&amp;quot; &amp;amp; vbCRLF &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; Set textFile = fso.CreateTextFile(scriptFile, True)     &lt;br /&gt;&amp;#160; textFile.WriteLine(script)      &lt;br /&gt;&amp;#160; textFile.Close      &lt;br /&gt;&amp;#160; Set textFile = Nothing &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; ' bWaitOnReturn set to TRUE - indicating script should wait for the program      &lt;br /&gt;&amp;#160; ' to finish executing before continuing to the next statement      &lt;br /&gt;&amp;#160; shell.Run &amp;quot;%comspec% /c FTP -n -s:&amp;quot; &amp;amp; scriptFile &amp;amp; &amp;quot; &amp;gt; &amp;quot; &amp;amp; outputFile, 0, TRUE      &lt;br /&gt;&amp;#160; Wscript.Sleep 500      &lt;br /&gt;&amp;#160; ' open standard output temp file read only, failing if not present      &lt;br /&gt;&amp;#160; Set textFile = fso.OpenTextFile(outputFile, 1, 0, -2)      &lt;br /&gt;&amp;#160; results = textFile.ReadAll      &lt;br /&gt;&amp;#160; textFile.Close      &lt;br /&gt;&amp;#160; Set textFile = Nothing      &lt;br /&gt;&amp;#160; If InStr(results, &amp;quot;550&amp;quot;) &amp;gt; 0 And InStr(results, &amp;quot;226&amp;quot;) Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; fso.DeleteFile(scriptFile)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; fso.DeleteFile(outputFile)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Msg =&amp;quot;WARNING: Could not change to destination directory on host!&amp;quot; &amp;amp; _      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; vbCRLF &amp;amp; &amp;quot;File however appears to have been uploaded to default &amp;quot; &amp;amp; _      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;FTP directory associated with user on host.&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; MsgBox Msg, vbExclamation, appName &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; ElseIf InStr(results, &amp;quot;226&amp;quot;) &amp;gt; 0 Then     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; MsgBox &amp;quot;File Uploaded Successfully.&amp;quot;, vbInformation, appName      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; fso.DeleteFile(scriptFile)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; fso.DeleteFile(outputFile)      &lt;br /&gt;&amp;#160; Else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; If InStr(results, &amp;quot;530&amp;quot;) &amp;gt; 0 Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Msg =&amp;quot;ERROR: Invalid Username/Password&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ElseIf InStr(results, &amp;quot;550&amp;quot;) &amp;gt; 0 Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Msg =&amp;quot;ERROR: Could not change to destination directory on host&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ElseIf InStr(results, &amp;quot;553&amp;quot;) &amp;gt; 0 Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Msg =&amp;quot;ERROR: Could not create file on host&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ElseIf InStr(results, &amp;quot;Unknown host&amp;quot;) &amp;gt; 0 Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Msg =&amp;quot;ERROR: Unknown host&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ElseIf InStr(results, &amp;quot;File not found&amp;quot;) &amp;gt; 0 Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Msg =&amp;quot;ERROR: Local File Not Found&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Msg =&amp;quot;An ERROR may have occurred.&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; End If &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160;&amp;#160;&amp;#160; Msg = Msg &amp;amp; _     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; vbCRLF &amp;amp; &amp;quot;Script file leveraged: &amp;quot; &amp;amp; scriptFile &amp;amp; _      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; vbCRLF &amp;amp; &amp;quot;FTP Output file: &amp;quot; &amp;amp; outputFile &amp;amp; _      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; vbCRLF &amp;amp; _      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; vbCRLF &amp;amp; &amp;quot;Ensure the above files are manually deleted, as they may &amp;quot; &amp;amp; _      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;contain sensitive information!&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ' Wscript.Echo Msg      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; MsgBox Msg, vbCritical, appName      &lt;br /&gt;&amp;#160; End If      &lt;br /&gt;&amp;#160; Set shell = Nothing      &lt;br /&gt;&amp;#160; Set fso = Nothing &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;End Sub&lt;/font&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2959498105239183642-1122153104184047275?l=todayguesswhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/1122153104184047275/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://todayguesswhat.blogspot.com/2010/06/vbscript-ftp-upload-sample-leverages.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/1122153104184047275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/1122153104184047275'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/2010/06/vbscript-ftp-upload-sample-leverages.html' title='VBScript FTP Upload Sample (leverages Windows FTP client)'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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-2959498105239183642.post-7208050605667941464</id><published>2010-06-09T17:17:00.001+10:00</published><updated>2010-06-09T17:17:18.684+10:00</updated><title type='text'>VBScript FTP Download Sample (leverages Windows FTP client)</title><content type='html'>&lt;p&gt;Save the following as download.vbs and execute&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;'------------------------------------------------------------------------------      &lt;br /&gt;Const appName = &amp;quot;FTP Download Utility&amp;quot;       &lt;br /&gt;'------------------------------------------------------------------------------ &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;Const defaultHostname = &amp;quot;ftp.example.com&amp;quot;      &lt;br /&gt;Const defaultPort = 21       &lt;br /&gt;Const defaultUsername = &amp;quot;mshannon&amp;quot;       &lt;br /&gt;Const defaultPassword = &amp;quot;welcome1&amp;quot;       &lt;br /&gt;Const defaultRemoteDir = &amp;quot;/home/mshannon&amp;quot;       &lt;br /&gt;Const defaultRemoteFile = &amp;quot;*.zip&amp;quot; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;' set this var to the fully qualified path of a local directory to prevent      &lt;br /&gt;' directory selection dialog from being displayed       &lt;br /&gt;defaultLocalDir = &amp;quot;&amp;quot;       &lt;br /&gt;' defaultLocalDir = &amp;quot;C:\Documents and Settings\Administrator\Desktop&amp;quot; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;' if useDefaultsExclusively = True, the default values above will be leveraged      &lt;br /&gt;' as-is, meaning no override options will be prompted for.       &lt;br /&gt;Const useDefaultsExclusively = False       &lt;br /&gt;' Const useDefaultsExclusively = True &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;' if skipConfirmation = True, the download will be attempted without requesting      &lt;br /&gt;' confirmation to commence.       &lt;br /&gt;Const skipConfirmation = False       &lt;br /&gt;' Const skipConfirmation = True &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;'------------------------------------------------------------------------------ &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;hostname = GetNonEmptyValue(useDefaultsExclusively, defaultHostname, _      &lt;br /&gt;&amp;#160; &amp;quot;Enter FTP server remote hostname:&amp;quot;, &amp;quot;Hostname&amp;quot;) &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;port = GetNonEmptyValue(useDefaultsExclusively, defaultPort, _      &lt;br /&gt;&amp;#160; &amp;quot;Enter FTP server remote port:&amp;quot;, &amp;quot;Port&amp;quot;) &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;username = GetNonEmptyValue(useDefaultsExclusively, defaultUsername, _      &lt;br /&gt;&amp;#160; &amp;quot;Enter username:&amp;quot;, &amp;quot;Username&amp;quot;) &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;password = GetNonEmptyValue(useDefaultsExclusively, defaultPassword, _      &lt;br /&gt;&amp;#160; &amp;quot;Enter password:&amp;quot;, &amp;quot;Password&amp;quot;) &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;If Len(defaultLocalDir) &amp;gt; 0 Then      &lt;br /&gt;&amp;#160; localDir = defaultLocalDir       &lt;br /&gt;Else       &lt;br /&gt;&amp;#160; Set shell = CreateObject( &amp;quot;WScript.Shell&amp;quot; )       &lt;br /&gt;&amp;#160; defaultLocalDir = shell.ExpandEnvironmentStrings(&amp;quot;%USERPROFILE%&amp;quot;) &amp;amp; &amp;quot;\Desktop&amp;quot;       &lt;br /&gt;&amp;#160; Set shell = Nothing       &lt;br /&gt;&amp;#160; localDir = ChooseDirectory(defaultLocalDir, &amp;quot;Local Download Directory&amp;quot;)       &lt;br /&gt;&amp;#160; TestNotEmpty localDir, &amp;quot;Local Directory&amp;quot;       &lt;br /&gt;End If &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;remoteDir = GetNonEmptyValue(useDefaultsExclusively, defaultRemoteDir, _      &lt;br /&gt;&amp;#160; &amp;quot;Remote download directory:&amp;quot;, &amp;quot;Remote Directory&amp;quot;) &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;remoteFile = GetNonEmptyValue(useDefaultsExclusively, defaultRemoteFile, _      &lt;br /&gt;&amp;#160; &amp;quot;Remote file to download (wildcard ok):&amp;quot;, &amp;quot;Remote File&amp;quot;) &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;Msg = &amp;quot;You have requested to download &amp;quot; &amp;amp; remoteFile &amp;amp; &amp;quot; from &lt;/font&gt;&lt;a href="ftp://&amp;quot;"&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;ftp://&amp;quot;&lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt; &amp;amp; _      &lt;br /&gt;&amp;#160; username &amp;amp; &amp;quot;@&amp;quot; &amp;amp; hostname &amp;amp; &amp;quot;:&amp;quot; &amp;amp; port &amp;amp; remoteDir &amp;amp; _       &lt;br /&gt;&amp;#160; vbCRLF &amp;amp; &amp;quot;to: &amp;quot; &amp;amp; localDir &amp;amp; _       &lt;br /&gt;&amp;#160; vbCRLF &amp;amp; _       &lt;br /&gt;&amp;#160; vbCRLF &amp;amp; &amp;quot;Note - This may take quite some time!&amp;quot; &amp;amp; _       &lt;br /&gt;&amp;#160; vbCRLF &amp;amp; _       &lt;br /&gt;&amp;#160; vbCRLF &amp;amp; &amp;quot;Click OK to start download.&amp;quot; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;' VB appears to evaluate all the &amp;quot;OR&amp;quot; conditions when using if t1 OR t2 then ...      &lt;br /&gt;' hence, it does not stop testing the conditions after the first condition       &lt;br /&gt;' it detects is true. Thus the silly logic below...       &lt;br /&gt;If skipConfirmation Then       &lt;br /&gt;&amp;#160; Download hostname, port, username, password, localDir, remoteDir, remoteFile       &lt;br /&gt;ElseIf vbOK = MsgBox(Msg, vbOKCancel, appName) Then       &lt;br /&gt;&amp;#160; Download hostname, port, username, password, localDir, remoteDir, remoteFile       &lt;br /&gt;End If &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;'------------------------------------------------------------------------------ &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;Function GetNonEmptyValue(useDefaultExclusively, defaultValue, prompt, dialogTitle) &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; If useDefaultExclusively Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; value = defaultValue       &lt;br /&gt;&amp;#160; Else       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; value = InputBox(prompt, dialogTitle, defaultValue)       &lt;br /&gt;&amp;#160; End If &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; TestNotEmpty value, dialogTitle      &lt;br /&gt;&amp;#160; GetNonEmptyValue = value       &lt;br /&gt;End Function &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;'------------------------------------------------------------------------------ &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;Sub TestNotEmpty(value, description)      &lt;br /&gt;&amp;#160; If Len(value) = 0 Then       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; MsgBox &amp;quot;ERROR: No value provided for &amp;quot; &amp;amp; description, vbExclamation, appName       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; wscript.quit       &lt;br /&gt;&amp;#160; End If       &lt;br /&gt;End Sub &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;'------------------------------------------------------------------------------ &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;Function ChooseDirectory(initialDir, prompt)      &lt;br /&gt;&amp;#160; Set objShell&amp;#160; = CreateObject( &amp;quot;Shell.Application&amp;quot; ) &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; options = &amp;amp;H10&amp;amp; 'show text field to type folder path      &lt;br /&gt;&amp;#160; 'options = 0&amp;#160;&amp;#160;&amp;#160; 'don't show text field to type folder path &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; Set objFolder = objShell.BrowseForFolder(0, prompt, options, initialDir) &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; If objFolder Is Nothing Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ChooseDirectory = &amp;quot;&amp;quot;       &lt;br /&gt;&amp;#160; Else       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ChooseDirectory = objFolder.Self.Path       &lt;br /&gt;&amp;#160; End If &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; Set objFolder = Nothing      &lt;br /&gt;&amp;#160; Set objShell = Nothing       &lt;br /&gt;End Function &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;'------------------------------------------------------------------------------ &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;Sub Download(hostname, port, username, password, localDir, remoteDir, remoteFile) &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; Set shell = CreateObject(&amp;quot;WScript.Shell&amp;quot;)      &lt;br /&gt;&amp;#160; Set fso = CreateObject(&amp;quot;Scripting.FileSystemObject&amp;quot;) &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; tempDir = shell.ExpandEnvironmentStrings(&amp;quot;%TEMP%&amp;quot;)      &lt;br /&gt;&amp;#160; ' temporary script file supplied to Windows FTP client       &lt;br /&gt;&amp;#160; scriptFile = tempDir &amp;amp; &amp;quot;\&amp;quot; &amp;amp; fso.GetTempName       &lt;br /&gt;&amp;#160; ' temporary file to store standard output from Windows FTP client       &lt;br /&gt;&amp;#160; outputFile = tempDir &amp;amp; &amp;quot;\&amp;quot; &amp;amp; fso.GetTempName &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; 'input script      &lt;br /&gt;&amp;#160; script = script &amp;amp; &amp;quot;lcd &amp;quot; &amp;amp; &amp;quot;&amp;quot;&amp;quot;&amp;quot; &amp;amp; localDir &amp;amp; &amp;quot;&amp;quot;&amp;quot;&amp;quot; &amp;amp; vbCRLF       &lt;br /&gt;&amp;#160; script = script &amp;amp; &amp;quot;open &amp;quot; &amp;amp; hostname &amp;amp; &amp;quot; &amp;quot; &amp;amp; port &amp;amp; vbCRLF       &lt;br /&gt;&amp;#160; script = script &amp;amp; &amp;quot;user &amp;quot; &amp;amp; username &amp;amp; vbCRLF       &lt;br /&gt;&amp;#160; script = script &amp;amp; password &amp;amp; vbCRLF       &lt;br /&gt;&amp;#160; script = script &amp;amp; &amp;quot;cd &amp;quot; &amp;amp; &amp;quot;&amp;quot;&amp;quot;&amp;quot; &amp;amp; remoteDir &amp;amp; &amp;quot;&amp;quot;&amp;quot;&amp;quot; &amp;amp; vbCRLF       &lt;br /&gt;&amp;#160; script = script &amp;amp; &amp;quot;binary&amp;quot; &amp;amp; vbCRLF       &lt;br /&gt;&amp;#160; script = script &amp;amp; &amp;quot;prompt n&amp;quot; &amp;amp; vbCRLF       &lt;br /&gt;&amp;#160; script = script &amp;amp; &amp;quot;mget &amp;quot; &amp;amp; &amp;quot;&amp;quot;&amp;quot;&amp;quot; &amp;amp; remoteFile &amp;amp; &amp;quot;&amp;quot;&amp;quot;&amp;quot; &amp;amp; vbCRLF       &lt;br /&gt;&amp;#160; script = script &amp;amp; &amp;quot;quit&amp;quot; &amp;amp; vbCRLF &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; Set textFile = fso.CreateTextFile(scriptFile, True)      &lt;br /&gt;&amp;#160; textFile.WriteLine(script)       &lt;br /&gt;&amp;#160; textFile.Close       &lt;br /&gt;&amp;#160; Set textFile = Nothing &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; ' bWaitOnReturn set to TRUE - indicating script should wait for the program to      &lt;br /&gt;&amp;#160; ' finish executing before continuing to the next statement       &lt;br /&gt;&amp;#160; shell.Run &amp;quot;%comspec% /c FTP -n -s:&amp;quot; &amp;amp; scriptFile &amp;amp; &amp;quot; &amp;gt; &amp;quot; &amp;amp; outputFile, 0, TRUE       &lt;br /&gt;&amp;#160; Wscript.Sleep 500       &lt;br /&gt;&amp;#160; ' open standard output temp file read only, failing if not present       &lt;br /&gt;&amp;#160; Set textFile = fso.OpenTextFile(outputFile, 1, 0, -2)       &lt;br /&gt;&amp;#160; results = textFile.ReadAll       &lt;br /&gt;&amp;#160; textFile.Close       &lt;br /&gt;&amp;#160; Set textFile = Nothing       &lt;br /&gt;&amp;#160; If InStr(results, &amp;quot;550&amp;quot;) &amp;gt; 0 And InStr(results, &amp;quot;226&amp;quot;) Then       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; fso.DeleteFile(scriptFile)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; fso.DeleteFile(outputFile)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Msg =&amp;quot;WARNING: Could not change to destination directory on host!&amp;quot; &amp;amp; _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; vbCRLF &amp;amp; &amp;quot;File(s) however appear to have been downloaded from default &amp;quot; &amp;amp; _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;FTP directory associated with user on host.&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; MsgBox Msg, vbExclamation, appName &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160; ElseIf InStr(results, &amp;quot;226&amp;quot;) &amp;gt; 0 Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; MsgBox &amp;quot;File(s) Downloaded Successfully.&amp;quot;, vbInformation, appName       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; fso.DeleteFile(scriptFile)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; fso.DeleteFile(outputFile)       &lt;br /&gt;&amp;#160; Else       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; If InStr(results, &amp;quot;530&amp;quot;) &amp;gt; 0 Then       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Msg =&amp;quot;ERROR: Invalid Username/Password&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ElseIf InStr(results, &amp;quot;550&amp;quot;) &amp;gt; 0 Then       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Msg =&amp;quot;ERROR: Could not open file on host&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ElseIf InStr(results, &amp;quot;553&amp;quot;) &amp;gt; 0 Then       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Msg =&amp;quot;ERROR: Could not create file on host&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ElseIf InStr(results, &amp;quot;Unknown host&amp;quot;) &amp;gt; 0 Then       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Msg =&amp;quot;ERROR: Unknown host&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ElseIf InStr(results, &amp;quot;File not found&amp;quot;) &amp;gt; 0 Then       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Msg =&amp;quot;ERROR: Local Directory Not Found&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Else       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Msg =&amp;quot;An ERROR may have occurred.&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; End If &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;#160;&amp;#160;&amp;#160; Msg = Msg &amp;amp; _      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; vbCRLF &amp;amp; &amp;quot;Script file leveraged: &amp;quot; &amp;amp; scriptFile &amp;amp; _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; vbCRLF &amp;amp; &amp;quot;FTP Output file: &amp;quot; &amp;amp; outputFile &amp;amp; _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; vbCRLF &amp;amp; _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; vbCRLF &amp;amp; &amp;quot;Ensure the above files are manually deleted, as they may &amp;quot; &amp;amp; _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;contain sensitive information!&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ' Wscript.Echo Msg       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; MsgBox Msg, vbCritical, appName       &lt;br /&gt;&amp;#160; End If       &lt;br /&gt;&amp;#160; Set shell = Nothing       &lt;br /&gt;&amp;#160; Set fso = Nothing &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;End Sub&lt;/font&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2959498105239183642-7208050605667941464?l=todayguesswhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/7208050605667941464/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://todayguesswhat.blogspot.com/2010/06/vbscript-ftp-download-sample-leverages.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/7208050605667941464'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/7208050605667941464'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/2010/06/vbscript-ftp-download-sample-leverages.html' title='VBScript FTP Download Sample (leverages Windows FTP client)'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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-2959498105239183642.post-6972868714143931713</id><published>2010-06-09T16:28:00.001+10:00</published><updated>2010-06-09T20:07:20.081+10:00</updated><title type='text'>I’m trying out Windows Live Writer</title><content type='html'>&lt;p&gt;Posting code samples on Blogger is a major PITA.&lt;/p&gt;  &lt;p&gt;So I’m going to try out Micro$oft’s FREE Windows Live Writer and see if it does what it claims, starting with some Visual Basic code samples to script the Windows XP client.&lt;/p&gt;  &lt;p&gt;Update:&amp;#160; It works a treat!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2959498105239183642-6972868714143931713?l=todayguesswhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/6972868714143931713/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://todayguesswhat.blogspot.com/2010/06/im-trying-out-windows-live-writer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/6972868714143931713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/6972868714143931713'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/2010/06/im-trying-out-windows-live-writer.html' title='I’m trying out Windows Live Writer'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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-2959498105239183642.post-55082433718448738</id><published>2010-05-06T07:39:00.000+10:00</published><updated>2010-06-09T20:05:56.180+10:00</updated><title type='text'>Splendour 2010 Tickets - backdoor direct access</title><content type='html'>Update 2.16 pm.. all tickets are now sold out  &lt;br /&gt;  &lt;br /&gt;Update 1.44 pm.. camping tix sold out.  &lt;br /&gt;  &lt;br /&gt;Direct access to splendour 2010 tickets; there is no scam people ; it is a simple html file;  &lt;br /&gt;  &lt;br /&gt;&lt;a href="http://www.datafilehost.com/download-704e3f41.html"&gt;splendour.html&lt;/a&gt;  &lt;p&gt;Here is the code:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#800080"&gt;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;     &lt;br /&gt;&amp;lt;form id=&amp;quot;aspnetForm&amp;quot; action=&amp;quot;&lt;/font&gt;&lt;a href="https://www.moshtix.com.au/Booking/bookEvent_start.asp?pLock=False"&gt;&lt;font face="Courier New" color="#800080"&gt;https://www.moshtix.com.au/Booking/bookEvent_start.asp?pLock=False&lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New" color="#800080"&gt;&amp;quot; method=&amp;quot;post&amp;quot; name=&amp;quot;aspnetForm&amp;quot;&amp;gt;     &lt;br /&gt;&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;__EVENTTARGET&amp;quot; id=&amp;quot;__EVENTTARGET&amp;quot; value=&amp;quot;&amp;quot;&amp;gt;      &lt;br /&gt;&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;__EVENTARGUMENT&amp;quot; id=&amp;quot;__EVENTARGUMENT&amp;quot; value=&amp;quot;&amp;quot;&amp;gt;      &lt;br /&gt;&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;EventID&amp;quot; value=&amp;quot;36343&amp;quot;&amp;gt;      &lt;br /&gt;&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;PhoneSale&amp;quot; value=&amp;quot;False&amp;quot;&amp;gt;       &lt;br /&gt;&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;Caller&amp;quot; value=&amp;quot;moshfest&amp;quot;&amp;gt;      &lt;br /&gt;&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;noadd&amp;quot; value=&amp;quot;False&amp;quot;&amp;gt;      &lt;br /&gt;&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;skin&amp;quot; value=&amp;quot;&amp;quot;&amp;gt;      &lt;br /&gt;&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;CallerUrl&amp;quot; value=&amp;quot;&lt;/font&gt;&lt;a href="http://www.moshtix.com.au/event.aspx?id=36343&amp;amp;amp;ref=moshfest"&gt;&lt;font face="Courier New" color="#800080"&gt;http://www.moshtix.com.au/event.aspx?id=36343&amp;amp;amp;ref=moshfest&lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New" color="#800080"&gt;&amp;quot;&amp;gt;     &lt;br /&gt;&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;QueID&amp;quot; value=&amp;quot;&amp;quot;&amp;gt;      &lt;br /&gt;&amp;lt;select name=&amp;quot;lTicketTypeID0&amp;quot;&amp;gt;      &lt;br /&gt;&amp;lt;option value=&amp;quot;65479&amp;quot;&amp;gt;Carbon Offset Event-Only ticket $363.25&amp;lt;/option&amp;gt;      &lt;br /&gt;&amp;lt;option value=&amp;quot;65480&amp;quot;&amp;gt;Carbon Offset Event and Camping ticket $464.85&amp;lt;/option&amp;gt;      &lt;br /&gt;&amp;lt;option value=&amp;quot;65541&amp;quot;&amp;gt;Event-Only Ticket $360.20&amp;lt;/option&amp;gt;      &lt;br /&gt;&amp;lt;option selected value=&amp;quot;65542&amp;quot;&amp;gt;Event and Camping ticket $461.80&amp;lt;/option&amp;gt;      &lt;br /&gt;&amp;lt;/select&amp;gt;      &lt;br /&gt;&amp;lt;select name=&amp;quot;lQuantity0&amp;quot;&amp;gt;      &lt;br /&gt;&amp;lt;option value=&amp;quot;1&amp;quot;&amp;gt;1 Ticket&amp;lt;/option&amp;gt;      &lt;br /&gt;&amp;lt;option value=&amp;quot;2&amp;quot;&amp;gt;2 Tickets&amp;lt;/option&amp;gt;      &lt;br /&gt;&amp;lt;option value=&amp;quot;3&amp;quot;&amp;gt;3 Tickets&amp;lt;/option&amp;gt;      &lt;br /&gt;&amp;lt;option value=&amp;quot;4&amp;quot;&amp;gt;4 Tickets&amp;lt;/option&amp;gt;      &lt;br /&gt;&amp;lt;/select&amp;gt;      &lt;br /&gt;&amp;lt;input type=&amp;quot;submit&amp;quot;&amp;gt;      &lt;br /&gt;&amp;lt;/form&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;      &lt;br /&gt;&lt;/font&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2959498105239183642-55082433718448738?l=todayguesswhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/55082433718448738/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://todayguesswhat.blogspot.com/2010/05/splendour-2010-tickets-direct-access.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/55082433718448738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/55082433718448738'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/2010/05/splendour-2010-tickets-direct-access.html' title='Splendour 2010 Tickets - backdoor direct access'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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-2959498105239183642.post-7214836078589103941</id><published>2010-03-18T14:03:00.004+10:00</published><updated>2010-03-18T14:14:02.843+10:00</updated><title type='text'>Updated Instructions for ATV / XBMC / CrystalHD configuration</title><content type='html'>&lt;span style="font-style:italic;"&gt;andy204&lt;span style="font-weight:bold;"&gt;&lt;/span&gt;&lt;/span&gt; over at XBMC forums has created a launcher application that greatly simplifies setup/configuration of the Broadcom CrystalHD on the Apple TV.&lt;br /&gt;&lt;br /&gt;Follow the details from the following post :-&lt;br /&gt;&lt;a href="http://forum.xbmc.org/showthread.php?t=69321"&gt;http://forum.xbmc.org/showthread.php?t=69321&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;My instructions from the post &lt;a href="http://todayguesswhat.blogspot.com/2010/01/thanks-davilla-and-xbmc-team-apple-tv.html"&gt;http://todayguesswhat.blogspot.com/2010/01/thanks-davilla-and-xbmc-team-apple-tv.html&lt;/a&gt; are subsequently deprecated!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2959498105239183642-7214836078589103941?l=todayguesswhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/7214836078589103941/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://todayguesswhat.blogspot.com/2010/03/andy204-over-at-xbmc-forums-has-created.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/7214836078589103941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/7214836078589103941'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/2010/03/andy204-over-at-xbmc-forums-has-created.html' title='Updated Instructions for ATV / XBMC / CrystalHD configuration'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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-2959498105239183642.post-4744506896608958985</id><published>2010-01-13T13:15:00.003+10:00</published><updated>2010-01-13T13:27:53.377+10:00</updated><title type='text'>Obtain Apple TV XBMC nightly build</title><content type='html'>&lt;pre&gt;&lt;span style="font-size:95%; color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 204); font-weight: bold;"&gt;# Should you want the latest available nightly Apple TV xbmc build, then ...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 204);"&gt;# ssh to apple tv as user frontrow, then ...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;defaults read com.teamxbmc.xbmclauncher XBMCAdditionalDownloadPlistURLs 2&gt;/dev/null | grep --silent mirrors.xbmc.org/nightlies/osx/update_urls.plist&lt;br /&gt;if [ $? -eq 1 ]; then&lt;br /&gt;  defaults write com.teamxbmc.xbmclauncher XBMCAdditionalDownloadPlistURLs -array-add http://mirrors.xbmc.org/nightlies/osx/update_urls.plist&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 204);"&gt;# From the Apple TV User Interface, Go to the launcher menu, then choose "Settings", then choose "Downloads"&lt;br /&gt;# - Obtain the appropriate xbmc download build.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2959498105239183642-4744506896608958985?l=todayguesswhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/4744506896608958985/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://todayguesswhat.blogspot.com/2010/01/updated-location-for-nightly-apple-tv.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/4744506896608958985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/4744506896608958985'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/2010/01/updated-location-for-nightly-apple-tv.html' title='Obtain Apple TV XBMC nightly build'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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-2959498105239183642.post-5868163218310251713</id><published>2010-01-08T15:52:00.030+10:00</published><updated>2010-03-18T14:11:38.154+10:00</updated><title type='text'>Thanks Davilla and XBMC team - Apple TV support for Broadcom Crystal HD BCM70012</title><content type='html'>&lt;span style="font-weight:bold;"&gt;NOTE - the following instructions are here for historical reasons!  There is now a much more elegant way to setup XBMC with Crystal HD on the ATV; See &lt;a href="http://forum.xbmc.org/showthread.php?t=69321"&gt;the following post&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Thanks to Davilla!!! and Turbo!!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://xbmc.org/forum/showthread.php?t=55042" target="_blank"&gt;http://xbmc.org/forum/showthread.php?t=55042&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size:95%; color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 204); font-weight: bold;"&gt;# Step 0: http://rufn.it/aTV/  - Install the BroadCom BCM970012 Mini PCI-e HD card as per ewequeone's &lt;a href="http://rufn.it/aTV/"&gt;instructions&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 204);"&gt;# Note! - there is no need to clip the wireless antenna leads.  You can electrical tape them up / heat-shrink-tube them&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 204); font-weight: bold;"&gt;# Step 1: SSH in to the apple tv as the user frontrow using your favourite ssh client&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 204);"&gt;# having successfully logged in, switch to the root user&lt;/span&gt;&lt;br /&gt;sudo -s&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 204);"&gt;# Note! - you will need to manually supply the ROOT password for the ABOVE command before proceeding ...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 204); font-weight: bold;"&gt;# Step 2: Obtain the crystalhd kext, driver, and firmware and install in to the appropriate location&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;cd /tmp&lt;br /&gt;&lt;br /&gt;wget http://crystalhd-for-osx.googlecode.com/files/crystalhd-for-osx-1.0.1.zip&lt;br /&gt;&lt;br /&gt;unzip crystalhd-for-osx-1.0.1.zip&lt;br /&gt;&lt;br /&gt;mv crystalhd-for-osx-1.0.1/BroadcomCrystalHD.kext /System/Library/Extensions&lt;br /&gt;&lt;br /&gt;chown -R root:wheel /System/Library/Extensions/BroadcomCrystalHD.kext&lt;br /&gt;&lt;br /&gt;chmod -R 755 /System/Library/Extensions/BroadcomCrystalHD.kext&lt;br /&gt;&lt;br /&gt;mv crystalhd-for-osx-1.0.1/libcrystalhd.dylib /usr/lib/&lt;br /&gt;&lt;br /&gt;chmod 755 /usr/lib/libcrystalhd.dylib&lt;br /&gt;&lt;br /&gt;mv crystalhd-for-osx-1.0.1/bcmFilePlayFw.bin /usr/lib/&lt;br /&gt;&lt;br /&gt;chmod 644 /usr/lib/bcmFilePlayFw.bin&lt;br /&gt;&lt;br /&gt;rm -rf /tmp/crystalhd-for-osx-1.0.1&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 204); font-weight: bold;"&gt;# Step 3: Ensure that the crystalhd kext is activated at boot time by adding an entry to /etc/rc.local&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 204);"&gt;# to load kexts, we require Turbo's ATV or Kext enabler ...&lt;br /&gt;# check for presence of /sbin/turbo_atv_enabler.bin or /sbin/turbo_kext_enabler.bin&lt;/span&gt;&lt;br /&gt;if [ ! -f /sbin/turbo_kext_enabler.bin ] &amp;amp;&amp;amp; [ ! -f /sbin/turbo_atv_enabler.bin ]; then&lt;br /&gt;  wget http://0xfeedbeef.com/appletv/turbo_atv_enabler.bin&lt;br /&gt;  mv turbo_atv_enabler.bin /sbin&lt;br /&gt;  chown root:wheel /sbin/turbo_atv_enabler.bin&lt;br /&gt;  chmod 755 /sbin/turbo_atv_enabler.bin&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 204);"&gt;# begin rc.local changes ...&lt;/span&gt;&lt;br /&gt;touch /etc/rc.local&lt;br /&gt;cp /etc/rc.local /etc/rc.local.original&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 204);"&gt;# check if kext enabler entry missing from rc.local&lt;/span&gt;&lt;br /&gt;if [ `grep --count -G '^/sbin/turbo_\(atv\|kext\)_enabler.bin' /etc/rc.local` -eq 0 ]; then&lt;br /&gt;  if [ -f /sbin/turbo_atv_enabler.bin ]; then&lt;br /&gt;    echo "/sbin/turbo_atv_enabler.bin" &gt; /tmp/rc.top&lt;br /&gt;  else&lt;br /&gt;    echo "/sbin/turbo_kext_enabler.bin" &gt; /tmp/rc.top&lt;br /&gt;  fi&lt;br /&gt;&lt;br /&gt;  cat /tmp/rc.top /etc/rc.local.original &gt; /etc/rc.local&lt;br /&gt;  rm -rf /tmp/rc.top&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 204);"&gt;# add kexload entry to end of rc.local file if missing&lt;/span&gt;&lt;br /&gt;if [ `grep --count -G '^/sbin/kextload -v /System/Library/Extensions/BroadcomCrystalHD.kext' /etc/rc.local` -eq 0 ]; then&lt;br /&gt;  echo "/sbin/kextload -v /System/Library/Extensions/BroadcomCrystalHD.kext" &gt;&gt; /etc/rc.local&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 204);"&gt;# ensure rc.local permissions are correct&lt;/span&gt;&lt;br /&gt;chown root:wheel /etc/rc.local&lt;br /&gt;chmod 644 /etc/rc.local&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 204);"&gt;# exit as user root, and return as user frontrow ...&lt;/span&gt;&lt;br /&gt;exit&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 204); font-weight: bold;"&gt;# Step 4: Next, we want to add support from laucher for downloading &lt;br /&gt;# TheQuestor's svn builds which provide the latest xbmc builds with crystalhd support&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 204);"&gt;# Note! You should now be the user frontrow.&lt;br /&gt;&lt;br /&gt;# add custom xbmc download location entry for launcher if not present ...&lt;/span&gt;&lt;br /&gt;defaults read com.teamxbmc.xbmclauncher XBMCAdditionalDownloadPlistURLs 2&gt;/dev/null | grep --silent www.sshcs.com/xbmc/Info.asp&lt;br /&gt;if [ $? -eq 1 ]; then&lt;br /&gt;  defaults write com.teamxbmc.xbmclauncher XBMCAdditionalDownloadPlistURLs -array http://www.sshcs.com/xbmc/Info.asp&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 204); font-weight: bold;"&gt;# Step 5: From the Apple TV User Interface, Go to the launcher menu, then choose "Settings", then choose "Downloads"&lt;br /&gt;# - Obtain the latest xbmc download build available from TheQuestor e.g. XBMC r26651.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 204); font-weight: bold;"&gt;# Step 6: Reboot the Apple TV ...&lt;/span&gt;&lt;br /&gt;sudo -s&lt;br /&gt;reboot&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 204); font-weight: bold;"&gt;# Step 7: After the Apple TV has rebooted, fire up XBMC from the launcher&lt;br /&gt;# check that XBMC has detected the Crystal HD ...&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 204);"&gt;# Check under "Settings -&gt; Video -&gt; Playback -&gt; Render method", there is an option Auto-Detect, which could be changed to "Broadcom Crystal HD"&lt;br /&gt;&lt;br /&gt;# If no /usr/lib/libcrystalhd.dylib or no BroadcomCrystalHD.kext loaded, then Broadcom Crystal HD will NOT show up as a rendering option.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 204); font-weight: bold;"&gt;# Optional - Basic debugging can be done in the event the Cyrstal HD was not detected:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 204);"&gt;# switch to root&lt;/span&gt;&lt;br /&gt;sudo -s&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 204);"&gt;# check that crystal hd hardware was detected&lt;/span&gt;&lt;br /&gt;dmesg | grep -i crystal&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 102);"&gt;Output :-&lt;br /&gt;BroadcomCrystalHD::start&lt;br /&gt;BroadcomCrystalHD: Found HW and started driver SW.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 204);"&gt;# check that crystalhd driver is loaded :-&lt;/span&gt;&lt;br /&gt;kextstat | grep crystalhd&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 102);"&gt;Output :-&lt;br /&gt;75    0 0x2f588000 0xb000     0xa000     com.broadcom.crystalhd.driver (0.9.26) &lt;5&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 204);"&gt;# Check the xbmc.log when playing an appropriate movie ..&lt;/span&gt;&lt;br /&gt;grep -i crystal /Users/frontrow/Library/Logs/xbmc.log&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 102);"&gt;Output :-&lt;br /&gt;16:19:54 T:2684407808 M: 14409728   DEBUG: Loading: libcrystalhd.dylib&lt;br /&gt;16:19:59 T:2684407808 M: 11501568    INFO: CrystalHD: device opened&lt;br /&gt;16:40:28 T:51790336 M: 20217856    INFO: Trying Broadcom Crystal HD Decoder...&lt;br /&gt;16:40:29 T:51790336 M: 13025280   DEBUG: CrystalHD: codec opened&lt;br /&gt;16:40:29 T:51790336 M: 13025280    INFO: DVDVideoCodecCrystalHD: Opened Broadcom Crystal HD Codec&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;People should strongly think about donating to the xbmc team/davilla to ensure that further development continues.  They have effectively extended the lifetime of the ATV!  ( PS.. yes I donated ;) )&lt;br /&gt;http://xbmc.org/contribute/donate/ &lt;br /&gt;&lt;br /&gt;Additionally, if you want to duplicate the instructions found in this guide, please at least link back to it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2959498105239183642-5868163218310251713?l=todayguesswhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/5868163218310251713/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://todayguesswhat.blogspot.com/2010/01/thanks-davilla-and-xbmc-team-apple-tv.html#comment-form' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/5868163218310251713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/5868163218310251713'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/2010/01/thanks-davilla-and-xbmc-team-apple-tv.html' title='Thanks Davilla and XBMC team - Apple TV support for Broadcom Crystal HD BCM70012'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2959498105239183642.post-1509073382590224215</id><published>2009-12-28T20:54:00.002+10:00</published><updated>2009-12-28T21:04:04.588+10:00</updated><title type='text'>I remapped iexplore to lauch firefox</title><content type='html'>If there is a task that can be launched exclusively with the keyboard without mouse interaction, I'm all over it.&lt;br /&gt;&lt;br /&gt;For me, this means lauching the browser (aka Internet Explorer) by pressing the Start button &gt; followed by "r" for Run &gt; followed by "iexplore www.address.com"&lt;br /&gt;&lt;br /&gt;"iexplore" magically launches Internet Explorer.&lt;br /&gt;&lt;br /&gt;So now that I'm a full blown Firefox convert, I needed a mechanism to launch firefox even though I typed in due to bad habit "iexplore".&lt;br /&gt;&lt;br /&gt;I tried various bat files, then finally stumbled across the registry change that maps "iexplore" to Internet Explorer :-&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\IEXPLORE.EXE]&lt;br /&gt;@="C:\\Program Files\\Internet Explorer\\iexplore.exe"&lt;br /&gt;"Path"="C:\\Program Files\\Internet Explorer;"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;All I had to do then was modify this entry to point to firefox :-&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\IEXPLORE.EXE]&lt;br /&gt;@="C:\\Program Files\\Mozilla Firefox\\firefox.exe"&lt;br /&gt;"Path"="C:\\Program Files\\Mozilla Firefox;"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now I can continue to use iexplore but launch firefox instead!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2959498105239183642-1509073382590224215?l=todayguesswhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/1509073382590224215/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://todayguesswhat.blogspot.com/2009/12/i-remapped-iexplore-to-lauch-firefox.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/1509073382590224215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/1509073382590224215'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/2009/12/i-remapped-iexplore-to-lauch-firefox.html' title='I remapped iexplore to lauch firefox'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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-2959498105239183642.post-3533460821418662426</id><published>2009-10-11T12:45:00.003+10:00</published><updated>2009-10-11T13:05:09.958+10:00</updated><title type='text'>my XBMC video playback issue on Apple TV was resolved</title><content type='html'>I was getting a horizontal banding / horizontal line effect in certain action scenes of movies played from XBMC on my Apple TV. Rather than a single clear frame, the frame appeared to be broken up in to a top and bottom component slightly offset.&lt;br /&gt;&lt;br /&gt;I initially suspected this must be a CPU performance issue, but XBMC in debug mode showed the frame count was perfect, and running a "top" from the Apple shell showed the CPU was not stressed.&lt;br /&gt;&lt;br /&gt;The good news is this issue is no longer; Setting 'Vertical blank sync' = 'Enable Always' seems to have fixed things.&lt;br /&gt;&lt;br /&gt;I have a Panasonic 720p 50hz plasma:&lt;br /&gt;&lt;br /&gt;My XBMC settings:&lt;br /&gt;&lt;br /&gt;Video settings&lt;br /&gt;&lt;br /&gt;Render method =  Auto Detect&lt;br /&gt;Adjust refresh rate = Enabled&lt;br /&gt;High quality software upscaling = Disabled&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;System - Apple hardware settings&lt;br /&gt;&lt;br /&gt;Audio Output = Digital&lt;br /&gt;Dolby Digital (AC3) capable receiver = Enabled&lt;br /&gt;DTS Capable Receiver = Enabled&lt;br /&gt;&lt;br /&gt;(I have my Apple TV plugged in to amplifier via optical audio cable)&lt;br /&gt;&lt;br /&gt;Appearance Settings - Screen&lt;br /&gt;&lt;br /&gt;Resolution: 1280x720 @ 50Hz (full screen)&lt;br /&gt;Vertical blank sync = Enable Always&lt;br /&gt;&lt;br /&gt;Standard DVDs play back perfect!&lt;br /&gt;&lt;br /&gt;I have also ordered a Broadcom BCM70010/BCM70012 Mini PCI-e HD Decoder Chipset in preparation (I hope) for an announcement from Davilla (and Phi) regarding XBMC support for this hardware video decoder card directly on the Apple TV.  This hopefully will give 1080 movie playback support!&lt;br /&gt;(One essentially removes internal wifi card, and replaces it with the broadcom decoder).&lt;br /&gt;&lt;br /&gt;See the following post:&lt;br /&gt;http://xbmc.org/forum/showthread.php?t=55042&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2959498105239183642-3533460821418662426?l=todayguesswhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/3533460821418662426/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://todayguesswhat.blogspot.com/2009/10/i-was-getting-horizontal-banding.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/3533460821418662426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/3533460821418662426'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/2009/10/i-was-getting-horizontal-banding.html' title='my XBMC video playback issue on Apple TV was resolved'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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-2959498105239183642.post-4807414355391436447</id><published>2009-10-11T12:20:00.003+10:00</published><updated>2009-10-11T12:39:19.025+10:00</updated><title type='text'>I show you how to create ISO image directly from Apple TV</title><content type='html'>So there are a variety of different mechanisms published on the Net that describe how to create an ISO image from an existing folder structure on an OS X box, including the "dd" command and the "hdiutil makehybrid" command.&lt;br /&gt;&lt;br /&gt;I wanted to create a DVD movie ISO file from an existing folder structure containing VIDEO_TS and AUDIO_TS folders.&lt;br /&gt;&lt;br /&gt;Unfortunately when running the "hdiutil makehybrid" command on the Apple TV box, I get the error: hdiutil: makehybrid: failed to create track&lt;br /&gt;&lt;br /&gt;I found an alternative that definitely works on the Apple TV; download HELIOS Software GmbH "mkisofs"&lt;br /&gt;&lt;br /&gt;http://www.helios.de/news/news07/mkisofs.phtml#download&lt;br /&gt;&lt;br /&gt;HELIOS Tools: /HELIOS mkisofs/macosx86&lt;br /&gt;&lt;br /&gt;The file size of mkisofs (contained in the download zip) that I obtained was 1,509,140 bytes.&lt;br /&gt;&lt;br /&gt;-bash-2.05b$ mkisofs -version&lt;br /&gt;mkisofs 2.01.01a22helios0.14 (i386-apple-macosx8.8.1)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here is how I created a simple iso file from the movie Australia.&lt;br /&gt;&lt;br /&gt;~/mkisofs -v -dvd-video -no-hfs -iso-level 4 -nolimit-pathtables --heliosutf8 -o /path/to/dest/australia.iso /path/to/source/Australia_Movie&lt;br /&gt;&lt;br /&gt;where /path/to/source/Australia_Movie is the source parent folder containing AUDIO_TS and VIDEO_TS subfolders,&lt;br /&gt;&lt;br /&gt;and /path/to/dest/australia.iso is the destination iso file.&lt;br /&gt;&lt;br /&gt;I decided to use the "-no-hfs" option, to omit HFS disk image creation; as this was just a plain movie.&lt;br /&gt;&lt;br /&gt;XBMC was able to open the resulting .ISO file without issue.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2959498105239183642-4807414355391436447?l=todayguesswhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/4807414355391436447/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://todayguesswhat.blogspot.com/2009/10/i-show-you-how-to-create-iso-image.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/4807414355391436447'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/4807414355391436447'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/2009/10/i-show-you-how-to-create-iso-image.html' title='I show you how to create ISO image directly from Apple TV'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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-2959498105239183642.post-6635429467613800746</id><published>2009-10-11T11:58:00.002+10:00</published><updated>2009-10-11T12:16:07.754+10:00</updated><title type='text'>I discovered FAT32 has 4 GB file size limitation</title><content type='html'>So I recently purchased a Western Digital Green External Hard Disk that was pre-formatted FAT32 to connect to my Apple TV.&lt;br /&gt;&lt;br /&gt;FAT32 is definitely the most portable of file-systems in terms of being supported by pretty much every major OS.&lt;br /&gt;&lt;br /&gt;Unfortunately I got hit by the 4GB file size limitation.&lt;br /&gt;&lt;br /&gt;I've ripped most of my DVDs to .ISO files.  These are almost always over 4 gigabytes in file size.&lt;br /&gt;&lt;br /&gt;So I decided to convert my external hard drive to HFS+.&lt;br /&gt;&lt;br /&gt;Once again, I have no Apple computer, so I needed to do this directly from the Apple TV:-&lt;br /&gt;&lt;br /&gt;After having the USB patch enabled on the Apple TV and connecting the external hard disk I see :-&lt;br /&gt;&lt;br /&gt;-bash-2.05b$ diskutil list&lt;br /&gt;/dev/disk0&lt;br /&gt;   #:                   type name               size      identifier&lt;br /&gt;   0:  GUID_partition_scheme                    *37.3 GB  disk0&lt;br /&gt;   1:                    EFI                    34.0 MB   disk0s1&lt;br /&gt;   2:         Apple_Recovery                    400.0 MB  disk0s2&lt;br /&gt;   3:              Apple_HFS OSBoot             900.0 MB  disk0s3&lt;br /&gt;   4:              Apple_HFS Media              35.8 GB   disk0s4&lt;br /&gt;/dev/disk1&lt;br /&gt;   #:                   type name               size      identifier&lt;br /&gt;   0: FDisk_partition_scheme                    *931.5 GB disk1&lt;br /&gt;   1:         Windows_FAT_32 My Book            931.3 GB  disk1s1&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-bash-2.05b$ diskutil info /dev/disk1&lt;br /&gt;   Device Node:        /dev/disk1&lt;br /&gt;   Device Identifier:  disk1&lt;br /&gt;   Mount Point:        &lt;br /&gt;   Volume Name:        &lt;br /&gt;&lt;br /&gt;   Partition Type:     FDisk_partition_scheme&lt;br /&gt;   Bootable:           Not bootable&lt;br /&gt;   Media Type:         Generic&lt;br /&gt;   Protocol:           USB&lt;br /&gt;   SMART Status:       Not Supported&lt;br /&gt;&lt;br /&gt;   Total Size:         931.5 GB&lt;br /&gt;   Free Space:         0.0 B&lt;br /&gt;&lt;br /&gt;   Read Only:          No&lt;br /&gt;   Ejectable:          Yes&lt;br /&gt;   OS 9 Drivers:       No&lt;br /&gt;   Low Level Format:   Not Supported&lt;br /&gt;&lt;br /&gt;-bash-2.05b$ diskutil info disk1s1&lt;br /&gt;   Device Node:        /dev/disk1s1&lt;br /&gt;   Device Identifier:  disk1s1&lt;br /&gt;   Mount Point:        /Volumes/My Book&lt;br /&gt;   Volume Name:        My Book&lt;br /&gt;&lt;br /&gt;   File System:        MS-DOS FAT32&lt;br /&gt;   Partition Type:     Windows_FAT_32&lt;br /&gt;   Bootable:           Not bootable&lt;br /&gt;   Media Type:         Generic&lt;br /&gt;   Protocol:           USB&lt;br /&gt;   SMART Status:       Not Supported&lt;br /&gt;&lt;br /&gt;   Total Size:         931.3 GB&lt;br /&gt;   Free Space:         909.8 GB&lt;br /&gt;&lt;br /&gt;   Read Only:          No&lt;br /&gt;   Ejectable:          Yes&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-bash-2.05b$ mount&lt;br /&gt;/dev/disk0s3 on / (local, journaled)&lt;br /&gt;devfs on /dev (local)&lt;br /&gt;fdesc on /dev (union)&lt;br /&gt;&lt;volfs&gt; on /.vol&lt;br /&gt;/dev/disk0s4 on /mnt (local, journaled)&lt;br /&gt;/dev/disk1s1 on /mnt/Scratch/Volumes/My Book (local)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;To reformat as HFS+ with volume label "WDGreen" using case sensitive file names and journaling.&lt;br /&gt;&lt;br /&gt;sudo -s&lt;br /&gt;&lt;br /&gt;umount /dev/disk1s1&lt;br /&gt;&lt;br /&gt;diskutil unmountDisk /dev/disk1&lt;br /&gt;&lt;br /&gt;diskutil eraseDisk "Case-sensitive Journaled HFS+" WDGreen /dev/disk1&lt;br /&gt;&lt;br /&gt;-bash-2.05b$ diskutil list&lt;br /&gt;/dev/disk0&lt;br /&gt;   #:                   type name               size      identifier&lt;br /&gt;   0:  GUID_partition_scheme                    *37.3 GB  disk0&lt;br /&gt;   1:                    EFI                    34.0 MB   disk0s1&lt;br /&gt;   2:         Apple_Recovery                    400.0 MB  disk0s2&lt;br /&gt;   3:              Apple_HFS OSBoot             900.0 MB  disk0s3&lt;br /&gt;   4:              Apple_HFS Media              35.8 GB   disk0s4&lt;br /&gt;/dev/disk1&lt;br /&gt;   #:                   type name               size      identifier&lt;br /&gt;   0:  GUID_partition_scheme                    *931.5 GB disk1&lt;br /&gt;   1:                    EFI                    34.0 MB   disk1s1&lt;br /&gt;   2:              Apple_HFS WDGreen            931.5 GB  disk1s2&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-bash-2.05b$ diskutil info disk1s2&lt;br /&gt;   Device Node:        /dev/disk1s2&lt;br /&gt;   Device Identifier:  disk1s2&lt;br /&gt;   Mount Point:        /Volumes/WDGreen&lt;br /&gt;   Volume Name:        WDGreen&lt;br /&gt;&lt;br /&gt;   File System:        Case-sensitive Journaled HFS+&lt;br /&gt;                       Journal size 81920 k at offset 0x1d1e000&lt;br /&gt;   Owners:             Enabled&lt;br /&gt;   Partition Type:     Apple_HFS&lt;br /&gt;   Bootable:           Is bootable&lt;br /&gt;   Media Type:         Generic&lt;br /&gt;   Protocol:           USB&lt;br /&gt;   SMART Status:       Not Supported&lt;br /&gt;&lt;br /&gt;   Total Size:         931.5 GB&lt;br /&gt;   Free Space:         931.3 GB&lt;br /&gt;&lt;br /&gt;   Read Only:          No&lt;br /&gt;   Ejectable:          Yes&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-bash-2.05b$ mount                  &lt;br /&gt;/dev/disk0s3 on / (local, journaled)&lt;br /&gt;devfs on /dev (local)&lt;br /&gt;fdesc on /dev (union)&lt;br /&gt;&lt;volfs&gt; on /.vol&lt;br /&gt;/dev/disk0s4 on /mnt (local, journaled)&lt;br /&gt;/dev/disk1s2 on /mnt/Scratch/Volumes/WDGreen (local, journaled)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now I can upload files greater than 4GB in size to external disk on Apple TV.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2959498105239183642-6635429467613800746?l=todayguesswhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/6635429467613800746/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://todayguesswhat.blogspot.com/2009/10/i-discovered-fat32-has-4-gb-file-size.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/6635429467613800746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/6635429467613800746'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/2009/10/i-discovered-fat32-has-4-gb-file-size.html' title='I discovered FAT32 has 4 GB file size limitation'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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-2959498105239183642.post-1365808095725099777</id><published>2009-10-11T11:03:00.002+10:00</published><updated>2009-10-11T11:44:03.219+10:00</updated><title type='text'>I wanted to install GCC on Apple TV, but I didn't have a TIGER box... so...</title><content type='html'>The following wiki article describes how to install GCC on an Apple TV.&lt;br /&gt;&lt;br /&gt;http://wiki.awkwardtv.org/wiki/Install_gcc&lt;br /&gt;&lt;br /&gt;One of the main requirements is that you have access to an Intel Mac with Tiger with Xcode tools installed.&lt;br /&gt;&lt;br /&gt;As i've said previously, I don't own any Apple computers, nor do I know anyone who has a tiger box.&lt;br /&gt;&lt;br /&gt;I found a way to workaround this issue :-&lt;br /&gt;&lt;br /&gt;There is a 1.37 GB OS X tiger VMware image floating around on the internet that you can get using your favorite torrent tool.&lt;br /&gt;&lt;br /&gt;Its name is something along the lines of :-&lt;br /&gt;VMWare image for MacOX 10.4.8 (created from JaS AMD-Intel-SSE2-SSE3 with PPF1 &amp; PPF2 image). &lt;br /&gt;&lt;br /&gt;The guy that created this image used VMWare Workstation ACE Edition 6.0.2 build-59824.  The vmware image is compressed in a file named: VMMACOS.7z&lt;br /&gt;&lt;br /&gt;Note, the image was also created on a 64bit Windows box with virtualization enabled for the processor (in the bios).  To run this image, you need the same setup (Windows XP 64, and virtualization support enabled in the bios).&lt;br /&gt;&lt;br /&gt;If you don't have XP 64, search for 'Superior XP 64'.&lt;br /&gt;&lt;br /&gt;Unfortunately the above Tiger VMware image does not have XCode installed, so you have to install it!&lt;br /&gt;&lt;br /&gt;You can get XCode free from apple by registering a free account on the Apple Developer Connection website.&lt;br /&gt;&lt;br /&gt;You want to download XCode 2.2.1.&lt;br /&gt;&lt;br /&gt;e.g.&lt;br /&gt;&lt;br /&gt;xcode_2.2.1_8g1165_018213632.dmg&lt;br /&gt;&lt;br /&gt;Install the above on to to the Tiger VMware image and you should be good to go.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The only other issue was getting access to gcc-intel-bin.tar.gz&lt;br /&gt;&lt;br /&gt;I couldn't find it anywhere.&lt;br /&gt;&lt;br /&gt;Here are some links to gcc version 4.3.0 20080125 (experimental) (GCC) :-&lt;br /&gt;&lt;br /&gt;http://ftp.heanet.ie/disk1/disk1/sourceforge/h/project/hp/hpc/OldFiles/gcc-intel-bin.tar.gz&lt;br /&gt;&lt;br /&gt;http://ftp3.ie.freebsd.org/mirrors/sourceforge/h/project/hp/hpc/OldFiles/gcc-intel-bin.tar.gz&lt;br /&gt;&lt;br /&gt;http://193.1.193.64/disk1/sourceforge/h/project/hp/hpc/OldFiles/gcc-intel-bin.tar.gz&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2959498105239183642-1365808095725099777?l=todayguesswhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/1365808095725099777/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://todayguesswhat.blogspot.com/2009/10/i-wanted-to-install-gcc-on-apple-tv-but.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/1365808095725099777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/1365808095725099777'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/2009/10/i-wanted-to-install-gcc-on-apple-tv-but.html' title='I wanted to install GCC on Apple TV, but I didn&apos;t have a TIGER box... so...'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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-2959498105239183642.post-8749104691698461104</id><published>2009-10-11T10:48:00.002+10:00</published><updated>2009-10-11T10:58:57.538+10:00</updated><title type='text'>instructions on how to install MediaInfo command line tool on Apple TV</title><content type='html'>MediaInfo provides technical information and tags for most multimedia files. &lt;br /&gt;Supported formats include:&lt;br /&gt;Video : AVI/OGM/MKV/MPG/VOB/MP4/3GP/... &lt;br /&gt;Audio : MP3/OGG/MKA/MP4/AAC/...&lt;br /&gt;&lt;br /&gt;The guys at XBMC require such information when posting an "issue" with a particular movie/video etc.&lt;br /&gt;&lt;br /&gt;Obtain MediaInfo cli from http://sourceforge.net/projects/mediainfo/&lt;br /&gt;&lt;br /&gt;e.g. MediaInfo_CLI_0.7.22_Mac_Universal.dmg&lt;br /&gt;&lt;br /&gt;Upload this file to the Apple TV as user frontrow.&lt;br /&gt;&lt;br /&gt;Mount the image :-&lt;br /&gt;&lt;br /&gt;$ hdiutil mount MediaInfo_CLI_0.7.22_Mac_Universal.dmg&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;/dev/disk2s2            Apple_HFS                       /Volumes/MediaInfo CLI&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ diskutil list&lt;br /&gt;...&lt;br /&gt;/dev/disk2&lt;br /&gt;   #:                   type name               size      identifier&lt;br /&gt;   0: Apple_partition_scheme                    *5.0 MB   disk2&lt;br /&gt;   1:    Apple_partition_map                    31.5 KB   disk2s1&lt;br /&gt;   2:              Apple_HFS MediaInfo CLI      5.0 MB    disk2s2&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ mount&lt;br /&gt;...&lt;br /&gt;/dev/disk2s2 on /mnt/Scratch/Volumes/MediaInfo CLI (local, nodev, nosuid, read-only, mounted by frontrow)&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Change directory to MediaInfo CLI&lt;br /&gt;&lt;br /&gt;$ pwd&lt;br /&gt;/Volumes/MediaInfo CLI&lt;br /&gt;&lt;br /&gt;$ ls&lt;br /&gt;Contrib                         License.NoModifications.html    MediaInfo CLI.pkg&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ installer -pkginfo -verbose -pkg MediaInfo\ CLI.pkg/&lt;br /&gt;&lt;br /&gt;Package information:&lt;br /&gt;&lt;br /&gt;Title             : MediaInfo CLI&lt;br /&gt;Message           : This item is required.&lt;br /&gt;Package           : MediaInfo CLI&lt;br /&gt;Must Authenticate : YES&lt;br /&gt;Description       : &lt;br /&gt;Size              : 6068 KB&lt;br /&gt;Status            : Fail&lt;br /&gt;Will Restart      : NO&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ sudo -s&lt;br /&gt;&lt;br /&gt;# installer -pkg /Volumes/MediaInfo\ CLI/MediaInfo\ CLI.pkg/ -target /&lt;br /&gt;installer: Package name is MediaInfo CLI&lt;br /&gt;installer: Installing onto volume mounted at /.&lt;br /&gt;installer: The install was successful.&lt;br /&gt;&lt;br /&gt;# cd /usr/local/bin&lt;br /&gt;&lt;br /&gt;# ls -ltr&lt;br /&gt;...&lt;br /&gt;-rwxr-xr-x   1 frontrow  frontrow  6212128 Sep 26 01:52 mediainfo&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;# hdiutil detach "/mnt/Scratch/Volumes/MediaInfo CLI"&lt;br /&gt;"disk2" unmounted.&lt;br /&gt;"disk2" ejected.&lt;br /&gt;&lt;br /&gt;# exit&lt;br /&gt;&lt;br /&gt;$ mediainfo&lt;br /&gt;Usage: "MediaInfo [-Options...] FileName1 [Filename2...]"&lt;br /&gt;"MediaInfo --Help" for displaying more information&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ cd /Volumes/XXX/VIDEO_TS&lt;br /&gt;&lt;br /&gt;-bash-2.05b$ ls -laR&lt;br /&gt;total 9032984&lt;br /&gt;dr-xr-xr-x   11 frontrow  frontrow         508 Aug 30  2008 .&lt;br /&gt;dr-xr-xr-x    4 frontrow  frontrow         136 Aug 30  2008 ..&lt;br /&gt;-r--r--r--    1 frontrow  frontrow        6144 Aug 30  2008 VIDEO_TS.BUP&lt;br /&gt;-r--r--r--    1 frontrow  frontrow        6144 Aug 30  2008 VIDEO_TS.IFO&lt;br /&gt;-r--r--r--    1 frontrow  frontrow       75776 Aug 30  2008 VTS_01_0.BUP&lt;br /&gt;-r--r--r--    1 frontrow  frontrow       75776 Aug 30  2008 VTS_01_0.IFO&lt;br /&gt;-r--r--r--    1 frontrow  frontrow  1073739776 Aug 30  2008 VTS_01_1.VOB&lt;br /&gt;-r--r--r--    1 frontrow  frontrow  1073739776 Aug 30  2008 VTS_01_2.VOB&lt;br /&gt;-r--r--r--    1 frontrow  frontrow  1073739776 Aug 30  2008 VTS_01_3.VOB&lt;br /&gt;-r--r--r--    1 frontrow  frontrow  1073739776 Aug 30  2008 VTS_01_4.VOB&lt;br /&gt;-r--r--r--    1 frontrow  frontrow   329760768 Aug 30  2008 VTS_01_5.VOB&lt;br /&gt;&lt;br /&gt;$ mediainfo *&lt;br /&gt;&lt;br /&gt;General&lt;br /&gt;Complete name                    : VIDEO_TS.BUP&lt;br /&gt;Format                           : DVD Video&lt;br /&gt;Format profile                   : Menu&lt;br /&gt;File size                        : 6.00 KiB&lt;br /&gt;&lt;br /&gt;Video&lt;br /&gt;ID                               : 0xE0&lt;br /&gt;Format                           : MPEG Video&lt;br /&gt;Format version                   : Version 2&lt;br /&gt;Bit rate mode                    : Variable&lt;br /&gt;Width                            : 720 pixels&lt;br /&gt;Height                           : 576 pixels&lt;br /&gt;Display aspect ratio             : 16:9&lt;br /&gt;Frame rate                       : 25.000 fps&lt;br /&gt;Standard                         : PAL&lt;br /&gt;&lt;br /&gt;...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2959498105239183642-8749104691698461104?l=todayguesswhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/8749104691698461104/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://todayguesswhat.blogspot.com/2009/10/instructions-on-how-to-install.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/8749104691698461104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/8749104691698461104'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/2009/10/instructions-on-how-to-install.html' title='instructions on how to install MediaInfo command line tool on Apple TV'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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-2959498105239183642.post-7675579843164232245</id><published>2009-10-11T08:28:00.007+10:00</published><updated>2009-10-11T10:45:01.770+10:00</updated><title type='text'>instructions on how to create customized recovery image (recovery.dmg) directly from Apple TV</title><content type='html'>Apple TV rocks, but I don't have the finances to purchase an Apple computer. So how did I get NitoTV fully installed on a 2.0.2 firmware released Apple TV with all the bells and whistles with only a Windows machine at my disposal?&lt;br /&gt;&lt;br /&gt;The answer was essentially to do everything directly from the Apple TV.&lt;br /&gt;&lt;br /&gt;If a version 1 OS.dmg is contained within the recovery image file (recovery.dmg) in the ~/Documents folder, NitoTV should be able to install/unlock all the useful bits and pieces like AFP support on the Apple TV.&lt;br /&gt;&lt;br /&gt;The version 1 OS.dmg is available on the original Apple TVs with 1.0 firmware/backup partition. For subsequent released Apple TVs, the OS.dmg on the backup partition is a stripped down version missing key pieces.&lt;br /&gt;&lt;br /&gt;--- CUT ---&lt;br /&gt;&lt;br /&gt;The notes below refer to my Apple TV which is setup on my local network with IP address 192.168.1.100.&lt;br /&gt;&lt;br /&gt;ssh frontrow@192.168.1.100&lt;br /&gt;&lt;br /&gt;password: frontrow&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Welcome to the AppleTV (via atv-usbcreator)&lt;br /&gt;$ id&lt;br /&gt;uid=501(frontrow) gid=501(frontrow) groups=501(frontrow), 79(appserverusr), 80(admin), 81(appserveradm)&lt;br /&gt;&lt;br /&gt;$ diskutil list&lt;br /&gt;/dev/disk0&lt;br /&gt;   #:                   type name               size      identifier&lt;br /&gt;   0:  GUID_partition_scheme                    *37.3 GB  disk0&lt;br /&gt;   1:                    EFI                    34.0 MB   disk0s1&lt;br /&gt;   2:         Apple_Recovery                    400.0 MB  disk0s2&lt;br /&gt;   3:              Apple_HFS OSBoot             900.0 MB  disk0s3&lt;br /&gt;   4:              Apple_HFS Media              35.8 GB   disk0s4&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ cd /Volumes&lt;br /&gt;&lt;br /&gt;$ ls&lt;br /&gt;OSBoot&lt;br /&gt;&lt;br /&gt;$ mkdir Recovery&lt;br /&gt;&lt;br /&gt;$ sudo mount -t hfs /dev/disk0s2 /Volumes/Recovery/&lt;br /&gt;Password: frontrow&lt;br /&gt;&lt;br /&gt;$ cd /Volumes/Recovery/&lt;br /&gt;&lt;br /&gt;$ ls -la&lt;br /&gt;total 360552&lt;br /&gt;drwxrwxr-t   10 root  admin        442 Apr  8  2008 .&lt;br /&gt;drwxrwxrwt    4 root  admin        136 Sep  2 10:13 ..&lt;br /&gt;d-wx-wx-wt    2 root  admin         68 Apr  8  2008 .Trashes&lt;br /&gt;-rw-r--r--    1 root  wheel      45590 Feb 17  2007 BootLogo.png&lt;br /&gt;-rw-r--r--    1 root  admin       1024 Apr  8  2008 Desktop DB&lt;br /&gt;-rw-r--r--    1 root  admin          2 Apr  8  2008 Desktop DF&lt;br /&gt;-rw-rw-r--    1 root  wheel  177099888 Apr  8  2008 OS.dmg&lt;br /&gt;-rw-r--r--    1 root  wheel     298800 Feb 17  2007 boot.efi&lt;br /&gt;-rw-r--r--    1 root  admin        520 Apr  8  2008 com.apple.Boot.plist&lt;br /&gt;-rw-r--r--    1 root  wheel    7138931 Apr  8  2008 mach_kernel.prelink&lt;br /&gt;&lt;br /&gt;$ md5 OS.dmg &lt;br /&gt;MD5 (OS.dmg) = 30c4e468d235fb809acf9fb75c09b35f&lt;br /&gt;&lt;br /&gt;Note the OS.dmg MD5 hash above matches the 2.0.2 firmware:-&lt;br /&gt;&lt;br /&gt;1.0.0 (md5: 55b909196952ff72c93aaf3553cf661e)&lt;br /&gt;1.1.0 (md5: e1cbe29ea136e0a34de09e0144bb5505)&lt;br /&gt;2.0.2 (md5: 30c4e468d235fb809acf9fb75c09b35f)&lt;br /&gt;2.1.0 (md5: 2783d7c2b27d8364bac3bde9de9d5287)&lt;br /&gt;&lt;br /&gt;Thus, my Apple TV has a 2.0.2 firmware on the recovery partition.  If I were to do a factory restore on my Apple TV, it would be thus running 2.0.2 software.&lt;br /&gt;&lt;br /&gt;Recall, NitoTV requires a version 1.0 OS.dmg file to get AFP!&lt;br /&gt;&lt;br /&gt;$ hdiutil imageinfo OS.dmg &lt;br /&gt;Backing Store Information:&lt;br /&gt;        URL: file://localhost/mnt/Scratch/Volumes/Recovery/OS.dmg&lt;br /&gt;        Class Name: CUDIFEncoding&lt;br /&gt;        Name: OS.dmg&lt;br /&gt;        Backing Store Information:&lt;br /&gt;                URL: file://localhost/mnt/Scratch/Volumes/Recovery/OS.dmg&lt;br /&gt;                Class Name: CBSDBackingStore&lt;br /&gt;                Name: OS.dmg&lt;br /&gt;Class Name: CUDIFDiskImage&lt;br /&gt;Properties:&lt;br /&gt;        Kernel Compatible: true&lt;br /&gt;        Software License Agreement: false&lt;br /&gt;        Encrypted: false&lt;br /&gt;        Partitioned: true&lt;br /&gt;        Checksummed: true&lt;br /&gt;        Compressed: true&lt;br /&gt;Segments:&lt;br /&gt;        0: /mnt/Scratch/Volumes/Recovery/OS.dmg&lt;br /&gt;Format: UDZO&lt;br /&gt;Checksum Value: $BD12CFED&lt;br /&gt;udif-ordered-chunks: true&lt;br /&gt;Format Description: UDIF read-only compressed (zlib)&lt;br /&gt;Checksum Type: CRC32&lt;br /&gt;Partition Information:&lt;br /&gt;        -1:&lt;br /&gt;                Checksum Type: CRC32&lt;br /&gt;                Name: Driver Descriptor Map (DDM : 0)&lt;br /&gt;                Checksum Value: $F57C291C&lt;br /&gt;                Partition Number: -1&lt;br /&gt;        0:&lt;br /&gt;                Checksum Type: CRC32&lt;br /&gt;                Name: Apple (Apple_partition_map : 1)&lt;br /&gt;                Checksum Value: $335717A6&lt;br /&gt;                Partition Number: 0&lt;br /&gt;        2:&lt;br /&gt;                Checksum Type: CRC32&lt;br /&gt;                Name:  (Apple_Free : 3)&lt;br /&gt;                Checksum Value: $00000000&lt;br /&gt;                Partition Number: 2&lt;br /&gt;        1:&lt;br /&gt;                Checksum Type: CRC32&lt;br /&gt;                Name: disk image (Apple_HFS : 2)&lt;br /&gt;                Checksum Value: $935C81CE&lt;br /&gt;                Partition Number: 1&lt;br /&gt;partitions:&lt;br /&gt;        partitions:&lt;br /&gt;                0:&lt;br /&gt;                        partition-hint: DDM&lt;br /&gt;                        partition-start: 0&lt;br /&gt;                        partition-data: &lt;CFData 0x180c400 [0xa08741c0]&gt;{length = 512, capacity = 512, bytes = 0x4552020000156dd20000000000000000 ... 0000000000000000}&lt;br /&gt;                        partition-length: 1&lt;br /&gt;                        partition-name: Driver Descriptor Map&lt;br /&gt;                        partition-synthesized: true&lt;br /&gt;                1:&lt;br /&gt;                        partition-hint: Apple_partition_map&lt;br /&gt;                        partition-start: 1&lt;br /&gt;                        partition-number: 1&lt;br /&gt;                        partition-length: 63&lt;br /&gt;                        partition-name: Apple&lt;br /&gt;                2:&lt;br /&gt;                        partition-hint: Apple_HFS&lt;br /&gt;                        partition-start: 64&lt;br /&gt;                        partition-number: 2&lt;br /&gt;                        partition-length: 1404296&lt;br /&gt;                        partition-filesystems:&lt;br /&gt;                                HFS+: &lt;br /&gt;                        partition-name: disk image&lt;br /&gt;                3:&lt;br /&gt;                        partition-hint: Apple_Free&lt;br /&gt;                        partition-start: 1404360&lt;br /&gt;                        partition-length: 10&lt;br /&gt;                        partition-name: &lt;br /&gt;                        partition-synthesized: true&lt;br /&gt;        block-size: 2&lt;br /&gt;        burnable: true&lt;br /&gt;        partition-scheme: Apple&lt;br /&gt;Size Information:&lt;br /&gt;        Compressed Bytes: 176991022&lt;br /&gt;        Total Bytes: 719037440&lt;br /&gt;        Total Empty Bytes: 293822976&lt;br /&gt;        CUDIFEncoding-bytes-wasted: 0&lt;br /&gt;        Sector Count: 1404370&lt;br /&gt;        CUDIFEncoding-bytes-total: 176991022&lt;br /&gt;        CUDIFEncoding-bytes-in-use: 176991022&lt;br /&gt;        Compressed Ratio: 0.41623871007360652&lt;br /&gt;        Total Non-Empty Bytes: 425214464&lt;br /&gt;Resize limits (per hdiutil resize -limits):&lt;br /&gt;        1404296 1404296 34359738368&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ sudo umount /Volumes/Recovery&lt;br /&gt;&lt;br /&gt;Per: http://wiki.awkwardtv.org/wiki/NitoTV_Take_2&lt;br /&gt;From version 0.6.4 onwards, Smart Installer will now grab the 10.4.9 Combo update and place it in the ~/Documents folder automatically&lt;br /&gt;NitoTV can also setup AFP, so long as a version 1 OS.dmg is contained within the recovery image file in the ~/Documents folder.&lt;br /&gt;&lt;br /&gt;$ cd&lt;br /&gt;&lt;br /&gt;$ pwd&lt;br /&gt;/Users/frontrow/Documents&lt;br /&gt;&lt;br /&gt;-bash-2.05b$ ls -la&lt;br /&gt;total 631104&lt;br /&gt;drwxr-xr-x    5 frontrow  frontrow        170 Sep  2 01:49 .&lt;br /&gt;drwxr-xr-x   19 frontrow  frontrow        646 Sep  2 02:04 ..&lt;br /&gt;-rw-r--r--    1 frontrow  frontrow  323119366 Nov 19  2008 MacOSXUpdCombo10.4.9Intel.dmg&lt;br /&gt;&lt;br /&gt;$ md5 MacOSXUpdCombo10.4.9Intel.dmg &lt;br /&gt;MD5 (MacOSXUpdCombo10.4.9Intel.dmg) = 2c579f52ad69d12d95ea82ee3d9c4937&lt;br /&gt;&lt;br /&gt;As our recovery partition is 2.0.2 based, we need to create a customized recovery image with the OS.dmg based on a v1 Apple TV (rather than just a straight dd of the recovery partition).&lt;br /&gt;&lt;br /&gt;$ sudo mount -uw /&lt;br /&gt;$ sudo touch /.readwrite&lt;br /&gt;&lt;br /&gt;the mount -uw and /.readwrite steps aren't necessary if you have already performed them in the past.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ cd ~/Documents&lt;br /&gt;&lt;br /&gt;get a copy of our 202 recovery partition as an image&lt;br /&gt;&lt;br /&gt;$ sudo dd if=/dev/disk0s2 of=recovery_original.dmg bs=1m&lt;br /&gt;&lt;br /&gt;here is some info on the image created&lt;br /&gt;&lt;br /&gt;$ hdiutil imageinfo recovery_original.dmg &lt;br /&gt;Backing Store Information:&lt;br /&gt;        URL: file://localhost/mnt/Scratch/Users/frontrow/Documents/recovery_original.dmg&lt;br /&gt;        Class Name: CBSDBackingStore&lt;br /&gt;        Name: recovery_original.dmg&lt;br /&gt;Class Name: CRawDiskImage&lt;br /&gt;Properties:&lt;br /&gt;        Kernel Compatible: true&lt;br /&gt;        Software License Agreement: false&lt;br /&gt;        Encrypted: false&lt;br /&gt;        Partitioned: false&lt;br /&gt;        Checksummed: false&lt;br /&gt;        Compressed: no&lt;br /&gt;Segments:&lt;br /&gt;        0: /mnt/Scratch/Users/frontrow/Documents/recovery_original.dmg&lt;br /&gt;Format: UDRW&lt;br /&gt;Checksum Value: &lt;br /&gt;Format Description: raw read/write&lt;br /&gt;Checksum Type: none&lt;br /&gt;partitions:&lt;br /&gt;        partitions:&lt;br /&gt;                0:&lt;br /&gt;                        partition-hint: Apple_HFS&lt;br /&gt;                        partition-start: 0&lt;br /&gt;                        partition-length: 819152&lt;br /&gt;                        partition-filesystems:&lt;br /&gt;                                HFS+: &lt;br /&gt;                        partition-name: whole disk&lt;br /&gt;                        partition-synthesized: true&lt;br /&gt;        block-size: 512&lt;br /&gt;        burnable: false&lt;br /&gt;        partition-scheme: none&lt;br /&gt;Size Information:&lt;br /&gt;        Compressed Ratio: 1&lt;br /&gt;        Compressed Bytes: 419405824&lt;br /&gt;        Sector Count: 819152&lt;br /&gt;        Total Empty Bytes: 0&lt;br /&gt;        Total Non-Empty Bytes: 419405824&lt;br /&gt;        Total Bytes: 419405824&lt;br /&gt;Resize limits (per hdiutil resize -limits):&lt;br /&gt;        450864 819152 34359738368&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Note, the format is UDRW - meaning read/write - so we don't need to convert it to RW for editing &lt;br /&gt;(otherwise, we would have had to do something like: hdiutil convert -format UDRW -o dest-rw.dmg source.dmg&lt;br /&gt; - refer to http://dx4.org/linux/modifydmg.html regarding modifying read-only .dmg files.&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;Note, The OS.dmg contained within this image however is an image of format type: UDIF read-only compressed (zlib),&lt;br /&gt;so if we wanted to mount it and modify the contents, we would need to convert to RW first!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Work from a clone of the image (don't modify the original); also note, NitoTV looks for a file named recovery.dmg&lt;br /&gt;$ cp recovery_original.dmg recovery.dmg&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ ls -la&lt;br /&gt;total 3493792&lt;br /&gt;drwxr-xr-x    9 frontrow  frontrow        306 Sep  3 00:04 .&lt;br /&gt;drwxr-xr-x   19 frontrow  frontrow        646 Sep  2 02:04 ..&lt;br /&gt;-rw-r--r--    1 frontrow  frontrow  323119366 Nov 19  2008 MacOSXUpdCombo10.4.9Intel.dmg&lt;br /&gt;-rw-r--r--    1 frontrow  frontrow  419405824 Sep  2 20:40 recovery.dmg&lt;br /&gt;-rw-r--r--    1 root      frontrow  419405824 Sep  2 20:37 recovery_original.dmg&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;note hdiutil mount/attach do the same thing!&lt;br /&gt;mount the image&lt;br /&gt;$ hdiutil mount recovery.dmg&lt;br /&gt;/dev/disk1                                              /Volumes/Recovery 1&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ diskutil list&lt;br /&gt;/dev/disk0&lt;br /&gt;   #:                   type name               size      identifier&lt;br /&gt;   0:  GUID_partition_scheme                    *37.3 GB  disk0&lt;br /&gt;   1:                    EFI                    34.0 MB   disk0s1&lt;br /&gt;   2:         Apple_Recovery                    400.0 MB  disk0s2&lt;br /&gt;   3:              Apple_HFS OSBoot             900.0 MB  disk0s3&lt;br /&gt;   4:              Apple_HFS Media              35.8 GB   disk0s4&lt;br /&gt;/dev/disk1&lt;br /&gt;   #:                   type name               size      identifier&lt;br /&gt;   0:                        Recovery           *400.0 MB disk1&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ mount&lt;br /&gt;/dev/disk0s3 on / (local, journaled)&lt;br /&gt;devfs on /dev (local)&lt;br /&gt;fdesc on /dev (union)&lt;br /&gt;&lt;volfs&gt; on /.vol&lt;br /&gt;/dev/disk0s4 on /mnt (local, journaled)&lt;br /&gt;/dev/disk1 on /mnt/Scratch/Volumes/Recovery 1 (local, nodev, nosuid, journaled, mounted by frontrow)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ cd /Volumes/Recovery\ 1/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ pwd&lt;br /&gt;/Volumes/Recovery 1&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ ls -la&lt;br /&gt;total 360552&lt;br /&gt;drwxrwxr-t   10 frontrow  frontrow        442 Apr  8  2008 .&lt;br /&gt;drwxrwxrwt    5 root      admin           170 Sep  3 00:38 ..&lt;br /&gt;d-wx-wx-wt    2 frontrow  frontrow         68 Apr  8  2008 .Trashes&lt;br /&gt;-rw-r--r--    1 frontrow  frontrow      45590 Feb 17  2007 BootLogo.png&lt;br /&gt;-rw-r--r--    1 frontrow  frontrow       1024 Apr  8  2008 Desktop DB&lt;br /&gt;-rw-r--r--    1 frontrow  frontrow          2 Apr  8  2008 Desktop DF&lt;br /&gt;-rw-rw-r--    1 frontrow  frontrow  177099888 Apr  8  2008 OS.dmg&lt;br /&gt;-rw-r--r--    1 frontrow  frontrow     298800 Feb 17  2007 boot.efi&lt;br /&gt;-rw-r--r--    1 frontrow  frontrow        520 Apr  8  2008 com.apple.Boot.plist&lt;br /&gt;-rw-r--r--    1 frontrow  frontrow    7138931 Apr  8  2008 mach_kernel.prelink&lt;br /&gt;&lt;br /&gt;$ md5 OS.dmg&lt;br /&gt;MD5 (OS.dmg) = 30c4e468d235fb809acf9fb75c09b35f&lt;br /&gt;&lt;br /&gt;remove the v202 copy, we will be replacing with a v1&lt;br /&gt;$ rm OS.dmg &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;*****************************************************************&lt;br /&gt;Obtain and upload the v1 OS.dmg file to the Apple TV :-&lt;br /&gt;&lt;br /&gt;e.g. join the following two files together (fix the "xxx" first, then unzip)&lt;br /&gt;inside you will find a file named OS-dot-DMG 1.0.dmg with MD5 55b909196952ff72c93aaf3553cf661e&lt;br /&gt;this is the v1 OS.dmg we are after (rename it to OS.dmg)&lt;br /&gt;&lt;br /&gt;rapidshare.xxx/files/166624209/OS-dot-DMG_1.0.dmg.MD.zip.001&lt;br /&gt;rapidshare.xxx/files/166628115/OS-dot-DMG_1.0.dmg.MD.zip.002&lt;br /&gt;&lt;br /&gt;sftp as user frontrow the v1.0 OS.dmg file &lt;br /&gt;&lt;br /&gt;cd "/Volumes/Recovery 1"&lt;br /&gt;&lt;br /&gt;mput OS.dmg&lt;br /&gt;*****************************************************************&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ md5 OS.dmg &lt;br /&gt;MD5 (OS.dmg) = 55b909196952ff72c93aaf3553cf661e&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ hdiutil imageinfo OS.dmg &lt;br /&gt;Backing Store Information:&lt;br /&gt;        URL: file://localhost/mnt/Scratch/Volumes/Recovery%201/OS.dmg&lt;br /&gt;        Class Name: CUDIFEncoding&lt;br /&gt;        Name: OS.dmg&lt;br /&gt;        Backing Store Information:&lt;br /&gt;                URL: file://localhost/mnt/Scratch/Volumes/Recovery%201/OS.dmg&lt;br /&gt;                Class Name: CBSDBackingStore&lt;br /&gt;                Name: OS.dmg&lt;br /&gt;Class Name: CUDIFDiskImage&lt;br /&gt;Properties:&lt;br /&gt;        Kernel Compatible: true&lt;br /&gt;        Software License Agreement: false&lt;br /&gt;        Encrypted: false&lt;br /&gt;        Partitioned: true&lt;br /&gt;        Checksummed: true&lt;br /&gt;        Compressed: true&lt;br /&gt;Segments:&lt;br /&gt;        0: /mnt/Scratch/Volumes/Recovery 1/OS.dmg&lt;br /&gt;Format: UDZO&lt;br /&gt;Checksum Value: $DACE2662&lt;br /&gt;udif-ordered-chunks: true&lt;br /&gt;Format Description: UDIF read-only compressed (zlib)&lt;br /&gt;Checksum Type: CRC32&lt;br /&gt;Partition Information:&lt;br /&gt;        -1:&lt;br /&gt;                Checksum Type: CRC32&lt;br /&gt;                Name: Driver Descriptor Map (DDM : 0)&lt;br /&gt;                Checksum Value: $5C4AABFF&lt;br /&gt;                Partition Number: -1&lt;br /&gt;        0:&lt;br /&gt;                Checksum Type: CRC32&lt;br /&gt;                Name: Apple (Apple_partition_map : 1)&lt;br /&gt;                Checksum Value: $0EA9B196&lt;br /&gt;                Partition Number: 0&lt;br /&gt;        2:&lt;br /&gt;                Checksum Type: CRC32&lt;br /&gt;                Name:  (Apple_Free : 3)&lt;br /&gt;                Checksum Value: $00000000&lt;br /&gt;                Partition Number: 2&lt;br /&gt;        1:&lt;br /&gt;                Checksum Type: CRC32&lt;br /&gt;                Name: disk image (Apple_HFS : 2)&lt;br /&gt;                Checksum Value: $F8E3B513&lt;br /&gt;                Partition Number: 1&lt;br /&gt;partitions:&lt;br /&gt;        partitions:&lt;br /&gt;                0:&lt;br /&gt;                        partition-hint: DDM&lt;br /&gt;                        partition-start: 0&lt;br /&gt;                        partition-data: &lt;CFData 0x180c400 [0xa08741c0]&gt;{length = 512, capacity = 512, bytes = 0x45520200001825b20000000000000000 ... 0000000000000000}&lt;br /&gt;                        partition-length: 1&lt;br /&gt;                        partition-name: Driver Descriptor Map&lt;br /&gt;                        partition-synthesized: true&lt;br /&gt;                1:&lt;br /&gt;                        partition-hint: Apple_partition_map&lt;br /&gt;                        partition-start: 1&lt;br /&gt;                        partition-number: 1&lt;br /&gt;                        partition-length: 63&lt;br /&gt;                        partition-name: Apple&lt;br /&gt;                2:&lt;br /&gt;                        partition-hint: Apple_HFS&lt;br /&gt;                        partition-start: 64&lt;br /&gt;                        partition-number: 2&lt;br /&gt;                        partition-length: 1582440&lt;br /&gt;                        partition-filesystems:&lt;br /&gt;                                HFS+: &lt;br /&gt;                        partition-name: disk image&lt;br /&gt;                3:&lt;br /&gt;                        partition-hint: Apple_Free&lt;br /&gt;                        partition-start: 1582504&lt;br /&gt;                        partition-length: 10&lt;br /&gt;                        partition-name: &lt;br /&gt;                        partition-synthesized: true&lt;br /&gt;        block-size: 2&lt;br /&gt;        burnable: true&lt;br /&gt;        partition-scheme: Apple&lt;br /&gt;Size Information:&lt;br /&gt;        Compressed Bytes: 207346057&lt;br /&gt;        Total Bytes: 810247168&lt;br /&gt;        Total Empty Bytes: 293618176&lt;br /&gt;        CUDIFEncoding-bytes-wasted: 0&lt;br /&gt;        Sector Count: 1582514&lt;br /&gt;        CUDIFEncoding-bytes-total: 207346057&lt;br /&gt;        CUDIFEncoding-bytes-in-use: 207346057&lt;br /&gt;        Compressed Ratio: 0.40134345383388781&lt;br /&gt;        Total Non-Empty Bytes: 516628992&lt;br /&gt;Resize limits (per hdiutil resize -limits):&lt;br /&gt;        1582440 1582440 34359738368&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;unmount / detach; note make sure not in the Recovery\ 1 directory, otherwise get error 49153&lt;br /&gt;&lt;br /&gt;$ cd ~/Documents&lt;br /&gt;&lt;br /&gt;$ hdiutil detach /mnt/Scratch/Volumes/Recovery\ 1&lt;br /&gt;"disk1" unmounted.&lt;br /&gt;"disk1" ejected.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2959498105239183642-7675579843164232245?l=todayguesswhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/7675579843164232245/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://todayguesswhat.blogspot.com/2009/10/instructions-on-how-to-create.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/7675579843164232245'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/7675579843164232245'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/2009/10/instructions-on-how-to-create.html' title='instructions on how to create customized recovery image (recovery.dmg) directly from Apple TV'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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-2959498105239183642.post-4301067721373888692</id><published>2009-02-17T11:27:00.003+10:00</published><updated>2009-02-17T12:35:40.575+10:00</updated><title type='text'>I replaced the stock clarion head unit in the Magna</title><content type='html'>&lt;span style="font-family:georgia;"&gt;All the instructions I have found on the Internet regarding Magna head-unit wiring seem to be for older models. I drive a 2004 Magna TL ES that I picked up second hand for a great price. My main annoyance from an electrical perspective on this car is that the stock head-unit has no 3.5mm audio line-in, and that the remote fob chain always seems to be flat requiring me to access the car using a key which can only be accomplished at the driver's side door. Thus to open the boot/trunk, I'm forced to open the driver's side door and reach in to the glove-box and push the release button which is a major PITA.&lt;br /&gt;&lt;br /&gt;Back to the audio.... Frustrated with the lousy reception of the FM transmitted audio from my GPS, I decided to drop in to a car sound store and pick up a new head-unit. This particular store I'm well accustomed to having spent at least a thousand dollars at it way back when I was got my first second-hand car. Nowadays I'm tight as a fish's ass, and consequently I requested at the store the cheapest head-unit they have (first-hand or second-hand), that is equipped with a line-in.&lt;br /&gt;&lt;br /&gt;I ended up purchasing a Kenwood KDC-MP243 for $110 to replace the stock Clarion PE-2605K-A unit.&lt;br /&gt;&lt;br /&gt;Anyway this blog is not just about me, it's about documenting important things that I've learned and will likely forget just as quickly. For this first post, I give you the true wiring details as verified from a Mitsubishi circuit diagram. Once again, I'm too cheap to go and purchase those wiring harness things from Super Cheap or Repco. Real men cut off the stock connectors, use a portable butane soldering iron, and hope like hell they can get the shit back together before the wife gets home (I accomplished this with minutes to spare - about 4-5 hours work all up).&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;B-66A connector going in to head-unit&lt;br /&gt;&lt;br /&gt;1 2 3 4&lt;br /&gt;5 6 7 8&lt;br /&gt;&lt;br /&gt;3 BLUE    MUTE (Incoming Call)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;B-66 connector going in to head-unit&lt;br /&gt;&lt;br /&gt;11 12 13 -- -- 14 15 16&lt;br /&gt;17 18 19 20 21 22 23 24&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;11    YELLOW/RED    REAR RIGHT SPEAKER +&lt;br /&gt;17    GRAY/RED    REAR RIGHT SPEAKER -&lt;br /&gt;&lt;br /&gt;12    YELLOW/BLUE    REAR LEFT SPEAKER +&lt;br /&gt;18    GRAY/BLUE    REAR LEFT SPEAKER -&lt;br /&gt;&lt;br /&gt;13    PINK        ANTENNA&lt;br /&gt;&lt;br /&gt;20    BLUE        IGNITION SWITCH / ACC&lt;br /&gt;&lt;br /&gt;21    RED/BLACK    BATTERY&lt;br /&gt;&lt;br /&gt;14    GREEN/WHITE    HEADLAMP&lt;br /&gt;22    BLACK/YELLOW    RHEOSTAT&lt;br /&gt;&lt;br /&gt;15    WHITE/BLUE    FRONT LEFT SPEAKER +&lt;br /&gt;23    BLACK/BLUE    FRONT LEFT SPEAKER -&lt;br /&gt;&lt;br /&gt;16    WHITE/RED    FRONT RIGHT SPEAKER +&lt;br /&gt;24    BLACK/RED    FRONT RIGHT SPEAKER -&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Note: pin-outs are viewed as if looking at the physical device side of things. Such that, we are holding the radio and looking at its rear.&lt;br /&gt;&lt;br /&gt;It could be also perceived as if viewing wiring from behind connector plug (such that, the side where the various wires from all parts of the car enter the plug), and NOT the front female view of the plug!!!&lt;br /&gt;&lt;br /&gt;Other things to note, RHEOSTAT in this context is the component that determines how bright/dark you want your dashboard display.&lt;br /&gt;&lt;br /&gt;HEADLAMP on the other hand is activated whenever you turn your lights on.&lt;br /&gt;&lt;br /&gt;Accessing the Head Unit:&lt;br /&gt;&lt;br /&gt;First pull up the centre console strip (the piece with the window switches and cup holders) and detach the electrical socket.&lt;br /&gt;&lt;br /&gt;Next, pull out the compartment just below the climate control.&lt;br /&gt;&lt;br /&gt;After this, pull the stereo surround out by gripping just above the vents and below the climate controls.  You'll need to disconnect the air sensor, hazard cable and climate cables.&lt;br /&gt;&lt;br /&gt;Then unscrew the four screws holding the DIN bracket in (two top / two bottom) and disconnect the wiring harness from the stereo.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fb84xkhr8q8/SZoh_PE9Y6I/AAAAAAAAACQ/I0blZCEQeQM/s1600-h/IMG_3089_resize.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 300px; height: 400px;" src="http://2.bp.blogspot.com/_fb84xkhr8q8/SZoh_PE9Y6I/AAAAAAAAACQ/I0blZCEQeQM/s400/IMG_3089_resize.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5303588881444987810" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fb84xkhr8q8/SZoiO91jMbI/AAAAAAAAACY/5aAnNO0dYzw/s1600-h/IMG_3100_resize.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 300px; height: 400px;" src="http://3.bp.blogspot.com/_fb84xkhr8q8/SZoiO91jMbI/AAAAAAAAACY/5aAnNO0dYzw/s400/IMG_3100_resize.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5303589151694860722" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fb84xkhr8q8/SZoiPCVj4-I/AAAAAAAAACg/zPshuq5TlWo/s1600-h/IMG_3105_resize.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_fb84xkhr8q8/SZoiPCVj4-I/AAAAAAAAACg/zPshuq5TlWo/s400/IMG_3105_resize.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5303589152902865890" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2959498105239183642-4301067721373888692?l=todayguesswhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://todayguesswhat.blogspot.com/feeds/4301067721373888692/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://todayguesswhat.blogspot.com/2009/02/i-replaced-stock-clarion-head-unit-in.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/4301067721373888692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2959498105239183642/posts/default/4301067721373888692'/><link rel='alternate' type='text/html' href='http://todayguesswhat.blogspot.com/2009/02/i-replaced-stock-clarion-head-unit-in.html' title='I replaced the stock clarion head unit in the Magna'/><author><name>Matt (Brisbane/Australia)</name><uri>http://www.blogger.com/profile/16649081553551301779</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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_fb84xkhr8q8/SZoh_PE9Y6I/AAAAAAAAACQ/I0blZCEQeQM/s72-c/IMG_3089_resize.jpg' height='72' width='72'/><thr:total>3</thr:total></entry></feed>
