Monday, April 11, 2011

Complicated SWIG polymorphic return

A simpler solution

////////////////////////////////////////////////////////////////////////////////
// TODO: make this macro compatible with .NET Compact Framework, in which you
// can't return a structure over PInvoke.
//
// There is a problem in case you want to wrap a function that returns a pointer
// to a base class in SWIG, if that base class could refer to some derived
// class. For example suppose these classes are defined:
// class Actor { virtual ~Actor(); ... };
// class HumanActor : public Actor { ... };
// class RobotActor : public Actor { ... };
// class DogActor : public Actor { ... };
//
// And there is this function that could return any of the above:
// Actor* GetActor() { ... }
//
// The problem is that on the C# side, GetActor() will always return a new
// base class object (Actor), instead of the derived class (such as HumanActor).
// There is no easy way to deal with this, but I've written a macro that can
// help if you really need it. To use it, first, invoke the macro:
//
// %cs_return_derived_proxy_by_code(Actor, ActorOrDerivedClass, 0)
//
// The second name is a special typedef name that tells SWIG when to use the
// macro's special behavior. In order to make the macro apply to GetActor(),
// change the function declaration to this:
//
// typedef Actor ActorOrDerivedClass;
// ActorOrDerivedClass* GetActor() { ... }
//
// Next, you have to write a global function that obtains a code that will
// be put in a "SwigPtrAndTypeCode" structure to represent the derived type:
//
// %{
// int GetSwigTypeCode(Actor* a)
// {
// if (dynamic_cast<HumanActor*>(a) != NULL) return 1;
// if (dynamic_cast<RobotActor*>(a) != NULL) return 2;
// if (dynamic_cast<DogActor*> (a) != NULL) return 3;
// return 0;
// }
// %}
//
// Now, when you call GetActor() from C#, the C-side wrapper will return
// SwigPtrAndTypeCode, a special 8-byte structure, instead of Actor*.
// SwigPtrAndTypeCode contains the pointer to the Actor together with the
// type code returned from your function.
//
// Finally, the C# side will call a function that you must write called
// NewActorProxy() inside the P/Invoke class. Define it by inserting something
// like the following into your main .i file:
//
// %pragma(csharp) imclasscode=%{
// internal static Actor NewActorProxy(SwigPtrAndTypeCode p, bool memoryOwn)
// {
// switch(p.TypeCode) {
// case 1: return new HumanActor(p.Ptr, memoryOwn);
// case 2: return new RobotActor(p.Ptr, memoryOwn);
// case 3: return new DogActor(p.Ptr, memoryOwn);
// default: return new Actor(p.Ptr, memoryOwn);
// }
// }
// %}
//
// The third argument is an integer flag saying whether the object is reference-
// counted via %counted_obj. If you use %counted_obj for this type, then set
// IsCountedObj=1. They both change csout, so they are not compatible without this
// little hack.
//
// Note: this macro assumes IntPtr is used instead of HandleRef, but it only
// makes a difference if BaseClassPtrType is used as an input argument type.
//
// Finally, sometimes you may want to return more information to C++ than just
// a type code. In that case you use your own structure in place of struct
// SwigPtrAndTypeCode, and use %cs_return_derived_proxy_by_code2() to specify
// two extra arguments: the name of your structure on the C++ side, then the
// name of the structure on the C# side. Use SwigPtrAndTypeCode as an example.
%define %cs_return_derived_proxy_by_code(BaseClass, BaseClassPtrType, IsCountedObj)
%cs_return_derived_proxy_by_code2(BaseClass, BaseClassPtrType, IsCountedObj, SwigPtrAndTypeCode, $imclassname.SwigPtrAndTypeCode)
%enddef
%define %cs_return_derived_proxy_by_code2(BaseClass, BaseClassPtrType, IsCountedObj, CppPtrAndTypeCode, CsPtrAndTypeCode)
typedef BaseClass BaseClassPtrType;
%typemap(ctype, fragment="CppPtrAndTypeCode", out="CppPtrAndTypeCode") BaseClassPtrType* %{ BaseClassPtrType* %}
%typemap(in) BaseClassPtrType* %{ $1 = (BaseClassPtrType*)$input; %}
%typemap(varin) BaseClassPtrType* %{ $1 = (BaseClassPtrType*)$input; %}
//%typemap(memberin) BaseClassPtrType* %{ $1 = (BaseClassPtrType*)$input; %}

%typemap(imtype, out="CsPtrAndTypeCode") BaseClassPtrType* "IntPtr"
%typemap(cstype) BaseClassPtrType* "$csclassname"
%typemap(csin) BaseClassPtrType* "$csclassname.getCPtr($csinput)"
%typemap(csout, excode=SWIGEXCODE) BaseClassPtrType* {
CsPtrAndTypeCode p = $imcall;$excode
#if IsCountedObj
return $imclassname.New ## %mangle(BaseClass) ## Proxy(p, true);
#else
return $imclassname.New ## %mangle(BaseClass) ## Proxy(p, $owner);
#endif
}
%enddef

// REAL LIFE EXAMPLE (redacted for simplicity)

// Allow Element* to be returned using the correct proxy class.
// Not Compact Framework compatible.
%cs_return_derived_proxy_by_code2(Element, ElementOrDerived, 1, ElementPtrEtc, $imclassname.ElementPtrEtc)
%fragment("ElementPtrEtc","header") {
struct ElementPtrEtc
{
ElementPtrEtc() {}
ElementPtrEtc(Element* p) { *this = p; }

void* ptr;
ElemType elemType;

void operator= (Element* p) {
ptr = p;
if (p) {
try {
elemType = (ElemType)p->Type();
} catch(...) {}
}
}
};
}
%pragma(csharp) imclasscode=%{
// Used by %cs_return_derived_proxy
[StructLayout(LayoutKind.Sequential)]
internal struct ElementPtrEtc {
public IntPtr Ptr;
public ElemType ElemType;
}
%}
%pragma(csharp) imclasscode=%{
// Name comes from New ## %mangle(Element) ## Proxy
internal static Element NewElementProxy(ElementPtrEtc p, bool memoryOwn)
{
Element e;
switch((ElemType)p.ElemType) {
case ElemType.ITSC: e = new ItscElem(p.Ptr, memoryOwn); break;
case ElemType.NAMEDPOINT: e = new NamedPoint(p.Ptr, memoryOwn); break;
case ElemType.NAMEDLINE: e = new NamedLine(p.Ptr, memoryOwn); break;
case ElemType.NAMEDPOLYGON: e = new NamedPolygon(p.Ptr, memoryOwn); break;
default: e = new Element(p.Ptr, memoryOwn); break;
}
return e;
}
%}

Saturday, March 19, 2011

Changing the FOV in Mass Effect 2

By default, Mass Effect 2 has a narrow field-of-view, and you may find that the lowest mouse sensitivity setting (apparently called "Camera Sensitivity" in the game) is too high for many mice. Tweaking these settings requires that you change a file called Coalesced.ini. If you installed Mass Effect 2 via Steam, this file will probably be located at one of these two paths:

C:\Program Files (x86)\Steam\steamapps\common\mass effect 2\BioGame\Config\PC\Cooked
C:\Program Files\Steam\steamapps\common\mass effect 2\BioGame\Config\PC\Cooked

This strange file is a binary file that contains numerous text files embedded within it. The file must not be edited with Notepad (which corrupts it if you save changes). It can be edited with Notepad2 (an excellent replacement for Notepad), but there are reports that doing so will cause Mass Effect 2 to crash on startup (I didn't actually verify this, I just assume the reports are true). I don't mean that you shouldn't edit it with Notepad2, just that if you do, then you need to run a special utility that "fixes" the file after you edit it. Apparently the "binary" part of the file needs to be updated whenever the "text" part is updated. It's not possible to do this manually, so you need a special program to do the job for you.

Before changing Coalesced.ini, make a backup, in case you don't like your changes, make a serious mistake, or you can't figure out how to do the "fixing" process.

There are at least three programs that can fix Coalesced.ini: a C++ program, a Ruby program which is, apparently, no longer on the web, and a program called ME2CoalescedEditor. The last one is the one I use. ME2CoalescedEditor is actually intended to help you view, search and edit the various parts of Coalesced.ini, but its user interface is somewhat confusing.

Therefore, you may wish to edit Coalesced.ini with Notepad2 instead, and only use ME2CoalescedEditor to "fix" the file so that Mass Effect 2 can load it correctly without crashing. If you choose this approach,
  1. edit and save Coalesced.ini with Notepad2
  2. Start ME2CoalescedEditor, click the Commands menu, and choose Rebuild Coalesced.
  3. Exit ME2CoalescedEditor (and perhaps start ME2 to test your changes.)


There is actually a fourth option for editing Coalesced.ini, the "Coalesced Compiler", but it comes with its own special "split" version of Coalesced.ini, so apparently it does not let you edit your own original copy of Coalesced.ini.

Changing the field-of-view


My best friend and I play ME2 on a very big screen and we can't stand the default FOV. We need more peripheral vision... a lot more. The default actually 70 degrees; we use 100 or even 110 degrees instead. There is a line in Coalesced.ini that says FOVAngle=90, but apparently this line has no effect.

I found a command that does change the FOV; it's called simply FOV. This command, apparently, must be part of a key binding (Command="....FOV 100...."). Unfortunately, this command overrides the FOV permanently, instead of just changing the default FOV. When you right-click to aim, your view is supposed to zoom in, but if you have already issued an FOV command then it sticks, and your view does not zoom in at all! My solution to this problem is to issue a FOV command when you right-click, and another FOV command when you release the right mouse button.

My solution involves changing the Shared_Aim binding under BIOInput's [SFXGame.SFXGameModeBase] section. It looks like this originally:

Bindings=( Name="Shared_Aim", Command="SwapWeaponIfEmpty | TightAim | OnRelease StopTightAim" )

Change it as follows (change FOV 50 and FOV 100 to match your personal preference):

Bindings=( Name="Shared_Aim", Command="FOV 0 | SwapWeaponIfEmpty | TightAim | OnRelease StopTightAim | OnRelease FOV 100" )

The "FOV 0" command allows the game to revert to its normal FOV.

During cutscenes the FOV will not work correctly correctly. In order to change the field-of-view whenever you want, I suggest binding some FOV commands to an unused key or to the number pad. Under the BIOInput heading [SFXGame.SFXGameModeBase], add lines such as the following:

Bindings=( Name="NumPadOne", Command="FOV 30")
Bindings=( Name="NumPadTwo", Command="FOV 40")
Bindings=( Name="NumPadThree", Command="FOV 50")
Bindings=( Name="NumPadFour", Command="FOV 60")
Bindings=( Name="NumPadFive", Command="FOV 70")
Bindings=( Name="NumPadSix", Command="FOV 80")
Bindings=( Name="NumPadSeven", Command="FOV 90")
Bindings=( Name="NumPadEight", Command="FOV 100")
Bindings=( Name="NumPadNine", Command="FOV 110")
Bindings=( Name="NumPadZero", Command="FOV 0")

Now you should be able to zoom in or out whenever you want by pressing a button on your keyboard's number pad... higher numbers give you more peripheral vision. Particularly important is the num-pad zero key, which releases your FOV override so that the game can choose the FOV. Actually, you'll want to push this key every time you start dialogue with someone, and every time a cutscene starts, so you might want to bind "FOV 0" to a more convenient key... I leave that as an exercise to the reader.

In our apartment we have no need of the lower FOV settings, so we use these fun commands instead:

Bindings=( Name="NumPadOne", Command="Ghost" )
Bindings=( Name="NumPadTwo", Command="Walk" )
Bindings=( Name="NumPadThree", Command="shot")

The "Ghost" command lets you float in any direction, even through walls; "Walk" restores normal walking ability; and "shot" supposedly takes a screen-shot, although I haven't tried it yet. I got stuck in two places in Mass Effect 2, and Ghost allowed me to get un-stuck.

Changing the mouse sensitivity


To make the mouse less sensitive in-game, find the MouseSensitivity line under [SFXGame.BioPlayerInput]:

MouseSensitivity=1.0

Change this to a lower number. For me,

MouseSensitivity=0.5

worked best.

Thursday, December 30, 2010

Novial+English

To continue my thoughts on a Novial-derived IAL... well, I have a couple of ideas. One idea is to create a North American IAL based on English, Spanish and French. This would be an excellent language for unifying the Americas. But how to market it, I am not sure. Another idea is to emphasize English in the language, using other languages only when the English way of saying something is ambiguous (e.g. "hard", "like", "just"), cumbersome due to its length ("understand", "approximately", "mutually exclusive"), or problematic because of its vowels.

Novial has only 5 vowels, while English has 9 or 10 "basic" vowels plus several diphthongs. Now, when we "compress" an English word down to 5 vowels, problems often appear. Either we can import the English spelling, e.g. "meat" pronounced "MEE-at" or "MEE-aht", or we can use the English pronunciation, e.g. "mit" (MEET) for "meat". If we use the spelling, at least two problems appear:
  • What do we do with double vowels? I don't think we can ask people to pronounce "meet", "see", "book", and "foot" with two separate vowels, and if we say that the vowel is extra-long, people will disagree about how long is long enough. If we change "ee" to "i" and "oo" to "u", conflicts or false friends will appear: consider "boot" vs. "but", "beet" vs. "bit", etc. Likewise if we simply remove the duplicate vowel, "lok" could mean "look" or "lock", "bet" could mean "beet" or "bet", etc.
  • Some spellings will sound like a different English word: "but" sounds like "boot", "sit" sounds like "seat", and "pan" may sound like "pawn" depending on how you say it ("aw" in "pawn", pronounced the same as "a" in "father", is an acceptable way to pronounce the Novial vowel "a"; it can also be pronounced like the Spanish vowel "a" which is slightly different).
If we use the pronunciation instead, there are even more problems:
  • Homonyms. English has many words that are spelled differently but sound the same: would/wood, meat/meet, so/sew, two/to/too. One cannot tell these words apart if we only use their pronunciation.
  • Many unrelated English words would map to the same word in the 5-vowel system. For example, "bit" could be "beet" or "bit", "mit" could be "meet" or "mit", "pan" could be "pan" or "pawn", "nuk" could be "nuke" or "nook", etc.
  • Some words would look like other English words when spelled phonetically. For example, rid=read, bot=boat.
Clearly, it will be necessary to take words from other languages when these conflicts arise. I consider some of the conflicts minor because one of the words involved in the conflict is minor; for example, the English word "meet" is much more common than "mit", so if we respell "meet" as "mit" then it's not difficult to teach learners that it means "meet", because hopefully they will not naturally confuse it with the uncommon word "mit". "mit" would also sound like "meat", but if we normally choose spellings based on English spellings (instead of the pronunciation), then students will develop an intuition that "meat" should be spelled "meat", not "mit". This, I hope, will reduce the amount of confusion.

In any case, we would mix Novial with English (instead of just using Novial unchanged) purely for the sake of marketing, in accordance with my principles of IAL design. Novial is a very nice language, but it has not succeeded on its own. It needs a hook: something to make people want to learn it. By infusing it with English, it could be marketed at English beginners worldwide.

In my next post I think I will sketch out some ideas for what this mixed language would look like.

Principles of IAL design

I was conversing recently with Bruce Gilson, who was once part of a committee of 5 to 8 people who were unhappy with the original Novial and wanted to reform it. They made numerous changes which were to be known as "Novial 98"; some I see as beneficial (such as making it possible to easily distinguish nouns from verbs), but for the most part I didn't like N98, firstly because I liked the original Novial design, and secondly because making major changes would discourage the formation of a Novial community by causing dischord between those of differing opinions about the language.

Anyway, in that conversation I suggested a set of principles for IAL design that I would like to share, starting with the three most important:

  1. Sellability: a plausible plan is necessary to get the language adopted by a large population. In my view, the plan should be inherent in the design of the language itself, so as to convince people that it is worth learning due to similarity with some language they want to learn, or to convince people it is so close to their own language that it is "easy". But it could also be a totally separate advocacy plan: convincing the UN or some organization to adopt the language for practical reasons, getting media coverage, convincing philanthropists to donate, finding a business model, etc. Really, both advocacy and language design should be part of the equation.

  2. The greatest good for the greatest number: for example, it's good to take word roots from major living languages and even better to take common roots from multiple languages, so that the IAL is easy to learn for the greatest number of people. (However, designers often disagree about the exact formulation of this principle.)

  3. Expressiveness: the language should be able to express most of the nuances possible in national languages, but this principle is subordinate to (1) and (2): every new word root adds a learning burden, particularly to those who do not know a language from whence the root came, but even familiar roots may need to be looked up in a dictionary in case they turn out to be "false friends". Therefore, adding roots to gain expressiveness can harm (1) and (2), while subtracting roots and senses improves (1) although not necessarily (2). For example, Esperanto religiously minimized the number of word roots. I'm sure this makes Esperanto easier to learn for all kinds of non-Europeans, but clearly the first market for Esperanto was Europeans, so this minimization didn't help the language sell.

    Note that it is often possible to increase expressiveness substantially by adding a single word or affix to the language. For example, Esperanto has a suffix "-ema" which means "having a tendency". Because of this, there are a series of words that are easy to learn, such as "amema" (loving, tending to love), "felicxema" (tending to be happy, as in "li estas felicxema" he is a happy person), "parolema" (talkative), and "mangxema" (having a tendency to eat). In English we have special words or ways of saying this, such as "talkative" and "he is generally a happy/sad person", but this single suffix makes Esperanto more expressive, more regular and more concise than English for expressing this particular idea.

  4. Conciceness: One thing that ticked me off about Esperanto was what I called its "longeco", longness. While often EO text was shorter, or the same length as an English equivalent, it took longer to speak. The word "estas" surely should have been shorter, and there were a lot of other examples, for example the "jn" endings made words longer even without adding syllables, "cent" is awkward compared to "sent" so it takes longer to say - I mean, the phonotactics of EO are as bad as English, but unfamiliar to us, and therefore annoying. And the compound words added to its length. I spoke more about conciseness in my previous post.


Now, I put these principles in what I think ought to be the priority order. The number one priority is one that is missing from existing language designs. Some interlinguists in the early 20th century, including Otto Jespersen (designer of Novial) seemed to think it was inevitable that an easy international language would eventually be adopted across the world, but this has proven to be untrue. Clearly, adoption of an interlanguage will not happen without some clever marketing and a lot of effort by a lot of people. Moreover, it is my belief that the language design itself can be a key part of that marketing strategy.

In regard to "the greatest good for the greatest number", I do not interpret this to mean simply that we look at word roots and pick the most common one among several languages. That's not a bad thing at all, but I think it's wrong to limit oneself to that approach and none others. After all, it's rare that you can find a word root used (in the same sense!) by more than a billion people; thus for each word there are at least five billion people who would be unimpressed or baffled by each of your word choices. Therefore, in my view, using existing roots is as much about principle (1) as it is about (2), if not more so. Using existing roots makes it easier for us to get our foot in the door by saying "look how much international vocabulary you'll learn by leaning [IAL X]!" or "look how similar [IAL X] is to [language you want to learn]" or "look how easy this will be to learn because it's so much like your mother tongue".

Note how these benefits disappear when the root comes from a source that a potential learner doesn't care about: for instance, most English speakers don't care to learn Norwegian, Danish or Swedish, and therefore won't like the false friend "at" (which means "to" [infinitive verb marker] in Scandinavian languages and Novial 98). I don't think it will matter to most Englishmen whether the word is "natural" or "a priori" (made up); in either case it is outside their realm of interest, as (I suspect) typical English speakers would rather learn Spanish, French, Japanese, German or even Mandarin before a Scandinavian language. Heck, in America a lot of English speakers might not care to learn anything at all besides more English (evidently, dedicated monoglots are not our target market).

Now, of course, the Scandinavians will doubtlessly like the word choice "at". But a serious project should keep principle (1) in mind and ask itself: what word choices are more likely to lead to more "sales", that is, more people choosing to learn the language? It is sensible for an IAL to focus on one group of languages, such as European languages or languages around India, than to attempt mashing every single major world language together. The result of the latter approach just wouldn't interest enough people, in much the same way that an "a priori" language wouldn't interest enough people.

In the end I would like to see billions of people adopt an IAL. But before that can happen, a community of millions must be built first. It makes sense, therefore, to design a language specifically to appeal to a particular group of 100-1000 millions or so, and once the design is complete, to market the language only to those millions. It doesn't matter much what that group is, as long as you have a plausible plan.

Now, I have no objection to Scandinavian word roots. Nor do I object to "a priori" forms. I just doubt that Scandinavian words would fit very well into a plausible plan required by (1). If I'm right, then Scandinavian words and roots should not be considered much more valuable than a priori forms during language design. Sure, such words are good for (2), but principle (1) means keeping your eye on the prize: building a large community--and I mean large in terms of the number of speakers, not largely dispersed throughout the world, for the sheer distance between Esperanto speakers hasn't helped that language grow.

"a priori" forms have their place because sometimes national languages lack an unambiguous word for a given idea, or a regular system of derivation. The preposition "ye", and the IAL standard of including part-of-speech markers or hints at the end of each word, are good examples. Surely no organic language in the world has a regular, unambiguous system of part-of-speech markers. Yet for the sake of (1) and (2), part-of-speech markers are very valuable, whether a priori (like Esperanto) or only partly a priori (like Novial). In addition, if you believe as I do that the value of a "friend" in one national language is negated somewhat by a "false friend" in another,
it may happen that a neutral a priori form is the safest choice overall.

Bruce opined, "If a language is truly going to be an INTERNATIONAL auxiliary language, it cannot mimic English TOO closely."

I responded: well, that depends on what you think "international" means. I've heard more than one person say that there is already an international language: poor English. I kind of wince when I hear that, since I know that English doesn't function well as an IAL. "International" can mean "international flavor", i.e. resembling several languages, or it can mean "internationally used". I want to see a good IAL meet the second definition more than the first. If it can meet both at once, great. If not, surely it is more important for an IAL to be widely used than for it to be nominally "international".

Thursday, December 09, 2010

Novial

I have been thinking lately about how difficult it is to simplify English enough to make it into a viable international auxilliary language (IAL), Haf Inglish. It can be done, although Haf Inglish would certainly be more difficult than other constructed languages such as Esperanto and Novial. However, although I could make Haf English superficially very close to English, I am concerned that the changes necessary to make Haf Inglish easier to learn also make it so different from English that English speakers would find it hard to learn and use correctly. I worry that their English brains would constantly want to use English phrases that would be illegal in Haf Inglish. For example, I have noticed that certain English words are challenging to learn because they have many meanings, such as "tip". Observe the many meanings:
  • I gave her a tip of 2 dollars.
  • I gave her a tip of my hat.
  • I gave her the tip of my pencil.
  • I gave her a tip about how to do her job.
  • I will tip her two dollars.
  • I will tip her chair. Her chair will tip over.
  • The sound will tip off the police.
Clearly, if "tip" were to exist in Haf Inglish then it could not have this many meanings, because it would create major difficulties. Besides the sheer difficulty in learning so many definitions, the ambiguities would spill over into any derived forms that you might want to create. For example, would "tippic" mean "related to tips (money)", "related to tipping over", "related to tips (pointy ends)", "related to advice", or (if I may allude to a separate issue) "typical"?

Today, I have been reading again about Novial in this book; and the more I learn about it, the more I like it. Although some of its rules are more complicated than Esperanto, in most ways it is more regular and just plain better. After having learned some Spanish, I am finding that I understand Novial after very little study, probably because a large percentage of Novial closely resembles parts of Spanish and English. In the case of English, Novial usually keeps the spelling and not the pronounciation, but some words, such as "tu" (to), "did" (did) and "vud" (would), also sound similar to English. Novial's author, Otto Jesperson, makes arguments about why his language is designed the way it is, and why he chose particular word forms... unlike Esperanto, which "just is" the way it is.

Another thing I like is that Novial is a compact language like English--you usually don't need a lot of syllables to express something. When learning Esperanto, I often complained about its longness--the fact that I had to say "li estas feliĉa", 6 syllables, to express an idea that is only 3 or 4 in English: "he's happy" or "he is happy". And then there are the redundant grammatical markers, such as "jn" in "Mi ŝatas viajn blankajn ŝuojn" (I like your white shoes), which do not add syllables but still take extra time to pronounce.

In fact, due to its regularity, I suspect that clear speech in Novial will typically be shorter than English, because in English we must use longer words to express our ideas formally or unambiguously. For example, informally I could say that something is "hard", but since this word has two meanings, I need to use the word "difficult" or "hard as a rock" if I want to speak unambiguously. English (and Spanish, by the way) also has some "holes" where no short word exists for a simple idea. For example, the common phrase "I don't understand" is 5 syllables (including long syllables "don't" and "stand"), which is just too long for such a common expression. No wonder English speakers sometimes shorten it to "I don't get it" or simply "what?". Likewise we shorten "simply" to "just", "because" to "as"/"for", "also" to "too", and so forth. These shortenings "overload" the small words with many meanings, which makes English harder to learn. At the same time, it is bad for a language to be too short, if the small words become so tiny that the listener can't hear them anymore. For example, in English "can't take" can be mistaken for "can take"; it's hard to hear the word "is" in "The dog's skillful"; and "Isn't that John smug?" could be mistaken for "Isn't that John's mug?"

Now, Novial probably has some longness issues too, but clearly fewer than Esperanto and probably fewer than English. At the same time, it is probably long enough that a listener won't often "miss" the short words. Only the words "e", "o" and "a" (and, or, to/toward) concern me in that they might be too short, but I'll give them the benefit of the doubt. One thing I don't like is the contraction del = de li, like the Spanish contraction del = de el (which makes more sense--note that you cannot contract Spanish "de la" to "del"), and the fact that you can omit the "i" suffix from most adjectives. The suffix helps the listener (who, remember, is not a native speaker) to clearly understand what is being said. Besides, if there are two ways to say the same word then it'll be harder to find that word on the web (at least until search engines support Novial specifically). Note, however, that Novial words are more invariant than words in most other languages including English. Sure, they change forms when the part-of-speech changes, but in contrast to most other languages, there is only a single verb form. Besides, I consider it largely an advantage, both for communication and searching, that the word form changes when the part-of-speech changes. Anyway, I plan to always include the "i" ending in both these cases.

I also like the fact that Novial almost always uses subject-verb-object word order (e.g. in Novial you say "I love you", and usually not "I you love" or "love I you" or "you I love".) Obviously as an English speaker I am biased, but this and other similarities between English and Novial make me wonder whether Novial can plausibly serve the same goal that I intended to pursue with Haf Inglish. Specifically, I wonder if I could get into the English-teaching business and convince learners that learning Novial would help them learn English. I have no doubt that Novial would help a person learn any major European language, especially English, and like Esperanto, I think Novial could help anyone who is learning a foreign language for the first time, but the trick is to convince others. Haf Inglish has a clear hook, that's why I pursued the idea in the first place, but could Novial suffice? If it can, then it should, for surely Novial is superior as an IAL, even if it is inferior as an approximation of English.

My goal, after all, is not that everyone should learn English or Haf Inglish or any particular language, but that everyone should be able to communicate with one another. How this goal is accomplished doesn't matter much. We can't realistically ask billions of people to learn an enormous language like English, but it would be realistic for billions of people to learn Esperanto or Novial. It would also be realistic to imagine that when one wants to learn English, one starts by learning an easier dialect first (Haf Inglish), and that once Haf Inglish has a hundred million speakers or so, a billion more people will want to learn it instead of English.

Here are some example sentences in Novial and their translations. You'll see two translations; I always like to give a roughly direct translation first, in addition to a paraphrase. Yet Novial is similar enough to English that the direct translation is usually clear by itself.
  • es plu agreabli tu viva kam tu ha viva o tu sal viva.
    Is more agreeable* to live than to have live or to shall live.
    It is better to live than to have lived or to live someday.
    * Novial lexike lacks a translation for this word

  • Hir es multi roses: ob vu prefera li blankis o li redis?
    Here are many roses: do* you prefer the whites or the reds?
    * If we want to be picky, "ob" literally means "whether" and is used to make yes/no questions. "Ob" replaces "do" in questions like "Do you like it?". In questions like "Is it big?", and "Are you happy?", you use "ob" in addition to "es", the word for "is/are": "Ob lum es grandi?" (Whether it is big?) and "Ob vu es felisi?" (Whether you are happy?)

  • Li blanki es plu bel kam li redi.
    The white is more beautiful than the red.
    The white one is prettier than the red one.

  • Li porte non es klosat nun; lum bli klosa chaki vespre e sal anke bli klosa dis vespre.
    The door not is closed now; it gets* close every evening and will also get close this evening.
    The door is not closed now; it gets closed every evening and will also get closed this evening.
    * "bli" only means "get" as in "to become", not "to obtain". "bli" is easier to remember if you think of it as "being": bli klosa = "being closed".

  • Me non ha e non sal responda.
    I not have and not shall* respond.
    I have not and shall not respond.
    * Technically "sal" means "will", but usually "shall" is an acceptable translation which helps you remember what "sal" means.

  • Ob vu ha manja? No, non ankore, ma men fratre ha ja e me sal bald.
    Whether you have eat? No, not yet, but my sibling has already and I will soon.
    Have you eaten? No, not yet, but my sibling has already, and I will soon.
    ...After studying Spanish (which has something like 100 unique regular verb conjugations plus numerous irregular conjugations), the verb constructions in Novial, which are like English but simpler, are a welcome relief.

  • Me ama la kom me ha men matra e kom* me sal men filies.
    I love her as I have my mother and as I shall my children.
    ...It may not look like English, but it's nice that the word-for-word translation is perfect English.
As you can see, Novial's grammar and some of its words are often very close to English, just with (perhaps optional) differences in the placement of "not". Of course, when the words look like English words they still don't sound like English words, but at least the pronounciation system is very easy to learn, easier than Esperanto and much easier than Haf Inglish (to say nothing of Full English).

Tuesday, October 26, 2010

Haf Inglish proegram iydias

Note: the prefix "dis-" means "oppisit of". "Werdery" means "dictionary" (litterully, "place for werds".)

Soundic uttack

Haf Inglish has soundic spelling, but like English, it has diseasy spelling rules. I woood like to make a vidio game to help persuns to practis to decode spellings.

Base.d on Tetris Uttack, Soundic Uttack woood sho yoo piles of blocks. Each block is labullated with up to five letters and/or simbuls (puncchuayshun). One letter is bold, uujhoolly a vowl or dipthong. Yor goal is to remember the sound that the secund letter makes (which chainjes base.d on the after.ic letters), fiynd uther blocks thut represent the same sound, and moov the relate.d blocks into lines to make them disuppear (gaining points at the same time). The cullers of the blocks under the pointer are sho.d temporerrily. A simmiller game coood be made base.d on Dr. Mario.

Spelling checker/grammer highlighter/werdery

A smaal proegram that checks each werd ugainst the Haf Inglish werd data.set. It coood identifyy misspell.d werds (with red underlines), uuz cullers to identifyy vowls, and uuz styles to identifyy parts of speakness (speshully verbs, the center.ic part of eny sentunce). Nowicly, I myyself often make Haf Inglish spelling errors cuz byy habbit I uuz English spellings. This kiynd of proegram woood be helpful for myy oen writing, not oenly for uthers. Allso, when there be th.ree vowls (or speshul disvowls) in a row, it is less clear which soundic rules applyy, so a proegram woood help to disambiguuify.

The proegram shoood include a werdery with define.shuns. I woood allso like to hav a data.set of fotoes of nouns, so that meaning can be sho.d seeicly.

Monday, September 13, 2010

Metro 2033 graphics bug


How it's supposed to look

Tuesday, August 31, 2010

Haf Inglish

Haf Inglish is my idea for a simplified, one-way-phonetic form of American English designed as either a stepping stone for those learning full English, or as an international language in its own right. It would be marketed as the fastest way to learn English, because you can pick it up much faster than normal English, particularly for those without English immersion.

Its first target audience would be Latin American people, so I'll take advantage of the fact that they can type accents, encouraging (but not requiring) use of accents on stressed syllables other than the second-to-last.
  • The most common words of Haf Inglish would be pronounced like Standard English, with spelling adjusted to be phonetic. It would be phonetic in the same sense Spanish is: you can predict the pronounciation from the spelling, but not the other way around. The spelling changes are designed so that native English speakers can still recognize the words after the spelling changes, and so that many words are spelled the same way. Consequently, the spelling rules are complex, but not nearly as bad as English.
  • Haf Inglish does not have the words "am", "are" and "were". Replace these words with "be", "be" and "was" respectively. It still has "is", "was" and "been".
  • A fixed number of spelling exceptions (under 20) will be allowed for common words like "I" and "the". Exceptions are reserved for very common words, especially those which are hard to recognize (by English speakers) when spelled phonetically, or whose spelling would no longer be unique among synonyms (e.g. be vs bee). Currently I've chosen 14 exceptions: the, of, to, I, be, some, do, their, two, come, know, does, put, knew. Notice that 8 of these (to, I, be, some, their, two, come, know) have homonyms, and if they were spelled phonetically they could be confused with their homonym.
  • In addition to these exceptions, there are a few words that could be pronounced as they are spelled, but usually/often are not: a, an, been, for. Also, there are a few words which are spelled with an "s" that is pronounced "z": is, ease, always, has. However, in these cases the words are still understandable if the speaker uses an "s" sound, so I don't respell them for that reason alone. I replace "s" with "z" only if the word must be respelled for some other reason.
  • There are several short English words that end in "e": be, he, me, she, we. We could respell he, me, she, and we as "hee", "mee", "shee", and "wee", but I already decided "be" should be kept the same to distinguish it from "honey bee", and these words seem common enough to justify a special pronounciation rule just for them.
  • Phonetic rules are based on existing patterns, e.g. a silent e can make a so-called "long" vowel ("bite", "fate" vs "bit", "fat"), vowels sound different at the end of a word ("pot" vs "so"), and double letters force a "short" vowel ("better" vs "meter", "filling" vs "filing"). However, sometimes normal English spelling provides no way to distinguish between two sounds, like the "oo" in book and loot, and for these situations a new rule is required and one category of words must be respelled.
  • The rules for forming past tense and plurals would be regular with only a small number of exceptions: foot to foots, flyy to flyy.d, read to read.d, etc.; yet still, is to wuz, do to did, and this to these.
  • A dot (.) is used to separate morphemes to keep spellings phonetic. For example, it is clear in the word "same" that the "e" is silent. However, when forming the compound word "sametimely" (meaning simultaneously), Haf Inglish rules would require the "e"s to be pronounced unless a dot is added to separate the parts: same.time.ly. Two other important issues are past tense and plurals. I think for plurals, there should be a rule that the "e" in "es" is silent, or pronounced "uh" when the plural rules require it. When you consider that 3rd-person singular verb conjugations also use the plural ending, you realize that this ending is very common in English and therefore should be emulated in Haf English. However, I currently think past tense should be marked more regularly, with ".d" for all past tense (and past participle) endings regardless of their pronounciation.
  • Spelling changes would be designed so that a native English speaker can easily recognize the original word despite the changed spelling, e.g. "hee" for "he", "wuz" for "was". Being a slang spelling, the latter might strike a nerve with some, but you no doubt recognized the word, yes? If possible, a word is made phonetic by adding, removing or changing one letter, e.g. "unit" => "uunit" (where "uu" is pronounced "yoo"), "learn" => "lern".
  • Uncommon and international words (for example, the word "international") would keep their spelling the same, and pronounciation would follow the HI rules.
  • There should be a set of about 1000-1500 word roots to be learned for everyday communication; some words would be excluded specifically from the language so that English speakers learning Haf English can specifically learn not to use them. Words could be divided into "beginner" and "intermediate" roots.
  • The oo in book and the oo in boon would be allophones, but I'm thinking of using an extra letter to indicate the former ("boook")
  • The th in then and thin could also be allophones, but can we distinguish between them in writing? I notice that when a word ends with "th", it is usually unvoiced: bath, path, hath, myth, wrath; but it is usually voiced otherwise: them, that, they, bathe, lathe. Therefore, in the rare case that "th" is unvoiced but is not at the end, it could be marked with a dot (.): "th.in", "th.ick", "th.ink", "th.ing". However, since "th.ink" and "th.ing" are very common words, inserting the dot every time is a significant burden, so perhaps it should be optional.
  • The g in dog, age and garage must be distinguished. I propose "g" for gift, "j" for "gist" and "jh" for usual. However, I think the spelling of "usual" should be left unchanged because its phonetic spelling "uujhool" is too far from the original spelling.
  • s and z are not allophones. With the exception of plurals that are still spelled with an s, s and z must be distinguished by changing some words spelled with "c" or "s" to use "z" instead. Less important words will not be respelled if there is no name collision; instead the learner will be allowed to pronounce the z as an s. For example, you can say "thousund" instead of "thouzund", but you must not pronounce "lose" (looz) as "loose".
  • Contractions of "is" are allowed, but not "was" or "are" or "am". "don't", "didn't", and "won't" are also allowed. I am reluctant to allow "can't" because it can cause confusion when someone says something like "I can take it"--and listener might think he/she said "I can't take it". Maybe contractions of "have" and "has" should be allowed, but only if it's the helping verb: I've seen and she's seen, but not I've a car or she's a car. Then again, "He's" can mean "he is" or "he has", so if the contraction for "has" is allowed, one must infer the meaning from the context. He's blue and he's eating clearly use "is", but many sentences are ambiguous: "he's leave.d" could mean "he has leave.d" or "he is leave.d".
  • Words with many meanings make English harder to understand, so to lighten the burden, certain meanings are banned in Haf Inglish. The word pronounced "too" has five meanings in English: "two apples", "to the store", "to eat", "too large", and "you too". The last of these is banned; you must say "yoo allso" instead of "yoo too". The other meanings can be distinguished by their spelling, but are harder to distinguish in voice communication. The word "that" has at least two meanings: (1) "I ate that" versus (2) "I think that you are right" and "the thing that you see". The first is a nounoid (it plays the role of a noun), the second is a connecting word (it is debatable whether the different grammars of the two phrases should be considered different meanings of "that"). I think these two meanings should be distinguished, so I will be using "that" for (1) and "thut" for (2): "I eat.d that" but "I th.ink thut yoo be right".
  • In the same vein, English allows many words to be either verbs or nouns, which I believe can make it harder for a learner to decode sentences. Haf Inglish will segregate nouns and verbs. Tentatively, "ate" is a suffix to change nouns into verbs, and "ing" changes verbs into gerunds or nouns: verbs "kick", "bite", "see" become "a kicking", "a biting", and "a seeing" and not "a kick", "a bite" and "a view" as in English. The nouns "immij" (image), "Google", and "sex" become the verbs "immijate" or "immijify" (make an image or imagine), "Googlate" (search the web), and "sexate" (have sex).
  • There will be several minor grammar changes. Usually English-style grammar is correct, but some ways of speaking are correct in Haf Inglish that are wrong (or archaic) in English, e.g. both "I eat.d not the sandwich" and "I didn't eat the sandwich" are correct.
  • Vowels are of course a disaster in English spelling. So I'm making this post to experiment with a spelling system that is phonetic by translating a short story by Terry Bisson....
They're Made Out Of Meat
They Be Made Of Meat.

"They're made out of meat."
"They be made of meat."

"Meat?"
"Meat?"

"Meat. They're made out of meat."
"Meat. They be made of meat."

"Meat?"
"Meat?"

"There's no doubt about it. We picked several from different parts of the planet, took them aboard our recon vessels, probed them all the way through. They're completely meat."
"Therr's no dout ubout it. We picked sevral frum diffrent parts of the werld, toook them ontoo our scout ships, exammin.d them all the way thru. They're cumplete.ly meat."

"That's impossible. What about the radio signals? The messages to the stars."
That's dispossible. Wut ubout the radio signals? The messijjes to the stars."

"They use the radio waves to talk, but the signals don't come from them. The signals come from machines."
"They uuz the radio waves to tawk, but the signuls don't come frum them. The signals come frum mushéens."

"So who made the machines? That's who we want to contact."
"So hoo made the mushéens? That's hoo wee wont to contact."

"They made the machines. That's what I'm trying to tell you. Meat made the machines."
"They made the musheens. That's wut I be tryying to tell yoo. Meat made the musheens."

"That's ridiculous. How can meat make a machine? You're asking me to believe in sentient meat."
"That's ridicuulus. How can meat make a musheen? You be asking me to beleve in sentient* meat."
* Not phoneticized due to its rarity in English, plus the fact that it is still understandable when sounded out as "senteent".

"I'm not asking you, I'm telling you. These creatures are the only sentient race in the sector and they're made out of meat."
"I'm not asking yoo, I'm telling yoo. These creachurs are the ohnly sentient race in the erria and they be made of meat."

"Maybe they're like the Orfolei. You know, a carbon-based intelligence that goes through a meat stage."
"Maybee they're like the Orfolei. Yoo know, a carbun-base.d intéllijjence that goes thru a meat stage."

"Nope. They're born meat and they die meat. We studied them for several of their life spans, which didn't take too long. Do you have any idea the life span of meat?"
"No. They be born meat and they diy meat. We study.d them for sevral of their life-lengths, which didn't take too much time. Do yoo have eny iydia ubout the life length of meat?"

"Spare me. Okay, maybe they're only part meat. You know, like the Weddilei. A meat head with an electron plasma brain inside."
"Keep me frum it. Okay, maybee they be ohnly partly meat. Yoo know, like the Weddilei. A meat hed with an electron plasma brain inside."

"Nope. We thought of that, since they do have meat heads like the Weddilei. But I told you, we probed them. They're meat all the way through."
"Nope. We th.ink.d of that, since they do have meat heds like the Weddilei. But I told yoo, wee exammin.d them. They be meat all the way thru."

"No brain?"
"No brain?"

"Oh, there is a brain all right. It's just that the brain is made out of meat!"
"Oh, therr is a brain all right. But the brain is made of meat!"

"So... what does the thinking?"
"So... wut does the th.inking?"

"You're not understanding, are you? The brain does the thinking. The meat."
"Yoo be not understanding, be yoo? The brain does the th.inking. The meat."

"Thinking meat! You're asking me to believe in thinking meat!"
"Thinking meat! Yoo be asking me to beleve in th.inking meat!"

"Yes, thinking meat! Conscious meat! Loving meat. Dreaming meat. The meat is the whole deal! Are you getting the picture?"
"Yes, th.inking meat! Conscious* meat! Luvving meat. Dreaming meat. The meat is the hol deal! Are yoo getting the immij?"

"Omigod. You're serious then. They're made out of meat."
"Oh myy god. Yoo be serious then. They be made of meat."

"Finally, Yes. They are indeed made out of meat. And they've been trying to get in touch with us for almost a hundred of their years."
"Fiynully, Yes. They be indeed made of meat. And they hav been trying to get in tuch with us for allmohst a hundrud of therr years."

"So what does the meat have in mind?"
"So wut does the meat hav in mind?"

"First it wants to talk to us. Then I imagine it wants to explore the universe, contact other sentients, swap ideas and information. The usual."
"First it wonts to tawk to us. Then I imajjin it wants to explore the uunivverse, contact sentients, exchainj iydias and informayshun. The uujhool."

"We're supposed to talk to meat?"
"We be expect.d to tawk to meat?"

"That's the idea. That's the message they're sending out by radio. 'Hello. Anyone out there? Anyone home?' That sort of thing."
"That's the iydia. That's the messij they're sending out byy radio. 'Hello. Enywun out there? Enywun home? That sort of thing."

"They actually do talk, then. They use words, ideas, concepts?"
"They acchoolly do tawk, then. They uuz iydias, concepts?"

"Oh, yes. Except they do it with meat."
"Oh, yes. Exceptly they do it with meat."

"I thought you just told me they used radio."
"I th.ink.d yoo just tell.d me that they uuz.d radio."

"They do, but what do you think is on the radio? Meat sounds. You know how when you slap or flap meat it makes a noise? They talk by flapping their meat at each other. They can even sing by squirting air through their meat."
"They do, but wut do yoo th.ink is on the radio? Meat sounds. Yoo know how--when yoo hit or wave meat tugether--it makes a noise? They tawk byy waving tugether therr meat at each other."

"Omigod. Singing meat. This is altogether too much. So what do you advise?"
"Oh myy god. Singing meat. This is alltugether too much. So wut do yoo advise?

"Officially or unofficially?"
"Uffishully or nonuffishully?"

"Both."

"Officially, we are required to contact, welcome, and log in any and all sentient races or multibeings in the quadrant, without prejudice, fear, or favor. Unofficially, I advise that we erase the records and forget the whole thing."
"Uffishully, we are reequire.d to contact, welcum, and log in eny and all sentient races or multi-beings in the quorter, without prejudice, fear, or fayverness. Unuffishully, I advise that we erase the reckerds and forget the hol thing.

"I was hoping you would say that."
"I wuz hoping yoo woood say that."

"It seems harsh, but there is a limit. Do we really want to make contact with meat?"
"It seems harsh, but therr is a limmit. Do wee truely wont to make contact with meat?"

"I agree one hundred percent. What's there to say? 'Hello, meat. How's it going?' But will this work? How many planets are we dealing with here?"
"I ugree wun hundrud percent. Wut's therr to say? 'Hello, meat. How be yoo?' But will this werk? How meny planuts be we manijjing here?"

"Just one. They can travel to other planets in special meat containers, but they can't live on them. And being meat, they only travel through C space. Which limits them to the speed of light and makes the possibility of their ever making contact pretty slim. Infinitesimal, in fact."
"Ohnly wun. They can travul to uther planuts in speshul meat cuntainers, but they can not liv on them. And, being meat, they ohnly travul thru C-space. Which limmits them to the speed of light and makes the possible.ness thut they ever make contact verry slim. Infittessimal, in fact."

"So we just pretend there's no one home in the universe."
"So we simply pretend therr's no wun at home in the uunivverse."

"That's it."
"That's it."

"Cruel. But you said it yourself, who wants to meet meat? And the ones who have been aboard our vessels, the ones you have probed? You're sure they won't remember?"
"Cruel. But yoo say.d it yorself, hoo wonts to meet meat? And the wuns hoo hav been ontoo our ships, the wuns you hav prob.d? Yoo be shur they wo.n't remember?"

"They'll be considered crackpots if they do. We went into their heads and smoothed out their meat so that we're just a dream to them."
"They will be th.ink.d to be dissane if they do. We went intoo their heds and smoothate.d their meat so that we be ohnly a dream to them."

"A dream to meat! How strangely appropriate, that we should be meat's dream."
"A dream to meat! How strainjly fitting, thut we be meat's dream."

"And we can mark this sector unoccupied."
"And we can mark this sector nonocuupy.d."

"Good. Agreed, officially and unofficially. Case closed. Any others? Anyone interesting on that side of the galaxy?"
"Goood. Agreed, uffishully and nonuffishully. Case cloze.d. Eny uthers? Enywun intresting on that side of the galaxy?"

"Yes, a rather shy but sweet hydrogen core cluster intelligence in a class nine star in G445 zone. Was in contact two galactic rotations ago, wants to be friendly again."
"Yes, a rather shyy but sweet hyydrogen core cluster intéllijjence in a class-nine star in G445 zone.

"They always come around."
"They allways warm up to us."
("come around" is an idium not likely to be comprend.d. I th.ink "warm up" can be clear in-context.)

"And why not? Imagine how unbearably, how unutterably cold the universe would be if one were all alone."
"And whyy not? Imajjify how nontolerably, how nonspeakably cold the uunivverse woood be if wun wuz all alone."

Thursday, July 15, 2010

The Ultimate 3D Home Theater PC

The biggest problem with this article by Maximum PC is their suggestion to buy a $95 video card. Friends, there is very little 3D movie and TV content available and you'll probably pay a ton of money for it. Why not spring for a 3D video game PC instead? NVIDIA's 3D Vision will retrofit most of your existing games to 3D. For that you'll need at least a $350 GeForce GTX 470, because 3D mode cuts the framerate in half or worse.

At my place we already have the ultimate budget 3D home theatre system. We got a PJD6531w which is probably the lousiest 3D projector on the market (with e.g. its lower brightness in 120Hz mode), but it cost just $800 (plus over $300 for 2 pairs of glasses including the NVidia 3D kit). Sit 5 feet away from your 100-inch screen, Crank up the field of view of your game to 100 degrees, play around with the "advanced" hotkeys to make objects pop out of the screen, and it's nothing like what you've played before!

Monday, July 12, 2010

Caprica review

My take after the first 9 episodes: simply put, Caprica sucks.

As a fan of Battlestar, I found Caprica to be huge disappointment from the pilot onward, certainly worse than BSG's final season. BSG, I thought, started great but took a turn for the worse in season 3 and got still worse in season 4. It went uber-dark, characters became increasingly dysfunctional, and the main plot never really came together. Caprica is a couple of notches below BSG Season 4 in every possible way.

Scientifically, the show demonstrates a shocking ignorance of all the science, technology and biology it is based on; any educated person should be offended. It starts with angry teenager Zoe Graystone creating a seemingly perfect replica of herself in cyberspace using little more than various computer records and videos of herself. The absurdity gets worse after Zoe dies, when her father Daniel finds out what Zoe had done and, in just a day or two, builds a completely convincing intelligent being (Tamara Adama) with an accurate and seemingly complete personality and memory, based on nothing more than whatever random database records he could find about this dead person. And that's just the beginning. The show just goes on and on and on with asinine "syfy" that is blissfully unaware of how face-palmingly stupid its technical aspects are.

So the human race developed hyper-intelligent AI using... nothing more than a couple days work from Daniel and a maybe a year of her dead terrorist daughter's free time? Really? That's their explanation for the origin of the Cylons? The same cylons that try to exterminate the human race for no clear reason? Surely backstories don't get dumber than this. This show craps on the memory of BSG, friends.

All the main characters are flawed, unethical to some degree, not all that likable, somewhat bland, and not well developed, so that none of them really stands out from the others. The few meaningful relationships between characters are dysfunctional to the point of being annoying, like Daniel Graystone's passing familiarity with his wife. The plot moves almost glacially slowly, as if they just can't think of anywhere to go with it.

On the plus side, the acting is good and there's enough drama to keep one from falling asleep. But I hate to see a great show like BSG leaving behind nothing but a turd like this.

Friday, January 22, 2010

Charmaine's Tokyo

If home is where the heart is, then my heart is lost at sea
And I, I have built my palace where the sand and waters meet.

I've been living on this island, I saw you pass me by
Calling out to me, hope within your eyes
Love is an adventure, I'll take my chance on you, on you

Chorus
Rio, France, meet me in Mexico
Chinatown then off to Tokyo
It doesn't matter cause anywhere's perfect with you

City lights, colors of indigo
Sun or snow don't matter where we go
It'll be perfect cause it's all amazing with you

We're singing,
Oh Oh Oh Oh
Oh Oh Oh Oh

Home is where the heart is, and my heart is in your hand
n' you, you can build Your Kingdom in the center of this life.

And I, I'm stepping off this island,
never looking back, you're my only home

Rio, France, meet me in Mexico
Chinatown, then off to Tokyo
It doesn't matter cause anywhere's perfect with you

Oh Oh Oh Oh
Oh Oh Oh Oh
Oh Oh Oh Oh
Oh Oh Oh Oh

(Instrumental 0:23)

Santa Fe, Chile, Romania
Africa then to Australia
It doesn't matter cause anywhere's perfect with you

Open skies, freedom is beautiful
Rain or shine, no matter where we go
It'll be perfect cause it's so incredibly true
It'll be perfect cause it's so amazing with you

We're singing oh oh oh oh-uh-oh-uh-oh
Whoh oh oh oh
Whoh oh oh-uh-oh-uh-oh
Whoh oh oh oh