Re:Tomcat is as rock solid as it gets
on
Tomcat 7 Finalized
·
· Score: 3, Interesting
It's solid for normal serving of servlet stuff but that's about it sadly.
- Your "security record" comes from the fact that tomcat is written in a "safe" language, a security hole would have to come from some stupid manual hole, a JVM bug or the APR connector.
- The non-blocking extensions are non-standard, and much worse than that is that those extensions only works with the APR connector (IE NATIVE C CODE!) but are only experimental with the portable NIO connector (after alot of debugging my own code i finally found a blog post about NIO not working with tomcat async). So it means that you need to be compiling/installing the tomcat code for the target platform before deployment instead of just copying over the JAR's or something like that as you'd be expecting with a Java app.
- The internals are quite contrived, oh i'm sure there's a good reason and prolly has to do with the APR/NIO/"classic" multi-connector support but it made me drop the option of actually fixing the NIO support. (so the open source advantage goes out the door)
- Last i tried (autnum) the API for servlet 3 async was there in tomcat7 but it seems the implementation wasn't? gave me alot of headache and the APR only support for their propeitary async api finally broke most of my faith in tomcat as a future platform.
The most ironic part about all of this is that i decided to do a quick project with a "established" base system and not be hacking things up, but i'd say i rediscovered a truth. If you want to do something new with an established package you might just run into experimental features and/or features that would requie the entire system to be rearchitectured (both in the case of tomcat).
I've now taken a big leap to an "experimental" platform(Node.JS) and while not perfect at all it was built from day one for the kind of things i wanted to do. Oh and working with Javascript on a small project is an absolute pleasure compared to Java:)
The mantissa doesn't state a "number", it is the decimal part of 1.xxxxx.
Say we have a 2 bit mantissa. The mantissa would thus describe the following numbers: 00 -> 1.00 01 -> 1.25 10 -> 1.5 11 -> 1.75
When we reach 2 we just increase the exponent instead, This gives the double representation a bigger range.
For very small numbers there is also a "subnormal" representation in the IEEE standard. This is when the exponent reaches the "smallest" possible value. At this point the mantissa bits represents numbers from "2" to "0" with the smallest exponent.
If i'm not off my hat right now this is why setting all the bits of a float or double will actually produce a 0, lowest exponent, -> subnormals = actual 0 and no sign(irrelevant in the case of floating point numbers though)
Could you give a reference on this? Partial register stalls on al->ax->eax writing is kinda obvious but this would only apply if you read after a partial write, doing a full register write would remove any partial stalls.
In an analogy to that the partial writing of a the flags shouldn't matter unless you depend on it from an immediate flag reading instruction like a conditional branch or treating flags like numbers (ie pushf,etc). Especially since a shift would likely to be followed by a compare the shifts flag state is irrelevant for the one who reads the flags as it has been overwritten.
It's somewhat ironic that the ARM chipset and architecture was first created by a computer manufacturer that flopped, only to see the cpu architecture that was the offspring actually be the only architecture to ever gain at the expense of the X86 architecture that probably was the culprit of destroying acorn computers.
And with this happening and even more focus being shifted onto the web as being the platform independent delivery platform, it won't be Intel flirting with Apple and Linux that got MS onto the fast path to obscurity. But the availability of a ever so cheap platform, powered by a ghost from the past.
For C/C++ eclipse isn't even in the same league as VS 6 (Edit-continue factors in HEAVILY in that:).
But i recently did a C# hack in VS(2005) and writing stuff in there felt very very crude compared to working with Java in eclipse, no refactoring and sync issues with the UI editor. Maybe 2008 fixed this.
Now consider all the other plugins available for Eclipse thanks to the plugin arch then i actually favour Eclipse for much work.
For somewhat travel and noisy environments (office,etc) i actually prefer a decent pair of rubber earbuds ("hard earbuds" just sucks) to most midlevel foamed headphones as they're far better at keeping out external sounds without breaking your eardrums.
I think the argument for this would be that since the shareholders did fire the board that made the deal the judge considers the act of signing the contract something done agains't the will of the owners/shareholders and has taken it upon himself to reverse this.
Think of it in another way, what if the CEO/Chairman of a listed company would transfer all the funds of that company into his own account. He did have authority to access the accounts, but the act itself would certainly be considered theft.
Because people would become confused and suspect foul play if you're directed to an unknown processor. (I personally do not know the names of any commercial processors on the net. but it's not my bank).
There's 2 other options. 1: Using links directly to your bank, where you could log in. This is actually used by my personal bank but i find it very scary. (Because by using devious tricks of javascript and co i could be entering login info to my bank account that somebody could steal. Not good. 2: Temporary internet creditcards. This way i log into my bank (from another browser or even computer maybe) and create a new card and authenticate it for ONE purchase. So anyone trying to do a new transaction will be refused because it simply ain't allowed. If i want to make another purchase. I just add another purchase to the list.
The GameCube has hardware texture compression, the PS2 does not. It's difficult to imagine that would be any trouble.
1: The ps2 has 32 megs (31 megs excluding kernel) vs 24 for the GC. and 30% matters alot.
2: We actually had hell to port a DC(that had texture compression) game to the ps2 (headhunter), but for that title it wasn't the texture compression that was the biggest problem. it was that artists had tuned the 3d scenery for the DC that had hardware alpha-sorting. There is(was?) no official built in texturecompression on the ps2. But the greatness of the ps2 lies in it being raw and tad fucked up, in reality you can actually do texture compression on the ps2!
I have a R100 i bought in the spring of 04. Apart from changing the motherboard because of the faulty built in memory (that i got replaced for free), it's the same machine as when i bought it. The harddrive is fine and i've used this computer about roughly 8 hours a day on average (counting a bit less time on weekdays and much more time on weekends). But i have heard complaints about Toshibas sometimes, the R100 is quite a premium machine (the second most expensive machine when i bought it) so i guess it has a higher quality than the Satellite machines that costs a 1/3rd of the price.
Yes, thanks Google for standing up for us all. All Google had to do was refuse to give their money to someone else. Let's think this situation through before applauding Google's altruistic nature.
Right, so you'd prefer to see the internet transformed into TV 2.0 where the ISP's are the ones who decides what you should be able to watch and listen instead of f.ex. the record companies.
The internet is beautiful because every little joe can create his personal website, publish his obscure music, sell his special goods and most importantly speak without being censored.
true, but i bought my psp last weekend and it came with a 1.52 firmware + 2.0 upgrade disc. considering lead-times,etc i think that most psps over the holiday season will still be 2.0. 2.01 and higher firmwares will prolly not be in retail machines until next year (altho some batches for the holidays might be have it aswell).
1: If used properly, yes. ever heard of NURBS ? it's there in basically all modelling packages. The problem of modelling with nurbs is that you can feel a slight loss of control until you master them, and when going to really highpoly meshes you don't wanna be flipping tri-edges to get nice shading.
2: True, i think that MotoGP or some other motorcycle game on the PS2 actually did the same thing (tesselating smooth curves for meshes in realtime) by using the VU chip, maybe somebody could look at that and try to get the patent invalidated? depends ofcos on if you want to classify the VU chip as "hardware".
It's the physics engine. Multiple collisions is a really hard problem for a physics engine to solve. There are different ways of approaching this.
- Check your collisions once a frame and bounce or something when you collide. DOWNSIDE: If you have a car running at really high speed you could actually run through a wall or another car, totally unacceptable.
So you have to do a time-sweep. In other words trace the entire movement of the object from time when the movement started until the end, ie do the calculation between 2 consecutive frames. Now all collisions are detected, but how do you handle the collision?
- Stop the object at location it had in the previous frame. DOWNSIDE: if you are chasing another car and bump into the rear your car would loose all speed. totally unacceptable in a racing game but could work in a platform game. Another illustration is a box sliding down a slope, it would never get down the slope because it would be stopped from "falling" each frame without sliding.
- Create bounces to be calculated next frame and forward the time. DOWNSIDE: if your car rams into a wall at high speed it could possibly be stuck, the problem would manifest itself as an erratic bouncing. You can sometimes notice this problem when throwing grenades in various games for example.
- Stop the time when the first collision occurs, recalculate trajectories and do a new collision test to see when the next collision occurs. Do this over and over until you've reached the target time. DOWNSIDE: Every iteration of the collision tests has to be run several times for each frame. This will take ALOT of time and could cause bad stalls if you don't have plenty of CPU.
The last solution shown above could possibly be the one they selected for the game, that the problem occurs when all the cars collide is almost the type case for the problems. However the method works in a stable way and they probably couldn't get any tweaked way to work in a reliable way so this was the least horror.
I'm usually a sceptic when it comes to opensource on the desktop (afaik there is still a bug pending in the Xorg server that prevents it from using truecolor modes on my laptop that i reported a YEAR AGO! Xfree86 does has a fix tho).
on the bright side: 1: Microsoft said that they've beaten Novell before, but on the other hand Novell is hopefully now a far more competent competitor 2: Even tho they do sponsor a lot of opensource projects they are getting far more in return, thus they should be able to have the same amount of software bundled in the platform as Microsoft has for windows, and hopefully even cheaper! The opensource stack is actually quite powerful today with some sadly notable exceptions. 3: All the complaints about security problems are actually making people turn away nowadays, previous competitors didn't have this advantage. 4: People spend far more time on the web nowadays, and with firefox gaining popularity changing over should feel less frightening. 5: Novell isn't alone in the game, together with IBM,Sun,RH,etc they should be able to cover most ground when it comes to the interoperability game played by MS.
on the other hand... 1: A few years ago there was a huge backslash after Corel linux, "Prominent" companies announced ports of prominent software but alot went down the drain. (see mark ranums comments) 2: Brand recognition. Novell doesn't say much to john doe, i think that even Sun might be ahead when pushing their offering as "Java Desktop". you notice mentions of Java around most modern cellphones, this kinda gives them an unconcious brand recognition. 3: Market segmentation and interoperability between linux and linux (see ranum again). 4: Shaky brand. my only experience with Novell products was in 7th-12th grade(94-00) when the schools/city i grew up in was using it. what i remember was some obscure system that had invalidated an old password of a teacher of mine, i think we used the account to send some prank emails:) 5: WHY should people switch, ipod is a good reason for using macs apperantly but what does novell have to show for itself? 6: Microsoft...
the most important thing to consider here apart from those things is that the movement is made by an AI, thus travelling even a feet requires alot of analysis so it doesn't get stuck or fall down some slope. and because of all conditions surrounding this, i doubt they're using a computer that can be called fast by todays standards.
Now there'll be some crazy guy at a US Airbase launching an all out nuclear attack on the commies from Finland in retaliation to their communistic infiltration and poisoning of his harddrives.
what the previous poster means is that the VM could identify the actual cpu/generation. f.ex. pentium,pentiumMMX,ppro,pII,..,athlon,athlon64. i f you want to optimize code for all those you usually need to add MMX,SSE,etc for runtime checking,etc. maybe use different innerloops and so on.
a jit could be do the code generation differently on different cpus and free the programmers of doing runtime loading of loops or compiling multiple versions.
written by fabrice bellard(winner of 2 otcc contests). that madman did a working c compiler and a x86 emulator that brings wine to the mac in one year? (haven't tested it yet but it's released, altho the page is closed atm because of EU patent protests)
qemu/org.bellard.www , if you really need it. type it.
i totally agree, altho i had to learn that lesson myself the "hard" way:P.
back in 99 a while after i started using c/c++ i was on a 50 hours spree to get a "demo" done. (check www.scene.org for the definition of demo)
it all looked fine and i sent the stuff away, then when viewing the demo on the bigscreen for the actual competition they had to select a special graphics mode that made the bug visible.
it was just the typical if () blabla; moreblabla; that wasn't in curlys and that piece of code was a boundcheck... needless to say it was properly f*cked.
funny tho. nowadays my code almost looks like the IBM guidlines, and that's mostly due to my own taste:)
the only thing needed is a X byte header with a Nintendo(TM) logo in place. (or the code won't be run)
there's been lotsa discussions on this from day on in the GBA scene and most people refered back to the classic accoladeVSsega case. (or was it acclaim?).
bottom line was, sega's logochecking locked out competing products to be run and accolade was given a free waive to go on doing the games.
i think it's in the interoperability clause of some law. however i have no idea how recent (read dmca) laws has affected these rights or the fact that you'd be redistributing their logo without consent if you're to sell something. but i'm really unsure what weights heavier.
It's solid for normal serving of servlet stuff but that's about it sadly.
- Your "security record" comes from the fact that tomcat is written in a "safe" language, a security hole would have to come from some stupid manual hole, a JVM bug or the APR connector.
- The non-blocking extensions are non-standard, and much worse than that is that those extensions only works with the APR connector (IE NATIVE C CODE!) but are only experimental with the portable NIO connector (after alot of debugging my own code i finally found a blog post about NIO not working with tomcat async). So it means that you need to be compiling/installing the tomcat code for the target platform before deployment instead of just copying over the JAR's or something like that as you'd be expecting with a Java app.
- The internals are quite contrived, oh i'm sure there's a good reason and prolly has to do with the APR/NIO/"classic" multi-connector support but it made me drop the option of actually fixing the NIO support. (so the open source advantage goes out the door)
- Last i tried (autnum) the API for servlet 3 async was there in tomcat7 but it seems the implementation wasn't? gave me alot of headache and the APR only support for their propeitary async api finally broke most of my faith in tomcat as a future platform.
The most ironic part about all of this is that i decided to do a quick project with a "established" base system and not be hacking things up, but i'd say i rediscovered a truth. If you want to do something new with an established package you might just run into experimental features and/or features that would requie the entire system to be rearchitectured (both in the case of tomcat).
I've now taken a big leap to an "experimental" platform(Node.JS) and while not perfect at all it was built from day one for the kind of things i wanted to do. Oh and working with Javascript on a small project is an absolute pleasure compared to Java :)
No, there is one way to represent every number.
The mantissa doesn't state a "number", it is the decimal part of 1.xxxxx.
Say we have a 2 bit mantissa. The mantissa would thus describe the following numbers:
00 -> 1.00
01 -> 1.25
10 -> 1.5
11 -> 1.75
When we reach 2 we just increase the exponent instead, This gives the double representation a bigger range.
For very small numbers there is also a "subnormal" representation in the IEEE standard. This is when the exponent reaches the "smallest" possible value. At this point the mantissa bits represents numbers from "2" to "0" with the smallest exponent.
If i'm not off my hat right now this is why setting all the bits of a float or double will actually produce a 0, lowest exponent, -> subnormals = actual 0 and no sign(irrelevant in the case of floating point numbers though)
Could you give a reference on this? Partial register stalls on al->ax->eax writing is kinda obvious but this would only apply if you read after a partial write, doing a full register write would remove any partial stalls.
In an analogy to that the partial writing of a the flags shouldn't matter unless you depend on it from an immediate flag reading instruction like a conditional branch or treating flags like numbers (ie pushf,etc). Especially since a shift would likely to be followed by a compare the shifts flag state is irrelevant for the one who reads the flags as it has been overwritten.
It's somewhat ironic that the ARM chipset and architecture was first created by a computer manufacturer that flopped, only to see the cpu architecture that was the offspring actually be the only architecture to ever gain at the expense of the X86 architecture that probably was the culprit of destroying acorn computers.
And with this happening and even more focus being shifted onto the web as being the platform independent delivery platform, it won't be Intel flirting with Apple and Linux that got MS onto the fast path to obscurity. But the availability of a ever so cheap platform, powered by a ghost from the past.
For C/C++ eclipse isn't even in the same league as VS 6 (Edit-continue factors in HEAVILY in that :).
But i recently did a C# hack in VS(2005) and writing stuff in there felt very very crude compared to working with Java in eclipse, no refactoring and sync issues with the UI editor. Maybe 2008 fixed this.
Now consider all the other plugins available for Eclipse thanks to the plugin arch then i actually favour Eclipse for much work.
For somewhat travel and noisy environments (office,etc) i actually prefer a decent pair of rubber earbuds ("hard earbuds" just sucks) to most midlevel foamed headphones as they're far better at keeping out external sounds without breaking your eardrums.
I think the argument for this would be that since the shareholders did fire the board that made the deal the judge considers the act of signing the contract something done agains't the will of the owners/shareholders and has taken it upon himself to reverse this.
Think of it in another way, what if the CEO/Chairman of a listed company would transfer all the funds of that company into his own account. He did have authority to access the accounts, but the act itself would certainly be considered theft.
http://www.lasersquadnemesis.com/ is made by the guys who made x-com, and with additional stuff like online play available.
Because people would become confused and suspect foul play if you're directed to an unknown processor. (I personally do not know the names of any commercial processors on the net. but it's not my bank).
There's 2 other options.
1: Using links directly to your bank, where you could log in. This is actually used by my personal bank but i find it very scary. (Because by using devious tricks of javascript and co i could be entering login info to my bank account that somebody could steal. Not good.
2: Temporary internet creditcards. This way i log into my bank (from another browser or even computer maybe) and create a new card and authenticate it for ONE purchase. So anyone trying to do a new transaction will be refused because it simply ain't allowed. If i want to make another purchase. I just add another purchase to the list.
The GameCube has hardware texture compression, the PS2 does not. It's difficult to imagine that would be any trouble.
1: The ps2 has 32 megs (31 megs excluding kernel) vs 24 for the GC. and 30% matters alot.
2: We actually had hell to port a DC(that had texture compression) game to the ps2 (headhunter), but for that title it wasn't the texture compression that was the biggest problem. it was that artists had tuned the 3d scenery for the DC that had hardware alpha-sorting.
There is(was?) no official built in texturecompression on the ps2. But the greatness of the ps2 lies in it being raw and tad fucked up, in reality you can actually do texture compression on the ps2!
I have a R100 i bought in the spring of 04. Apart from changing the motherboard because of the faulty built in memory (that i got replaced for free), it's the same machine as when i bought it. The harddrive is fine and i've used this computer about roughly 8 hours a day on average (counting a bit less time on weekdays and much more time on weekends). But i have heard complaints about Toshibas sometimes, the R100 is quite a premium machine (the second most expensive machine when i bought it) so i guess it has a higher quality than the Satellite machines that costs a 1/3rd of the price.
Yes, thanks Google for standing up for us all. All Google had to do was refuse to give their money to someone else. Let's think this situation through before applauding Google's altruistic nature.
Right, so you'd prefer to see the internet transformed into TV 2.0 where the ISP's are the ones who decides what you should be able to watch and listen instead of f.ex. the record companies.
The internet is beautiful because every little joe can create his personal website, publish his obscure music, sell his special goods and most importantly speak without being censored.
true, but i bought my psp last weekend and it came with a 1.52 firmware + 2.0 upgrade disc. considering lead-times,etc i think that most psps over the holiday season will still be 2.0. 2.01 and higher firmwares will prolly not be in retail machines until next year (altho some batches for the holidays might be have it aswell).
i'm pretty sure that this exact article was linked a little while ago.
1: If used properly, yes. ever heard of NURBS ? it's there in basically all modelling packages. The problem of modelling with nurbs is that you can feel a slight loss of control until you master them, and when going to really highpoly meshes you don't wanna be flipping tri-edges to get nice shading.
2: True, i think that MotoGP or some other motorcycle game on the PS2 actually did the same thing (tesselating smooth curves for meshes in realtime) by using the VU chip, maybe somebody could look at that and try to get the patent invalidated? depends ofcos on if you want to classify the VU chip as "hardware".
It's the physics engine. Multiple collisions is a really hard problem for a physics engine to solve.
There are different ways of approaching this.
- Check your collisions once a frame and bounce or something when you collide.
DOWNSIDE: If you have a car running at really high speed you could actually run through a wall or another car, totally unacceptable.
So you have to do a time-sweep. In other words trace the entire movement of the object from time when the movement started until the end, ie do the calculation between 2 consecutive frames.
Now all collisions are detected, but how do you handle the collision?
- Stop the object at location it had in the previous frame.
DOWNSIDE: if you are chasing another car and bump into the rear your car would loose all speed. totally unacceptable in a racing game but could work in a platform game. Another illustration is a box sliding down a slope, it would never get down the slope because it would be stopped from "falling" each frame without sliding.
- Create bounces to be calculated next frame and forward the time.
DOWNSIDE: if your car rams into a wall at high speed it could possibly be stuck, the problem would manifest itself as an erratic bouncing. You can sometimes notice this problem when throwing grenades in various games for example.
- Stop the time when the first collision occurs, recalculate trajectories and do a new collision test to see when the next collision occurs. Do this over and over until you've reached the target time.
DOWNSIDE: Every iteration of the collision tests has to be run several times for each frame. This will take ALOT of time and could cause bad stalls if you don't have plenty of CPU.
The last solution shown above could possibly be the one they selected for the game, that the problem occurs when all the cars collide is almost the type case for the problems. However the method works in a stable way and they probably couldn't get any tweaked way to work in a reliable way so this was the least horror.
/ Jonas Lund
I'm usually a sceptic when it comes to opensource on the desktop (afaik there is still a bug pending in the Xorg server that prevents it from using truecolor modes on my laptop that i reported a YEAR AGO! Xfree86 does has a fix tho).
:)
on the bright side:
1: Microsoft said that they've beaten Novell before, but on the other hand Novell is hopefully now a far more competent competitor
2: Even tho they do sponsor a lot of opensource projects they are getting far more in return, thus they should be able to have the same amount of software bundled in the platform as Microsoft has for windows, and hopefully even cheaper! The opensource stack is actually quite powerful today with some sadly notable exceptions.
3: All the complaints about security problems are actually making people turn away nowadays, previous competitors didn't have this advantage.
4: People spend far more time on the web nowadays, and with firefox gaining popularity changing over should feel less frightening.
5: Novell isn't alone in the game, together with IBM,Sun,RH,etc they should be able to cover most ground when it comes to the interoperability game played by MS.
on the other hand...
1: A few years ago there was a huge backslash after Corel linux, "Prominent" companies announced ports of prominent software but alot went down the drain. (see mark ranums comments)
2: Brand recognition. Novell doesn't say much to john doe, i think that even Sun might be ahead when pushing their offering as "Java Desktop". you notice mentions of Java around most modern cellphones, this kinda gives them an unconcious brand recognition.
3: Market segmentation and interoperability between linux and linux (see ranum again).
4: Shaky brand. my only experience with Novell products was in 7th-12th grade(94-00) when the schools/city i grew up in was using it. what i remember was some obscure system that had invalidated an old password of a teacher of mine, i think we used the account to send some prank emails
5: WHY should people switch, ipod is a good reason for using macs apperantly but what does novell have to show for itself?
6: Microsoft...
/ Jonas Lund
i was reading through his articles yesterday after seeing the article posted on slashdot yesterday.d itorials/outsource_baghdad/index.html
and one of them was touching this subject: http://www.ranum.com/security/homeland_security/e
the most important thing to consider here apart from those things is that the movement is made by an AI,
thus travelling even a feet requires alot of analysis so it doesn't get stuck or fall down some slope.
and because of all conditions surrounding this, i doubt they're using a computer that can be called fast by todays standards.
Now there'll be some crazy guy at a US Airbase launching an all out nuclear attack on the commies from Finland in retaliation to their communistic infiltration and poisoning of his harddrives.
what the previous poster means is that the VM could identify the actual cpu/generation. f.ex. pentium,pentiumMMX,ppro,pII,..,athlon,athlon64.
i f you want to optimize code for all those you usually need to add MMX,SSE,etc for runtime checking,etc. maybe use different innerloops and so on.
a jit could be do the code generation differently on different cpus and free the programmers of doing runtime loading of loops or compiling multiple versions.
/ Jonas Lund
written by fabrice bellard(winner of 2 otcc contests).
that madman did a working c compiler and a x86 emulator that brings wine to the mac in one year?
(haven't tested it yet but it's released, altho the page is closed atm because of EU patent protests)
qemu/org.bellard.www , if you really need it. type it.
i totally agree, altho i had to learn that lesson myself the "hard" way :P.
:)
back in 99 a while after i started using c/c++ i was on a 50 hours spree to get a "demo" done. (check www.scene.org for the definition of demo)
it all looked fine and i sent the stuff away, then when viewing the demo on the bigscreen for the actual competition they had to select a special graphics mode that made the bug visible.
it was just the typical if () blabla; moreblabla; that wasn't in curlys and that piece of code was a boundcheck... needless to say it was properly f*cked.
funny tho. nowadays my code almost looks like the IBM guidlines, and that's mostly due to my own taste
/ Jonas Lund
the only thing needed is a X byte header with a Nintendo(TM) logo in place. (or the code won't be run)
there's been lotsa discussions on this from day on in the GBA scene and most people refered back to the classic accoladeVSsega case. (or was it acclaim?).
bottom line was, sega's logochecking locked out competing products to be run and accolade was given a free waive to go on doing the games.
i think it's in the interoperability clause of some law. however i have no idea how recent (read dmca) laws has affected these rights or the fact that you'd be redistributing their logo without consent if you're to sell something. but i'm really unsure what weights heavier.
how did that "cheap" tablet work?
/ Jonas Lund