Hiển thị các bài đăng có nhãn English. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn English. Hiển thị tất cả bài đăng

4/11/11

Implement pan/zoom feature with multi-touches screen (Part 2)


In last post, we already know how to make a proper zoom internally with OpenGL. This post will help you build a natural zooming on multi touches screen.
We will first, define how zooming gesture works with some UI tests, based on that we generalize a Mathematical problem, solve it, then go to some implementation note

If you are not interested in pan/zoom, you may find some useful info about Multitouches UI Tests, and tips for handling UITouch objects.

UI Tests
Put your fingers in Maps application, then feel the map's movement when you move your fingers. It's really intuitive and natural. You can enlarge then make it small, then large again as many times as you can, you can move the map up, move it down easily with your finger.

So, how to brief this cool feeling in detail?
A natural pan/zoom function like Maps app should pass these UI tests:

Let's say we put 2 fingers on screen at A and B, we move our finger to new points on screen A' and B'. Maps application zoom/pan have these properties:
1. Zoomed with appropriate scale with respect to how opened your finger is
The image is enlarged with a scale A'B'/AB
2. In Maps, if you put your first finger on location A, another finger on location B, after preforming pan/zoom, both locations are still right under your finger, no matter how many time you zoom out, then in.
2 point O and X are still under 2 fingers after zooming
3. Hold a finger on screen, move another, the map's zoomed, 2 marks is still under your finger.
4. If 2 fingers touch the screen at different timestamp, you still can zoom.
5. Pan and zoom at the same time
6. Twist 2 finger around to form a circle, the map is not panned or zoomed
2 point O and X are still in the same place

A simple conclusion: a natural zooming will keep 2 marks stay under your fingers in most cases


Now, pan/zoom seems more clear, but how to put these tests into code. We generalize the previous conclusion into Maths:
Equivalent Mathematical problem for pan/zoom feature.

On a plan, given 2 pair of points A, B and A', B'. How to use transformations (translation, resizing, rotation) to move A to A' and B to B'?
Try to solve this yourself, or you can continue with a simple, step by step solution below:

- First. move A to A' by using a Translation with vector AA', B is also moved to B1
- Second, move B1 to B2 by using a resize with origin in A', scale A'B2/A'B1
- Finally, use a Rotation with origin A', angle (A'B2, A'B') to make vector A'B2 to same direction with A'B', B2 is moved to B'

Next step, we go to implement all of these. To do this, we need to understand how touch data is transferred from your fingers and iPhone screen into your code.


Tips for handling UITouch
1. What is UITouch object?
This except from Apple iOS Event Guideline is extremely useful:
In iPhone OS, a UITouch object represents a touch, and a UIEvent object represents an event. An event object contains all touch objects for the current multi-touch sequence and can provide touch objects specific to a view or window (see Figure 3-2). A touch object is persistent for a given finger during a sequence, and UIKit mutates it as it tracks the finger throughout it. The touch attributes that change are the phase of the touch, its location in a view, its previous location, and its timestamp. Event-handling code evaluates these attributes to determine how to respond to the event. (more discussion)
2. How UITouch objects sent through touchesBegan, touchesMoved, touchesEnded, touchesCanceled?

Sequence of passing objects during a series of events
UITouchtouchBegantouchMovedtouchEndedtouchCanceled
Put 1 finger on screenA
Move 1A
Put another fingerB
Move 2 fingersA,B
Move 2nd fingerB
Put 1st finger out of screenA

1. Number of touches depends on event, so it is not represent how many touches are on screen
2. An UITouch object represent for a finger on screen, its data is mutable and will changed went the finger moved. You can not retain UITouch objects, thus cannot use an NSArray or NSDictionary to store touches data.
3. Number of touches go throughout touchesBegan is equal to number of touches go through touchesEnded + touchesCanceled

Pan/zoom implementation tips
- To handle how many touches are on screen, we need to remember the UITouch objects' pointers, we can use a C array of UITouch to store, and use a pointer comparison if we want to check for a pointer

Now you have all information needed for an implementation. In each UITouch delegates of your UIView, do these task:
Touches Began
  • Remember UITouch objects by saving it into array
Touches Moved
  • Check touches array
  • If there has 1 finger on screen, preform a pan
  • If there have more than or equal to 2 fingers on screen, use our transformations to make a zoom
A = [touch1 previousLocationInView:self];
A' = [touch1 locationInView:self];
B = [touch2 previousLocationInView:self];
B' = [touch2 locationInView:self];

+ Translation with vector AA': AA' = (x_A' - x_A, y_A' - y_A)
Calculate B1

+ Resize at origin A', scale k = A'B'/AB, use the function we build in previous post
- (void)zoomAtPoint:(CGPoint)point scale:(CGFloat)scale;
Calculate B2

+ Rotation:
At this point we want to make rotation to bring B2 to B'. In real, we can not rotate the maps, so we will do a simple trick to bring B2 nearer to B': we perform a pan with vector B2B'/2

Touches Ended/Touches Canceled
Remove touches out of touches array

That's it! Feel free for clarification and discussion :)

2/10/11

I left my job, why and what next?


A blog about what's going on with myself…

It was a new month in Saigon, I no longer work for a company, and also not looking for any to join.
My last company is a nice place to work, with a really good salary, why did I leave?


Well, telling about my personal-why is not so natural, but this is a good point to start. For the most important reason, it's all about love. I want to do what I love the most. There had some occasions in my life which gave me a strong belief in myself that: if I love to do one thing bad enough and spend all of my time for it, then I will do it damn well.

So what I'm passionate about? First of all, I love to build things. Well, building a great product can bring you a lot of $$$, fame, blah blah, but the most reward for me is that I'm working on what I'm really passionate about, be burned by youthful energy and desire, and bring useful products as paying back to society.

I also love to learn. About "everything"! I want to deepen my knowledge about programming and also everything related to making product, selling product. I want to feel the root of software development: understand customers' problems and what imparts customers' decision to buy a product? These are things I'm not know well right now.

I'm seeking to widen my knowledge about things related to my life. Especially after bad thing happened with my family, I know that I really need to fill up the hole on my knowledge about sociality and mentality. I want to understand more about others, and know more about myself.

I want to find the reason for everything, just like I want to find the meaning of my life.

So, I'm doing work for my own, my products with some friends, and spend most of my time to learn, get direction for my next step. Sound good, however, refusing a job means getting a lot of foolish.

No job means having no one, nothing to rely on. I no longer have a simple day, wake up, feeling okay, try to work well, and waiting for "a happy $$$" end of each month. I even have no laptop, no devices to work with, have no workspace (damn, I love the Air Conditioner so much!). Everything's now on my own, I have to find a way to survive myself.

No job means living on my own saving in the bank, currently I have no income. This is expected result for what I have chosen, but on a not-so-far day, this will become a burdening on my life. What if a day, I have no more money for myself, for what I'm passionate about. I now, need to care more about how I use money. It's just not being thrifty, it is being balance between my needs and economy, what should I spend on, what should not?

Now, with no job, I'm working alone most of the time. Well, being alone is one of the worst thing. One side, that is social impart: people often say, talented people will attract other being with himself, so being alone means you are not good? Well, not really, but on a bad day, this can make you feel like a shame! I can seek for some friends to form a working group, but I really don't want to do like that when I still not define my own road, my vision.

On another side, alone means you have to struggle with your bad side. Like other normal guy, I have quite a lot of weaknesses. That is being lazily, being slowly when working, and procrastinating on unfamiliar decision, and being self-satisfied with WTH I'm doing, being free to do random, unnecessary tasks when there have no outer pushing force… Well, I experienced all of these in recent days.
So can I move forward when there has no one pushing me on my back? Or I just end up with self-satisfaction and wasting my current valuable youthful life? Well, I have to learn to manage myself, learn to set goals. I myself need to push me forward. To be very honest, I'm really lazy on this. Please remind me, ask me my progress, if you can help.

And the most important thing, I have no idea what should go next? No clear direction, no vision, no plan for my next 5 years: What do I want to be? How do it look like? How do I achieve it? A lucky things is that, I know clearly that finding a reasonable answers for these questions is my ultimate goal for next few months.

Seem that I have a lot of things to learn, now I'm dealing with the disadvantage of too-much learning: being unrealistic guy! I really don't want to waste my time and only know thing in theory. My friends are out there, working endlessly for new achievement. I'm here, learn!

You may ask me that, why don't you focus to learn more, read more now, but going to your blog and blah blah. Well, I write this post, honestly because I need help! I need to be pushed. I write my life transparently as a commitment that I will try my best to overcome this situation. I need reality check, blogging is a good checking and getting feedback from friends.

Be bold, or be careless?


Well, I'm taking a big risk for my own life, what I get after all maybe delusion or being disappointed. I hope I will have full of self-awareness to avoid the worst and choose the best for my daily and future.

Falling in love, being passionate, being self-aware, being visionary, being bold.
A new journey.
Stay hungry, stay foolish!


19/9/11

Implement pan/zoom feature with multi-touches screen (Part 1)


(Image source: top9tip.com)

When Apple rolled out it multi-touches device -  the iPhone, they also defined some useful, intuitive gestures for a certain purposes like pinch to zoom, pan to moving around in many of apps like Photos, Maps. These gestures become industry standard for their tasks and even used more and more in other apps like pinch to open/close an article in Flipboard..., pan/zoom in drawing app and game like Happy Farm...
This post will give you some ideas on how to implement your own pan/zoom.


Platform: iOS - OpenGL
OpenGL pre-configuration: Draw an off-screen texture to an onscreen frame buffer EAGLView

Texture ------> onscreen FBO ---> render buffer -> context
We can understand the task easier and get it done by simplifying it into smaller steps:

Step 1: Implement simple and acceptable Zoom/Pan function


Goal
A simple pan/zoom function, you can zoom & pan to any point of the drawing.

Technical

We define a pan by using a vector, and a zoom by a scale number. Let’s store these values in a struct:
typedef struct {
GLfloat x;
GLfloat y;
  GLfloat zoom;
} Transforms;
// Where (x, y) is panning vector, and zoom is zooming scale level.
OpenGL
You can change make our draw bigger with glScalef, and move it by a vector with glTranslatef:.
We need to modify the params of glTranslatef and glScalef when drawing view:
glTranslatef(transforms.x/screenWidth, - transforms.y/screenHeight, 0);  
glScalef(transforms.zoom, transforms.zoom, 1.0);
Multitouches
To glue these internal settings with multitouches gesture:
- In your touchesMoved:withEvent: methods, check if event touches included 1 or 2 touches
For pan: Apply for event with 1 touch (which moved from point A to point A_ in screen), get pan's vector by:
touch1 = [[touches allObjects] objectAtIndex:0];
A = [touch1 previousLocationInView:self];
A_ = [touch1 locationInView:self];
(transform.x, transform.y) = panning vector = vector AA_
For zoom: Apply for event with 2 touches
Similarly, calculating locations for touch2: B & B_
transforms.zoom = zooming scale = A_B_ / AB
Result
Now you have a good enough pan/zoom, you can zoom and go to any point of the drawing.

You also may notice that depend your OpenGL configuration (in iOS or MacOSX) then your view will be always zoomed at center or lower left corner.  A point at a corner after being zoomed will be moved out of the screen.

To make the drawing zoom at a corner:

We first make a zoom at center of screen.
Then drag/perform pan drawing to the corner.

Step 2: Make it better - Implement zooming at any point on drawing


Goal
Open Maps app, when you double click at any point, the map will be zoomed right at that point, even if that point is in a corner How to make a zooming like that?

We are going to build zooming function at a point:
- (void)zoomAtPoint:(CGPoint)point scale:(CGFloat)scale;
This method will modify transform setting appropriately when program receive zoom gestures
A simple thought to solve this is to utilize code in step 1, and add an appropriate pan right after a zoom.

Technical
Remember we have an off-screen texture, then we draw it on an on-screen frame buffer, again this buffer will be rendered to the view. This means we have 3 layers which affect how a drawing is displayed.

In which layer will zooming (the drawing is double in size) actually happen?
In Step 1, we know that transforms.zoom is used for glScalef, and this function will take effect when texture is drawn into onscreen frame buffer. In this process, zooming effect is actually happened


So, why do last time we always zoom on center of the screen?
That is happened when the double drawing is rendered into the view, OpenGLES 3D coordinate system has origin at the center of the screen (while in Mac OSX, this origin is in lower left corner of the screen)

Thus, after we double click on a point in screen, that point is not displayed under our finger in screen anymore, but is moved farther the center of the screen

We need to pan that point from Ao to A (vector AoA), but how to know the coordinate of Ao?
To do this, we need to go deeper into 3 layers of displaying. Let’s name some points:
A_w, Ao_w: coordination of A and Ao in view layer (which is also A and Ao)
A_d, Ao_d: actually coordination of A and Ao in the draw, without any affect display of zoomed/panned drawing
A_t, Ao_t: coordination of A and Ao in the texture, zoom double affect will be performed on A_t point

Follow this sequence of transformation to know coordination of Ao
A_w
--transform/remove pan-zoom effect--> A_d
--transform/convertToGL--> A_t  
--zoom at center--> Ao_t
--transform/convert GL to view--> Ao_d
--apply pan-zoom affect--> Ao_w

Create function for each steps, take into account the difference between coordinate of each layers:
View: origin at lower - left corner
On-screen buffer: origin at center
Texture: origin at top - left corner

This is one of a tough part of implementation, it requires a little knowledge about mathematic and coordinate transform. Try to have unit test and make sure each task done correctly before jump into next task. Below is instruction for first transforms: remove pan-zoom effect

//I. Remove panning
    x -= transforms.x;
    y -= transforms.y;
/*II. Remove zooming
  1. Move from bottom-left to center
    2. scale with current zoom (not new zoom caused by double click)
    3. move from center back to bottom-left */
   x = (x - screenWidth/2)/transforms.zoom + screenWidth/2;
   y = (y - screenHeight/2)/transforms.zoom + screenHeight/2;

You can find the idea for the second here: convertToGL, the forth and fifth is the opposite transform of the first and second one.
When you get all point converting done correct, perform a pan with vector AoA will bring Ao back to under your finger. Eureka!

Step 3: Make it feel cool like Maps app - Integrate multi-touches gestures: pinch to zoom
(to be continued)

26/5/11

My everyday has 3 mornings

I'm lying to myself, hic :(

Morning is always my coolest moment, I feel sound, eager to get thing done. Great!
And along the day, I'm a little down after noon, and sometime being badly productive in the evening.
To improve the situation, I'm addicted to taking a 10-20 minutes nap at noon. This short nap effectively helps me regain my attentive and feeling better in the afternoon. In my previous working place, my friends and I often said "Good morning!" after a nap. Fun!

Something change in these days...

I start to take a second nap in the evening. After getting back from working office, I have dinner, a bath, then take a short sleep, think about good things for "next morning". This is my third morning in the day, I keep telling myself that "hey man, this is morning, I have to do good". Feeling cool, again :)

I want to share this feeling, and hope that I can keep lying to myself like this for long...

More reading:
US work environment trying to catch up to VN's http://j.mp/kgXZ0R via @huyzing

9/5/11

Thought on a hackathon

Last weekend turned to be very exciting to me as a mentor in Hackathon.
Working with young and passion students always bring you a lot of fun and interesting.
Despite of their fast learning, creativity and enthusiasm, many teams make mistakes during the contest. I wrote down all of these as tips for contestants in next Hackathons.

Research a little bit more when brainstorming and choosing idea.
In hackathon, creativity is always emphasized. You need to think about an interesting idea that can convince your judges. When you have an idea, although it is interesting to you, but it may not be novel. Your judge definitely know a lot of apps and idea which are already in App Store.
That's why, to convince them and others, you need to have some research about your idea, find out if there have apps that do similar, if yes, find out what make your app unique from others.
During the beginning of competition, many teams hadn't thought about these question, until we judged their idea.
For example, a team want to build a calendar app (both server and client side) in Android, without taking enough looking at Android's built-in Calendar app. If they said that they want to integrate Maps to your app, I hope that they can play with built-in app a little bit more, they will see that feature also.
So, it is quite hard for their apps to be ranked high about creativity.
Take a look at other apps also bring you more interesting feature for your app.

Think big, but focus to your unique feature first.
When having an idea, you can brainstorm whatever your app can do, so that you can get a list of features your app may have.
You can also use this features list to show the potential of your app in front of judges.
However, when starting to code on your app, ideally you should narrow this features list down to only ONE feature.
Ask yourself, what is your app's purpose? Is removing this feature out of your app, make it totally different?
Is this the simplest feature that is appropriate with your app's purpose?
Choosing this feature help you know where you should put your hand to code.

Many teams spend time on many planned features,or start to work on supporting view first (splash screen, menu, list view, info...)
Forget all of these supporting features, implement your main view with core feature first
Doing this will really help when you run out of time before implementing all planned features, because, at least, your main feature is ready for demo.

Start to code on your main feature immediately, then iterate, iterate...
You can always start small, if your main feature is helping user to track their money spending easily by recording amount of money, product's photo, location...
You might think to spend time to solve technical problems like photo capture module, then get location (with PhoneGap framework) first.
However, you can build a financial tracking app, by just display an input box, for users enter there money, then save it to database. That's all you need to start immediately.
So, if your main feature is too big, simplify or narrow it down.
If you view is not simple, choose to implement an important & simple part
If you have a lot of technical problems, spend time to solve necessary one.
The key is that, you can start to code at your first minute, have something to show and build your confidence over time.

Despite all of these limitation, all contestants finished their competition with great results.
All of them are young and really really passion with their apps. Passion is definitely the source of their energy for all days coding, not from bread, instant noodle with small amount of beef. With 2 days continuously coding, they are "sleepless monsters" also :) Another surprising is most of contestants, like second prize team, knew about their platform only a few days before the contest. They learned really, really fast.

Hope all of participations have experienced a lot of new things in this great event!

PS: check out their photos here: http://www.facebook.com/apcshackathon?sk=photos




16/10/10

Being persistent

Sound common, right? Although some people refuse to engage in one thing for a long period of time, most people regard persistence as the principle for success. After all, our goal is getting things done despite of difficulties, and this characteristic helps us to do that.

I want to write about this right after posting the first blog about my GRE lessons because this is my second important lesson that l learnt. However, I procrastinated it, I want to make a plan for my next English test, I mentioned about planning in my first lesson, before going on posting another lesson; and also because of my laziness of writing :P

Okie, so what I want to say about this topic. First, I want to tell about some of my failures when learning GRE vocabulary. Failure, again, haha, I love to bite again and again my weakness, that is how I learn.

I started to learn GRE vocabulary 8 months ago, began to beat 3200 Barron flashcards with friends. We had a goal to learn 40 words per day, 40*6 words per week, a big review in each weekend and a great, want-to-die review in each month. I learn words so slow, fortunately, learning in a self-study group with money fine for each forgot words helps me a lot, it pushed me keep going forward. I still remember that I was considered as the sponsor of the group due to the fine I paid :D After there months, we finished learning of Barron word lists for the first time. I estimated that I could remember half of the words, about 1500, and I need time to review the others. Badly, again badly (bad for my GRE), I got a long lasting eye injury later, a vacation to home town, and involved in some emotional stuffs, and then I delayed my reviewing. Saying that “Language, if you don’t use it, you lose it” is absolutely right. When I came back for learning vocabulary in July, I lost my sense of almost the 1500 words I learnt!!!!

So, keeping going forward, hold on to your plan, even if you just can go a little bit forward, it’s a lot better than standing at a place. Stamping at a place means going backward, because the whole worlds are moving forward. Doing nothing, or indulging your distractions, or giving up is even worse than staying at a place, because that means you may even lose what you possess currently or have built previously.

That is my first lesson about persistence. Keeping learning enough numbers of words or amount of works every day is my second experience. Let say I follow a plan of learn 40 words per day. And then in a bad day, bad days certainly happen in our lives; I cannot learn enough words, say 20 in 40 words, “save” 20 to the next day. Hopelessly, I only work though 20 words in the next day. That brings me a burdening goal, 80 words per day, in the following day. As a result, I will never complete my task on time. This kind of procrastination is just like a Domino chain - a falling at one domino destroys the rest of the chain.

When practicing, being patient of improving my skills, and not being depressed with the up/down or unexpected scores is my third lesson with persistence. Another experience about persistence is that people, in their good mood, said that they will write a blog each day, and somewhat so was I, but then only keep that plan in several weeks or even several days. That’s hard to follow that plan, even harder than keeping “spending 15 minutes every day for learning and improving oneself English”. Have you ever heard or tried that advice? Persistence related problems are still discussed time to time: How to keep the routine of learning even when being successful or old? How to keep enthusiasm in doing research? Or why many coders switch to learn business stuffs after only a few years working? blah, blah... That means you and I will still have to deal with this kind of problem more and more. That’s why, being aware of how persistent we are and how to persevere with our planning, in my opinion, is very essential for our life.

"If I had to select one quality, one personal characteristic that I regard as being most highly correlated with success, whatever the field, I would pick the trait of persistence." - Richard DeVos, Amway Co-founder

How to be persistent? I give some tips here, based on my experience and opinion; I hope you will add more:
  • Have a suitable plan. Say, you want to learn 40 words a day, if it’s hard for you (time, ability, …) to accomplish it, then start with a smaller goal 20 words a day, then later increase the number of words when your brain uses to learning words. If it’s hard to write a blog per day, start with a goal to write a blog per week.
  • Remove your distractions, your temptation to do more interesting things than what you have to do now. When you feel bore, think about the result you will have if you continue to accomplish your task, like the money you will have, the school you will enter, or a great vacation…
  • Keep in mind that you have to go on; think about bad things will happen if you give up.
  • Learn to balance, between work and life, doing interesting things and doing things that’s less interesting but necessary…
  • If you have to do a task everyday, the only way to accomplish it is really loving it and making it become your habit, daily routine (such as learning English, vocabulary via reading, speaking everyday…)
Now, on the other hand, I want to discuss about another issue of persistent: change, which is quite opposite of being persistent. Someone say that “Never Give Up” means N.G.U. (stupid in Vietnamese (: - sound funny, huh?) I heard about it at the first time in a seminar about start-up for tech geeks, the idea told that you should abandon a start-up idea if you still get a lot of difficulties after an amount of time, say 2 years; and start to pursuit another idea. I surprised! Perhaps, until that time I did hear a lot of stories about success which thanks to the trait of persistence.

Others said about “fail early, fail often” motto - the idea of learning from your failure: the more you fail, the more you learn and have potential to be successful; so the earlier, the more often you should fail. They also said that, when you have an idea: move fast, if you get obstacle, then turn or the best entrepreneurs know how to fail fast.

This new idea makes me think, why these successful guys want to fail fast? Why don’t they believe in themselves, their ideas and keep persistent working on it? Why they have to change or turn fast? I'm trying to explain for myself about this dilemma and make it logical for being persistent and changing.

The undefined factor
I think, in this situation, people talk about “change” or “turn” because they are facing the problem relating to finding new things. When you are trying new things, you don’t know what the definitive answer for your problem is. This way may work, may fail also. Thus, when you make error or get obstacle, you should turn and try another idea. Holding on with the old idea likely lead you to an ending deadlock! So, to fail fast, to avoid big failure; and to fail more, to learn more and have more chance to try new opportunities.

But if you have a definitive plan, you know what the award is if you hold on, you should overcome every distractions or temptations to stop. I know there are a lot of obstacles in life but be persistent, no excuses. Reality, there will have undefined factors in your plan; such as you want to learn a subject, however your study method have problems, so “fail early, fail often” with methodology – the undefined factor, but again, keep being consistent the whole goal. Achieve it!

26/9/10

GRE and my lessons - Timing skill

It’s a week since my GRE test. But I still have a clear image about the test. That was a challenge in my life. I tried to get the highest result as I can. However, the score was not as good as I expected. It made me down, harmed my confidence badly. I need to do something to raise me up. One of them was having a look into my mistakes and weaknesses. This post is for that purpose. There is another reason for me to write is that I had learn some valuable lessons when cramming the GRE and it can help me further my learning and also can apply in my life.
The biggest lesson that I learnt is that I need a better time management skill. ETS says that this is the key for getting good score in GRE. To me, this skill is important for both cramming and test taking.


Time management
Most of the time spent for preparing for GRE is used for learning vocabulary, and most of the student will soonly recognize that learning GRE vocabulary is such a boring job. It’s tedious not just because it seem overwhelming to learn Barron’s 3500 words lists, but also due to the low effect of remembering words. Many time, you have to learn the whole word list just as a brand new one, although the fact is that you did spent a lot of time learning it last week. Many GRE test-taker share with each other a special timetable which is implemented spaced rehearsal technique. This is a good new for me to learn vocabulary in least time while still remember the almost the words. How to make this timetable? You can get the idea by reading this(vietphd.org) and this(smart.fm). It’s better to have your own version of timetable which is suitable for your time and how many words you can learn each day.

I also found that having plan is very helpful to keep track of where I’m in a long road of achieving sth. As I said, learning GRE vocabulary is tedious job. Although I always try to make it fun and amusing, and also the fact that I learn different wordlists everyday, it doesn't help me stop asking myself why I keep doing this borring job. Without a timetable it’s very hard for me to know where I am in the road? - because everyday I do the same things again and again, what should I do next? - there always had the temptation to stop or be distracted by other more interesting thing. Actually, this problem also happen in my life. Many time, I feel exhausted with working and doing other things, and lose my ability to be aware of what is my goal and decide what I should do next, then I just keep wasting my time at the end of day until time for sleeping. This is so bad and even worse while I know that having clear plans for what I will do in next year, quarter, month, week are very useful, but I always have excuses to refuse to do that. This time, I will try to accomplish this must-do task.

Timing skill in testing
Timing skill in taking GRE test is even more important. In GRE test, with in 30 minutes, your job is answering 30 verbal questions which are classified in 4 types. Each type of question needs different amount of time for being answered. Thus, you need to distribute your time in each question wisely to get a good score. GRE CAT rule, which basically says that the first 10 questions are weighted more than the latter, thus, are more important to your score, makes this skill even more difficult. That means, in first 10-15 questions, althought you meet easy questions, you have to slow yourself down to make sure that all your answers for these questions are correct! I was very aware of this and did well, but got problems on the second part of the test, when I had to rush answering other questions. This is because the second part is where I got a lot of reading question, my biggest weakness.

Do thing fast
To be honest, before GRE, I read English text with an extremely slow speed. It used to take me about 10 minutes to read a GRE long paragraph with 60-80 lines. When cramming, I try to use as many techniques as I can learn to push myself read faster while still get the structure of the passage, such as noticing to connection words (but, then…), finding the keywords, trying to anticipate the author purpose…, and most important, being very very concentrated. In general, my reading speed is improved, however, I got into a traditional dilemma: the faster I read, the less I understand the passage. In about 2,5 – 3 minutes, sometime I can get topic, structure and purpose of the 60-line-passage, where some specific details is mentioned, while, many time I can not. This skill, I know, needs time and a lot of practice to be improved. Badly, I don’t have much time for practicing before the test. It killed my GRE scrore ;( I was also slow in Sentence Completion part, while many other guys in TestMagic can do each question in 20-30 seconds, I finished it only after 50-70 seconds.
Being slowly is my weakness, it’s important for me to recognize that. Therefore, in the next few months, instead of spending time to gain new skills, I will mainly focus on learning and doing thing faster.

These timing skills seem obvious in life. Badly, I keep refusing to realize it value and didn't focus to build them until I suffered by my weakness. A valuable lesson that I don't want to be taught twice.

24/7/09

Vài mẹo học từ vựng với Vocaboly

"Bạn đang học tiếng Anh và bạn đang tìm một chương trình hỗ trợ mình học từ vựng tốt hơn. Hay là bạn đang gấp rút chuẩn bị thi TOEFL, hay GRE và bạn cần đảm bảo học thêm 40-50 từ/ ngày, hay thậm chí cả trăm từ mỗi ngày... Này, nếu vậy thì hãy đến với Vocaboly..."
Ặc ặc, marketing dữ quá, he he, cẩn thận đừng tin nha: "học cả trăm từ..." - mấy điều đó chỉ có trong trí tưởng tượng của mình thui. Nhưng có 1 sự thật là Vocaboly sẽ hỗ trợ bạn học từ vựng tốt hơn đó ^ ^ thử xem nhé
Download phần mềm tại đây: softvnn
Phần mềm có bao gồm các cuốn sách từ cho VOA Speacial English, TOEFL, GRE...
Sẽ giúp bạn có vốn từ vựng cần thiết cho mỗi mục đích khác nhau. Trong đó VOA là dễ nhất, và mình cũng đang (chỉ) sài tới chỗ này :p
Phần mềm cung cấp khá nhiều cách học khác nhau, mỗi người sẽ hợp với 1 cách, ở đây mình xin chia sẻ phương pháp mình dùng phần mềm này.
+ Học theo group mỗi ngày, mỗi group khoảng 35 từ
+ Mình chỉ chọn 2 phương pháp học trong số các phương pháp của phần mềm
- Chọn Recall, lúc đó phần nghĩa của từ bị che lại. Trình tự học như sau: Ấn F2 để nghe từ, thử dùng kiến thức của mình để định nghĩa cho từ, ấn Enter để hiện nghĩa của từ, kiểm tra. Dùng phím mũi tên lên xuống để sang từ. Chú "í": nếu từ khó, bạn có thể ấn các số từ 1-5 để gán mức khó cho từ, sẽ rất tiện khi mình ôn lại, phân loại.
- Phần thứ hai là Game, mình thích chọn Starwar, với Game Mode là Spelling (hợp với sở thích typing của mình). Lúc đó nghĩa của từ sẽ hiện ra theo kiểu game Bắn trứng, nhiệm vụ của mình là tìm đúng từ gõ vào, càng nhanh càng tốt, không nhanh là chết chắc :p, rất thú vị đó.
---------
Đấy, học là như thế, cách học này có nhiều tác dụng nhé: này là Recall giúp mình hiểu ý nghĩa từ, dùng khi Reading và Listening. Còn Spelling giúp mình nhất là khi Writting hay Speaking, lúc đó biết ý và cần nặn ra 1 từ để diễn đạt. Ngoài ra còn giúp mình suy nghĩ lanh lẹ bằng tiếng Anh nữa (đấy, cái trò Starwar ấy, ai có bản lĩnh thì thử level Difficult hay Very Difficult đi, là biết ngay, mình thì chưa dám :p )
-------------------
Còn 1 mẹo cuối cùng nữa là cần cài 1 một giọng phát âm chuẩn hơn, vì Vocaboly sử dụng giọng của Windows nên hơi chuối (hoặc là... rất chuối ^^ ). Có vài giọng đọc rất chuẩn, bạn download tại đây (chỉ download 1 giọng cũng được, ko cần down hết)
Cài đặt, sau đó vào Vocaboly -> Config -> Speech Propertive chọn giọng mình vừa cài và... thưởng thức ^ ^
Chúc các bạn học tốt!