tag:blogger.com,1999:blog-81415450596082971442024-03-13T09:11:11.860-07:00Rioma's BlogUnknownnoreply@blogger.comBlogger21125tag:blogger.com,1999:blog-8141545059608297144.post-73747849768625268782016-08-19T23:27:00.003-07:002016-08-19T23:27:49.645-07:00Scaling “high-growth” start-ups in fashion<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.6667px; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; line-height: 1.38; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><i>50% annual growth: How did we do that? This is the original draft that was published at </i></span><span style="font-family: Arial;"><span style="font-size: 14.6667px; line-height: 20.24px; white-space: pre-wrap;"><i>http://www.netcentric.biz/blog/2016/08/50--annual-growth--how-did-we-do-that-.html</i></span></span></div>
<b id="docs-internal-guid-831b882f-a6a0-fe1f-44d0-097fbbeaa47b" style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">I joined </span><a href="http://www.netcentric.biz/" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Netcentric</span></a><span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> when there were 12 people in the Barcelona office. Back then, the expansion plans called my attention. The market was vibrant and Elian and Dominik convinced me that Adobe had a great vision for </span><a href="http://www.adobe.com/marketing-cloud/enterprise-content-management.html" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">AEM</span></a><span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> (back then called CQ). They wanted to grow to around 50 people in one year. Today (after three years) we are a team of 250 people in four cities and continue with the same goal of growing and keeping the startup spirit. Adobe has expanded AEM to become the keystone of the </span><a href="http://www.adobe.com/marketing-cloud.html" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Adobe Marketing Cloud</span></a><span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> and the demand for the product keeps growing. In this atmosphere, growing is just a side effect of the market. </span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">However, growing at a 50% pace during the last three years was not easy. You may wonder, How do you structure the company to be able to respond to change? How do you attract and keep talent? What kind of skills are necessary? And how do you develop them? If you are interested in finding out, keep on reading.</span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">There are different types of entrepreneurship visions. There is one kind of entrepreneurs who focus on a local market, small team, and limited growth. They want to continue doing what they love. Probably their main driver to start a business is their need for independence. These guys hate having a boss and their contribution to the overall job market ranges between 15 to 40 people. </span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">On the other hand, there is a very small set of entrepreneurs who aim high and big. These guys create companies that represent a disproportionately large contribution to net job creation. They are fans of Larry Page and Jeff Bezzos. </span><a href="https://en.wikipedia.org/wiki/John_Haltiwanger" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">John Haltiwanger</span></a><span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> and other researchers call them “high-growth” firms (companies that are adding jobs at a rate of more than 25% percent a year). These are the companies with huge impact in the economy and in innovation. As Andy Groove summarized in a 2010 essay about job creation:</span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Equally important is what comes after that mythical moment of creation in the garage, as technology goes from prototype to mass production. This is the phase where companies scale up. They work out design details, figure out how to make things affordably, build factories, and hire people by the thousands. Scaling is hard work but necessary to make innovation matter.</span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Scaling is not easy. To make it right you need to invest in things that are not needed at the present but that become crucial in the future. You have to assume risks and shoot for the sky. You need to trust the people you recently hired and give new responsibilities to everyone (yes, everyone). The people you hire have to be motivated to take on new challenges and work under chaos. People and the company mature by the necessity of getting things done. And of course, you have to be successful in growing and delivering to your clients. </span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">By the way, a great part of the “you” mentioned in the last paragraph, is meant for </span><a href="http://www.netcentric.biz/" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Netcentric’s</span></a><span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> board. The board members have been critical in scaling the company by using one key motivation: trust. They trusted us with recruiting, training, building technological infrastructure, rewarding programs, and everything that would take too long for approval. Why hire smart people if you have to tell them what to do, right?</span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">That was another key factor: if you want to increase motivation, hire motivated people. There is no easy way around that. “Recruiting is the most important activity that I do everyday”. I agree with Eric Schmidt. Recruiting is key. I have to admit that we are elitist. Our hiring process is not easy. We have at least three rounds of interviews. We work on problem assignments and have a hiring committee. The selection criteria is strict and explained to everybody who participates on hiring. This approach based on having a sound system for hiring motivated people has definitely been one of the key successes of scaling. </span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">As an employee, I have many challenges and fears and, luckily, the former surpass the latter. The people whom I work with are eager to take on new responsibilities. There are opportunities for trying new roles in the company, like front end, business analyst, project manager, and system engineering abound. I can create my internship in any of those areas even if I am not part of that discipline group. People proactively create new career pathways, propose new ways of doing things, and are key in pointing out deficiencies. </span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">To help the company grow, coaching becomes a day to day activity. Coaches help others in their professional growth via quarterly, half-year, and yearly appraisals. There are roles such as coaches, buddies, and advocates. Coaches help career development. Advocates support needs and collect overall feedback received. The buddy program helps with the onboarding. And the process of onboarding was revamped to reduce the learning curve by introducing newcomers to how the company operates and review the different careers.</span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">None of this was easy to achieve. None of the processes was set up from the beginning. Many mistakes were made. However, we follow an iterative approach. Our feedback loop is very short and when something does not work, it stands out immediately. People are very active in voicing concerns, in getting involved, in feeling part of the company. And that makes a difference.</span></div>
<br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">I look back and do not regret my career change after working for the status quo. </span><a href="http://www.netcentric.biz/" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Netcentric</span></a><span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> continues to become more exciting every day. The fast pace and capacity to deliver our business goals is a key driver and magnet. And yes, besides all that, there is free coffee. Send me an email to </span><a href="mailto:mario.rodriguez@netcentric.biz" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">mario.rodriguez@netcentric.biz</span></a><span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> if you would like to check it out.</span></div>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8141545059608297144.post-34751429687668994042016-08-06T07:52:00.001-07:002016-08-06T07:52:06.889-07:00Others ask for experience, we want your passion<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" id="docs-internal-guid-f576a27d-6055-a519-e052-f8bf138af6c0" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Should experience be a predictor of capacity? I think Guardiola would object. This is a good story about an experiment going terribly right: the Netcentric Academy</span></div>
<br />
<br />
(this is the original writing that was published <a href="http://www.netcentric.biz/blog/2016/08/others-ask-for-experience--we-want-your-passion.html" target="_blank">here</a>)<br /><br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">A year ago, the Netcentric director from the Barcelona office approached me with a crazy idea (he usually does that during the summer). He said: “Let’s get graduating students from the university and train them to become backend and frontend developers in three months.” He was really optimistic and certain that it would work. I, on the other hand, thought the dates were aggressive. Additionally, nobody had done it before and, as new experiences go, uncertainty gives away to fear and rejection. Several colleagues also feared getting inexperienced youngsters with no professional experience into our offices without being able to place them in projects facing the client. I am glad to tell you this is a story has a happy ending.</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">So we did not have much time to prepare. I was myself doubtful it was even possible. However, this is Netcentric, and we do things differently. We set to define the classes that were going to be taught, select the professors that were going to teach them, and the plan to follow. The first major obstacle was the opportunity cost in getting our own developers to teach classes. Therefore, we came up with a solution: let’s leave it open for the students to do their own project. The rest of the time, the students will receive a basic introduction to our building blocks. This decision turned out to be the key of succes. The project was the best part of the academy and allowed a good assessment of motivation, teamwork, and learning.</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Things were not easy, though. From the start the resources were limited. Students were mostly gone for the summer. We did not even have office space to teach the classes, so we had to rent tables and chairs, and review the planning in sudoku fashion to align everybody’s requests. It was challenging but it worked. Each Netcentric person I approached showed his/her pride in what they do and willingness to participate. </span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Today we have more than 20 bright developers that have been onboarded into the company and with a high level of satisfaction from both the tech leads and the developers themselves.</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">It is not only passion that we asked, of course. Those selected showed a potential for deep analytical thinking and fast learning. They worked under little supervision and were able to be motivated and deliver high quality work in their projects. At the beginning, we debated much about motivation. Were those guys be able to attend a full 8-hour day of classes? Should we have a 6-hour day? Should we include motivating videos from code.org? Reality sometimes is better than fiction and the students did wonderfully, even arriving an hour earlier to have their daily stand-up and staying late to finish their work.</span></div>
<br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Several times I have asked the students who participated what was the factor of success. I would have never thought possible that level of commitment. The answers vary and everybody has their own reason. However, the most common response is that they wanted to prove how much they could do. I hope society in general would do the same: give a chance to the youth to show what they are capable of. </span></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8141545059608297144.post-59149235822146985992016-07-17T07:14:00.001-07:002016-07-17T07:14:18.974-07:00Why Software Maintenance Projects Matter<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Software developers can be divided into two groups: those working on maintenance projects and those working on new projects. Those in the first group are practical and work under pressure to apply solutions to current problems. Those in the second are more theoretical and have flexibility to take decisions, because their problems have not appeared yet. It seems that everybody wants to be part of the second group but a closer look reveals some interesting facts.</span></div>
<b id="docs-internal-guid-6ada1ebd-f934-f8aa-ea4e-634f32aec5de" style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Having a white page to start your design is very attractive to any engineer, architect or creative writer. However, after more than 10 years in the industry, I believe maintenance projects are where you really learn. They are the only place where you can put your design to the test (and by test, I mean the real environment stack, real user base, and real evolution of the product). And I am not blaming the good architects who designed the system that you inherited. It is impossible to predict the future (even if you are Steve Jobs). There is no magic pill for a design of self-evolved systems (at least not yet). That is why the world requires developers like you with enough insight and vision to identify the root causes of problems and come up with good solutions. </span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Designs in maintenance projects are tested in real time. One of my first experiences was working on a database connection pool for a bank to handle the database connections. With 50,000 users logging in the morning, the system had to work because if anything went wrong, the connection pool exploded. Not only that, think of the client sitting by you and, if solution A does not work, you have no option but come up with something better. Unlike the design team who worked on theoretical scenarios, you have the real experience to cope with. And this reality includes evolution of hardware, software, dealing with 5 years of data… all that fun. </span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">It is also on maintenance projects where you gain the trust (or not) from a client. Being close to the end users and primary stakeholders (including those who paid for the software) gives you an opportunity to show them your capacity to solve problems and even predict them. If you are good, you help shape the future of the organisation, eliminating all the daily headaches that they suffer. Learn to listen to the client and end-users. It will make you stand out among the rest.</span></div>
<br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">So, make no mistake the next time you are assigned to a maintenance project; there is plenty to learn from and gain experience in. You will benefit from it more than you think. </span></div>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8141545059608297144.post-44520743136589170912015-04-18T12:30:00.000-07:002016-08-19T23:42:59.683-07:00How Users Adopt Products<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">In one of the companies that I used to work for, a group of very smart engineers decided that we needed to opt for a unified development tool for all developers. There were two tools in the market: product corpX and product rebelY. Since they had invested some time and plugins to refine corpX, they wanted to force its use. They had little success on adoption rates. They claimed that some of the problem was in those badass users of rebelY that kept convincing the rest of the team to shift. These badass users were evangelizing the features, they were forming groups of users, they were showing off their results, and even they were wearing proudly political propaganda of the rebelY product (wearing t-shirts and other pride items). Those rebels were resisting and were winning the battle. So they decided it was a moment to force the good in them. </span></div>
<span style="font-family: "arial"; font-size: 15px; line-height: 1.38; white-space: pre-wrap;"><br /></span>
<span style="font-family: "arial"; font-size: 15px; line-height: 1.38; white-space: pre-wrap;">The reaction in itself seemed to me motivated more by emotion than reason (or data), </span><span style="font-family: "arial"; font-size: 15px; line-height: 1.38; white-space: pre-wrap;">so I decided </span><span style="font-family: "arial"; font-size: 15px; line-height: 1.38; white-space: pre-wrap;">to write what little I know about product adoption because my friends were going in the wrong direction. </span><br />
<b style="font-weight: normal;"><br /></b>
<br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">A key feature to highlight is </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 15px; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><b>desirability</b></span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">; or said in other terms, that thing that we want and don’t have. Desirability is what drives people to product love. And product love is blind and passionate. It makes users make comments about how they feel empowered by the product. And eventually, those comments reach us, our friends, family members or colleagues. “Can’t believe Marco can do that in one click”. Marco is cool we think. I need to get it (the tool not Marco). </span></div>
<b style="font-weight: normal;"><br /></b>
<br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">And yes, we really believe more what those close friends say or do than any other corporate advertisement or political propaganda. </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 15px; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><b>So what inspires people to make those comments?</b></span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> The answer is simple: Users do not evangelize to their friends because they like the product, but because they like their friends (and the company they work for) -- to quote Kathy Sierra. Users enjoy the bigger context not the product. The bigger context is to create good software and be productive. And results tell the story: "I can create a test in a fly!" "See how Marco can search the repo!" "I can catch bugs before they happen". All of that makes me a better developer so I want to share that with my friends.</span></div>
<b style="font-weight: normal;"><br /></b>
<br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">The problem is that these badass users are so empowered that they do not shut up. They continue talking. But what is worse is that they do not need to talk. People see the way they work and the results that they are getting. That is even more powerful. They are getting better results. </span></div>
<br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">My claim is not to treat people like puppies. We are rational people making conscious choices. We like to have tools that empower us. And developers need to always think in the big context. The result of the initiative, as in any European movie, is left for you to figure out. </span></div>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8141545059608297144.post-52852556336444725112014-04-13T11:15:00.003-07:002014-04-13T22:27:19.024-07:00Convert a JAR into Bundle<div dir="ltr" style="text-align: left;" trbidi="on">
Personal notes on how to quickly create a bundle based on a list of jars or other dependencies. It uses the <b>content-package</b> and <b>embedded</b> maven configuration to easily deploy the bundle.<br />
<br />
<b>Normal and Painful Way</b><br />
The most difficult way is to follow the standard way and create a manifest file with all the description available. You will also need to figure out the dependencies of your bundle. This blog will show the easy way to package a bundle with all the dependencies that you need.<br />
<br />
<b>Step#1: Easy Way</b><br />
<br />
<div>
The project is quickly created by the classic mvn archetype. The idea is to follow the structure. </div>
<div>
<br /></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">myprojectlib/depency-pkg-libs</span></div>
<div>
<br /></div>
<div>
where <span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">myprojectlib</span> is the root project and <span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">depency-pkg-libs</span> the module with the declared dependencies. We will not include any other code into the folders. Also for the purposes of example, we will use the <a href="https://sling.apache.org/documentation/development/sling-testing-tools.html" target="_blank">JUnit Sling Testing</a> on the server side. This bundle is not included in the default distribution and requires JUnit as a dependency.</div>
<div>
<br /></div>
<div>
<b>Step #2: Create the First module</b></div>
<div>
<br /></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">mvn archetype:generate</span></div>
<div>
<br /></div>
<div>
Make sure you create a basic maven repository with the pom project as root.<br />
<br /></div>
<div>
In our case the <span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">myprojectlib</span> will look like:</div>
<div>
<br /></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><packaging>pom</packaging></span></div>
<div>
<br /></div>
<div>
<b>Step#3: Create the </b><b> Content-package</b></div>
<div>
Create a package <span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">depency-pkg-libs </span>inside the root directory. Make sure you change the packaging so that it becomes content-package</div>
<div>
<br /></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><packaging>content-package</packaging></span></div>
<div>
<br /></div>
<div>
<b>Step#4: Add Embedded List</b></div>
<div>
To your list of build plugins, add the content-package-maven plugin</div>
<div>
<br /></div>
<div>
<groupId><span style="color: blue;">com.day.jcr.vault</span></groupId></div>
<div>
<artifactId><span style="color: blue;">content-package-maven-plugin</span></artifactId></div>
<br />
<div>
In the list of embedded element add those dependencies that you need. In my case, the <b>junit.remote</b>:</div>
<div>
<br /></div>
<div>
<embeddeds></div>
<div>
<embedded></div>
<div>
<div>
<groupId><span style="color: blue;">org.apache.sling</span></groupId></div>
<div>
<artifactId><span style="color: blue;">org.apache.sling.junit.remote</span></artifactId></div>
<div>
<target><span style="color: blue;">${package.root}/install</span></target></div>
<div>
</embedded></div>
</div>
<div>
</embeddeds></div>
<br />
<div>
You should also add the same artifacts listed in embedded to your list of dependencies. Otherwise those will not be installed.<br />
<br />
<dependency><br />
<groupId><span style="color: blue;">org.apache.sling</span></groupId><br />
<artifactId><span style="color: blue;">org.apache.sling.junit.remote</span></artifactId><br />
<version><span style="color: blue;">1.0.6</span></version><br />
<scope><span style="color: blue;">provided</span></scope><br />
</dependency></div>
<div>
<br />
<b>Actual Code</b><br />
You can check the actual code from bitbucket. The meat is in the pom.<br />
<ul style="text-align: left;">
<li><a checked_link="https://bitbucket.org/sparktronics/coquette/src" href="https://bitbucket.org/sparktronics/coquette/src" in_tag="ul" kaspersky_status="skipped">https://bitbucket.org/sparktronics/coquette/src</a></li>
</ul>
</div>
<b>References</b><br />
<div>
This blog is based on the following resources.<br />
<ul>
<li><a checked_link="http://dev.day.com/docs/en/cq/aem-how-tos/development/how-to-build-aem-projects-using-apache-maven.html" href="http://dev.day.com/docs/en/cq/aem-how-tos/development/how-to-build-aem-projects-using-apache-maven.html" in_tag="ul" kaspersky_status="skipped" target="_blank">The maven archetype for CQ5.6</a></li>
<li><a checked_link="http://dev.day.com/docs/en/cq/current/core/how_to/how_to_use_the_vlttool/vlt-mavenplugin.html" href="http://dev.day.com/docs/en/cq/current/core/how_to/how_to_use_the_vlttool/vlt-mavenplugin.html" in_tag="ul" kaspersky_status="skipped" target="_blank">Content Package Maven Plugin</a></li>
</ul>
</div>
<br />
<div>
<br /></div>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8141545059608297144.post-69309906981303240452014-04-07T06:56:00.004-07:002014-04-07T06:56:30.634-07:00Retrieving Service from Request<div dir="ltr" style="text-align: left;" trbidi="on">
Quick way to retrieve a service from a slingRequest<br />
<br />
<span style="font-size: x-small;">private <E> E getServiceFormRequest(</span><br />
<span style="font-size: x-small;">final SlingHttpServletRequest request, Class<E> serviceType ){<br /> final SlingBindings bindings = </span><br />
<span style="font-size: x-small;">(SlingBindings) request.getAttribute(SlingBindings.class.getName());<br /> SlingScriptHelper slingScriptHelper = bindings.getSling();<br /> return slingScriptHelper.getService(serviceType);<br /> }</span></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8141545059608297144.post-73182964670386076762014-03-23T08:50:00.002-07:002014-03-27T23:51:58.548-07:00Date Range Query Medicine for CQ AEM<div dir="ltr" style="text-align: left;" trbidi="on">
One of the most annoying features of xpath queries is the performance problem of date range queries. <a href="http://dev.day.com/docs/en/cq/current/dam/customizing_and_extendingcq5dam/query_builder.html" target="_blank">QueryBuilder</a> tends to perform badly. You can see Marcel's <a href="http://www.pro-vision.de/content/medialib/pro-vision/production/adaptto/2012/adaptto2012-efficient-content-structures-and-queries-in-crx-marc/_jcr_content/renditions/rendition.file/adaptto2012-efficient-content-structures-and-queries-in-crx-marcel-reutegger.pdf" target="_blank">presentation</a> in <a href="http://www.adaptto.org/" target="_blank">AdaptTo</a> if you want to know the details. Thus, when faced with this problem, there are several alternatives:<br />
<ul style="text-align: left;">
<li>modifying the granularity of the dates,so that you select up to the day and exclude hours/min/secs</li>
<li>using a node structure in which the date is saved as the path; for example,</li>
<ul>
<li><span style="color: #351c75; font-family: Courier New, Courier, monospace;">yyyy/mm/dd/my_content_node</span></li>
</ul>
<li>or converting the date property into a long </li>
</ul>
I am going to focus on the third one: <span style="color: #351c75;"><b>ways to convert a date property into a long property</b></span>.<br />
<br />
<b>Approach</b><br />
The basic idea is to leverage the <a href="http://www.day.com/specs/jcr/2.0/12_Observation.html" target="_blank">JCR Observation</a> offered in <a href="http://www.adobe.com/solutions/web-experience-management.html" target="_blank">AEM</a> to add a property of type long each time a property of type date is <span style="color: #351c75;">created</span> or <span style="color: #351c75;">modified</span>.<br />
<br />
First I created my own <a href="http://www.day.com/specs/jcr/1.0/6.3_Namespaces.html" target="_blank">namespace</a> (thanks this <a href="http://blogs.adobe.com/dekesmith/2012/06/21/register-a-custom-namespace-within-cq/" target="_blank">notes</a>) by just going to<br />
<br />
<span style="background-color: white; font-family: Courier New, Courier, monospace; font-size: 13px; line-height: 18px;">http://<host>:<port>/crx/explorer/nodetypes/index.jsp</span><br />
<span style="background-color: white; font-family: Myriad, Arial, sans-serif; font-size: 13px; line-height: 18px;"><br /></span>
<span style="background-color: white; font-family: Times, 'Times New Roman', serif; line-height: 18px;">I selected my own namespace </span><b style="background-color: white; font-family: Times, 'Times New Roman', serif; line-height: 18px;"><span style="color: #351c75;">netval</span></b><span style="background-color: white; font-family: Times, 'Times New Roman', serif; line-height: 18px;"> so that there will be no conflicts with existing properties. </span><div>
<span style="font-family: Times, Times New Roman, serif;"><span style="background-color: white; line-height: 18px;"><br /></span></span>
<span style="background-color: white; font-family: Times, Times New Roman, serif; line-height: 18px;">Then I </span><span style="background-color: white; font-family: Times, 'Times New Roman', serif; line-height: 18px;">registered my class </span><b style="font-family: Times, 'Times New Roman', serif; line-height: 18px;">DatePropertyEventListener</b><span style="background-color: white; font-family: Times, 'Times New Roman', serif; line-height: 18px;"> that implements the </span><b style="font-family: Times, 'Times New Roman', serif; line-height: 18px;">EventListener</b><span style="background-color: white; font-family: Times, 'Times New Roman', serif; line-height: 18px;"> interface. The class needs to use the </span><span style="background-color: white; line-height: 18px;"><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">@Component</span></span><span style="background-color: white; font-family: Times, 'Times New Roman', serif; line-height: 18px;"> annotation. You have to register for the event listener in the </span><span style="background-color: white; line-height: 18px;"><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">@Activate</span></span><span style="background-color: white; line-height: 18px;"><span style="font-family: Times, Times New Roman, serif;"> method. Make sure you get the </span><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">ComponentContext</span><span style="font-family: Times, Times New Roman, serif;"> in the activate method in order to register for the event. </span></span><br />
<span style="background-color: white; font-family: Times, 'Times New Roman', serif; line-height: 18px;"><br /></span>
<span style="background-color: white; font-family: Times, 'Times New Roman', serif; line-height: 18px;">In my </span><b style="font-family: Times, 'Times New Roman', serif; line-height: 18px;">onEvent</b><span style="background-color: white; font-family: Times, 'Times New Roman', serif; line-height: 18px;"> I used the </span><b style="font-family: Times, 'Times New Roman', serif; line-height: 18px;">EventIterator</b><span style="background-color: white; font-family: Times, 'Times New Roman', serif; line-height: 18px;"> to get the property. </span><span style="background-color: white; font-family: Times, 'Times New Roman', serif; line-height: 18px;">I then filtered those properties that are of type date. Conveniently the Property class can return almost any type of value being String, long, Calendar, etc. In my case I needed the value as a long. </span><br />
<span style="background-color: white; font-family: Times, 'Times New Roman', serif; line-height: 18px;"><br /></span>
<span style="background-color: white; font-family: Times, 'Times New Roman', serif; line-height: 18px;">Once I have the value, I can set it in the new property </span><span style="background-color: white; font-family: Times, 'Times New Roman', serif; line-height: 18px;">that has </span><b style="font-family: Times, 'Times New Roman', serif; line-height: 18px;"><span style="color: #351c75;">netval</span></b><span style="background-color: white;"><span style="font-family: Times, Times New Roman, serif;"><span style="line-height: 18px;"> as the namespace and the name of the property in order to avoid collisions. For example, if the attribute name was activationDate the new attribute would be:</span></span></span><br />
<br />
<span style="background-color: white; font-family: 'Courier New', Courier, monospace; font-size: x-small; line-height: 18px;">netval:activationDate</span><br />
<br />
<span style="background-color: white;"><span style="font-family: Times, Times New Roman, serif;"><span style="line-height: 18px;"><b>Code</b></span></span></span><br />
<span style="background-color: white;"><span style="font-family: Times, Times New Roman, serif;"><span style="line-height: 18px;">The first thing is to register and de-register the event listener in the </span></span><span style="font-family: 'Courier New', Courier, monospace; font-size: x-small; line-height: 18px;">@Activate</span><span style="font-family: Times, Times New Roman, serif;"><span style="line-height: 18px;"> and </span></span><span style="font-family: 'Courier New', Courier, monospace; font-size: x-small; line-height: 18px;">@Deactivate</span><span style="font-family: Times, Times New Roman, serif;"><span style="line-height: 18px;"> methods. </span></span></span><br />
<span style="background-color: white;"><span style="font-family: Times, Times New Roman, serif;"><span style="line-height: 18px;"><br /></span></span></span><span style="font-family: Times, Times New Roman, serif;"><span style="line-height: 18px;">A quick look at my </span></span><b style="font-family: Times, 'Times New Roman', serif; line-height: 18px;">DatePropertyEventListener class </b><span style="font-family: Times, 'Times New Roman', serif; line-height: 18px;">reveals the following. </span><span style="font-family: Times, Times New Roman, serif;"><span style="line-height: 18px;">The observationManager and admin session are class attributes. They will be used in the </span></span><span style="background-color: white; font-family: 'Courier New', Courier, monospace; font-size: x-small; line-height: 18px;">@Deactivate</span><span style="font-family: Times, Times New Roman, serif;"><span style="line-height: 18px;"> nd Activate methods. It is in the </span></span><span style="background-color: white; font-family: 'Courier New', Courier, monospace; font-size: x-small; line-height: 18px;">@Activate</span><span style="font-family: Times, Times New Roman, serif;"><span style="line-height: 18px;"> method where we register the event listener. </span></span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">observationManager = adminSession.getWorkspace().getObservationManager();</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">observationManager.addEventListener(this,</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">Event.PROPERTY_ADDED|Event.PROPERTY_CHANGED,</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> "<b>/content/news/</b>", // absolute path</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> true, // isDeep</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> null, // uuid</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> null, // nodeTypeName</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> true // no local</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> );</span><br />
<span style="font-family: Times, Times New Roman, serif;"><span style="line-height: 18px;"><br /></span></span>
<span style="font-family: Times, Times New Roman, serif;"><span style="line-height: 18px;">Note that the absolute path is restrictive to the root path of your content. I highly recommend being as specific as possible in order not to receive too much noise.</span></span><br />
<span style="font-family: Times, Times New Roman, serif;"><span style="line-height: 18px;"><br /></span></span>
<span style="font-family: Times, Times New Roman, serif;"><span style="line-height: 18px;">The <b>onEvent</b> it is easy to get the date property</span></span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> while( eventIterator.hasNext() ){</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> final Event event = eventIterator.nextEvent();</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> if(PropertyType.DATE == getPropertyType(event) ){</span><br />
<span style="font-family: Times, Times New Roman, serif;"><span style="line-height: 18px;"><br /></span></span>
<span style="background-color: white;"><span style="font-family: Times, Times New Roman, serif;"><span style="line-height: 18px;"><b>Caveats and Warnings</b></span></span></span><br />
<span style="background-color: white;"><span style="font-family: Times, Times New Roman, serif;"><span style="line-height: 18px;">This procedure should be <b><span style="color: #990000;">disabled</span></b> for operations that modify many nodes, like during a migration of content.</span></span></span><br />
<span style="background-color: white;"><span style="font-family: Times, Times New Roman, serif;"><span style="line-height: 18px;"><br /></span></span></span>
<span style="background-color: white;"><span style="font-family: Times, Times New Roman, serif;"><span style="line-height: 18px;">A suggestion is to have a producer-consumer data structure (like LinkedBlockedQueue) that will allow you to process the events more efficiently.</span></span></span>
<span style="background-color: white; font-family: Myriad, Arial, sans-serif; font-size: 13px; line-height: 18px;"><br /></span></div>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8141545059608297144.post-29977790247705736152013-03-18T04:28:00.001-07:002013-03-18T04:39:44.349-07:00Heavy duty ETL: Extraction Transformation and Load <div dir="ltr" style="text-align: left;" trbidi="on">
This is a cross post blog from <a href="http://cloudmateviz.blogspot.com.es/2013/03/heavy-duty-etl-extraction.html" target="_blank">Cloud Data Viz project</a><br />
<br />
These days, many people are talking about Big Data. However, very few
talk about how big is Big Data and about all the different components
that need to be considered prior, during, and after running a system
based on Big Data. Many don't know the time it takes to extract the
data. Others forget that they need to validate it. And only a few
mention the loading tools they use to speed up the process of loading
millions of rows into a system (not to mention normalizing the data
while you are loading it). Therefore, I thought our "little" project
could be of interest. This post will explain all the different issues
you need to consider before implementing a system with Big Data.<br />
<br />
<b>Data Volumes</b><br />
The amount of data that we use for the Climate Viz project is
astronomical. Just to give an idea, we are collecting temperature data
from satellites at a 0.25 resolution, which means that there are 864,000
data points being collected every 3 hours. At the end of just one day,
we get close to 7 million data points. Just for one day! And we haven't
mentioned transformation and other data aggregation statistics that we
need for the project.<br />
<br />
<b>Extraction</b><br />
Every project always comes with dirty work. And extracting and loading
the files is the dirty part of this project. Visualizing the data in
maps and writing the UI controls is the easy part. But getting all the
data in and validating it, that's where the pain begins.<br />
<br />
We use a two-step process for extracting the files from <a href="http://disc.sci.gsfc.nasa.gov/giovanni" target="_blank">NASA Giovanni</a>. Setting up a <b>wget </b>script that downloads the <a href="http://en.wikipedia.org/wiki/GRIB" target="_blank">GRIB </a>files was easy. Then we process them with <a href="http://code.google.com/p/pygrib/" target="_blank">pygrib </a>and slice them in order to have them ready for GAE.<br />
<br />
For data is never going to change, we generate master tables. In our
case, latitude and longitude are fixed for every resolution and can be
generated programatically. Two for loops ( x and y ) and you think you
are done but, when you are dealing with Big Data, that translates into
several troubles. First consider that the loops could take so long that
you could reach timeouts as part of the request and post methods of the
web layer. Then, the same thing could happen even if you make a dummy
get method to generate all the different tasks using the queue.<br />
<br />
<b>Validation</b><br />
Once you start dealing with data collected from different sources, the
first need is to validate them. Most likely you would like to have a
visualization tool that compares and contrasts your data. Unfortunately,
you can't use excel because it has a limit of 65,535 rows (far too
limited for big data sources).<br />
<br />
Thus, we are left with building our own tools to validate our data.
Think about it because it makes a big difference. Google Maps was a
useful interface for us. Also, Google drive is another option for
loading big files.<br />
<br />
<b>Transfer </b><br />
Of course, transferring data from your source to the destination is
another issue. If you have a normal ETL tool, then your problem is
solved. However, the rest of us have to deal with several issues. For
each POST, there is a limit in both the size of the file we are sending
as well as the time it takes to process it. I had to play around with
how fast GAE was processing the files. I started with 15000 lines per
file and had to go down to 200 lines. Otherwise, I received a timeout
error in the operation for 5K, 2K, and 800. Luckily, I was generating
files with a test script but at times is not easy to generate data.<br />
<br />
I also generated a script to scan the files and post them automatically
(using multi-part). Even with a queue of 40 tasks a second, the time to
process the files is agonisingly slow (5 seconds per 100 lines) and it
could probably take several months to load. :(<br />
<br />
Another trick that I used was to slice the files to upload. Each file
contained a line order that will help me aggregate the data later.<br />
<br />
<b>Conclusion</b><br />
I hope the ideas exposed in this post will help you in your Big Data projects.</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8141545059608297144.post-27682357482502912802012-10-31T03:19:00.004-07:002012-11-09T04:51:03.390-08:00Delegando Tareas con App Engine Task Queues<div dir="ltr" style="text-align: left;" trbidi="on">
Contenido de la presentación para el <a href="http://www.devfest.info/event/ag9zfmRldmZlc3RnbG9iYWxyDQsSBUV2ZW50GN7iAQw" target="_blank">Google Dev Fest</a> en Barcelona (9/11/2012)<br />
<br />
Ver otras <a href="http://gdgbarcelona.blogspot.com.es/2012/10/ponencias-y-codelabs-para-el-gdg.html" target="_blank">ponencias</a> <br />
<br />
Título:<br />
<b>Dejando tareas a Google App Engine: Introducción a Task Queues</b><br />
<br />
Presentacion: <a href="https://www.box.com/files/0/item/f_3909761486" style="color: #1a74b0;" target="_blank">https://www.box.com/files/0/<wbr></wbr>item/f_3909761486
</a><br />
<br />
Contenido de la Presentación:<br />
<br />
<b>Introducción</b><br />
<ul style="text-align: left;">
<li>Concepto General: herramienta para los procesos "background"</li>
<ul>
<li>Creado por el limite de 30 segundos por peticion a 10 minutos</li>
</ul>
<li>Visión general del API: los dos tipos de queues: push vs pull</li>
<li> </li>
<li style="text-align: left;">Casos de Uso</li>
<ul>
<li style="text-align: left;">Migración de Datos</li>
<li style="text-align: left;">Procesos Batch</li>
<li style="text-align: left;">Sincronización Avanzada</li>
<li style="text-align: left;">Integración con crons</li>
</ul>
</ul>
<b>Uso / Desarrollo / Cómo Dividir Tareas</b><br />
<ul style="text-align: left;">
<li>Conceptos generales para dividir y conquistar (Divide and conquer)</li>
<li>Framework de Google y su Parametrización de las tareas</li>
<li>Cómo llamar a los "workers" y consideraciones especiales</li>
<ul>
<li><a href="http://en.wikipedia.org/wiki/Idempotence" target="_blank"><b>idempotency</b></a>: qué es</li>
<li>consideración para el entorno "cloud"</li>
</ul>
</ul>
<b>Configuración y Control</b><br />
<ul style="text-align: left;">
<li>Técnicas de afinamiento</li>
<li>Repasando los atributos de una queue</li>
<ul>
<li>frecuency/rate</li>
<li>bucket size</li>
<li>etc</li>
</ul>
</ul>
<ul style="text-align: left;">
<li>Tu amigo el "control panel"</li>
<li>Versionado</li>
</ul>
<b>Mejores Prácticas</b><br />
<ul style="text-align: left;">
<li>Cómo diseñar para parar en "masa" </li>
<li>Control de tareas</li>
</ul>
<b>Otros Frameworks y Herramientas</b><br />
<ul style="text-align: left;">
<li>Map Reduce</li>
<li>appengine-pipeline </li>
</ul>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8141545059608297144.post-56865894957746710452012-08-18T00:37:00.000-07:002012-08-18T00:37:28.730-07:00Analyzing Web Performance: love my RUM<div dir="ltr" style="text-align: left;" trbidi="on">
It was news to me the other day while watching my favorite tv channel (Google Developers on <a href="http://youtube.com/" target="_blank">YouTube</a>) that I ran into <a href="http://youtu.be/NCFVEuKQgBM" target="_blank">this</a> presentation about web performance. Previously I had no idea that modern browsers could measure metrics like "dns lookup", "server connection time", "server response time". With the awesome work from the <a href="http://www.w3.org/2010/webperf/" target="_blank">W3C Performance Working Group</a>, now this is a reality.<br />
<br />
Added to the new and latests trends in continuous build cycle and automated testing, now there is the fact that you can get your RUM (Real User Metrics) as part of Google Analytics. There is always the need to do your performance testing but you can also see how the site evolves and how you could even monitor in real time what is going on. So I went I checked the Google Analytics and indeed, they are providing with all this data.<br />
<br />
I remember a long while ago when a client had some problems with performance and we were working in the dark until we found out it was the dns lookup time! Imagine how much easy it would have been had we used this data.<br />
<br />
For the curious I am posting the image of the lifecycle for a request. All this data could be obtained from the "Developers tool" from most modern browsers. Safari is still lagging.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://w3c-test.org/webperf/specs/NavigationTiming/timing-overview.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="190" src="http://w3c-test.org/webperf/specs/NavigationTiming/timing-overview.png" width="320" /></a></div>
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8141545059608297144.post-12193576564998284992012-07-22T13:03:00.001-07:002012-07-22T13:03:40.020-07:00Google App Engine Research Award<div dir="ltr" style="text-align: left;" trbidi="on">
I am happy to inform that the project that I am collaborating with Dr. Enrique Vivoni and Giuseppe Mascaro was selected as a finalist for the Google App Engine <a href="http://googleappengine.blogspot.com.es/2012/03/announcing-app-engine-research-awards.html" target="_blank">Research Award</a>.<br />
<br />
<b>Objective</b><br />
The project proposes new ways to visualize and accesss data set for global climate data. Our first step is providing access to land surface temperature.<br />
<br />
<b>Background Information</b><br />
Progress has been made through ground and space-based observing networks and the development of sophisticated numerical models. A class of these models, known as Land Surface Models or LSMs, simulates terrestrial water and energy processes and their two-way interaction with the Earth's atmosphere.<br />
<br />
We plan to base our analysis on the Global Land Data Assimilation System (GLDAS), jointly developed by NASA and NOAA, and uses a series of four LSMs to provide global, 0.25 and 1 degree, 3-hourly fields of a wide range of geophysical variables over the period of 1979 to present.<br />
<br />
Procedures for downloading, visualizing and interpreting the data requires advanced technical skills typically possessed by scientist involved in geophysical disciplines. We try to make it easy for normal users.<br />
<br />
<b>Execution</b><br />
Our initial step is to focus only on land surface temperature (LST) at 3-hourly resolution from the period 1980 to 2010 as a target variable. We expect the query tools to allow a range of inquiry into the land surface temperature distribution at:<br />
<ol style="text-align: left;">
<li>Specific location</li>
<li>Across different time periods</li>
<li>For memorable events (for example, Hurricane Katrina)</li>
</ol>
Stay on for future post on how we are going to develop a set of data visualization tools. </div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8141545059608297144.post-8568750430474253942012-07-06T04:39:00.002-07:002012-07-06T04:39:43.575-07:00How-to: Preparando Presentaciones para GTUG Barcelona<div dir="ltr" style="text-align: left;" trbidi="on">
Si vas a presentar en el GTUG, vale la pena repasar los siguientes puntos que te ayudaran a prepararte para la presentación.<br />
<br />
<b>Q&A: Test Run!</b><br />
Igual que en software, vale la pena realizar un "acceptance test" o quizás una prueba unitaria acerca del contenido de tu presentación. Es mi experiencia que siempre tiendo a mezclar más temas de los que debería, así que mantenerlo simple es a veces mas claro a la audiencia. Si alguien te puede escuchar o si puedes contrastar la tabla de contenido con algún colega, te dará una buena perspectiva de la relevancia.<br />
<br />
<b>Resolución 800 x 600</b><br />
Recordar que cuando se presenta la resolución en pantalla es menor que la que usualmente tenemos en el escritorio. Vale la pena practicar tener eclipse en una resolución de 800x600 para tener una idea de como agrupar los elementos en pantalla.<br />
<br />
<b>Doble Monitor</b><br />
Para los que usamos dos monitores en la oficina y usamos Windows, recordar que por defecto, se tiene la proyección de Microsoft Powerpoint en el monitor principal. Esto provoca que no se muestre en pantalla al momento de proyectar. Antes de ir a la presentación, habría que cambiar la configuración y practicar que cuando ejecutamos la presentación en Powerpoint, se proyecta en el monitor secundario.<br />
<br />
<b>Visualización de Código Fuente</b><br />
Intentar cambiar de pantalla con lentitud para no marear al publico. Aunque normalmente cambiamos de pantalla con facilidad, cuando proyectamos es mejor hacerlo con mas lentitud y lo menos posible. De esta manera guardamos el enfoque.<br />
<br />
Basado en la experiencia de expertos (como la peña de Google I/O) se debería limitar al máximo el código que se muestra en Eclipse y decantarse por usar más las diapos para mostrar solo extractos de código. Si estás pensando en mostrar una clase entera, vamos mal. Debería ser mucho más concreto y enfocarte a nivel de funciones y bloques en particular. <br />
<br />
<b>Interactividad</b><br />
No olvidar hacer preguntas al publico. Puedes pedir sugerencias, lecciones aprendidas, pasadas experiencias o simplemente si tienen algo que compartir -- bueno o malo.<br />
<br />
<b>Audiencia</b><br />
Recordar mantener el enfoque en la audiencia y no en el monitor local. Aunque es difícil, tratar siempre de ver al publico para ver si todavía están ahí :)<br />
<br />
<b>Código Fuente</b><br />
Falta hace que el código presentado este probado y que compile. En caso de algún error, indicarlo como "known issues". Es una buena práctica colgarlo en algún sitio. (Ver Google code o <a href="https://github.com/" target="_blank">github </a>).<br />
<br />
<b>Get Social</b><br />
Recordar tener abierto tu cuenta de Twitter para poder recibir preguntas y aceptar nuevas amistades.<br />
<br />
<b>Update</b><br />
Recordar que la audiencia de GTUG es una de las más motivadas por las nuevas tecnologías, por lo que si vas a presentar acerca de algún producto, conocer las ultimas versiones, etc.<br />
<br />
Cualquier otro punto que se les ocurra, es bienvenida.</div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8141545059608297144.post-36935484165661129902012-05-19T06:31:00.002-07:002012-06-15T04:46:50.995-07:00Presentación en Barcelona GTUG<div dir="ltr" style="text-align: left;" trbidi="on">
Paso a detallar los puntos que sugiero presentar para el GTUG de Barcelona en la próxima reunion. Cualquier sugerencia es bienvenida, así que si tienen alguna, solo basta que me envíen un email o que comenten en el blog.<br />
<br />
Título: <b>Implementando RESTful en GAE</b><br />
Cuando: <b>Miércoles 20 de Junio 2012</b><br />
Hora: <b>18:15h</b><br />
<b>Lugar:</b><br />FIB - UPC Campus Nord - Sala de actos B6 <br />
Calle Jordi Girona, 31, 08034 Barcelona, Spain <br />
08034<b> </b><br />
<br />
<b>Temario</b><br />
<br />
<ul style="text-align: left;">
<li>Repaso a configurar un proyecto Java en GAE</li>
<li>Uso de persistencia con JDO</li>
<li>Gestion de las instancias y servicios CRON</li>
<li>Configuración del plugin de maven para GAE y JAVA</li>
<li>Libreria RESTlet para Android y GAE</li>
<li>Ejemplos de implementacion en un sitio web real</li>
<li>Discutir patrones de interacción/sincronización con servicios RESTful</li>
<li>Manejo de Errores en la capa de comunicación </li>
<li>Uso de threads para mejor respuesta</li>
<li>Implementación RESTful en Android tomando en cuenta el ciclo de vida de una actividad</li>
</ul>
</div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8141545059608297144.post-87412691046302047542012-05-19T06:25:00.000-07:002012-05-19T06:25:01.630-07:00Controlling your Task Queues<div dir="ltr" style="text-align: left;" trbidi="on">
<div>
<b>Summary</b></div>
<div>
One of the key features in any framework for executing tasks (serializable and persistents) is how you can control them when things go wrong. This posting discusses some of the control panel of the GAE task queue. Details of the process is described in another article.</div>
<div>
<b><br /></b></div>
<div>
<b>Previous Work</b></div>
<div>
On my previous entry I wrote about the plans of creating automated tasks to process 130,000 transactions.Today I write about how things did not go as expected.</div>
<div>
<br /></div>
<div>
<b>Executing the Tasks </b></div>
<div>
Everything went out of control and very quickly. There were some important limits that I needed to respect in the Google Maps API. The most important wass the 120,000 transactions a day limit. With that I had no trouble. However, there must be a limit of transactions per minute that is nowhere published. With the limits in the GAE tasks I had no trouble.<br />
<br />
However, I realized that after processing around 800 transactions, the google Map API was giving me errors. When I looked at the log, I realized I had fullfilled the quota for the day. I initially expected the quota to be 2000 transactions a day. But whenever I started executing the tasks, I set the limit to 5 transactions a second. I quickly reached a total of 300 transactions a minute, thus fulfilling my quota.</div>
<div>
<br /></div>
<div>
Since I promised to my wife that I would have all the data processed by Thrusday, I started fearing that I had to sleep in the couch. The previous day I was bragging about all the computer power that I had available and today i had reached the maximum.</div>
<div>
<br /></div>
<div>
<b>Controlling the Tasks</b></div>
<div>
The console for the tasks in GAE is your best friend in this circumstances. Also make sure that during the different loads generated that you follow the best practices for loads.</div>
<div>
<br /></div>
<div>
The tasks api actually worked as expected but the Google Maps API was the first thing to break down. I had anticipated a processing of 200 </div>
</div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8141545059608297144.post-39492651125666253552012-05-14T23:00:00.002-07:002012-05-14T23:00:14.887-07:00Integration as a Service in the Cloud<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<div style="background-color: transparent;">
<b id="internal-source-marker_0.5778116923756897" style="font-weight: normal;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">It is no surprise that the new wave of system integration tools are being designed with the cloud in mind. What really surprises me is the easiness that allows a very heterogeneous environment seem completely simple to the developers that use it. This article discusses the latest features of Apache SMX Fuse (http://fusesource.com/) , a systems integration platform for the cloud.</span><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">For those who haven’t tried Apache SMX Fuse, it is an excellent integration solution. It is based on several Apache projects: CXF, HttpClient, Camel, Zookeeper, among others. And allows the integration of almost any type of system: via ftp, file, web service (SOAP and RESTful), email, plain text file, etc. We have use it for several projects and is a very powerful tool. </span><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Going back to the IaaS for the cloud, one of the most difficult things in configuring high reliable systems (clusters, pools, master/slaves, you name it) is the configuration management (CM) -- I am following here the SE Book from T-Systems. Some solutions like Oracle Weblogic are somehow better than others but at the end, when you are creating containers, app modules, shared libraries, etc it is very difficult to be error free. That’s why I was glad to see that the folks at SMX Fuse have applied some very good patterns:</span><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Inheritance</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">One of the pilars of Object Oriented Design, inheritance allows you to provide a very efficient configuration of modules. Based on Zookeeper (http://zookeeper.apache.org/), the Apache project, it helps you to be consistent and achieve excellent repeatability.</span><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Provide Different Sizes: Small, Medium, Large</span><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Why order a large pizza when you only need a slice? That’s definitely a problem when dealing with these high replication systems: they are usually really heavy and complex. Apache SMX Fuse now comes with different sizes that allows you to use just what you need.</span><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Bet on Auto-Discovery</span><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Yeah, we all have problems with the famous JNDI registry, but it is an start. I have seen some nice features of this integration platform that is really worth looking. An excellent fallout system that allows the delivery of messages through different routes: JMS, WebServices, etc. and do not even worrying if the system is on-premise or on-public.</span><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">The bottom line of CM for the cloud is to have zero downtime for the developers, reduce all the proliferation of dirty system (VMWare images everywhere ), and ease the rollout.</span></b></div>
</div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8141545059608297144.post-30860103930701089402012-04-29T07:07:00.001-07:002012-04-29T07:07:45.722-07:00preua<div dir="ltr" style="text-align: left;" trbidi="on">
hola</div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8141545059608297144.post-65928943076767899122012-04-02T01:59:00.001-07:002012-04-02T01:59:54.906-07:00Cloud Enhancement for your Smartphone<div dir="ltr" style="text-align: left;" trbidi="on">
<span id="internal-source-marker_0.9158576745179662" style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">A
couple of weeks ago I decided to develop an app intended to replace
our grocery list at home -- we normally keep all items in a sheet of
paper. The first alternative was to do the web app in HTML5 since
everybody is talking about the power of the new javascript libraries,
etc. so i couldn’t wait to implement it.</span><br />
<br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">For
the HTML5 version I developed a website (soon to be revealed to the
general public) that allows users to keep grocery items under control.
The website turned out to be more advanced than what I was expecting. It
has plenty of business logic. There were items that if labeled weekly,
would require a reschedule. There were other items that were “Reminder
Only” to be scheduled some day in the future. And there were some
other items that required a description in case there was a sale. Yes,
my wife and I went crazy with the design. Therefore, I kept all the
rules in the business layer and worked on the presentation layer
leveraging on html5 to reduce the development time. (I used GAE for the
cloud). </span><br />
<br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">The first HTML5 release was a <b>total failure</b>.
Although I did my testing, I did not realized how bad the 3G network
coverage inside the commercial center is. Each time I marked an item as
“checked out” it took forever for the connection to respond. I was
always lagging a couple of aisles behind my wife trying to keep up with
what had already been bought and what was pending. No wonder why I
marked that we had bought soy milk when in fact we did not! (We just
bought milk). </span><br />
<br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">So
it was time to go RESTful and do some more cloud enhancements. For the
new redesign, most of the data is kept local vs 100% online. At the
time the Android App is initiated, the app downloads the lists and the
items for the specific user. It then saves them in the local database.
The user then edits the items locally and syncs them at will. This
design proved to be better than the HTML5 version. It was faster and
more responsive. </span><br />
<br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;">Cloud Experience</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">It was pretty easy to set up the RESTful services in <a _fcksavedurl="https://developers.google.com/appengine/" href="https://developers.google.com/appengine/">GAE</a>.
Although they do not provide a framework for those services, the open
source community is pretty active on this area. I used <a _fcksavedurl="http://www.restlet.org/" href="http://www.restlet.org/">Restlet</a>,
a framework with a pretty light library and pretty active user
community, fresh documentation, and easy to use API. And because my
friends always complain that I use <a _fcksavedurl="http://python.org" href="http://python.org/"> Python</a>, this time I used Java for GAE. The Restlet Framework has customized a release for Android apps, too. I also noticed that <a _fcksavedurl="http://www.datanucleus.org/" href="http://www.datanucleus.org/"> datanucleus</a>, the persistence framework behind the <a _fcksavedurl="https://developers.google.com/appengine/docs/java/overview" href="https://developers.google.com/appengine/docs/java/overview">Java GAE</a>, also had RESTful interface but I did not use it.</span><br />
<br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">There are some factors to consider while exposing your RESTful services using the cloud. You have to think about the <b>warm-up</b>
period. Due to the nature of the cloud, most providers can put your
instance to sleep if there is no activity. When the instance is brought
back to life, your end user looses some precious seconds loading
content. So I activated the warm-up functions in GAE and also updated
some of the cron definitions for activating my persistence manager.
After that the response time was down from 10 seconds to 600 ms. Huge
improvements.</span><br />
<br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;">Other Frameworks</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">I
was amazed at how many frameworks are there for Android and iOS cloud
offerings. There are companies that give you an SDK and basically you
can store all your data in their cloud for a fee. They take care of
caching, serialization, security, geolocation, and performance. Funny
because those are the same services that you already get from GAE or <a _fcksavedurl="http://www.windowsazure.com/es-es/" href="http://www.windowsazure.com/es-es/"> Azure</a>. Some of the companies that I checked were <a _fcksavedurl="https://www.parse.com/" href="https://www.parse.com/">Parse </a>, <a _fcksavedurl="http://cocoafish.com/" href="http://cocoafish.com/">Cocoafish </a></span><a _fcksavedurl="http://cocoafish.com/%29," href="http://cocoafish.com/%29,"><span style="background-color: transparent; color: #1155cc; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline;">,</span></a><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"> <a _fcksavedurl="http://urbanairship.com" href="http://urbanairship.com/">Urban Airship</a> </span><a _fcksavedurl="about:blank" href="about:blank"><span style="background-color: transparent; color: #1155cc; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline;">,</span></a><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">and <a _fcksavedurl="http://www.kii.com/" href="http://www.kii.com/">Kii Cloud</a></span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"> to name a few.</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;">Conclusions</span><br />
<span id="internal-source-marker_0.47346323591875417" style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">There
is definitely an advantage in going cloud for Smartphone apps. One of
the key factors for the clod storage is that most datastores are NoSQL.
Therefore, your schemas can be modified without the pain of foreign
keys or any restrictions which is great for the release cycle of
Smartphone Apps that usually is every two weeks. So it is a very good
solution.</span></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8141545059608297144.post-16998011640799853002012-01-26T10:49:00.000-08:002012-01-26T10:51:24.849-08:00Android developmentThese days I'm mostly developing Android apps. We'll see how it goes.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8141545059608297144.post-46430930115667751472011-04-12T10:39:00.000-07:002011-04-12T12:16:45.273-07:00Effective Management: Which are the most valued traits in my bossRecently, I read an article about Google's efforts inside to determine what makes a good manager. I was struck to find out that technical expertise did not rank among the top attributes of a good manager. Given my technical background, this remark sounded counter intuitive. Reflecting upon the article and remembering my former bosses, I changed my mind and agreed with it.<br /><br />The most successful managers I had were not the techiest but instead the ones who: (1) gained an excellent understanding by just asking a few good questions, (2) those who related to the team, (3) and supported the professional development of the people they had in charge.<br /><br />At least those are the main traits for me. Let me hear what do you have to say<br /><br /><iframe width='520' height='350' frameborder='0' scrolling='no' marginheight='0' marginwidth='0' src='http://www.pieall.com/e/e962117/'></iframe>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8141545059608297144.post-81174804251238219662011-03-09T05:28:00.000-08:002011-03-10T05:02:12.480-08:00Standarizing Spanish Coffee and BeerTwo of the most common drinks in Spain: beer and coffee, present one of the most frequently confused terminology. In different Spanish cities, the same word will mean different things. This article discusses these frustrating differences.<br /><div><br /></div><div>First, starting with the basic: coffee with milk has a different meaning in <span style="font-weight: bold;">Barcelona </span>than in <span style="font-weight: bold;">Seville</span>. In Barcelona it is served in a coffee cup but in Seville it is served in a tall transparent glass. Transparency seems to be crucial because that's how the e<i>xperienced drinker</i> can distinguish the amount of milk with the coffee. A variant of the macciato, "el cortado", is also interpreted differently in the country's capital. In <b>Madrid </b>I ordered one and it looked like the coffee and milk served in Barcelona. In <b>Pamplona </b>and <b>Barcelona </b>it is served in glass a little bit taller than a shot glass -- if they don't, it is because the bar tender considers you a "<a href="http://en.wikipedia.org/wiki/Guiri">guiri</a>" so make sure to demand one like the locals do!</div><div><br /></div><div>If things are difficult to manage with coffee, imagine the <b>beer </b>problems. One of my summer favorites is a refreshing drink called "clara": half-lemon half-beer that it is easy to order in Barcelona. However, if you order "clara" in perfect Spanish in Pamplona, the bar tender will not understand. You would have to order "lemon and beer" in order to be understood. A "tubo" is half a pint in Madrid and a "caña" is half a pint in Barcelona. [expandir]. I may sound like an expert but I always have problems ordering a real "cerveza" because it gets confused with the small size "caña". I have to emphasize, "yes, the big one" -- and wonder if the bar tender understood. My wife who is from Spain, always makes fun of my nervousness on the matter. </div><div><br /></div><div>Yes, I have to publicly admit my uncertainties when ordering drinks in Spain even though I speak fluent Spanish and I have lived in Barcelona for over 8 years. The next time the government decides on standardizing shoe sizes, I'll promote the drinks standard.</div><div><br /></div><div><br /></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8141545059608297144.post-77940108585055672352011-02-23T21:50:00.000-08:002011-02-23T22:27:51.461-08:00Innovation through Personal ProjectsWorking in an industry were innovation is key, I believe we should always find ways to foster new ideas. My suggestion is to apply the idea of <span style="font-weight: bold;">Google </span>in this company and allow employees to dedicate 20% of their time to a personal project. This blog entry analyzes how this initiative could benefit the company.<br /><br /><span style="font-weight: bold;">Sponsoring </span>this competition will add excitement to the idea. On one side, we can classify the projects in different market segments. On the other side, we can invite our <span style="font-weight: bold;">clients </span>in those segments to be judges of the projects. For me this is an excellent way to showcase talent and do some branding. Furthermore, it is a great opportunity to increase sales.<br /><br />As cheap as it sounds the <span style="font-weight: bold;">prizes </span>could be items that the company currently owns. For example, free days of vacation, more the RAM, an extra monitor, or free data roaming for your smartphone. Please no ipads, they are a cliche.<br /><br />I believe this idea will encourage everybody to come up with new developments. But let me know what do you think.<br /><br />Any takers?Unknownnoreply@blogger.com0