SG Expressbank

Another bank that I'm unhappy with - SG Expressbank. Reasons

  1. They charge me with 0.69 on ATM withdrawal.
  2. They charge me with 1.39 (monthly fee)
  3. Interest rate: 0.00
  4. E banking application - outrageously bad (screws up every file format I request, cannot send money to an account without going to the bank (some security shit), ugly, not intuitive)
  5. The service is far from good.

I'm looking for a decent bank. Any ideas?

hudson ant javac unit-tests fork=true, cannot start javac.exe compiler

Hudson is a continuous integration tool similar to CruiseControl. It has a very good web GUI for defining tasks unlike CruiseControl.
Inside it I have configured a call to an ant task.

Strangely enough in on of the projects that had to be build I got:

build.xml:200: Error running _path_to_jdk_/javac.exe compiler

Strange.

I double checked the script in eclipse. It worked.
Manual call to ant on the eclipse machine also worked.

Then I went to the Hudson machine (a test environment). I ran the script manually. The same freaking error.
I copied the whole dir to another place on the test environment: no problem.

Maybe it's the credentials: added read/write to all. Still the same error.

Then I ran the script with: ant -verbose and see what I got:

_path_\build.xml:75: _path_\javac.exe compiler
        at org.apache.tools.ant.taskdefs.compilers.DefaultCompilerAdapter.executeExternalCompile(DefaultCompilerAdapter.java:509)
        at org.apache.tools.ant.taskdefs.compilers.JavacExternal.execute(JavacExternal.java:61)
        at org.apache.tools.ant.taskdefs.Javac.compile(Javac.java:997)
        at org.apache.tools.ant.taskdefs.Javac.execute(Javac.java:820)
        at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:105)
        at org.apache.tools.ant.Task.perform(Task.java:348)
        at org.apache.tools.ant.Target.execute(Target.java:357)
        at org.apache.tools.ant.Target.performTasks(Target.java:385)
        at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1329)
        at org.apache.tools.ant.Project.executeTarget(Project.java:1298)
        at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
        at org.apache.tools.ant.Project.executeTargets(Project.java:1181)
        at org.apache.tools.ant.Main.runBuild(Main.java:698)
        at org.apache.tools.ant.Main.startAnt(Main.java:199)
        at org.apache.tools.ant.launch.Launcher.run(Launcher.java:257)
        at org.apache.tools.ant.launch.Launcher.main(Launcher.java:104)
Caused by: java.io.IOException: Cannot run program "_path_\javac.exe": CreateProcess error=87, The parameter is incorrect
        at java.lang.ProcessBuilder.start(ProcessBuilder.java:459)
        at java.lang.Runtime.exec(Runtime.java:593)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.tools.ant.taskdefs.Execute$Java13CommandLauncher.exec(Execute.java:828)
        at org.apache.tools.ant.taskdefs.Execute.launch(Execute.java:445)
        at org.apache.tools.ant.taskdefs.Execute.execute(Execute.java:459)
        at org.apache.tools.ant.taskdefs.compilers.DefaultCompilerAdapter.executeExternalCompile(DefaultCompilerAdapter.java:506)
        ... 20 more
Caused by: java.io.IOException: CreateProcess error=87, The parameter is incorrect
        at java.lang.ProcessImpl.create(Native Method)
        at java.lang.ProcessImpl.<init>(ProcessImpl.java:81)
        at java.lang.ProcessImpl.start(ProcessImpl.java:30)
        at java.lang.ProcessBuilder.start(ProcessBuilder.java:452)
        ... 29 more
--- Nested Exception ---
java.io.IOException: Cannot run program "_path_\javac.exe": CreateProcess error=87, The parameter is incorrect
        at java.lang.ProcessBuilder.start(ProcessBuilder.java:459)
        at java.lang.Runtime.exec(Runtime.java:593)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.tools.ant.taskdefs.Execute$Java13CommandLauncher.exec(Execute.java:828)
        at org.apache.tools.ant.taskdefs.Execute.launch(Execute.java:445)
        at org.apache.tools.ant.taskdefs.Execute.execute(Execute.java:459)
        at org.apache.tools.ant.taskdefs.compilers.DefaultCompilerAdapter.executeExternalCompile(DefaultCompilerAdapter.java:506)
        at org.apache.tools.ant.taskdefs.compilers.JavacExternal.execute(JavacExternal.java:61)
        at org.apache.tools.ant.taskdefs.Javac.compile(Javac.java:997)
        at org.apache.tools.ant.taskdefs.Javac.execute(Javac.java:820)
        at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:105)
        at org.apache.tools.ant.Task.perform(Task.java:348)
        at org.apache.tools.ant.Target.execute(Target.java:357)
        at org.apache.tools.ant.Target.performTasks(Target.java:385)
        at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1329)
        at org.apache.tools.ant.Project.executeTarget(Project.java:1298)
        at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
        at org.apache.tools.ant.Project.executeTargets(Project.java:1181)
        at org.apache.tools.ant.Main.runBuild(Main.java:698)
        at org.apache.tools.ant.Main.startAnt(Main.java:199)
        at org.apache.tools.ant.launch.Launcher.run(Launcher.java:257)
        at org.apache.tools.ant.launch.Launcher.main(Launcher.java:104)
Caused by: java.io.IOException: CreateProcess error=87, The parameter is incorrect
        at java.lang.ProcessImpl.create(Native Method)
        at java.lang.ProcessImpl.<init>(ProcessImpl.java:81)
        at java.lang.ProcessImpl.start(ProcessImpl.java:30)
        at java.lang.ProcessBuilder.start(ProcessBuilder.java:452)
        ... 29 more

Cannot create a process?!
That's weird.

So tired enough I did something desperate:

From

<javac fork="true"

I went to


<javac fork="false"

and it worked ..... 🙁

Keep in mind that in the same build project I was calling a few other build.xml doing <javac fork="true"
several times before this one.
But this one was the only one having a reference to junit.jar (somewhere on the net I saw an article saying something about junit but don't remember what).

So I left it like this.

First Investment Bank, the sequel

I was unhappy with my bank (What not to do when you're a bank).

Recently, the rumors about it going bankrupt became stronger and stronger so I cashed out my accounts and went for another bank.
The rumors came out to be fake and I felt like a dumb ass, becase I followed unchecked information.

But overall I don't regret my decision. The bank now has a new software which sucks big time. I was on a few occasions unable to access my money (ATM, online, bank office), so I don't think this is a bank that I could trust.

First Investment Bank, you were one of the best, now you're one of the worst.

What to do when most e-banking interfaces suck?

In a previous post (here) I spoke about having trouble with e-banking software of my bank.

There is a pretty simple solution - the online payment operator - epay.bg. It also can do bank transfers, so it's perfect for the task.

Epay can work with almost all bank cards, it's cheap, it's user-friendly, it's reliable. It's the perfect solution.
One minor drawback - it can't check balance, because for sometime now most banks don't support that feature for epay 🙁

Still I'm going to use it. I can check my balance using the e-banking app.

What not to do when you're a bank

My primary bank is First Investment Bank.
I chose a quite a while ago because it had the reputation of a bank that was the first in everything.

It's e-banking was uncomparable with the competitition - outrageously ugly, but accepted smartcards and did all I wanted it to do.

Now it's getting different - they changed their system with a new one. Something called FlexCube. Weirdly enough owned by Oracle.

From internal sources I know that the new system sucks and they failed to deploy it for more than a year. And when they finally made it last week during the weekend - my bank card was not working, meaning me without access to my money just before I went to Serbia. I had to take a loan to be able to go - not a pleasant thing to do.

So about the new e-banking interface - it sucks, all my preferences and beneficients are gone. It's ugly and hard to learn.

So I'm looking for a new bank with a decent e-banking services.

I have experience with SG Expressbank and Postbank - they suck too.

Update: the comments following that post reminded me of a story:
I was in the Netherlands. Once talking to one of the guys we discussed how much cash does each of us carry. I did carry a lot, he counted on the cards he had. My case: bank cards don't work on the road, on the street, they can fail, cash cannot fail.

Later that week:
There was this friend with which we drank quite a few drinks and on the way back to the hotel (I was in an apartment, the friend in a hotel) they said the employer forgot to pay the room, so it couldn't be used. We tried all the credit/debit cards we had - no luck - none of them worked. He had to sleep at my place. Cash is bulletproof !

Srbija

I spent a couple of days in Serbia. Pictures here.

Overall I was surprised by what I saw - although they are not a rich country, its visible that they are situated closer than us to the more developed countries.
They don't speed on the road, it's clean and nice and green and ordered, people are really polite, roads are so much better than the Bulgarian ones.
Overall they are more advanced than we are.

EJB Exception wrapping, commiting broken transactions, resource handling in finally statement - overridding thrown exceptions

In this piece of code the task is to override system exceptions (JPA, JTA exceptions) with application exceptions:

try {
    transaction.begin();
    bm(); //business method
} catch (PersistenceException) {
    //rewrite persistence exception and throw it     (1)
} finally {
    try {
        transaction.commit();
    } catch (RollbackException re) {
       if( re.getCause() instanceof PersistenceException ) rewrite
       else // THROW SOME DEFAULT EXCEPTION          (2)
    }
}

The rewriting of PersistenceException (PE) is straightforward.
It could come from the business method (bm()) and from commit().
When it comes from commit() it is wrapped in RollbackException. Thus the if.

Unfortunately if PE is raised from the bm(), it is also raised from the commit().

So if I throw an exception at (1), it gets overridden in (2). As simple as that. Because of the finally's ability to override results (OOP got messy here).

So what should be fixed?
First, at (2) I shouldn't throw any exception.

Second, I'm thinking of checking the result of bm() - if an exception, don't call commit(), but rollback().
Sounds right.

EJB Sucks: one more reason why

I'm trying to like the specification, but I just can't.
Here's one more reason why:

I have SSB (Stateless Session Beans). The persistence is via JPA (implementation is Hibernate).

All my business method look something like:


...
public Object1 doSomething( Object2 ) throws ApplicationException1;
...

I use CMT (Container Managed Transactions) which means that the container calls begin() before the method call and commit() after the method call is over.

The problem: what happens if the transaction is rolled back?

A RollbackException is thrown. It looks common sense to try to rewrite it as ApplicationException1. Well.... YOU CAN'T.

No F way (at least not an easy one).

Solution1:
Make the Beans stateful and use SessionSynchronization. UGLY - I don't want to be stateful.

Solution2:
Implement TransactionSynchronizationRegistry - just look at it.

Solution3:
Make a facade EJB that calls my own EJBs which should use requiresNew. One more level of abstraction? I have to change the contract? I don't have just one Bean, so a wrapper for every single one of them?

Solution4:
Switch back to BMT (Bean Managed Transactions) and call begin() and commit() myself. Well then the container becomes useless. But my business methods are rarely longer than a few lines, so I'm choosing this one.

CMT without any simple way to plug after commit() and this is an enterprise level spec? Really?

I'd be really happy if someone corrects me and shows me a simple way to do what I need.

JPA (Hibernate), EJBs, and WebServices interface.

Here's the design:
EJBs for business logic, JPA @Enitities for object (domain) model, Web services for a public interface.

The model is quite complex.

Even in the presentation (web services) I use the entities model.

The problem comes from that in the presentation a call is made to an EJB. The EJB returns an entity which after the call is ended gets disconnected. So all collections (@OneToMany) cannot be loaded.

EAGER fetching was the solution but then half of the database was loaded on a single method call. And eventually I got to a really ugly MySQL limitation (A query with more than 61 joins (inner selects + cases + at least 40 left outer joins) and a length of 436 lines.

Now before returing the entity in the EJB method via Reflection I initialize all the collections I need. Ugly.

What I need and would perfectly fit me would be an eager fetching only until some level of deepness is reached, then switch to lazy. Then a level of 2 or 3 would be perfect.

Currently I don't of something like that existing.

If someone has an idea, please let me know.

MySQL sucks: one more reason

MySQL is a RDBMS. Or at least that's what it's creators claim it to be.

There's no other self respecting database who's only engine that implements transactions (innoDB) is not created by MySQL guys. Only until recently their own engine claims to support them. Even small in-process databases like Hypersonic and Derby fully support transactions from version one. Flawlessly.

Today I found one more reason for which I think MySQL should not be put under the category RDBMS:

Caused by: java.sql.SQLException: Too many tables; MySQL can only use 61 tables in a join
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2975)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1600)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1695)
        at com.mysql.jdbc.Connection.execSQL(Connection.java:3026)
        at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1137)
        at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1231)
        at org.jboss.resource.adapter.jdbc.WrappedPreparedStatement.executeQuery(WrappedPreparedStatement.java:236)
        at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186)
        at org.hibernate.loader.Loader.getResultSet(Loader.java:1787)
        at org.hibernate.loader.Loader.doQuery(Loader.java:674)
        at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
        at org.hibernate.loader.Loader.loadEntity(Loader.java:1860)

Until recently the maximum was only 31 table. A major WTF?!

I would gladly bet that Hypersonic and Derby do not have a constraint like that (haven't investigated it though).

The stack trace is intently complete to show that this comes from Hibernate. This can be reproduced by having a rich object model with EAGER fetching.

Maybe I'll write a little more on the EAGER fetching and the issues I have: here.

Localization (L10n) vs. Internationalization (i18n)

As simple as that:

Internationalization can be thought of as the design and information technology practices that enable localization to take place. It adapts products for potential use all over the world, whereas
Localization allows products to be suitable for a specific place, or “locale.”

So before thinking about localization, product and software designers must conceive the product in a way that will allow it to be later localized to many different cultures.

ICQ in GoogleTalk web client (gmail) - revised

What I wrote so far:

Open browser, go to the messenger part, log in, as simple as that.

First impressions:

  • no ICQ groups - that sucks - I used to use it a lot
  • aliases
    of people are retained ('MG Zas' for example) - which is a backup for
    groups ('group MG -> user Zas' becomes 'MG Zas').
  • Cyrillic characters work fine (if it was working with my other client - Pidgin/Gaim)

Concerning
the standalone client - Google Talk - I have no idea if it works there
- Google have a pretty wierd update policy - they update silently and
only some clients - it sucks.

After all  - it's usable

After a week of using it this is what I noticed:

  1. Cyrillic doesn't always work with everybody, sometimes UTF-8 comes as cp-1251, even though the browser is in UTF-8.
    1. However, when I write, everybody sees it correctly.
  2. No way to give authorization to people, no way to ask for one.
  3. No way to see user info. No way, really.
  4. Some of my peers receive everything in html. It's hard to chat with them.
    1. I guess people without the official client.

After all - it's still usable, but I'm not going to recommend it to any more.

[Joke] IT Developers in projects

Five cannibals (Man eaters) get appointed as programmers in an IT company.

During the welcoming ceremony the boss says: "You're all part of our team

now. You can earn good money here, and you can go to the company canteen

for something to eat. So don't trouble the other employees". The cannibals

promise not to trouble the other employees.

Four weeks later the boss returns and says: "You're all working very

hard, and I'm very satisfied with all of you. One of our developers has

disappeared however. Do any of you know what happened to her?" The

cannibals disown all knowledge of the missing developer. After the boss

has left, the leader of the cannibals says to the others: "Which of you

idiots ate the developer?"

One of the cannibals raises his hand hesitantly, to which the leader of

the cannibals says: "You FOOL! For four weeks we've been eating team

leaders, managers, and project managers and no-one has noticed anything,

and now YOU ate one developer and it got noticed. So hereafter please

don't eat a person who is working."

source: here

Refactoring

On a recent project I had after some thoughts I decided to unify some coding styles.
Eclipse rules in that matter. It was cumbersome, but easy enough. Until I reached a point.

Refactoring some coding style differences is a piece of cake.
Refactoring some design issues you want to fix is mission impossible.

The best way to proceed - scrap it and start from scratch. By scrap it I mean make a clean project and copy only relevant stuff.

Now this project has 2 times less classes 🙂

Старата фонетична за Виста

(Само и само да си вдигна рейтинга в Гугъл...)

Както всички, които са ползвали поне малко Windows Vista, са забелязали
- няма я старата фонетична подредба. Аз лично я ползвах доста. Вместо
нея има сложена една "стандартизирана от БАН" фонетична подредба, на
която обаче няколко букви са разместени. Примерно Ж е на мястото на W,
което на мен не ми харесва.

Имаше някъде спор из нета относно коя да бъде - старата или новата, но ме мързи да търся.
Аз
си харесвам старата и открих един инструмент от Майкрософт (тук ще ги
похваля), с който сравнително лесно могат да се пренаредят клавишите
(едно време имаше нещо подобно във FlexType (моля ви, не си слагайте
FlexType - Инженерът ще се кара)).
Инструментът се казва Microsoft Keyboard Layout Creator. Работата с този инстурмент не е толкова елементарна колкото изглежда, аз няколко пъти оплесквах нещата.

Та а използвайки тоя инструмент си направих фонетична подредба.

Update: във фонетичната на БАН забелязах нещо интересно: Shift + ь = ѝ.
Тоест малка оптимизация. Ер малък се използва само като малка буква.
Главна такава буква в Българския език няма. На мястото на главната
буква те са сложили "и с ударение". И с ударение също няма главна
буква, тоест ѝ трябва само една позиция на клавиатурата. За "и с
ударение" имам малко инфо тук.
Та аз реших да направя същата оптимизация и направих нова версия на класическата фонетична за Виста.

Инструкции за инсталация:

  1. от zip файла с инсталатор цъкнете на setup.exe, следвайте инструкциите.
  2. Клавиатурата сама се "пъха" в активните, така че веднага е готова за употреба.
  3. Ако
    все пак искате да цъкате ръчно разни неща: "Regional and Language
    Options" в Contol Panel -> "Keyboards and Languages" -> "Change
    keyboards..."
  4. Фонетичната на Виста/БАН се казва "Bulgarian (Phonetic)", моята излиза като "Bulgarian (Phonetic) - REAL"
  5. Ако
    имате старата ми версия инсталирана, по-добре я махнете, тъй като и
    старата и новата излизат с еднакво име. В списъка с инсталирани
    програми се различават по версията, обаче.

Поддържани хардуерни платформи: i386 (32 bit), ia64 (64 bit), amd64, wow64 (дори не знам какво е това).

Това е фонетичната подредба за Windows Vistа (в архива има инсталатор):
Bulgarian (Phonetic) - Old School (by Mihail Stoynov).zip (253.38 KB) (без оптимизацията за "и с ударение")
Bulgarian (Phonetic) - Old School (by Mihail Stoynov) v2.0.zip (252.92 KB) (с оптимизацията за "и с ударение")

Ето и самата подредба (ако някой иска да си играе с нея, не е никак елементарно):
Bulgarian (Phonetic) - Old School (by Mihail Stoynov).keyboard layout.zip (2.26 KB) (без оптимизацията за "и с ударение")
Bulgarian (Phonetic) - Old School (by Mihail Stoynov) v2.0.keyboard layout.zip (2.33 KB) (с оптимизацията за "и с ударение")

JPA (Hibernate) and enums, Updated

If there's an enum
(this is all java 5)
  

@Entity
public static enum Type {
    TYPE_1(1);

private int i;
    private Type(int i) {this.i = i;}
}

you can't do entityManager.merge( Type.TYPE_1 ), because merge returns a persisted copy of that object and requires a default constructor.
Even if you add

      

private Type(){}

it would fail.

The only way to add the possible values is with persist:

step1:
for( Type type : Type.values() ) {
    entityManager.persist( type );
}

Unfortunately I don't know of a shortcut for that operation - it seems logical all enum values to be in the DB, but are not there by default.

So what happens if there's an object

@Entity
public class Subscription {
   // Cascading for all operations
   protected Type type;
}

and one wants to persist an object like that: 

entityManager.persist( new Subscription() ); // would work even without step1
entityManager.merge( new Subscription() ); // would work only with step1
entityManager.merge( new Subscription() ); // without step1: "
InstantiationException: No default constructor for entity

So the conclusion is:
It's relatively easy to use enums as @Entities as long as on DB init all the enum values are preloaded in the DB (step1).

UPDATE:
What I wrote so far is true, BUT:

Even if one can persist enum, one cannot get them back, because of the aforementioned problem with the default constructor.

I was thinking of the doing the type-safe enum design pattern myself (as it was done pre- java 5): useless supplying a default .ctor prevents having a small number of instances - so again no good. Maybe if the .equals() and .hashcode() are rewritten this could work (but with a larger number of instances and a small number of different hashcodes) - just thought of it, may or may not work. One has to think about @Enumerated (JPA) or about Enum.name() and enum.ordinal() - still it does not look achievable.

There is an ugly solution of which I shall speak tomorrow because I want to go home !!!.

UPDATE: The solution: (be warned it's really ugly).

There should be an @Entity with an int (or whatever actually) @Id.
Then there should be the enum with a private property, whose type should be the @Id of the previous class. There should be a getter of that property
The getter() and setter() of the @Entity should be with the enum's type and in the getter and the setter the wrapping between the enum and it's int (or whatever actually) should occur.

Examples when I get back from lunch.

UPDATE: Example

// The enum
public enum Gender {
  Male(0),
  Female(1);
  private int value;

  private Gender(int value) {
    this.value = value;
  }

  public getValue() {
    return this.value;
  }
}

@Entity
public class Entity1 {
  @Id
  private int gender;

  // ... other properties

  public Gender getGender() {
    return Gender.valueof(this.gender);
  }

  public Gender setGender( Gender gender) {
    this.gender = gender.getValue();
  }

  // ... other stuff.
}

Yes, I know - it's ugly, but this is the best I know.

ICQ in GoogleTalk web client (gmail) - amazing

Open browser, go to the messenger part, log in, as simple as that.

First impressions:

  • no ICQ groups - that sucks - I used to use it a lot
  • aliases of people are retained ('MG Zas' for example) - which is a backup for groups ('group MG -> user Zas' becomes 'MG Zas').
  • Cyrillic characters work fine (if it was working with my other client - Pidgin/Gaim)

Concerning the standalone client - Google Talk - I have no idea if it works there - Google have a pretty wierd update policy - they update silently and only some clients - it sucks.

After all  - it's usable

180° flips with and without help

The last two days I went skiing (well, actually snowboarding) with a friend with which I haven't before and learned some new tricks. Now 180° turns aren't a problem. First the training started with doing (trying to do) turns without jumps (this is really exhausting because a jump alleviates the whole thing - rises you in the air), then little by little I started testing steep jumps with low speed (rises you high without being fast) and it worked.

Some of the turns (when riding on the back edge of the board) can be done in an easier manner when part of it is touching the snow while turning - it looks like doing half a circle. This way if there's some unevenness it can be used to help lift the board.

The whole thing took a lot more energy than usual, because of all the jumping and falling down. Now I have muscle aches all over my body, but it was worth it.

There are no pictures because it's hard to take some with two pairs of gloves and wrist-protectors in the middle.

Some Google services do not work today (in firefox only?!)

Since yesterday there are problems connecting to Google:

Reply from 64.233.167.99: bytes=32 time=152ms TTL=9
Reply from 64.233.167.99: bytes=32 time=151ms TTL=9
Request timed out.
Request timed out.
Reply from 64.233.167.99: bytes=32 time=150ms TTL=9
Request timed out.
Reply from 64.233.167.99: bytes=32 time=151ms TTL=9
Reply from 64.233.167.99: bytes=32 time=151ms TTL=9
Reply from 64.233.167.99: bytes=32 time=151ms TTL=9
Reply from 64.233.167.99: bytes=32 time=151ms TTL=9
Reply from 64.233.167.99: bytes=32 time=151ms TTL=9
Reply from 64.233.167.99: bytes=32 time=152ms TTL=9
Request timed out.
Reply from 64.233.167.99: bytes=32 time=151ms TTL=9
Reply from 64.233.167.99: bytes=32 time=150ms TTL=9
Reply from 64.233.167.99: bytes=32 time=151ms TTL=9
Request timed out.
Request timed out.
Request timed out.
Reply from 64.233.167.99: bytes=32 time=151ms TTL=9
Reply from 64.233.167.99: bytes=32 time=150ms TTL=9

There are time-outs connecting even from the states.

Really strange. Search and Calendar work fine, Gmail does not even load:

Loading…
This seems to be taking longer than usual.
...

Google reader does not load.

It all on periods - it works, it doesn't, ...

Update: Gmail, calendar work in IE, they do not in firefox - no idea.
A friend experieces the same issues but with different services (Docs)...

dasBlog, medium trust and pingbacks

I had an issue for quite a while with pingbacks in dasBlog:

Error:
System.Security.SecurityException:
Request for the permission of type 'System.Net.WebPermission, ...
failed.

at ...
at newtelligence.DasBlog.Runtime.Proxies.WeblogUpdatesClientProxy.Ping(String weblogName, String weblogUrl)

at newtelligence.DasBlog.Runtime.BlogDataServiceXml.PingWeblogsWorker(Object argument)

The action that failed was:

Demand

The type of the first permission that failed was:

System.Net.WebPermission

It comes up that medium trust allows opening connections only to originHost (I guess localhost).

Here's how I solved it:

go to

%windir%\Microsoft.NET\Framework\{version}\CONFIG\web_mediumtrust.config

and find

<IPermission class="WebPermission" ...

and add some additional URIs:

<IPermission
    class="WebPermission"
    version="1">

    <ConnectAccess>
        <URI uri="$OriginHost$"/>
            <!-- [Mihail Stoynov] dasBlog needs it for pingbacks START -->
            <URI uri="http://rpc.weblogs.com/RPC2"/>
            <URI uri="http://rpc.technorati.com/rpc/ping"/>
            <URI uri="http://ping.blo.gs/"/>
            <URI uri="http://rpc.pingomatic.com/"/>
            <URI uri="http://ping.feedburner.com"/>
            <URI uri="http://api.feedster.com/ping"/>
            <URI uri="http://xping.pubsub.com/ping/"/>
            <URI uri="http://api.my.yahoo.com/RPC2"/>
            <!-- [Mihail Stoynov] dasBlog needs it for pingbacks END -->
        </ConnectAccess>
</IPermission>

These addresses were in %dasBlog%\SiteConfig\WebServices.xml

Stunning change (Laptop overheating, part II)

I had some free time today (just trying to avoid studying) so I decided to dismantle my laptop (due to heating problems).

With some help from my roommate (a lot more experienced than me in that area) I finally found the screw that stopped me the last few times and opened it.

Everything was fine until I settled my eyes on the fan. But first to explain - the fan gets fresh air from beneath it and blows it through a radiator. The radiator itself is connected with a heat pipe to the processor, graphics card and some other stuff. So back to the story - I'm seeing the radiator and the fan and between them I see a "block" of dirt - it was like a chocolate bar - thick and shaped like a rectangle. (Sadly enough I was so excited that I forgot to take pictures).

So after an hour of cleaning and few attempts of assembling it (one of the times nearly until the end until I saw the fan standing outside), we tried it.

Amazing.

The temperatures before the cleaning:

The processor:
65-85 depending on the usage and access to fresh air (being on a couch for example)

Graphics card
65-80 depending on the usage and access to fresh air

HDD
No thermometer, but generally quite hot.

After the cleaning:

The processor
40-55 The fan doesn't even start, but when it does start it could drop it to 39 (previously a number I could only dream for)

Graphics card
~55; After I watch a movie I could say more.

HDD
mild to warm

I'm having ~20 degrees drop in temperatures.

That's amazing. It was undreamed of.

Update: pictures of the dirt in the radiators:

  
 

Spell checking software for MS Office 2007 (for Bulgarian language)

Look at this:

The message boxes are from a software that's supposed to be a spell-checker for Bulgarian.

Can this software fail at displaying Bulgarian characters?

The software is called Cyrilla Correct 2007 - it is intended for MS Office 2007 and this is a clean install of the trial version. This happens on first use.

A crap, I'm disappointed. And this is supposed to be the best thing on the market.

Does anybody know anything better? (Something that would work as seamlessly as Firefox's spell checker)

Exams

The last 30 days I've been taking a lot of exams (part of my master's degree).

Since January 26th until today I have
7 (seven) taken
3 (three) pending
2 (two) to go

That's a whopping 12 exams in a month.

Pending means awaiting results.

Please cross your fingers for the last five and especially for the last 2, because they are the cherry on top of the ice-cream - hardest mother F*ers ever.

Few words on Skype

I've always thought that whenever you distribute software or a service that does not need a central server that is under your control, people will always find ways to break that software or service for various reasons - to use it for free (think of Windows), use it for prohibited in the EULA purposes ( A good example would be ripping a movie or an Audio CD and distributing the ripped content).

I've always thought that even when having a central server but distributing clients (client applications) to the users would be hard to enforce the policy you want - ICQ guys (Mirabillis, now AOL if I'm not mistaken) would like you to use the official ICQ client because they sell ads (ads are shown in message windows), but I'm not using the official client and many others aren't.

So the perfect solution (in my opinion) would be to sell an online service - like what google is doing - search, gmail, ads, picasaweb, calendar, reader, gtalk are only a few that I'm using (without the ads). There are offline/thick client applications that google has, no doubt, but the majority is online with a thin client (browser).

Well guess what, there are companies that have a business with an offline client (thick client) that are doing their best to avoid all these problems.

All the other popular (and maybe unpopular) messenger networks have their protocol studied and many free and not so free clients written (trillian, pidgin, qip....., even online: meebo....). All of them, icq, gtalk, hotmail, yahoo, ... except for one - Skype.

Think, why is there no other client for the Skype network? Not even for chatting. There is no other that I know of. And I've searched.

Here's an article that explains why:
http://www.secdev.org/conf/skype_BHEU06.handout.pdf

It is kind of freaky - these guys have made everything they can think of to make it as hard as possible to reverse engineer the client, the protocol, the whole idea.

Skype is amazingly hard to debug and investigate - it has parts of it's code  compiled at runtime, it checks timestamps to see if there's a breakpoint. It calculates pointers at runtime to avoid debuggers. It has bogus code inserted, some code encrypted, all is really well obfuscated.

It's the same with the protocol - encrypted, hard to detect, hard to stop/filter by an administrator.

Even freakier - they have skype clients acting like proxies or routers for other clients - your client may be one. There are 20 000 worldwide.

The author says there is no antivirus that could detect a virus or a trojan if there was one. Skype client is the perfect blackbox - freaky.

They can read what ever they want from your machine and transmit it back to their servers and since the protocol is unreadable nobody would know.

Skype guys did a good job at protecting their business, but they created something far more capable that could be used for far more (how to characterize it) undocumented and unwilling-by-the-user things.

Pictures in blog entries, part II

Part I is here
It's really annoying to have pictures in the blog.

Here are a few more reasons why I find it hard:

  1. dasBlog only allows adding pictures one by one. Of course I know were is it uploading them to, but this is cheating and I avoid doing it.
  2. Thumbnails have to be done manually.
  3. Making a picture a link (<a href...><img src../></a>) is quite hard (see this) - the raw html editor has to be used.

Of couse images can be linked from external sites, but I wouldn't want to depend on that because links can change.

I was thinking of directly copying thumbnails from picasaweb, but then all the styles also came through and broke the whole idea.

Another think I was thinking was to embed the flash picture viewer from picasa, but it only works if you read the entry from the website directly. Google Reader blocks it:

Picasaweb picture viewer (you have to read the blog entry directly - I have no idea which rss readers support it):

If someone has had the same issues, please share your experience and possible solutions.

Sharam, Cedrik and Yasen (Deep Dish in Sofia)

Half of Deep Dish was in Sofia. The party was great. Personally I enjoyed Cedric more than Sharam. Cedric made contact with the public and whenever the euphoria started to leave he took some action to bring it back, while Sharam started the beat and didn't care that much

Here are some pictures:

There was no one around eleven

  
  
 

Sharam and Cedric

This guy was constantly fixing something

Why were they at the party - I have no clue

Full size here

Pictures in blog entries

A really annoying lack of functionality in dasBlog is emerging in my mind.

That's what MS Word has:
(the pictures are into the text, which is quite nice)

Here's how it's done in MS Word:

In the dasBlog text editor such functionality is missing. Of course, there's raw html editor, but that's too burdensome (I'm lazy).

Even the border in the upper pictures is done via the raw html editor - It's only setting the border from 0 to 1, which is not that hard, but for something more complex I'd rather use a rich text editor.

So if someone knows how to tweak this, please give me a call.