tag:blogger.com,1999:blog-56824137707706740962024-02-19T10:48:36.522-05:00Michael Angstadt's BlogFocusing mainly on IT/software development topicsMichael Angstadthttp://www.blogger.com/profile/04809821580827426849noreply@blogger.comBlogger121125tag:blogger.com,1999:blog-5682413770770674096.post-5477990913417759842023-05-29T16:50:00.000-04:002023-05-29T16:50:30.563-04:00Event promotion with Porteus Kiosk and ChatGPT<p>At the public library where I work, I use a software product
called <a href="https://porteus-kiosk.org/" target="_blank">Porteus Kiosk</a> for our catalog computers. It’s a free, Linux-based
operating system that makes it easy to lock down a computer and turn it into a
single-purpose device. Check out my <a href="https://mangstacular.blogspot.com/2023/05/porteus-kiosk.html" target="_blank">previous blog post</a> for more on that.
</p><p class="MsoNormal">One of the many features Porteus supports is the ability to
set a webpage as the computer’s screensaver. I have seen other libraries utilize
the screensavers of their catalog computers for event promotion and such, so I
decided to do the same.</p>
<p class="MsoNormal">I knew what I wanted to do:</p>
<ol>
<li>Retrieve all WordPress posts that have a specific
category assigned (our library uses a WordPress website). This could be done using
the WordPress PHP API because the screensaver webpage is hosted on the same
server as the library website.
</li><li>Get the featured image URL of each post. These
are the images that will appear in the screensaver’s carousel.
</li><li>Display the featured images on a webpage in a slideshow
that advances automatically every 20 seconds using JavaScript.
</li></ol>
<p class="MsoNormal"><b>Writing the WordPress PHP code</b></p>
<p class="MsoNormal">I had heard of programmers using ChatGPT to help them write
code (or do it for them, even). I started by asking ChatGPT:</p>
<p class="MsoNormal"></p><blockquote>“Give me some sample PHP code that retrieves all WordPress
posts tagged with a specific category.”</blockquote><p></p>
<p class="MsoNormal">Its response was to give me code that accomplished this utilizing
WordPress’s REST API, along with a seemingly detailed and authoritative
explanation of how the code works. It really felt like I was reading something written
by a human being on a site like <a href="https://www.stackoverflow.com/">Stackoverflow</a>.
However, I didn’t want to use the REST API, so I said,</p>
<p class="MsoNormal"></p><blockquote>“What about without using the REST API?”</blockquote><p></p>
<p class="MsoNormal">It inferred what I meant based on the context of our conversation.
It revised its code sample to use the WordPress PHP API, which happened to be
what I was looking for. However, the code didn’t work. After a lot of troubleshooting
on my part, I discovered why. ChatGPT’s code used an incorrect keyword in the
WordPress query function call—“category” instead of “cat” to represent the
database ID of the category. I told ChatGPT its mistake,</p>
<p class="MsoNormal"></p><blockquote>“You were wrong about how to query based on category ID. The
array key is "cat" not "category".”</blockquote><p></p>
<p class="MsoNormal">It quickly apologized, told me I was correct, provided the
corrected code, and apologized once more. Would it have responded in the same
way if I said it made a mistake when it really hadn’t?</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbrg51UNUAGBuzvGaDxTaYP0uSN33Pns04aAE3wMBeKJ6dO8pE7tcNLqWJMWWumJl0_l1nsQNEt_ZEeaP8S4f20iJ-VsfZiDz_C_KuIxBowB-sQ4WJfQHIc6MZz-YKXmPwMps1FPpOiiOkwhBHpx1ujiPiIirpuc3F26WNCp2jj6_9njcNY399jP_v8g/s1077/Screenshot%202023-05-29%20163306.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="304" data-original-width="1077" height="90" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbrg51UNUAGBuzvGaDxTaYP0uSN33Pns04aAE3wMBeKJ6dO8pE7tcNLqWJMWWumJl0_l1nsQNEt_ZEeaP8S4f20iJ-VsfZiDz_C_KuIxBowB-sQ4WJfQHIc6MZz-YKXmPwMps1FPpOiiOkwhBHpx1ujiPiIirpuc3F26WNCp2jj6_9njcNY399jP_v8g/s320/Screenshot%202023-05-29%20163306.png" width="320" /></a></div>
<p class="MsoNormal"><b>Writing the JavaScript slideshow code</b></p>
<p class="MsoNormal">In a new chat conversation, I asked,</p>
<p class="MsoNormal"></p><blockquote>“Write Javascript code that generates a slideshow from a
list of images”.</blockquote><p></p>
<p class="MsoNormal">And it did! But it didn’t quite give me what I wanted. The
slideshow I had in mind was one that advanced automatically every 20 seconds.
The code ChatGPT generated had “previous” and “next” buttons for advancing the
slides. So, I provided the following instruction,</p>
<p class="MsoNormal"></p><blockquote>“Remove the next and prev buttons. The slides should
automatically change every 20 seconds.”</blockquote><p></p>
<p class="MsoNormal">And it did exactly that! After some work on my part to insert
the slider image URLs retrieved using the WordPress code, the slideshow actually
worked!</p>
<p class="MsoNormal"><b>The results</b></p>
<p class="MsoNormal">Once I had a functioning event slider carousel up and
running, I worked on making the web page look pretty (*without* any help, thank
you) by adding the library’s logo, a nice background (as it turns out, photos
of bookshelves tile very nicely), and a large heading so patrons know what the
computer is for. You can see the final result here:</p>
<p class="MsoNormal"><a href="http://mnl.mclinc.org/opac/screensaver/screensaver.php?branch=MNL">http://mnl.mclinc.org/opac/screensaver/screensaver.php?branch=MNL</a></p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg90dilJ_zNjHdckc5K_rHVMT1JIfqNTupjlfXpkCDsUDUkFS2Zmif5zUsZ6zP262DN4YpTAoqFttBePWcgywQYdVXFmOSWeFCqgEZcbXpANfBbgfI6Jhyt2o5gNxxF0gfL4wqvbb4R9NmXjE8Ecw6EE93TbwkzG_N7D9qwYqaHCIJAlVN5H_7v8XgW7Q/s1132/Screenshot%202023-05-29%20162049.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="820" data-original-width="1132" height="232" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg90dilJ_zNjHdckc5K_rHVMT1JIfqNTupjlfXpkCDsUDUkFS2Zmif5zUsZ6zP262DN4YpTAoqFttBePWcgywQYdVXFmOSWeFCqgEZcbXpANfBbgfI6Jhyt2o5gNxxF0gfL4wqvbb4R9NmXjE8Ecw6EE93TbwkzG_N7D9qwYqaHCIJAlVN5H_7v8XgW7Q/s320/Screenshot%202023-05-29%20162049.png" width="320" /></a></div><br /><p class="MsoNormal"><br /></p>
<p class="MsoNormal"> </p>
<p class="MsoNormal"> </p>
<p></p>Michael Angstadthttp://www.blogger.com/profile/04809821580827426849noreply@blogger.com0tag:blogger.com,1999:blog-5682413770770674096.post-47502316571967334522023-05-20T11:05:00.000-04:002023-05-20T11:05:03.821-04:00Porteus Kiosk<p><a href="https://porteus-kiosk.org" target="_blank">Porteus Kiosk</a> is a software product that can be used to turn computers into “dumb” terminals that serve a single purpose. For example, showing a slide show on a large monitor in a hotel lobby or allowing customers to make appointments at a hair salon. It uses a very light-weight Linux operating system and utilizes either the Firefox or Chrome web browser. It only requires only 1 GB of hard disk space and 1 GB of RAM.</p><p>At the public library where I work, this product is perfect for the computers that patrons use to look up items in the library’s online catalog (referred to as "OPACs"--online public access catalogs). Gone are the days of jumping through a thousand hoops trying to properly lock down and administer an expensive and resource-heavy Windows computer. Porteus Kiosk is better in every way.</p><p>The way it works is you burn a 170 MB ISO to a flash drive (or an optical disk if you’re feeling nostalgic) and boot the flash drive on the kiosk computer. The kiosk image is configured using a special configuration file, which is just a plain text file with one setting per line. All of the settings are <a href="https://porteus-kiosk.org/parameters.html" target="_blank">documented on their website</a>.<br /></p><p><b>Example configuration file:</b></p><p><span style="font-family: courier;">kiosk_config=http://mywebsite.com/kiosk-config.txt<br />connection=wired<br />dhcp=yes<br />browser=firefox<br />mouse_cursor_size=large<br />homepage=https://www.google.com</span></p><p></p><p>The setup wizard allows you to provide this configuration file, but it
also provides a user-friendly GUI that allows you to browse the various
configuration settings that are available and set them as you wish. When you are done, it shows you the configuration file that it generates based on the settings you selected. You can then save it for later use.<br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqqW63svoY-3GDS0seQkKPTMZ1tffFn6og5ICusCZr3a5Q1oz_zIUYV5rQJN23ULlK_hppGaYooF_TNvxuCXVgn8r_i1Hn9oSu_0dhz-Cg_uPfhowqK9YtKjCvyuh_xQcg5Gnwn5y89i08ImTVVIooIuz2mLHkGmBC97DtXSYyQGgqUA8cPEZhk3WxSg/s936/Screenshot%202023-05-20%20105117.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="703" data-original-width="936" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqqW63svoY-3GDS0seQkKPTMZ1tffFn6og5ICusCZr3a5Q1oz_zIUYV5rQJN23ULlK_hppGaYooF_TNvxuCXVgn8r_i1Hn9oSu_0dhz-Cg_uPfhowqK9YtKjCvyuh_xQcg5Gnwn5y89i08ImTVVIooIuz2mLHkGmBC97DtXSYyQGgqUA8cPEZhk3WxSg/s320/Screenshot%202023-05-20%20105117.png" width="320" /></a></div><br /><p></p><p>Once the configuration settings have been provided, it prompts you to choose a partition on the hard drive on which to burn the kiosk image. You might think it would take a while to write an entire operating system to the hard drive, but it is very fast. On the 10+ year old machines I’ve put Porteus on, it takes less than a minute.</p><p>In order to reconfigure the kiosk (for example, changing the home page), you have to go through the entire process again—there’s no “administration settings” screen you can open while the kiosk is running. However, it is possible to host the configuration file on a web server and point the kiosk to this URL. When this is done, every time the kiosk boots, it checks to see if the configuration file has changed. If it has, it automatically re-images the machine with the new configuration. If it is unable to download the configuration file (due to the web server being down, for instance), it continues to use the last configuration file it downloaded and displays a warning message at the top of the screen for a few seconds after it boots.</p><p>Despite all the great things about Porteus, I did encounter one annoying issue related to the system clock. I have configured our computers to turn on automatically in the morning using the Auto-On settings in the BIOS. Every time the computer boots, Porteus syncs the system clock with internet time servers. This is good because most websites use HTTPS, and if the system clock is not set correctly, these sites will not load. However, it sets the system clock to UTC time, which means that the Auto-On time, which is defined in local time, no longer matches the system clock time. A workaround is to set the Auto-On time to be 4 hours ahead of local time (for example, setting it to 12 PM when I want the computers to turn on at 8 AM). However, this means that the computer will turn on an hour early during the other half of the year when our UTC offset is -5 instead of -4.<br /><br /></p>Michael Angstadthttp://www.blogger.com/profile/04809821580827426849noreply@blogger.com1tag:blogger.com,1999:blog-5682413770770674096.post-44514722034501915622023-05-16T11:12:00.001-04:002023-05-16T11:14:11.776-04:00Customizing your Envisionware self-service terminal launch screen<p><!--[if gte mso 9]><xml>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
</o:OfficeDocumentSettings>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:PunctuationKerning/>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>EN-US</w:LidThemeOther>
<w:LidThemeAsian>X-NONE</w:LidThemeAsian>
<w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
<w:Compatibility>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:EnableOpenTypeKerning/>
<w:DontFlipMirrorIndents/>
<w:OverrideTableStyleHps/>
</w:Compatibility>
<m:mathPr>
<m:mathFont m:val="Cambria Math"/>
<m:brkBin m:val="before"/>
<m:brkBinSub m:val="--"/>
<m:smallFrac m:val="off"/>
<m:dispDef/>
<m:lMargin m:val="0"/>
<m:rMargin m:val="0"/>
<m:defJc m:val="centerGroup"/>
<m:wrapIndent m:val="1440"/>
<m:intLim m:val="subSup"/>
<m:naryLim m:val="undOvr"/>
</m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="false"
DefSemiHidden="false" DefQFormat="false" DefPriority="99"
LatentStyleCount="376">
<w:LsdException Locked="false" Priority="0" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 9"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 9"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 1"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 2"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 3"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 4"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 5"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 6"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 7"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 8"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 9"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footnote text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="header"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footer"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index heading"/>
<w:LsdException Locked="false" Priority="35" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="caption"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="table of figures"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="envelope address"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="envelope return"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footnote reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="line number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="page number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="endnote reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="endnote text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="table of authorities"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="macro"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toa heading"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 5"/>
<w:LsdException Locked="false" Priority="10" QFormat="true" Name="Title"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Closing"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Signature"/>
<w:LsdException Locked="false" Priority="1" SemiHidden="true"
UnhideWhenUsed="true" Name="Default Paragraph Font"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Message Header"/>
<w:LsdException Locked="false" Priority="11" QFormat="true" Name="Subtitle"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Salutation"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Date"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text First Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text First Indent 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Note Heading"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Block Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Hyperlink"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="FollowedHyperlink"/>
<w:LsdException Locked="false" Priority="22" QFormat="true" Name="Strong"/>
<w:LsdException Locked="false" Priority="20" QFormat="true" Name="Emphasis"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Document Map"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Plain Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="E-mail Signature"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Top of Form"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Bottom of Form"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal (Web)"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Acronym"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Address"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Cite"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Code"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Definition"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Keyboard"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Preformatted"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Sample"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Typewriter"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Variable"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal Table"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation subject"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="No List"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Contemporary"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Elegant"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Professional"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Subtle 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Subtle 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Balloon Text"/>
<w:LsdException Locked="false" Priority="39" Name="Table Grid"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Theme"/>
<w:LsdException Locked="false" SemiHidden="true" Name="Placeholder Text"/>
<w:LsdException Locked="false" Priority="1" QFormat="true" Name="No Spacing"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading"/>
<w:LsdException Locked="false" Priority="61" Name="Light List"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 1"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 1"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 1"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 1"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 1"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 1"/>
<w:LsdException Locked="false" SemiHidden="true" Name="Revision"/>
<w:LsdException Locked="false" Priority="34" QFormat="true"
Name="List Paragraph"/>
<w:LsdException Locked="false" Priority="29" QFormat="true" Name="Quote"/>
<w:LsdException Locked="false" Priority="30" QFormat="true"
Name="Intense Quote"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 1"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 1"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 1"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 1"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 1"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 1"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 1"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 1"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 2"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 2"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 2"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 2"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 2"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 2"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 2"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 2"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 2"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 2"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 2"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 2"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 2"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 2"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 3"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 3"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 3"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 3"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 3"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 3"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 3"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 3"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 3"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 3"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 3"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 3"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 3"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 3"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 4"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 4"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 4"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 4"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 4"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 4"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 4"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 4"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 4"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 4"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 4"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 4"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 4"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 4"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 5"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 5"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 5"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 5"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 5"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 5"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 5"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 5"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 5"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 5"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 5"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 5"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 5"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 5"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 6"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 6"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 6"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 6"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 6"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 6"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 6"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 6"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 6"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 6"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 6"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 6"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 6"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 6"/>
<w:LsdException Locked="false" Priority="19" QFormat="true"
Name="Subtle Emphasis"/>
<w:LsdException Locked="false" Priority="21" QFormat="true"
Name="Intense Emphasis"/>
<w:LsdException Locked="false" Priority="31" QFormat="true"
Name="Subtle Reference"/>
<w:LsdException Locked="false" Priority="32" QFormat="true"
Name="Intense Reference"/>
<w:LsdException Locked="false" Priority="33" QFormat="true" Name="Book Title"/>
<w:LsdException Locked="false" Priority="37" SemiHidden="true"
UnhideWhenUsed="true" Name="Bibliography"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="TOC Heading"/>
<w:LsdException Locked="false" Priority="41" Name="Plain Table 1"/>
<w:LsdException Locked="false" Priority="42" Name="Plain Table 2"/>
<w:LsdException Locked="false" Priority="43" Name="Plain Table 3"/>
<w:LsdException Locked="false" Priority="44" Name="Plain Table 4"/>
<w:LsdException Locked="false" Priority="45" Name="Plain Table 5"/>
<w:LsdException Locked="false" Priority="40" Name="Grid Table Light"/>
<w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark"/>
<w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful"/>
<w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 1"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 1"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 1"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 1"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 1"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 2"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 2"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 2"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 2"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 2"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 3"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 3"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 3"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 3"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 3"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 4"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 4"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 4"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 4"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 4"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 5"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 5"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 5"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 5"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 5"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 6"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 6"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 6"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 6"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 6"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="46" Name="List Table 1 Light"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark"/>
<w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful"/>
<w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 1"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 1"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 1"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 1"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 1"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 2"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 2"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 2"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 2"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 2"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 3"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 3"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 3"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 3"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 3"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 4"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 4"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 4"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 4"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 4"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 5"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 5"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 5"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 5"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 5"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 6"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 6"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 6"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 6"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 6"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Mention"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Smart Hyperlink"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Hashtag"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Unresolved Mention"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Smart Link"/>
</w:LatentStyles>
</xml><![endif]--> I recently deployed a computer at the public library where I
work that allows patrons to pay for and release their own print jobs. Previously,
the print release system was managed by staff at the circulation desk, which meant
longer wait time for patrons and more work for staff.
</p><p class="MsoNormal">The software can be confusing to install and configure.
But fortunately, I was able to figure it out myself and did not have to resort
to contacting Envisionware’s customer support for assistance. When you install
the software, you’re actually installing two separate pieces of software.
First, there is the actual LPT:One print release terminal software, which is what
patrons use to view and release their print jobs. Then, there is an optional piece
of software called Launch Command which should be installed if your print
release terminal is configured to be patron-facing instead of staff-facing.</p>
<p class="MsoNormal">Launch Command provides buttons for the user to click which launches
the print release software. Touch screen monitors are great for this, and I
have deployed one for our setup. The window fills up the entire screen, including
the task bar, to prevent users from accessing the Windows desktop. The buttons
are defined in a simple HTML file, which gives you a ton of flexibility to customize
this screen however you want. In fact, I highly recommend you do this because the
out-of-the-box screen is, let’s just say, very “1990”. I was surprised to find
that none of the public libraries I’ve visited in my area have customized this
screen at all.</p><p class="MsoNormal" style="text-align: center;"><b>Out of the box (shield your eyes, for the white background color may blind you):</b></p><p class="MsoNormal"></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPHr3EhLOMcEn63sbwqATu0uGhL8fjMRL3phDbVBZ9F-r3rSMc6qTzBLF4qLN5JPBfbE7JvScmRYDGudE01FEuRoYbnLZzc6Yd_YDVlvy8ZRqnFSJXdclk7D7sO4kH5UOnlil4yGzFUIRIQd231tSpBY_OZ9N4mAmfpbkoMGQtzThyUgTrVY6sgAAPkg/s909/out%20of%20the%20box.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="567" data-original-width="909" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPHr3EhLOMcEn63sbwqATu0uGhL8fjMRL3phDbVBZ9F-r3rSMc6qTzBLF4qLN5JPBfbE7JvScmRYDGudE01FEuRoYbnLZzc6Yd_YDVlvy8ZRqnFSJXdclk7D7sO4kH5UOnlil4yGzFUIRIQd231tSpBY_OZ9N4mAmfpbkoMGQtzThyUgTrVY6sgAAPkg/s320/out%20of%20the%20box.png" width="320" /></a></div><p></p><p class="MsoNormal" style="text-align: center;"><b> My customizations:</b></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAyDon1f-hfU0qTAmtOn37yhErZ4umi2wrJZsPvBS_HXr5QMLWzz-qN84RsSIpGUCGGxUBGPUqfXDWBSwztKsd3LphjDdDUK-Cpj5xr0WywLXvsNVmkiWUMNwqRZQLaS3HdLOCS3gojrfyZYzFDO2Wu9zckJjSx2AH6naaYcjbZLaO35polJd9as4psA/s658/Screenshot%202023-05-11%20132702.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="432" data-original-width="658" height="210" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAyDon1f-hfU0qTAmtOn37yhErZ4umi2wrJZsPvBS_HXr5QMLWzz-qN84RsSIpGUCGGxUBGPUqfXDWBSwztKsd3LphjDdDUK-Cpj5xr0WywLXvsNVmkiWUMNwqRZQLaS3HdLOCS3gojrfyZYzFDO2Wu9zckJjSx2AH6naaYcjbZLaO35polJd9as4psA/s320/Screenshot%202023-05-11%20132702.png" width="320" /></a></div><br /><p class="MsoNormal"></p><p class="MsoNormal">The print release software is launched using an <span style="font-family: courier;"><a></span> tag
whose “href” attribute points to the print release software’s executable. This
means you could presumably use Launch Command for launching other programs too,
though I haven’t had a need to do this.</p>
<p class="MsoNormal"><span style="font-family: courier;"><a href="launch://C:\Program Files
(x86)\EnvisionWare\lptone\lptprt\lptprt.exe -host=192.168.1.11 -runmode=prompt
-locale:en_us"></span></p>
<p class="MsoNormal">As you can see from the code snippet above, it’s easy to change
the display language for the print release software by editing the “locale”
argument. Because we have many Spanish-speaking patrons, I added a second
button which launches the print release software in Spanish (use “es_us” for
Spanish). The software supports English, Spanish, French, Portuguese, PRC Chinese,
and Hong Kong Chinese.</p>
<p class="MsoNormal">Images used on this screen are stored in a location relative
to where the HTML file is stored. The images are referenced by relative path in
the HTML.</p>
<p class="MsoNormal"><span style="font-family: courier;"><img
src="../images/release-a-print-job.en-us.png" /></span></p>
<p class="MsoNormal">I don’t know how Launch Command renders the HTML. Does it
use its own web browser? I haven’t tried doing too many crazy things with the
HTML, but due to the program’s age, I wouldn’t be surprised if it lacks support
for modern web standards. For example, I tried to apply rounded-corner styling to some
images using the “border-radius” CSS property, but it had no effect.<br /></p>
<p></p>Michael Angstadthttp://www.blogger.com/profile/04809821580827426849noreply@blogger.com0tag:blogger.com,1999:blog-5682413770770674096.post-79193802392953380662023-04-30T11:34:00.001-04:002023-05-01T19:56:46.873-04:00CloudNine<p> <!--[if !mso]>
<style>
v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style>
<![endif]--><!--[if gte mso 9]><xml>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
</o:OfficeDocumentSettings>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves>false</w:TrackMoves>
<w:TrackFormatting/>
<w:PunctuationKerning/>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>EN-US</w:LidThemeOther>
<w:LidThemeAsian>X-NONE</w:LidThemeAsian>
<w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
<w:Compatibility>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:EnableOpenTypeKerning/>
<w:DontFlipMirrorIndents/>
<w:OverrideTableStyleHps/>
</w:Compatibility>
<m:mathPr>
<m:mathFont m:val="Cambria Math"/>
<m:brkBin m:val="before"/>
<m:brkBinSub m:val="--"/>
<m:smallFrac m:val="off"/>
<m:dispDef/>
<m:lMargin m:val="0"/>
<m:rMargin m:val="0"/>
<m:defJc m:val="centerGroup"/>
<m:wrapIndent m:val="1440"/>
<m:intLim m:val="subSup"/>
<m:naryLim m:val="undOvr"/>
</m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="false"
DefSemiHidden="false" DefQFormat="false" DefPriority="99"
LatentStyleCount="376">
<w:LsdException Locked="false" Priority="0" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 9"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 9"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 1"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 2"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 3"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 4"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 5"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 6"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 7"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 8"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 9"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footnote text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="header"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footer"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index heading"/>
<w:LsdException Locked="false" Priority="35" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="caption"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="table of figures"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="envelope address"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="envelope return"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footnote reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="line number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="page number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="endnote reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="endnote text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="table of authorities"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="macro"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toa heading"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 5"/>
<w:LsdException Locked="false" Priority="10" QFormat="true" Name="Title"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Closing"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Signature"/>
<w:LsdException Locked="false" Priority="1" SemiHidden="true"
UnhideWhenUsed="true" Name="Default Paragraph Font"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Message Header"/>
<w:LsdException Locked="false" Priority="11" QFormat="true" Name="Subtitle"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Salutation"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Date"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text First Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text First Indent 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Note Heading"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Block Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Hyperlink"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="FollowedHyperlink"/>
<w:LsdException Locked="false" Priority="22" QFormat="true" Name="Strong"/>
<w:LsdException Locked="false" Priority="20" QFormat="true" Name="Emphasis"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Document Map"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Plain Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="E-mail Signature"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Top of Form"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Bottom of Form"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal (Web)"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Acronym"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Address"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Cite"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Code"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Definition"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Keyboard"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Preformatted"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Sample"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Typewriter"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Variable"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal Table"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation subject"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="No List"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Contemporary"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Elegant"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Professional"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Subtle 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Subtle 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Balloon Text"/>
<w:LsdException Locked="false" Priority="39" Name="Table Grid"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Theme"/>
<w:LsdException Locked="false" SemiHidden="true" Name="Placeholder Text"/>
<w:LsdException Locked="false" Priority="1" QFormat="true" Name="No Spacing"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading"/>
<w:LsdException Locked="false" Priority="61" Name="Light List"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 1"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 1"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 1"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 1"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 1"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 1"/>
<w:LsdException Locked="false" SemiHidden="true" Name="Revision"/>
<w:LsdException Locked="false" Priority="34" QFormat="true"
Name="List Paragraph"/>
<w:LsdException Locked="false" Priority="29" QFormat="true" Name="Quote"/>
<w:LsdException Locked="false" Priority="30" QFormat="true"
Name="Intense Quote"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 1"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 1"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 1"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 1"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 1"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 1"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 1"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 1"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 2"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 2"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 2"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 2"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 2"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 2"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 2"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 2"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 2"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 2"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 2"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 2"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 2"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 2"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 3"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 3"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 3"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 3"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 3"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 3"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 3"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 3"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 3"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 3"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 3"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 3"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 3"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 3"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 4"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 4"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 4"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 4"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 4"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 4"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 4"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 4"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 4"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 4"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 4"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 4"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 4"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 4"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 5"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 5"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 5"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 5"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 5"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 5"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 5"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 5"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 5"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 5"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 5"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 5"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 5"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 5"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 6"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 6"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 6"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 6"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 6"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 6"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 6"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 6"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 6"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 6"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 6"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 6"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 6"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 6"/>
<w:LsdException Locked="false" Priority="19" QFormat="true"
Name="Subtle Emphasis"/>
<w:LsdException Locked="false" Priority="21" QFormat="true"
Name="Intense Emphasis"/>
<w:LsdException Locked="false" Priority="31" QFormat="true"
Name="Subtle Reference"/>
<w:LsdException Locked="false" Priority="32" QFormat="true"
Name="Intense Reference"/>
<w:LsdException Locked="false" Priority="33" QFormat="true" Name="Book Title"/>
<w:LsdException Locked="false" Priority="37" SemiHidden="true"
UnhideWhenUsed="true" Name="Bibliography"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="TOC Heading"/>
<w:LsdException Locked="false" Priority="41" Name="Plain Table 1"/>
<w:LsdException Locked="false" Priority="42" Name="Plain Table 2"/>
<w:LsdException Locked="false" Priority="43" Name="Plain Table 3"/>
<w:LsdException Locked="false" Priority="44" Name="Plain Table 4"/>
<w:LsdException Locked="false" Priority="45" Name="Plain Table 5"/>
<w:LsdException Locked="false" Priority="40" Name="Grid Table Light"/>
<w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark"/>
<w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful"/>
<w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 1"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 1"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 1"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 1"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 1"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 2"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 2"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 2"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 2"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 2"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 3"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 3"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 3"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 3"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 3"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 4"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 4"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 4"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 4"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 4"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 5"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 5"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 5"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 5"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 5"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 6"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 6"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 6"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 6"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 6"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="46" Name="List Table 1 Light"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark"/>
<w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful"/>
<w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 1"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 1"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 1"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 1"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 1"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 2"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 2"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 2"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 2"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 2"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 3"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 3"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 3"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 3"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 3"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 4"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 4"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 4"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 4"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 4"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 5"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 5"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 5"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 5"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 5"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 6"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 6"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 6"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 6"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 6"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Mention"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Smart Hyperlink"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Hashtag"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Unresolved Mention"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Smart Link"/>
</w:LatentStyles>
</xml><![endif]--><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0in 5.4pt 0in 5.4pt;
mso-para-margin-top:0in;
mso-para-margin-right:0in;
mso-para-margin-bottom:8.0pt;
mso-para-margin-left:0in;
line-height:107%;
mso-pagination:widow-orphan;
font-size:11.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;
mso-font-kerning:1.0pt;
mso-ligatures:standardcontextual;}
</style>
<![endif]-->
</p><p class="MsoNormal"></p>
<p class="MsoNormal"></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXJz3yx6bFT7RKb3t_E1ru4EjeKeH2EJ8Mfch-fzv8XKm5fGnXjqIP8ISmNJvlcRcbFGdJ_6KH1HmEirZZFedG98SQR4dgk6g16JAQWKP4TP3P49jj7vVi86DcPKsKgu_zmk8D2EvX9MahSNmDmEZd669s_JCZhbEe3154QwAE3NzM7VHp9SUB9xoNQA/s275/CloudNine-Res-R1-275x50.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="50" data-original-width="275" height="50" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXJz3yx6bFT7RKb3t_E1ru4EjeKeH2EJ8Mfch-fzv8XKm5fGnXjqIP8ISmNJvlcRcbFGdJ_6KH1HmEirZZFedG98SQR4dgk6g16JAQWKP4TP3P49jj7vVi86DcPKsKgu_zmk8D2EvX9MahSNmDmEZd669s_JCZhbEe3154QwAE3NzM7VHp9SUB9xoNQA/s1600/CloudNine-Res-R1-275x50.png" width="275" /></a></div><br />CloudNine is a software product developed by a company
called Envisionware. It is used to control access to public computers and other
devices. Its main customer base is public libraries. It supports a plethora of features
such as library card barcode authentication, setting session time limits, and setting
operating hours.<p></p>
<p class="MsoNormal">It is a new system that aims to replace the company’s legacy
software product, PC Reservation. The two products serve the same purpose but
are very different from each other. The main technical difference between the
two is that PC Reservation must run on a local server within the building premises,
whereas CloudNine (as you may have guessed from the “clever” name) is
administered over the internet. PC Reservation uses a native Windows
application to administer your public computers, whereas CloudNine uses a web-based
interface called the Web Console.</p>
<p class="MsoNormal">The Web Console is simply a website that you login to that allows
you to administer your computers. It organizes its settings in a hierarchical
fashion, which is particularly useful if your library system is composed of multiple
branch libraries. What this means is that you can define settings at the “top
level”, which all branches will inherit from. Then, you can choose to override
those settings individually at the branch level as needed. For example, if one
of your branch libraries wants to have a different session time limit than
everyone else, it’s easy to override that setting for that individual branch.</p><p class="MsoNormal"></p><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZBCbZw92v3-1JKykHZ-BXsWHw_dxZg5a6R6OkAQD9cieYvKdSgvBzLnAVpTTnS5Clyo7RIvQlj2AiggU32Taw0tWG5k3D_UaB_zHRgOF7CkgdI5g3Bz459MB6ieMaCOc8Qpr0oldGhfjeokLOmGXE2VykmOYHujIDQxNS3vOhV1N6C32A23-SrFn7sA/s1813/Screenshot%202023-04-30%20113031.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="697" data-original-width="1813" height="123" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZBCbZw92v3-1JKykHZ-BXsWHw_dxZg5a6R6OkAQD9cieYvKdSgvBzLnAVpTTnS5Clyo7RIvQlj2AiggU32Taw0tWG5k3D_UaB_zHRgOF7CkgdI5g3Bz459MB6ieMaCOc8Qpr0oldGhfjeokLOmGXE2VykmOYHujIDQxNS3vOhV1N6C32A23-SrFn7sA/s320/Screenshot%202023-04-30%20113031.png" width="320" /></a></div><p></p><p class="MsoNormal"> </p><p class="MsoNormal">There are a TON of settings in the Web Console. Many are
self-explanatory, but unfortunately, documentation for these settings is currently
lacking. Each setting has tooltip text which is displayed when you point to the
setting in the UI, but the text is often redundant and not useful. For example,
the tooltip text for a setting called “URL for Logo” is unhelpfully “The URL to
an image that will be used for your logo.” It doesn’t say anything about what
image formats are supported or what the dimensions should be.</p>
<p class="MsoNormal">To install CloudNine onto a public computer, you first login
to the Web Console and add an entry for the computer to the list of reservable
computers. <span style="mso-spacerun: yes;"> </span>From there, you download a
Windows executable, which is what installs the CloudNine native client onto the
computer. The installation is straightforward and once installed, no additional
configuration is required. All settings, such as session time limits,
authentication rules, etc are pulled down from Web Console, so the client itself
doesn’t need to be configured at all. The client software will auto-update itself
as needed.</p>
<p class="MsoNormal">The CloudNine client is basically a lock screen that sits
overtop the Windows desktop that prevents you from interacting with the computer
until you login to it. You are not able to see the desktop or open the start
menu until you authenticate with CloudNine. Authentication is done using a
library card barcode number or a guest pass. Once you authenticate, the lock
screen goes away and you can use the computer like normal. (However, logging out
of the Windows user account will effectively end your CloudNine session because
CloudNine will relaunch when you log back into any Windows user account, at
which point you will have to login to CloudNine again to use the computer.)</p><p class="MsoNormal"></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhK4HhqgKohYtvxHSwMPKTuPh6id7iF2-foRnY1qdmRM4bdboD3rPIzOD3yWXYqqpH0MFXuMK6mhdzM_cQ8EM93ynBk24wUVAgfHviT6gin9irVps5A6j8tD1VpBykLFf3_F1_6fB0JJDs9v9-_DDTVNgPbh25nKzfrmab6CbHoIYyokfc68IANIqDYTw/s1021/image.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="484" data-original-width="1021" height="152" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhK4HhqgKohYtvxHSwMPKTuPh6id7iF2-foRnY1qdmRM4bdboD3rPIzOD3yWXYqqpH0MFXuMK6mhdzM_cQ8EM93ynBk24wUVAgfHviT6gin9irVps5A6j8tD1VpBykLFf3_F1_6fB0JJDs9v9-_DDTVNgPbh25nKzfrmab6CbHoIYyokfc68IANIqDYTw/s320/image.png" width="320" /></a></div><br />The downside to CloudNine being cloud-based is that, if the
computer loses its internet connection, then it will not allow users to login
and use the computer. However, most of our patrons primarily use the computers
for internet access, so if our building loses internet, no one wants to use the
computers anyway. The same issue could occur if the CloudNine servers go down,
but server uptime has been stellar, and we’ve never had issues with that.<p></p>
<p class="MsoNormal">Overall, CloudNine is a very good product and I’m glad our
consortium decided to purchase it!</p>
<p></p>Michael Angstadthttp://www.blogger.com/profile/04809821580827426849noreply@blogger.com0tag:blogger.com,1999:blog-5682413770770674096.post-89210091927677766442021-08-24T10:52:00.002-04:002021-08-24T11:38:56.915-04:00The new Google Drive desktop app<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgF5rowsTtxdoVZJEyoK1_XY_wd0o4GAykqC-q6UDGz8YkfhuZALArRy-vMbr7tYpdTTh3IyhkkoxjDh9jYAj1qG_4UE9Re3gFi60wEsQYO8Nv25wSelD8m98JpasLLjBRAvv7Uk-YtXB4L/s200/1200px-Google_Drive_logo.png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="179" data-original-width="200" height="179" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgF5rowsTtxdoVZJEyoK1_XY_wd0o4GAykqC-q6UDGz8YkfhuZALArRy-vMbr7tYpdTTh3IyhkkoxjDh9jYAj1qG_4UE9Re3gFi60wEsQYO8Nv25wSelD8m98JpasLLjBRAvv7Uk-YtXB4L/s0/1200px-Google_Drive_logo.png" width="200" /></a></div><p>Google Drive is a free cloud-based file storage service
provided by Google. It allows you to browse, upload, and download files in the
cloud using a web browser. For more convenient access to your files, Google
provides a Windows desktop application that allows you to access your Google
Drive files through File Explorer without needing to use a web browser.</p><p></p>
<p class="MsoNormal">This application used to be called “Backup and Sync”. A new
and improved version, not-so-creatively dubbed “Drive for desktop”, has
recently been released. This new version is considerably different from its
predecessor.</p>
<h3 class="MsoNormal" style="text-align: left;">Streaming <br /></h3><p class="MsoNormal">The biggest improvement in my opinion is the ability to
stream files. With Backup and Sync, you had no option but to download a copy of
every single file to your computer (Drive for desktop calls this “mirroring”).
This approach is problematic if you are short on disk space or have a slow
internet connection. While Drive for desktop continues to support mirroring, it
also provides a second option called “streaming”. This means that the files are
only downloaded when you open them, saving a lot of disk space and bandwidth. Files
and folders that you need offline access to can be marked as such using the
right-click context menu.</p>
<p class="MsoNormal"></p><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPVtSIN21dQOhdPaS67Ev0iKlC60A2pZ-GzJPU_mPat3SawGwWJwdpXm6SXea2nQDH1N0coq15O04ymlB9X3hjD6ERwUktCA17UPWn8KWwTBmiNDN7nEoJMbBGQ9PuUZ9w3EHq4ygolVQs/s642/2021-08-24+10_40_05-Google+Drive+Preferences.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="573" data-original-width="642" height="286" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPVtSIN21dQOhdPaS67Ev0iKlC60A2pZ-GzJPU_mPat3SawGwWJwdpXm6SXea2nQDH1N0coq15O04ymlB9X3hjD6ERwUktCA17UPWn8KWwTBmiNDN7nEoJMbBGQ9PuUZ9w3EHq4ygolVQs/s320/2021-08-24+10_40_05-Google+Drive+Preferences.png" width="320" /></a></div><h3 style="text-align: left;">Microsoft Office support</h3><p>Another improvement is better integration with Microsoft
Office. When you have an Office file open, such as a Word document, Drive for
desktop will notify you if the file was changed by somebody else. This helps to
prevent you from blowing away edits made by somebody else you have shared the
file with. However, if you are doing a lot of collaboration work, I recommend
using Google’s web-based office suite instead (Google Docs, Google Sheets, etc),
as it handles simultaneous, collaborative editing much more effectively.</p><p></p>
<p class="MsoNormal"></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNpYhXZAT-A4jc-iAxbzxSCsMMoy5khrdV9Y8v2XYjeyAgQH0hpFgCL4mvUvLq6xU924r7VUFbGnJgBlfSq2gRPmlP4ohk5gGSC224Ytnu-36n_u534yeu5qny1yV355eJCRIw1n23vd89/s335/office.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="262" data-original-width="335" height="250" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNpYhXZAT-A4jc-iAxbzxSCsMMoy5khrdV9Y8v2XYjeyAgQH0hpFgCL4mvUvLq6xU924r7VUFbGnJgBlfSq2gRPmlP4ohk5gGSC224Ytnu-36n_u534yeu5qny1yV355eJCRIw1n23vd89/s320/office.png" width="320" /></a></div><h3 style="text-align: left;">Backing up external drives <br /></h3><p>As with Backup and Sync, the new app makes it easy to back
up any external drives, like flash drives, that you plug into your computer.
Upon connecting a drive, a popup immediately appears asking if you want to back
the drive up or not. Unfortunately, unlike Backup and Sync, there is no option
to completely disable these notifications. <br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBj_00D6IQmynSqAJH6YhMuSlyu7OAZ9dxYUa0W13hHT0pqQfxQM0v6kgGFQUyFJYAWsQu72GA45T_lQdIIpc-CXuqQ1qfCwMy52NLHveXWpmxwlk6uIXqecnem4ujHTWsnRmZHCmnaXHK/s490/backup.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="244" data-original-width="490" height="159" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBj_00D6IQmynSqAJH6YhMuSlyu7OAZ9dxYUa0W13hHT0pqQfxQM0v6kgGFQUyFJYAWsQu72GA45T_lQdIIpc-CXuqQ1qfCwMy52NLHveXWpmxwlk6uIXqecnem4ujHTWsnRmZHCmnaXHK/s320/backup.png" width="320" /></a></div><p></p>
<h3 class="MsoNormal" style="text-align: left;">Location in File Explorer<br /></h3><p class="MsoNormal">An interesting change is where it puts the files in File
Explorer. With Backup and Sync, it simply stored the files in a folder at the
root of your user directory. Drive for desktop, however, takes the meaning of “drive”
quite literally: it stores the files in their own drive under “This PC”, as if
it were a flash drive or external hard drive. It assigns the drive to letter
“G” by default (for “Google” I presume), but it is possible to change the drive
letter in the settings. Every Google account you add gets its own drive with
its own letter. One feature I wish it offered was the ability to customize the
drive label, which defaults to “Google Drive” if you just have a single account
connected, or “<email address> - Google Drive” (truncated based on the max
character length of this field) if you have multiple accounts connected. You
can change the label yourself in File Explorer, but the change is not preserved
between reboots.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYKmUbHs2gAIrDV-ukb0wf07bWnmayzj2Zkl25qE8Dtbi0wfDjypp6Msy4LD-VcXRogWSWE1xJl_x-YS-QjktLdkNp3_XKie6yb5TLHLkHwyOjl-2QIpx1JIj6KFw-t32vGvDTrj0qJ8yI/s335/2021_08_24_10_36_40_This_PC.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="333" data-original-width="335" height="318" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYKmUbHs2gAIrDV-ukb0wf07bWnmayzj2Zkl25qE8Dtbi0wfDjypp6Msy4LD-VcXRogWSWE1xJl_x-YS-QjktLdkNp3_XKie6yb5TLHLkHwyOjl-2QIpx1JIj6KFw-t32vGvDTrj0qJ8yI/s320/2021_08_24_10_36_40_This_PC.png" width="320" /></a></div><p></p>
<h3 class="MsoNormal" style="text-align: left;">Summary <br /></h3><p class="MsoNormal">Overall, I would say the new app is an improvement over the
old one. Google has not forced Backup and Sync users to update yet, but you also cannot
download Backup and Sync anymore. The <a href="https://www.google.com/drive/download/">download page</a> only offers
Drive for desktop for download. <a href="https:/support.google.com/a/answer/10309431">See the full feature comparison listing</a>.<br /></p>
Michael Angstadthttp://www.blogger.com/profile/04809821580827426849noreply@blogger.com2tag:blogger.com,1999:blog-5682413770770674096.post-39180997885542937362021-01-12T13:24:00.002-05:002021-01-12T13:40:06.371-05:00TeamViewer Overview<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaqIHUGMvy36mUARyns3qg5sdVQbFSlGkrwbYhNff7UZ6skJXsdJ7R_aICy7SoUNjHVdhmfWRK-hSkKz61p2PGmBy972_dWEsUigbP4EBZSkx1Vjc-fTkEaMW8_t81eE6uKTXqSLMYKFgw/s512/TeamViewer_Logo_512x512.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="512" data-original-width="512" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaqIHUGMvy36mUARyns3qg5sdVQbFSlGkrwbYhNff7UZ6skJXsdJ7R_aICy7SoUNjHVdhmfWRK-hSkKz61p2PGmBy972_dWEsUigbP4EBZSkx1Vjc-fTkEaMW8_t81eE6uKTXqSLMYKFgw/w200-h200/TeamViewer_Logo_512x512.png" width="200" /></a></div><p>At the library where I work, we recently purchased a paid
TeamViewer license. This allows us to conduct remote computer classes and
provide socially distanced patron computer support during the pandemic. This
blog post contains some of the things I have learned about TeamViewer during
this process.</p>
<h1>What is it?</h1>
<p>TeamViewer is a remote access application which allows you
to view the screen of another computer over the internet, as well as control
the mouse cursor and keyboard. In this way, it is like Remote Desktop, but the
similarity ends there. TeamViewer is a "zero config" service, which means it does not require the complicated network setup that Remote Desktop
requires to be functional over the internet. To make this possible, all traffic
is routed over port 80 through TeamViewer’s servers. The data is protected with end-to-end encryption,
so nobody, not even the TeamViewer server admins, can eavesdrop on your
session.</p>
<p>Also unlike Remote Desktop, it does not interact with the
Windows login system. With Remote Desktop, you must supply the login credentials
of a Windows user account to initiate a connection. But with TeamViewer, you directly
see what is being displayed on the remote computer’s screen, as if you were
sitting in front of it. For example, if you logout of the current Windows user account
while using TeamViewer, you are shown the Windows login screen. Doing this
whist using Remote Desktop would cause your connection to be terminated.</p>
<p>Instead of using IP addresses to connect to remote computers,
TeamViewer assigns each computer a nine-digit, globally unique ID. This number
never changes, even if you uninstall and reinstall TeamViewer (which makes me
wonder if the ID is stored in the registry or if it is associated with your IP
or MAC address). It also gives you a random, 6-character password, which the
person connecting to your computer must know in order to connect. This password
changes every time you open TeamViewer, which prevents someone who connected to
you in the past from connecting again without your permission.</p>
<h1>License</h1>
<p>TeamViewer’s license states that you may use it for free so
long as you are only using it for personal use. What is "personal use" exactly?
If you’re using it to connect to a friend or family member’s home computer,
that’s considered personal use. The moment you use it to connect to a computer
at work or to a server, you are expected to purchase a license. If you don’t
have a paid license and TeamViewer’s algorithms think that you are using it
non-personal purposes, it will put a block on your computer’s ID, which
prevents you from initiating <b>and</b> receiving connections. How it makes
this determination, I don’t know. But if you think you have been wrongly
accused, there are ways to submit a request to have them unblock you. </p>
<p>One thing that is restrictive about the paid plans is that
it heavily limits how many computers can have active connections open at time. TeamViewer
calls these "channels". A channel is created when a computer initiates a
connection to one or more computers. For example, if Computer A remotes into Computer
B, that’s considered one channel. A single channel can include multiple
connections. For example, if Computer A remotes into Computers B, C, and D at
the same time, that’s still a single channel.</p>
<p>The least expensive paid plan only allows a maximum of one
channel. So, if you install TeamViewer on two computers, only one of those
computers can initiate remote connections at a time (both computers can still <b>receive
</b>incoming<b> </b>connections, it’s just that only one computer at a time can
create outgoing connections). If another computer associated with your license
has a channel open and you try to create a new channel by connecting to a
remote computer, you will get an error message that blocks you from doing so.</p>
<p>The more expensive plans allow you to add more channels, and
they come at a hefty price tag. We decided to purchase 1 additional channel,
which would have costed us an additional $778/year. But because the library is a non-profit organization, we were able to obtain a 60%
discount through TechSoup, which is a website that sells software at reduced
prices to non-profits.</p>
<h1>Variants of the software</h1>
<p>There are three different variants of the TeamViewer
software.</p>
<p><b>TeamViewer:</b> Listed at the top of the download page on
their website, this is the full-featured software application. With it, you can
both connect to other computers and have other computers connect to you.</p>
<p><b>TeamViewer QuickSupport:</b> This is a good choice for
when you want to do a one-off computer support session with someone who is
sitting at their computer. It allows other computers to connect to you, but does
not give you the ability to connect to other computers. One nice thing about
this application is that it does not actually install anything onto the
computer—it’s just an EXE file the user downloads and runs. With a paid
TeamViewer plan, you can customize the way the QuickSupport window looks, which
is useful for displaying your business’s logo and branding.</p>
<p><b>TeamViewer Host:</b> This is the best choice for when you
need remote access to computers that are under your control (as opposed to the
computers of random people on the internet). Like QuickSupport, it only allows incoming
connections. But unlike QuickSupport, it installs software onto the computer,
which automatically launches when Windows boots. If you’re installing this on a
server, you’ll want to enable unattended access by assigning it a password that
never changes.</p>
<h1>Other features</h1>
<p><b>Integrated voice/video chat:</b> Talk with the person on the other end directly through TeamViewer without needing to maintain a second line of communication (e.g. phone call or VoIP call). In my research, I have not been able to find any other
remote access software product that has this capability. The audio quality is fine,
and I’ve never had problems understanding people.</p>
<p><b>Clipboard syncing:</b> TeamViewer supports seamless copy
and paste between your local system and the remote computer. Not all remote
access software supports this.</p>
<p><b>File transfer:</b> There are several ways TeamViewer
allows you to copy files between computers. Note that the transfer speed is quite
slow (seems to be capped around 1 Mbps), so it’s not great for large files.</p>
<ul><li><b>File browser:</b> This is similar to an FTP client in that it allows you to browse the remote computer’s entire file system (or, at least, the folders that the remote user has access to) and download any files you want. You can also upload files to any location of your choosing.</li><li><b>File box:</b> Allows you to upload individual files to a drop box, which the person on the other end then downloads from the drop box.</li><li><b>Clipboard transfer: </b>Just like you can "copy and paste" files in File Explorer to make copies of file, you can do the same with TeamViewer to transfer a file to the remote computer.</li></ul>
<p><b>Multiple monitor support:</b> If the computer you are
connecting to has multiple monitors attached to it, TeamViewer allows you to
switch between them with ease or display them all at once.</p>
<h1>My Verdict</h1>
<p>My two main criticisms are the channel limits and price. I
feel that channel limits can be very restrictive when you are working in a team,
and the software seems expensive compared to alternatives.</p>
<p>But on the flipside, you definitely get what you pay for.
Think of TeamViewer as the iPhone of the remote desktop world. The service is reliable,
and the software is very easy to use. It was the only remote access software I
could find that had integrated voice chat, which is feature that we needed to have. The company is based in Germany, a country that is subject to strict
European privacy laws such as the GDPR, which is reassuring from a security and
privacy standpoint. Oh, and did I mention the user interface has a dark theme?
;-)</p>
<p>If you’re an IT technician that just needs remote access to
a handful of machines, there are other less expensive solutions out there. But for
everyone else, TeamViewer provides a reliable, user-friendly solution that
non-computer professionals can use with relative ease.</p>
Michael Angstadthttp://www.blogger.com/profile/04809821580827426849noreply@blogger.com0tag:blogger.com,1999:blog-5682413770770674096.post-31757205595600334112020-06-11T14:26:00.000-04:002020-06-11T14:26:23.025-04:00Black Lives Matter<br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEystDI8sIC-Fw824E6sTO8PD3OHWr4EC-0PwMrIlKkaii1DgMfk-PB3augA5Xacz2e0MStx3YSDVhkdf8_hLMVnj1mnW6r0UMQKWLThEpUYwAFgnZ8g9iuVlK8mnspB30sVBYzIMxB9fJ/s800/Black_Lives_Matter_logo.svg.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="800" data-original-width="800" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEystDI8sIC-Fw824E6sTO8PD3OHWr4EC-0PwMrIlKkaii1DgMfk-PB3augA5Xacz2e0MStx3YSDVhkdf8_hLMVnj1mnW6r0UMQKWLThEpUYwAFgnZ8g9iuVlK8mnspB30sVBYzIMxB9fJ/w200-h200/Black_Lives_Matter_logo.svg.png" width="200" /></a></div>Michael Angstadthttp://www.blogger.com/profile/04809821580827426849noreply@blogger.com0tag:blogger.com,1999:blog-5682413770770674096.post-77032461774651472162020-05-27T16:24:00.000-04:002020-05-27T17:00:56.238-04:008 Tips for using Excel as a drawing tool<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWlQ_8yFC9N92TRjcx8Ec2Xrq0mEdAp7HNWJ7lC4MGLey2P05TtDuK5pu5KKK8Pu1iYCHac2N8hGzSMq7MBVXRIsYLW8booEfkOVifsb-IxOL0Sdlz8fP_IJaSzC0Z48HqKGd5cYVSIFeF/" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="119" data-original-width="128" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWlQ_8yFC9N92TRjcx8Ec2Xrq0mEdAp7HNWJ7lC4MGLey2P05TtDuK5pu5KKK8Pu1iYCHac2N8hGzSMq7MBVXRIsYLW8booEfkOVifsb-IxOL0Sdlz8fP_IJaSzC0Z48HqKGd5cYVSIFeF/" /></a></div>Over the past several months, I have been playing a factory-building game called <a href="https://www.satisfactorygame.com/" target="_blank">Satisfactory</a>. The game involves a lot of number crunching for calculating the input and output rates of the machines. You also have to think about how to optimally arrange the machines and conveyor belts in physical space on the factory floor. Because of this, I've found it to be much easier to design my factories outside of the game so that my in-game time can be spent actually building them!<br /><br /><div>I had decided to use Microsoft Excel to create these factory designs
since I was already familiar with Microsoft Office's shape drawing and
image editing tools. For the past ten months, I've been sharing many of my designs with the community via <a href="https://www.reddit.com/user/oldshavingfoam/posts/" target="_blank">Reddit</a> and <a href="http://bit.ly/satisfactory-floor-plans" target="_blank">Google Drive</a> (I've built up a bit of a reputation for being the "floor plan guy"). I've become quite adept at using Excel for this purpose, so I thought I would share some of the things I've learned.</div><div><br /></div><h1 style="text-align: left;">1. Snap to Grid</h1>The "Snap to Grid" setting is crucial for helping to keep your shapes aligned with the worksheet grid lines.<br /><br /><div>To toggle it, go to: [ Page Layout tab > Arrange group > Align button > Snap to Grid]</div><div><br /></div><h1 style="text-align: left;">2. Select Objects</h1>The Select Objects tool allows you to select multiple objects by clicking and dragging to draw a selection box. Any object that is fully inside of the selection box will be selected. Objects that are only <i>partially </i>inside the box will <i>not </i>be selected. While this tool is activated, only <b>objects </b>can be selected--the cells inside of the actual spreadsheet cannot be selected.<br /><br /><div>To toggle it, go to: [ Home tab > Editing group > Find and Select button > Select Objects ]</div><div><br /></div><h1 style="text-align: left;">3. Quick Access Toolbar</h1><div>Located in the upper-left corner of the window, the Quick Access Toolbar serves as a holding place for your personal collection of favorite commands. Any button that's on the ribbon can be added to this toolbar. I've added buttons for "Snap to Grid" and "Select Objects" because I use these commands so much.</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwiJDkNm9NLjCdB5pQgrTUbFZAAnIOSwDBqN2Co5gGxDXySaKtCqclYY8S5ksEi7aOLrbQNYElFSk1T6ING87ma9aOJLI1OMF8gv8uCk_UjMJITDhoTVZGBP2cv5dljEmZEIRyd_pGJcb5/" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="49" data-original-width="478" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwiJDkNm9NLjCdB5pQgrTUbFZAAnIOSwDBqN2Co5gGxDXySaKtCqclYY8S5ksEi7aOLrbQNYElFSk1T6ING87ma9aOJLI1OMF8gv8uCk_UjMJITDhoTVZGBP2cv5dljEmZEIRyd_pGJcb5/s320/quick-access-toolbar.png" width="320" /></a></div><div><br /></div><div>To customize the Quick Access Toolbar, click on the arrow on the right side of the toolbar and click "More Commands".</div><div><br /></div><h1 style="text-align: left;">4. Grouping</h1>Sometimes, you need to create multiple objects to achieve a specific goal. For example, to create the "clipboard" graphic pictured below, I needed:<br /><ul style="text-align: left;"><li>An image for the "board" part of the clipboard</li><li>An image for the "clip" part of the clipboard</li><li>An image for the pencil</li><li>A textbox for the paper</li></ul><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIPQmtcBBNq_GOFchc-HqTrvYUHJNP0X-be6lHEVtziBolI2G-tdfo5pAdlq7Ym7JBZgl39mutxBiYK2TeFY6FFI4wh9nc4IEU5q_KRPGPByXIu2a7XDUFdxt-D-2uWzF_apDTom4p0Mmb/" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="713" data-original-width="500" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIPQmtcBBNq_GOFchc-HqTrvYUHJNP0X-be6lHEVtziBolI2G-tdfo5pAdlq7Ym7JBZgl39mutxBiYK2TeFY6FFI4wh9nc4IEU5q_KRPGPByXIu2a7XDUFdxt-D-2uWzF_apDTom4p0Mmb/s320/clipboard.png" /></a></div><div><br /></div>To help manage complex collections of objects like this, you can <b>group </b>them together. Grouping allows multiple objects to be treated as a single object, allowing you to move and resize them as a whole. Even though they are grouped, you can still manipulate each individual "sub" object by clicking on them to select them.<br /><br /><div>To group a collection of objects, select them all by holding down the Shift key and clicking on each object (or by using the Select Objects tool, described above). Then, go to: [ Page Layout tab > Arrange group > Group button > Group ]. They can be ungrouped by selecting "Ungroup" from the same menu.</div><div><br /></div><h1 style="text-align: left;">5. Nudging objects with the arrow keys</h1><div>It can be difficult to precisely position an object using just the mouse. The arrow keys on the keyboard can be used to "nudge" an object in a particular direction. Tapping an arrow key will move the object one pixel at a time. Or, if Snap to Grid is enabled, the object will move one column/row at a time.</div><div><br /></div><h1 style="text-align: left;">6. Zoom level issues<br /></h1>My experience has been that the sizes and positions of objects change slightly when you adjust the zoom level. To keep everything precise, I find it helpful to only move and resize objects at a specific zoom level. The zoom level that I work at is 100%.<br /><br /><div>It's also useful to note that the way Excel renders text can change when you adjust the zoom level. For example, you may have a textbox that wraps in a certain way at one zoom level, and then wraps differently at another zoom level. For example, the images below show the same textbox at two different zoom levels. Notice how the word wrapping changes starting with line 3.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinzSYptKZASlS392b-XwvYDXiWO7wgYrVKWKOVZ65zzVmbjmuUDxWtBNaZVVZUZjpRw3wUD27a0awCFTey86HLHR_4GuCe-1RgfzRUyZXrKtrjPSxTKYBmmLY8g2sEp7psvAqpNX7W2uOC/" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="506" data-original-width="632" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinzSYptKZASlS392b-XwvYDXiWO7wgYrVKWKOVZ65zzVmbjmuUDxWtBNaZVVZUZjpRw3wUD27a0awCFTey86HLHR_4GuCe-1RgfzRUyZXrKtrjPSxTKYBmmLY8g2sEp7psvAqpNX7W2uOC/w400-h320/textbox-zoom.png" width="400" /></a></div><div><br /></div><div><br /></div><div>To adjust the zoom level, use the slider in the bottom-right corner of the window or roll the mouse scroll wheel while holding Ctrl.</div><div><br /></div><h1 style="text-align: left;">7. Paste as image</h1><div>When an object, or group of objects, is copied to the clipboard, Excel will automatically generate a paste-able image when you paste into any image editing program, such as Photoshop or Paint. It even takes transparency into account! For example, if you copy a textbox that has a drop shadow, the drop shadow will render as semi-transparent pixels. This is useful for generating images out of the objects you've created in Excel (as I have done with my factory floor plans).</div><div><br /></div><h1 style="text-align: left;">8. Image quality settings<br /></h1>By default, when you save an Excel file, Excel compresses all images to reduce the size of the file. For example, if you've inserted an image that's 800 pixels wide, and then resized it to be 400 pixels wide, Excel will down-sample the image to 400 pixels. The downside to this is that, if you later decide to make the image larger, it will look distorted because you've lost the original, 800 pixel version of the image.<br /><br />To force Excel to preserve the original quality of all images, follow the steps below. These settings are applied only to the spreadsheet file you <b>currently have open</b> (they are not global). And if your spreadsheet already has images in it, you'll have to re-insert them to restore their original sizes.<br /><ol style="text-align: left;"><li>Go to [ File > Options > Advanced ].</li><li>Scroll down to the "Image Size and Quality" section.</li><li>Click the "Do not compress images in file" checkbox.</li><li>Change "Default resolution" to "High fidelity".</li></ol><div><br /></div><div><h1 style="text-align: left;">Conclusion<br /></h1></div>I hope that my list of tips help you to "excel" at Excel! Happy spreadsheeting!<br />Michael Angstadthttp://www.blogger.com/profile/04809821580827426849noreply@blogger.com0tag:blogger.com,1999:blog-5682413770770674096.post-55308150121878415902020-04-12T22:01:00.000-04:002020-04-13T11:42:32.623-04:00Fixing Swing's JOptionPane classI maintain a handful of client-side Java programs that use Java's older GUI API called Swing. One thing that I have found awkward about Swing is the way dialog boxes are handled.<br />
<br />
Swing provides a class called JOptionPane for creating simple dialog boxes. It alleviates the need to manually code your own, which saves a lot of time. All you have to do it make a single method call and your dialog appears.<br />
<br />
While the class works just fine, some of its methods have up to eight parameters. When a method has more than three or four parameters, it makes it hard for someone who is not already familiar with the API to tell what the code does at a glance.<br />
<br />
For example, the code below has a total of eight parameters. Unless you are already familiar with this method's signature, you probably don't have a clue as to what half of these parameters do.<br />
<pre class="brush:java">int choice = JOptionPane.showOptionDialog(
this,
"The password you have chosen may not be secure.\n\n" +
"Please keep the following guidelines in mind:\n\n" +
"1. Eight or more characters long.\n" +
"2. Is not a word from the dictionary." +
"3. Completely different from all your other passwords.\n\n" +
"Would you like to create a better password or continue?",
"Security warning",
JOptionPane.YES_NO_OPTION,
JOptionPane.WARNING_MESSAGE,
null,
new Object[]{"Pick a new password", "Continue"},
"Pick a new password"
);</pre>
One thing you could do to make the code more readable is assign each parameter to a variable with a descriptive name. This allows a programmer who is not familiar with the method to see at a glance what each parameter is for.<br />
<pre class="brush:java">Component parentWindow = this;
String text =
"The password you have chosen may not be secure.\n\n" +
"Please keep the following guidelines in mind:\n\n" +
"1. Eight or more characters long.\n" +
"2. Is not a word from the dictionary." +
"3. Completely different from all your other passwords.\n\n" +
"Would you like to create a better password or continue?";
String title = "Security warning";
int buttons = JOptionPane.YES_NO_OPTION;
int messageType = JOptionPane.WARNING_MESSAGE
Icon icon = null;
Object[] buttonLabels = new Object[]{"Pick a new password", "Continue"}
Object defaultButton = "Pick a new password";
int choice = JOptionPane.showOptionDialog(parentWindow, text, title, buttons, messageType, icon, buttonLabels, defaultButton);</pre>
However, there are still a some problems with this:<br />
<ol>
<li><b>Variable name conflicts:</b> The variable names could be confused
with other variable names in the same scope. For instance, the name
"text" is fairly generic, so it's not unlikely that another variable a
dozen or so lines down could have the same name.<b> </b></li>
<li><b>Parameters are ordered:</b> It is very easy for the programmer to get the parameter order wrong without the compiler noticing. For example, if the "buttons" and "messageType" variables were swapped, the compiler wouldn't notice. The programmer likely wouldn't notice either because they are next to each other in the method signature.</li>
<li><b>Null parameters:</b> One of the parameters is null. The code would be more concise if we could just leave it out, but the JOptionPane class does not provide an appropriate method signature for that.</li>
<li><b>Misleading code formatting (1): </b>The way the message text string is formatted in the code makes it look like each line will end with a single line break. However, some lines end in two line breaks. </li>
<li><b>Misleading code formatting (2):</b> Each line of the message appears on its own line in the code. This makes it much easier to read! However, you may not have noticed that the fourth line is missing a line break. Because of the way the code is formatted, an error like this can easily be overlooked.</li>
<li><b>Neglecting native system settings:</b> The code may not be using the native system's preferred line break sequence. Appending "System.lineSeparator()" (or even a concisely-named "newline" variable) onto each line would be technically correct, but it would make the code less consice.</li>
<li><b>Duplicate data:</b> One of the button labels is duplicated. </li>
<li><b>Ambiguous types:</b> Defining button labels as Objects will lead to problems only detectable at runtime if an Object that JOptionPane does not accept is passed into the method (also, it's just weird!).</li>
</ol>
To resolve these issues, I designed a class that acts as a fluent wrapper around JOptionPane. Using this wrapper class, the above code would look like this:<br />
<pre class="brush:java">int choice = DialogBuilder.warning()
.parent(this)
.title("Security warning")
.text(
"The password you have chosen may not be secure.",
"",
"Please keep the following guidelines in mind:",
"",
"1. Eight or more characters long.",
"2. Is not a word from the dictionary.",
"3. Completely different from all your other passwords.",
"",
"Would you like to create a better password or continue?")
.buttons(JOptionPane.YES_NO_OPTION, "*Pick a new password", "Continue")
.show();</pre>
The above problems are addressed as follows:<br />
<ol>
<li><b>Variable name conflicts:</b> No variables are needed because the method name provides context. <b><br /></b></li>
<li><b>Parameters are ordered:</b> Each parameter is replaced by a method call. Methods can be called in any order.</li>
<li><b>Null parameters: </b>The class internally provides a default value for every optional parameter. The method call for this null parameter can be left out, making the code more concise.</li>
<li><b>Misleading code formatting (1): </b>The "text()" method takes a single vararg parameter, where each parameter is a line of text. If a line ends in two line breaks, an empty string is provided, making it clearer that an empty line will appear on the dialog box.</li>
<li><b>Misleading code formatting (2): </b>Line breaks are automatically added by the "text()" method.</li>
<li><b>Neglecting native system settings: </b>The "text()" method uses the native system's preferred line break sequence.</li>
<li><b>Duplicate data:</b> The default button is identified by an asterisk character, which is removed when the button label is passed into the JOptionPane class. This is not as obvious as I would like it to be, as it requires detailed reading of the Javadocs, but it is very concise.</li>
<li><b>Ambiguous types: </b>The button labels are defined as Strings in the "buttons()" method, not Objects. This means the compiler can prevent invalid objects from being passed in. </li>
</ol>
The full class can be viewed here: <a href="https://github.com/mangstadt/emc-shopkeeper/blob/master/src/main/java/emcshop/gui/DialogBuilder.java">https://github.com/mangstadt/emc-shopkeeper/blob/master/src/main/java/emcshop/gui/DialogBuilder.java</a>Michael Angstadthttp://www.blogger.com/profile/04809821580827426849noreply@blogger.com0tag:blogger.com,1999:blog-5682413770770674096.post-77169003686757786872020-03-26T11:14:00.000-04:002020-03-28T09:22:49.497-04:00Renewing my CompTIA A+ certification<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI7Ml75KR2Hev5UijpVb-_L1y5XLnTlcKyrbPCXTlhCdKVBCaPL20K2E6-0EkQR_REMPh1DeU7jS631JsbMoJnmaLN5cxUmRUsOH6gk6gc3z6fReZW2920ovdhzMOR428khmJfwqlELXmD/s1600/Untitled.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="358" data-original-width="420" height="170" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI7Ml75KR2Hev5UijpVb-_L1y5XLnTlcKyrbPCXTlhCdKVBCaPL20K2E6-0EkQR_REMPh1DeU7jS631JsbMoJnmaLN5cxUmRUsOH6gk6gc3z6fReZW2920ovdhzMOR428khmJfwqlELXmD/s200/Untitled.png" width="200" /></a></div>
CompTIA is an organization that administers certification exams for IT professionals. I took and passed their entry-level exam, CompTIA A+, three years ago. The exam tests your knowledge of broad IT-related topics, such as internal hardware, cabling, troubleshooting, operating systems, and much much (MUCH) more.<br />
<br />
I wrote a <a href="https://mangstacular.blogspot.com/2017/" target="_blank">handful of blog posts</a> about some of these topics while I was studying for the exam if you want to get a feel for what they test you on. You can also get the exam objects from <a href="https://www.comptia.org/certifications/a" target="_blank">their website</a> (the form asks your for your email, but you don't have to give a real one).<br />
<br />
Having to pay over $400 to take a test (actually, it's two separate tests) that I might fail was stressful to me, so I'm glad that I passed it! The exam expires after three years, so since I took it three years ago, I needed to renew it. There are several ways they allow you to renew your certification. I chose to enroll in their CertMaster CE training course, which renews your certification instantly upon completion. It's all done online and costs $129.<br />
<br />
The way it works is you read through the content it gives you, which is organized based on the exam objectives of the exam you are renewing. At the end of each section, it gives you a 20-30 question multiple choice quiz. When you complete the quiz, it shows you which questions you got wrong, but doesn't tell you the right answer. You can "reset the assessment", which resets the quiz and lets you take it again.<br />
<br />
You can give it a date for when you want to complete the training by, and it will recommend to you how much content ("knowledge points") you have to study each day in order to finish by that date. As you progress through each section, you earn knowledge points. It tells you how many knowledge points are in each section so you can get a feel for how long a section is.<br />
<br />
It also has various "achievements" that you can earn to help motivate you. For example, there's one for getting 100% on a quiz and one for getting twenty consecutive questions correct. My left-brain found some of them to be a little patronizing (for example, resetting a quiz gives you an achievement), but it was nice to have that extra bit of encouragement.<br />
<br />
I found the user interface of this web app to be very clean and intuitive. It is also very responsive, which leads me to believe that it's heavily JavaScript-based and doing a lot of caching in the background. For example, going back and forth between the pages in a lesson is instantaneous, as is flipping through the questions in a quiz.<br />
<br />
I also loved the graphics they provided for showing what the different cable connectors look like (VGA, DisplayPort, USB, etc). They all have a consistent aesthetic to them, which made the learning process that much easier. I would post one here as an example, but I don't want to violate any copyrights.<br />
<br />
In order to renew your certification, you have to get a 100% on each quiz. Once you do that, your certification is automatically renewed. You literally don't have to do anything else. I got an email no more than a day or two after I completed all the quizzes saying that my certification was renewed. My new expiration date was based upon my current expiration date, not the date I completed the CertMaster training. I appreciate that because I completed the training several months early!Michael Angstadthttp://www.blogger.com/profile/04809821580827426849noreply@blogger.com0tag:blogger.com,1999:blog-5682413770770674096.post-12935003623359447302020-03-24T10:12:00.001-04:002020-03-28T09:23:01.046-04:00Workaround implemented for file timestamp issueA few months ago, I wrote a <a href="https://mangstacular.blogspot.com/2020/01/date-modified-timestamp-problems-on.html" target="_blank">blog post</a> about a problem related to the date modified timestamp on a database file not updating immediately after the file was modified. This was causing a problem with an application I wrote that relied on this timestamp to update the data it displayed on the screen to the end user. It would take around ten seconds for the timestamp to update, which meant that the user had to wait that amount of time before the most recent information was displayed to them.<br />
<br />
While I did discover a clue as to why this was happening to some files and not others, I wasn't able to fix the core issue itself--the delayed updating of the date modified timestamp. However, I implemented a workaround that not only solved the problem of the end user getting delayed updates, but also improved the integrity of the file (an Access database file).<br />
<br />
The workaround involved creating a lock file whenever a user writes to the database. When the user is done writing to the database, the application deletes the lock file. The application monitors for this file deletion event and refreshes itself whenever a deletion is detected. There are no delays in the file system reporting when a file is deleted, which means the user's screen updates instantaneously whenever the database is updated.<br />
<br />
I also use the lock file to improve the integrity of the database file. If the user tries to write to the database, but the application detects the presence of the lock file, it means another user is currently writing to the database. If this happens, the application waits until the lock file is deleted before creating its own lock file and executing its own writes. This prevents multiple users from writing to the database simultaneously and potentially corrupting the database.<br />
<br />
There is a second kind of lock file which the application also makes use of. If the file is opened in Microsoft Access, Access creates its own lock file. My application monitors for the presence of this lock file. If the user tries to write to the database while the Access lock file exists, the application cancels the write operation and displays an error message. The error message informs the user that the database is open in Access and that it cannot write to the database while Access is open. This also helps to prevent file corruption.<br />
<br />
Similarly to the lock file that the application creates when the user writes to the database, the application uses the Access lock file to detect changes to the database. When the Access lock file is deleted, it not only means that Access has been closed, but that changes could have been made to the database while it was open. So, when this lock file is deleted, the application refreshes itself and updates the on-screen information for the end user.<br />
<br />
This workaround has been in production for 1-2 months and has been working quite well.Michael Angstadthttp://www.blogger.com/profile/04809821580827426849noreply@blogger.com0tag:blogger.com,1999:blog-5682413770770674096.post-20630694864158571602020-01-22T21:05:00.000-05:002020-01-23T20:48:54.262-05:00PHP, XML, and character encodingsThe library where I work subscribes to an online service that keeps track of the library's ongoing public events. We link to it from our website so that patrons can discover the various programs the library has to offer.<br />
<br />
I wrote a WordPress plugin that posts a listing of these events on the library's events page using the RSS feed the service provides. I just noticed today that a few of the event titles had empty, square boxes in them. When you see this, it usually means there is a character encoding problem, which means that it does not recognize a particular letter or symbol.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8mUSjm9IGoSChV4ardU52wMTmbtfNR9lYfZdOlTZNeHOl8z2DHAoGr_IekA3UX021KOralIswIEdDgfc2Q3c3-Jn3hnGi5tumxZ6tmcP_eoMYHuwGvQUKduBzOUy4NmXqCRmTdC7CbFR2/s1600/before.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="57" data-original-width="652" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8mUSjm9IGoSChV4ardU52wMTmbtfNR9lYfZdOlTZNeHOl8z2DHAoGr_IekA3UX021KOralIswIEdDgfc2Q3c3-Jn3hnGi5tumxZ6tmcP_eoMYHuwGvQUKduBzOUy4NmXqCRmTdC7CbFR2/s400/before.png" width="400" /></a></div>
<br />
To make page loads more performant, my plugin caches the RSS file it downloads so that it does not have to query the event service every time someone loads the events page on the website. I opened the cached RSS file to see what might be causing the problem. The event in question had <a href="https://www.computerhope.com/jargon/c/curlyquote.htm" target="_blank">curly quotes</a> (also called smart quotes) in its title. My experience has been that curly quotes frequently cause problems when people try to use them on websites, so I wasn't surprised to see this.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiT3ZftS6KGFwIXFKq_HBS1ciJBLUxcw41cCtHvv9gl4MD0HdN6Q1WNlX1iMAEgIjK_2jI1NhwcDSEhv_2x0wtosstTPPG1ZOvh3L6WJVTYdgtgJi6WisfSoe8cz6JzWargHyiJEdZHBG9V/s1600/curly-quotes-computerhope.org.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="359" data-original-width="602" height="235" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiT3ZftS6KGFwIXFKq_HBS1ciJBLUxcw41cCtHvv9gl4MD0HdN6Q1WNlX1iMAEgIjK_2jI1NhwcDSEhv_2x0wtosstTPPG1ZOvh3L6WJVTYdgtgJi6WisfSoe8cz6JzWargHyiJEdZHBG9V/s400/curly-quotes-computerhope.org.png" width="400" /></a></div>
<br />
<div style="text-align: center;">
<i>(table from <a href="https://www.computerhope.com/jargon/c/curlyquote.htm" target="_blank">computerhope.org</a>)</i></div>
<br />
You can't type a curly quote on the keyboard. At least, not directly. In my experience, they usually appear when someone copies and pastes something from Microsoft Word because Word will automatically insert them into your document as you're typing to make your document look more aesthetically pleasing.<br />
<br />
It turned out that the problem was with the RSS data's character encoding. An RSS file is just XML, and every XML file has an "encoding" attribute at the top.<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;"><?xml version="1.0" encoding="UTF-8" ?></span><br />
<br />
This tells the program that parses the XML what kind of character set the XML data uses so that all of its content will remain intact after being parsed. If this attribute does not reflect the character set that was actually used to create the XML file, the data may not be parsed correctly, and you may end up with "empty boxes" like the ones I was getting.<br />
<br />
When I changed this encoding attribute to "UTF-8" (a widely used character encoding that supports many different languages), the empty boxes went away, and the curly quotes correctly appeared.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUSgxHihH-rSQla4TwuwauHjq-x7UHBDkdmAFRVmnfMa81W276tWaTldMM-tY3vzOItc4FLQLOdsBfhbY0_sTFBzg2npQ_-J8VeqK7Jg70TyIsGsGDdxok-in9h18vFL224YWNl22lSnTX/s1600/after.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="55" data-original-width="534" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUSgxHihH-rSQla4TwuwauHjq-x7UHBDkdmAFRVmnfMa81W276tWaTldMM-tY3vzOItc4FLQLOdsBfhbY0_sTFBzg2npQ_-J8VeqK7Jg70TyIsGsGDdxok-in9h18vFL224YWNl22lSnTX/s400/after.png" width="400" /></a></div>
<br />
To prevent this from happening in the future, I modified my WordPress plugin to change the RSS feed's character encoding right before it is saved to the cache. Doing a simple <a href="http://php.net/str_replace" target="_blank">str_replace</a> function call seemed to do the trick. I thought I might have to use the <a href="http://php.net/mb_convert_encoding" target="_blank">mb_convert_encoding</a> function to do a thorough conversion of the entire file, but this did not appear to be necessary.Michael Angstadthttp://www.blogger.com/profile/04809821580827426849noreply@blogger.com0tag:blogger.com,1999:blog-5682413770770674096.post-86205785954630357212020-01-20T21:41:00.000-05:002020-01-20T21:44:30.066-05:00Date modified timestamp problems on a Linux SMB share<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFUFqHSi6IjxmRdGZZF5fHKE3FtWro3SBfd5E2JE9CNb9CKHOP5ERdqVq_jM_HWlvGkqDpONDE0R6uzmJlRpKe5bto4zgUupGIgJ9tGxNukI2Qc896qR2QUXGK8XX_qGAXuus8Duq1Vzp3/s1600/clock.JPG" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="600" data-original-width="600" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFUFqHSi6IjxmRdGZZF5fHKE3FtWro3SBfd5E2JE9CNb9CKHOP5ERdqVq_jM_HWlvGkqDpONDE0R6uzmJlRpKe5bto4zgUupGIgJ9tGxNukI2Qc896qR2QUXGK8XX_qGAXuus8Duq1Vzp3/s200/clock.JPG" width="200" /></a></div>
I discovered an annoying issue recently related to our switch from a Windows-based file server to a Linux-based one.<br />
<br />
The computer lab in the library where I work uses an Access database to record registration information of students who sign up for the adult computer classes that the lab runs. Several years ago, I wrote a Java Swing application that sits on top of this database to make the registration process faster and easier. I've gotten many complements about it, and it's been working well over the years with few hiccups.<br />
<br />
The database file is hosted on a dedicated server that I administer, which the lab uses for file storage. This means that multiple people could be accessing the database on different computers at the same time. The app must consider the possibility of another user on another machine updating the database while the app is open. To do this, I designed the app to monitor the database file for changes. When a change occurs, it reloads the information from the database so that the user always sees the most recent information on the screen.<br />
<br />
About a year ago, I started researching a replacement for our file server. It was over 5 years old and out of warranty, and its version of Windows (Windows Server 2008) was fast approaching end-of-life. Because we mainly used it for file storage, I recommended we get a Linux-based NAS device because they are cheaper than a full-blown Windows server.<br />
<br />
The two major competitors in the NAS space are QNAP and Synology. I decided to go with QNAP because they offered a model that came with more RAM and an HDMI port (most NAS devices do not come with any video ports). My reasoning was that the HDMI port would allow me to administer the device just like a normal server if the network ever went down.<br />
<br />
The library purchased it a few months ago, and I deployed it last week. It has been working well so far, but one hiccup I've encountered is that, ever since I deployed it, the class registration app I wrote has been slow to detect updates to the database file. Like, really slow. About 10 seconds slow.<br />
<br />
I ran some tests and found that when my app updated the database, the "date modified" timestamp of the database file was slow to update. This was why my app was taking so long to detect any changes to it. But when I wrote a test program that just saved some content to a text file on the file server, the text file's timestamp would update immediately. Why, then, was the Access file behaving differently?<br />
<br />
I thought that maybe the open-source library my app uses to interface with the Access database, called "Jackcess", was doing something different under the hood. I started a thread on their support forum and learned that they use Java's "RandomAccessFile" class to write to the database. This class allows you to update small sections of a file individually instead of re-writing an entire file from scratch, which is how most computer programs deal with updating files.<br />
<br />
So, it looks like the culprit here is the new Linux-based NAS server. It seems to handle these kind of file updates differently than the old Windows server did. The simplest workaround I can think of would be to create some kind of dummy file and monitor that for changes instead of the database. The app would then update the dummy file whenever it makes a change to the database, which would cause the dummy file's "date modified" timestamp to update, signaling to other computers on the network that the database was just changed. That should hopefully get things back to normal!Michael Angstadthttp://www.blogger.com/profile/04809821580827426849noreply@blogger.com0tag:blogger.com,1999:blog-5682413770770674096.post-33332149255689550652019-06-03T20:25:00.002-04:002019-06-03T20:25:58.122-04:00Windows Tips 'n TricksI stumbled upon a <a href="https://www.reddit.com/r/sysadmin/comments/bty2qv/how_to_trigger_your_impostor_syndrome/">thread on the r/sysadmin board</a> with tons of great Windows tips. Here is a list of the ones I found the most interesting:<br /><br /><b>File Explorer to cmd</b><br />Open File Explorer and navigate to any directory. Click into the address bar, type "cmd", and press Enter. A command prompt window will open at that location (<a href="https://www.reddit.com/r/sysadmin/comments/bty2qv/how_to_trigger_your_impostor_syndrome/ep4lv5c">source</a>).<br /><br /><b>cmd to File Explorer</b><br />Conversely, open a command prompt window and type "start .". A File Explorer window will open to whatever your current directory is (<a href="https://www.reddit.com/r/sysadmin/comments/bty2qv/how_to_trigger_your_impostor_syndrome/ep4qc7b">source</a>).<br /><br /><b>cmd and F7</b><br />Press F7 at a command prompt to display a selectable command history. It doesn't work well for really long commands, but for shorter ones it works great (<a href="https://www.reddit.com/r/sysadmin/comments/bty2qv/how_to_trigger_your_impostor_syndrome/ep6kgkc">source</a>).<br />
<br />
<br />
<img alt="" height="185" src="data:image/png;base64,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" width="320" /><br /><br /><b>Copy as path</b><br />In File Explorer, hold Shift while right-clicking a file. This makes a "Copy as path" option available on the context menu. Clicking this will copy the file's absolute path to the clipboard (<a href="https://www.reddit.com/r/sysadmin/comments/bty2qv/how_to_trigger_your_impostor_syndrome/ep4j8en">source</a>).<br /><br /><b>Copy text in dialog boxes</b><br />It is possible to copy the text in a dialog box, even if you can't highlight it! This is great for extracting error messages so you can Google them. Simply click on the dialog box to make sure it has focus, then press Ctrl+C. In my testing, this didn't work with Microsoft Office dialog boxes, so it may not work everywhere (<a href="https://www.reddit.com/r/sysadmin/comments/bty2qv/how_to_trigger_your_impostor_syndrome/ep4wwvi">source</a>).<br />
<br />
For example, below is the pasted content from a Notepad dialog box. <br />
<blockquote class="tr_bq">
<span style="font-family: "Courier New", Courier, monospace;">[Window Title]<br />Notepad<br /><br />[Main Instruction]<br />Do you want to save changes to Untitled?<br /><br />[Save] [Don't Save] [Cancel]</span></blockquote>
<b>Screenshots of windows</b><br />
If you're not using any third-party screenshot tools, pressing Alt+PrtScn copies a screenshot of the currently active window to the clipboard. No more having to crop full-screen screenshots with Paint (<a href="https://www.reddit.com/r/sysadmin/comments/bty2qv/how_to_trigger_your_impostor_syndrome/ep57v30">source</a>)!<br />
<br />
And here are a couple tips of my own:<br /><br /><b>Desktop keyboard shortcuts</b><br />It's possible to assign keyboard shortcuts to desktop icons. Right-click on the icon and click "Properties". Click into the "Shortcut key" field and type a letter. The shortcut will now be Ctrl+Alt+whatever letter you typed. <br />
<br />
<b><img alt="" height="320" src="data:image/png;base64,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" width="237" /> </b><br />
<br />
<b>Show Desktop</b><br />
I use this one all the time. Pressing Win+D hides all of your windows so you can see the desktop. Useful!<b> </b><br />
<br />
<b>Emoji keyboard</b><br />Last but not least: While inside a textbox, pressing Win+. (Windows key + period key) to open an emoji keyboard.<br />
<br />
<img alt="" height="200" src="data:image/png;base64,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" width="198" /> Michael Angstadthttp://www.blogger.com/profile/04809821580827426849noreply@blogger.com0tag:blogger.com,1999:blog-5682413770770674096.post-66132504334242041322019-04-18T18:33:00.001-04:002019-04-18T18:33:49.594-04:00Windows Server Backup: Vague "I/O device error" messageAt my workplace, I administer a Windows Server 2008 RC2 web server that makes daily backups to an external hard drive using Windows Server Backup. The backups have been consistently failing recently, and I've found out why.<br />
<br />
Even though the backups were not finishing successfully, Windows Server Backup labeled the backups as “Completed with warnings” because it was able to successfully backup some of the data before failing. The backups would always fail at the same point: after backing up approximately 12 GB of data. The failures were intermittent at first, but became more consistent over time to the point where they were happening every night.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvliEZlPJdwC4TFqmqC9iDuQHFCrl8US8KKyjHLSrqolN5tfTYcWO9f6R2UiXsLj1cARNmnGv3x0amk5b0VaksPzIX6wF85OE_AZKA-3vDryGLk9IfPcQ2YtRoT6ruXMtYIQdJ9e4iFk_r/s1600/pic1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="604" data-original-width="468" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvliEZlPJdwC4TFqmqC9iDuQHFCrl8US8KKyjHLSrqolN5tfTYcWO9f6R2UiXsLj1cARNmnGv3x0amk5b0VaksPzIX6wF85OE_AZKA-3vDryGLk9IfPcQ2YtRoT6ruXMtYIQdJ9e4iFk_r/s320/pic1.png" width="247" /></a></div>
<h2>
Error message</h2>
The error message Windows Server Backup was giving me was very vague:<br />
<blockquote class="tr_bq">
<i>"The operation failed due to a device error encountered with either the source or destination. Detailed error: The request could not be performed because of an I/O device error."</i></blockquote>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOYYh771jfkWKBFH1YCvRfvO3fBhXvr-E7CMT7FZupzhaHy27L-GiV695BoR6679Prju6DwnQSgc9aTCwCjaISII-_Yd05qMoMU9MtOs9YXRuVmdmHX87eByjZCJmrFDTtBxQ6SqmKtC75/s1600/pic2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="506" data-original-width="800" height="202" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOYYh771jfkWKBFH1YCvRfvO3fBhXvr-E7CMT7FZupzhaHy27L-GiV695BoR6679Prju6DwnQSgc9aTCwCjaISII-_Yd05qMoMU9MtOs9YXRuVmdmHX87eByjZCJmrFDTtBxQ6SqmKtC75/s320/pic2.png" width="320" /></a></div>
<br />
The error message in the event logs was equally vague:<br />
<blockquote class="tr_bq">
<i>“The backup operation that started at <time> has completed with errors. Please review the event details for a solution, and then rerun the backup operation once the issue is resolved.”</time></i></blockquote>
(Contrary to the message’s suggestion, I could not find anything useful in the event details.)<br />
<h2>
Bad sector?</h2>
Many websites suggested that this error could be caused by a bad sector on the source or destination drive. I ran chkdsk against the 1 TB external hard drive that the backups were being stored on. The command took about 5 hours to run. It was alarming to see that the command consumed 4 GB of memory while running, but according to numerous websites, this is normal. No errors were found.<br />
<br />
Unfortunately, I couldn’t run chkdsk on the server’s hard drive because it would require that the machine be put out of service. Chkdsk cannot be run on the system drive while the server is operational—it must reboot and then run before booting into Windows. Since the server hosts our website and another library’s website, I couldn’t take it offline without advance notice. So, that wasn’t an option.<br />
<h2>
USB port?</h2>
I tried plugging the external drive into a different USB port, thinking maybe the USB port was bad. A long shot, but you never know. No effect.<br />
<h2>
Large file?</h2>
One website suggested it could be failing because a file was too large. I knew of one particularly large file on the system: “C:\MySQL Data files\ibdata1”. This file is where MySQL stores its databases. The file is over 1 GB, so I tried excluding that file from the backup.<br />
<br />
(In order exclude specific files from the backup, I had to disable the “Bare metal recovery” option from the backup settings.)<br />
<h2>
Reparse points</h2>
Before I could complete the configuration wizard, I got an error message:<br />
<blockquote class="tr_bq">
<i>“One of the paths specified for backup is under a reparse point. Back up of files under a reparse point is not supported. Specify a file path that contains the destination of the reparse point, and then retry the operation.”</i></blockquote>
What is a reparse point? A reparse point is kind of like a shortcut. For example, there is a reparse point for the old “C:\Documents and Settings” folder that just redirects to the “C:\Users” folder.<br />
<br />
To see all the system’s reparse points, type the following command at the root of the drive:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">dir /s /al</span><br />
<br />
I found that the server had a LOT of reparse points. Most of them were in the user folders and were for the old Windows XP common folders names (for example, a reparse point named “My Pictures” existed, which redirected to the “Pictures” folder)<br />
<br />
Due to the number of reparse points on the system, excluding all of them individually wasn’t a practical option. I decided I would just exclude the “Documents and Settings” reparse point to see if that would be enough.<br />
<br />
This time, I could complete the configuration wizard and run the backup. The backup even completed successfully (though, it took 8 hours to complete, which is much longer than the 1 hour it used to take).<br />
<h2>
The solution</h2>
The backup was successful, but it failed to back up a one, single file—an old IIS log file. The error message was:<br />
<blockquote class="tr_bq">
<i>“Error in backup of <file path=""> during read: Error [0x8007045d] The request could not be performed because of an I/O device error.”</file></i></blockquote>
Another vague “I/O device error” message. I tried copying the file to the desktop to see if the file could be read. The copy operation failed with a similar error.<br />
<br />
This made me think that there was something corrupted about the file, which was causing the backup to fail. Maybe a bad sector on the hard drive. I deleted the file, changed the backup settings back to “Bare metal recovery” and ran the backup again. The backup succeeded!<br />
<br />
<br />
<br />
<br />Michael Angstadthttp://www.blogger.com/profile/04809821580827426849noreply@blogger.com1tag:blogger.com,1999:blog-5682413770770674096.post-60125640833755161302018-08-12T18:32:00.000-04:002018-08-12T18:32:18.756-04:00Problems with Deep Freeze and Windows Update<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEif-6hl53nKh9DX3mynp-vOhxvUG-e-a8z2x46Nu8MRRLg5TRoOJ9FdNafXIB60C7MvXXBKwbKlQY5o5m7XKjJ1SwZbnYG0dS343c_AnqjH8khq9I4bgmNwFkfcb0mcIzLP5hrb3v4dSQLu/s1600/Deep%252BFreeze%252BLogo.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="198" data-original-width="257" height="153" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEif-6hl53nKh9DX3mynp-vOhxvUG-e-a8z2x46Nu8MRRLg5TRoOJ9FdNafXIB60C7MvXXBKwbKlQY5o5m7XKjJ1SwZbnYG0dS343c_AnqjH8khq9I4bgmNwFkfcb0mcIzLP5hrb3v4dSQLu/s200/Deep%252BFreeze%252BLogo.png" width="200" /></a></div>
The public access computers at the library where I work use software called <b>Deep Freeze</b>, which prevents any changes to the computer from being persisted between boots. Rebooting the computer reverts everything back to the way it was since the last reboot. The software is essential for a public-access environment, as it prevents users from doing any long-term damage to the system and also helps with privacy.<br />
<br />
Deep Freeze does its job wonderfully, but I recently started noticing some issues with installing Windows Updates when we switched to Windows 10. The reason I think these problems are caused by Deep Freeze is our staff computers, which are nearly identical to our public ones, do not have Deep Freeze installed on them, and they have not experienced these problems.<br />
<h2>
Problem 1: "Undoing changes"</h2>
During the phase of the update process when the updates are installed after you reboot the computer, Windows reports that the updates could not be installed and that it's "undoing changes".<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipai-DekCivHl0-u7XLcIWjMafsE81F4zvZPa7cNB-P_8_RfsSCBCcTgZoLhZyKANDJ89tuXCXnTlpVNclgZSI9mBnUo6pkURdYMne910dAQwZAf3YCBRsRSYgfgGHadXmahkj7I7xrk7G/s1600/windows-10-we-couldnt-complete-the-updates-undoing-changes.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="219" data-original-width="495" height="141" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipai-DekCivHl0-u7XLcIWjMafsE81F4zvZPa7cNB-P_8_RfsSCBCcTgZoLhZyKANDJ89tuXCXnTlpVNclgZSI9mBnUo6pkURdYMne910dAQwZAf3YCBRsRSYgfgGHadXmahkj7I7xrk7G/s320/windows-10-we-couldnt-complete-the-updates-undoing-changes.jpg" width="320" /></a></div>
<br />
<br />
The solution that I discovered was to run the following commands BEFORE checking for updates. These commands must be run from an admin-level command prompt.<br />
<br />
<span style="font-family: "Courier New", Courier, monospace;">sfc /scannow</span><br />
<span style="font-family: "Courier New", Courier, monospace;">dism /Online /Cleanup-Image /RestoreHealth </span><br />
<br />
If you ever had to troubleshoot a Window problem, odds are you have seen these two commands before, as they are floating all over the Internet in tech help forums. I like to think of them as general-purpose troubleshooting commands that are good to run if you are have any problem with the Windows operating system itself. There's also never any harm in running them.<br />
<br />
The first command checks Windows' operating system files for corruption. In my case, it always reports that it found corrupted Windows files and that it fixed them. The second command, in my case, doesn't report that it found any problems, so it may not be necessary for this particular problem.<br />
<br />
Since this problem has reoccurred so many times for me, I have now made it a part of my routine to run these commands before checking for updates. <br />
<h2>
Problem 2: Booting to the blue "Automatic Repair" screen</h2>
<br />
This problem only happens after installing Windows 10 <b>feature </b>updates (as opposed to "quality" updates, which are smaller and more frequent). When the computer is turned on, it sometimes (but not always) boots to a blue screen titled "Automatic Repair" (pictured below).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCyiukwcRcemkODImJq_9TG8plEousm4dfEKCc6j0TAqtPv1rPtlcp5FPkuwHQYbCaBuba1XH7VdhL0qfjGHFgvLwADzSLEmqRSWH6X8dXcMez8Tj0uh-oO0FdNr8YgIKb4sJFyxj0bxIZ/s1600/Windows-10-Automatic-Repair.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="210" data-original-width="591" height="113" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCyiukwcRcemkODImJq_9TG8plEousm4dfEKCc6j0TAqtPv1rPtlcp5FPkuwHQYbCaBuba1XH7VdhL0qfjGHFgvLwADzSLEmqRSWH6X8dXcMez8Tj0uh-oO0FdNr8YgIKb4sJFyxj0bxIZ/s320/Windows-10-Automatic-Repair.png" width="320" /></a></div>
<br />
This screen will either (a) report that it repaired some problems and
prompt you to reboot your computer, or (b) report that it couldn't repair the problems and prompt you to shutdown your computer.
In the latter case, clicking "Advanced options", then "Continue" will
boot the computer normally. The screen appears roughly half the time the computer is turned on.<br />
<br />
The solution to this problem is first to uninstall Deep Freeze. Then, run the two commands above. Finally, reinstall Deep Freeze.<br />
<br />
To prevent this issue from happening in the first place, uninstall Deep Freeze before installing the Windows update.Michael Angstadthttp://www.blogger.com/profile/04809821580827426849noreply@blogger.com0tag:blogger.com,1999:blog-5682413770770674096.post-91615955961831029722017-07-03T11:25:00.000-04:002017-07-03T11:25:00.669-04:00Connecting to the Internet<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimauFFdjPetTc3pQ4QgoCmk3OnunZEldKNt5pMZYbP9Sefd-RVhAAOmfum0d-rpl4NnLZTnMoEoq8j3_vUBS_506jbe1SfZczG56WEwlFq2Ea4-uVab38N1tZyAS24uHwB9N2IcPDgBfPz/s1600/maxresdefault.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="720" data-original-width="1280" height="112" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimauFFdjPetTc3pQ4QgoCmk3OnunZEldKNt5pMZYbP9Sefd-RVhAAOmfum0d-rpl4NnLZTnMoEoq8j3_vUBS_506jbe1SfZczG56WEwlFq2Ea4-uVab38N1tZyAS24uHwB9N2IcPDgBfPz/s200/maxresdefault.jpg" width="200" /></a></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>Dial-up</b></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0in;">
Telephone lines can
be used to transmit computer data. This was how people connected to
the internet in the early days. However, telephone wires are
designed to transmit analog information, and computers can only
consume digital information. A <b><span style="background: #ffff00;">dial-up
</span></b><b><span style="background: #ffff00;">modem</span></b>
converts analog signals to digital and vice versa.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0in;">
To connect to the
internet with a dial-up modem, you enter a phone number for your
modem to call, which is provided to you by your ISP. You also have
to provide a username and password. The connection process is <a href="https://en.wikipedia.org/wiki/File:Dial_up_modem_noises.ogg">noisy</a>
and takes several seconds to complete. ISPs would often charge by
the minute, so you never wanted to leave your connection open when
you weren't using it (you also couldn't make phone calls while
connected). Dial-up connections use a protocol called Point-to-Point
Protocol (<b><span style="background: #ffff00;">PPP</span></b>), which
is specifically designed for transmitting data over dial-up.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0in;">
The unit of
measurement that is used to measure the speed of data across a
telephone line is a <b><span style="background: #ffff00;">baud</span></b>.
The maximum speed a telephone line can achieve is 2,400 baud. As
modems improved over time, they could pack more and more bits into
each baud. For example, a 33.6 Kbps modem can pack 14 bits into each
baud (2400 x 14 = 33,600). The highest speed that can be achieved
through dial-up is 56 Kbps. Dial-up connections also have fairly
high latency compared to other internet connection approaches.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0in;">
To try to break the
56K barrier, some ISPs experimented with <a href="https://en.wikipedia.org/wiki/Dial-up_Internet_access#Using_compression_to_exceed_56k">server-side
compression</a>. This involved compressing certain kinds of data
before sending it over the wire to the client, resulting in higher
download speeds. This approach was hugely successful for certain
kinds of data that can be easily compressed, such as HTML pages and
plain text. But many data formats are already compressed, such as
ZIP files and streaming video, so no speed improvements could be
gained from them. Image file formats like JPEG and PNG already use
compression, but ISPs would compress them even more, resulting faster
speeds, but, as a consequence, a loss of image quality.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>ISDN</b></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0in;">
As dial-up modems
began approaching the 56K limit, telephone companies began converting
all their analog telephone lines to digital. The process of sending
digital signals across digital telephone lines is called ISDN, and it
allows speeds of up to 64 Kbps (wow!).</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0in;">
An ISDN line
contains two types of channels. Bearer (B) channels are used for
voice and digital signals and run at 64 Kbps. Delta (D) channels are
used for setup and configuration data and run at 16 Kbps. A common
setup would be to install two B channels and one D channel, giving
you speeds of up to 128 Kbps. This setup was referred to as basic
rate interface (<b><span style="background: #ffff00;">BRI</span></b>).
A more powerful, but less common, setup involved twenty-three B
channels (providing 1.544 Mbps) and one 64 Kbps D channel. This was
called primary rate interface (<b><span style="background: #ffff00;">PRI</span></b>)
or a <b><span style="background: #ffff00;">T1 line</span></b>. The
main downside to ISDN connections was that you had to be within
18,000 feet of the central ISP building for it to work.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>DSL</b></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0in;">
Digital subscriber
line connections use your telephone line like dial-up, but the
connection is always-on and is much faster. They also allow you to
make phone calls while the connection is active. Speeds can vary
anywhere from 3 Mbps to hundreds of Mbps. The most common type of
DSL connection is asynchronous DSL. ADSL has upload speeds that are
slower than download speeds. On the other hand, synchronous DSL
(SDSL) gives you identical upload and download speeds, but is more
expensive. Just like with ISDN, you must be within a certain
distance of the main ISP office. The distance can vary from a few
hundred feet to 18,000 feet.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>Cable</b></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0in;">
A cable connection
piggy-backs off of your cable television connection. It provides
upload speeds between up to 20 Mbps and download speeds of over 100
Mbps.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br />
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilUlhdZoEWXXP5TBBkC2icvIqJCy2Zvj8ElGPeZtSTzCCrcHXMI6K7vSqSS50DGb8xVJjrSTDeYzhZRk7HdvtU_pWCteM77-HNJoMHl8_-h0FK_i2ZrMoOPVFduwN1dQTMeM4eBn4LnZwv/s1600/139559.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="370" data-original-width="620" height="118" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilUlhdZoEWXXP5TBBkC2icvIqJCy2Zvj8ElGPeZtSTzCCrcHXMI6K7vSqSS50DGb8xVJjrSTDeYzhZRk7HdvtU_pWCteM77-HNJoMHl8_-h0FK_i2ZrMoOPVFduwN1dQTMeM4eBn4LnZwv/s200/139559.jpg" width="200" /></a></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>Fiber</b></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0in;">
There are two kinds
of fiber connections. In fiber-to-the-node (<b><span style="background: #ffff00;">FTTN</span></b>),
the ISP installs a central box somewhere in your neighborhood, which
is connected to the actual fiber line. Then, the individual houses
connect to the box using standard Ethernet or coaxial cabling. In
fiber-to-the-premises (<b><span style="background: #ffff00;">FTTP</span></b>)
your house is directly connected with the central office via fiber.
Fiber varies in speed, but can be as fast as 1 Gbps (which is what
Google Fiber provides). In some cases the download speed matches the
upload speed. I have an FTTP fiber connection that gives me 100 Mbps
upload and download speeds.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>Satellite</b></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0in;">
The main benefit to
a satellite connection is that it works anywhere in the world. No
infrastructure is required (telephone lines, cable lines, etc). A
satellite dish must be professionally setup so that it has
line-of-sight communication with the satellite up in space. The main
downsides are: higher than average latency and signal degradation in
cloudy weather.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>References</b></div>
<style type="text/css">
@page { margin: 0.79in }
p { margin-bottom: 0.1in; line-height: 120% }
a:link { so-language: zxx }
</style>
<br />
<ul>
<li>
<div style="line-height: 100%; margin-bottom: 0in;">
<a href="https://www.amazon.com/CompTIA-Certification-Guide-220-901-220-902/dp/125958951X/">All
In One Comp TIA A+ Certification, Ninth Edition</a></div>
</li>
<li>
<div style="line-height: 100%; margin-bottom: 0in;">
Wikipedia</div>
</li>
</ul>
Michael Angstadthttp://www.blogger.com/profile/04809821580827426849noreply@blogger.com0tag:blogger.com,1999:blog-5682413770770674096.post-18199959302595073422017-07-02T22:07:00.000-04:002017-07-02T22:07:21.939-04:00Wireless Communication Protocols<div style="line-height: 100%; margin-bottom: 0in;">
There are many
different kinds of technologies that allow for the wireless
transmission of digital information through the air. These include
Wi-Fi, Bluetooth, infrared, and cellular.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigB4l0Y7XxShJlkUxTlcLHcULT-Ou1SCASxAoi2_bsJwKLpS_aSO8AoLlhxVluWTJUfWqwDrGBERnIBvWVUsXhpn9IinLN9Z9dfWGNCPMHkDwXWjKUsRc4vHedtSh8TeeGT_tqcXSpgsH4/s1600/blue_wifi.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="735" data-original-width="1600" height="91" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigB4l0Y7XxShJlkUxTlcLHcULT-Ou1SCASxAoi2_bsJwKLpS_aSO8AoLlhxVluWTJUfWqwDrGBERnIBvWVUsXhpn9IinLN9Z9dfWGNCPMHkDwXWjKUsRc4vHedtSh8TeeGT_tqcXSpgsH4/s200/blue_wifi.jpg" width="200" /></a></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>Wi-Fi</b></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
The most well known
is the 802.11 family of protocols, more commonly known as Wi-Fi. In
a typical Wi-Fi setup, all computers connect to a central device
called a <b><span style="background: #ffff00;">WAP</span></b>
(wireless access point). WAP is the technical term for “wireless
router”. Every wireless network has a <b><span style="background: #ffff00;">service
set identifier</span></b> (SSID), which is a human-readable name for
the network. The SSID is what appears when you search for available
wireless networks in your device's Wi-Fi settings. The WAP
broadcasts the SSID so new devices can find and connect to the
network.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
For small buildings,
like a SOHO (small office/home office) environment, only one WAP is
needed because its signal can reach all or most parts of the
building. This is referred to as a <b><span style="background: #ffff00;">Basic
Service Set</span></b> (BSS). However, larger buildings cannot make
due with just a single WAP. In this situation, multiple WAPs are
strategically placed throughout the building, and are joined together
into an <b><span style="background: #ffff00;">Extended Basic Service
Set</span></b> (EBSS). In a EBSS, all the WAPs have the same SSID,
so as you roam around the building, your device automatically
switches WAPs based on whichever has the strongest signal.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhw9y2pD4k62WBlqQEupUJlNtuXpXrIjYA-WhaE6mtlqY7alxoAHj5D9a8r06cyfZ5xYja8VXV_k-JOTfTvTLyv8X16Jc73VVCL5N5IFZ54dUekhNSj_ETCT-GGhQGO0MqtqYpzu413cYe5/s1600/Linksys-Wireless-G-Router.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="1372" data-original-width="1600" height="171" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhw9y2pD4k62WBlqQEupUJlNtuXpXrIjYA-WhaE6mtlqY7alxoAHj5D9a8r06cyfZ5xYja8VXV_k-JOTfTvTLyv8X16Jc73VVCL5N5IFZ54dUekhNSj_ETCT-GGhQGO0MqtqYpzu413cYe5/s200/Linksys-Wireless-G-Router.jpg" width="200" /></a><b>Securing your WAP</b></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>Hiding the SSID:
</b>It's possible to configure a WAP to <u>not</u> broadcast its
SSID, which helps prevent unauthorized people from accessing it.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>Enabling MAC
address filtering: </b>Every computer device has something called a
MAC address, which is a 48-bit, globally unique identifier. You can
provide your WAP with the MAC addresses of all your devices so that
no other devices are allowed to connect.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>Changing the
a</b><b>dmin password: </b>Many WAPs leave the factory with identical
administrator passwords. Change it! The administrator password is
used to access the configuration settings of the WAP (usually through
a web interface), so it's important to have a strong and unique
password.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>Control</b><b>ling</b><b>
physical access: </b>Many WAPs have a handful of Ethernet ports on
them. Connecting a computer to one of these ports bypasses all the
wireless security that is in place, so you should either disable
these ports or place your WAP in a location that only authorized
personnel can access. Also, when you buy internet service for your
home, the ISP often provides you with a WAP that has the Wi-Fi and
administrator passwords stamped onto the case. So if you don't want
to change them, make sure the WAP isn't in a place that can be seen
by strangers (like your window sill!).</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>Ad Hoc Mode</b></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
Connecting to a
wireless network through a WAP is referred to as “<b><span style="background: #ffff00;">infrastructure
mode</span></b>”. But it's interesting to note that a WAP isn't
required to network computers wirelessly. In “<b><span style="background: #ffff00;">ad
hoc mode</span></b>” (also sometimes referred to as “peer-to-peer
mode”), computers connect directly with each other to form an
<b><span style="background: #ffff00;">Independent Basic Service Set</span></b>
(IBSS). This is useful if a WAP isn't available and the number of
computers you need to network is small.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8-60bI8MyKf__W0Vkc473R-YDerNTwdQ6BzFpvyY_EZg6GbMquKAB1NWXJ-vCt6sfOwX8TzCiboobcsqWI6evFEeLVor1aSTIpcr4Qx_suPr1M9uxtZgpByTYiQ48X5wf1jRSkOZ625P0/s1600/wifi_antennas.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="341" data-original-width="357" height="190" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8-60bI8MyKf__W0Vkc473R-YDerNTwdQ6BzFpvyY_EZg6GbMquKAB1NWXJ-vCt6sfOwX8TzCiboobcsqWI6evFEeLVor1aSTIpcr4Qx_suPr1M9uxtZgpByTYiQ48X5wf1jRSkOZ625P0/s200/wifi_antennas.jpg" width="200" /></a></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>Antennas</b></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
The antenna most
commonly used by WAPs and computer devices is a <b><span style="background: #ffff00;">dipole
antenna</span></b>, which is a type of <b><span style="background: #ffff00;">omni-directional</span></b> antenna. They look like a stick but actually have two
antennas inside them. Some WAPs have detachable antennas, which
gives you the option of installing larger, more powerful ones.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
Signal strength
(called “<b><span style="background: #ffff00;">gain</span></b>”)
is measured in decibels (dB). Most WAPs broadcast at around 2 dB,
and some let you adjust this. You might think that the higher the
gain, the better, but not always. Lowering the gain to an amount
that just barely covers your building will prevent your neighbors
from being able to connect to your network. This also does your
neighbors a favor because it lowers the amount of RFI (radio
frequency interference) that their wireless networks will have to
contend with.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
The orientation of
the antenna matters. This is called <b><span style="background: #ffff00;">polarization</span></b>.
If an antenna is standing straight up, it has a <b><span style="background: #ffff00;">vertical
alignment</span></b>. If it is laying flat, it has a <b><span style="background: #ffff00;">horizontal
alignment</span></b>. Since the antenna in your laptop is located in
the lid next to the screen, it generally has a vertical alignment
when the lid is open. In order to communicate effectively, the
antennas of the computer and the WAP must have similar polarities.
It's good practice to tilt the WAP's antenna to a 45 degree angle to
accommodate the largest variety of polarities.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>Wi-Fi Security
Protocols</b></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
Because all
communication is traveling through the air, anyone with the right
equipment and skills can intercept this communication and read
it—just like tuning your car radio to a radio station. Unlike
radio broadcasts, the information that travels through Wi-Fi networks
can be very sensitive. To help protect your privacy, various
security protocols have been released over the years.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b style="background-color: yellow;">WEP</b>. Created
in 1997, this protocol encrypts all communication with 40- or 104-bit
encryption. And it was not very secure. For one, it uses the same
encryption key to encrypt all communication with all client
computers, which makes it possible for a single computer to listen in
on everyone else's communication. And in 2001, a serious encryption
flaw was discovered which allowed a WEP key to be cracked in minutes.
WEP was officially retired in 2003 and replaced by WPA.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b style="background-color: yellow;">WPA</b>. This
protocol corrects WEP's weakness of using a single encryption key by
changing the encryption key for every packet of data that is
transmitted (called <b><span style="background: #ffff00;">TKIP</span></b>).
The encryption key size was also increased to 64- or 128-bits. And
it includes a feature which prevents malicious clients from altering
and resending data packets. WPA was only intended for temporary use
until the WPA2 standard was finalized.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b style="background-color: yellow;">WPA2</b>.
Finalized in 2006, WPA2 includes all of the improvements that WPA
brought to the table, as well as an improved encryption algorithm
called <b><span style="background: #ffff00;">AES</span></b>. AES is a
very strong algorithm that no one has been able to find a significant
flaw in (yet). In fact, the U.S. government approved it to be used
for transmitting classified information in 2003. WPA2 is currently
the most secure wireless security standard, and it's what all your
devices should be using. WAPs that support “mixed-mode” allow
devices to connect using either WPA or WPA2 (for older devices that
do not support WPA2).</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b style="background-color: yellow;">WPS</b>. What if
you want to connect a device like a printer or scanner to your Wi-Fi
network? Because these devices often lack display screens, how are
you supposed to give it the SSID and password of your Wi-Fi network?
Enter WPS. It allows you to connect a device to a network with as
little as two button presses. First, you press the WPS button on the
device. Then, you press the WPS button on the WPA (your WPA must
support WPS). And bingo, it's connected. However, it has a major
security flaw. It also allows you to connect devices to it using an
eight-digit code, which an attacker could use to brute force his way
into the network. Therefore, security experts recommend that you
turn WPS off if your WAP supports it.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>Sidenote: HTTPS</b></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
You might be nervous
about transmitting sensitive information over a wireless network,
especially if it is a public Wi-Fi network, like the one at Starbucks
or your favorite coffee shop—<span style="color: red;">AND YOU SHOULD BE!</span> Even if the network uses
the best possible encryption standard (WPA2), not only could someone
theoretically discover a flaw at any time and start intercepting your
data, but the owners of the WAP could theoretically configure their
WAP to intercept and log all information that travels through it!
Or, attackers could set up their own WAP within range of the
legitimate WAP and configure their WAP to broadcast an SSID which is
identical to that of the legitimate WAP, causing your device to
connect to the attacker's WAP instead of to the legitimate one (if I
recall correctly, this was done at the 2016 Olympics in Rio).</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
However, you need
not worry as long as you are browsing secure websites (using the
HTTPS protocol) and using apps that use secure connections. The
encryption standard that protects you is called <b><span style="background: #ffff00;">SSL</span></b>.
When using this standard, your computer encrypts the data <i>before</i>
sending it over the air. What’s more, the data can't be decrypted
until it reaches its intended recipient. So even if someone
intercepted your communication, they wouldn't be able to make any
sense of it because it is encrypted. God forbid if someone breaks
SSL—the internet as we know it would grind to a halt, because this
standard is what makes possible such things as online shopping and
online banking!</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>The 802.11 family
of protocols</b></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
A number of
different Wi-Fi protocols have been released over the years, each of
which have different characteristics. These are the low-level
protocols that the security protocols discussed above run “on top
of”. I'll refer you to my <a href="http://mangstacular.blogspot.com/2017/06/computer-networks-101.html">Computer
Networks 101</a> blog post for a description of these protocols.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIKSb9FfhT-TkQi5RqFn1sOL321v0pWmqQnXT10LC_tjvqUwB-hkL4MAIdd9yaCxqCUYoWJhH2b7iQH-7n0vpza6Ml1idLXCfr7koUmkAmcGC3mvGyvH4dU_gudJav5n9apuhKdW5MnJXh/s1600/icon-bluetooth.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="705" data-original-width="475" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIKSb9FfhT-TkQi5RqFn1sOL321v0pWmqQnXT10LC_tjvqUwB-hkL4MAIdd9yaCxqCUYoWJhH2b7iQH-7n0vpza6Ml1idLXCfr7koUmkAmcGC3mvGyvH4dU_gudJav5n9apuhKdW5MnJXh/s200/icon-bluetooth.png" width="134" /></a></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>Bluetooth</b></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
For short-range,
wireless communication, Bluetooth is often used. It is designed to
do very specific things and is not intended to be general purpose,
like Wi-Fi is. A Bluetooth network is called a <b><span style="background: #ffff00;">PAN</span></b>
(personal area network). It is extremely resistant to RFI (radio
frequency interference) due to the fact that it hops frequencies
about 1,600 times per second.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
Every Bluetooth
device is assigned a “class”, based on its range. Lower class
devices use less power because they don't have to transmit as strong
of a signal.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<table cellpadding="4" cellspacing="0">
<colgroup><col width="74"></col>
<col width="86"></col>
</colgroup><tbody>
<tr valign="top">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0.04in;" width="74">Class 1</td>
<td style="border: 1px solid #000000; padding: 0.04in;" width="86">100 meters</td>
</tr>
<tr valign="top">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="74">Class 2</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="86">10 meters</td>
</tr>
<tr valign="top">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="74">Class 3</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="86">1 meter</td>
</tr>
</tbody></table>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
Many different
versions have been released over the years (summarized in the table
below):</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<table cellpadding="4" cellspacing="0">
<colgroup><col width="133"></col>
<col width="93"></col>
<col width="384"></col>
</colgroup><tbody>
<tr valign="top">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0.04in;" width="133"><b>Version</b></td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0.04in;" width="93"><b>Max speed</b></td>
<td style="border: 1px solid #000000; padding: 0.04in;" width="384"><b>Description</b></td>
</tr>
<tr valign="top">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="133">1.1, 1.2</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="93">1 Mbps</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="384"><br />
<br /></td>
</tr>
<tr valign="top">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="133">2.0, 2.1</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="93">3 Mbps</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="384">A feature called Enhanced Data Rate (EDR) improves its max
speed.</td>
</tr>
<tr valign="top">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="133">3.0 + HS</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="93">24 Mbps</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="384">The high speed (HS) feature is optional and uses a Wi-Fi
network to achieve the full 24 Mbps bandwidth.</td>
</tr>
<tr valign="top">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="133">4.0, 4.1, 4.2<br />
“Bluetooth Smart”</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="93">24 Mbps</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="384">Focuses on power consumption, security, and IP connectivity.</td>
</tr>
<tr valign="top">
<td height="18" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="133">5.0</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="93">24 Mbps</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="384">Focused on the “Internet of Things”, aims to be low power.</td>
</tr>
</tbody></table>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2LCA_FSPQrXg5Kq3tYvQotve2iS1PP_vEGKZ9bDAFYdKvjZUZEAgCtOlj0Lq75MWBANql0OiH6oFEPF6m6LhV4pgxsBjHz8XfRVJ0ymx5LnLUaTIJwAVI5q0V66U1pIMIrQL0H9eQb5cZ/s1600/DCIA1039-3.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="600" data-original-width="600" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2LCA_FSPQrXg5Kq3tYvQotve2iS1PP_vEGKZ9bDAFYdKvjZUZEAgCtOlj0Lq75MWBANql0OiH6oFEPF6m6LhV4pgxsBjHz8XfRVJ0ymx5LnLUaTIJwAVI5q0V66U1pIMIrQL0H9eQb5cZ/s200/DCIA1039-3.jpg" width="200" /></a></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>Infrared</b></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
Infrared is most
commonly used in remote controls, like the one for your television.
But it can also be used to transmit digital information. The
Infrared Data Association (<b style="background-color: yellow;">IrDA</b>) protocol uses infrared light as its
communication medium. However, it is very limited. It only supports
speeds of up to 4 Mbps and is half-duplex. And it only has a max
range of 1 meter. Plus, it relies on line of sight communication
(any physical object placed in its way will break the link). Because
of these limitations, IrDA no security features—why bother make any
when the computers have to be so close to each other and it’s so
easy to block the signal? Note that some computers have what <i>looks</i>
like an infrared receiver, but these are usually used for remote
controls, not for IrDA.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>Cellular</b></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
Lastly, we have
cellular. Cellular data connections are often referred to as 1G, 2G,
3G, or 4G. These do not refer to specific standards, but are loose terms that refer to
how recent and fast the underlying technology is. At the present
time, the fastest cellular technology is LTE. It is considered 4G
and theoretically supports speeds of up to 300 Mbps download and 75
Mbps upload.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
If you are not in
range of a Wi-Fi network, you can <b><span style="background: #ffff00;">tether</span></b>
your device to your cell phone. My understanding of this is that you
can download apps that do this, but you need to jailbreak your device
in order for them to work.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>References</b></div>
<style type="text/css">
@page { margin: 0.79in }
td p { margin-bottom: 0in }
p { margin-bottom: 0.1in; line-height: 120% }
a:link { so-language: zxx }
</style>
<br />
<ul>
<li>
<div style="line-height: 100%; margin-bottom: 0in;">
<a href="https://www.amazon.com/CompTIA-Certification-Guide-220-901-220-902/dp/125958951X/">All
In One Comp TIA A+ Certification, Ninth Edition</a></div>
</li>
<li>
<div style="line-height: 100%; margin-bottom: 0in;">
Wikipedia</div>
</li>
</ul>
Michael Angstadthttp://www.blogger.com/profile/04809821580827426849noreply@blogger.com0tag:blogger.com,1999:blog-5682413770770674096.post-54150519838473305412017-07-01T13:13:00.000-04:002017-07-01T13:13:07.622-04:00The Power is Yours!<div class="separator" style="line-height: 100%; margin-bottom: 0in; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhTJ0GZbDTrD-eN6uloFfNaSLps9sfLipS-IS0GWkt7sQNNElA0jp3P9y6fEGr7lPsJ3Ln5sNzchy3YniPhVYbErXTj-KmmdXlShzXiNrXdOdDSxq9hyphenhyphento5kB3iciWPjBaPs3YAgOtqq7G/s1600/power-supply-e1454696452766.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="563" data-original-width="750" height="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhTJ0GZbDTrD-eN6uloFfNaSLps9sfLipS-IS0GWkt7sQNNElA0jp3P9y6fEGr7lPsJ3Ln5sNzchy3YniPhVYbErXTj-KmmdXlShzXiNrXdOdDSxq9hyphenhyphento5kB3iciWPjBaPs3YAgOtqq7G/s200/power-supply-e1454696452766.jpg" width="200" /></a>Every computer has a
box called a <b style="background-color: yellow;">power supply</b>, which is responsible for supplying
electricity to the internal components of the computer. Its main
task is to convert the <b style="background-color: yellow;">AC</b> (alternating current) power from the
electrical outlet to <b style="background-color: yellow;">DC</b> (direct current) power, and then dole out the
DC power to the computer's internal components. Different parts of
the world use different voltage standards for their electrical
outlets, so a power supply has to be compatible with the voltage
standards in your part of the world. For example, power outlets in
North America run at around 115V, and those in Europe generally run
at around 230V. Some power supplies have a physical switch on the
outside that tell it what voltage to expect (called <b style="background-color: yellow;">fixed-input</b>).
Others will adjust automatically (called <b style="background-color: yellow;">auto-switching</b>).</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<div style="text-align: left;">
Due to the nature of
AC power, power supplies can take damage over time from something
called <b style="background-color: yellow;">harmonics</b>. Harmonics is caused by the way in which electrical
devices draw power from an AC connection, and is what causes
electrical devices to make faint humming sounds. Most power supplies
come with circuitry that protect against this, called active power
factor correction (<b style="background-color: yellow;">active PFC</b>). You should never buy a power
supplies that does not have this.<br />
<br />
<b>I need more power, Captain!</b></div>
<div style="text-align: left;">
<br /></div>
</div>
<div style="line-height: 100%; margin-bottom: 0in;">
</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<div style="text-align: left;">
Every power supply
has a maximum amount of wattage it can draw. If the internal
components of the computer try to draw more than that, the computer
won't work right. For example, if you want to install a brand new,
high performance graphics card, you should make sure your power
supply has enough available voltage. Note that power supplies are
replaceable, so if your current power supply isn't good enough, you
can always replace it.</div>
</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<div style="text-align: left;">
Power supplies do
not use all of the AC power it consumes. Some power is lost due to
inefficiencies and released in the form of heat. Most power supplies
are at least 80% efficient, and they will advertise what their
efficiency is on the packaging. A more efficient power supply will
consume less power.</div>
</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<div style="text-align: left;">
<br /></div>
</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<div style="text-align: left;">
It's important to
note that power supplies only draw the amount of energy that is
actually being used by the computer—they do NOT draw the maximum amount they are capable of. For example, if you have a power supply can that provide
a max of 500 W and your computer is only using 200 W, then the power
supply will only draw enough power for 200 W. You won't be wasting
electricity if you buy a power supply that can supply more power than
your computer needs. In fact, it is good to have a such a power
supply for two reasons: (1) To allow room for future upgrades and (2) to account for
the fact that power supplies produce less wattage over time due to
wear and tear.</div>
</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>Rails</b></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
The DC power that
the power supply generates is doled out through three <b style="background-color: yellow;">voltage rails</b>.
Each rail supplies a different voltage: 12V, 5V, and 3.3V. The 12V
rail is typically used to power devices that have motors of some
sort, such as hard disk drives and optical drives, but there is no
restriction regarding what each voltage rail can be used for (for
example, a high-end graphics card might want to use the 12V rail).</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
Each rail has a maximum amount of amperage it supports, and this is
monitored by circuitry called over-current protection (<b style="background-color: yellow;">OCP</b>).
<b style="background-color: yellow;">Single-rail</b> systems have a single OCP that monitors all the rails.
<b style="background-color: yellow;">Multi-rail</b> systems have one OCP per rail to monitor each rail. If
the amperage in any rail is exceeded, the power supply will shut
itself off to prevent damage to itself. When multi-rail systems were first introduced, they were very unstable due to poorly written specifications, but they have gotten much better since then. For computers that use a lot of power, like servers and gaming PCs, multi-rail systems give your system extra protection against short-circuits. For an ordinary, low-wattage desktop PCs, it doesn't really make a difference whether you have a single-rail or multi-rail system.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>Power supply standards</b></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
Various power supply
standards have been released over the years. <b style="background-color: yellow;">ATX</b> (also called
ATX12V) introduced the idea of providing a constant supply of power
(5V) to the motherboard, even when the computer is off. This is called
<b style="background-color: yellow;">soft power</b>, and it allows the computer to implement various power
saving features. This is the reason why you always should always
unplug a computer before servicing it! This standard was later
improved upon by subsequent standards (below).</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b style="background-color: yellow;"><br />
</b></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b style="background-color: yellow;">ATX12V 1.3</b> added the
P4 connector, which supplies extra power to the motherboard. It also
added the AUX connector. The downside to this standard was that it
was not specific enough, which resulted in power supply manufacturers
producing wildly different power supplies.
</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b style="background-color: yellow;">EPS12V</b> was created
for servers that need more power than the average desktop machine.
It added a 24-pin motherboard power connector. It also introduced
the idea of “voltage rails” (explained above).</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b style="background-color: yellow;">ATX12V 2.0</b> adopted
many of the advancements that EPS12V brought to the table. Notably,
it added a 24-pin P1 connector and voltage rails.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>Connectors</b></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
Many of the different connectors you will see coming out of a power supply are listed in the table below. Yeah! Tables!</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<table cellpadding="4" cellspacing="0">
<colgroup><col width="84"></col>
<col width="95"></col>
<col width="45"></col>
<col width="378"></col>
</colgroup><tbody>
<tr valign="top">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0.04in;" width="84"><b>Connector</b></td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0.04in;" width="95"><b>Voltages</b></td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0.04in;" width="45"><b>Pins</b></td>
<td style="border: 1px solid #000000; padding: 0.04in;" width="378"><b>Description</b></td>
</tr>
<tr valign="top">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="84">P1 power connector</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="95">3.3V, 5V, 12V</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="45">20/24</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="378">The older variant of this connector has 20 pins. The newer
variant (which is backward compatible) has 24 pins and provides
more current.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_x-nd_aV7-6Uk7WWIdajUlMdeOdQABqSUnUEZJCVAqSbN8a9imGbXhfBR4y9SwmBFgxQXyHlZFBOgwDct1dfUGt067I4mmpz5_e7g0w3Um2ZiQTLAl_anH1XLSluGo4Lld1LRmeuR7IMg/s1600/17-371-003-07.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="63" data-original-width="100" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_x-nd_aV7-6Uk7WWIdajUlMdeOdQABqSUnUEZJCVAqSbN8a9imGbXhfBR4y9SwmBFgxQXyHlZFBOgwDct1dfUGt067I4mmpz5_e7g0w3Um2ZiQTLAl_anH1XLSluGo4Lld1LRmeuR7IMg/s1600/17-371-003-07.jpg" /></a></div>
<br /></td>
</tr>
<tr valign="top">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="84">Molex</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="95">5V, 12V</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="45">4</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="378">Typically used to power storage devices, like hard drives.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh59MyAKUUXLZ_cmSSTpkZ6Jlc3bTBz6mt24GlsJcmhIofmpdUAXniy78rArv_hByG9Wa48HifwwFLbp4qc494HTg777VnNtUiM7IjDPtmuI2B2CMGAJq-XY5DvuAuWbxav4nczV-a32H4K/s1600/11w3-03808.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="70" data-original-width="100" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh59MyAKUUXLZ_cmSSTpkZ6Jlc3bTBz6mt24GlsJcmhIofmpdUAXniy78rArv_hByG9Wa48HifwwFLbp4qc494HTg777VnNtUiM7IjDPtmuI2B2CMGAJq-XY5DvuAuWbxav4nczV-a32H4K/s1600/11w3-03808.jpg" /></a></div>
<br /></td>
</tr>
<tr valign="top">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="84">Mini</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="95">5V, 12V</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="45">4</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="378">This connector used to be used for 3.5” floppy disk drives
and isn't used much anymore. You have to be careful when plugging
in this connector because it is easy to plug in upside down, which
will ruin the device.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNUNQzJ_k9qefMUUk7uNeK-cYn4SoXckq3t5fgj4B2ykFCbhL_dUYDNqJz2a4RJpm5kUEutrcQUOH1yMzHqr7HCI61s-wx7bYlRPBVEODQEtYeUcYM1TOWD0MvkA-5glHTFrTsjZEyaqv5/s1600/LP4SATAFMD.E.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="77" data-original-width="100" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNUNQzJ_k9qefMUUk7uNeK-cYn4SoXckq3t5fgj4B2ykFCbhL_dUYDNqJz2a4RJpm5kUEutrcQUOH1yMzHqr7HCI61s-wx7bYlRPBVEODQEtYeUcYM1TOWD0MvkA-5glHTFrTsjZEyaqv5/s1600/LP4SATAFMD.E.jpg" /></a></div>
<br /></td>
</tr>
<tr valign="top">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="84">SATA power connector</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="95">3.3V, 5V, 12V</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="45">15</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="378">Only used for SATA hard drives. In practice, only the 5 V and
12V voltages are used.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg05VH3nW3SKpn4X1KLQnIBvsRnlNGrrfCSIXDa9vi3z7mo5xmOh-ZFwfbu2kl2pL1E6qaYZ0-whwnQt_XhteDbjbo3NZeJllwAs5Dv1EeN6uhHMfh7mecc6Ad2cckKLIqKNYq2tgK6WioJ/s1600/f757f050-b8d0-4fc4-9698-d661151c221c._CB317513741_.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="65" data-original-width="100" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg05VH3nW3SKpn4X1KLQnIBvsRnlNGrrfCSIXDa9vi3z7mo5xmOh-ZFwfbu2kl2pL1E6qaYZ0-whwnQt_XhteDbjbo3NZeJllwAs5Dv1EeN6uhHMfh7mecc6Ad2cckKLIqKNYq2tgK6WioJ/s1600/f757f050-b8d0-4fc4-9698-d661151c221c._CB317513741_.jpg" /></a></div>
<br /></td>
</tr>
<tr valign="top">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="84">SATA slimline connector</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="95">5V</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="45">6</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="378">A smaller version of the SATA power connector.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvrJpeehbQuGspvFWIqJrDLlId63aRnRr9yvTy82BrmnZw4E6HGRnEmE6PNMxpLcl6WGmk8gwmROtQsRHBjtHbyC-GaHrXZIUW5stNVYM_l_socz7w8iRnPK27kueDC_g5QJyvN6MjAZ-9/s1600/41dD53pR6%252BL.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="60" data-original-width="94" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvrJpeehbQuGspvFWIqJrDLlId63aRnRr9yvTy82BrmnZw4E6HGRnEmE6PNMxpLcl6WGmk8gwmROtQsRHBjtHbyC-GaHrXZIUW5stNVYM_l_socz7w8iRnPK27kueDC_g5QJyvN6MjAZ-9/s1600/41dD53pR6%252BL.jpg" /></a></div>
<br /></td>
</tr>
<tr valign="top">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="84">SATA micro connector</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="95">3.3, 5V</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="45">9</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="378">Even smaller! Can't reliably find a photo of this one.</td>
</tr>
<tr valign="top">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="84">P4 connector</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="95">12V</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="45">4</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="378">Used in conjunction with a 20-pin P1 connector to supply the
motherboard with extra power.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7TOSmfLqCwWFX-2ZwBWXXCmgfXKD7a7uIpi9P27je5ihonKz1fHJIDhN1EYX5Fp-fIjrKNROxQ1GFbp963ICrEz8YlvO3s3yc8-U_gGrNgfARgVm-GyF7ep-eMyXh7o2XErSYvvsg9noO/s1600/c-28.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="84" data-original-width="100" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7TOSmfLqCwWFX-2ZwBWXXCmgfXKD7a7uIpi9P27je5ihonKz1fHJIDhN1EYX5Fp-fIjrKNROxQ1GFbp963ICrEz8YlvO3s3yc8-U_gGrNgfARgVm-GyF7ep-eMyXh7o2XErSYvvsg9noO/s1600/c-28.jpg" /></a></div>
<br /></td>
</tr>
<tr valign="top">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="84">AUX connector</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="95">3.3V, 5V</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="45">6</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="378">Also used for supply the motherboard with extra power.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRqrse1qzH-Cc-VvIaOpmbZEgz691wdbKfdUgTLKOg2fJVSg4dVMNcAUd1Mjf0XyEjtGxSsEHBK0ppTQsbP3dc04_h4hZy8G91lYB54JU8M0h7MAvJAYzQCL78aEpQUheRvHS2s0j9DAuG/s1600/auxconn.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="72" data-original-width="100" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRqrse1qzH-Cc-VvIaOpmbZEgz691wdbKfdUgTLKOg2fJVSg4dVMNcAUd1Mjf0XyEjtGxSsEHBK0ppTQsbP3dc04_h4hZy8G91lYB54JU8M0h7MAvJAYzQCL78aEpQUheRvHS2s0j9DAuG/s1600/auxconn.jpg" /></a></div>
<br /></td>
</tr>
<tr valign="top">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="84">EPS12V<br />
EATX12V<br />
ATX12V 2x4</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="95">12V</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="45">8</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="378">This connector goes by many different names. One half is
compatible with the P4 connector.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiY5j-975IlQASiEeqFr2bKsnuBt1SDh2Bf-dxH82II28e9o6-V5zlsRTtc5tGMYzmcknJ3N_fcYp9Ue_nutVQuAtYCiKIBuPgsWLFyPfRYRisIVQkkVBgTphXLTTBafkh2GGQI_rdNT8dr/s1600/12193931915l.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="76" data-original-width="100" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiY5j-975IlQASiEeqFr2bKsnuBt1SDh2Bf-dxH82II28e9o6-V5zlsRTtc5tGMYzmcknJ3N_fcYp9Ue_nutVQuAtYCiKIBuPgsWLFyPfRYRisIVQkkVBgTphXLTTBafkh2GGQI_rdNT8dr/s1600/12193931915l.jpg" /></a></div>
<br /></td>
</tr>
<tr valign="top">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="84">PCIe Connector</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="95">12V</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="45">6/8</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="378">In some 8-pin connectors, two of the pins are detachable so
make them compatible with the 6-pin version. It looks similar to
the EPS12V connector, but is not compatible with it.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzM8-yeERx4Au93BbcSAQfhZhei6hH_qzadRi2CLQr5XgqhXLEEu9HSiBballe7oIoRstwGvuiP0hKh8LoTcynxHBlJjiC6F9u-KR5XYS4bZc8EqRQgrzSR92w86DD_d5yr0_7ggT4L2WQ/s1600/PCIE-862FF-XX-PCI-Express-8p-Female-to-6p-Female-2p-Female-Power-Adapter-Cable-004.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="71" data-original-width="100" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzM8-yeERx4Au93BbcSAQfhZhei6hH_qzadRi2CLQr5XgqhXLEEu9HSiBballe7oIoRstwGvuiP0hKh8LoTcynxHBlJjiC6F9u-KR5XYS4bZc8EqRQgrzSR92w86DD_d5yr0_7ggT4L2WQ/s1600/PCIE-862FF-XX-PCI-Express-8p-Female-to-6p-Female-2p-Female-Power-Adapter-Cable-004.jpg" /></a></div>
<br /></td>
</tr>
</tbody></table>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>References</b></div>
<style type="text/css">
@page { margin: 0.79in }
td p { margin-bottom: 0in }
p { margin-bottom: 0.1in; line-height: 120% }
a:link { so-language: zxx }
</style>
<br />
<div style="line-height: 100%; margin-bottom: 0in;">
</div>
<ul>
<li>Most of this
information was taken from the book <a href="https://www.amazon.com/CompTIA-Certification-Guide-220-901-220-902/dp/125958951X/">All
In One Comp TIA A+ Certification, Ninth Edition</a>.</li>
<li>A good comparison of single-rail vs multi-rail power supplies: <a href="http://www.overclock.net/t/761202/single-rail-vs-multi-rail-explained">overclock.net/t/761202/single-rail-vs-multi-rail-explained</a></li>
<li>All hail Wikipedia</li>
</ul>
Michael Angstadthttp://www.blogger.com/profile/04809821580827426849noreply@blogger.com0tag:blogger.com,1999:blog-5682413770770674096.post-15141189847225991542017-06-25T14:48:00.002-04:002017-06-25T18:44:01.410-04:00Computer Networks 101<div style="line-height: 100%; margin-bottom: 0in;">
In your typical
white-collar work environment, each employee has a computer at their
desk. The computers are connected with each other over a <span style="background-color: yellow;"><b>LAN</b></span> (local
area network). If you have internet access at home, the computers in your house are most likely organized into a LAN as well. A LAN is a group of computers that are physically
close to one another and that can communicate with each other over a
network. All of the computers in a LAN are said to belong to a
<b style="background-color: yellow;">broadcast domain</b>, which means that if one computer sends out a broadcast message, then all the other
computers can hear it.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>Ethernet</b></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
One of the most
common ways to join computers into a LAN is to use Ethernet. There
are four properties of an Ethernet cable: EMI resistance, heat
resistance, flexibility, and speed.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>EMI resistance:</b>
<span style="background-color: yellow;"><b>STP</b></span> (shielded twisted pair) cables are designed to protected again
<b style="background-color: yellow;">EMI</b> (electromagnetic interference). A shop floor is a good example
of a place where STP cables should be used because it has lots of
electrical motors and other machinery. However, the vast majority of
environments do not require significant protection from EMI, so they
use <b style="background-color: yellow;">UTP</b> (unshielded twisted pair) cables, which are less expensive.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>Heat resistance:
</b>Ethernet cabling is often run through the walls and ceilings of a
building (called <b style="background-color: yellow;">plenum space</b>) in order to keep the cables out of the
way. These areas of the building can get very hot. The rubbery
outside of an Ethernet cable is typically made with a material called
<b style="background-color: yellow;">PVC</b>. If PVC starts to melt due to high heat, it can give off
poisonous fumes. A <b style="background-color: yellow;">plenum-grade</b> cable, however, will not melt in the
heat because it is made out of material that is designed for
heat-intensive environments. Plenum-grade cabling is much more
expensive than PVC, so you should only buy it for cabling that you
intend to use in plenum space.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzv15TnT4TORADNj8U-_biyRf0HDjLNS5zd7W2ELBTOZGQLjuD3SN0UkWeNqJvcUzjhPxYarCh8QZvPFVgPN7pBT9Tgbaj7WUmFso5BP2dxrlnlo-AMV6wA-GatFYfgmnEL7JNnXNfDQnJ/s1600/bender.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="131" data-original-width="270" height="97" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzv15TnT4TORADNj8U-_biyRf0HDjLNS5zd7W2ELBTOZGQLjuD3SN0UkWeNqJvcUzjhPxYarCh8QZvPFVgPN7pBT9Tgbaj7WUmFso5BP2dxrlnlo-AMV6wA-GatFYfgmnEL7JNnXNfDQnJ/s200/bender.jpg" width="200" /></a><b>Flexibility: </b>You
also need to think about the kind of physical wear-and-tear the cable
will be getting. Will the cable sit in plenum space, untouched for
most of its existence? Or will the cable spend most of its time in
your office drawer, being used for various purposes around the
office? <b style="background-color: yellow;">Standard core</b> cabling is made out of material that is
flexible, which means you can bend it, step on it, and twist it (to a
reasonable extent) without breaking it. <b style="background-color: yellow;">Solid core</b> cabling, on the
other hand, is not so flexible. But its advantage is that it is a
better conductor and will transfer data more effectively.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>Speed rating:
</b>Every Ethernet cable has a speed rating, which defines its max
data transfer speed. A cable’s speed rating is usually stamped on
the outside of the cable itself. It’s sometimes referred to as a
“CAT rating”, since the speed rating begins with the letters
“CAT”. The maximum cable length varies between speed ratings,
but for most speed ratings it is 100 meters. The ratings are
measured in Mbps (megabits per second) or Gbps (gigabytes per
second). To get a better feel for how fast this is, I like to divide
this number by 8, which tells me how many <u><b>bytes</b></u> per
second it supports. Note that, in order to take advantage of the
full speed a cable offers, <u>all other parts of your network
infrastructure must support that speed rating</u><span style="text-decoration: none;">,
</span><span style="text-decoration: none;">such as the network cards
in the computers and the switches.</span></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<table cellpadding="4" cellspacing="0" style="width: 100%px;">
<colgroup><col width="35*"></col>
<col width="221*"></col>
</colgroup><tbody>
<tr valign="top">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0.04in;" width="14%"><b>Standard</b></td>
<td style="border: 1px solid #000000; padding: 0.04in;" width="86%"><b>Max speed/notes</b></td>
</tr>
<tr valign="top">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="14%">CAT 1</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="86%">This is the technical name for a telephone cable! Telephone
cables use a RJ-11 connector, whereas Ethernet cables use a RJ-45
connector.</td>
</tr>
<tr valign="top">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="14%">CAT 3</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="86%">10 Mbps, some variants support 100 Mbps</td>
</tr>
<tr valign="top">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="14%">CAT 5</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="86%">100 Mbps</td>
</tr>
<tr valign="top">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="14%">CAT 5e</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="86%">1000 Mbps</td>
</tr>
<tr valign="top">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="14%">CAT 6</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="86%">1000 Mbps, 10 Gbps (55 meter max cable length)</td>
</tr>
<tr valign="top">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="14%">CAT 6a/e</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="86%">10 Gbps</td>
</tr>
<tr valign="top">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="14%">CAT 7</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="86%">10 Gbps with better shielding</td>
</tr>
</tbody></table>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>Switches</b></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGH2j70ltTxyKmZED8JO9ZemRS6NCHNR2ojRoQHlSlSklzObyl34OoqyNnNGGGxrtNHDyoVi8btbv5FaiiLrSlrPatZsIIbh2io_kwcnzRb_wJJQamNTI7ZsphHerIB98Txmt3I1fCCAyB/s1600/switch1.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="300" data-original-width="600" height="100" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGH2j70ltTxyKmZED8JO9ZemRS6NCHNR2ojRoQHlSlSklzObyl34OoqyNnNGGGxrtNHDyoVi8btbv5FaiiLrSlrPatZsIIbh2io_kwcnzRb_wJJQamNTI7ZsphHerIB98Txmt3I1fCCAyB/s200/switch1.jpg" width="200" /></a></div>
<div style="line-height: 100%; margin-bottom: 0in;">
All the computers in
an Ethernet network connect to a central device called a <b style="background-color: yellow;">switch</b>,
which routes the various network data to where it needs to go. This
is called a <b style="background-color: yellow;">star bus topology</b>—“star” refers to the fact that
the computers connect to a central switch (instead of to each other)
and “bus” refers to the central device that routes all traffic.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
Note that a device
called a “bus” can serve as the central device as well, but buses
are much more inefficient than switches because they broadcast all
messages they receive to all computers, whereas switches only send
out messages to the computer that the messages are intended for.
Switches used to be more expensive than buses, but not anymore.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
To prevent
unauthorized computers from connecting to the network, you can
disable unused ports on a switch.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>Structured
Cabling</b></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
Larger companies
have the money and talent to organize their networks using <b style="background-color: yellow;">structured
cabling</b> system. The aim of such a system is to create an organized,
secure (both from an information safety perspective and a physical
safety perspective), and reliable way of connecting all of your
company’s computers to each other.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
A typical structured
cabling system is organized as follows. All cabling, including
Ethernet cables and telephone cables, are run from each <b style="background-color: yellow;">work area</b>
(the office space that an employee occupies) to a central room called
the <b style="background-color: yellow;">telecommunications room</b>. This cabling is referred to as the
<b style="background-color: yellow;">horizontal cabling</b>. Each piece of horizontal cabling is referred to
as a <b style="background-color: yellow;">run</b>. Vocabulary rocks!</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
In an ideal
environment, the horizontal Ethernet cabling would run through plenum
space and be of plenum-grade, solid core construction. Each work
area would then contain wall outlets that connect to the horizontal
cabling. It’s interesting to note that Ethernet wall outlets have
CAT ratings as well! Therefore, it’s important to make sure the
outlet matches the CAT rating of your horizontal cabling.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
The
telecommunications room is the central destination for all the
horizontal cabling. It contains specially designed <b style="background-color: yellow;">equipment racks</b>
which are used to store its computer equipment. All rack-mounted
equipment adheres to a measurement standard, simply referred to as <b style="background-color: yellow;">U</b>,
which defines the height of the equipment. 1U equals 1.75 inches.
Most rack-mounted equipment is either 1U, 2U, or 4U.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2f4Sxh9v8sz9MBD165nJm219yfJFwqeM_prlEiA5Eour8ZtSu_oxbvouf54gfMCW2ceqiXlY8SSifE56XpeRFRtdLWPntd833IGquezzZmx5eIz2vGSfGMVMfNIx7S7Jh8OvvPtS5wHww/s1600/patch-panel.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="651" data-original-width="818" height="158" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2f4Sxh9v8sz9MBD165nJm219yfJFwqeM_prlEiA5Eour8ZtSu_oxbvouf54gfMCW2ceqiXlY8SSifE56XpeRFRtdLWPntd833IGquezzZmx5eIz2vGSfGMVMfNIx7S7Jh8OvvPtS5wHww/s200/patch-panel.jpg" width="200" /></a></div>
<div style="line-height: 100%; margin-bottom: 0in;">
One piece of
equipment you’re likely to find in a telecommunications room is a
<b style="background-color: yellow;">patch panel</b>. A patch panel makes it easy to rearrange your network
without having to mess with the horizontal cabling (which often uses
fragile, solid core cables). The horizontal cabling is plugged into
the back of the patch panel using a connector called a <b style="background-color: yellow;">110 punchdown
block</b>. This kind of connector connects the <u>individual wires</u>
inside of the Ethernet cable to the patch panel. A
<b style="background-color: yellow;">punchdown tool</b> is used to attach the cable in this way. Connecting
the horizontal cabling to the patch panel is a time consuming process
and is meant to be more or less <span style="text-decoration: none;">permanent</span>.
The other side of the patch panel contains much more flexible RJ-45
ports, which are easy to plug and unplug (kind of like the telephone
switches of old). <b style="background-color: yellow;">Patch cables</b> are plugged into these ports. Patch
cables are short (typically 2-5 feet long), standard core, UTP
Ethernet cables. You then use the patch cables to rearrange your
network as you like, as often as you like.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>SOHO, Bro!</b></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
SOHO environments
(small office/home office) do not always have the luxury of
implementing a structured cabling solution. But there are a number
of technologies that you can use to form a LAN without this.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>What’s the
Wi-Fi password?</b></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKsDC9r6LrE_byRZw9-qV9cKInYrg58P5i9LSqOPLAwI-3zEfOtNfno96vgxvJenGCTHwSt6Jz7ROxxE22IRhCWvMSpxG6pFNeroTWtq_V2R1KG5u4LWHKIcEfl63lDNv-GZTlw7p6m734/s1600/CoffeeShopPrivacy.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="351" data-original-width="525" height="133" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKsDC9r6LrE_byRZw9-qV9cKInYrg58P5i9LSqOPLAwI-3zEfOtNfno96vgxvJenGCTHwSt6Jz7ROxxE22IRhCWvMSpxG6pFNeroTWtq_V2R1KG5u4LWHKIcEfl63lDNv-GZTlw7p6m734/s200/CoffeeShopPrivacy.jpg" width="200" /></a></div>
<div style="line-height: 100%; margin-bottom: 0in;">
The most common and
quickest way to create a LAN is to go wireless. Wireless networks
are not as fast as wired networks, but for most purposes, they are
fast enough. Various wireless standards have been released over the
years, each of which varies in speed. In general, they are backwards
compatible with each other. Most wireless routers support multiple
standards anyway, so you don’t have to worry too much about
compatibility most of the time.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<table cellpadding="4" cellspacing="0" style="width: 100%px;">
<colgroup><col width="64*"></col>
<col width="64*"></col>
<col width="64*"></col>
<col width="64*"></col>
</colgroup><tbody>
<tr valign="top">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0.04in;" width="25%"><b>Standard</b></td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0.04in;" width="25%"><b>Max speed</b></td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0.04in;" width="25%"><b>Frequency</b></td>
<td style="border: 1px solid #000000; padding: 0.04in;" width="25%"><b>Range</b></td>
</tr>
<tr valign="top">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="25%">802.11b</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="25%">12 Mbps</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="25%">2.4Ghz</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="25%">300 feet</td>
</tr>
<tr valign="top">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="25%">802.11a (came out after b)</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="25%">54 Mbps</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="25%">5 GHz</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="25%">150 feet</td>
</tr>
<tr valign="top">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="25%">802.11g</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="25%">54 Mbps</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="25%">5 GHz</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="25%">300 feet</td>
</tr>
<tr valign="top">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="25%">802.11n</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="25%">100+ Mbps</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="25%">2.4 & 5 GHz</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="25%">300+ feet</td>
</tr>
<tr valign="top">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="25%">802.11ac</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="25%">1 Gbps</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="25%">5 GHz</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="25%">300+ feet</td>
</tr>
</tbody></table>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
Since Wi-Fi
transmits its data over the air, securing your Wi-Fi network is of
the utmost importance. The latest wireless security protocol is
<b style="background-color: yellow;">WPA2</b>—all the other standards are vulnerable to security flaws, so
you should <u>never use them</u>. Your wireless network should also
be password protected, otherwise anyone can connect to it. Another
way to secure your network is to configure your router to disable its
<b style="background-color: yellow;">SSID broadcast</b>, which is what causes your network to appear on a
device’s list of available networks. You can also enable <b style="background-color: yellow;">MAC
address filtering</b>, which only gives pre-approved devices access to
the network. Lastly, you should change the router’s administrator
password because routers are often all configured with the same
administrator password when they leave the factory.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
One downside to
Wi-Fi is that the wireless signal can be disrupted in many ways.
Thick or metallic walls in your building can weaken or stop a
wireless signal. Any devices that use the same parts of the wireless
spectrum can cause interference as well, such as baby monitors and
garage door openers (this is called radio frequency interference or
<b style="background-color: yellow;">RFI</b>). If you have neighbors that have their own wireless networks,
they can interfere with your network too. The parts of your building
that get weak or no signal are called <b style="background-color: yellow;">dead zones</b>.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAa41fjFf94_DEV0Y8gShRyOht08m51RgSOAO5d1SnMEHCachIL-S6KuCZ_G4zNU8sX60dr00jd-Imsr01eNwu1UCJrXFy_gfUSsUzPdNaulw7kK7dKRrmpqxhDO-Tnga1XV4J6t21J24j/s1600/Kit-mini-adaptoare-Powerline-AV200-TL-PA210KIT_3399_3.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="514" data-original-width="797" height="128" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAa41fjFf94_DEV0Y8gShRyOht08m51RgSOAO5d1SnMEHCachIL-S6KuCZ_G4zNU8sX60dr00jd-Imsr01eNwu1UCJrXFy_gfUSsUzPdNaulw7kK7dKRrmpqxhDO-Tnga1XV4J6t21J24j/s200/Kit-mini-adaptoare-Powerline-AV200-TL-PA210KIT_3399_3.jpg" width="200" /></a></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>Ethernet over
Power</b></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<style type="text/css">
@page { margin: 0.79in }
td p { margin-bottom: 0in }
p { margin-bottom: 0.1in; line-height: 120% }
</style>
<br />
<div style="line-height: 100%; margin-bottom: 0in;">
If Wi-Fi isn’t an
option for your particular environment, you can buy special devices
that plug into your electrical outlets which allow you to create an
Ethernet network using the electrical wiring of your house! This is
called <b style="background-color: yellow;">Ethernet over Power</b> (not to be confused with Power over
Ethernet, which supplies electrical power through an Ethernet
network). This is an example of a <b style="background-color: yellow;">bridge</b> because it connects two
dissimilar network technologies. Ethernet over Power only supports
speeds at around 100Mbps however, so it’s not very fast.</div>
Michael Angstadthttp://www.blogger.com/profile/04809821580827426849noreply@blogger.com0tag:blogger.com,1999:blog-5682413770770674096.post-14153109048945372812017-06-11T22:45:00.000-04:002017-06-11T22:45:21.239-04:00A Primer on IP AddressesJust like your have a home address that uniquely identifies your residence out of all the residences in the world, computers have IP addresses, which serve the same purpose. They uniquely identify a computer in a network so that it can receive messages from other computers.<br />
<br />
<b>IPv4</b><br />
<br />
IPv4 was created when the internet was born in 1981 and is still used today. It is the network communication protocol that computers use to talk to each other over the internet. An <span style="background-color: yellow;"><b>IPv4 address</b></span> is a unique identifier that is used to identify an individual computer that is connected to the internet. It is 32-bits long and is commonly represented in <b style="background-color: yellow;">dotted-decimal notation</b>. This notation divides the bits into four, 8-bit chunks and displays each chunk as a number ranging from 0 to 255. Each number is separated with a dot. For example: <span style="background-color: #eeeeee; font-family: Courier New, Courier, monospace;">192.168.2.1</span>.<br />
<br />
At its inception, the set of all possible IPv4 addresses, called the <b style="background-color: yellow;">address space</b>, was divided into “<b style="background-color: yellow;">classes</b>”. Each class contained a finite number of “chunks” of addresses. The number of addresses in each chunk varied depending on the class. The idea was that institutions, such as companies and schools, could purchase one of these chunks, and then dole out the addresses in the chunk to all the computers on their network. Larger institutions with lots of computers could purchase a more expensive, higher class chunk that had lots of addresses, while smaller institutions that had fewer computers could purchase a cheaper, lower class chunk that had fewer sub addresses.<br />
<br />
The classes are summarized below. If you want to learn more about the logic behind how they were organized, I suggest you read <a href="https://en.wikipedia.org/wiki/Classful_network">this Wikipedia page</a>.<br />
<style type="text/css">
@page { margin: 0.79in }
td p { margin-bottom: 0in }
p { margin-bottom: 0.1in; line-height: 120% }
</style>
<br />
<style type="text/css">
@page { margin: 0.79in }
td p { margin-bottom: 0in }
p { margin-bottom: 0.1in; line-height: 120% }
</style>
<br />
<table cellpadding="4" cellspacing="0" style="width: 100%px;">
<colgroup><col width="64*"></col>
<col width="64*"></col>
<col width="128*"></col>
</colgroup><tbody>
<tr valign="top">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0.04in;" width="25%">
<b>Class</b><br />
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0.04in;" width="25%">
<b>Number of chunks</b><br />
</td>
<td style="border: 1px solid #000000; padding: 0.04in;" width="50%">
<b>Number of addresses in each chunk</b><br />
</td>
</tr>
<tr valign="top">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="25%">
Class A<br />
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="25%">
128<br />
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="50%">
16,777,216<br />
</td>
</tr>
<tr valign="top">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="25%">
Class B<br />
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="25%">
16,384<br />
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="50%">
65,536<br />
</td>
</tr>
<tr valign="top">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="25%">
Class C<br />
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="25%">
2,097,152<br />
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="50%">
256<br />
</td>
</tr>
<tr valign="top">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="25%">
Class D<br />
</td>
<td colspan="2" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="75%">
<i>reserved</i><br />
</td>
</tr>
<tr valign="top">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="25%">
Class E<br />
</td>
<td colspan="2" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="75%">
<i>reserved</i><br />
</td>
</tr>
</tbody></table>
<br />
Do you see a problem here?<br />
<br />
The problem with this scheme was that companies were unlikely to use every address that was available to them. The choices for the number of addresses you could have varied wildly—you could have 16,777,216, 65,536, or 256! You couldn't have anything in between! If a company needed, say, 1,000 addresses, they had no choice but to purchase a Class B address and put all the rest to waste. To top it off, some of the organizations that were involved in the early development of the internet possessed Class A chunks, which they were hardly making any use of.<br />
<br />
This started to become a pressing issue as the internet grew. The risk that all IP addresses would be used up, called <a href="https://en.wikipedia.org/wiki/IPv4_address_exhaustion" style="background-color: yellow;"><b>IP address exhaustion</b></a>, became a real possibility.<br />
<br />
<b>CIDR</b><br />
<b><br /></b>
As shown, the way the class system divided up its chunks of addresses was very coarse-grained, which resulted in lots of wasted addresses. To combat this, the class system was done away with in 1993 and replaced with a system called <b style="background-color: yellow;">CIDR</b> (Classless Inter-Domain Routing). This system gives organizations many more choices regarding how many addresses they are assigned, which results in less wasted addresses.<br />
<br />
CIDR uses something called <b style="background-color: yellow;">variable-length subnet masking</b> (VLSM), which allows the address's subnet mask (the part that identifies which organization an address belongs to) to be of any size. The class system, on the other hand, only permitted the subnet mask to be 8 bits (Class A), 16 bits (Class B), or 24 bits (Class C) long. With CIDR, if your company only needed 1,000 addresses, you could purchase a 1,024 chunk (22-bit subnet mask, leaving 10-bits for the address, 2^10=1,024).<br />
<br />
CIDR notation consists of an IP address, followed by the number of bits the address uses for its subnet mask. For example, <span style="background-color: #eeeeee; font-family: Courier New, Courier, monospace;">192.168.100.14/22</span> represents the IP address <span style="background-color: #eeeeee;"><span style="font-family: Courier New, Courier, monospace;">192.168.100.14</span></span> with the first 22 bits of that address being the subnet mask.<br />
<br />
But CIDR is only a stop-gap measure. The IPv4 address space consists of about 4.3 billion addresses, which seems like a lot. But on a global scale, it is not. If the internet continues to grow, the IPv4 address space will soon run out. A more permanent solution would be to increase the length of the IP address. Enter IPv6.<br />
<br />
<b>IPv6</b><br />
<b><br /></b>
Created in 1998, IPv6 addresses are a whopping 128 bits long, resulting in an incredibly large address space of 3.4 x 10^38 (the number of grains of sand on Earth...or something?).<br />
<br />
IPv6 addresses are represented as eight, four character, hexadecimal strings separated by colons.<br />
<br />
<span style="background-color: #eeeeee;"><span style="font-family: Courier New, Courier, monospace;">FEDC:0000:0000:0000:00CF:0000:BA98:1234</span></span><br />
<span style="background-color: #eeeeee;"><span style="font-family: Courier New, Courier, monospace;"><br /></span></span>
Because they are so long, there are tricks you can employ to make them shorter. If a segment contains all zeroes, you can replace the segment with a single zero:<br />
<br />
<span style="background-color: #eeeeee;"><span style="font-family: Courier New, Courier, monospace;">FEDC:0:0:0:00CF:0:BA98:1234</span></span><br />
<span style="background-color: #eeeeee;"><span style="font-family: Courier New, Courier, monospace;"><br /></span></span>
If an address contains consecutive segments which consist of all zeroes, you can replace them with a double colon (but you can only use this trick once):<br />
<br />
<span style="background-color: #eeeeee; font-family: Courier New, Courier, monospace;">FEDC::00CF:0:BA98:1234</span><br />
<span style="background-color: #eeeeee; font-family: Courier New, Courier, monospace;"><br /></span>
And if a segment begins with zeroes, you can leave the zeroes out (unless the segment contains all zeroes, in which case you must leave one zero in):<br />
<br />
<span style="background-color: #eeeeee; font-family: Courier New, Courier, monospace;">FEDC::CF:0:BA98:1234</span><br />
<span style="background-color: #eeeeee; font-family: Courier New, Courier, monospace;"><br /></span>
IPv6 and IPv4 are not compatible with each other, which complicates the migration process. While it is likely that the network card in your computer supports both IPv4 and IPv6, the infrastructure around the globe that makes the internet work cannot switch over so easily. It will be a long and piecemeal process. But if all goes well, you won't even know it happened.Michael Angstadthttp://www.blogger.com/profile/04809821580827426849noreply@blogger.com0tag:blogger.com,1999:blog-5682413770770674096.post-78236371035713990952017-06-06T22:41:00.000-04:002017-06-06T22:41:43.489-04:00The Laser Printing Process<div style="line-height: 100%; margin-bottom: 0in;">
There are many
different kinds of printers on the market. In office environments,
laser printers are by far the most numerous. Not only do they
produce good quality printouts, but they are <i>fast</i><span style="font-style: normal;">,
which is important when you have people to please and deadlines to
meet.</span><i> </i> Therefore, computer technicians have to be very
familiar with how laser printers work so breakdowns can be fixed and
Janet can get her TPS reports on time.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
A laser printer
follows a specific process when printing a sheet of paper. The
process can be divided into seven steps.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>1. Processing</b></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0in;">
In order to start printing, the printer has to first receive print data from a computer. The program the user is
printing from (say, a word processor) has to first convert the
document to some kind of format the printer understands. Many
Windows applications use a system called GDI (graphical device
interface), which is used in conjunction with the specific printer
driver, to generate this print data.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0in;">
The application then
sends the print data to the <b style="background-color: yellow;">print spooler</b>, which is responsible for
queuing up print jobs and sending them one at a time to the printer.
Once the print job has been completely sent to the printer, it
disappears from the print spooler (whether the printer is done
printing it or not).</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0in;">
Note that, while it
is possible to cancel a print job from the print spooler, this only
stops the flow of information from the computer to the printer. For
example, if the spooler sends half of the print job before you cancel
it, the printer will print exactly that, even if the job is canceled
before any pages came out of the printer. Therefore, you should also
press the “stop” button on the printer itself to be sure the
printing truly stops (do not pull out the paper tray, as this could
jam the printer).</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>2. Charging</b></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0in;">
The rest of this
process is centered around an important part of the printer called the <b style="background-color: yellow;">drum</b>. The drum is a cylinder shaped component which is used to
transfer images onto the sheets of paper. It does this using positive and negative electrical charges.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0in;">
In the Charging
step, the primary corona wire (or primary charge roller) gives the
drum's surface a uniform negative electrical charge.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>3. Exposing</b></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0in;">
A <b style="background-color: yellow;">laser</b> draws a
positively charged image into the drum (hence the name, “laser
printer”).</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>4. Developing</b></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0in;">
Negatively-charged
toner particles attach themselves to the positively-charged parts of
the drum the laser drew from the last step. "<b style="background-color: yellow;">Toner</b>" is the stuff
that makes up the image on the piece of paper (it is a laser
printer's “ink”).</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>5. Transferring</b></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0in;">
Here is where the
actual piece of paper comes into play. The transfer corona (or
transfer roller) applies a positive charge to a sheet of paper.
Then, the negatively-charged toner particles on the drum attach
themselves to the positively-charged paper. Voila! The toner has
been “transferred” to the page.</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>6. Fusing</b></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
At this point, the
toner is simply resting on top of the page like a layer of dust. In
the Fusing step, the toner is melted onto the page using a heating
element called the <b style="background-color: yellow;">fuser</b> (toner is mostly made of plastic). Hot
Pockets! The page is now done!</div>
<div style="line-height: 100%; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0in;">
<b>7. Cleaning</b></div>
<style type="text/css">
@page { margin: 0.79in }
p { margin-bottom: 0.1in; line-height: 120% }
</style>
<br />
<div style="line-height: 100%; margin-bottom: 0in;">
Now that the page is
done, the printer has to be “reset” for the next page. Notably,
the drum must be cleaned. First, any residual toner is scraped off
using a rubber cleaning blade. Then, erase lamps give the drum a
neutral charge. Go back to step 2.</div>
Michael Angstadthttp://www.blogger.com/profile/04809821580827426849noreply@blogger.com0tag:blogger.com,1999:blog-5682413770770674096.post-66694647318135549812014-05-15T12:25:00.001-04:002014-05-15T12:25:28.701-04:005 Things You Might Not Know About Git<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhu4BpoRrq_v0Pnp7-CTuuD2P2_wl-QMXzVKKcAuCGCpPwSFCwePyl7UkgP4wPKhuL1c0f6WJDTO8rfnjx4c6mF4o9atw16LEfXCpE4gjflm5k0jrFZDEH4BBCF4Q6ht4P1jJ6uolsIchg2/s1600/logo.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhu4BpoRrq_v0Pnp7-CTuuD2P2_wl-QMXzVKKcAuCGCpPwSFCwePyl7UkgP4wPKhuL1c0f6WJDTO8rfnjx4c6mF4o9atw16LEfXCpE4gjflm5k0jrFZDEH4BBCF4Q6ht4P1jJ6uolsIchg2/s320/logo.png" /></a></div>
<a href="http://git-scm.com/">Git</a> is a version control system that has gained a lot of popularity over the past few years. It started out as a custom-designed VCS (version control system) for the Linux kernel and has since ballooned in popularity, arguably thanks to <a href="http://www.github.com">Github</a>, a free source code hosting site that is powered by Git. Below are five facts about Git that you might not know:
<h1>1. Stashing</h1>
<p>This command saves all the uncommitted modifications you've made to your working copy, and then reverts your working copy back to its original state. This is useful if you want to switch branches, but your changes are in an incomplete state and you don't want to commit anything yet (git will not allow you to switch branches if you have uncommitted changes).</p>
<p>The command to run a stash operation is <code>git stash</code>. When you're ready to re-apply your stashed changes, run <code>git stash apply</code>.</p>
<p>You can also create multiple stashes. To see a list of all stashes, run <code>git stash list</code>. By default, when you run <code>git stash apply</code>, it will apply the stash at the top of the list. To apply a different stash, run <code>git stash apply stash@{2}</code> where <code>stash@{2}</code> is the name of the stash as shown in the stash list.</p>
<p>Also note that when you apply a stash, it will remain in the stash list. To delete a stash, run <code>git stash drop</code>. Or, you can run <code>git stash pop</code> to apply a stash and then delete it.</p>
<p>Stashes are only stored in your local repository. They cannot be pushed to remote repositories.</p>
<p>For more information, see: <a href="http://git-scm.com/book/en/Git-Tools-Stashing">http://git-scm.com/book/en/Git-Tools-Stashing</a></p>
<h1>2. Amending commits</h1>
<p>With most other version control systems, if you forgot to include a file in a commit, you have to make a second commit. This is annoying because it makes the commit history longer than it should be. With Git, instead of making a second commit, you can "amend" the previous commit. This will merge your commit in with the previous one.</p>
<pre><code>> git commit --amend
</code></pre>
<p>For more information, see: <a href="http://git-scm.com/book/en/Git-Basics-Undoing-Things">http://git-scm.com/book/en/Git-Basics-Undoing-Things</a></p>
<h1>3. Git is a file system</h1>
<p>At its core, Git is actually a key/value data store. The commands that you use on a daily basis, like <code>push</code> and <code>commit</code>, are tools that are built on <strong>top</strong> of the data store. To demonstrate, I'll show you how to add and retrieve files from a Git repository, without using any of the typical Git commands.</p>
<p>First, initialize an empty repository:</p>
<pre><code>> git init
Initialized empty Git repository in /home/michael/git-blog/.git/
</code></pre>
<p>Next, add a file to the repository. This command will return a SHA-1 hash, which we will need to retrieve the file again.</p>
<pre><code>> echo 'file data' | git hash-object -w --stdin
987721052266a93a2509c3a8ac9e8c86341d0835
</code></pre>
<p>Then, retrieve the file like so:</p>
<pre><code>> git cat-file -p 987721052266a93a2509c3a8ac9e8c86341d0835
file data
</code></pre>
<p>For more information, see: <a href="http://git-scm.com/book/en/Git-Internals-Git-Objects">http://git-scm.com/book/en/Git-Internals-Git-Objects</a></p>
<h1>4. Commit message templates</h1>
<p>If you work in a corporate environment, your team might have a policy on how commit messages have to be formatted. Git allows you to define a file that contains the default commit message to use for all commits.</p>
<pre><code>> git config --global commit.template path/to/commit-message.txt
</code></pre>
<p>For more information, see: <a href="http://git-scm.com/book/en/Customizing-Git-Git-Configuration">http://git-scm.com/book/en/Customizing-Git-Git-Configuration</a></p>
<h1>5. Ignoring files during export</h1>
<p>Git includes a command that lets you easily generate an archive file (.zip, .tar, etc) of your project. By default, all files in your project are included, but there may be some files which you want to exclude. To do this, use the <code>export-ignore</code> attribute:</p>
<pre><code>> echo "test/ export-ignore" > .gitattributes
> git add .gitattributes
> git commit -m "Added .gitattributes file."
> git archive -o latest.zip HEAD
</code></pre>
<p>For more information, see: <a href="http://git-scm.com/book/en/Customizing-Git-Git-Attributes">http://git-scm.com/book/en/Customizing-Git-Git-Attributes</a></p>Michael Angstadthttp://www.blogger.com/profile/04809821580827426849noreply@blogger.com0tag:blogger.com,1999:blog-5682413770770674096.post-2840841951704681932014-05-01T14:53:00.000-04:002014-05-01T14:58:09.362-04:00Presenter First: An Overview<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhH4gNcFgbt1AVwu4D1wZ1rhm1-g_bJzo9qK7dyyZhXDd5HPvn0yMHvKB_xKic1tzj7-MgI9ZLHZN0WGc51o0MJgaa7YGiiWWOpYiqzkcmI2cS6BkZ_S9u0GFTpu0FygHbseqKuqo6EMEwV/s1600/diagram.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhH4gNcFgbt1AVwu4D1wZ1rhm1-g_bJzo9qK7dyyZhXDd5HPvn0yMHvKB_xKic1tzj7-MgI9ZLHZN0WGc51o0MJgaa7YGiiWWOpYiqzkcmI2cS6BkZ_S9u0GFTpu0FygHbseqKuqo6EMEwV/s320/diagram.png" /></a></div>
<p>Writing GUI applications can be difficult. It's easier to understand the flow of a command-line program--you start at the top and go to the bottom. But the flow of a GUI application, with its listeners, event handlers, and callbacks, goes all over the place. Add database queries and network calls to the mix, and things get even more complicated.</p>
<h1>Enter MVP</h1>
<p>The Model-View-Presenter (MVP) pattern helps to manage this complexity. MVP belongs to that family of design patterns that separates the application data and logic from the way in which the information is displayed to the user. To summarize:</p>
<ul>
<li>The <em>Model</em> is responsible for maintaining the application's raw data (typically by persisting it in a database).</li>
<li>The <em>View</em> is responsible for presenting the data to the user (for example, in the form of a webpage or dialog box).</li>
<li>And the <em>Presenter</em> is responsible for tying the model and view together. In MVP, <em>the model and view know nothing of each other!</em></li>
</ul>
<h1>Presenter First</h1>
<p>The idea with "Presenter First" is that, using the MVP pattern, you start by writing the presenter class before anything else. This forces you to think abstractly about how your dialog window is going to behave. And, in the process of writing the presenter, you naturally figure out what functionalities the model and view will need to support. So, writing the model and view becomes just a matter of implementing an interface.</p>
<p>Another benefit to Presenter First is that it allows you to unit test your dialog's application logic. This is because the model and view are represented as interfaces, which can be easily mocked-out in the unit tests.</p>
<p>To summarize, the three benefits of Presenter First are:</p>
<ol>
<li>By using MVP, the view is cleanly separated from the application data and logic. In other words, your JFrame and JDialog classes become truly "dumb"--they contain no database calls or application logic.</li>
<li>In the process of writing the presenter, the APIs for the model and view are essentially written automatically.</li>
<li>The application logic of your dialog is finally unit-testable!</li>
</ol>
<h1>Example</h1>
<p>As an example, let's create a simple login dialog. This dialog will ask the user for a username and password. If the credentials are valid, then a session token will be returned and the dialog will close. The user can also choose to have the application remember his username and password.</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6FmTJ3cLsVUPG_74E539OT6SSQ-ovMZ4D4-KR4dhkcRXi40zdZ0ieC4DiNGMrNcvRtvjmCZ3hivDmpVNuWmfqms_dWnHa4aPSw7jWeDls9GQfEGyhAcZtT-C7fvCWB0y9aH3cDEBU8VtG/s1600/login-dialog.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6FmTJ3cLsVUPG_74E539OT6SSQ-ovMZ4D4-KR4dhkcRXi40zdZ0ieC4DiNGMrNcvRtvjmCZ3hivDmpVNuWmfqms_dWnHa4aPSw7jWeDls9GQfEGyhAcZtT-C7fvCWB0y9aH3cDEBU8VtG/s320/login-dialog.png" /></a></div>
<p>We start by writing the presenter class.</p>
<p><em>LoginPresenter.java</em></p>
<pre class="brush:java">import java.awt.event.*;
public class LoginPresenter{
private final ILoginView view;
private final ILoginModel model;
public LoginPresenter(ILoginView view, ILoginModel model){
this.view = view;
this.model = model;
//invoked when the user clicks "Login"
view.addLoginListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent event){
onLogin();
}
});
//invoked when the user clicks "Cancel" or closes the window
view.addCancelListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent event){
onCancel();
}
});
//populate the dialog with its initial data
view.setUsername(model.getCachedUsername());
view.setPassword(model.getCachedPassword());
view.setRememberMe(model.getCachedRememberMe());
//finally, display the dialog
view.display();
}
private void onLogin(){
//get the data that the user entered
String username = view.getUsername();
String password = view.getPassword();
boolean rememberMe = view.getRememberMe();
//send the network call to log the user in
String session = model.login(username, password);
if (session == null){
//credentials were bad, so show an error dialog to the user
view.onBadLogin();
return;
}
//persist the login credentials if "remember me" is checked
if (rememberMe){
model.setCachedUsername(username);
model.setCachedPassword(password);
} else {
model.setCachedUsername("");
model.setCachedPassword("");
}
model.setCachedRememberMe(rememberMe);
model.setSession(session);
view.onSuccessfulLogin();
view.close();
}
private void onCancel(){
view.close();
}
}
</pre>
<p>The constructor adds event handlers which will fire with the user presses the "Login" and "Cancel" buttons. Then, it populates the view with data from the model (in this case, the saved username and password). The "onLogin()" method contains logic which determines if the login was successful or not and acts accordingly.</p>
<p>Now that our presenter is written, we can write the model and view interfaces, which allows the presenter class to compile.</p>
<p><em>ILoginModel.java</em></p>
<pre class="brush:java">public interface ILoginModel{
String login(String username, String password);
String getCachedUsername();
void setCachedUsername(String username);
String getCachedPassword();
void setCachedPassword(String password);
boolean getCachedRememberMe();
void setCachedRememberMe(boolean rememberMe);
String getSession();
void setSession(String session);
}
</pre>
<p><em>ILoginView.java</em></p>
<pre class="brush:java">import java.awt.event.*;
public interface ILoginView{
void addLoginListener(ActionListener listener);
void addCancelListener(ActionListener listener);
String getUsername();
void setUsername(String username);
String getPassword();
void setPassword(String password);
boolean getRememberMe();
void setRememberMe(boolean rememberMe);
void onBadLogin();
void onSuccessfulLogin();
void display();
void close();
}
</pre>
<p>Next, we write our tests! Using a stubbing framework like <a href="https://code.google.com/p/mockito/">Mockito</a> helps, but it's not required (you could always create your own test implementations of the model and view interfaces).</p>
<p><em>LoginPresenterTest.java</em></p>
<pre class="brush:java">import java.awt.event.*;
import java.util.*;
import org.junit.*;
import org.mockito.invocation.*;
import org.mockito.stubbing.*;
import static org.mockito.Mockito.*;
public class LoginPresenterTest{
@Test
public void init(){
ILoginView view = mock(ILoginView.class);
ILoginModel model = mock(ILoginModel.class);
when(model.getCachedUsername()).thenReturn("user");
when(model.getCachedPassword()).thenReturn("password");
when(model.getCachedRememberMe()).thenReturn(true);
LoginPresenter presenter = new LoginPresenter(view, model);
verify(view).addLoginListener(any(ActionListener.class));
verify(view).addCancelListener(any(ActionListener.class));
verify(view).setUsername("user");
verify(view).setPassword("password");
verify(view).setRememberMe(true);
verify(view).display();
}
@Test
public void bad_login(){
ILoginView view = mock(ILoginView.class);
when(view.getUsername()).thenReturn("user");
when(view.getPassword()).thenReturn("password");
ListenerAnswer loginAnswer = new ListenerAnswer();
doAnswer(loginAnswer).when(view).addLoginListener(any(ActionListener.class));
ILoginModel model = mock(ILoginModel.class);
when(model.login("user", "password")).thenReturn(null); //"null" = bad login
LoginPresenter presenter = new LoginPresenter(view, model);
//click "login"
loginAnswer.fire();
verify(model, never()).setSession(anyString());
verify(view, never()).onSuccessfulLogin();
verify(view).onBadLogin();
verify(view, never()).close();
}
@Test
public void valid_login(){
ILoginView view = mock(ILoginView.class);
when(view.getUsername()).thenReturn("user");
when(view.getPassword()).thenReturn("password");
ListenerAnswer loginAnswer = new ListenerAnswer();
doAnswer(loginAnswer).when(view).addLoginListener(any(ActionListener.class));
ILoginModel model = mock(ILoginModel.class);
when(model.login("user", "password")).thenReturn("abc123"); //non-null token = good login
LoginPresenter presenter = new LoginPresenter(view, model);
//click "login"
loginAnswer.fire();
verify(model).setSession("abc123");
verify(view, never()).onBadLogin();
verify(view).onSuccessfulLogin();
verify(view).close();
}
@Test
public void rememberMe_true(){
ILoginView view = mock(ILoginView.class);
when(view.getUsername()).thenReturn("user");
when(view.getPassword()).thenReturn("password");
when(view.getRememberMe()).thenReturn(true);
ListenerAnswer loginAnswer = new ListenerAnswer();
doAnswer(loginAnswer).when(view).addLoginListener(any(ActionListener.class));
ILoginModel model = mock(ILoginModel.class);
when(model.login("user", "password")).thenReturn("abc123");
LoginPresenter presenter = new LoginPresenter(view, model);
//click "login"
loginAnswer.fire();
verify(model).setCachedUsername("user");
verify(model).setCachedPassword("password");
verify(model).setCachedRememberMe(true);
}
@Test
public void rememberMe_false(){
ILoginView view = mock(ILoginView.class);
when(view.getUsername()).thenReturn("user");
when(view.getPassword()).thenReturn("password");
when(view.getRememberMe()).thenReturn(false);
ListenerAnswer loginAnswer = new ListenerAnswer();
doAnswer(loginAnswer).when(view).addLoginListener(any(ActionListener.class));
ILoginModel model = mock(ILoginModel.class);
when(model.login("user", "password")).thenReturn("abc123");
LoginPresenter presenter = new LoginPresenter(view, model);
//click "login"
loginAnswer.fire();
verify(model).setCachedUsername("");
verify(model).setCachedPassword("");
verify(model).setCachedRememberMe(false);
}
@Test
public void cancel(){
ILoginView view = mock(ILoginView.class);
ListenerAnswer cancelAnswer = new ListenerAnswer();
doAnswer(cancelAnswer).when(view).addCancelListener(any(ActionListener.class));
ILoginModel model = mock(ILoginModel.class);
LoginPresenter presenter = new LoginPresenter(view, model);
//click "cancel"
cancelAnswer.fire();
verify(model, never()).setSession(anyString());
verify(view).close();
}
private class ListenerAnswer implements Answer<Object>{
private final List<ActionListener> listeners = new ArrayList<ActionListener>();
public Object answer(InvocationOnMock invocation) {
ActionListener listener = (ActionListener)invocation.getArguments()[0];
listeners.add(listener);
return null;
}
public void fire(){
for (ActionListener listener : listeners){
listener.actionPerformed(null);
}
}
}
}
</pre>
<p>Once our tests pass, we can write the real implementations of the model and view interfaces. Again, this is basically just a matter of creating a new class and having that class implement the interface.</p>
<p><em>LoginViewImpl.java</em></p>
<pre class="brush:java">import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import static javax.swing.SpringLayout.*;
public class LoginViewImpl extends JFrame implements ILoginView {
private final JButton login, cancel;
private final JTextField username;
private final JPasswordField password;
private final JCheckBox rememberMe;
public LoginViewImpl() {
setTitle("Login");
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
login = new JButton("Login");
cancel = new JButton("Cancel");
username = new JTextField();
password = new JPasswordField();
rememberMe = new JCheckBox("Remember me");
JLabel title = new JLabel("Please enter your login credentials.");
JLabel usernameLabel = new JLabel("Username:");
JLabel passwordLabel = new JLabel("Password:");
///////////////////////
Container contentPane = getContentPane();
SpringLayout layout = new SpringLayout();
contentPane.setLayout(layout);
contentPane.add(title);
contentPane.add(usernameLabel);
contentPane.add(username);
contentPane.add(passwordLabel);
contentPane.add(password);
contentPane.add(rememberMe);
contentPane.add(login);
contentPane.add(cancel);
layout.putConstraint(WEST, title, 5, WEST, contentPane);
layout.putConstraint(NORTH, title, 5, NORTH, contentPane);
layout.putConstraint(WEST, usernameLabel, 5, WEST, contentPane);
layout.putConstraint(NORTH, usernameLabel, 10, SOUTH, title);
layout.putConstraint(WEST, username, 10, EAST, usernameLabel);
layout.putConstraint(NORTH, username, 0, NORTH, usernameLabel);
layout.putConstraint(EAST, username, 100, WEST, username);
layout.putConstraint(WEST, passwordLabel, 5, WEST, contentPane);
layout.putConstraint(NORTH, passwordLabel, 5, SOUTH, usernameLabel);
layout.putConstraint(WEST, password, 0, WEST, username);
layout.putConstraint(NORTH, password, 0, NORTH, passwordLabel);
layout.putConstraint(EAST, password, 100, WEST, password);
layout.putConstraint(WEST, rememberMe, 5, WEST, contentPane);
layout.putConstraint(NORTH, rememberMe, 5, SOUTH, passwordLabel);
layout.putConstraint(WEST, login, 5, WEST, contentPane);
layout.putConstraint(NORTH, login, 10, SOUTH, rememberMe);
layout.putConstraint(WEST, cancel, 5, EAST, login);
layout.putConstraint(NORTH, cancel, 0, NORTH, login);
setSize(300,200);
setLocationRelativeTo(null);
}
public void addLoginListener(ActionListener listener) {
login.addActionListener(listener);
username.addActionListener(listener);
password.addActionListener(listener);
}
public void addCancelListener(final ActionListener listener) {
cancel.addActionListener(listener);
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent event){
listener.actionPerformed(null);
}
});
}
public String getUsername() {
return username.getText();
}
public void setUsername(String username) {
this.username.setText(username);
}
public String getPassword() {
return new String(password.getPassword());
}
public void setPassword(String password){
this.password.setText(password);
}
public boolean getRememberMe() {
return rememberMe.isSelected();
}
public void setRememberMe(boolean rememberMe) {
this.rememberMe.setSelected(rememberMe);
}
public void onBadLogin() {
JOptionPane.showMessageDialog(this, "Invalid login credentials.");
}
public void onSuccessfulLogin() {
JOptionPane.showMessageDialog(this, "Login successful.");
}
public void display() {
setVisible(true);
}
public void close() {
dispose();
}
}
</pre>
<p><em>LoginModelImpl.java</em></p>
<pre class="brush:java">import java.io.*;
import java.util.*;
public class LoginModelImpl implements ILoginModel{
private final File file;
private final Properties properties;
private String session;
public LoginModelImpl(File file) throws IOException{
this.file = file;
this.properties = new Properties();
if (file.exists()){
this.properties.load(new FileReader(file));
}
}
public String login(String username, String password){
//normally, a network or database call would be made here
if ("test".equals(username) && "test".equals(password)){
return "abc123";
}
return null;
}
public String getCachedUsername(){
return properties.getProperty("username");
}
public void setCachedUsername(String username){
properties.setProperty("username", username);
save();
}
public String getCachedPassword(){
return properties.getProperty("password");
}
public void setCachedPassword(String password){
properties.setProperty("password", password);
save();
}
public boolean getCachedRememberMe(){
String value = properties.getProperty("rememberMe");
return (value == null) ? false : Boolean.parseBoolean(value);
}
public void setCachedRememberMe(boolean rememberMe){
properties.setProperty("rememberMe", rememberMe + "");
save();
}
public String getSession(){
return session;
}
public void setSession(String session){
this.session = session;
}
private void save() {
try {
properties.store(new FileWriter(file), "");
} catch (IOException e){
throw new RuntimeException(e);
}
}
}
</pre>
<p>To run our program, we simply create a new instance of LoginPresenter, passing in the model and view implementations that we created above.</p>
<p><em>Main.java</em></p>
<pre class="brush:java">import java.io.*;
public class Main{
public static void main(String args[]) throws Throwable {
File cache = new File("cache.properties");
ILoginModel model = new LoginModelImpl(cache);
ILoginView view = new LoginViewImpl();
new LoginPresenter(view, model);
}
}
</pre>
<p>And that's all there is to it!</p>
<p><a href="http://mikeangstadt.name/blog/presenter-first-sample.zip">Download the source code</a></p>
<p>References:</p>
<ul>
<li><a href="http://atomicobject.com/pages/Presenter+First">http://atomicobject.com/pages/Presenter+First</a></li>
<li><a href="http://atomicobject.com/files/PresenterFirstAgile2006.pdf">Presenter First: Organizing Complex GUI Applications
for Test-Driven Development</a></li>
</ul>
Michael Angstadthttp://www.blogger.com/profile/04809821580827426849noreply@blogger.com1tag:blogger.com,1999:blog-5682413770770674096.post-51383148654710753832013-09-07T20:19:00.000-04:002013-09-07T20:23:37.845-04:00Adding syntax highlighting to Javadocs<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzOxG411KZtTTyQApF3S2pfQUc6kvKXQvWYSa6W0blPUnzjivEbPDMWCOMWZ1zmzFOZlmzJG7B2eYUEu4gWni15ZyEN69D4Jvgex09wHe0cqKz16TMtsCdHgo5P590LB31kh98O8yQjWdj/s1600/peacock.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzOxG411KZtTTyQApF3S2pfQUc6kvKXQvWYSa6W0blPUnzjivEbPDMWCOMWZ1zmzFOZlmzJG7B2eYUEu4gWni15ZyEN69D4Jvgex09wHe0cqKz16TMtsCdHgo5P590LB31kh98O8yQjWdj/s400/peacock.jpg" /></a></div>
<p>Often times, when writing Javadocs, it helps to include source code samples along with the documentation. Typically, this is achieved by inserting the source code into a <code><pre></code> tag. This will render the code in a monospaced font when viewed in a browser.</p>
<pre class="brush:java">/**
* <p>Represents a fruit.</p>
* <pre>
* //create a new fruit
* Fruit fruit = new Fruit("banana");
*
* //copy an existing fruit
* Fruit copy = new Fruit(fruit);
* </pre>
* @author John Doe
*/
public class Fruit{
...
}
</pre>
<p>But there tools out there that can add syntax highlighting to source code on a web page. Javadocs are a webpage. Why can't these syntax highlighting tools be applied to Javadocs as well?</p>
<p>In this blog post, I am going to show you how to add syntax highlighting to a Maven-enabled Java project. I will be using the popular Javascript-based <a href="http://alexgorbatchev.com/SyntaxHighlighter/">SyntaxHighlighter</a> library for the syntax highlighting.</p>
<h1>1. Download SyntaxHighligher</h1>
<p>First, <a href="http://alexgorbatchev.com/SyntaxHighlighter/download/">download SyntaxHighlighter</a>.</p>
<h1>2. Create a CSS file</h1>
<p>SyntaxHighlighter makes use of CSS styling to perform the code coloring. Luckily, the Javadoc tool allows you to specify a CSS file to customize the look and feel of your Javadoc webpage. So, we will need to create a CSS file that contains the styling that SyntaxHighlighter requires.</p>
<p>Navigate to the SyntaxHighlighter files that you downloaded in the previous step. In the "styles" directory, locate the "shCore.css" file and one of the "shTheme" files (such as "shThemeDefault.css", see: <a href="http://alexgorbatchev.com/SyntaxHighlighter/manual/themes/">all the available themes</a>). Combine these two files into a single file and give it a name of your choosing. Save this file somewhere within your project folder. The location doesn't matter, since Javadoc will end up copying the file when the Javadocs are generated. A good place is the "src/main/javadoc" folder, as this is the standard Maven location for all Javadoc-related resources.</p>
<h1>3. Configure your POM file</h1>
<p>Next, we will need to add some configuration settings to the project POM. In the configuration section of the "maven-javadoc-plugin" plugin, add the following: (1) the location of the CSS file that was created in the previous step, (2) <code><script></code> tags for the SyntaxHighlighter Javascript files, and (3) Javascript code to configure and initialize SyntaxHighlighter.</p>
<pre class="brush:xml"><plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.8.1</version>
<configuration>
<!-- (1) CSS file location -->
<stylesheetfile>src/main/javadoc/syntax-highlighter.css</stylesheetfile>
<!-- (2) SyntaxHighlighter Javascript files -->
<top><![CDATA[
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js" type="text/javascript"></script>
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJava.js" type="text/javascript"></script>
]]></top>
<!--
(3) SyntaxHighlighter configuration and initialization
See: http://alexgorbatchev.com/SyntaxHighlighter/manual/configuration/
-->
<footer><![CDATA[
<script type="text/javascript">
SyntaxHighlighter.defaults["auto-links"] = false;
SyntaxHighlighter.defaults["tab-size"] = 2;
SyntaxHighlighter.all();
</script>
]]></footer>
</configuration>
</plugin>
</pre>
<p>A list of available SyntaxHighlighter configuration settings can be found on the <a href="http://alexgorbatchev.com/SyntaxHighlighter/manual/configuration/">SyntaxHighlighter homepage</a>.</p>
<h1>4. Modify the Javadocs</h1>
<p>Each <code><pre></code> tag in the Javadocs must be given a <code>class="brush:java"</code> attribute. This signals to SyntaxHighlighter that the text content should be treated as Java source code.</p>
<pre class="brush:java; highlight:3">/**
* <p>Represents a fruit.</p>
* <pre class="brush:java">
* //create a new fruit
* Fruit fruit = new Fruit("banana");
*
* //copy an existing fruit
* Fruit copy = new Fruit(fruit);
* </pre>
* @author John Doe
*/
public class Fruit{
...
}
</pre>
<h1>5. Generate the Javadocs</h1>
<p>Instruct Maven to generate the Javadocs for the project by running the following command:</p>
<p><code>mvn javadoc:javadoc</code></p>
<p>And that's it! You should be good to go.</p>
<p>References:</p>
<ul>
<li>Syntaxhighlighter homepage: <a href="http://alexgorbatchev.com/SyntaxHighlighter/">http://alexgorbatchev.com/SyntaxHighlighter/</a></li>
<li>Maven Javadoc plugin docs: <a href="http://maven.apache.org/plugins/maven-javadoc-plugin/javadoc-mojo.html">http://maven.apache.org/plugins/maven-javadoc-plugin/javadoc-mojo.html</a></li>
</ul>
Michael Angstadthttp://www.blogger.com/profile/04809821580827426849noreply@blogger.com5