Friday, January 22, 2010

Google's programming language : GO

Every computer programmer has a copious pile of opinions about how their programming language of choice could be improved. Who doesn't want more syntactic sugar, better runtime performance, and faster compilation? That's one of the reasons why there are so many programming languages. Creating a compiler is practically a rite of passage for computer science students, and half of the top vendors in the software industry eventually make their own programming language or extend an existing one to the point where it's marginally recognizable.

Despite the large amount of enthusiasm for language design, modern mainstream programming languages don't fall far from the C tree. The best that Microsoft, Sun, and Apple have to offer are just variations on that theme, with the addition of predictable object models and conveniences like garbage collection. The slim minority of language geeks who have rebelled against bracist tyranny and stumbled over to innovative languages like Haskell and Erlang are doomed to toil in relative obscurity.

Are there any influential software vendors who have the vision and leverage to liberate the programming masses from the tiresome anachronisms of C's long legacy? When I learned that Google was going to announce a new programming language, I was hopeful that the search giant would bring something truly novel to the table. They haven't, but the result isn't bad. Although Google's new Go programming language is yet another take on object-oriented C, it's got some nice features.

Go offers an expressive type system, fast compilation, good performance, and built-in language features that simplify threaded programming and concurrency. The language has been under development for roughly two years. It started out as a 20 percent project—time that Google's engineers are given to use as they choose for undirected experimentation—and evolved into a serious full-time undertaking. Google is releasing the source code under the BSD license with the hope that a community will emerge around the new programming language and participate in the effort to make it a compelling choice for software development.

We discussed the new programming language with Google engineer Rob Pike. He says that the Go language itself and the current implementation are relatively mature, but it's not quite ready for adoption in production environments. The ecosystem around the programming language is still a work in progress. There is no IDE integration, the standard libraries are a bit thin, and there aren't a whole lot of real-world code examples yet. Opening up Go to the broader programming community could help to vastly accelerate its advancement in all of those critical areas.

The native Go compilers, called 6g and 8g (for 64-bit and x86), are designed to be extremely fast. There is also an alternative compiler called Gccgo that is based on the GNU Compiler Collection (GCC). The GCC-based compiler isn't as fast but is said to generate more efficient code. I was initially a bit surprised that Google chose not to use the Low-Level Virtual Machine (LLVM) compiler framework—it has a lot of LLVM expertise internally and is using it extensively for their awesome Python optimization effort. Pike says that LLVM was considered during the early stages of the Go project, but its compile-time performance was judged to be inadequate.

The compiled executables are completely native binaries, so it's not like a managed code language where the compiler generates bytecode for a virtual machine. Go does, however, have some runtime components that get embedded in the executables. Actual execution performance is said to be comparable to that of native C.

Some of Google's sample Go code reveals that the syntax is C-like and encourages a conventional imperative programming style. There are functions, "for" loops, standard conditional expressions, and many other features that you'd expect to find in a C-like language, but with a handful of nice twists. For example, there is a shorthand syntax for variable assignment that supports simple type inference. It also has anonymous function syntax that lets you use real closures. There are some Python-like features too, including array slices and a map type with constructor syntax that looks like Python's dictionary concept. The following code snippet is an example from Google's documentation:

view plaincopy to clipboardprint?
func sum(a []int) int{ // returns an int s := 0; fori := 0; i < len(a); i++ { s += a[i] } returns } s := sum(&[3]int{1,2,3}); // a slice of the array is passed to sum
func sum(a []int) int { // returns an int
s := 0;
for i := 0; i < len(a); i++ {
s += a[i]
}
return s
}

s := sum(&[3]int{1,2,3}); // a slice of the array is passed to sum
One of the distinguishing characteristics of Go is its unusual type system. It eschews some typical object-oriented programming concepts such as inheritance. You can define struct types and then create methods for operating on them. You can also define interfaces, much like you can in Java. In Go, however, you don't manually specify which interface a class implements. Pike explained to me that the interface mechanism gives developers some of the flexibility of duck-typing, but it goes further by providing the advantages of compile-time checking.

Parallelism is emphasized in Go's design. The language introduces the concept of "goroutines" which are executed concurrently. Any function can be executed as a goroutine by prefixing the function call with the "go" keyword. The language provides a "channel" mechanism that can be used to safely pass data in and out of goroutines.

Why create a new programming language from scratch? According to Pike, the developers behind the Go project felt that there was a need for a fresh start. It wasn't enough to just add features to existing programming languages, because sometimes you can get more in the long run by taking things away. They wanted to start from scratch and rethink everything. I'm all for a clean break, but the C-like syntax seems to run counter to that goal. He explained that Go is more radical than it looks, especially when you start to look closely at the power of its unusual type system. Pike and his colleagues didn't want to deviate too much from what developers already knew because they wanted to avoid alienating Go's target audience.

As a demonstration of the language, the developers have used it to build the Web server software that powers the project's official website. Aside from that, Go isn't used in production anywhere at Google yet. It's going to take time before it's ready for more expansive use, but Google hopes that it will eventually provide a good alternative to the C++ the company uses extensively. For more details, check out the project's


Link :
http://golang.org

Thanks note : Mr.Sandesh Gawali
R&D (PES-SASS Dev)

ADP Pvt. Ltd. Pune India

Monday, December 14, 2009

c-objectives

1) #define assert(cond) if(!(cond)) \

(fprintf(stderr, "assertion failed: %s, file %s, line %d \n",#cond,\

__FILE__,__LINE__), abort())

void main()

{

int i = 10;

if(i==0)

assert(i <>

else

printf("This statement becomes else for if in assert macro");

}

Answer:

No output

Explanation:

The else part in which the printf is there becomes the else for if in the assert macro. Hence nothing is printed.

The solution is to use conditional operator instead of if statement,

#define assert(cond) ((cond)?(0): (fprintf (stderr, "assertion failed: \ %s, file %s, line %d \n",#cond, __FILE__,__LINE__), abort()))

Note:

However this problem of “matching with nearest else” cannot be solved by the usual method of placing the if statement inside a block like this,

#define assert(cond) { \

if(!(cond)) \

(fprintf(stderr, "assertion failed: %s, file %s, line %d \n",#cond,\

__FILE__,__LINE__), abort()) \

}

2) Is the following code legal?

struct a

{

int x;

struct a b;

}

Answer:

No

Explanation:

Is it not legal for a structure to contain a member that is of the same

type as in this case. Because this will cause the structure declaration to be recursive without end.

3) Is the following code legal?

struct a

{

int x;

struct a *b;

}

Answer:

Yes.

Explanation:

*b is a pointer to type struct a and so is legal. The compiler knows, the size of the pointer to a structure even before the size of the structure

is determined(as you know the pointer to any type is of same size). This type of structures is known as ‘self-referencing’ structure.

4) Is the following code legal?

typedef struct a

{

int x;

aType *b;

}aType

Answer:

No

Explanation:

The typename aType is not known at the point of declaring the structure (forward references are not made for typedefs).

5) Is the following code legal?

typedef struct a aType;

struct a

{

int x;

aType *b;

};

Answer:

Yes

Explanation:

The typename aType is known at the point of declaring the structure, because it is already typedefined.

6) Is the following code legal?

void main()

{

typedef struct a aType;

aType someVariable;

struct a

{

int x;

aType *b;

};

}

Answer:

No

Explanation:

When the declaration,

typedef struct a aType;

is encountered body of struct a is not known. This is known as ‘incomplete types’.

7) void main()

{

printf(“sizeof (void *) = %d \n“, sizeof( void *));

printf(“sizeof (int *) = %d \n”, sizeof(int *));

printf(“sizeof (double *) = %d \n”, sizeof(double *));

printf(“sizeof(struct unknown *) = %d \n”, sizeof(struct unknown *));

}

Answer :

sizeof (void *) = 2

sizeof (int *) = 2

sizeof (double *) = 2

sizeof(struct unknown *) = 2

Explanation:

The pointer to any type is of same size.

8) char inputString[100] = {0};

To get string input from the keyboard which one of the following is better?

1) gets(inputString)

2) fgets(inputString, sizeof(inputString), fp)

Answer & Explanation:

The second one is better because gets(inputString) doesn't know the size of the string passed and so, if a very big input (here, more than 100 chars) the charactes will be written past the input string. When fgets is used with stdin performs the same operation as gets but is safe.

9) Which version do you prefer of the following two,

1) printf(“%s”,str); // or the more curt one

2) printf(str);

Answer & Explanation:

Prefer the first one. If the str contains any format characters like %d then it will result in a subtle bug.

10) void main()

{

int i=10, j=2;

int *ip= &i, *jp = &j;

int k = *ip/*jp;

printf(“%d”,k);

}

Answer:

Compiler Error: “Unexpected end of file in comment started in line 5”.

Explanation:

The programmer intended to divide two integers, but by the “maximum munch” rule, the compiler treats the operator sequence / and * as /* which happens to be the starting of comment. To force what is intended by the programmer,

int k = *ip/ *jp;

// give space explicity separating / and *

//or

int k = *ip/(*jp);

// put braces to force the intention

will solve the problem.

11) void main()

{

char ch;

for(ch=0;ch<=127;ch++)

printf(“%c %d \n“, ch, ch);

}

Answer:

Implementaion dependent

Explanation:

The char type may be signed or unsigned by default. If it is signed then ch++ is executed after ch reaches 127 and rotates back to -128. Thus ch is always smaller than 127.

12) Is this code legal?

int *ptr;

ptr = (int *) 0x400;

Answer:

Yes

Explanation:

The pointer ptr will point at the integer in the memory location 0x400.

13) main()

{

char a[4]="HELLO";

printf("%s",a);

}

Answer:

Compiler error: Too many initializers

Explanation:

The array a is of size 4 but the string constant requires 6 bytes to get stored.

14) main()

{

char a[4]="HELL";

printf("%s",a);

}

Answer:

HELL%@!~@!@???@~~!

Explanation:

The character array has the memory just enough to hold the string “HELL” and doesnt have enough space to store the terminating null character. So it prints the HELL correctly and continues to print garbage values till it accidentally comes across a NULL character.

15) main()

{

int a=10,*j;

void *k;

j=k=&a;

j++;

k++;

printf("\n %u %u ",j,k);

}

Answer:

Compiler error: Cannot increment a void pointer

Explanation:

Void pointers are generic pointers and they can be used only when the type is not known and as an intermediate address storage type. No pointer arithmetic can be done on it and you cannot apply indirection operator (*) on void pointers.

16) main()

{

extern int i;

{ int i=20;

{

const volatile unsigned i=30; printf("%d",i);

}

printf("%d",i);

}

printf("%d",i);

}

int i;

17) Printf can be implemented by using __________ list.

Answer:

Variable length argument lists

18) char *someFun()

{

char *temp = “string constant";

return temp;

}

int main()

{

puts(someFun());

}

Answer:

string constant

Explanation:

The program suffers no problem and gives the output correctly because the character constants are stored in code/data area and not allocated in stack, so this doesn’t lead to dangling pointers.

19) char *someFun1()

{

char temp[ ] = “string";

return temp;

}

char *someFun2()

{

char temp[ ] = {‘s’, ‘t’,’r’,’i’,’n’,’g’};

return temp;

}

int main()

{

puts(someFun1());

puts(someFun2());

}

Answer:

Garbage values.

Explanation:

Both the functions suffer from the problem of dangling pointers. In someFun1() temp is a character array and so the space for it is allocated in heap and is initialized with character string “string”. This is created dynamically as the function is called, so is also deleted dynamically on exiting the function so the string data is not available in the calling function main() leading to print some garbage values. The function someFun2() also suffers from the same problem but the problem can be easily identified in this case

Thursday, December 10, 2009

5 Ways Google's New Search Tools Go Wide And Deep

Google (NSDQ:GOOG) is the barely challenged leader in search enginemarket share and, thanks to new tweaks like Real-Time Search and GoogleGoggles, it has no plans to slow down, either.

This week, Google introduced a number of search capabilities that promise to broaden its search reach and continue to keep would-be competitors like Microsoft's Bing and Yahoo under Google's thumb. Here's how Google is doing it:

1. Google Real-Time Search

Google this week said that it would integrate realtime search results in search engine queries, meaning that social networking sites like Facebook andMySpace that have content based on realtime status and other updates will be more easily found on Google. Microsoft's Bing also offers realtime searchability from social networking platforms, but the breadth and depth of Google's realtime search capability appear to be stronger.

Burning question: What does Google need to do to make that realtime capability even more comprehensive?

2. Google Goggles

The new Google Goggles allows users to take photos of something they're trying to identify using a mobile device (for now, an Android mobile device). Google's visual search will capture the image and return information, as if a user had typed in relevant search terms.

Burning question: When will Googles, available for Android phones, be made available for other platforms? And will it?

3. Google Favorite Places

Google is apparently providing more than 100,000 bar-code decals to various businesses around the country. Google is hoping that those businesses will post the bar codes so that mobile device users -- iPhone, Android and BlackBerry alike -- can scan those bar codes and instantly call up information such as reviews and promotions related to that business.

Burning question: Will businesses find Google Favorite Places as helpful a promotional tool as, say, offering coupons through Twitter or advertising promotions in Facebook communities?

4. What's Nearby for Google Maps

Google's What's Nearby for Google Maps is a mobile device feature through which users are supposed to be able to find landmarks, businesses and other local attractions based on where they are. Google also said it had updated Google Suggest to customize search results based on location. Typing in certain beginnings of words will yield different results depending on the city.

5. More languages in Google Voice Search

Google's voice search feature now supports Japanese in addition to English and Mandarin.

Thursday, October 8, 2009

10 TECH CAREER BOOSTERS

This guide is for students just starting out in the IT industry, but could just as well apply to anyone who wants to set themselves apart in a competitive global environment.

By JAMSHED AVARI

Going by most media and industry reports, technology industries in India are starting to bounce back from the global slowdown. Our country might not be faring as badly as others are right now, but that still doesn’t mean all is well on the job search front. Many of the workers laid off earlier this year are still finding it hard to get new jobs, since companies are only just starting to recover and aren’t looking at expansion opportunities yet. With so many experienced workers and so few job openings, things don’t look very good at all for the lakhs of freshers who will be graduating six or eight months from now and entering the job market for the first time.

“IT” as a career option is a fairly vague, nebulous idea. Everyone knows that IT is hot and there’s lots of money to be made if you’re young and well educated, but no one can actually pin down a single, specific path to follow that guarantees you’ll make it big. IT encompasses careers in hardware administration, networking, chip design, coding or programming, software development, testing and validation, database management, business analysis, security, visual design, animation, and dozens of other avenues. Additionally, each of those can encompass multiple potential careers, each of which would require additional specialized knowledge, such as game development for mobile devices or enterprise-level data center security.

Added to this, many graduating computer science and IT students don’t feel very well prepared for jobs in the real world. A random sampling of students and recently employed workers CHIP spoke to expressed the common concern that their specializations, usually Java and C, aren’t exactly the best tools to take them beyond entry-level jobs in coding. Recruiters shared the same concern, but rationalized that by saying that tech companies usually hire freshers for very specific jobs such as data entry or a single type of programming, and will put them through a few weeks or months of training in that field. This illustrates the difference between an IT job and an IT career: students who don’t know exactly what they want to pursue will end up being molded by the immediate requirements of the industry. Those who find themselves surrounded by hundreds of others doing exactly the same work will quickly find things repetitive and stifling. Worse, those who don’t have the aptitude for whatever they’ve been pushed into won’t do very well, won’t rise in the company’s hierarchy, and might even get put off by the industry as a whole.

Some students who find themselves unaware of what options lie ahead of them because of this vagueness s only wind up following the herd and joining large companies en masse in the hope of picking up some skills along the way, an attitude that doesn’t necessarily go down well with HR managers or bosses. Employees who have a well thought out growth plan or at least some specific goals and understanding of their own aptitudes will always stand out.

10.

Take charge of your future with PARALLEL COURSES

If you’ve just entered college and are wondering how to make the most of a course that isn’t really keeping you interested or engaged, find something to do alongside. College won’t take up every single waking moment you have, and there are dozens of institutes in every city offering part-time morning, evening and weekend courses. Sure, it might cut down on your social life a bit, but it’s the kind of move that will really set you apart when a recruiter is flooded with hundreds of resumes with identical college degree qualifications.

There are dozens of choices available. Several major institutes with hundreds of branches across the country offer career-focused multi-year diploma courses that allow you to pick and choose from various modules, include training in soft skills, and even promise job placements. These courses, however, are fairly expensive and require serious commitment. On the other hand, short term courses are a great way to pick up secondary skills that will not only help to pad your resume but also give you an edge in your college work. A few months with Photoshop and Illustrator will help you create high-quality graphics for your college Web design projects, and some hands-on experience with hardware assembling and troubleshooting will be a nice balance to a software engineering degree. Everything extra you do will result in a more rounded application and personality, which could work to your advantage in the future.

Such courses are also great for students who feel that their colleges aren't really preparing them for the careers they are interested in, or who didn't manage to get into exactly the course of their choice.

You could also opt for something completely offbeat. Several institutes are beginning to offer courses in ethical hacking, typography, game development, jewelry design, and other things that might not only interest you, but also give you a unique skill that could come in handy later.

09

Exploit your INTERNSHIPS TO THE MAX


If your college doesn’t make it compulsory to do an internship, do one anyway. In fact, try to do more than one! Of course it’s nice to relax and wake up late every day, but summer vacations can also be used productively to enhance your career prospects. On-the-job training is invaluable and is completely incomparable to just classroom experience and college projects. Not only will you get an idea of how the industry works, but you’ll have a glimpse of your own potential future. As an intern you might get stuck doing menial tasks for a while, but if you show good aptitude, you’ll almost certainly be trusted with regular, more important work as well. If you intern at a smaller company, chances are you’ll become one of the team and share in their work. At the end of your time there, you’ll have something you can really show off to future potential employers.

Interning is about more than just showing up at an office and earning a recommendation letter. Take every opportunity you have to chat with everyone from senior managers to fresh staffers. You’ll learn tons about the job, the industry, competing companies, plans and expectations, and the kind of lifestyle you’ll have if you make this your career. It’s important to make friends and stay in touch with them. If they remember you, joining the company as a permanent staffer a year down the line will be a whole lot easier. And because churn is fairly high and people change jobs often, you’ll end up with friends in a whole host of companies who can alert you to job openings and put in a good word for you with their recruiters.

08

Work at a NON-IT OUTFIT


It isn’t the end of the world if all the big IT houses have frozen hiring. There are hundreds of other companies that can use your skills if you’re talented enough. Every company has IT infrastructure that needs to be maintained, so hardware and networking skills are sought after. In-house Web developers can be found in diverse fields, as can database architects and experts in many verticals. As always, you could get noticed and later be pushed to work on bigger and better projects, or you could even wind up influencing all tech-related decisions within the company because your bosses will recognize your skill in areas they don’t fully understand!

Media houses, ad agencies, law firms, hospitality establishments, logistics operations, and pretty much all types of small/medium enterprises and even family business need staff with tech skills. You can help them save money on infrastructure, Web hosting, replacing outsourced skills, information security, new media strategies, SAP implementation, etc. Many companies just don’t know how badly they could do with technically-oriented staff until the potential for improvement is demonstrated to them. So don’t scoff at an offer for a boring-sounding job at a non-IT firm; chances are once you’re inside, you’ll be able to spread your wings.

07

Network, network, network— ONLINE AND OFFLINE

With all the regular channels of interaction such as placement agencies and HR recruiters drying up, it’s important to have your own connections. Well-placed friends and colleagues can alert you to positions that need to be filled and recommend you to their superiors. Stay in touch with your classmates and seniors as well as anyone else in the industry you meet along the way.

One great way to do this is through specialized online social networks such as SiliconIndia, LinkedIn and Ryze. Regularly updating your profile and whereabouts ensures that you’ll be seen in your contacts’ news feeds, keeping you visible and relevant to them. You can also use Facebook and other regular social networks, but remember to restrict access to your drunken party photos: these might work against you when it comes to finding someone suitable for a job. Offline networking is also important. Friends, family, visiting faculty—anyone at all could become a valuable resource. Check out communities in your town or college such as linux user groups, barcamps, and other places where those with common techie interests meet. You could end up impressing someone in a high position.

06

Learn to make JOB SITES WORK FOR YOU

Job sites are widely used by recruiters to select a few promising candidates for any vacancy that might arise. Make sure your profile is visible and relevant by exploiting all the features of the sites, such as supplying the right keywords to make you show up in searches. Regularly updated profiles with as much information as possible will help you get noticed. You can even pay a small fee for preferred listings in many cases.

Job sites also offer plenty of additional help, including articles about proper interview etiquette, job search strategies, tips for negotiating salaries, and even pointers on the kind of brain teasers software companies like to surprise interviewees with.

05

Brush up on your INTERVIEW SKILLS

This is a pretty general tip, but it’s important nonetheless. First impressions count, so make sure you’re on time for your interview, study a bit about the company’s profile and background, and rehearse answers for common questions. Take very opportunity to say something positive about yourself, even when asked “What do people say your worst trait is?”

Carry copies of your resume and recommendation letters, in case they’re required. Don’t jump into salary negotiations or make demands if you aren’t specifically asked what how much you’re expecting. Sit up straight, speak clearly, and don’t fidget with pens or papers. If you get the chance, you can engage the interviewer by asking questions about the work environment, expected projects and clients, and any concerns you might have.

04

Don't underestimate your PORTFOLIO


Just like a recruiter will scrutinize your resume without needing to be technically minded, your potential bosses might not care at all about academic marks. In this case, they’re trying to see how good you are at what you do, and how well you’ll fit in. A slick portfolio or showreel will go a long way in showing off your previous work, even if it’s only academic assignments. Make liberal use of screenshots and captions to highlight any particularly innovative approach to problem solving. If possible (and if suitable to your work), create an interactive Flash demonstration that you can host online as well. Even a simple slideshow of photos could be impressive if done well.

03

Know your basics, KNOW YOUR TRIVIA


It might not sound important, but a lot of interviewers will quiz you on trivia such as Cobol concepts or legacy networking architectures and protocols. This is actually quite a good sign, since it is more likely to occur with smaller companies where you're expected to have more of an individual personality and be less of a code-writing zombie.

The questions asked might be to throw you off, to see what you’ve learnt on your own, or to check your background and the kind of context you have while working on problems. It shouldn't be a negative thing to say you aren’t familiar with these things, but actually knowing them will give you an edge. Besides, if your interviewer is an old timer who likes sharing war stories, you’ll score points by knowing what he’s talking about and laughing along with the inside jokes. After all, you are in the company of geeks!

02

Pay attention to INDUSTRY TRENDS

This one really should go without saying, but it’s one of the most important things you can do. You need to follow magazines, websites, job portals, business newspapers, trade publications and any sources you have within the industry to keep your finger on the pulse of the industry. Do all this for a few months and you’ll be able to predict which niches and verticals require skilled staff and which ones offer the maximum potential for growth. Are there any specializations that are always in demand? Are there any fields with a dearth of qualified candidates? The answers to these questions evolve over time, so you’d do well to track them.

Combining your research with specialized courses could additionally work to your advantage because you’ll give yourself a unique set of talents and you’ll be able to present this to recruiters with confidence. Especially if you’re undecided about what to pursue, you’ll get a lot of insight and might come across something that really captures you interests.

You could even find yourself looking at an extremely fulfilling career outside of mainstream IT, such as technology journalism, legal consultation, PR and corporate communications, teaching, or loads of other areas in which your knowledge and background will give you an edge, while simultaneously letting you avoid the crunch that the IT industry is now facing. Again, it all comes down to being an intelligent, informed person with a well-rounded personality—exactly the kind of thing that impresses recruiters and bosses.

Continuing to keep abreast of the industry and economy will always help you grow, long after you've landed a job and have embarked upon your career.

01 Blaze your own CAREER PATH

Most important of all, don’t just follow the herd! Even at the best of times, you could be hired to just sit behind a desk and churn out hundreds of lines of code everyday alongside a thousand other sheep doing exactly the same thing. If you really want to set yourself apart, you have to rise above the herd and do your own thing. All the tips outlined here will help you become unique and valuable, both inside and outside a tech company. Don’t be afraid to take a lesser-known path; many of the sectors which are still booming today were unheard of niches a few years ago.

If at any point you begin to feel burnt out (like thousands of formerly enthusiastic graduates who joined the BPO industry for its glamor and fat pay packets have been), you can always make a change and switch streams. Once you have your basics in place and you understand how the job market functions, and if you have carefullyl evaluated the risk with the present economic scenario, you can make your jump—although this becomes a lot easier if you have a lot of work experience.

Even if you didn’t graduate in a specific stream or specialization, there’s nothing stopping you from switching paths later on if you really want to. A few people have grown to become CTOs without any formal education in technology at all, and some have left engineering careers to be perfectly happy and well paid in other peripheral or even unrelated fields. Your future is in your own hands, so don’t be afraid to spend time exploring different things before you finally settle on what’s right for you.