title_0
{"item":{"status":"visible","url":"\/2013\/09\/27\/Unresponsive-keyboard-on-Samsung-700Z-Laptop-in-Windows-7\/","trash":"","name":"Unresponsive-keyboard-on-Samsung-700Z-Laptop-in-Windows-7","parent":"","title":"Unresponsive keyboard on Samsung 700Z Laptop in Windows 7","date":"2013-09-27 02:43:03","filepath":"posts\/20130927_Unresponsive-keyboard-on-Samsung-700Z-Laptop-in-Windows-7.xml.json","type":"post","content":"<p><br \/><img style=\"float: left;\" src=\"http:\/\/www.8bitrobot.com\/media\/uploads\/samsung700Z.jpg\" alt=\"\" height=\"150\" \/>After trying unsuccessfully to get a Japanese USB keyboard working on Windows 7, I found my Samsung Laptop keyboard and touchpad disabled. It appears Samsung uses special scan codes to enable\/disable the touchpad and keyboard. The Japanese keyboard just happened to be able to issue one of those scan codes.<\/p>\n<p>So, I inadvertently hit one of the keys and a \"Hold: ON\" message flashed on the screen. I didn't think anything of it until trying to type and move the cursor. Damn! I was stuck with the external keyboard and mouse until everything was backed out and fixed.<\/p>\n<p>Restarting the laptop did nothing. Although the keyboard worked fine during bios\/TrueCrypt authentication, it would revert back to being broken after booting the OS.<\/p>\n<p>The Device Manager displayed for the Standard PS\/2 Keyboard and the ELAN PS\/2 Port Smart-Pad an error similar to the following:<\/p>\n<p style=\"padding-left: 30px;\"><em>Windows a driver for this device has been disabled. An alternate driver may be providing this functionality.<\/em><\/p>\n<p>Uninstalling the keyboard driver and reinstalling it didn't seem to fix it, nor did powering everything down and using a paperclip to disconnect the battery.<\/p>\n<p><strong>What did work was disabling the keyboard and touchpad and re-enabling them<\/strong>. After a reboot, they were once again functioning.<\/p>"}}
title_1
{"item":{"status":"visible","url":"\/2013\/09\/23\/Christina-s-World-by-Andrew-Wyeth\/","trash":"","name":"Christina-s-World-by-Andrew-Wyeth","parent":"","title":"Christina's World by Andrew Wyeth","date":"2013-09-23 19:15:24","filepath":"posts\/20130923_Christina-s-World-by-Andrew-Wyeth.xml.json","type":"post","content":"<p style=\"text-align: center;\"><a href=\"https:\/\/en.wikipedia.org\/wiki\/Christina%27s_World\"><img style=\"vertical-align: middle;\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/en\/a\/a2\/Christinasworld.jpg\" alt=\"\" width=\"395\" height=\"265\" \/><\/a><\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/en.wikipedia.org\/wiki\/Christina%27s_World\">Christina's World by Andrew Wyeth<\/a><\/p>"}}
title_2
{"item":{"status":"visible","url":"\/2013\/09\/05\/Gifs-from-the-bottom-of-Jacobs-Ladder\/","trash":"","name":"Gifs-from-the-bottom-of-Jacobs-Ladder","parent":"","title":"Gifs from the bottom of Jacobs Ladder","date":"2013-09-05 01:33:59","filepath":"posts\/20130905_Gifs-from-the-bottom-of-Jacobs-Ladder.xml.json","type":"post","content":"<p>These gifs are partly glitches and partly intentional image manipulation. The result is something that \"will make you question your sanity.\"<\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.collegehumor.com\/pictures\/gallery\/6884588\/22-broken-gifs-thatll-probably-make-you-question-your-sanity\"><img src=\"http:\/\/www.8bitrobot.com\/media\/uploads\/greepy.gif\" alt=\"\" width=\"300\" \/><\/a><\/p>\n<p style=\"text-align: left;\">via <a href=\"http:\/\/www.jwz.org\/blog\/\">jwz.org<\/a><\/p>"}}
title_3
{"item":{"status":"visible","url":"\/2013\/08\/20\/40-Maps-to-explain-the-world\/","trash":"","name":"40-Maps-to-explain-the-world","parent":"","title":"40 Maps to explain the world","date":"2013-08-20 01:35:27","filepath":"posts\/20130820_40-Maps-to-explain-the-world.xml.json","type":"post","content":"<p>Here is a series of maps that would be excellent source material for someone looking at a map and choosing which country to move to.<\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.washingtonpost.com\/blogs\/worldviews\/wp\/2013\/08\/12\/40-maps-that-explain-the-world\/\" target=\"_blank\"><img style=\"vertical-align: middle; border: 1px solid black; margin: 10px;\" src=\"http:\/\/www.washingtonpost.com\/blogs\/worldviews\/files\/2013\/08\/openness4.jpg\" alt=\"\" width=\"400\" \/><\/a><\/p>\n<p style=\"text-align: left;\">source: <a href=\"http:\/\/www.washingtonpost.com\/\">Washington Post<\/a><\/p>"}}
title_4
{"item":{"status":"visible","url":"\/2013\/08\/14\/How-to-compile-Mongoose-HTTP-server-on-mingw\/","trash":"","name":"How-to-compile-Mongoose-HTTP-server-on-mingw","parent":"","title":"How to compile Mongoose HTTP server on mingw","date":"2013-08-14 03:17:48","filepath":"posts\/20130814_How-to-compile-Mongoose-HTTP-server-on-mingw.xml.json","type":"post","content":"<p><img style=\"float: left; margin: 10px;\" src=\"http:\/\/www.8bitrobot.com\/media\/uploads\/2012\/01\/gear.png\" alt=\"\" width=\"60\" height=\"64\" \/>The open source project <a href=\"https:\/\/github.com\/valenok\/mongoose\" target=\"_blank\">Mongoose<\/a> is a tiny HTTP server written in C. I wanted to try it out using a free compiler on my Windows box, g++ on mingw, and had to resort to this hack to get it compiled:<\/p>\n<ol>\n<li>Use git to clone the project from github<\/li>\n<li>Copy the example <span style=\"font-family: 'courier new', courier;\">hello.c<\/span> in examples to the parent directory<\/li>\n<li>Apply the patch below to <span style=\"font-family: 'courier new', courier;\">mongoose.c<\/span><\/li>\n<li>Then build: <span style=\"font-family: 'courier new', courier;\">g++ mongoose.c hello.c -lpthread -lwsock32<\/span><\/li>\n<\/ol>\n<p>The patch (apply with <span style=\"font-family: 'courier new', courier;\">patch -p0 < file.patch<\/span>):<\/p>\n<pre>diff --git mongoose.c mongoose.c\nindex 47cd9be..c324136 100644\n--- mongoose.c\n+++ mongoose.c\n@@ -108,8 +108,10 @@ typedef long off_t;\n #define strtoll(x, y, z) _atoi64(x)\n #else\n #define __func__ __FUNCTION__\n-#define strtoull(x, y, z) _strtoui64(x, y, z)\n-#define strtoll(x, y, z) _strtoi64(x, y, z)\n+\/\/#define strtoull(x, y, z) _strtoui64(x, y, z)\n+\/\/#define strtoll(x, y, z) _strtoi64(x, y, z)\n+#define strtoull(x, y, z) (unsigned __int64) _atoi64(x)\n+#define strtoll(x, y, z) _atoi64(x)\n #endif \/\/ _MSC_VER\n \n #define ERRNO GetLastError()\n@@ -1630,7 +1632,7 @@ static int alloc_vprintf2(char **buf, const char *fmt, va_list ap) {\n *buf = NULL;\n while (len == -1) {\n if (*buf) free(*buf);\n- *buf = malloc(size *= 4);\n+ *buf = (char*)malloc(size *= 4);\n if (!*buf) break;\n va_copy(ap_copy, ap);\n len = vsnprintf(*buf, size, fmt, ap_copy);\n@@ -4596,7 +4598,7 @@ static int set_ports_option(struct mg_context *ctx) {\n \/\/ On Windows, SO_REUSEADDR is recommended only for\n \/\/ broadcast UDP sockets\n setsockopt(so.sock, SOL_SOCKET, SO_REUSEADDR,\n- (void *) &on, sizeof(on)) != 0 ||\n+ (char *) (&on), sizeof(on)) != 0 ||\n #if defined(USE_IPV6)\n (so.lsa.sa.sa_family == AF_INET6 &&\n setsockopt(so.sock, IPPROTO_IPV6, IPV6_V6ONLY, (void *) &off,\n@@ -5209,8 +5211,8 @@ static int set_sock_timeout(SOCKET sock, int milliseconds) {\n t.tv_sec = milliseconds \/ 1000;\n t.tv_usec = (milliseconds * 1000) % 1000000;\n #endif\n- return setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (void *) &t, sizeof(t)) ||\n- setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (void *) &t, sizeof(t));\n+ return setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *) &t, sizeof(t)) ||\n+ setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char *) &t, sizeof(t));\n }\n \n static void accept_new_connection(const struct socket *listener,\n@@ -5238,7 +5240,7 @@ static void accept_new_connection(const struct socket *listener,\n \/\/ keep-alive, next keep-alive handshake will figure out that the client\n \/\/ is down and will close the server end.\n \/\/ Thanks to Igor Klopov who suggested the patch.\n- setsockopt(so.sock, SOL_SOCKET, SO_KEEPALIVE, (void *) &on, sizeof(on));\n+ setsockopt(so.sock, SOL_SOCKET, SO_KEEPALIVE, (char *) &on, sizeof(on));\n set_sock_timeout(so.sock, atoi(ctx->config[REQUEST_TIMEOUT]));\n produce_socket(ctx, &so);\n }\n<\/pre>"}}
title_5
{"item":{"status":"visible","url":"\/2012\/09\/22\/Ceramic-Source--American-made-mugs-with-poisonous-toxins\/","trash":"","name":"Ceramic-Source--American-made-mugs-with-poisonous-toxins","parent":"","title":"Ceramic Source: American made mugs with poisonous toxins","date":"2012-09-22 20:36:29","filepath":"posts\/20120922_Ceramic-Source--American-made-mugs-with-poisonous-toxins.xml.json","type":"post","content":"<p><img style=\"float: left; margin-left: 10px; margin-right: 10px;\" src=\"http:\/\/www.8bitrobot.com\/media\/uploads\/mug.png\" alt=\"\" width=\"62\" height=\"100\" \/>You would think that a mug that has poisonous toxins in the glaze and paint would come from China, right? Well guess again. After going through a batch of company gifts, my wife came across a custom mug created by <a href=\"http:\/\/ceramic-source.com\/\">Ceramic Source<\/a>. On the bottom of the mug was the ominous Prop 65 sticker:<\/p>\n<p style=\"padding-left: 30px;\">\"WARNING: The materials used as colored decorations on the exterior of this product contain lead and\/or cadmium, chemicals known to the state of California to cause birth defects or other reproductive harm.\"<\/p>\n<p>We just had a healthy baby boy and we were lucky my wife only used the mug as a pen case. It now will go into the garbage.<\/p>\n<p>Don't buy drinking ware that contains toxins. It's unheard of in America and disturbing Ceramic Source can get away with manufacturing these mugs.<\/p>"}}
title_6
{"item":{"status":"visible","url":"\/2012\/08\/22\/Using-Proguard-for-Android-and-Libgdx\/","trash":"","name":"Using-Proguard-for-Android-and-Libgdx","parent":"","title":"Using Proguard for Android and Libgdx","date":"2012-08-22 17:32:24","filepath":"posts\/20120822_Using-Proguard-for-Android-and-Libgdx.xml.json","type":"post","content":"<p><img style=\"float: left; margin-left: 10px; margin-right: 10px;\" src=\"http:\/\/www.8bitrobot.com\/media\/uploads\/2012\/01\/gear.png\" alt=\"\" width=\"60\" height=\"64\" \/>I decided to finally bite the bullet and get <a href=\"http:\/\/proguard.sourceforge.net\/\">ProGuard<\/a> working for some <a href=\"https:\/\/play.google.com\/store\/apps\/developer?id=Zygmy\">Android apps<\/a>. It was hell getting everything working because of the shear number of moving parts: Android SDK, Eclipse, Libgdx, AdMob\/Google Ads, apk signing, and the shitstorm ProGuard imposes on any project.<\/p>\n<p>This is going to be another Impatient Guide, because I'd rather not relive configuration problems. The amount of time wasted getting technologies configured and working together is a time sink that gets in the way of making <strong>real<\/strong> progress and doing <strong>real<\/strong> work.<\/p>\n<p><strong>Step one:<\/strong> Turn on ProGuard for your Android project.<\/p>\n<ul>\n<li>Navigate to your project. If you are using LibGdx and the standard configuration it will be named something like \"<YourProjectName>-Android\".<\/li>\n<li>Open <em>default.properties<\/em> for editing<\/li>\n<li>Add the line: <em>proguard.config=proguard.cfg<\/em><\/li>\n<li>Save and reopen Eclipse.<\/li>\n<\/ul>\n<p><strong>Step two:<\/strong> Update the Android SDK Location in Eclipse<\/p>\n<p>Did you jump the gun and try to created a signed apk? Did you get this error?<\/p>\n<p style=\"padding-left: 30px;\"><em>\"C:\\Program' is not recognized as an internal or external command, and executable program, or command file.\"<\/em><\/p>\n<p>Well, Proguard doesn't like spaces in paths, so update the Android SDK location to a short path form.<\/p>\n<ul>\n<li>Open a command prompt: WIN+R -> cmd.exe<\/li>\n<li>cd to the Android SDK location... e.g. \"<em>c:\\Program Files (x86)\\Android\\android-sdk<\/em>\"<\/li>\n<li>type: <em>for \/d %I in (*) do @echo %~sI<\/em><\/li>\n<li>Copy the path. e.g. \"<em>C:\\PROGRA~2\\Android\\ANDROI~1<\/em>\"<\/li>\n<li>Paste the short form path in Eclipse: <em>Window -> Preferences -> Android -> SDK Location<\/em><\/li>\n<li>Hit apply or OK<\/li>\n<\/ul>\n<p><strong>Step Three:<\/strong> Tell ProGuard about dependent libraries<\/p>\n<p>Did you try to export an application package again? Did you get errors like this?<\/p>\n<p style=\"padding-left: 30px;\">\"<em>Warning: com.badlogic.gdx.scenes.scene2d.ui.utils.DesktopClipboard: can't find superclass or interface java.awt.datatransfer.ClipboardOwner<\/em>\"<\/p>\n<p>or<\/p>\n<p style=\"padding-left: 30px;\">\"<em>Warning: there were 28 unresolved references to classes or interfaces.<\/em>\"<\/p>\n<p>Well, you have to tell ProGuard dependent jar files, so it won't blow up. Add something like the following to the <em>proguard.cfg<\/em> file in your project directory. Your configuration will depend upon how your project is set up and make sure to use <strong>absolute paths<\/strong>.<\/p>\n<pre>-libraryjars 'C:\\Program Files\\Java\\jre6\\lib\\rt.jar'\n-libraryjars 'C:\\source...\\<YourProjectName>-Android\\libs'\n-libraryjars 'C:\\source...\\<YourProjectName>\\libs'\n-libraryjars 'C:\\source...\\<YourProjectName>\\libs\\GoogleAdMobAdsSdkAndroid-4.1.1'<\/pre>\n<p>That last one is only valid if you use the AdMob SDK.<\/p>\n<p><strong>Step Four: <\/strong>Fix runtime errors resulting from an overzealous ProGuard shrink<\/p>\n<p>Did you export an .apk with joy, but become totally crushed when your application crashed? Did the crashes happen when you clicked on widgets?<\/p>\n<p>It turns out that ProGuard is removing any code that appears to not be referenced\/used. So, any OnClick* handlers specified in your Android layout xml files will be removed. Seriously. Take a look at <em><YourProjectName>-Android\/proguard\/usage.txt.<\/em> That is stuff that was torn out from your code to \"speed\" up performance. Well, it crashes faster. That's for sure.<\/p>\n<p>But you can't blame ProGuard. It can't read every file in your project that is SDK dependent and make the connection. ProGuard is nice, but it's no mindreader.<\/p>\n<p>To fix this, open up <em>proguard.cfg<\/em> again and tell ProGuard to not touch any OnClick handlers:<\/p>\n<pre>-keepclasseswithmembers class * {\n void onClick*(...);\n}<\/pre>\n<p>If you want to make sure your advertisements from Google show up (com.google.ads*), add the following to your config file too:<\/p>\n<pre>-keep public class com.google.ads.** {*;}<\/pre>\n<p>Save it.<\/p>\n<p><strong>Step Five: <\/strong>Export the .apk and test it<\/p>\n<p>You've probably already done this, but for reference:<\/p>\n<ul>\n<li>Right Click on <YourProjectName>-Android -> Android Tools -> Export Signed Application Package...<\/li>\n<li>Complete the form and generate the apk (e.g. <em>yourproject.apk<\/em>)<\/li>\n<li>Make sure the app isn't already installed on your phone<\/li>\n<li>Open a console: <em>apk.exe install yourproject.apk<\/em><\/li>\n<\/ul>\n<p><strong>Conclusion:<\/strong><\/p>\n<p>This article was built upon a previous article called <a href=\"http:\/\/www.8bitrobot.com\/2012\/07\/07\/How-to-obfuscate-and-package-a-libgdx-app-for-distribution\/\">How to Obfuscate and Package a LibGdx App for Distribution<\/a>.<\/p>\n<p>Working with ProGuard is painful, but hopefully your project is now up and running.<\/p>\n<p> <\/p>"}}
title_7
{"item":{"status":"visible","url":"\/2012\/08\/15\/BMX-and-Hawk-Hill-\/","trash":"","name":"BMX-and-Hawk-Hill-","parent":"","title":"BMX and Hawk Hill ","date":"2012-08-15 21:11:29","filepath":"posts\/20120815_BMX-and-Hawk-Hill-.xml.json","type":"post","content":"<p>Here are a couple of blokes \"Bombing\" Hawk Hill next to the Golden Gate Bridge. While it's stupid, it sure is pretty.<\/p>\n<p style=\"text-align: center;\"><iframe src=\"http:\/\/player.vimeo.com\/video\/46452425\" frameborder=\"0\" width=\"500\" height=\"281\"><\/iframe><\/p>\n<p><a href=\"http:\/\/vimeo.com\/46452425\">Bombing Hills<\/a> from <a href=\"http:\/\/vimeo.com\/werehaustv\">WerehausTV<\/a> on <a href=\"http:\/\/vimeo.com\">Vimeo<\/a>.<\/p>"}}
title_8
{"item":{"status":"visible","url":"\/2012\/08\/10\/Dreamhost-and-an-out-of-box-redirect-loop\/","trash":"","name":"Dreamhost-and-an-out-of-box-redirect-loop","parent":"","title":"Dreamhost and an out of box redirect loop","date":"2012-08-10 22:53:39","filepath":"posts\/20120810_Dreamhost-and-an-out-of-box-redirect-loop.xml.json","type":"post","content":"<p><img style=\"float: left; margin-left: 10px; margin-right: 10px;\" src=\"http:\/\/www.8bitrobot.com\/media\/uploads\/refresh.png\" alt=\"\" width=\"72\" \/>On a newly managed domain, I ran across a redirect loop immediately after adding the domain in the <a href=\"http:\/\/www.8bitrobot.com\/su\/edit\/Dreamhost-and-an-out-of-box-redirect-loop\/dreamhost.com\">Dreamhost<\/a> panel.<\/p>\n<p>Chrome would complain:<\/p>\n<pre style=\"padding-left: 30px;\"><span style=\"color: #ff6600;\">This webpage has a redirect loop<\/span><\/pre>\n<p>With the following error:<\/p>\n<pre style=\"padding-left: 30px;\"><span style=\"color: #ff6600;\">Error 310 (net::ERR_TOO_MANY_REDIRECTS): There were too many redirects.<\/span><\/pre>\n<p>The problem is Dreamhost's homebrewed method for removing \"www\" from the domain.<\/p>\n<p>To solve the problem, edit the domain and check:<\/p>\n<pre style=\"padding-left: 30px;\"><span style=\"color: #339966;\">Leave it alone: Both http:\/\/www.foo.com\/ and http:\/\/foo.com\/ will work<\/span><\/pre>\n<p>Then add the following to an <em>.htaccess<\/em> file at the domain root directory:<\/p>\n<pre style=\"padding-left: 30px;\">RewriteEngine on \nRewriteCond %{HTTP_HOST} ^www\\.(.+)$ [NC] \nRewriteRule ^(.*)$ http:\/\/%1\/$1 [R=301,L]<\/pre>\n<pre><a href=\"http:\/\/wiki.dreamhost.com\/Removing_the_%22www%22_from_your_domain\"><em>source for the .htaccess file<\/em><\/a><\/pre>"}}
title_9
{"item":{"status":"visible","url":"\/2012\/07\/07\/How-to-obfuscate-and-package-a-libgdx-app-for-distribution\/","trash":"","name":"How-to-obfuscate-and-package-a-libgdx-app-for-distribution","parent":"","title":"How to obfuscate and package a libgdx app for distribution","date":"2012-07-07 22:05:59","filepath":"posts\/20120707_How-to-obfuscate-and-package-a-libgdx-app-for-distribution.xml.json","type":"post","content":"<p><strong><img style=\"float: left; margin-left: 10px; margin-right: 10px;\" src=\"http:\/\/www.8bitrobot.com\/media\/uploads\/2012\/01\/gear.png\" alt=\"\" width=\"60\" height=\"64\" \/>First off:<\/strong> This is an <a href=\"http:\/\/www.8bitrobot.com\/tag\/impatient%20guide\/\">Impatient Guide<\/a> and it will be short on explanation and possibly accuracy<\/p>\n<p><strong>Second off:<\/strong> This method is a first attempt and is probably fraught with errors and inefficiencies, but it worked for me.<\/p>\n<p><em>Let's get started!<\/em><\/p>\n<p>Say you have a <a href=\"http:\/\/libgdx.badlogicgames.com\/\">LibGDX<\/a> project and you want to package it up for redistribution, but you don't want to give out a jar and would like it to be wrapped in a nice executable (.exe) just like any ordinary Windows binary. In addition, obfuscating the code to make reverse engineering more difficult might be something you want too.<\/p>\n<p>Here's how I did it manually with <a href=\"http:\/\/www.eclipse.org\/\">Eclipse<\/a>, <a href=\"http:\/\/proguard.sourceforge.net\/\">ProGuard<\/a>, <a href=\"http:\/\/launch4j.sourceforge.net\/\">Launch4j<\/a>, and <a href=\"http:\/\/www.7-zip.org\/\">7-zip<\/a>.<\/p>\n<h2>Creating the JAR files:<\/h2>\n<ol>\n<li>Export a jar file with the <a href=\"http:\/\/www.eclipse.org\/\">Eclipse<\/a> Export Wizard. I did this for my desktop version, by right clicking on the project \"myapp-desktop\" -> Export -> Java -> Runnable Jar File.<\/li>\n<li>Plug in the usual stuff into the wizard, but choose \"Copy required libraries into a sub-folder next to the generated JAR.\" Otherwise, ProGuard will make your life a nightmare when you try to obfuscate (e.g. \"Warning: org.lwjgl.input.Controllers: can't find referenced class net.java.games.input.ControllerEnvironment\").<\/li>\n<li>Hit \"finish\" and the wizard will generate your shiny new .jar file.<\/li>\n<li>Do 1 through 3 again, but in step 2 choose \"Package required libraries into generated JAR.\" The jarinjarloader files and the MANIFEST.MF from this second generated JAR will be used later on.<\/li>\n<\/ol>\n<h2>Obfuscate your jar with ProGuard:<\/h2>\n<ol>\n<li>Run the GUI version of <a href=\"http:\/\/proguard.sourceforge.net\/\">ProGuard<\/a>: <em>java -jar proguardgui.jar<\/em><\/li>\n<li>In the Input\/Output tab, click \"Add input...\" and enter the first generated JAR path.<\/li>\n<li>Click \"Add output...\" and enter your output JAR... say (e.g. <em>output.jar<\/em>).<\/li>\n<li>Click \"Add...\" in the Add libraries section and add the library export directory generated with the first JAR. If your export JAR name was <em>foo.jar<\/em>, the export dependencies should be in <em>foo_lib.<\/em><\/li>\n<li>In the Obfuscation tab uncheck \"<em>Use mixed-case class names.<\/em>\"<\/li>\n<li>Keep the default settings for now (you can tweak them later once you have this working).<\/li>\n<li>Start processing the JAR. In the <em>Process<\/em> tab click <em>Process!<\/em><\/li>\n<li>If ProGuard finishes it will produce a nice obfuscated\/shrunk JAR, <em>output.jar<\/em>.<\/li>\n<\/ol>\n<h2>Combine library dependencies into obfuscated JAR<\/h2>\n<ol>\n<li>The <em>output.jar<\/em> is not runnable as is. It needs to know how to find the library dependencies. You can pack the dependencies into the JAR with <a href=\"http:\/\/www.7-zip.org\/\">7-zip<\/a>. So, open <em>output.jar<\/em> in 7-zip.<\/li>\n<li>Add\/drag the contents of <em>foo_lib<\/em> (from step 2 in the first section) into the root level of the JAR (e.g. they should be in the same directory <em>META-INF<\/em> is in).<\/li>\n<li>Extract the other JAR from the first section (see step 4) into a temp directory (e.g. <em>temp<\/em>).<\/li>\n<li>In <em>output.jar<\/em>, clobber the file \"<em>META-INF\/MANIFEST.MF\" <\/em>with the file from <em>\"temp\/META-INF\/MANIFEST.MF\"<\/em>.<\/li>\n<li>In <em>output.jar<\/em>, add the directory <em>\"org\/eclipse\"<\/em> from <em>\"temp\/org\/eclipse\"<\/em>.<\/li>\n<li>Confirm the JAR is runnable: <em>java -jar output.jar<\/em><\/li>\n<\/ol>\n<h2>Wrap your JAR in a Windows executable<\/h2>\n<ol>\n<li>Use <a href=\"http:\/\/launch4j.sourceforge.net\/\">Launch4j<\/a> to wrap your JAR. Open the Launch4j GUI.<\/li>\n<li>Add your output file: <em>out.exe<\/em><\/li>\n<li>Add your input JAR file: <em>output.jar<\/em><\/li>\n<li>In the <em>JRE<\/em> tab, set the <em>Min JRE version<\/em> (e.g. 1.6.0)<\/li>\n<li>Click the gear icon to build the wrapper.<\/li>\n<li>Confirm the binary works. <strong><em>High Fives all Around!<\/em><\/strong><\/li>\n<\/ol>\n<div> <\/div>"}}