Skip navigation.

Ambassador

The Royal C++ Embassy

August 2006

( Monthly archive )

"I cannot find import library for my GUIDs!"

, , ,

Visual C++ has got a keyword, specifically designed for COM projects; the "__uuidof". So, for example, if you want to instantiate a class with CLSID_Application and you need ISomeInterface, you'd normally do:
ISomeInterface *psi;
psi = NULL;

HRESULT hr = CoCreateInstance(CLSID_Application, NULL, 
                              CLSCTX_INPROC_SERVER,
                              IID_ISomeInterface,
                              (void**)&psi);

If you get a link error for IID_ISomeInterface and CLSID_Application despite the fact that you have essentially tried to link all import libraries suggested in any piece of documentation, try:
HRESULT hr = CoCreateInstance(__uuidof(Application),
                              NULL,
                              CLSCTX_INPROC_SERVER,
                              __uuidof(ISomeInterface),
                              (void**)&psi);

Trick is that this operator returns GUID of given expression, if any provided. Of course, I am talking about "normal" scenerios, like:
#if defined(__cplusplus) && !defined(CINTERFACE)
  MIDL_INTERFACE("00000000-0000-0000-C000-000000000046")
  IUnknown
  {
  public:
    BEGIN_INTERFACE
    virtual HRESULT STDMETHODCALLTYPE QueryInterface
            (REFIID riid, void **ppvObject) = 0;
    virtual ULONG STDMETHODCALLTYPE AddRef(void) = 0;
    virtual ULONG STDMETHODCALLTYPE Release(void) = 0;
    END_INTERFACE
  };
#else   /* C style interface */
  typedef struct IUnknownVtbl
  {
    BEGIN_INTERFACE
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(IUnknown *This,
             REFIID riid, void **ppvObject);
    ULONG (STDMETHODCALLTYPE *AddRef)(IUnknown *This);
    ULONG (STDMETHODCALLTYPE *Release)(IUnknown *This);
    END_INTERFACE
  } IUnknownVtbl;

  interface IUnknown
  {
    CONST_VTBL struct IUnknownVtbl *lpVtbl;
  };
#endif

The "MIDL_INTERFACE" macro specifies GUID for the interface (which is IID_IUnknown).
Or (stolen from Microsoft's sample, see critics below):
//  expre_uuidof.cpp 
//  compile  with:  ole32.lib 
#include  "stdio.h" 
#include  "windows.h" 

[emitidl]; 
[module(name="MyLib")]; 
[export] 
struct  stuff  { 
    int  i; 
}; 

 int  main()  { 
    LPOLESTR  lpolestr; 
    StringFromCLSID(__uuidof(MyLib),  &lpolestr); 
    wprintf_s(L"%s",  lpolestr); 
    CoTaskMemFree(lpolestr); 
}

Found a few problems with the sample:
1. C or C++ code cannot be compiled with a lib, but can be linked. So instead of "compile with", it should be "link with"
2. #include "stdio.h" does not seem good. It's supposed to be #include <stdio.h> (mind <>, please)

Or, alternatively, if you import:
#import "SomeLibrary.dll" no_namespace raw_interfaces_only

In fact, as far as I remember, when you import, you can specify "named_guids" option to import directive, which will generate CLSID_SomeStuff in type library header. However, I don't remember whether this requires import library at link stage.

It's hidden out there!

, , ,

Abruptly starting subject; overloads are not inherited, if derived class has a method with the same name - they are hidden.
#include <iostream>

using std::cout;
using std::endl;


class X
{
public:
        int Add(int)
        {
                cout << "X::Add(int)" << endl;
                return 0;
        }
        int Add(X&)
        {
                cout << "X::Add(X&)" << endl;
                return 0;
        }
};

class D : public X
{
public:
        int Add(char)  // Hides base's Add method(s)
        {
                cout << "D::Add(char)" << endl;
                return 0;
        }
};

int main()
{
        X x;
        x.Add(x);   // OK: X::Add(X&)
        x.Add(3);   // OK: X::Add(int);
        D d;
        d.Add('c'); // OK: D::Add(char)
        d.Add(1);   // Error: overloads are hidden
        d.Add(x);   // Error: overloads are hidden
        return 0;
}

Derived classes have a bad attitude of hiding its bases' methods. It may sound weird, ugly and disturbing, but imagine otherwise; base class has changed, author decided to add another overload which has an argument type that is causing an unintentional conversion with the type you pass or by-passes your intentional conversion, for example?

If you really really want to reuse base's methods, here are tricks:
  • Use "using" declaration to explicitly declare that derived class introduces base's types and methods to its declerative region (e.g. using X::Add). This will enable all overloads in base class to be visible to callers of derived.
  • Explicitly refer to base's scope in the caller (e.g. d.X::Add(x) calls X::Add(X&))
  • Implement overloads in derived, call base's methods.
  • Templatize Derived::Add (e.g. template<typename T> int Add(T t) { return X::Add(t); } - you can specialize this as well!)

My heart beats for "using" and templatizing, although this is not the way I would prefer.

If I were to design this base class:
  • Add would be a template.
  • Since this class is designed to be a base, it could look like:
    class D;
    
    template<typename T>
    class X
    {
    public:
            template<typename U>
            int Add(U u)
            {
                    T* pt = static_cast<T*>(this);
                    // force derived class to implement AddItem for each U
                    return pt->AddItem(u);
            }
    };
    
    // char, specialization.
    template<>
    template<>
    int X<D>::Add<char>(char c)
    {
            // add it
            return 0;
    }
    

  • If it's not a template, it would probably have private pure virtual functions that needs to be implemented by derived types. (I've just heard some said "private pure virtual function? I thought we're talking about recent British-Pakistan cricket game!".)

    class X
    {
    virtual int AddChar() = 0;
    virtual int AddInt() = 0;
    // .. others
    public:
    int Add(char c)
    {
    return AddChar();
    }
    };

If I were to write derived class:
  • There will not be inheritance, but "pimpl".

    class D /* : public X */
    {
    X* m_px;
    public:
    int Add(char c)
    {
    return m_px->Add(c);
    }
    };
  • If there is an inheritance, I would use "using" to declare base's methods
  • or, alternative to above case, I would use template methods and may be their specializations.

This all depends on design.

Galatasaray rules!

, ,

Galatasaray and PSV Eindhoven are in Group C, with Bordeaux and Liverpool.

I and Arjan will probably be in Eindhoven in 31st October 2006. This time not as home mates, but competents :D Fortunately, neither of us is fanatic!

So here is the schedule:
Date Home Visitor
September 12 Galatasaray Bordeaux
September 27 Liverpool Galatasaray
October 18 Galatasaray PSV Eindhoven
October 31 PSV Eindhoven Galatasaray
November 22 Bordeaux Galatasaray
December 5 Galatasaray Liverpool

Concurrency, garbage collection and C++, a naive approach - 2

, ,

Lock-free, continued
I have realized that my previous post sounds a bit scientific, now I will try to sum up and bind result to C++.

We have got couple of works, scientific works, upon lock-free containers and data structures, some of them are already patented. These are, however, still too complicated and very limited.

Hardware support
Today, Intel i386 family processors facilitates some atomic operations in three ways. My understanding:
  • Prefixing instructions with LOCK may not assert a LOCK# signal on bus, but locks cache on the CPU, if requested area is already in the cache.
  • CPUs guarantee cache coherence through a special protocol (only on P6)
  • CPU asserts LOCK# signal on bus, modifies memory.

(By the way, I have studied electronics engineering, not computer science)

Bottom line is that we need hardware support to perform lock-free operations correct and quick, and atomic operations are still costly today.

C++ standard, of course, does not mention lock-free techniques. I happen to believe it will not mention it in upcoming standards, too. Because the subject is not in language's scope, in my opinion.

Back to threads
Thread synchronization, as very briefly discussed here, is part of our lives if we have to modify shared data in a multi-threaded environment.

Most Win32 programmers already know there are couple of C++ classes on the web, wrapping handles and providing C++-ish ways to deal with threads and synchronization objects. I am not developing multi-threaded applications on UNIX so I don't know existing libraries but as far as I have heard, there are really cool libraries for UNIX as well.

Software people at Intel was working on a library, I couldn't find the library's URL, but there was a discussion on comp.lang.c++.moderated.

Managed run-time environments, or virtual machines, like JVM (Java Virtual Machine) and .NET CLR have sort of "thread object", which boils down to a wrapper (component) over a native thread. I am not a Java expert, and I have heard that not all threads in JVM are native threads - I don't know how true it is, it sounds like fibers scheduled by VM. In fact, everything in Java has to be encapsulated by an object, anyway.

C++ and concurrency
For a couple of years, C++ people discussed language support for concurrency. Herb thinks "concurrency will be the next revolution in software engineering, much like object oriented programming did". C++, as a mainstream language, would like to, not just catching this train but, being a part of the locomotive that brings us to concurrency world. It's not just about wrapper thread classes this time, but proper compiler support, real thread objects, asynchronous functions, lock-free containers, Open MP support (well, not quite sure) and similar stuff are considered to be in upcoming C++ standards.

It's not impossible, but quite difficult to write correct (or reasonably correct) threading libraries today. What we will, hopefully, have are an International standard and compliant compilers that facilitate moving multi-threaded applications to mainstream. In last year's PDC, Herb has given a talk about some concurrency additions to C++.

Garbage Collection
Some mainstream languages and (virtual) platforms today utilize an old invention, called "garbage collection". C++, from standard's point of view, did not have it. There are just a couple of third party libraries working pretty good.

Garbage collection technology is fairly difficult to implement and some C++ people have some concerns; "does GC degrade performance of my C++ application?" "what if I want to do extreme programming and GC restricts my moves?" and a few more, probably arose because of garbage collection implementations they see in the market.

GC is, in its nature, essentially designed for performance concerns. But it introduces some essential problems as well. Today's mainstream managed run-time environments (.NET and JVM) sometimes suffer their compacting garbage collection designs. First problem is that they do not have a deterministic destruction but a non-deterministic finalization. Every application running on VM has at least 2 threads; one for process' main thread and one for finalizer.

How did C++ come today without garbage collection? We've had idioms and patterns, such as smart pointers (e.g. std::auto_ptr, boost::weak_ptr, etc) and reference counting (e.g. COM's IUnknown). These tools and techniques facilitate managing memory.

Compacting GC may improve performance, in particular in long-running applications, because it causes less or even fixes memory fragmentation problems.

First of all, one should not take Java and .NET as "the only GC implementations" around, but should look a bit wider vision. A GC implementation may not collect all objects, but may take it one step further and distinguish "GC types" and "non-GC types" (e.g. "this type of objects are managed by GC"). Non-deterministic finalization is not necessary. As Herb pointed out and implemented in C++/CLI as well is "delete first, collect later".

SomeGCType^ h = new SomeGCType;
// ...
delete h;  // call destructor, reclaim memory later.


In other words: "call destructor deterministically and I don't care when you collect the memory". That is quite suitable for all C++ programmers.

One common misconception is that "GC manages all resources". RAII pattern is widely used in C++ and every C++ programmer knows how and when resources they have acquired will be closed/freed. For a Java or a .NET programmer, well, they don't know/care what is (deterministic) resource management. Finalizers have one "feature"; a finalizer can run 0 or more times and they do weird things in finalizers. Nonetheless, a GC'ed C++, which has features implemented in C++/CLI today (I have mentioned above; distinct types, deterministic destruction), works very cool.

There are some discussions and concerns about garbage collection, but it seems like we will have garbage collection in upcoming C++ standard(s). ISO C++ will most probably have a GC close to C++/CLI design rationale.

Concurrency, garbage collection and C++, a naive approach - 1

, ,

C++, as a mainstream, modern and a strong language, has evolved and is still evolving to deal with today's programming challenges. We have started using garbage collection enabled virtual run-time environments for a more than a decade in mainstream production, although (compacting) garbage collection has been implemented in 1970s. Similarly, parallel computing and concurrency discoveries have been made decades ago. C++ has been invented in early 80s and standardized in 1998. C++ has refused to have garbage collection, probably because people were treating C++ "a better C" or "C with classes" for a long time. C++ has refused threads, locks and similar concepts as well.

I will refer primarily to Herb's thoughts, because I happen to believe he explains both of these concerns very clearly.

Threads
The "thread" word appear exactly once in ISO/IEC 14882:2003 (Programming Languages - C++), in exception handling section. There are some reasons behind it, and they are primarily:
  • Threads are not portable across platforms.
  • Thread is a very low level term (so is pointer, right?)
  • C++ has been used in single-threaded applications, primarily (arguably)
  • Due to portability problems, OS vendors and third-party libraries already provide a C API, and one can build a C++ abstraction layer upon them, if required.


Each system has its own threading mechanism. Some systems may not even honor threads, and go without them. Never mind required hardware support. C++ is a mainstream language on embedded platforms as well. Actually, as far as I know, even .NET people can't do without touching some C++ code on embedded platforms. I know compilers that do not comply with standard, support exceptions, templates and things like those that we use for first-class application development, but they have to go without those due to platform's restrictions and complexity introduced to implement those features in compiler. Since thread is conceptually very low level, it's really hard to standardize it. Because this may require threading and synchronization API to be standard or at least equivalent across operating systems. I think, these were primary reasons why threads have not been mentioned in the standard - well, because thread itself is really hard to standardize.

Thread Synchronization
Theory is simple: one CPU (single core) can execute exactly one instruction at any given point in time. n CPUs can execute n instructions at any given point in time (no pipelining). Our purpose is sharing processing power to execute series of instructions that belong different tasks. Because different tasks, usually, require different things. For example, when performing a slow IO operating, CPU can switch to another task until IO operation completes.

The problem starts when we have some data that we need to share among threads. When we want to change this shared data, we need to guard it from being accessed by other tasks running "concurrently". Therefore, we need to synchronize (some peope say "serialize") access to this shared resource with a set of syncronization objects provided by either operating system or third-party library vendor. These are, today, primarily lock based solutions. They are widely used, as lock based applications are simpler to write. Even with lock based designs, we run into problems.

Lock-based synchronization
Example (Herb's very good example):

If we had a piece of code, say A, and we can prove that this code has implemented locks 100% correctly. If we also had a piece of code, say B, and we can prove that it is also 100% correct. We cannot say the result will be 100% correct, if we use them together; they simply are not composable.


Because code A may take a lock, call something in code B, it takes a lock and calls something in A, which is guarded with a lock and there we have a deadlock.

Locks are simpler to understand, but still hard to understand. In lock based synchronization, we usually make system calls, because it's operating system kernel that deals with locks. "Hey, critical sections are user space objects", I hear. Yes, but critical section's scope is restricted to threads of the same process, and as far as I know, there is no such concept in POSIX standard, so no UNIX variant implements it.

The logic behind the locks are simple (pseudo code):
while (!AcquireLock())
      WaitForRelease();

// .. rest of the code


A piece of code tries to acquire a lock. If it can acquire the lock, it continues execution. Otherwise, it waits (infinitely or arbitrary time or never waits and returns - depends on design and OS support). Code repeats these steps to continue its execution.

Problems with above (or similar, lock based) code:
  • Too many system calls
  • No prioritization
  • Contention
  • Potential deadlock (i.e. task cannot proceed, gets stuck)


People believe system calls, especially on today's modern, fast and cheap hardware, does not cause any performance degredation. I am against this theory. There should always be a performance concern in software - we cannot rely on fast and cheap hardware - this can't go like that and all this breeds is bad design and implementation.

Too many system calls introduce a performance problem. In priority scheduling, when locks are used, prioritization loses its meaning. Some systems perform priority inversion, which simply increases priority of thread that owns a lock. But it's still not the proper solution. If threads try to acquire an already held lock, lock contention begins. The longer the lock is held, the more likely there is another task trying to acquire it.

There are some certain and simple rules in lock based approach and one of them is "never call unknown code while holding a lock", never call virtual functions and others' code. As I mentioned above, quoted from Herb's talk, we cannot prove that two correct implementations of lock-based synchronization are still correct after we use them together. This may lead a deadlock, a lock that will never open because two or more tasks are waiting each other to release a lock that other holds (similarly, one single thread can deadlock itself, too).

In fact, it has never been too simple to write a correct lock based code. Computer scientists then developed some "lock-free" algorithms that do not employ locks. This is what Herb says;

...you need scientists to write correct lock based programs. But you need rocket scientists to write lock-free based programs... everytime you write a piece of lock-free code, you actually prepare a (academic) paper, and expect corrections...



Lock-free Synchronization
There are a couple of approaches to this subject, but I will primarily focus on transactions and simple CAS (compare and swap, or, compare and exchange).

The purpose is solving shared data problem by introducing atomic operations. Atomicity, by putting simply, means that an operation either completes or ends as if it's never begun. In transactional concurrency, which's an idea heavily used in database systems, too; system defines an invariant for end state and if at the end of an operation this invariant is not satisfied, transaction rolls-back (undoes its changes, if made any - never mind catastrophic scenerios) and restarts. Actually, I have got a set of pretty thick books discuss transactions and concurrency and it really is complicated, believe me. However, it's our job to challenge our very own complexities.

A lock free system does not become Alice's world, by just not to use locks, but tossing coins at the gates of "The Matrix" with Agent Smith - whether you should enter or not.

Lock based systems are like Newton mechanics - you can roughly estimate something. Lock free systems are like quantum physics - nothing is certain enough


as Herb says.

A lock-free system does not necessarily mean a wait-free system, although a wait-free system is lock-free by its definition. Transactional concurrency I will mention will try not to deal about catastrophic cases.

A transaction can be seen as an operation that either completes or returns to its initial state, as if it's never begun. There are several approaches to this issue, too. Basically, this is done by getting a snapshot (copy) of the data, modify its copy, check invariants and write it to its original location (commit). If another transaction tries to commit its own changes and sees its invariants, for example target object's value, are not satisfied, rolls back and restarts its operation.

Opera and opera

, , ,

Working at Opera doesn't necessarily mean that everybody loves opera. The former "Opera" is the "Opera Software ASA". The latter one is the theatrical presentation, as everyone on the planet - whether they use Opera Web Browser or not - knows.

I'm not really keen with opera, either. I have, however, had some warm feelings about it and asked my coworkers whether they like Opera, so that may be we can go and see a nice one someday. We have some "Den Norske Opera" ads in our room. So I happen to believe they do like it! We already have one opera building but it seems like Norwegians need a better and bigger one and a very nice opera building is being constructed in Oslo. Nonetheless, survey results was saying (some) Opera employees are not really into opera.

Out of 15 people (out of 280 people :smile: )I have asked, only 2 guys were neutral (neither hates, nor likes). The rest explicitly said "no, I don't like".

What does "opera" mean?
As I'm a super duper Latin linguistic, I can anaswer this question rapidly and clear enough for an average person to understand p:

Opera means "result of a work", derives from "opus", which means "creative work", usually used for music compositions.

Except "musical composition" part, that's what we do here; we do design and implement innovational software that affects the way people browse the web, making your web surfing experience more comfortable, secure, reliable and fast. We do it in accord, we are a big team and everybody does what they have to, on time and correctly.

An Opera employee does go to opera everyday, and he/she himself/herself does play in opera everyday, as being part of Opera web browser team, everyday. We invent stuff, we prepare trends, others follow it.

"Resistance is futile, you'll be assimilated!"

Follow the trends - Countries visited :)

, , ,

Everybody has got "Countries I have visisted" pictures. I have decided to get mine, too! Going one or two cities does not make someone visited whole country, but that's how system works.



create your own visited countries map
or vertaling Duits Nederlands

The tiny red spot on far east is Korea. I have been to Seoul - gorgeous city, like Istanbul, it's just big. I mean, it's big, bigger than London, Paris or any other big city in Europe. Istanbul's population, as far as I know, is greater than Seoul's.

I have never been to northern Norway (red region on top of the map), didn't see whole Italy, Spain and Netherlands (yet). I have spent long time in London and we (I and a friend) have actually planned to go to Manchester and Cambridge, but we loved London so much so we've stayed there.

Well, I haven't seen whole Turkey either! Furthest east point I have been to was Ankara, the capital, which is at the middle of the country. Furthest south point was Izmir, which is on Aegean sea, quite close to Greece. I have born and grown up at north west of Turkey. Here I am at north west Europe, Norway :smile:

So, basically, I have seen following cities:
Belgium:
Antwerp
Brusssels

France:
Paris (twice)

Italy:
Milano
Rome (partially, needs proper visit)

Netherlands:
Amsterdam

Sweden:
Goteborg
Malmo
Linkoping (in very near future)
Stockholm (in very near future)

Norway:
Oslo (of course)
Bergen

UK:
London

South Korea, Republic of:
Seoul
The city south east of Seoul (forgot its name)

Denmark:
Copenhagen (with car, from Oslo, great trip, thanks Arjan!)

Spain:
Barcelona
Malaga (soon)

Turkey:
Istanbul (of course)
Tekirdag (of course)
Edirne
Izmir
Ankara
Sakarya
Canakkale
Bursa
couple of more, I guess :smile:

Addition
What about "my virtual flights"?


This is where I have flown so far (in real world and in simulation :smile: ) I prefer Lufthansa, sometimes KLM.

Hoping that they don't speak the way they write

, , ,

Many many years ago, British has, well, reached India. British took something from Indians, Indians did take from British. English have left, but they have forgotten English in there, which today bleeds, suffers. As far as I know, nearly all India and Pakistan can speak English, as they are former British colony.

I am quite frustrated about the way they use English, however. I think the major reason behind blogging is frustration, and here is mine; bad English make any piece of text horrible.

Some words I have collected:
plz, u, ur (sometimes for "you are" as well), no1, every1, y, cuz, b4, l8r (well, I was using this as a "nick name" on IRC :D and it was changing to "c_u_l8r" when I was away), wat (just one letter for God's sake!), waz (for both "what's" and "was")...

What does it have to do with Indians and Pakistanis?
Believe it or not; one of my best friends is Indian, sitting next to me. He's a really good person, speaks and writes very good English. I have one more Pakistani friend and lots of Pakistani friends especially in London. Well, almost all pieces of text contain sentences formed with above words are authored by either an Indian or a Pakistani.

Also, I recall Microsoft Support Center clip - hilarious! So some of them really do speak terrible English, as you can see from the video.

"Ben cı, ci, çu, çü değilim!"

, ,

This is a Turkish text.
Discusses Ataturkism in Turkey, which I happen to believe major and most obvious dividing mentality but could not be discussed / accussed since it contains the "holy" (!) word Ataturk. When you google it, you may see some Islamic links as well. I, however, did not intend to relate the subject to Islam. My concern is completely different; basically, the freedom of speech and thinking. Nonetheless, those guys somehow divide citizens into two; those who are Ataturkist and those who aren't. Much like black and white in USA.

Bazi meslekler, isler vardir ya, mesela; pazarci, bakkalci (!), tamirci, vs. Bu Ataturkculuk konusu da aynen boyledir; "Ataturkcu" insanlar vardir. "Kilosu kaca?" diye sorasim gelir bazen, fakat gulmekten soruyu soramam. Bir de "dinci" vardir, o da din satar, mesela. Gerici, irticaci da vardir. Onlar pek muhtemelen "geri" ve "irtica" satmiyorlardir ama... o da onlarin meslegidir, saygi duymak gerekir. Simdilik ne sattiklarini biz bilmiyoruz, fakat bir kesim biliyor ki insanlari "gerici" yada "irticaci" diye ayirt edebiliyorlar.

Ben elektronik muhendisligi okudum, ozaman "elektronikci" derlerdi. Sonra yazilim uzerine calistim, artik "bilgisayarci" deniyor. "secmece bunlar! 1200 Amerikan dolari, abi"... gibi, sanki bilgisayar satiyoruz pazarda! Degilim diye haykiriyorum, kimse dinlemiyor. Neyse ki elektronik satmadim, yada "topcu" olup top satmadim, Allah'a sukur.

Bana kalirsa, boluculugun daniskasi "Ataturkculuk"tur. Yani bu zihniyet der ki; "iki grup insan vardir; Ataturkcu olanlar ve olmayanlar". Birsekilde Turkiye, icerisinde Ataturk gecen her cumleyi kutsal sayiyor ve bu boluculuge goz yumuyor. Nedendir bilinmez, Turkiye gercekten ozgurluge ve hurriyete alisamamis. Farkindalar mi bilmiyorum; bu durum sadece diktatoral rejimlerde olur ve bu durum bircok vatandasi Ataturk'ten uzaklastiriyor. Yani karalanan yine Ataturk oluyor. Batili dostlarim da dogulu dostlarim da Ataturk'un ne oldugunu kavrayamamislar. Kimisine gore diktator, kimisine gore kral, kimisine gore "bir grup soylem"... ben aciklayamayacagim icin, en iyisi hic dokunmayayim; "google it!" diyorum.

Neyse, herkes kendini ve yerini biliyorsa, zaten isimlerle ayirmaya luzum yoktur. Fakat ben bir konuya aciklik getirmek istiyorum; ben cı, ci, çu, çü degilim!

Politik dusuncemi merak ederseniz; ben liberal bir dusunceye sahibim, Turkiye'nin en bati noktasinda, batili bir ailenin cocugu olarak dunyaya geldim ve buyudum.

Realism addiction/fetishism (!) in flight simulation

,

One short part of the problem; people think time compression is bad but I think otherwise.

As a flight simulation addict, I want and expect higher realism. Because flying is fun only in real life, and definetely far less fun in virtual life. We buy add-ons, we enhance them, write our own. We become members of "virtual airlines" that are trying to fly, in virtual world, the same schedules and the same aircrafts with the real life. For example, Lufthansa has a flight from Munich to Istanbul, with flight number LH 3350, departs from Munich at 11:40 and lands to Istanbul around 15:10. (All times are local) There are various aircrafts for this flight, but most probably it'll be an Airbus A32x (at least, it was in my past 6 flights - in real world). To fly this in virtual world, you need to leave the gate at 11:40 with an A32x (A320 or A321, may be). Boeing 737 can fly the same route, too. But you cannot do it, because the real Lufthansa, as far as I know, does not operate B737 for this flight (they may operate B727, though).

The problem is not with being forced to choose the same aircraft and schedule, but it's with the time anti-compressionism. Up to some extent, I find it logical in online flying. If you are flying over a manned airspace and everybody flies with high time compression, hey what can controllers do then? So this can be important in manned airspaces where traffic is (rather) dense. Lufthansa Virtual Airline does not force pilots to fly online or without time compression; "just fly", they say.

Turkish Virtual Airline, however, requires online flying and they do not allow time compression. Well, actually it's probably because (virtual?) pilots are flying online and need to communicate with (virtual?) controllers controlling various (virtual?) manned airspaces, so they better do not (virtually?) fly with time compression.

The basic answer of time-compression-haters is that; "because you just can't do it in real life?". I nod... and think... Ok, it's time to look around yourself "in real world". I mean, when you are virtually flying, stop the game and take a look around yourself. In real world, all we have are simply; a PC, a force feedback joystick or a yoke (with some pedals, and throttles, may be), a headphone (or a set of surround speakers, which does not work like a surround, anyway), a keyboard, a mouse, at least one screen and the nice chair that we sit (mine is a cheap bad kitchen chair, believe me, and I cannot sit longer than 3 hours). Does it look like a real A320? Do we really talk with ground staff, with a "real" co-pilot, smell fuel or any hostesses bringing coffee? Sorry to disappoint you, but none happens, dude! How many of virtual pilots use up-to-date charts or even FMC (look, this is important; I bet majority of those multi-engine-jet pilots that fly IFR flights do not use an aircraft equipped with FMC)? I bet more than 80% of virtual pilots has never taken a look at check-lists! We still don't have proper 3-D equipment - it's a (set of) monitor(s) (and the more you duplicate monitors, the more it gets worse). We still don't have proper surround sound (thanks to my washing machine sometimes making real engine sound effects). Finally, what we use (well, most of us) is a PC - not even a simulator that moves or shakes.

We sometimes have long haul flights, say, taking 7-10 hours. Unfortunately, strictly speaking, one needs to "waste his/her time" (literally) and fly without time compression. I cannot do it, I know exactly one person who did it exactly twice and that's it. I am doing this for fun and I'm not a masochist nor have that much time to waste. I believe sadist-masochist balance in those virtual airlines that does not allow time compression is ok, so I just leave them.

Safe and nice landings, and don't you forget to fly "with" time compression :wink:
Download Opera, the fastest and most secure browser
August 2006
S M T W T F S
July 2006September 2006
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31