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. &nbsp;It appears Samsung uses special scan codes to enable\/disable the touchpad and keyboard. &nbsp;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. &nbsp;I didn't think anything of it until trying to type and move the cursor. &nbsp;Damn! &nbsp;I was stuck with the external keyboard and mouse until everything was backed out and fixed.<\/p>\n<p>Restarting the laptop did nothing. &nbsp;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. &nbsp;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>. &nbsp;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. &nbsp;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. &nbsp;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: &nbsp;<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 &lt; 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 *) &amp;on, sizeof(on)) != 0 ||\n+ (char *) (&amp;on), sizeof(on)) != 0 ||\n #if defined(USE_IPV6)\n (so.lsa.sa.sa_family == AF_INET6 &amp;&amp;\n setsockopt(so.sock, IPPROTO_IPV6, IPV6_V6ONLY, (void *) &amp;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 *) &amp;t, sizeof(t)) ||\n- setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (void *) &amp;t, sizeof(t));\n+ return setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *) &amp;t, sizeof(t)) ||\n+ setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char *) &amp;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 *) &amp;on, sizeof(on));\n+ setsockopt(so.sock, SOL_SOCKET, SO_KEEPALIVE, (char *) &amp;on, sizeof(on));\n set_sock_timeout(so.sock, atoi(ctx-&gt;config[REQUEST_TIMEOUT]));\n produce_socket(ctx, &amp;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? &nbsp;Well guess again. &nbsp;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>. &nbsp;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. &nbsp;It now will go into the garbage.<\/p>\n<p>Don't buy drinking ware that contains toxins. &nbsp;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>. &nbsp;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. &nbsp;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&nbsp;<strong>real<\/strong> work.<\/p>\n<p><strong>Step one:<\/strong> &nbsp;Turn on ProGuard for your Android project.<\/p>\n<ul>\n<li>Navigate to your project. &nbsp;If you are using LibGdx and the standard configuration it will be named something like \"&lt;YourProjectName&gt;-Android\".<\/li>\n<li>Open&nbsp;<em>default.properties<\/em> for editing<\/li>\n<li>Add the line:&nbsp;<em>proguard.config=proguard.cfg<\/em><\/li>\n<li>Save and reopen Eclipse.<\/li>\n<\/ul>\n<p><strong>Step two:<\/strong> &nbsp;Update the Android SDK Location in Eclipse<\/p>\n<p>Did you jump the gun and try to created a signed apk? &nbsp;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 -&gt; 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:&nbsp;<em>for \/d %I in (*) do @echo %~sI<\/em><\/li>\n<li>Copy the path. &nbsp;e.g. \"<em>C:\\PROGRA~2\\Android\\ANDROI~1<\/em>\"<\/li>\n<li>Paste the short form path in Eclipse: <em>Window -&gt; Preferences -&gt; Android -&gt; 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? &nbsp;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. &nbsp;Add something like the following to the&nbsp;<em>proguard.cfg<\/em> file in your project directory. &nbsp;Your configuration will depend upon how your project is set up and make sure to use&nbsp;<strong>absolute paths<\/strong>.<\/p>\n<pre>-libraryjars 'C:\\Program Files\\Java\\jre6\\lib\\rt.jar'\n-libraryjars 'C:\\source...\\&lt;YourProjectName&gt;-Android\\libs'\n-libraryjars 'C:\\source...\\&lt;YourProjectName&gt;\\libs'\n-libraryjars 'C:\\source...\\&lt;YourProjectName&gt;\\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:&nbsp;<\/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? &nbsp;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. &nbsp;So, any OnClick* handlers specified in your Android layout xml files will be removed. &nbsp;Seriously. &nbsp;Take a look at&nbsp;<em>&lt;YourProjectName&gt;-Android\/proguard\/usage.txt.<\/em> &nbsp;That is stuff that was torn out from your code to \"speed\" up performance. &nbsp;Well, it crashes faster. &nbsp;That's for sure.<\/p>\n<p>But you can't blame ProGuard. &nbsp;It can't read every file in your project that is SDK dependent and make the connection. &nbsp;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:&nbsp;<\/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 &lt;YourProjectName&gt;-Android -&gt; Android Tools -&gt; 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>&nbsp;<\/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. &nbsp;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. &nbsp;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. &nbsp;I did this for my desktop version, by right clicking on the project \"myapp-desktop\" -&gt; Export -&gt; Java -&gt; 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.\" &nbsp;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.\" &nbsp;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>:&nbsp;<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. &nbsp;If your export JAR name was&nbsp;<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. &nbsp;In the&nbsp;<em>Process<\/em> tab click&nbsp;<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&nbsp;<em>output.jar<\/em> is not runnable as is. &nbsp;It needs to know how to find the library dependencies. &nbsp;You can pack the dependencies into the JAR with <a href=\"http:\/\/www.7-zip.org\/\">7-zip<\/a>. &nbsp;So, open <em>output.jar<\/em> in 7-zip.<\/li>\n<li>Add\/drag the contents of&nbsp;<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\"&nbsp;<\/em>with the file from <em>\"temp\/META-INF\/MANIFEST.MF\"<\/em>.<\/li>\n<li>In&nbsp;<em>output.jar<\/em>, add the directory <em>\"org\/eclipse\"<\/em> from&nbsp;<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. &nbsp;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. &nbsp;<strong><em>High Fives all Around!<\/em><\/strong><\/li>\n<\/ol>\n<div>&nbsp;<\/div>"}}
 

Lorem Ipsum

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Lorem

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

 
This page is best viewed with Firefox 3.5+, Chrome 5+, Safari 5+, Opera 10.6+, IE 9+
Copyright © 2014 8bitrobot.com