Pages

Saturday, February 25, 2012

How Two Startups Use Games to Beat the Developer Crunch



Published on ReadWriteWeb | shared via feedly mobile
Basketball.jpg"You can't judge if someone is one of the best programmers in the country in 1 minute, but it turns out you can in 5 minutes."
Good software developers are hard to find. Startups are all about finding creative solutions to common problems - so why not this one too?
Two startups that have found creative and interesting ways to solve their developer shortage problems are travel photo network Jetpac and app search startup Quixey. Both used contests and games to overcome their challenges and get access to the high-level coding talent they needed. Their efforts may illustrate a part of what people call the gamification of work that's expected to be a big part of the future.

Hibernate mapping


<hibernate-mapping>
    <class name="com.GamersCom.domain.Group" table="accesslevel" catalog="gamers">
        <id name="level" type="java.lang.Integer">
            <column name="level" />
            <generator class="identity" />
        </id>
        <property name="name" type="string">
            <column name="name" length="45" not-null="true" />
        </property>
        
    </class>
</hibernate-mapping>

With "catalog" property, Hibernate will generate HQL like this.

Hibernate: select group0_.level as level1_, group0_.name as name1_ from gamers.gamers.accesslevel group0_




Exception: table is not mapped


INFO: HHH000397: Using ASTQueryTranslatorFactory
org.hibernate.hql.internal.ast.QuerySyntaxException: users is not mapped [from users]
at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:180)
at org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:110)
at org.hibernate.hql.internal.ast.tree.FromClause.addFromElement(FromClause.java:93)
at org.hibernate.hql.internal.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:326)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3252)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:3141)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:694)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:550)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:287)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:235)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:248)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:183)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:101)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:119)
at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:215)
at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:193)
at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1649)
at com.GamersCom.dao.UserDAO.listUser(UserDAO.java:27)
at com.GamersCom.app.main.main(main.java:22)


User.hbm.xml
<hibernate-mapping package="com.GamersCom.domain">
    <class name="User" table="users" >
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="identity" />
        </id>      
    </class>
</hibernate-mapping>

UserDAO.java

public List<User> listUser() {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction transaction = null;
List users = null;
try{
transaction = session.beginTransaction();
users = session.createQuery("from users").list();
transaction.commit();
} catch (HibernateException e) {
if (transaction != null )
transaction.rollback();
e.printStackTrace();
} finally {
session.close();
}
return users;
}



Solution:

In HQL you work with objects not with tables!

users = session.createQuery("from User").list();


Exception: Could not bind factory to JNDI


WARN: HHH000277: Could not bind factory to JNDI
org.hibernate.service.jndi.JndiException: Error parsing JNDI name []
at org.hibernate.service.jndi.internal.JndiServiceImpl.parseName(JndiServiceImpl.java:92)
at org.hibernate.service.jndi.internal.JndiServiceImpl.bind(JndiServiceImpl.java:108)
at org.hibernate.internal.SessionFactoryRegistry.addSessionFactory(SessionFactoryRegistry.java:89)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:464)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1740)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1778)
at com.GamersCom.util.HibernateUtil.buildSessionFactory(HibernateUtil.java:21)
at com.GamersCom.util.HibernateUtil.<clinit>(HibernateUtil.java:15)
at com.GamersCom.dao.UserDAO.listUser(UserDAO.java:22)
at com.GamersCom.app.main.main(main.java:20)


Hibernate.cfg.xml
<hibernate-configuration>
<session-factory name="">
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.password">password</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/gamers</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.default_schema">gamers</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>

<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>

<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>

<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>

<mapping resource="com/GamersCom/domain/User.hbm.xml" />
</session-factory>
</hibernate-configuration>

SOLUTION:
     remove "name" attribute from session-Factory. It is not required unless you want to bind SessionFactory to JNDI.



Friday, February 24, 2012

Useful Eclipse Templates for Faster Coding

from:  http://fahdshariff.blogspot.com/2011/08/useful-eclipse-templates-for-faster.html
 
I wrote about my Eclipse code templates a few years ago and since then I've made a quite a few changes to them. I've added a few new templates to help with JUnit tests and xml parsing. I've also updated my existing file IO templates to use Java 7 features.
Templates are simply "magic words" or shortcuts to standard blocks of code or text. They are very handy because once you have them setup you don't have to waste time writing boilerplate code any more! An example of a pre-defined template in Eclipse is sysout which expands to System.out.println();. All you have to do is type sysout followed by Ctrl+Space to insert the statement into your Java source file.

Thursday, February 23, 2012

How to Turn an Obstacle into an Asset


Published on HBR.org | shared via feedly mobile

A popular post on this site, Nine Things Successful People Do Differently, provides a fabulous summary of what makes the difference between those who succeed and those who don't. But, in our experience, it misses one really important "thing': Successful people habitually turn obstacles into assets.

People who succeed at work and in life believe and act as if "everything is a gift." Well, maybe not every single thing imaginable. But assuming that everything is a gift is a good way of looking at the problems and surprises you'll encounter in any endeavor, such as, for example, in getting a new venture off the ground, obtaining buy-in with your boss, or launching a new product line in an ultra-competitive market.

Why should you react to a problem with gratitude, whether you are trying to start a business or create anything else? There are a number of reasons.

First, you were going to find out eventually what people did and did not like about your idea. Better to learn it as soon as possible, before you sink more resources into the idea, venture or product line, etc.

Second, the feedback could take you in another direction, or serve as a barrier to your competitors. You thought you wanted to open a restaurant, but a quick survey told you potential customers thought the area was saturated. But more than a few of them said they would love a place that simply had ready-to-go take out to heat up at home.

Third, you got evidence. True, it was not what you were expecting or even wanted, but that still puts you ahead of the person who is just thinking about doing something (like opening a restaurant in your neighborhood.) You know something they don't, and that is an asset. You are ahead of the game.

But what if it's really bad news. It's a disappointment. You were absolutely certain that your boss would approve your idea for a new software program, and she said no in a way that is still echoing down the corridor. No reasonable person can define what you've encountered as anything but a problem, and most people will try to solve the problem. ("Maybe she will like the idea if I go at it this way instead.") That's fine if you can. The problem has gone away and, again, you've learned something that others might not know. (The boss hates Y, but she loves Z.)

But what if you can't solve it? (She hated "Z," too.) Accept the situation to the point of embracing it. Take as a given that it won't ever change, and turn it into an asset. What can you do with the "fact" that it won't ever change? Maybe it presents a heretofore unseen opportunity. Maybe you build it into your product or service in a way that no competitor (having not acted) could imagine. Could you do it on your own? Could you take the idea to a competitor and use it as your calling card to look for the next job? Instead of resisting and lamenting it, treat it as a gift and turn it to your advantage.

For a quick exercise showing that this is easier than you think, take a sheet of paper and divide it into three columns. In the left-hand column, list the obstacles and problems that are keeping you from your goal. Then spend five minutes figuring out as many ways as possible to solve these problems, and list those in the middle column. Show your list of problems and solutions to a friend, and ask them to build on your solutions. When you can't think of anymore solutions, go back to the list of problems in the left-hand column and assume that they can't ever be solved. Now take five minutes with your friend and figure out how those problems could be an asset or an unrecognized opportunity. Put these assets in the right-hand column. Chances are good that, having completed this exercise, you'll turn at least one of your obstacles into an asset.

The thing to remember is this: Successful people work with what they have at hand — whatever comes along — and try to use everything at their disposal in achieving their goals. And that is why they are grateful for surprises, obstacles, and even disappointments. It gives them more information and resources to draw upon.






Sent from my iPhone

Sunday, February 19, 2012

Why Your Business Must Go Social [Infographic]


Your grandma is probably on Facebook by now. So why on earth isn't your business?

It's time to get real, and come to terms with the fact that social media networks are not just for teenagers anymore. Even setting up something as simple as a customized Facebook fan page can enhance your brand online. Studies show that socializing is important for maintaining a happy and a healthy lifestyle. So it kinda makes sense that the same holds true for businesses, no?

Read on for some cold hard facts about why social networking is a must for you and your company.

Shared by our friends from Wix!

your wix business must go social
Via: Wix.com




Sent from my iPhone

Cool private companies: Growing e-commerce firms


Published on VentureBeat | shared via feedly mobile

As a software securities analyst for investment banking firm Canaccord Genuity, Richard Davis spends 200 days a year on the road visiting companies. He goes to public companies such as Oracle and Salesforce.com, but he also visits up-and-coming software companies he thinks will go public in the near future.

ChannelAdvisor: Aiding online retailers

I've known this company for several years, and during that time I've watched the firm mature and evolve. Several years ago, ChannelAdvisor was tightly focused on the eBay eco-system. Since then, the firm has emerged as a global aid for online retailers, helping them efficiently reach prospects.

This means ChannelAdvisor helps firms manage multi-channel outreach, whether that is down the street or on the other side of the globe. In 2010, the firm managed $2.8 billion in gross merchandise value from leading retailers like Saks, Dell, and Brookstone, and 30 percent of Internet Retailer Magazine's Top 500 online retailers. It seems to us that Channel Advisor is a company on the move. We plan to pay much closer attention to this firm over the next few years.

Approximate size: $50-100 million in revenues.

Chegg: Digital textbooks, book rentals, and more

Chegg is much more than textbook rentals. The firm offers e-textbooks, course information, reviews and in some instances notes from a few dozen colleges. In addition, the company offers homework help. Basically, the firm is emerging as a go-to source of content (books, notes, comments, grade distribution, etc.) and coursework help. That seems like a viable plan for a big business to me.

I caught up with a Chegg board member recently and we spoke a bit about how the firm is single-handedly saving students millions of dollars on egregious textbook costs. I know this is true from personal experience with my children at college; textbook prices are way too high for the amount of updating that occurs year to year.

Approximate size: >$100 million in revenues.

Gift Side Story: Helping guys buy gifts

I arrived at Buck's in Woodside a few minutes early for my breakfast with a long-time friend. I saw another fellow advance to the door at the restaurant, which was locked. He circled back, came up, and said hello. "Hey, I'm meeting some VCs around here for the first time and I was wondering if I should be wearing a suit or not?" I said no, unless he was a financial services software firm or he was going up to San Francisco proper where some people wear sport coats. He thanked me and I asked him what the name of his company was. "Gift Side Story," he said. His name was Ankur Jain.

Jain said his company was a website that helped guys figure out what gifts they should get for their wives or girlfriends. You fill out a brief questionnaire about your significant other's preferences and the software provides you with recommendations. It has a self-learning component that is designed to formulate better results based upon the more information that is put into it in terms of questions and responses to actual orders. There is also a real-time chat function available if you get really stuck, which is a nice touch.

You pick an item from the recommendations and it takes you to the site's checkout page. Input your credit card info and presto, the gift wrapped item is on its way! The prices looked good with discount banners indicating 10-50 percent off deals.

Richard Davis is managing director of enterprise software for the brokerage firm Canaccord Genuity. Before joinging Canaccord, he spent 10 years as a senior analyst at Needham & Company. Previously, Davis was at Tucker Anthony, where he launched the firm's Internet and enterprise software coverage.
Filed under: , VentureBeat




Sent from my iPhone

HOW to generate Hibernate mapping file and annotation code from database automatically


from: http://www.mkyong.com/hibernate/how-to-generate-code-with-hibernate-tools/

In this article, we show you how to use Hibernate / JBoss Tools to generate Hibernate mapping files (hbm) and annotation code from database automatically.
Tools in this article
  1. Eclipse v3.6 (Helios)
  2. JBoss / Hibernate Tools v3.2
  3. Oracle 11g
  4. JDK 1.6

1. Hibernate Perspective

Open your “Hibernate Perspective“. In Eclipse IDE, select “Windows” >> “Open Perspective” >> “Others…” , choose “Hibernate“.

Saturday, February 18, 2012

How to allocate more memory to Eclipse


Many users seem to have problems with running out of memory when using Eclipse 3.2 in combination with additonal plugins such as those from JBoss Tools or even Eclipse WTP.
For those who just want the solution scroll down to the bottom, you can skip my “rant” about it.

Friday, February 17, 2012

Reverse Engineering a SQL Server Database

from: http://www.cbe.wwu.edu/misclasses/mis431s05/431ReverseEngineer.asp
Reverse Engineering a SQL Server Database in Visio is a quick and easy way to document your work. These instructions refer specifically to Visio Professional 2002 SP-2, which is installed on the MIS notebook computers. Before starting this process, I recommend that you connect to the instance of SQL Server that contains your database. The process is explained in the handout Server Registration.
Start Visio. Normally, you will see the “Choose Drawing Type” dialog (see below); choose “Database” as the Category, then the Template “Database Model Diagram.”

Wednesday, February 15, 2012

Reverse-engineer Source Code into UML Diagrams

I have been on several teams where we studiously designed UML diagrams at the beginning of the project. As the project progressed, and deadlines approached, the UML diagrams were left somewhere behind, not to be updated in months. When a new developer joined the team, we showcased the old UML diagrams, and kept telling "Oh, we never had time to update them, please see the source code to get an idea. And, don't hesitate to ask if you have any doubt's". I am sure, you all have gone through the same scenario.
However, we don't have to keep making up stories anymore, since this article shows how easy and simple it is to include UML diagrams within your Javadoc and also keep them updated with every change in the source code repository. We can do these in less than a few minutes, and in a few simple steps.
Getting started with UmlGraph takes five steps:

Tuesday, February 14, 2012

Is Apache Tomcat an Application Server?

from: http://www.tomcatexpert.com/blog/2010/06/09/tomcat-application-server

 In a word, Yes. Tomcat is an "Application Server" for certain types of applications, including a large percentage of the applications being developed today. The answer depends, of course, on your definition of “Application Server”. It also depends on whether you think Tomcat is limited to the Apache Tomcat Project, or whether Tomcat also includes all the add-ons and plug-ins that have been made available through open source or commercially.
In any case, I assert that Tomcat is indeed an Application Server, all by itself. Tomcat becomes a much richer Application Server as you modularly (the only sane approach, IMHO) add functionality as required by your specific application.

So, what’s an “Application Server”?

Sunday, February 12, 2012

How to remove an update site for Eclipse IDE



When installing plugins you enter the update site url; but sometimes the url is wrong and you want to remove it from update sites list.
1 Choose : Help >Install new software

2. Go to  Available Software Sites and select the site you want to remove or edit

3. Click Remove button if you don't need that update site; Click the Edit button if you want to change the Name and the location.
 

4. Click OK

2012 年给创业者的 10 点建议



在 互联网创业浪潮中,最成功的往往不是最优秀的,而是那些最能抓住机遇的。每一个时代都有它的特征,尤其是这个瞬息万变的互联网时代。如果能抓住机遇,即使 你做的不够优秀,也会被互联网的浪潮推着前进。因此,总结一下2011年的经验,把握好2012年的机遇,应该是每个创业者进入2012年必上的一堂课。
以下10条建议,是给那些创业公司或者小企业提供的。当然,并不是每一条都适用,也并非每一个创业公司都应该这样做,仅供创业者参考。
1、做小企业。想让你的心里上客户支持小企业?那首先就要有小企业的心态。分析你的服务商和客户,如果能够以小企业的形式发展的话,那就最好不过了。因为小企业会更加灵活、专注性更高,因此也会更容易盈利。
2、向移动互联网发展。移动互联网时代已经到来,Google搜索中有15%是通过手机等移动设备完成的。如何满足未来越来越多的手机用户的需求?这就需要你调整方向,在各个方面都要考虑一下移动用户了。
3、本地化是趋势。移动互联网让本地化特征更加明显,微软报告说在bing搜索的手机用户中,53%的搜索有本地化特征。连接本地的商户或服务已经成为非常重要的一个因素,对于创业者来说,本地化是方向,即使你提供的产品和本地化没任何关系,也要知道这一点的重要性。
4、懂得授权并善于授权。刚开始创业都非常艰难,创业者凡事亲力亲为,自然会把一块钱掰成两块花。但是,创业过程中有些钱是必须要花的,比如把自己不擅长的外包出去、支付一起创业的伙伴酬劳等。要懂得如何授权,放手让其他人做,并专注你擅长的事情,这样才会更有效率,并有可能尽快实现盈利。
5、尝试接触客户的新方式。不管是网站、微博、社交网络、二维码还是手机短信,每天都会有各种各样新的联系方式联系方式产生。这也是一种机遇,即使不知道所有的新方式,也要尽可能的去通过各种方式寻找你的客户。从现有的客户那里了解一些,然后花点时间努力去开拓更多的客户。
6、不断改进网站。即使通过各种社交工具去取悦你的客户,也不要忘了你的网站。毕竟,网站才是你吸引客户的最终目的,漂亮的社交网站主页并不会给你带来多少流量。要想留住真正的客户,时刻完善你的网站才是最最重要的。
7、成立公司,用法律保护你的资产。虽然成立公司可能和你的工作没有半点儿关系,但公司却能以法律的方式保护你的财产和权益。即使在公司破产的时候,也能保护你的正当权益,更不用说公司要被收购或上市了。
8、提前准备好纳税。不要等到最后一分钟才开始准备税务方面的文件。从创业的那一天起,就要时刻记录着你的财务情况,而不是等到融资或上市前才去请一个CFO。创业刚开始的时候,即使你对财务一窍不通,也要学一些基本的财务知识,做好最基本的财务工作。
9、社交网络在向现实社交发展。虽 然2011年是社交网络异常火爆的一年,也有人说2012将是垂直社交的天下。但你要记住,只有虚拟社交和现实社交结合起来,才能给你带来真正的效益。未 来的社交会从线上走到线下,网络社交将只是一个辅助产品。所以,努力去做一些线下的社交活动,这不管是对你还是客户都是有益的。
10、规划好你的时间。作为一个创业者,你要有相当强的自制力去保证自己的积极性、工作效率和幸福感。没有老板会在屁股后面催促着你,所有的动力都来自你的创业激情。在接下来的一年,为自己定一些目标和期限,迫使自己努力去完成。可能需要无数个加班,但这就是创业。(当然,也要锻炼身体)
via Mashable

iPhone4 on pure CSS3


在老外这个物种中从来不缺乏代码大神,这不竟然有个胖友使用CSS3 代码模拟出了绚丽的 IOS 界面。目前的功能有:开机,关机 ,滑动解锁等,而且竟然不使用任何图片!只使用了3395行 CSS代码 与 335行 JaveScript。赶紧去瞻仰一下……

2012年开发者该做的11件事



2011年即将结束,2012正在靠近。你是否在专业领域给自己设定2012的目标?不管你的答案如何,我相信下面列出的11条建议里面总有一两条适合你 :)

1. 使用Twitter - 如果你是一名程序员,如果你还没有使用Twitter,你就out了。不是说你有多少粉丝,而是在Twitter上你可以更快的得到问题的答案,获取你关注的话题的最新资讯。 (作者没有考虑到天朝的程序员们
2. 经常阅读 StatckOverflow - StackOverflow是提问编程问题最好的地方。即使你没有账号,它也值得你去浏览,学习。(良好的英文阅读能力是程序员的必要素质,哈哈!)
3. 开始写博客 - 我认为每一位开发者都应该写博客!因为博客可以记录我们学习进步的轨迹,可以让别的开发者参考。写博客让你和别人更多的交流。还有,写博客可以提高你的技术社区的知名度。(OSChina的博客正在酝酿改版,等改完了欢迎给位来开博!)
4. 参加线下活动 - 从你的“shell”里面走出来吧,多参加线下的沙龙、活动、会议。和别的开发者交流可以让你在这个领域建立自己的人脉网络,这对你在这个领域的成长很有好处!(欢迎各位来参加OSChina线下活动~)
5. 使用现代化的智能手机 - 作为一名开发者如果你还在使用老土的山寨机,你得赶紧升级了。我还记得有一次跟一个经理聊天的时候,他得走回作为才能给我发邮件,我就在想“这哥哥是做IT的吗?”。正如有些行业你必须开好车,穿亮丽的衣服一样,我们干IT的就应该站在技术、硬件的前列!
6. 拥抱移动互联网 - 移动互联网的大潮才刚刚开始。你不仅需要知道如何为iPhone, WP7, Android开发应用,你也需要学习如何创建可以在任何一台移动设备上运行的网页程序。
7. 学习至少一种设计模式 - 我无法告诉你应该学习哪个设计模式,但是你至少得学习一种。我个人倾向于MVVM,因为我是Sliverlight/WPF/WP7开发者。
8. 每年设定可行的目标 - 创建一个简短的列表,记录你下一年想要完成的目标。同时你也应该按照季度来检查目标的完成情况。你可以用Gmail Reminder来提醒你自己~
9. 学习不同的编程语言 - 简单来说,学习新的语言可以拓宽你的视野,可以让你对计算机和编程语言是如何工作的有更深的了解。“如果你只有锤子,那么所有的问题在你看来都只是钉子”。
10. 增强自信 - 很少有程序员对自己很自信。如果你觉得你哪里弱,那你就去增强那里。互联网上有大量免费的资源可以让你学习各种只是,弥补你的弱项。
11. 阅读博客,技术书籍、杂志 - 你读过几本编程书籍?杂志呢?我相信一名好的程序员每年至少阅读5本编程书籍。不读书怎么进步呢?
原文链接 转载请注明来自OSChina.NET

为设计师和开发者提供的 50 个免费的在线工具



Logotype Maker
Logotype Maker 是一个简单而且免费的 Logo 制作工具,可以通过简单的几步来创建一个 logo

给网页开发者的20个有用的Firefox插件


Firebug


Web Developer


Pixlr Grabber


FireFTP


ColorZilla


Codetch


Greasemonkey

FireShot – Webpage Screenshots: Capture + Annotate


MeasureIt


GridFox – The Grid Layout Firefox Extension


OperaView


Window Resizer


IE Tab


Palette Grabber


Console⊃2;


Font Finder


IE NetRenderer


Yahoo! YSlow for Firefox


SeoQuake SEO extension


Total Validator


Server Switcher

 from: http://www.oschina.net/news/24494/20-firefox-plugins-for-web-developers