What do people think about the different Generic Java approaches?

I have seen a lot of different approaches for Generic Java, and when people find problems with each approach the normal response has been: the other approach is worse with such and such a problem, do you have a better way?
The different approaches I have seen are: (in no particular order)
Please correct me if I am wrong and add other approaches if they are worthy of mention.
1) PolyJ - by MIT
This is a completely different approach than the others, that introduces a new where clause for bounding the types, and involves changing java byte codes in order to meet it's goals.
Main comments were not a java way of doing things and far too greater risk making such big changes.
2) Pizza - by Odersky & Wadler
This aims at extending java in more ways than just adding Generics. The generic part of this was replaced by GJ, but with Pizza's ability to use primitives as generic types removed, and much bigger changes allowing GJ to interface with java.
Main comments were that Pizza doesn't work well with java, and many things in Pizza were done in parallel with java, hence were no longer applicable.
3) GJ - by Bracha, Odersky, Stoutamire & Wadler
This creates classes with erased types and bridging methods, and inserts casts when required when going back to normal java code.
Main comments are that type dependent operations such as new, instanceof, casting etc can't be done with parametric types, also it is not a very intuitive approach and it is difficult to work out what code should do.
4) Runtime Generic Information - by Natali & Viroli
Each instance holds information about its Runtime Type.
Main comments from people were that this consumes way too much memory as each instance holds extra information about its type, and the performance would be bad due to checking Type information at runtime that would have been known at compile.
5) NextGen - by Cartwright & Steele
For each parameterized class an abstract base class with types erased is made and then for each new type a lightweight wrapper class and interface are created re-using code from the base class to keep the code small.
Main comments from people were that this approach isn't as backwards compatible as GJ due to replacing the legacy classes with abstract base classes which can't be instantiated.
6) .NET common runtime - by Kennedy & Syme
This was written for adding Generics to C#, however the spec is also targeted at other languages such as VB.
Main comments from people were that this approach isn't java, hence it is not subject to the restrictions of changing the JVM like java is.
7) Fully Generated Generic Classes - by Agesen, Freund & Mitchell
For each new type a new class is generated by a custom class loader, with all the code duplicated for each different type.
Main comments from people were that the generated code size gets too big, and that it is lacking a base class for integration with legacy code.
8) JSR-14 - by Sun
This is meant to come up with a solution Generic Solution to be used in java. Currently it is heavily based on GJ and suffering from all the same problems as GJ, along with the fact that it is constantly undergoing change and so no one knows what to expect.
See this forum for comments about it.
As if we didn't have enough approaches already, here is yet another one that hopefully has all of the benefits, and none of the problems of the other approaches. It uses information learnt while experimenting with the other approaches. Now when people ask me if I think I have a better approach, I will have somewhere to point them to.
(I will be happy to answer questions concerning this approach).
9) Approach #x - by Phillips
At compile time 1 type is made per generic type with the same name.
e.g.class HashSet<TypeA> extends AbstractSet<TypeA> implements Cloneable, Serializable will be translated to a type: class HashSet extends AbstractSet implements Cloneable, SerializableAn instance of the class using Object as TypeA can now be created in 2 different ways.
e.g.Set a = new HashSet();
Set<Object> b = new HashSet<Object>();
//a.getClass().equals(b.getClass()) is trueThis means that legacy class files don't even need to be re-compiled in order to work with the new classes. This approach is completely backwards compatible.
Inside each type that was created from a generic type there is also some synthetic information.
Information about each of the bounding types is stored in a synthetic field.
Note that each bounding type may be bounded by a class and any number of interfaces, hence a ';' is used to separate bounding types. If there is no class Object is implied.
e.g.class MyClass<TypeA extends Button implements Comparable, Runnable; TypeB> will be translated to a type: class MyClass {
  public static final Class[][] $GENERIC_DESCRIPTOR = {{Button.class, Comparable.class, Runnable.class}, {Object.class}};This information is used by a Custom Class Loader before generating a new class in order to ensure that the generic types are bounded correctly. It also gets used to establish if this class can be returned instead of a generated class (occurs when the generic types are the same as the bounding types, like for new HashSet<Object> above).
There is another synthetic field of type byte[] that stores bytes in order for the Custom Class Loader to generate the new Type.
There are also static methods corresponding to each method that contain the implementation for each method. These methods take parameters as required to gain access to fields, contructors, other methods, the calling object, the calling object class etc. Fields are passed to get and set values in the calling object. Constructors are passed to create new instances of the calling object. Other methods are passed when super methods are called from within the class. The calling object is almost always passed for non static methods, in order to do things with it. The class is passed when things like instanceof the generated type need to be done.
Also in this class are any non private methods that were there before, using the Base Bounded Types, in order that the class can be used exactly as it was before Generics.
Notes: the time consuming reflection stuff is only done once per class (not per instance) and stored in static fields. The other reflection stuff getting done is very quick in JDK1.4.1 (some earlier JDKs the same can not be said).
Also these static methods can call each other in many circumstances (for example when the method getting called is private, final or static).
As well as the ClassLoader and other classes required by it there is a Reflection class. This class is used to do things that are known to be safe (assuming the compiler generated the classes correctly) without throwing any exceptions.
Here is a cut down version of the Reflection class: public final class Reflection {
  public static final Field getDeclaredField(Class aClass, String aName) {
    try {
      Field field = aClass.getDeclaredField(aName);
      field.setAccessible(true);
      return field;
    catch (Exception ex) {
      throw new Error(ex);
  public static final Object get(Field aField, Object anObject) {
    try {
      return aField.get(anObject);
    catch (Exception ex) {
      throw new Error(ex);
  public static final void set(Field aField, Object anObject, Object aValue) {
    try {
      aField.set(anObject, aValue);
    catch (Exception ex) {
      throw new Error(ex);
  public static final int getInt(Field aField, Object anObject) {
    try {
      return aField.getInt(anObject);
    catch (Exception ex) {
      throw new Error(ex);
  public static final void setInt(Field aField, Object anObject, int aValue) {
    try {
      aField.setInt(anObject, aValue);
    catch (Exception ex) {
      throw new Error(ex);
}Last but not least, at Runtime one very lightweight wrapper class per type is created as required by the custom class loader. Basically the class loader uses the Generic Bytes as the template replacing the erased types with the new types. This can be even faster than loading a normal class file from disk, and creating it.
Each of these classes has any non private methods that were there before, making calls to the generating class to perform their work. The reason they don't have any real code themselves is because that would lead to code bloat, however for very small methods they can keep their code inside their wrapper without effecting functionality.
My final example assumes the following class name mangling convention:
* A<component type> - Array
* b - byte
* c - char
* C<class name length><class name> - Class
* d - double
* f - float
* i - int
* l - long
* z - boolean
Final Example: (very cut down version of Vector)public class Vector<TypeA> extends AbstractList<TypeA> implements RandomAccess, Cloneable, Serializable {
  protected Object[] elementData;
  protected int elementCount;
  protected int capacityIncrement;
  public Vector<TypeA>(int anInitialCapacity, int aCapacityIncrement) {
    if (anInitialCapacity < 0) {
      throw new IllegalArgumentException("Illegal Capacity: " + anInitialCapacity);
    elementData = new Object[initialCapacity];
    capacityIncrement = capacityIncrement;
  public synchronized void setElementAt(TypeA anObject, int anIndex) {
    if (anIndex >= elementCount) {
      throw new ArrayIndexOutOfBoundsException(anIndex + " >= " + elementCount);
    elementData[anIndex] = anObject;
}would get translated as:public class Vector extends AbstractList implements RandomAccess, Cloneable, Serializable {
  public static final Class[][] $GENERIC_DESCRIPTOR = {{Object.class}};
  public static final byte[] $GENERIC_BYTES = {/*Generic Bytes Go Here*/};
  protected Object[] elementData;
  protected int elementCount;
  protected int capacityIncrement;
  private static final Field $0 = Reflection.getDeclaredField(Vector.class, "elementData"),
                             $1 = Reflection.getDeclaredField(Vector.class, "elementCount"),
                             $2 = Reflection.getDeclaredField(Vector.class, "capacityIncrement");
  static void $3(int _0, Field _1, Object _2, Field _3, int _4) {
    if (_0 < 0) {
      throw new IllegalArgumentException("Illegal Capacity: " + _0);
    Reflection.set(_1, _2, new Object[_0]);
    Reflection.setInt(_3, _2, _4);
  static void $4(int _0, Field _1, Object _2, Field _3, Object _4) {
    if (_0 >= Reflection.getInt(_1, _2)) {
      throw new ArrayIndexOutOfBoundsException(_0 + " >= " + Reflection.getInt(_1, _2));
    ((Object[])Reflection.get(_3, _2))[_0] = _4;
  public Vector(int anInitialCapacity, int aCapacityIncrement) {
    $3(anInitialCapacity, $0, this, $2, aCapacityIncrement);
  public synchronized void setElementAt(Object anObject, int anIndex) {
    $4(anIndex, $1, this, $0, anObject);
} and new Vector<String> would get generated as:public class Vector$$C16java_lang_String extends AbstractList$$C16java_lang_String implements RandomAccess, Cloneable, Serializable {
  protected Object[] elementData;
  protected int elementCount;
  protected int capacityIncrement;
  private static final Field $0 = Reflection.getDeclaredField(Vector$$C16java_lang_String.class, "elementData"),
                             $1 = Reflection.getDeclaredField(Vector$$C16java_lang_String.class, "elementCount"),
                             $2 = Reflection.getDeclaredField(Vector$$C16java_lang_String.class, "capacityIncrement");
  public Vector$$C16java_lang_String(int anInitialCapacity, int aCapacityIncrement) {
    Vector.$3(anInitialCapacity, $0, this, $2, aCapacityIncrement);
  public synchronized void setElementAt(String anObject, int anIndex) {
    Vector.$4(anIndex, $1, this, $0, anObject);
}Comparisons with other approaches:
Compared with PolyJ this is a very java way of doing things, and further more it requires no changes to the JVM or the byte codes.
Compared with Pizza this works very well with java and has been designed using the latest java technologies.
Compared with GJ all type dependent operations can be done, and it is very intuitive, code does exactly the same thing it would have done if it was written by hand.
Compared with Runtime Generic Information no extra information is stored in each instance and hence no extra runtime checks need to get done.
Compared with NextGen this approach is completely backwards compatible. NextGen looks like it was trying to achieve the same goals, but aside from non backwards compatibility also suffered from the fact that Vector<String> didn't extend AbstractList<String> causing other minor problems. Also this approach doesn't create 2 types per new types like NextGen does (although this wasn't a big deal anyway). All that said NextGen was in my opinion a much better approach than GJ and most of the others.
Compared to .NET common runtime this is java and doesn't require changes to the JVM.
Compared to Fully Generated Generic Classes the classes generated by this approach are very lightweight wrappers, not full blown classes and also it does have a base class making integration with legacy code simple. It should be noted that the functionality of the Fully Generated Generic Classes is the same as this approach, that can't be said for the other approaches.
Compared with JSR-14, this approach doesn't suffer from GJ's problems, also it should be clear what to expect from this approach. Hopefully JSR-14 can be changed before it is too late.

(a) How you intend generic methods to be translated.
Given that Vector and Vector<Object> are unrelated types,
what would that type be represented as in the byte code of
the method? In my approach Vector and Vector<Object> are related types. In fact the byte code signature of the existing method is exactly the same as it was in the legacy code using Vector.
To re-emphasize what I had said when explaining my approach:
System.out.println(Vector.class == Vector<Object>.class);  // displays true
System.out.println(Vector.class == Vector<String>.class);  // displays false
Vector vector1 = new Vector<Object>(); // legal
Vector<Object> vector2 = new Vector();  // legal
// Vector vector3 = new Vector<String>(); // illegal
// Vector<String> vector4 = new Vector();  // illegal
Vector<String> vector5 = new Vector<String>();  // legal
You must also handle the case where the type
parameter is itself a parameterized type in which the type
parameter is not statically bound to a ground instantiation.This is also very straightforward: (let me know if I have misunderstood you)
(translation of Vector given in my initial description)
public class SampleClass<TypeA> {
  public static void main(String[] args) {
    System.out.println(new Vector<Vector<TypeA>>(10, 10));
}would get translated as:public class SampleClass {
  public static final Class[][] $GENERIC_DESCRIPTOR = {{Object.class}};
  public static final byte[] $GENERIC_BYTES = {/*Generic Bytes Go Here*/};
  private static final Constructor $0 = Reflection.getDeclaredConstructor(Vector$$C16java_util_Vector.class, new Class[] {int.class, int.class});
  static void $1(Constructor _0, int _1, int _2) {
    try {
      System.out.println(Reflection.newInstance(_0, new Object[] {new Integer(_1), new Integer(_2)}));
    catch (Exception ex) {
      throw (RuntimeException)ex;
  public static void main(String[] args) {
    $1($0, 10, 10);
}and SampleClass<String> would get generated as:public class SampleClass$$C16java_lang_String {
  private static final Constructor $0 = Reflection.getConstructor(Vector$$C37java_util_Vector$$C16java_lang_String.class, new Class[] {int.class, int.class});
  public static void main(String[] args) {
    SampleClass.$1($0, 10, 10);
Also describe the implementation strategy for when these
methods are public or protected (i.e. virtual).As I said in my initial description that for non final, non static, non private method invocations a Method may be passed into the implementing synthetic method as a parameter.
Note: the following main method will display 'in B'.
class A {
  public void foo() {
    System.out.println("in A");
class B extends A {
  public void foo() {
    System.out.println("in B");
public class QuickTest {
  public static void main(String[] args) {
    try {
      A.class.getMethod("foo", null).invoke(new B(), null);
    catch (Exception ex) {}
}This is very important as foo() may be overwritten by a subclass as it is here. By passing a Method to the synthetic implementation this guarantees that covariance, invariance and contra variance all work exactly the same way as in java. This is a fundamental problem with many other approaches.
(b) The runtime overhead associated with your translationAs we don't have a working solution to compare this to, performance comments are hard to state, but I hope this helps anyway.
The Class Load time is affected in 4 ways. i) All the Generic Bytes exist in the Base Class, hence they don't need to be read from storage. ii) The custom class loader, time to parse the name and failed finds before it finally gets to define the class. iii) The generation of the generic bytes to parametric bytes (basically involves changing bytes from the Constant Pool worked out from a new Parametric type, Utf8, Class and the new Parametric Constant types may all be effected) iv) time to do the static Reflection stuff (this is the main source of the overhead). Basically this 1 time per class overhead is nothing to be concerned with, and Sun could always optimize this part further.
The normal Runtime overhead (once Classes have been loaded) is affected mainly by reflection: On older JDKs the reflection was a lot slower, and so might have made a noticeable impact. On newer JDKs (since 1.4 I think), the reflection performance has been significantly improved. All the time consuming reflection is done once per class (stored in static fields). The normal reflection is very quick (almost identical to what is getting done without reflection). As the wrappers simply include a single method call to another method, these can be in-lined and hence made irrelevant. Furthermore it is not too difficult to make a parameter that would include small methods in the wrapper classes, as this does not affect functionality in the slightest, however in my testing I have found this to be unnecessary.
(c) The space overhead (per instantiation)There are very small wrapper classes (one per new Type) that simply contain all non private methods, with single method calls to the implementing synthetic method. They also include any fields that were in the original class along with other synthetic fields used to store reflected information, so that the slow reflection only gets done once per new Type.
(d) The per-instance space overheadNone.
(e) Evidence that the proposed translation is sound and well-defined for all relevant cases (see below)Hope this is enough, if not let me know what extra proof you need.
(f) Evidence for backward compatibility
(For example, how does an old class file that passes a Vector
to some method handle the case when the method receives a Vector<T>
where T is a type parameter? In your translation these types are unrelated.)As explained above, in my approach these are only unrelated for T != Object, in the legacy case T == Object, hence legacy code passing in Vector is exactly the same as passing in Vector<Object>.
(g) Evidence for forward compatibility
(How, exactly, do class files that are compiled with a generics compiler run on an old VM)They run exactly the same way, the byte codes from this approach are all legal java, and all legal java is also legal in this approach. In order to take advantage of the Generics the Custom Class Loader would need to be used or else one would get ClassNotFoundExceptons, the same way they would if they tried using Collections on an old VM without the Collections there. The Custom Class Loader even works on older VMs (note it may run somewhat slower on older VMs).
(h) A viable implementation strategyType specific instantiations are at Class Load time, when the Custom Class Loader gets asked for a new Class, it then generates it.
The type specific instantiations are never shipped as they never get persisted. If you really wanted to save them all you need to do is save them with the same name (with the $$ and _'s etc), then the class loader would find them instead of generating them. There is little to be gained by doing this and the only reason I can think of for doing such a thing would be if there was some reason why the target VM couldn't use the Custom Class Loader (the Reflection class would still need to be sent as well, but that is nothing special). Basically they are always generated at Runtime unless a Class with the same name already exists in which case it would be used.
The $GENERIC_DESCRIPTOR and $GENERIC_BYTES from the base class along with the new Type name are all that is required to generate the classes at runtime. However many other approaches can achieve the same thing for the generation, and approaches such as NextGen's template approach may be better. As this generation is only done once per class I didn't put much research into this area. The way it currently works is that the $GENERIC_DESCRIPTOR are basically used to verify that a malicious class files is not trying to create a non Type Safe Type, ie new Sample<Object>() when the class definition said class Sample<TypeA extends Button>. The $GENERIC_BYTES basically correspond to the normal bytes of a wrapper class file, except that in the constant pool it has some constants of a new Parametric Constant type that get replaced at class load time. These parametric constants (along with possibly Utf8 and Class constants) are replaced by the Classes at the end of the new type name, a little more complex than that but you probably get the general idea.
These fine implementation details don't affect the approach so much anyway, as they basically come down to class load time performance. Much of the information in the $GENERIC_BYTES could have been worked out by reflection on the base type, however at least for now simply storing the bytes is a lot easier.
Note: I have made a small syntax change to the requested class:
public T(X datum) --> public T<X>(X datum)
class T<X> {
  private X datum;
  public T<X>(X datum) {
    this.datum = datum;
  public T<T<X>> box() {
    return new T<T<X>>(this);
  public String toString() {
    return datum.toString();
  public static void main(String[] args) {
    T<String> t = new T<String>("boo!");
    System.out.println(t.box().box());
}would get translated as:
class T {
  public static final Class[][] $GENERIC_DESCRIPTOR = {{Object.class}};
  public static final byte[] $GENERIC_BYTES = {/*Generic Bytes Go Here*/};
  private Object datum;
  private static final Field $0 = Reflection.getDeclaredField(T.class, "datum");
  private static final Constructor $1 = Reflection.getDeclaredConstructor(T$$C1T.class, new Class[] {T.class});
  static void $2(Field _0, Object _1, Object _2) {
    Reflection.set(_0, _1, _2);
  static Object $3(Constructor _0, Object _1) {
    try {
      return Reflection.newInstance(_0, new Object[] {_1});
    catch (Exception ex) {
      throw (RuntimeException)ex;
  static String $4(Field _0, Object _1) {
    return Reflection.get(_0, _1).toString();
  static void $5() {
    T$$C16java_lang_String t = new T$$C16java_lang_String("boo!");
    System.out.println(t.box().box());
  public T(Object datum) {
    $2($0, this, datum);
  public T$$C1T box() {
    return (T$$C1T)$3($1, this);
  public String toString() {
    return $4($0, this);
  public static void main(String[] args) {
    $5();
}as the generic bytes aren't very meaningful and by no means a requirement to this approach (NextGen's template method for generation may work just as well), here are the generated classes with some unused code commented out instead:
class T$$C28T$$C22T$$C16java_lang_String {
  private T$$C22T$$C16java_lang_String datum;
  private static final Field $0 = Reflection.getDeclaredField(T$$C28T$$C22T$$C16java_lang_String.class, "datum");
//  private static final Constructor $1 = Reflection.getDeclaredConstructor(T$$C34T$$C28T$$C22T$$C16java_lang_String.class, new Class[] {T$$C28T$$C22T$$C16java_lang_String.class});
  public T$$C28T$$C22T$$C16java_lang_String(T$$C22T$$C16java_lang_String datum) {
    T.$2($0, this, datum);
//  public T$$C34T$$C28T$$C22T$$C16java_lang_String box() {
//    return (T$$C34T$$C28T$$C22T$$C16java_lang_String)T.$3($1, this);
  public String toString() {
    return T.$4($0, this);
  public static void main(String[] args) {
    T.$5();
class T$$C22T$$C16java_lang_String {
  private T$$C16java_lang_String datum;
  private static final Field $0 = Reflection.getDeclaredField(T$$C22T$$C16java_lang_String.class, "datum");
  private static final Constructor $1 = Reflection.getDeclaredConstructor(T$$C28T$$C22T$$C16java_lang_String.class, new Class[] {T$$C22T$$C16java_lang_String.class});
  public T$$C22T$$C16java_lang_String(T$$C16java_lang_String datum) {
    T.$2($0, this, datum);
  public T$$C28T$$C22T$$C16java_lang_String box() {
    return (T$$C28T$$C22T$$C16java_lang_String)T.$3($1, this);
  public String toString() {
    return T.$4($0, this);
  public static void main(String[] args) {
    T.$5();
class T$$C1T {
  private T datum;
  private static final Field $0 = Reflection.getDeclaredField(T$$C1T.class, "datum");
//  private static final Constructor $1 = Reflection.getDeclaredConstructor(T$$C6T$$C1T.class, new Class[] {T$$C1T.class});
  public T$$C1T(T datum) {
    T.$2($0, this, datum);
//  public T$$C6T$$C1T box() {
//    return (T$$C6T$$C1T)T.$3($1, this);
  public String toString() {
    return T.$4($0, this);
  public static void main(String[] args) {
    T.$5();
class T$$C16java_lang_String {
  private String datum;
  private static final Field $0 = Reflection.getDeclaredField(T$$C16java_lang_String.class, "datum");
  private static final Constructor $1 = Reflection.getDeclaredConstructor(T$$C22T$$C16java_lang_String.class, new Class[] {T$$C16java_lang_String.class});
  public T$$C16java_lang_String(String datum) {
    T.$2($0, this, datum);
  public T$$C22T$$C16java_lang_String box() {
    return (T$$C22T$$C16java_lang_String)T.$3($1, this);
  public String toString() {
    return T.$4($0, this);
  public static void main(String[] args) {
    T.$5();
}the methods from the Reflection class used in these answers not given in my initial description are:
  public static final Object newInstance(Constructor aConstructor, Object[] anArgsArray) throws Exception {
    try {
      return aConstructor.newInstance(anArgsArray);
    catch (InvocationTargetException ex) {
      Throwable cause = ex.getCause();
      if (ex instanceof Exception) {
        throw (Exception)ex;
      throw new Error(ex.getCause());
    catch (Exception ex) {
      throw new Error(ex);
  public static final Constructor getDeclaredConstructor(Class aClass, Class[] aParameterTypesArray) {
    try {
      Constructor constructor = aClass.getDeclaredConstructor(aParameterTypesArray);
      constructor.setAccessible(true);
      return constructor;
    catch (Exception ex) {
      throw new Error(ex);
  }

Similar Messages

  • What do you think about the html5?

    I've been seeing developers philosophizing about the future, and I want to know what do you think about the brand new html5?
    mainly because the html5 can take out of the market technology ( flex ).
    thanks for the opinion!!!
    [email protected]

    Yep this is most definitely not just a rumor, I've found plenty of sources talking about this.
    Here's someone's take on HTML5, a non-Adobe perspective, from a Silverlight developer.  I thought this would be interesting to mention.  Not sure I agree 100% with everything said (IE may not be most used browser and I don't believe in DRM), but it's an interesting read anyway:
    Yes, you can do a LOT of stuff with HTML5 + JS that Silverlight is good for. But HTML5 will only reach Candidate Recommendation status in 2012 - if Silverlight keeps the current pace, it will be at V7 by then.
    HTML5 will only get you approximately what Silverlight had at V1.0. A Canvas element, some video playback capabilites, and a Javascript programming model. Can you imagine how further advanced Silverlight 4 is at the moment?
    Actually, scratch that - the video quality and availability of HTML5 is a lot worse than what Silverlight has to offer. There is no DRM, no Smooth Streaming, not even full screen! No GPU acceleration either. Even the codec HTML5 has to support is not standardized! This results in Firefox 3.6 having only Theora decoder, and Youtube experimenting with HTML in H.264 (on the same day FF3.6 launched), only playable in approx. 4-5% of the world's browsers.
    Internet Explorer is still the most widely used browser on the web, and does not have HTML5. Currently, there are more Silverlight capable browsers browsing the web than HTML5 compatible ones. I don't think that in the next 3 years you will be able to create an HTML5 app and hope that at least 50% of the world's population can view it without switching browsers. (and remember: installing a plugin is a lot less hassle than switching to a new browser!)
    HTML5 will not be truly cross-browser standard for quite a long time, if ever. There are too many things that the browser developer can do as they wish - just think about the aforementioned video codec issue. There are too many little differences in each browser's Javascript implementation to make it really portable.
    The developer story: nothing in the HTML + JS world comes close to the awesome Visual Studio and Expression Blend tools. Javascript is cool for small apps, but cannot hold a candle to C# when it comes to serious development. Fighting with browser and OS incompatilities takes up a huge amount of time for any HTML website or web app - with Silverlight you don't have this.
    Just compare what the best HTML / Ajax company in the world (Google) did with maps, and what MS did to see the difference. Go tohttp://maps.google.com/ (watch out - the Streetview part is in Flash, not Ajax), and compare it to http://www.bing.com/maps/explore/. That is the difference I am talking about.
    Of course he means (or should have meant) Flex/Flash rather than just Flash.  As for the GWT and other AJAX fanboys who I guess think browser compatibility problems are going to be a thing of the past (or won't be a drag on corporate bottom lines - haha), it makes you wonder what other wild fantasies they're envisioning for the future.  Next they'll come and tell us XML-based protocols are going to be as fast as AMF...

  • What do you think about the iPhone 4 for my 11 year old daughter

    What do you think about the iPhone 4 for my 11 year old daughter

    It should be a good choice. I recently got the 5C which typically is $99 with supported carriers. Verizon, AT&T, Sprint provide attractive pricing with a two year contract or it you are adding a line to your current service. I have several friends using the 4S, and they have been very pleased with them.

  • What do you think about the value of MacKeeper?

    What do you think about the value of the free download MacKeeper?

    See below.
    https://discussions.apple.com/docs/DOC-3036

  • What do u think about the new imac quad, what do u think about the new imac quad

    what do u think about the new imac quad, what do u think about the new imac quad?

    I think you should buy me one.

  • What do people think of the Windows 7 Starter

    What does everyone think of the Windows 7 Starter edition that comes preloaded on the netbooks? Are most people doing the upgrade to Home premium and if so how does it perform on the netbooks?

    Hi
    In my opinion its depending of that what you do with your notebook. I mean you have to install a lot of applications on other Windows 7 versions too and if you only use the notebook for Internet and Office I think Windows 7 Starter is enough.
    Furthermore its a good idea the different versions of Windows 7. So you can save money if you dont need all functions.

  • What do you think about the iMac Intel 17"

    I wonder if there is a big difference between the iMac 17" 1.83 Ghz (from 999$) and the iMac 17" with 2 Ghz (from 1199$). One of them includes apple remote, 1Go SDRAM and a superdrive DVD writer for 200$ more than the other. I'd like to know what you think about the iMac 1.83Ghz 999$, should i wait and choose the 2Ghz model ?

    I checked out both models, and I think the 2.0 Ghz is actually a much better deal. OS X is amazing but its very graphics intensive and uses a lot of memory. The included video card in the 2 ghz machine helps a lot. Furthermore, the ability to write DVDs makes it fast and easy to archive your data for backup and portability. I would strongly recommend the upgraded system, unless your intended uses don't include much video/audio application. If you are going to be playing around with a lot of music or movies, the upgraded graphics, memory, and processor speed will really help.
    2 ghz Core2duo iMac 17"   Mac OS X (10.4.8)  

  • What do you think about the new and improved SiriusDecisions Waterfall?

    SiriusDecisions launched their new and improved Demand Waterfall this week at their Summit in Scottsdale, Arizona. For those of you who haven't seen it yet, I have attached the PDF for your viewing pleasure. What do you think? What's strong? What's weak? Do you agree with Tony Jaros that teleprospecting is a required step in the Marketing Qualification process?

    It makes a lot of sense from our perspective.  Our sales organization has always generated the bulk of our leads, so it makes sense to account for them and to build programs to support them.  It was a great conference - my first SiriusDecisions Summit.  I came away both energized and overwhelmed.
    Our Inside Sales team qualifies almost all inquiries via telephone, so it makes sense to me that "teleprospecting" is a required step.  The only exceptions are sales-generated leads, so the waterfall reflects that perfectly.
    What I like most about the new waterfall is that it creates a clear structure for us to focus more on developing lead nurturing and pipeline acceleration programs specifically for teleprospecting- and sales-generated leads.  I'll admit that we've neglected this (simply including those contacts in our marketing-generated lead nurtures).  Furthermore, it reinforces the need to tailor nurtures to the buyer's stage in the buying process.  We tend to move all of our contacts through the same campaign and nurture activities as if they're progressing together, which obviously isn't the case.
    I'd be interested in learning how other Eloqua users are getting data back from their CRM on a contact who has turned into a qualified lead.  How do you find this information out?  Do you then put them through an individual nurture that is focused on accelerating the deal?

  • What do you think about the Verizon Android Phone?

    They launched a website called DroidDoes.com - and a whole slew of marketing ads.
    Basically the phone is an iPhone with a physical keyboard, isn't it?
    Techcrunch is saying that it may wipe the iPhone floor. What do you guys think?

    I consider all mobile phone providers to be about the same in terms of quality of reception and customer service. I get great AT&T service in most areas, and have found Verizon deficient in others. But since I travel internationally, and Verizon's technology being only available in the US, AT&T is by far the better choice. GSM and its future variants are pretty much the worldwide standard. Verizon's CDMA is mostly a US dead-end technology.
    As for the phones, about the only advantage of the Android is a replaceable battery, but that advantage is tiny. Apple can design a larger battery to fit in the phone if it's not replaceable. And there are external solutions for charging in a pinch that are cheaper than a replacement.
    Outside of us, there are some extreme anti-iPhone types in the press and in the top blogs. See the Boy Genius Report for really good information about the mobile phone industry and an almost pathological anti-Apple, anti-iPhone attitude. This attitude may be because of Apple's dominance of this segment, or because they love fixing the multitude of problems found when using other platforms. I have no clue.
    As for the other points:
    Multi-tasking. Yes, I wish I could multi-task and use my XM/Sirius App while running navigation, which my Garmin does perfectly, while allowing me to use my iPhone connected by Bluetooth. But allowing multitasking will lead to more conflicts, lower battery use (not just by a bit either), and is truly not necessary. Of course, I can listen to the iPod function and almost every other program simultaneously, so that's what 90% of users want.
    Night shots. If I want a good camera, I use a Nikon. The iPhone camera does what it does at the good enough level without adding cost.
    Open development. Well, just about anyone can be an iPhone developer. And you have to follow the rules. You can make money off of it. Maybe I'm missing what open development means, but instead of anarchy, Apple put some order to it. That's a good thing, and that's why all Apple products work very well out of the box. Unless you're some geeky desire to build the perfect **** app....oh wait a minute!
    Customization. I think Verizon was getting desperate. At the software level, my iPhone does everything I need to do in the way I want. I've got ringtones for every friend. I've got weather, stock and other types of apps that let me live my life almost without a computer. I've got a cool app that provides detailed topographical maps for hiking in remote areas. I've got Madden 10. What else do I need! But, let's look at customization from a different perspective. How many tens of thousands of aftermarket products are available for the iPhone? Or maybe Verizon means the ability to add memory? I've got a 32 GB iPhone. One day, I'll wish that it's a 64GB version, maybe that will be out next June. There is no need for a memory card in my life.
    Widgets. I have no clue what this means, but I've got tons of apps. What else do I need?
    Keyboard. I remember when Apple removed the 3.5" disk from their products. When that happened, I hadn't used a disk like that for a couple of years, so I thought it was logical. But the press and the "real computer" people laughed that it was a huge mistake. Well, 3.5" disks were dead in less than a year. At first, I wasn't a fan of the keyboard on the iPhone. Now, whenever I use a blackberry or some other phone with a keyboard, I find it antiquated and hard to use. Also, I always complain that I lose some of the screen footprint to the keyboard, or find the phone too fat when you have a slide-out keyboard.
    As most of us know, when we buy the new iPhone, it's an event. There are lines. There are new reports. I remember reading the reports on the Palm Pre launch. Not even close to the iPhone. The fact is that the Android will be interesting to some.
    I know there's a certain arrogance to iPhone users. When I'm on a flight, I can see that the iPhone has the huge market share in smartphones. And that's amongst teenagers, college grads, and grumpy old business execs like me. Typical of all Apple products, it does things really well. Getting and organizing music is pretty close to perfect. Unless Verizon is going to do the Palm method of syncing to iTunes, you're going to have to use their method of doing it. Imagine how much it's going to cost.
    The iPhone is at least a year ahead of all other competitors in technology. The problem for the competition is that Apple doesn't stand still. Soon, there will be rumors and speculation about the next version of the iPhone. Verizon will be way behind by then.

  • Oracle Security : what do you think about the following policy violation ?

    If you install OEM10, you will be able to see if you violate some security guidelines :
    Interresting is revoking UTL_FILE from public, which is critical. Also revoke UTL_TCP and UTL_SMTP. This is going to upset an expert I know...
    Take care about the failed login attempts. If you set it to 10 to the default profile, and if your DBSNMP password is NOT the default password, then Oracle will lock your account after node discovery!
    In Solaris, you can disable execution of the user stack with the system parameters set noexec_user_stack=1
    set noexec_user_stack_log=1. I did not find how to do it on AIX. However, those settings may have side effects.
    About the ports, it complains about open ports, even if this is the port oracle listener is using! Simply ignore most of the violations there.
    About JAccelerator (NCOMP), it is located on the "companion" CD.
    Ok, Waiting for your feedback
    Regards
    Laurent
    [High]      Critical Patch Advisories for Oracle Homes     Configuration     Host     Checks Oracle Homes for missing critical patches          
    [High]      Insufficient Number of Control Files     Configuration     Database     Checks for use of a single control file          
    [High]      Open ports     Security     Host     Check for open ports          
    [High]      Remote OS role     Security     Database     Check for insecure authentication of remote users (remote OS role)          
    [High]      EXECUTE UTL_FILE privileges to PUBLIC     Security     Database     Test for PUBLIC having EXECUTE privilege on the UTIL_FILE package          
    [High]      Listener direct administration     Security     Listener     Ensure that listeners cannot be administered directly          
    [High]      Remote OS authentication     Security     Database     Check for insecure authentication of remote users (remote OS authentication)          
    [High]      Listener password     Security     Listener     Test for password-protected listeners          
    [High]      HTTP Server Access Logging     Security     HTTP Server     Check that HTTP Server access logging is enabled          
    [High]      Web Cache Access Logging     Security     Web Cache     Check that Web Cache access logging is enabled          
    [High]      Web Cache Dummy wallet     Security     Web Cache     Check that dummy wallet is not used for production SSL load.          
    [High]      HTTP Server Dummy wallet     Security     HTTP Server     Check that dummy wallet is not used for production SSL load.          
    [High]      Web Cache owner and setuid bit'     Security     Web Cache     Check that webcached binary is not owned by root and setuid is not set          
    [High]      HTTP Server Owner and setuid bit     Security     HTTP Server     Check the httpd binary is not owned by root and setuid bit is not set.          
    [High]      HTTP Server Directory Indexing     Security     HTTP Server     Check that Directory Indexing is disabled on this HTTP Server          
    [High]      Insufficient Redo Log Size     Storage     Database     Checks for redo log files less than 1 Mb          
    [Medium]      Insufficient Number of Redo Logs     Configuration     Database     Checks for use of less than three redo logs          
    [Medium]      Invalid Objects     Objects     Database     Checks for invalid objects          
    [Medium]      Insecure services     Security     Host     Check for insecure services          
    [Medium]      DBSNMP privileges     Security     Database     Check that DBSNMP account has sufficient privileges to conduct all security tests          
    [Medium]      Remote password file     Security     Database     Check for insecure authentication of remote users (remote password file)          
    [Medium]      Default passwords     Security     Database     Test for known accounts having default passwords          
    [Medium]      Unlimited login attempts     Security     Database     Check for limits on the number of failed logging attempts          
    [Medium]      Web Cache Writable files     Security     Web Cache     Check that there are no group or world writable files in the Document Root directory.          
    [Medium]      HTTP Server Writable files     Security     HTTP Server     Check that there are no group or world writable files in the Document Root directory          
    [Medium]      Excessive PUBLIC EXECUTE privileges     Security     Database     Check for PUBLIC having EXECUTE privileges on powerful packages          
    [Medium]      SYSTEM privileges to PUBLIC     Security     Database     Check for SYSTEM privileges granted to PUBLIC          
    [Medium]      Well-known accounts     Security     Database     Test for accessibility of well-known accounts          
    [Medium]      Execute Stack     Security     Host     Check for OS config parameter which enables execution of code on the user stack          
    [Medium]      Use of Unlimited Autoextension     Storage     Database     Checks for tablespaces with at least one datafile whose size is unlimited          
    [Informational]      Force Logging Disabled     Configuration     Database     When Data Guard Broker is being used, checks primary database for disabled force logging          
    [Informational]      Not Using Spfile     Configuration     Database     Checks for spfile not being used          
    [Informational]      Use of Non-Standard Initialization Parameters     Configuration     Database     Checks for use of non-standard initialization parameters          
    [Informational]      Flash Recovery Area Location Not Set     Configuration     Database     Checks for flash recovery area not set          
    [Informational]      Installation of JAccelerator (NCOMP)     Installation     Database     Checks for installation of JAccelerator (NCOMP) that improves Java Virtual Machine performance by running natively compiled (NCOMP) classes          
    [Informational]      Listener logging status     Security     Listener     Test for logging status of listener instances          
    [Informational]      Non-uniform Default Extent Size     Storage     Database     Checks for tablespaces with non-uniform default extent size          
    [Informational]      Not Using Undo Space Management     Storage     Database     Checks for undo space management not being used          
    [Informational]      Users with Permanent Tablespace as Temporary Tablespace     Storage     Database     Checks for users using a permanent tablespace as the temporary tablespace          
    [Informational]      Rollback in SYSTEM Tablespace     Storage     Database     Checks for rollback segments in SYSTEM tablespace          
    [Informational]      Non-System Data Segments in System Tablespaces     Storage     Database     Checks for data segments owned by non-system users located in tablespaces SYSTEM and SYSAUX          
    [Informational]      Users with System Tablespace as Default Tablespace     Storage     Database     Checks for non-system users using SYSTEM or SYSAUX as the default tablespace          
    [Informational]      Dictionary Managed Tablespaces     Storage     Database     Checks for dictionary managed tablespaces (other than SYSTEM and SYSAUX)          
    [Informational]      Tablespaces Containing Rollback and Data Segments     Storage     Database     Checks for tablespaces containing both rollback (other than SYSTEM) and data segments          
    [Informational]      Segments with Extent Growth Policy Violation     Storage     Database     Checks for segments in dictionary managed tablespaces (other than SYSTEM and SYSAUX) having irregular extent sizes and/or non-zero Percent Increase settings

    Interresting is revoking UTL_FILE from public, which is critical. Also revoke UTL_TCP and UTL_SMTP. This is going to upset an expert I know...Okay, as this is (I think) aimed at me, I'll fall for it ;)
    What is the point of revoking UTL_FILE from PUBLIC? Yes I know what you think the point is, but without rights on an Oracle DIRECTORY being able to execute UTL_FILE is useless. Unless of course you're still using the init.ora parameter
    UTL_FILE_DIR=*which I sincerely hope you're not.
    As for UTL_SMTP and UTL_TCP, I think whether a program is allowed to send e-mail to a given SMTP server is really in the remit of the e-mail adminstrator rather than the DBA.
    Look, DBAs are kings of their realm and can set their own rules. The rest of us have to live with them. A couple of years ago I worked a project where I was not allowed access to the USER_DUMP_DEST directory. So every time I generated a TRC file I had to phone up the DBA and a couple of hours later I got an e-mail with an attachment. Secure yes, but not very productive when I was trying to debug a Row Level Security implementation.
    I have worked on both sides of the DBA/Developer fence and I understand both sides of the argument. I think it is important for developers to document all the privileges necessary to make their app run. Maybe you don't have a better way of doing that than revoking privileges from PUBLIC. Or maybe you just want to generate additional communication with developers. That's fine. I know sometimes even DBAs get lonely.
    Cheers, APC

  • What do people think about Quicken & Mac?

    Hi there. I am thinking of using a new personal finance software to help with family budget, etc... Is Quicken the software to use? Does it work well with Mac? What other options are out there? I'm TOTALLY new to this budget stuff on the computer.
    Thanks for any help.
    M.

    I've used Quicken for a long time, and it does what I need: help me keep track of expenditures & make simple reports & graphs to describe past spending. If that's what you want to do, then I'll say Quicken could be helpful to you.
    One thing you might not like about Quicken (and probably any computer-based accounting system): I find that I have to spend quite a bit of time entering data about checks that I write by hand, about payments I make online, and about purchases I make via debit card. All of this data can, theoretically, be downloaded automatically by Quicken from my bank, but I do not like that option. I prefer to cross-check the bank's records by doing it myself. Also, the downloaded transactions usually look something like "ID# 3334405995 VENDOR AD56KF32KDM 123 SOMESTREET SUITE 456 MIAMI FLORIDA" rather than "Bob's Hardware", as I might name it.

  • What do you think about the Belkin - Snap Shield for Apple iPad 2 - Clear protector?

    well i've just bought it, does somebody have it for some time??? what can you tell me about it

    I think Apple has really screwed this UP! You are correct,
    they should be posting a fix for the umpteen gillion of us who spent hundreds of dollars on their product and then they give us a crappy "upgrade" that renders the very expensive product USELESS!!! This is extremely frustrating. I should not have to be a rocket scientist
    to use my **** mp3 player!

  • Distance runners what do you think about the nano

    So i really want to get an ipod nano right, but im concerned about how it will hold up with very active running as well as capacity. I run cross country, track, etc and train all year round and being very active with that but I have quite a bit a music though. I plan to just import music from my cd's rather than download constantly. Has anyone had any problems running with it or anything I should know about using it in that fasion. Would I be better off getting 20gb ipod instead of the nano as far as my music capacity is concerned or its use?. I'd love to hear your comments and thank you in advance.
    - Eric

    I run with the Nano and I believe that "iPods make you faster" should be the new tagline. Anyway, since it's solid state, it's perfect for active workouts. The 4 GB model can potentially provide days worth of music without repeat so it should be good enough. Frankly, a lot of music that you have might not be so terrific to work out with anyway (running to Dark Side of the Moon? don't think so). Beware the hard disk models for any rough activity. Too much jostling of those tiny heads and the drives will crash.
    Also, the stopwatch feature on the Nano is too cool. Lets you save each day's timing so you can see how you do from day to day. Also has a neat lap timer feature.

  • I know this is a creative board, but what do you think about the iriver h10 2

    Iri'ver just came out with a 20GB version of it's h0 jukebox player, as well as a GB flash version and a 6 GB version. This thing has all the features of the micro, voice recording, no line in, but fm radio etc, etc... and it views photos on a color screen. It's priced 50 bucks less than the ipod photo, although it doesn't have the ability to display slideshows on regular tv with music in the background, and, if it's the same as the h0 5 GB, it's going to be compatible with subscription music services... any thoughts?

    First thing I think of when I hear iRi'ver: $$
    And I'm pretty sure it will support PlaysForSure which is needed in all subscription based services...

  • What Do You Think About The New 1.2 Version Of iTunes

    It isi interestinf for me, if only i think it *****, or maybe all users experiense problems with it.Also, Apparently there is a question to the apple progammers aren't they going to fix this bug update, or i will never ever update anything from them!Aren't they going to fix the froblem as fast as possible.
    For me giving plenty of money for a machine close to luxury is enought to get a perfect servise.Plus I buy many features of apple sinse 2 months ago.And by the way, ***?U don;t do your joob!It is your job and you don't do it!

    I think Apple has really screwed this UP! You are correct,
    they should be posting a fix for the umpteen gillion of us who spent hundreds of dollars on their product and then they give us a crappy "upgrade" that renders the very expensive product USELESS!!! This is extremely frustrating. I should not have to be a rocket scientist
    to use my **** mp3 player!

Maybe you are looking for

  • New iPhone 5 will not connect to WiFi

    I finally upgraded to a iPhone 5 from my old 3G and I cannot get it to connect ot my home WiFi.  It can see the WiFi and I have WEP encription on the network using a Netgear WGT624v3 wireless router and 128bit encryption and when I enter the password

  • Can't find Twain plug in for Photoshop Elements 12 from App store

    I'm running OSX Mavericks and have purchased Photoshop Elements 12 from the App Store. I want to be able to scan things into Elements but the import option is grayed out. I've tried to follow these directions (TWAIN not installed | Photoshop Elements

  • Can't burn a readable DVD

    Using Elements 7... I just bought his to try my hand an some vacation videos... last time I used Elements was v3! Anyway I can't for the life of me burn a DVD that is readable once it is finished. I'm using some older 4x DVD+R media. Everything seems

  • Grid infrastructure with GNS @ windows 2008 R2

    hello! i want to install grid infrastructure (for a 2 node rac) with gns on a windows 2008 r2 server. the dns/dhcp server is also windows 2008 r2. can anyone provide an example which ips, dns-forwards etc. i have to configure on the dns/dhcp server?

  • Can't stand iOS 7, can I reset to iOS 6?

    I'm having all sorts of trouble with iOS 7. Really dislike it. Any way I can go back to another version?