پنجشنبه، خرداد ۲۷، ۱۳۸۹

A very dynamic Java persistence application

Since I have started my work at my current company about one and a half years age, there were a huge emphasis on MDA and code generation. Though I don't believe that we can build a magic box for generating applications for all different kind of domains, it might be helpful in certain domains. Also generating the redundant and mundane parts of the application like CRUDs can be a real time saver.

One of the problems we had back then was the static nature of the Java language itself. We had to generate Java classes from different models and then compile and run it to see the result. Need to change model? You must go through the tedious generate-compile-run cycle. I didn't like it at all!

In some dynamic languages like Ruby, you can define classes at run time and even change them. If our framework were based on something like Ruby, there were no need for the generation/compilation phase. The framework could read models at startup and define classes on the fly. Unlike ours, there are no intermediate artifacts in this approach.

Recently I have found a way to do a similar thing with Java. Although it is not quite similar. In a language like Ruby, we don't have static type checking so if you know the call of a method in string format, you can send the method's name as a message to the Ruby object for the execution, but in Java you must use the Reflection API for this, which is supposed to be slower than normal method call.

So how we can define classes in Java at runtime? The key is a library named Javassist. Javassist is really easy to use! Love it :)

Enough for the history and theory, let's get our hand dirty and write some code to generate a class named Person using javassist. I have used the version 3.8 of this library which is also available in maven repositories.

ClassPool cp = ClassPool.getDefault();
CtClass ctClass = cp.makeClass("test.Person");

CtField idField = new CtField(cp.get(Long.class.getName()), "id", ctClass);
ctClass.addField(idField);

CtField nameField = new CtField(cp.get(String.class.getName()), "name", ctClass);
ctClass.addField(nameField);

CtField ageField = new CtField(cp.get(int.class.getName()), "age", ctClass);
ctClass.addField(ageField);

Class personClass = ctClass.toClass();


The code is self-explanatory, but if you have further questions, please ask it in comments. Also there is a good tutorial available here if you are interested to learn more. Basically the code above, defines a class named "Person" which resides in the "test" package. It has three field: id of type Long, name of type String and age of type int. the last line creates the actual Java class and loads it in JVM.

So now we have the Java class, like any other statically written one. How can we instantiate it and set its properties? The answer lies in the standard Java Reflection API.

Object person = personClass.newInstance();
Field field = personClass.getDeclaredField("name");
field.set(person, "Wickoo");

If the main class that runs these lines of code is also in the "test" package, the code runs successfully, otherwise you get the java.lang.IllegalAccessException exception, because the name field has no access modifier yet (package access). To overcome this, you have multiple choices. The simpler and more obvious one is to call

field.setAccessible(true);

before accessing the field. Or you can generate a public field in the first place.

CtField nameField = new CtField(cp.get(String.class.getName()), "name", ctClass);
nameField.setModifiers(Modifier.PUBLIC);

Or you can generate a setter:

CtMethod setNameMethod = CtNewMethod.make("public void setName(String name) {this.name = name;}", ctClass);
ctClass.addMethod(setNameMethod);

And then invoke the setter method:

Object person = personClass.newInstance();
Method method = personClass.getDeclaredMethod("setName", String.class);
method.invoke(person, "Wickoo");

I think now you must have a good idea about what Javassist is capable of. The aim of this post is to generate a class at runtime, instantiate it and the persist it.

I'm going to use JPA and Hibernate as its implementation here. For JPA you need to put a persistence.xml file inside META-INF folder in the class path. The content of persistence.xml are shown below:


xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">

org.hibernate.ejb.HibernatePersistence













In order to be able to persist a Java class using JPA, you need to annotate the class with @Entity or write a XML mapping file. Personally I like annotations. Also it shows the power of Javassit for generating annotations. So before proceeding further with the persistence let us generate an @Entity annotation for our class:

AnnotationsAttribute attr = new AnnotationsAttribute(classFile
.getConstPool(), AnnotationsAttribute.visibleTag);
Annotation entityAnnotation = new Annotation(Entity.class.getName(), classFile.getConstPool());
attr.addAnnotation(entityAnnotation);
classFile.addAttribute(attr);

We also need two more annotations to go. @Id and @GeneratedValue on the id field. All other fields will be persisted to the corresponding columns with the same name by convention. So we change how we make idField to this:

AnnotationsAttribute attribute = new AnnotationsAttribute(classFile
.getConstPool(), AnnotationsAttribute.visibleTag);

Annotation idAnnotation = new Annotation(Id.class.getName(), classFile.getConstPool());
attribute.addAnnotation(idAnnotation);

Annotation gvAnnotation = new Annotation(GeneratedValue.class.getName(), classFile.getConstPool());
attribute.addAnnotation(gvAnnotation);

CtField idField = new CtField(cp.get(Long.class.getName()), "id", ctClass);
idField.getFieldInfo().addAttribute(attribute);
ctClass.addField(idField);

Now we have everything in place. Let's try to persist it:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("dtest");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
Object person = personClass.newInstance();
em.persist(person);
em.getTransaction().commit();

After running this code, you'll get the "java.lang.IllegalArgumentException: Unknown entity: test.Person" exception. The reason for this is obvious! Hibernate can not find the entity's class anywhere. You must add it manually to Hibernate:

Ejb3Configuration configuration = new Ejb3Configuration();
configuration.addAnnotatedClass(personClass);
configuration.configure("dtest", null);
EntityManagerFactory emf = configuration.buildEntityManagerFactory();
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
Object person = personClass.newInstance();
em.persist(person);
em.getTransaction().commit();

Now you can check the database to see it with your own eyes that it works! Use the reflection methods described above to set person fields' values if you don't want to persist an empty object.

Please put your thoughts about this approach in the comments.

دوشنبه، خرداد ۱۰، ۱۳۸۹

Equality for entities in a Hibernate application - part II


Isn't the new code template in the previous part lovely? ha? In fact it is pretty easy task to do. Check this wonderful post out to do it yourself: Syntax Higlighting

I was reading Effective Java some time ago. It has a section devoted to implementing equals methods and after reading that, I thought it might be better if I revise my equals method. So I changed it to something like this:

@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if(!(obj instanceof BaseEntity)) {
return false;
}
BaseEntity o = (BaseEntity) obj;
return getId() == null ?
o.getId() == null : getId().equals(o.getId());
}

The new implementation is more compact and does not need HibernateProxyHelper. But this method does not behave exactly like before. Since it uses instanceof instead of getClass(), if you have a Car and a Dog entity instances, as long as they have equal ids, they are equal! In other words this method may not behave as expected when dealing with objects of a single hierarchy in a Java collection.

instanceOf operator returns false when the object is null so there is no need for null checking.

There is a huge problem in both these implementations. If you are anything like me and use Hibernate's automatic id generation, then the ids are not set until the object is persisted! Our implementation returns true when both ids are null and you should think twice about how equals should be implemented when two entities are not persisted yet. Maybe reference comparison is sufficient but it is largely application specific.

Even I have a bigger question! Is using id a wise comparison method to implement equals method? Even when ids are database auto-generated values? I doubt it. Again consider cat and dog example. I persist each one in a separate table and MySQL uses 1 as start number for each table's id value. So a dog and a cat with ids equal to 1 are equal! The previous version that used getClass() did not have this problem, because it checked the exact uniqueness across tables guarantees uniqueness across classes. (Ids are not equal across whole database, they are just equal in a single table in MySQL)

Perhpas it is better to implement the equals method in children and include some unique business keys if applicable! Like using national id but not all entities have unique business keys. hmm...

How do you implement your equals method on objects in a database application?

یکشنبه، خرداد ۰۹، ۱۳۸۹

Equality for entities in a Hibernate application - part I

Recently I've been working on a web application, which used Hibernate as its object persistence layer. I had a super Entity class which holds Id and optimistic locking variable (@Version).
I had a hard time writing equals and hashcode methods for entities and I haven't reached a conclusion so far. In this post I wanna share my thoughts with you on this subject.
First I have started writing the class, put some annotation on it and commanded eclipse to generate equals and hashcode for me. You can see the result below:

@MappedSuperclass
public class BaseEntity {
@Id @GeneratedValue
private Long id;

@Version
private int version;

public Long getId() { return id; }

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + version;
return result;
}

@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null) return false;
if (getClass() != obj.getClass()) return false;
BaseEntity other = (BaseEntity) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
}

As Larry David always says it looked pretty pretty pretty, pretty good. But eeh, you know, it did not work. Equals and hashcode manifest themselves mostly in Java Collections API and my application has dozens of them. No luck in finding the wanted object in the collections. After hours of debugging I found out that the problem is in the equals method and exactly in this line:

if (getClass() != obj.getClass()) return false;

Can you see what is wrong? Hibernate uses lazy initialization and most of the time the getClass() method doesn't return the real type (when is lazily initialized like in collections). Instead it returns a cglib-based proxy class. So this if condition sometimes returns false at this point. The solution I found was to get the real underlying class using the following Hibernate's utility class:

Class clazz = HibernateProxyHelper.getClassWithoutInitializingProxy(obj);

So I could compare the real underlying classes, but this alone did not solve the problem. There was an even harder to spot problem at this line:

if (id == null) {
if (other.id != null)
return false;

The objects were loaded from database so the id element was present. Why the hell it was null? The culprit was Hibernate lazy initialization mechanism again! My collections were lazily initialized and calling bare fields would return null! The solution is to call getters to give the entities a chance to initialize themselves, something like this:

if (getId() == null) {
if (other.getId() != null)
return false;
}
else if (!getId().equals(other.getId()))
return false;

Now it works like a charm! :) But there are even some problems here. Read on the next in part II.

جمعه، خرداد ۰۷، ۱۳۸۹

Clean code with Uncle Bob

For those of you interested in writing good code, I highly recommend this video from QCon 2010: Robert C. Martin: Bad code, Craftsmanship, Engineering and Certification
In an extremely funny and witty way, Uncle Bob explains his core philosophy about writing clean code. Also he has a book named Clean Code which is on my reading list for this summer. Hope you find it interesting either.

یکشنبه، اردیبهشت ۰۵، ۱۳۸۹

Curb your enthusiasm

This is the first time in the last two and half years that I'm not waiting for the next Ubuntu release! I believe the next Ubuntu would be just like the old ones. So this time I will curb my enthusiasm and suppress such geeky and idiotic tendencies to install the newest shit. I'm going to stick to my lovely Windows 7 for a long long time...

چهارشنبه، اردیبهشت ۰۱، ۱۳۸۹

Hands of Fate

Now I'm sitting here and constantly checking the status of my applications for next winter semester. I'm wondering where I'll be in next September: Stockholm, Aachen, Dresden, Helsinki, Eindhoven or maybe again Tehran? Here I am, on the road again... Here I go...

سه‌شنبه، فروردین ۳۱، ۱۳۸۹

Rediscovering what you have

Currently I'm reading "Effective Java" and it feels like going deeper into the language I thought I knew well. I see things I couldn't see before. Also I have bought a new pair of AKG headphones. Though not very expensive, the music sounds far better than before, Almost unbelievable! It has the same impact as Effective Java. It helps me to experience the hidden details and it feels very good. I'm listening to my Metallica collection and boy I love it, how could I be that ignorant all these years? I was always in search of new exotic metal music, new languages and frameworks, but the real thing was already here. I just needed to be able to see it! So it's time to stop searching and rediscovering what I've already got. They are the best...

جمعه، فروردین ۱۳، ۱۳۸۹

Book Review: The Passionate Programmer

سال گذشته در تعطیلات سال نو کتاب The Pragmatic Programmer را خواندم و بدون شک یکی از بهترین کتاب هایی است که تا کنون خوانده ام. امسال دنبال یک کتاب خوب دیگر می گشتم که به کتاب The Passionate Programmer از سری Pragmatic Bookshelf برخوردم و تصمیم گرفتم این کتاب را در تعطیلات مطالعه کنم. تصمیم داشتم این کتاب را روی iPod Touch بخوانم تا ببینم واقعا تجربه خواندن روی آیپاد چگونه است و دوم اینکه مستقیما فرمت ePub این کتاب خریدم و خودم را از دردسرهای تبدیل فرمت PDF به ePub راحت کردم و در کمال ناباوری پی بردم که iPod touch وسیله خیلی خوبی برای خواندن است. بسیار بهتر از ریدر سونی!

بطور کلی کتاب خوبی بود اما نه چیزی در اندازه The Pragmatic Programmer. نویسنده این کتاب Chad Fowler که نام خانوادگیش مثل Martin Fowler است یک نوازنده ساکسیفون بوده که به توسعه نرم افزار علاقه مند شده و وارد این حرفه می شود. یکی از نکات جالب این کتاب مقایسه تفاوت ها و تشابه های موفق شدن در حرفه موسیقی و نرم افزار است. اما هسته اصلی کتاب این جمله است: Creating a remarkable career in software development. نویسنده معتقد است که بیشتر وقت ما در زندگی صرف کار می شود و برای اینکه زندگی خوبی داشته باشیم باید از کار خود لذت ببیریم و یک remarkable career برای خود بسازیم.
اکثر نکات مطرح شده در این کتاب خیلی خوب هستند که در آخر این پست به صورت لیست می آیند ولی این نکته که اکثر پروژه ها به کشور هند outsource می شوند و ممکن است شغل خود را به یک برنامه نویس در آن طرف دنیا از دست دهیم (اگر در حرفه خود سرمایه گذاری نکنیم) مربوط به کشور ایالات متحده است و با وضعیت کنونی ما در ایران هیچ سنخیتی ندارد. تقریبا در ایران همه برنامه نویسان خوبی که من دیده ام از ایران رفته اند و یا در فکر رفتن هستند. این طرز فکر باعث می شود تمرکز زیادی روی حرفه جاری خود نداشته باشند و همه چیز را به آینده و رسیدن به بهشت موعود به تعویق بیندازند. البته به نظر من اوضاع این مملکت واقعا تخمیست و نمی توان از کسی توقع زیادی داشت.
بهترین قسمت این کتاب به نظر من بخش Path with No Destination بود. چند پاراگراف از این بخش را اینجا می آورم:
If you think about it, the focus on outcomes is logically the reverse of what we should be spending our time on. You typically spend all your time doing things and little of your time actually reaching goals...
This is true of your career as well. The real meat of your career is not the promotions and salary advances. It’s the time you spend working toward those advances. Or, more important, it’s the time you spend working regardless of the advances...
Returning to the software development example, it’s easy to get wrapped up in the delivery of the code you are creating. Your customer needs a web application up, and you focus on finishing that application. But, a living application is never “done.” One release leads to the next...
Focusing on the ending makes you forget to make the process good. And, bad processes create bad products. The product might meet its minimum requirements, but its insides will be ugly. You’ve optimized for the short-term end goal—not for the inevitable, ongoing future of the product’s development.
در حین خواندن این کتاب نکات مهم را یادداشت کردم و الان یادداشت های خود را این جا می آورم. برای توضیحات در مورد این نکات کتاب را بخوانید!
1. Learn more about business, financial issues and money.
2. Join an open source project and try to contribute.
3. Start learning Ruby.
4. Learn about internals of Java Virtual Machine and class loading.
5. Read the book ten-day MBA to better understand how a business operates.
6. Teach one topic you know well.
7. Learn each week one aspect of Java you haven't explore yet.
8. Read code.
9. Maintain a todo list. Have a log about your daily progress.
10. 8 hours work scheme seems awesome! Never work more than 8 hours a day from now on.
11. Maintain a log about your commitments and review them. What is your hit-rate of success?
12. Invest more on your social skills. Context and perception matters. So find out who you are dealing with and answer accordingly.
13. Invest more in your English, writing abilities and generally clear communication.
14. The path is the end! Read more about mindfulness and the Buddhism philosophy!
15. Having a road map for your product is what keeps you moving forward.

سه‌شنبه، فروردین ۱۰، ۱۳۸۹

بهترین و بدترین خرید های سال 88

در این پست می خوام از خرید های پارسالم بنویسم. من کلا آدم ولخرجی هستم و معمولا دوست دارم آخرین دستگاه های دیجیتالی رو بخرم. به هر حال پارسال با این بحران مالی که شرکت دچار بود، حقوق (منظم؟؟) نمی گرفتم و خرید ها خیلی کمتر از سال گذشته بود ولی در هر حال یک تجربه جالب و مهم به دست آوردم که در آخر پست باهاتون در میان میگذارم. اول از خرید های بد شروع می کنم!

بدترین خرید سال: Sony Reader PRS-600
یکی از آرزوهای من داشتن یک کتاب خوان الکترونیکی بود که بتوانم بدون نیاز به لپتاپ کتاب ها با فرمت PDF رو بخونم. iPod Touch صفحه کوچکی داره و خواندن را مشکل می کنه، به همین دلیل تصمیم گرفتم که به یکی از دوستان که برای تعطیلات از کانادا به ایران می آمد بگویم که برام یک ریدر بخرد. بین آمازون کیندل و سونی ریدر شک داشتم. مدل جدید سونی در تئوری دستگاه بسیار بهتری بود. پشتیبانی مستقیم از PDF، امکان صفحه لمسی، ظاهر زیبا، پروسسور قوی تر و DRM Free بودن. تنها نکته منفی که در مورد این دستگاه دیده بودم این بود که بعضی از کاربران از یک انعکاس نور جزیی شکایت داشتند. سونی در ریدر جدید خود یک لایه لمسی روی صفحه E-Ink قرار داده است که باعث انعکاس نور می شود. خلاصه ریدر من رسید و با وجود تمام وِیژگی های بالا اصلا محصول دلچسبی از کار در نیومد:
  1. تکنولوژی E-Ink سرعت refresh بسیار پایینی دارد و در نتیجه موقع ورق زدن یا هایلایت کردن خطوط بسیار کند عمل می کند.
  2. لایه Touch Screen از نوع فشاری است و نه حرارتی مثل آیفون و برای من که با محصول اپل کار کرده بودم خیلی مسخره به نظر می آمد.
  3. انعکاس نور صفحه واقعا آزار دهنده بود! واقعا دلیل گذاشتن چنین لایه ای که خواندن را مشکل می کند و اصلا جایگزین مناسبی برای دکمه ها نیست را درک نمی کنم.
  4. تکنولوژی E-Ink در محیط های روشن خوب جواب می دهد ولی در محیط های کم نور تر قابل خواندن نیست. چراغ های تعبیه شده در دستگاه هم نور یکنواختی تولید نمی کنند و خیلی جالب نیستند.
475 هزار تومان برای این وسیله خیلی زیاد بود و متاسفانه اصلا قابل استفاده هم نیست. برای کسانی که می خواهند یک ریدر بخرند شدیدا آیپد را توصیه می کنم. خواندن کتاب روی آیپاد تاچ هم خیلی دلپذیر تر از این وسیله است و حس می کنم صفحه بزرگ آیپد برای خواندن کتاب ایده آل باشد (و فقط برای خواند کتاب).

هدست بلوتوث فیلیپس SHB6110:
بعد از چندمین هدستی که سیمش به پام گیر کرد و به رحمت ایزدی پیوست تصمیم گرفتم این دفعه یک هدست وایرلس بگیرم. و چون می خواستم اون رو با لپتاپم استفاده کنم تصمیم گرفتم دنبال یک مدل بلوتوث بگردم. مدل های infrared یک کانکتور بزرگ دارند که برای PC یا تلویزیون مناسب هستند. بعد از مدتی گشتن در سایت های اینترنتی و بررسی بازار ایران تنها مدل قابل قبول SHB6110 بود با قیمت بالا تر از 100 هزار تومان. این هم توضیح مشخصات دستگاه در سایت فیلیپس:
Enjoy wireless stereo music and switch seamlessly to calls. Experience rich, lively sound with the integrated FullSound digital sound enhancement. Adjustable OptiFit design ensures a personalized comfort fit.
یا گوش های من به هدست های خوب عادت دارن یا اینکه کیفیت این هدست واقعا خیلی پایینتر از حد انتظار بود. کلا تکنولوژی وایرلس برای هدفون ها خیلی جدیده و فکر نکنم فعلا بشه چیزی بهتر از این پیدا کرد. برای تماس تلفنی و گوش کردن همینجوری موزیک گزینه بدی نیست اگه پول زیادی دارید! در ضمن ظاهر هدست خیلی قشنگه!

iPod Shuffle
یک آیپاد شافل جدید هم خریدم! با وجود زیبایی و کوچکی وسیله رو اعصابیه. نداشتن صفحه نمایش شما رو مجبور می کنه برای پیدا کردن آلبوم بعدی همش دکمه بعدی رو بزنین و دکمه بعدی یعنی دوبار فشار دادن دکمه روی سیم گوشی! بهترین استفاده این دستگاه اینه که یک سری آهنگ Trance روش بریزم و برم بدوم و نیازی به رفتن به بعدی و قبلی هم نداشته باشم! فعلا که حس دویدن نیست تا هوا حسابی گرم بشه. در ضمن اگر می خوان به دوست دخترتون هدیه در حد 80 تومان بدین، رنگ صورتیش انتخاب خیلی خوبیه!


خوب امسال خیلی خرید های جالبی نداشتم! راستش برنامه داشتم یک TV LCD و یک صندلی خیلی راحت مثل چیزی که چندلر و جویی توی فرندز داشتن بخرم و یک گربه! چیزایی که سال آینده اگه تو ایران موندگار شدم می خرم! اما حال بریم سراغ بهترین خرید های امسال:


Creative EP-570
با وجود قیمت ارزان (22 هزارتومان) این هد فون ها کیفیت فوق العاده خوبی دارند و خیلی سبک و راحت هستند. نه مانند هدفون های بزرگ تمام گوش را می پوشانند که باعث خستگی و داغ شدن گوش ها شوند و نه مثل هدست های in-ear که استفاده ازشون برای مدت طولانی اذیت کننده است.


بهترین خرید سال: PS3
دراصل این وسیله رو برای برادرهام خریدم و تعطیلات نوروزی. من خودم خیلی اهل بازی نیستم. ولی این جور که به نظر میاد خرید یک PS3 از کارت گرافیک خوب و حافظه برای بروزرسانی PC برای بازی های جدید ارزان تر از کار در میاد. و یک جور حال وهوای دیگه داره بازی PES توش. دسته های وایرلسش هم جالن و فکر می کنم 2 3 سالی بشه باهاش بازی کرد (بازی های جدید براش عرضه بشن بدون نیاز به بروزرسانی). بزرگترین مشکلش بازیهای گرون قیمتشه ولی در کل فکر می کنم خرید بسیار خوبی بود.

فکر می کنم بهترین ایده برای خرید چیزهای جدید اینه که اول یک بار با وسیله کار کنیم. (مثلا اگر یکی از دوستان قبلا از این وسیله ها خریده ازش بگیریم و تست کنیم) به تبلیغات و review های خیلی نمی شه اعتماد کرد! من که دیگه اعتماد نخواهم کرد. چیزی که یک انعکاس جزیی در مورد ریدر نامیده شده بود برای من یک فاجعه بود مگه چیزی مثل PS3 که ازش مطمئن باشید. به هر حال امیدوارم خرید های امسال بهتر باشند!

چهارشنبه، فروردین ۰۴، ۱۳۸۹

و اندر احوالات نرم افزار آزاد

امروز داشتم قسمت چهارم از فصل دوم پادکست Tuxradar را گوش می کردم. یکی از بهترین قسمت های این پادکست. در قسمت نظر خواهی این سوال مطرح شده بود که آیا حاضر هستید Free Software Foundation را به عنوان روابط عمومی لینوکس استخدام کنید؟ یا به عبارت دیگر آیا به نظر شما FSF نماینده مناسبی برای لینوکس است؟

جواب کاربران بسیار جالب بود و همچنین بحثی که بعد از آن اعضای تیم پادکست مطرح کردند. با اینکه لهجه بریتانیایی غلیظی داشتن تمام سعی ام را کردم که جمله ها را کامل اینجا بیاورم. اگر چیزی از تو افتاده کامنت بگذارید.
The Free Software Foundation is speaking about the closed nature of the iPod and fair enough, there are issues to be raised there but a lot of the time in their materials its like a real rant. the windows seven sins document. Yeah Windows 7 Sins! It poisons education. It's such loaded terms.
The best way you gonna convert people, if the Free Software Foundation could say O.K. look the iPad locked down and is DRM but look! There is an alternative. There is another tablet. But just telling people something's bad and not giving them another option and bad in that kind of language as well.
And what's the little laptop that Stallman uses? It is quite underpowerd nasty thing that isn't actually that good. He uses it because it totally free across the board. All free firmware and .. and if we all wanted to follow his example we'd all have crappy little laptops, netbook things using foreign chips and I don't wanna be there quite frankly. I'm comfortable quite where I am right now.
و این هم کامنت یکی از خوانندگان در سایت Tuxradar که کاملا باهاش موافقم:
In my opinion, the Free Software Foundation wouldn't make a good Linux PR department because they concentrate far too much on the philosophy behind Free Software. This is no bad thing in itsself, but isn't appropriate for modern-day OSS. I think companies like Novell and Canonical are best suited to this role.

Agile Rituals

سال 88 در عین تمام سختی ها و تلخی ها، سال جالبی بود. سالی که من خیلی چیزها یاد گرفتم. می خواهم اتفاقات جالب سال گذشته را کم کم اینجا بنویسم. حدود اوایل اردیبهشت سال گذشته بود که روابط من و مدیر پروژه بحرانی شد و من از تیم خارج شدم. در این پست می خواهم در مورد آن زمان و به خصوص متدلوژی Agile صحبت کنم.

Agile یکی از متدلوژی های تولید نرم افزار است که دوره های کوتاه مدت و با تعداد زیاد را برای تولید نرم افزار توصیه می کند. همانطور که از اسم آن نیز مشخص است، این متدلوژی می کوشد در حقیقت تیم های چابک بسازد و از بسیاری از کارهای اضافه سایر متدلوژی ها مثل RUP بکاهد. Agile Manifesto در سال 2001 توسط نمایندگان گروه های مختلف مثل Scrum، XP و غیره نوشته شد. نگاهی به اسم کسانی که این مانیفست را نوشته اند بیندازید. Martin Fowler، Kent Beck، Andy Hunt, Dave Thomas ، Robert Martin از جمله بزرگترین افراد دنیای نرم افزار هستند که از خواندن مطالبشان لذت می برم. اینجا بحث من خود متدلوژی نیست بلکه نحوه پیاده شدن آن در محیطی است که قابلیت پذیرش آن را ندارد و بیشتر به یک جوک شبیه می شود.
4 ماه نخست همکاری من با شرکت در تیمی بود که پرچم دار Agile بود. در واقع یک ظاهر پوشالی برای تیمی که در یک سال هیچ خروجی نداشت. بهترین اسمی که می توانم برای کارهای مسخره آن موقع بگذارم Agile Rituals است.
این کارها عبارت بودند از:
  • Standup Meeting: یکی از اجزای Scrum که توصیه می کند اعضای تیم در آغاز روز کاری دور هم جمع شوند و به طور خلاصه بگویند که امروز چه کاری می کنند تا با هم هماهنگ شوند. در مورد تیم ما این به یکی از مسخره ترین عادت ها تبدیل شده بود. در اوایل که 8 نفر بودیم کمی اوضاع بهتر بود. هر یک از اعضا یک دقیقه حرف می زد و معمولا کس دیگری نمی فهمید که چه می گوید و خیلی سریع سر و ته این قضیه تمام می شد. در زمان اوج درگیری 15 نفر بودیم و هر کسی 2 تا 3 دقیقه صحبت می کرد و هر روز حداقل نیم ساعت سر پا می ایستادیم. علاوه بر خستگی سر پا ایستادن با اصل Standup Meeting هم مشکل دارم. من متخصص Agile نیستم ولی حس می کنم این قضیه برای تیمی مفید است که اعضایش چند کاره باشند و تکنولوژی و مفاهیمی که سایر اعضا در موردش بحث می کنند را بدانند. در تیم ما که نیمی از اعضا مثل من یک سال سابقه کار دارند و بقیه هیچی و هرکسی روی یک تکنولوژی مجزا کار می کند، Standup Meeting چه معنی دارد: گوش کردن به حرف هایی که نمی فهمیم و صحبت کردن از چیزی که کسی نمی فهمد. به هر حال نظر مدیر پروژه احمق بر این بود که Ritual بدون کم و کاست باید ادامه یابد.

  • ساعت کاری 8:30 : این هم یکی دیگر از مسایل احمقانه و روی اعصاب من بود. حس من این است که ساعت کاری ثابت هیچ کمکی به افزایش کارایی و بهبود محصول نهایی نخواهد داشت. فکر می کنم یکی از خصوصیات Agile انعطاف پذیر بودن آن است...

  • Sitdown Meeting: بعد از مدتی مدیر پروژه که از نظر خود Agile Master محسوب می شد تصمیم گرفت بعد از ظهر ها پس از پایان ساعت کاری یک جلسه داشته باشیم و بگوییم که در طول روز چه کاری انجام دادیم. به هر حال با استراتژی کلی شرکت که آفتابه لگن هفت دست، شام و ناهار هیچی، مطابقت داشت! تقریبا اکثر زمان را در جلسات می گذراندیم.

  • World Class Product: و از همه دردناک تر این کلمه بود. روزی که وارد شرکت شدم یک جلسه داشتیم که در آن اعلام شد که ما می خواهیم یک محصول جهانی داشته باشیم! من پرسیدم چیزی در حد اکلیپس؟ و مدیر پروژه جواب داد بله!
    متاسفانه محصول جهانی یک Code Generator تخمی بود که اسمش هم SPL گذاشته بودن و هر روز می زدن تو سر ما که برای ساخت چنین محصولی باید Sitdown و Standup داشته باشیم وگر نه به جایی نمی رسیم. آنقدر ابعاد پروژه تخیلی بود و از همه بدتر ذهن بیمار Agile Master توهم بافته بود که جای هیچ گونه اعتراضی نبود. یک چیزی مثل لباس جدید پادشاه...
و خوب از Unit Testing، Code Review و سایر فعالیت های مفید و اساسی Agile خبری نبود چون اصولا کسی بلد نبود! پروژه خیلی زود تر از انتظار من از هم پاشید. مدیر پروژه یک ماه بعد از جدا شدن من از تیم دوام نیاورد و سپس از شرکت رفت.
آیا واقعا می توان با چند تا فارغ التحصیل دانشگاهی و Agile Practice توسط کسی که خودش فقط دو سال بیشتر از شما تجربه (آن هم مدیریتی و نه برنامه نویسی) دارد محصول جهانی ساخت؟ به نظر من کسانی که حس می کنند با Agile می توانند جای تحلیل، طراحی، برنامه نویس، ساپورت مالی، تست و سایر مولفه های ساخت نرم افزار را بگیرند برای همیشه محکوم به شکست هستند!

Start learning Java EE

Some times ago, a reader of this blog asked me to introduce him to some good resources to start learning Java EE. Unfortunately I didn't have time to do it back then. My apologies...
Objective: Learning Java EE
Prerequisites:
  1. Java: seriously! Knowing Java is absolutely essential. I know some developers (non-developers) that think since they do web centric tasks, they don't need to know Java. This argument is totally false. In JEE you don't drag and drop components, quite the contrary, often you need to make your hands dirty and do some coding.
  2. Relational Databases: You need to know about tables and queries.
  3. Web concepts: You need to know about request and response and how HTTP works. Again I recommend reading Joel's post about leaky abstractions. Head First Servlets & JSP is a good resource to start. See the books section ;)
How to start:
  • Java EE is huge. So you can't and won't learn all of it at once. My suggestion is to go for the web profile of Java EE 6. There are two reasons for that. First the web technologies are more interesting and second they are easier to learn.
  • My favorite web framework is JSF. I suggest that you learn about Servlets and JSPs and then go for JSF. Don't waste your time with Struts. I believe JEE 6 standard is really awesome, so you don't need 3rd party technologies.
  • You can't make enterprise application without databases. Learn basics of JDBC and then go for Hibernate. I strongly suggest Hibernate through JPA.
Next steps:
  • After you learned these technologies and made some simple web applications, learn more about patterns and use a Dependency Injection framework.
  • You can use Spring or Seam. Though I recommend using Seam.
Books:
  • Head First Servlets and JSP
  • Core JSF (II) by Cay Horstmann
  • Java Persistent with Hibernamte by Christian Bauer and Gavin King
  • Head First Design Patterns
  • Seam in Action by Dan Allen
Blogs and Websites:
  • I strongly recommend you not to start learning these technologies from blogs. Some tutorials are fine but you need books. The other problem of blog posts are that they mostly reflect the personal idea of the author and are not objective and reliable.
  • The only blogs I recommend is Javalobby and inRelationTo (To be up to date). Go and register to their RSS feeds.
Tools:
  • Eclipse Webtools 3.5.2
  • or Netbeans 6.8
  • Apache Tomcat or Glassfish as web server
  • Mysql as DBMS
Good luck in learning Java EE!

سه‌شنبه، فروردین ۰۳، ۱۳۸۹

اولین پست 89

هر سال که می گذرد، تعطیلات سال نو بی مزه تر به نظر می رسد و کل مراسم باستانی شکل احمقانه ای پیدا می کند. نوروز یکی از چندین یادگار شیرین دوران کودکی من بود که با گذشت زمان و تجربه اش در بزرگسالی طعم خود را کم کم از دست داد. مهمترین فعالیت من در این روزها خوابیدن و دیدن سریال آفیس است که خوب فکر کنم فردا تمام بشود و باید منتظر قسمت های بعدیش باشم. توی این بی حوصلگی تصمیم گرفتم دوباره بنویسم...

پارسال اولین تجربه وبلاگ نویسی من بود و می توانم بگم که تجربه جالبی بود. اول با وبلاگ pprogrammer شروع کردم ولی اسمش را دوست نداشتم و ویکو را راه انداختم. حس می کنم که در طی یک سال مخاطب نسبتا خوبی داشتم. امسال قصد دارم مقداری پست ها رو شخصی تر کنم. احتمالا دیگر از ترجمه خبری نخواهد بود چون فوق العاده وقت گیر است. همچنین قصد دارم ویکو به یک وبلاگ تخصصی برنامه نویسی تبدیل بشود بنابراین احتمالا موضوعات عمومی هم کمتر خواهند شد.
در ضمن از این پس فید ویکو به صورت خلاصه عرضه می شود. معمولا آر اس اس ریدر ها فرمت بلاگ من را به هم می ریزند و پست ها حالت زیبایی ندارند. درضمن من دوست دارم خوانندگان در اینجا بیشتر مشارکت داشته باشند و کامنت بگذارند و خواندن مطالب در گوگل ریدر دقیقا چیزی نیست که من می خواهم. منتظر پست های بعدی باشید...

پنجشنبه، اسفند ۲۰، ۱۳۸۸

Google Reader's best trick

1) Press g and then a
2) Press Shift + a

Now you are free! Go and watch the next episode of The Office.

پنجشنبه، اسفند ۱۳، ۱۳۸۸

Ubuntu's new clothes

After 6 years, finally the Ubuntu team is going to give the beloved Linux distribution a decent look! You can read the whole article here: A Fresh Look For Ubuntu
I think this is a positive movement. The old brown theme was like shit!
This is the new theme named light:

Isn't it very similar to Mac OS X? the colors, the wireless and Bluetooth icons, close/maximize/minimize icons' location and specially the wallpaper!
Here is a OS X desktop picture for comparison:
Apple is a pathetic dictatorship. Recently I feel hatred towards Apple, but you know they are original! Ubuntu and Linux guys, please be original!

جمعه، اسفند ۰۷، ۱۳۸۸

Gavin King, You are my hero

Tonight I read a blog post by Norman Richards, fellow JBoss and Seam developer, who has recently left Redhat to work for a startup. In his post, he shares his last interview experience with a big company. It is a quite interesting read. But more interestingly an idiot asshole named John Smith put a comment like this:
"I think you are a prima donna on this issue. They don't know you from anything. Lots of programmers have had jobs for years but don't know much about programming. I talked to someone who had been programming in Java for 5 or 6 years and they said something like "I never know if I'm supposed to build one or two classes for an app that I write". On paper this person looked like they were experienced. After talking to them, their way of programming in Java is something we wouldn't want to deal with.
So, yes, you are being a prima donna for not answering the basic questions. It's a good thing they "failed your screen" because with an attitude like yours I think you would fail my screen too. I want a team player who is willing to work with the slower developers and mentor them, not someone with an attitude who can't be bothered with that stuff."

And here comes Gavin King! For those of you who may don't know him, let me introduce him shortly. He is the creator of Hibernate and Seam frameworks and one of the true brilliant programmers today. Working with Seam was an eye-opener for me and I really like his thinking style about Java EE. Also he is not a conservative intellectual like many others, when he should speak, he does it very well ;) Look at his answer to John Smith below:
"John Smith, you're an idiot.
Norman is the author of successful books on Java technologies and has worked as a core developer of innovative technologies at JBoss for something like 5 years. He's not a guy who spent 5 years building internal web applications using JSP like you and your team, and his resume would have shown that. If the person interviewing Norman doesn't already know something about the projects Norman has worked on, then that person doesn't have the necessarily level of expertise to interview him. Simple as that.
Yes, he's a prima donna, because he's earned the right to be. In his position I would have thanked the HR guy for his time and quickly hung up the phone. Because there is no way in hell I would want to work for any company which insulted me like that. And no, John Smith, you don't want someone like Norman or I on your team, because (a) we're more senior than you, (b) we think you're an ass, and (c) your project bores us to tears :-)
And I think Norman's post is interesting and shows why large companies have problems attracting the most talented people. The most talented people *are* often prima donnas, and don't often have time for timewasting bureaucracy. That's why Norman is working at a startup company, and why big companies are filled with seatwarmers like John Smith."

چهارشنبه، اسفند ۰۵، ۱۳۸۸

میانبرهای گوگل ریدر

چند وقتی می شه که علاقه عجیبی به بهینه کردن کارهام با کامپیوتر پیدا کردم. جرقه این کار یاد گیری میانبرهای اکلیپس بود که باعث شد سرعت کد زدن و انجام کارهای تکراری خیلی ساده تر بشه. دیشب طبق معمول داشتم توی گوگل رید می گشتم، به سرم زد برم ببینم میانبرهای کیبوردش چجوری هستند و فکر می کنم بعد از یک ساعت کار کردن با صفحه کلید به جای ماوس، زندگی گوگلی من متحول شد!

برای دیدن لیست همه میانبرها دکمه ؟ را فشار دهید. در این بین دکمه های زیر به نظرم بهترین بودن:
g f: لیست دوستانی رو که دنبال می کنید رو می بینید و می توانید با نوشتن حروف اول نام اون رو پیدا کنید (go to friends)
g u: مثل حالت قبلی اما برای لیست اشتراک ها
m: بین وضعیت read/unread سوییچ می کند
n , p: مطلب بعدی و قبلی را در مد List View می آورد
u: نمایش تمام صفحه مطالب
j, k : خواندن مطلب بعدی یا قبلی
جیمیل هم میانبرهای مشابهی داره که فکر می کنم بعد از 6 سال استفاده ماوس جالب باشه اونا رو هم یاد بگیرم

جمعه، بهمن ۳۰، ۱۳۸۸

مورچه خوار

در زمان وب 2.0 شاهد ظهور Startup های مختلفی مثل فیسبوک، تویتر، فریندفید، دیگ و ... بودیم که مثل قارچ در سراسر اینترنت رشد کردند. بعضی از این Startup ها خود به غول های اینترنتی تبدیل شدند و بسیاری هم توجه زیادی جلب نکردند و از بین رفتند. چند وقت پیش فکر می کردم که دیگر جایی برای ایده های جدید در وب 2.0 باقی نمانده است. تمامی سایت های جدید شامل مجموعه ای از قابلیت های شناخته شده مثل Like, Share, Comment و ارسال به فیسبوک و تویتر هستند. حتی گوگل با این سطح نو آوری هم چیز جدیدی با Buzz به ما عرضه نکرد. یک مینیاتور فیسبوک در جیمیل!

تا این که هفته گذشته در اخبار خواندم که گوگل کمپانی به نام Aardvark را خریده است. کنجکاو شدم که بدانم این سرویس چیست. Aardvark یا مورچه خوار یک سیستم پرسش و پاسخ آنلاین است. چیزی شبیه Yahoo! Answers ولی با ویژگی های جالب تر و پاسخ سریع. ابتدا شما در این سایت ثبت نام می کنید و مشخص می کنید که در چه زمینه هایی تخصص دارید. وقتی کسی یک سوال در این زمینه ها می پرسد مورچه خوار با شما تماس می گیرد (اگر آنلاین باشید از طریق خود سایت و در غیر این صورت با گوگل تالک یا جیمیل) و از شما می خواهد که به سوال پاسخ دهید. چگونگی تماس و تعداد آن در روز قابل تنظیم است.
نکته بسیار جالب در مورد این سرویس سرعت پاسخگویی است. وقتی شما یک سوال می پرسید تقریبا در عرض 2 تا 3 دقیقه پاسخ خود را می گیرید و معمولا جواب ها قابل قبول هستند. مورچه خوار در شبکه کاربران خود می گردد و بهترین فرد پاسخ دهنده را انتخاب می کند.انتخاب نام مورچه خوار برای این سرویس نیز بدلیل همین امکان جستجو در شبکه و پیدا کردن پاسخ دهنده است. اکنون علاقه گوگل به این سرویس کاملا برای من واضح است. دسترسی به پایگاه داده این سایت و امکان آنالیز آن این امکان را فراهم می کند که گوگل به سوالات شما نیز پاسخ دهد!
کارکردن با این سرویس تجربه جالبی است و به قول یکی از دوستان حس مفید بودن به آدم دست می دهد! توصیه من این است که همین امروز مورچه خوار را امتحان کنید.

The Cute Cat

This image is cropped from the Cats Anytime theme of Windows 7! This is the cutest cat I've ever seen! :) Love it!

پنجشنبه، بهمن ۲۹، ۱۳۸۸

چه کسی دوست شماست؟

یکی از تفاوت های دنیای واقعی و مجازی ماهیت دوستان و سطح دوستی هاست. بعد از محبوب شدن شبکه های اجتماعی مثل فیسبوک، یکی از اولین کارهایی که افراد پس از عضویت انجام می دند اینه که هر کسی رو حتی یک بار هم دیدن به لیست دوستان خود اضافه می کنند. واقعا چه چیزی یک نفر را واجد صلاحیت لازم می کنه تا من او را به عنوان دوست در فیسبوک اضافه کنم؟
افرادی رو که در دنیای واقعی می شناسم گروه بندی های مختلفی دارن. دوستان کاملا صمیمی که می تونم در مورد همه چیز باهاشون صحبت کنم و با هم خوش بگذرونیم. دوستان محیط کار و دانشگاه که هنوز خیلی صمیمی نشدن و روزی چند ساعت می شه اونا را تحمل کرد و بعضا آدمای جالبی از توشون پیدا کرد. بعضی ها که باهاشون سلام علیک داریم و بعضی ها که اصلا ترجیح می دیم شکل نحسشون رو نبینیم.
حالا چیزی مثل فیسبوک رو در نظر بگیرید که همه این چیزها رو به هم می ریزه. توی فیسبوک معمولا همه هم کلاسی ها و همکاران و بعضی از اساتید و مدیران و ... رو به لیست دوستان اضافه می کنیم. من همیشه این حس رو داشتم که همه این افراد کسانی نیستند که من بتونم اونا رو به عنوان دوست بشناسم و بخوام مطالب رو باهاشون به اشتراک بگذارم. تابستان گذشته حدود 200 دوست فیسبوکی داشتم که الان رسوندمش به 130 و تصمیم دارم که 30 تا دیگشو هم بندازم بیرون! تنها دوستان گذشته، کنونی و آینده من و آدم هایی که بخواهم ازشون خبر داشته باشم در لیست من جا خواهند داشت.
تازه در مورد قبول درخواست دوستی هم خیلی محتاط شدم. مثلا یه دختر هم دانشگاهیه سابقم که قیافه خیلی تخمی هم داشت اومده درخواست دوستی داده. آخه یکی نیست بهش بگه که کسخل ما در طول 5 سال دانشگاه حتی یک بار هم سلام علیک نداشتیم حالا واسه چی میخوای داشته باشی؟
یا این بابا مدیر فروش پروژه که عین این عقب افتاده ها هو هو میخنده اومده منو add کرده. آخه من با تو چه صحبتی دارم که منو اینجوری تو رودرواسی میذاری؟ حالا تا کارم باهاش تموم نشده نگهش می دارم بعدش هم میندازمش بیرون. تنها مورد استثنا که کسی رو که نمیشناسم ولی به عنوان دوست اضافه می کنم اینه که اولا دختر باشه و ثانیا خوشگل! حداقلش اینه که حتی اگه صحبتی هم پیش نیاد هر چند وقت یک بار عکس های مهمونیشو آپلود می کنه و سرگرمی خوبیه. معمولا میشه توی لیست دوستاش هم گشت و چند تا دختر خوشگل دیگه هم اضافه کرد. Some piece of Art برای پروفایل شما. با مزه ترین اتفاق هم این بود که بعضی ها رو که از لیستم حذف کردم دوباره منو add کردن و من هم reject کردم و خیلی حال داد.
نظر شما در مورد معیار دوستی در دنیای مجازی چیه؟

چهارشنبه، بهمن ۲۸، ۱۳۸۸

Lost in translation

توی یکی از پست های قبلیم نوشته بودم که بهتره اسم های خاص رو فینگلیش بنویسین و خودتون رو از شر ترجمه به انگلیسی راحت کنید. چون معمولا این ترجمه ها خیلی پرت هستند و تخمی از کار در می آیند مثل نمونه زیر که امروز بهش بر خوردم و کلی خندیدم. دوستمون حداکثر خالص تسهیلات رو Pure Extreme of Facilities ترجمه کرده بود و متغییری به این اسم در کلاس قرار داده بود! حتی اگر ترجمه کلمه به کلمه رو هم در نظر بگیریم خیلی پرته.

دوشنبه، بهمن ۱۹، ۱۳۸۸

the Stockholm syndrome

Today I've got my first application rejection letter from Sweden. Here it is:
Dear --------,

We would like to thank you for your interest in the Erasmus Mundus Programme EMDC.

The assessment for category A applicants for the Erasmus Mundus Master’s Programmehas now been finalized. We regret to inform you that your application has been unsuccessful.

Your application, nr. -----, did not fulfil the general requirements and was not processed further. General requirements encompass English requirements, acompleted Bachelor’s degree of a minimum of 180 ECTS credits or equivalent academic qualifications from an internationally recognized university, and correct certification of the application documents.

Listed below are the most common reasons why an application is considered ineligible.

English requirements

· There is no proof of English language proficiency submitted.

· The test results did not meet the standards set by the programme.

· If you’re education was in English, this must be evident from the transcript of records or from a written statement from the degree administration/ examinations office (or equivalent department) at your university. Certifications and statements made by professors or the head of department are not accepted.

· The TOEFL-test results were not sent directly from ETS to KTH.

· The TOEFL-test results arrived at KTH after the deadline.

Bachelor Degree

· The requirement of a degree from an internationally recognized university that is listed in the Unesco World List was not fulfilled.

· The requirement for undergraduate studies equivalent to three years of study at a Swedish university, i.e. a Bachelor's degree equivalent to a Swedish Kandidatexamen (180 HE/ECTS credits), was not fulfilled.

Correct certification

· The application was not sufficiently supported by officially certified documentation. Diplomas from previous education and transcripts of completed courses and grades must be submitted. Copies should be stamped and signed by the issuing institution or a notary public both in original language and translation.

· If your degree was awarded in Cameroon, Canada, Eritrea, Ethiopia, Ghana, Nigeria, Sudan or USA, an official transcript of record should have been sent directly from your university in a sealed envelope.

· If your degree was awarded in Pakistan it should be sufficiently attested and signed by the Higher Education Commission, HEC. Each page of the transcripts and diplomas must be attested by the HEC.

· Students who do not hold the required degree, but are registered for the last semester of a programme leading to a degree, can be conditionally accepted. An official document stating this must be included in the application. Certifications and statements made by professors or the head of department are not accepted.

· During the assessment process, requests for diploma/transcript verification are sent to the issuing universities. If the efforts to verify the documents have been unsuccessful or if the issuing university, or college, requires a fee for verifying the documents, your application will not be processed further.

· The signature and/or stamp on your diploma/transcript, or the document itself, does not correspond with our reference material from your university. Efforts to verify the documents have been unsuccessful.

Please don’t hesitate to apply next year. Application rounds for 2011 entry will open in autumn 2010. Information on the website will be updated in due course.



Kind regards,

KTH (The Royal Institute of Technology)

Admissions Office


Last year I've got the same message from Studera (The institution which processes applications for various Swedish universities). They even didn't answer my questions later.
This was an Erasmus Mundus application that I sent directly to KTH this year! It was submitted before 30th November and now I receive this stupid letter after 80 days. They even did not bother themselves to explain exactly why my application was not successful.
To feel the difference let me tell you another story. I have also applied for a university in the Netherlands. Upon arrival of my documents they notified me that your English results are missing. I contacted ETS and they confirmed that my test results are sent. After some E-Mail communication they have agreed to continue my application conditionally. Two days later my English test results arrived and they confirmed its arrival either. It is still in process. Can you see the difference? Responsiveness and Respect are two essential properties which obviously some institutions and countries don't poses.
"Please Don't hesitate to apply next year????" Yeah Sure! You asshole motherfuckers! I have also applied via Studera this year. I have sent my documents on 20th January but there is no indication of their arrival yet. Because KTH were also amongst my choices this year, I wait till mid May and then I know what I should say to them!

جمعه، بهمن ۱۶، ۱۳۸۸

این هفته: چه موقع می توان این (سیستم عامل) را لینوکس نامید؟


حد اکثر تا قبل از آنکه که گوگل لینوکس را روی دستگاه های قابل حمل رونق ببخشد. اما واقعا آندروید با لینوکس چه رابطه ای دارد؟
اخیرا به یکی از دوستان گوشی مایلستون موتورولا را نشان دادم. همین که اشاره کردم که این گوشی با آندروید کار می کند گفت: "آهان، این همان لینوکس گوگل برای گوشی های همراه است. اوپن آفیس روش اجرا می شه؟" مجبور شدم او را ناامید کنم، اما این موضوع این سوال را در ذهنم ایجاد کرد: وقتی که واسط کاربری (GUI) و API توسعه (Development API) متفاوت است، آیا هنوز این سیستم عامل لینوکس است؟
اکثریت لینوکس کارها می دانند که برروی دسکتاپ یا سرور مبتنی بر لینوکس در اصل مجموعه ای از یک کرنل سیستم عامل، کتابخانه های سیستمی، برنامه ها و یک واسط کاربری اجرا می شود. لینوکس به طور دقیق تر فقط به کرنل اطلاق می شود اما توانسته است خود را به عنوان اصطلاحی که به مجموعه کرنل، POSIX-API (به طور دقیقتر API پایه استاندارد لینوکس)، ابزارهای GNU، X11 و گنوم یا KDE بشناساند. این گونه کلاسیک لینوکس تنها یک امکان ساخت یک سیستم عامل کامل بر پایه کرنل لینوکس است که در جهت حفظ میراث یونیکس و استانداردهای آن قرار دارد.
برای مثال آندروید تنها شامل کرنل لینوکس (با چندین تغییر که آن را با کرنل استاندارد ناسازگار می سازد) و تعداد کمی از کتابخانه های اصلی و آشنای لینوکس است. تازه توسعه دهندگان از این ویژگی های لینوکسی چیزی نمی بینند زیرا همه برنامه بر روی ماشین مجازی جاوا دالویک (Dalvik) اجرا می شوند و توابع آندروید تنها از طریق API جاوا Android SDK قابل دسترسی هستند. همچنین Android Native Development Kit که در داخل دالویک تعبیه شده است تنها از طریق یک برنامه دالویک قابل استفاده است. کسی که یک سیستم آندروید دارد به هیچ وجه نمی تواند چیزی را در آن پیدا کند که تداعی گر لینوکس باشد.
آیا با این وجود آندروید یک لینوکس به حساب می آید؟ آن چه واضح است نه به معنای یک سرور یا دسکتاپ لینوکس. سوال این است که وسایلی که از کرنل لینوکس استفاده می کنند اما API معمول لینوکس را برای برنامه ها فراهم نمی کنند را چه باید نامید؟ می توان به آنها “Linux-Powered” گفت اما تنها وقتی که این موضوع به طور واضح بیان شود که یک سرور یا دسکتاپ لینوکس چیز کاملا متفاوتی است.
در این مساله تنها مربوط به تکنیک ساخت سیستم عامل نیست بلکه مساله آزادی و باز بودن نیز در میان است که چه کارهای با این وسیله ممکن است. کاربر باید بداند که سیستم های “Linux-powered” - نسبت به آنچه از توزیع های مرسوم لینوکس می شناسد - به معنای آزادی عمل کمتر است و همچنین این که بر روی چنین دستگاه هایی هر برنامه لینوکسی اجرا نخواهد شد (حتی وقتی سورس کد آنها در دسترش باشد و آنقدر تمیز نوشته شده باشند که بر روی هر گونه لینوکس قابل کامپایل و ترجمه باشند).
ما از بنیاد لینوکس (Linux Foundation)، صاحب امتیاز نام تجاری لینوکس، پرسیدیم که آیا در این موضوع (لینوکس نامیدن این سیستم عامل ها) سردرگمی کاربر را تهدید نمی کند؟ جیم زملین مدیر عامل بنیاد لینوکس این چنین پاسخ داد:
"پلاتفرم لینوکس در سطوح مختلف با روش های مختلف یکپارچه می شود. اولین سطح که کرنل است به طور کامل در سراسر اکوسیستم لینوکس یکی است. هر کس بخواهد که سخت افزارش توسط لینوکس پشتیبانی شود، کد خود را به سادگی به کرنل استاندارد در kernel.org اضافه می کند.
در دومین سطح کتابخانه های سیستمی مانند پایه استاندارد لینوکس (Linux Standard Base) وجود دارند که یک مجموعه از کتابخانه ها را تعریف می کنند که توسعه دهندگان لینوکس در همه انواع لینوکس انتظار دارند. اکوسیستم برای اجرای برنامه ها بر روی سطح بسیار بالاتری تعریف شده است، جایی که بازار تصمیم می گیرد کدام نسخه های لینوکس موفق هستند. آندروید برای مثال یک سیستم عامل محبوب برپایه لینوکس برای دستگاه های قابل حمل است. در آندروید محیط اجرای جاوا مشخص می کند که چه برنامه هایی سازگار هستند و آن ها را در بازار آندروید قابل دسترسی می کند. Palm Pre نیز یک مفهوم مشابه اما با یک محیط اجرای دیگر و یک SDK دیگر است. حتی Kindle آمازون نیز یک SDK جداگانه برای برنامه ها دارد.
همه این ها دستگاه های بر پایه لینوکس هستند و کسی گیج نمی شود. اکوسیستم های متفاوتی برای برنامه ها بر روی سیستم های لینوکسی متفاوت وجود دارند که همگی در لایه های عمیق داخلی سیستم به صورت واحد باقی می مانند."
در دومین سطح کتابخانه های سیستمی مانند پایه استاندارد لینوکس (Linux Standard Base) وجود دارند که یک مجموعه از کتابخانه ها را تعریف می کنند که توسعه دهندگان لینوکس در همه انواع لینوکس انتظار دارند. اکوسیستم برای اجرای برنامه ها بر روی سطح بسیار بالاتری تعریف شده است، جایی که بازار تصمیم می گیرد کدام نسخه های لینوکس موفق هستند. آندروید برای مثال یک سیستم عامل محبوب برپایه لینوکس برای دستگاه های قابل حمل است. در آندروید محیط اجرای جاوا مشخص می کند که چه برنامه هایی سازگار هستند و آن ها را در بازار آندروید قابل دسترسی می کند. Palm Pre نیز یک مفهوم مشابه اما با یک محیط اجرای دیگر و یک SDK دیگر است. حتی Kindle آمازون نیز یک SDK جداگانه برای برنامه ها دارد.
همه این ها دستگاه های بر پایه لینوکس هستند و کسی گیج نمی شود. اکوسیستم های متفاوتی برای برنامه ها بر روی سیستم های لینوکسی متفاوت وجود دارند که همگی در لایه های عمیق داخلی سیستم به صورت واحد باقی می مانند."

ترجمه مقاله Wann darf man Linux dazu sagen

شنبه، بهمن ۱۰، ۱۳۸۸

Sun in Red

One week after the approval from EU commission ...


Java is colored in Red ... The Oracle Red!


And it came as a great surprise to me today...


And you can see Oracle everywhere...



And I believe that Java would be more successful with Oracle...


My best wishes for Oracle...

جمعه، بهمن ۰۹، ۱۳۸۸

چرا من دیگر از اپل خرید نخواهم کرد

پس از یک انتظار طولانی، سرانجام کمپانی اپل وسیله قابل حمل جدید خود به نام آیپد را معرفی کرد و بیش از پیش من را ناامید ساخت.
آخرین وسیله اپل من یک iPod Touch بود و کاملا از آن راضی بودم و حس می کردم هر چیزی که اپل تولید کند بهترین است. اما ماجرای زیر نظر مرا نسبت به اپل عوض کرد. نزدیک سه ماه است که در خانه دیگر از لینوکس استفاده نمی کنم. در شرکت نیز قصد دارم اوبونتو را پاک کنم و ویندوز 7 یا OpenSuse را به عنوان سیستم عامل محیط کار امتحان کنم. با اینکه هیچ گاه کاربر اپل در دسکتاپ نبوده ام اما همیشه این حس را داشتم که OS X سیستم عامل برتر است تا اینکه تصمیم گرفتم یک MacBook Pro بخرم!
پس از جستجو دریافتم که مدل های جدید اپل همگی با مانیتورهای براق (glossy) عرضه می شوند! و خوب من فکر می کنم مدل های براق به هیچ وجه برای کار حرفه ای مناسب نیستند. کار کردن با این مانیتورها در یک محیط پر نور بسیار سخت است و برتری این مانیتورها در فراهم کردن رنگ های زنده تر، برای من که اکثرا مشغول کار با متن هستم بی فایده است.
پس از آن با توجه به اینکه مدتی خواستار خرید یک صفحه نمایش بزرگ بودم، تصمیم گرفتم که یک مانیتور 23 اینچ سامسونگ و یک دستگاه مک مینی بخرم! قیمت این دستگاه حدود 900 هزار تومان است که با توجه به قابلیت های آن اصلا نمی ارزد. پس از مدتی پرس و جو به این نتیجه رسیدم که خوب بهتر است که یک iMac بخرم ولی باز متوجه شدم که iMac ها نیز فقط با مانیتورهای براق عرضه می شوند! در همین روز ها بود که Tablet جدید اپل عرضه شد و اپل کلکسیون محصولات خود که با ذایقه من سازگار نیستند را کامل کرد.
با اطمینان می توانم بگویم که تنها کار خوبی که این وسیله می تواند انجام دهد خواندن صفحات وب و کتاب های دیجیتال است. ویژگی های صوتی و تصویری آن نیز باید فوق العاده باشد. با وجود این همه سر و صدا این وسیله هیچ چیزی جز یک iPhone با صفحه بزرگتر نیست و من ترجیح می دهم پول خرید آن را نگه دارم تا سال آینده یک لپتاپ سریع تر و سبکتر بگیرم. حتی iPad امکان Multitasking هم ندارد.
چون یک Ebook Reader سونی دارم (بدترین خرید عمرم) حس می کنم اپل با عرضه iPad مسیر درستی را در زمینه کتاب خوانهای دیجیتال طی می کند. تکنولوژی E-Ink به کار رفته در ebook reader ها سرعت refresh بسیار پایینی دارد و به راحتی کاربر را آزار می دهد. اما فکر می کنم که هنوز خواندن کتاب به صورت کاغدی از همه این تکنولوژی های بهتر است. مسلما آیپد برای بسیاری از کاربرانی که قصد خرید یک ebook reader را دارند گزینه مناسبی است.
سیاست های اپل نشان می دهد که هیچ گونه احترامی برای نظر کاربران حرفه ای قایل نیست و فقط به دنبال تست کردن ایده های جدید خود است. هرچند اپل در بسیاری از زمینه ها خالق نوآوردی بوده و خواهد بود، ولی رفتارهای انحصار طلبانه و دیکتاتوری آن مثل AppStore، رمزگذاری دیتا بیس iPod به نحوی که تنها با iTunes بتوان روی آن موزیک ریخت، عدم پشتیبانی از Flash، قفل iPhone و دردسر Jailbreak و عرضه سیستم عامل با سخت افزار خود (لپ تاپ های با مانیتور براق) از جمله دلایلی هستند که من دیگر از اپل خرید نخواهم کرد.









بجای iMac یک IdeaCentre لنوو می خرم. بجای iPhone یک Nexus One گوگل و سال آینده یکی از لپتاپ های پرقدرت و سریع لنوو مثل T400s. با توجه به پایداری و سبک بودن ویندوز 7، دیگر نیازی به OS X هم ندارم!















جمعه، بهمن ۰۲، ۱۳۸۸

I love Muse

The only album worth listening to in 2009 was The Resistance from my favorite band Muse.
Three music videos from The Resistance: