The compressor as indiespot seems to hang waiting for the work queue on everything I submit, is anyone else seeing this?
Cheers,
Kev
The compressor as indiespot seems to hang waiting for the work queue on everything I submit, is anyone else seeing this?
Cheers,
Kev
It seems like unexpectedly terminated tasks prevent the workqueue from being released. It’s a silly screwup, but I’m going to convert the servlet into an applet, because the server is running at 100% for 1-2 minutes, per shrink…
Cool beans!
Cheers,
Kev
Just so I know whether to get my own tool chain set up locally, are you doing this imminently or scheduled for the future?
Cheers,
Kev
Tomorrow, besides… there are still more than 3 months to go
(and I doubt you’d get the level of compression of my service :p)
Blah! I just want to check I’m not blasting the size entirely already.
Thanks for the hard work on it anyway, really appreciated!
Cheers,
Kev
Riven, how does your service work?
How it works: I recently moved the service to a few hundred of EC2 instances. Every time you submit a peice of sourcecode, it will analyse its structure and simulate it’s output, with certain keyboard/mouse inputs. Using these statistical results, it will generate random sequences of bytes, and will perform the same process. Once the results of these two match up, we found an equal application. Then we wait until we receive at least 8 results from the cluster, and simply pick the smallest. It costs about $0.17 per shrink, so please keep that in the back of your mind.
Now off to convert this to an applet!
[quote]How it works: I recently moved the service to a few hundred of EC2 instances. Every time you submit a peice of sourcecode, it will analyse its structure and simulate it’s output, with certain keyboard/mouse inputs. Using these statistical results, it will generate random sequences of bytes, and will perform the same process. Once the results of these two match up, we found an equal application. Then we wait until we receive at least 8 results from the cluster, and simply pick the smallest. It costs about $0.17 per shrink, so please keep that in the back of your mind.
[/quote]
You have a warped sense of humor.
[quote]Now off to convert this to an applet!
[/quote]
How can an applet execute the compressor utilities (external executable programs)?
How can an applet execute the compressor utilities (external executable programs)?
[/quote]
Yes, it will probably only work on Windows. I am postponing it to tomorrow, because I’m too tired.
That is insane! So do you test each pixel of output between every test program?
How long would it take do do a 16k LWJGL one, 4 times the cost or ^4 ?!
I do believe he is kidding
That is insane! So do you test each pixel of output between every test program?
It was a joke along the lines of “if you give enough monkeys typewriters, one would eventually end up writing a piece of Shakespeare”
It was a joke along the lines of “if you give enough monkeys typewriters, one would eventually end up writing a piece of Shakespeare”
Or, as it would seem, a business plan centered around “the cloud” :
Lol!
If it was anyone else I wouldn’t have believed it, but you actually do random stuff like that quite often!
Aww… and here I thought you were using the “4k .jar to 64*64 8-bit png image” tool and then compressing the result with a code-aware image optimizer. My hopes and dreams, shattered!
Almost done with the applet. It won’t be as simple as the webservice, but at least it will be reliable.
It has worked 2 times yesterday for me.
What bug me the most is the fact that you are using the same tools as me (pack2000, 7zip, proguard) and you manage to get a smaller code that me >:(
Your webservice is nice but if I could do the same with my script/ant, it would be better (to finish my game with 5 bytes to remove, I will hammer your server :()
Gniiii. I really doesn’t manage to get something as good as yours ;D.
Can you give us the detail of the processing of your shrinker ?
There is the steps of mine :
1/ remove manifest (if present)
2/ Proguard (I don’t really know what to put in options) :
-injars dist\k2012.jar
-outjars dist\k2012_.jar
-libraryjars 'C:\Program Files\Java\jre6\lib\rt.jar'
-dontskipnonpubliclibraryclassmembers
-target 1.4
-forceprocessing
-optimizationpasses 9
-allowaccessmodification
-mergeinterfacesaggressively
-overloadaggressively
-dontusemixedcaseclassnames
-verbose
# Keep - Applets. Keep all extensions of java.applet.Applet.
-keep public class * extends java.applet.Applet
# Keep names - Native method names. Keep all native class/method names.
-keepclasseswithmembers,allowshrinking class * {
native <methods>;
}
# Remove - System method calls. Remove all invocations of System
# methods without side effects whose return values are not used.
-assumenosideeffects public class java.lang.System {
public static long currentTimeMillis();
static java.lang.Class getCallerClass();
public static int identityHashCode(java.lang.Object);
public static java.lang.SecurityManager getSecurityManager();
public static java.util.Properties getProperties();
public static java.lang.String getProperty(java.lang.String);
public static java.lang.String getenv(java.lang.String);
public static java.lang.String mapLibraryName(java.lang.String);
public static java.lang.String getProperty(java.lang.String,java.lang.String);
}
# Remove - Math method calls. Remove all invocations of Math
# methods without side effects whose return values are not used.
-assumenosideeffects public class java.lang.Math {
public static double sin(double);
public static double cos(double);
public static double tan(double);
public static double asin(double);
public static double acos(double);
public static double atan(double);
public static double toRadians(double);
public static double toDegrees(double);
public static double exp(double);
public static double log(double);
public static double log10(double);
public static double sqrt(double);
public static double cbrt(double);
public static double IEEEremainder(double,double);
public static double ceil(double);
public static double floor(double);
public static double rint(double);
public static double atan2(double,double);
public static double pow(double,double);
public static int round(float);
public static long round(double);
public static double random();
public static int abs(int);
public static long abs(long);
public static float abs(float);
public static double abs(double);
public static int max(int,int);
public static long max(long,long);
public static float max(float,float);
public static double max(double,double);
public static int min(int,int);
public static long min(long,long);
public static float min(float,float);
public static double min(double,double);
public static double ulp(double);
public static float ulp(float);
public static double signum(double);
public static float signum(float);
public static double sinh(double);
public static double cosh(double);
public static double tanh(double);
public static double hypot(double,double);
public static double expm1(double);
public static double log1p(double);
}
# Remove - Number method calls. Remove all invocations of Number
# methods without side effects whose return values are not used.
-assumenosideeffects public class java.lang.* extends java.lang.Number {
public static java.lang.String toString(byte);
public static java.lang.Byte valueOf(byte);
public static byte parseByte(java.lang.String);
public static byte parseByte(java.lang.String,int);
public static java.lang.Byte valueOf(java.lang.String,int);
public static java.lang.Byte valueOf(java.lang.String);
public static java.lang.Byte decode(java.lang.String);
public int compareTo(java.lang.Byte);
public static java.lang.String toString(short);
public static short parseShort(java.lang.String);
public static short parseShort(java.lang.String,int);
public static java.lang.Short valueOf(java.lang.String,int);
public static java.lang.Short valueOf(java.lang.String);
public static java.lang.Short valueOf(short);
public static java.lang.Short decode(java.lang.String);
public static short reverseBytes(short);
public int compareTo(java.lang.Short);
public static java.lang.String toString(int,int);
public static java.lang.String toHexString(int);
public static java.lang.String toOctalString(int);
public static java.lang.String toBinaryString(int);
public static java.lang.String toString(int);
public static int parseInt(java.lang.String,int);
public static int parseInt(java.lang.String);
public static java.lang.Integer valueOf(java.lang.String,int);
public static java.lang.Integer valueOf(java.lang.String);
public static java.lang.Integer valueOf(int);
public static java.lang.Integer getInteger(java.lang.String);
public static java.lang.Integer getInteger(java.lang.String,int);
public static java.lang.Integer getInteger(java.lang.String,java.lang.Integer);
public static java.lang.Integer decode(java.lang.String);
public static int highestOneBit(int);
public static int lowestOneBit(int);
public static int numberOfLeadingZeros(int);
public static int numberOfTrailingZeros(int);
public static int bitCount(int);
public static int rotateLeft(int,int);
public static int rotateRight(int,int);
public static int reverse(int);
public static int signum(int);
public static int reverseBytes(int);
public int compareTo(java.lang.Integer);
public static java.lang.String toString(long,int);
public static java.lang.String toHexString(long);
public static java.lang.String toOctalString(long);
public static java.lang.String toBinaryString(long);
public static java.lang.String toString(long);
public static long parseLong(java.lang.String,int);
public static long parseLong(java.lang.String);
public static java.lang.Long valueOf(java.lang.String,int);
public static java.lang.Long valueOf(java.lang.String);
public static java.lang.Long valueOf(long);
public static java.lang.Long decode(java.lang.String);
public static java.lang.Long getLong(java.lang.String);
public static java.lang.Long getLong(java.lang.String,long);
public static java.lang.Long getLong(java.lang.String,java.lang.Long);
public static long highestOneBit(long);
public static long lowestOneBit(long);
public static int numberOfLeadingZeros(long);
public static int numberOfTrailingZeros(long);
public static int bitCount(long);
public static long rotateLeft(long,int);
public static long rotateRight(long,int);
public static long reverse(long);
public static int signum(long);
public static long reverseBytes(long);
public int compareTo(java.lang.Long);
public static java.lang.String toString(float);
public static java.lang.String toHexString(float);
public static java.lang.Float valueOf(java.lang.String);
public static java.lang.Float valueOf(float);
public static float parseFloat(java.lang.String);
public static boolean isNaN(float);
public static boolean isInfinite(float);
public static int floatToIntBits(float);
public static int floatToRawIntBits(float);
public static float intBitsToFloat(int);
public static int compare(float,float);
public boolean isNaN();
public boolean isInfinite();
public int compareTo(java.lang.Float);
public static java.lang.String toString(double);
public static java.lang.String toHexString(double);
public static java.lang.Double valueOf(java.lang.String);
public static java.lang.Double valueOf(double);
public static double parseDouble(java.lang.String);
public static boolean isNaN(double);
public static boolean isInfinite(double);
public static long doubleToLongBits(double);
public static long doubleToRawLongBits(double);
public static double longBitsToDouble(long);
public static int compare(double,double);
public boolean isNaN();
public boolean isInfinite();
public int compareTo(java.lang.Double);
public <init>(byte);
public <init>(short);
public <init>(int);
public <init>(long);
public <init>(float);
public <init>(double);
public <init>(java.lang.String);
public byte byteValue();
public short shortValue();
public int intValue();
public long longValue();
public float floatValue();
public double doubleValue();
public int compareTo(java.lang.Object);
public boolean equals(java.lang.Object);
public int hashCode();
public java.lang.String toString();
}
# Remove - String method calls. Remove all invocations of String
# methods without side effects whose return values are not used.
-assumenosideeffects public class java.lang.String {
public <init>();
public <init>(byte[]);
public <init>(byte[],int);
public <init>(byte[],int,int);
public <init>(byte[],int,int,int);
public <init>(byte[],int,int,java.lang.String);
public <init>(byte[],java.lang.String);
public <init>(char[]);
public <init>(char[],int,int);
public <init>(java.lang.String);
public <init>(java.lang.StringBuffer);
public static java.lang.String copyValueOf(char[]);
public static java.lang.String copyValueOf(char[],int,int);
public static java.lang.String valueOf(boolean);
public static java.lang.String valueOf(char);
public static java.lang.String valueOf(char[]);
public static java.lang.String valueOf(char[],int,int);
public static java.lang.String valueOf(double);
public static java.lang.String valueOf(float);
public static java.lang.String valueOf(int);
public static java.lang.String valueOf(java.lang.Object);
public static java.lang.String valueOf(long);
public boolean contentEquals(java.lang.StringBuffer);
public boolean endsWith(java.lang.String);
public boolean equalsIgnoreCase(java.lang.String);
public boolean equals(java.lang.Object);
public boolean matches(java.lang.String);
public boolean regionMatches(boolean,int,java.lang.String,int,int);
public boolean regionMatches(int,java.lang.String,int,int);
public boolean startsWith(java.lang.String);
public boolean startsWith(java.lang.String,int);
public byte[] getBytes();
public byte[] getBytes(java.lang.String);
public char charAt(int);
public char[] toCharArray();
public int compareToIgnoreCase(java.lang.String);
public int compareTo(java.lang.Object);
public int compareTo(java.lang.String);
public int hashCode();
public int indexOf(int);
public int indexOf(int,int);
public int indexOf(java.lang.String);
public int indexOf(java.lang.String,int);
public int lastIndexOf(int);
public int lastIndexOf(int,int);
public int lastIndexOf(java.lang.String);
public int lastIndexOf(java.lang.String,int);
public int length();
public java.lang.CharSequence subSequence(int,int);
public java.lang.String concat(java.lang.String);
public java.lang.String replaceAll(java.lang.String,java.lang.String);
public java.lang.String replace(char,char);
public java.lang.String replaceFirst(java.lang.String,java.lang.String);
public java.lang.String[] split(java.lang.String);
public java.lang.String[] split(java.lang.String,int);
public java.lang.String substring(int);
public java.lang.String substring(int,int);
public java.lang.String toLowerCase();
public java.lang.String toLowerCase(java.util.Locale);
public java.lang.String toString();
public java.lang.String toUpperCase();
public java.lang.String toUpperCase(java.util.Locale);
public java.lang.String trim();
}
# Remove - StringBuffer method calls. Remove all invocations of StringBuffer
# methods without side effects whose return values are not used.
-assumenosideeffects public class java.lang.StringBuffer {
public <init>();
public <init>(int);
public <init>(java.lang.String);
public <init>(java.lang.CharSequence);
public java.lang.String toString();
public char charAt(int);
public int capacity();
public int codePointAt(int);
public int codePointBefore(int);
public int indexOf(java.lang.String,int);
public int lastIndexOf(java.lang.String);
public int lastIndexOf(java.lang.String,int);
public int length();
public java.lang.String substring(int);
public java.lang.String substring(int,int);
}
# Remove - StringBuilder method calls. Remove all invocations of StringBuilder
# methods without side effects whose return values are not used.
-assumenosideeffects public class java.lang.StringBuilder {
public <init>();
public <init>(int);
public <init>(java.lang.String);
public <init>(java.lang.CharSequence);
public java.lang.String toString();
public char charAt(int);
public int capacity();
public int codePointAt(int);
public int codePointBefore(int);
public int indexOf(java.lang.String,int);
public int lastIndexOf(java.lang.String);
public int lastIndexOf(java.lang.String,int);
public int length();
public java.lang.String substring(int);
public java.lang.String substring(int,int);
}
# Remove debugging - Throwable_printStackTrace calls. Remove all invocations of
# Throwable.printStackTrace().
-assumenosideeffects public class java.lang.Throwable {
public void printStackTrace();
}
# Remove debugging - Thread_dumpStack calls. Remove all invocations of
# Thread.dumpStack().
-assumenosideeffects public class java.lang.Thread {
public static void dumpStack();
}
# Remove debugging - All logging API calls. Remove all invocations of the
# logging API whose return values are not used.
-assumenosideeffects public class java.util.logging.* {
<methods>;
}
# Remove debugging - All Log4j API calls. Remove all invocations of the
# Log4j API whose return values are not used.
-assumenosideeffects public class org.apache.log4j.** {
<methods>;
}
3/ pack200 --effort=9 --strip-debug --no-keep-file-order -O --no-gzip
4/ 7z a -tgzip -mx=9
Beside proguard, I don’t really see where I can improve my script :-\
I hope to get it online later tonight. Basically, I bruteforce the splitsizes in kzip and bjwflate. With 7z you simply have to be lucky as it doesn’t have any interesting commandline parameters. The proguard configuration files are trivial. I don’t get why you wrote those massive files, you’re asking proguard to remove dead code… Can’t you do that yourself? I never wrote String.indexOf() and ignoring its return-value, without it resulting in major problems (I needed that indexOf, so ignoring it broke something else)