Archive for the ‘Languages’ Category

Interactive Application Development for IPTV

Thursday, May 8th, 2008

Presented by Ronan McBrien and Sourath Roy, both from Sun Microsystems. The highlight of the show for me? Seeing the Sun Media Receiver. Not much information about it, except from the Sun Labs Open Day.

  • Sun Media Receiver (developed at Sun Labs, now maintained by ISV Engineering). Sun make a PVR? Cool.
  • RISC Processor (150-300MHz, predominantly MIPS, some ARM), memory, HDD optional, Ethernet port, USB, IR (remote control), Video output (SD, S-Video, composite, or HD, via HDMI connectors), hardware codecs (MPEG2, MPEG4-2, H.264)
  • Makes use of the Java Media Framework API
  • Can also expose talking to a SIM/smart card through the Java APIs, for security in your IPTV hardware

Uing DTrace with Java Technology Based Applications: Bridging the Observability Gap

Thursday, May 8th, 2008

Presented by Jonathan Haslam, Simon Ritter, Sun Microsystems

In what I thought was completely great showmanship between Jonathan Haslam and Simon ritter, it was simply, pure comedy, having the two of them on stage. No reason to go deeply into notes (as the verbose slides are available), but the actual demonstration, the writing the code on stage, and the dynamics between the two - that made this session pure gold to attend.

You can ask a system to panic with DTrace if you want!

Some terminology:

  • Probe: place of interest in the system where we can make observations
  • Provider: instruments a particular area of a system, and makes probes available. Transfers control into DTrace framework when an enabled probe is hit
  • Aggregation: patterns are more interesting than individual datum, so aggregate data together to look for arrays. Generally an associative array

DTrace has a PID provider, to look at applications based on PID

dvm provider is a java.net project to add DTrace support in. Install a new shared library, and make sure its in the path.

DTrace in JDK6 exists as a hotspot provider. No need to download a shared library. Its also more feature-rich.

Project DAVE (DTrace Advanced Visualisation Environment) was demoed. Also note that there’s chime.

Free and Open Source Software: Use and Production by the Brazilian Government

Thursday, May 8th, 2008

First up, I want to say, I’m truly impressed with Brazil. One day I will visit this amazing place, and spread the good word of open source with projects that are close to my heart: MySQL, OpenOffice.org, Fedora, and in due time, a lot more. This is a live-blog, from a most interesting talk, at JavaOne 2008. As I wrote on Twitter, “Brazil, simply impresses me. Their use of open source in government, makes me think that the rest of the world has a lot to learn from them”.

Free and Open Source Software: Use and Production by the Brazilian Government
Rogerio Santana <rogerio.santanna@planejamento.gov.br> +55 61 313 1400, Logistics and Information Technology Secretariat
Planning, Budget and Management Ministry
Brazilian Government

Households with Internet access: 70% in the US4k household income range. 70% of households have mobile phones (even when total revenue is USD$2k). Middle and upper class are all, generally on the Internet.

In 2007, 98% of Income Tax has been sent by the Internet. By 2009, there’s only going to be use of a Java application for this. About 17.5 million people filed via the Internet. Impressive.

Brazil has 142k public schools - 26k are connected to the Internet now (18%), and 92% are connected at low speed, while 8% have 512kbps connections.

Plan? Free Internet for schools, from 2008-2025. 1mbps for each connection, growth plans in the next 3 years.

There exists Computer Reconditioning Centres (CRCs) for recycling PCs.

www.eping.e.gov.br (e-PING: e-Government Interoperability Standards)
www.governoelectronico.gov.br (e-MAG: e-Government Accessibility Model)

Brazil has been using electronic voting since 1995. 136.8 million people voted in 2006 election. Next version of vote machines will use GNU/Linux!

Open Standards. Interoperability. Free Software. Free License. Community.

e-PING: uses XML, browser compliant, they have metadata standards

Many organisations of the Brazilian Government use Java as a primary development platform. Remember, Java is important because its the first that allowed even Linux users to interact with government applications.

Brazilian Digital Television? Middle-ware responsible for the interactive process of digital TV also developed in Java. (Ginga is the name of the application).

In education? Enrolment is done via the Internet for universities. e-Proinfo is an e-learning project that has already trained 50k students.

Developing clusters and grids, with focus on high availability, load balancing, database replication, distributed mass storage, and virtualization. The government is backing this, since 2006.

Miguel de Icaza from Mono on Moonlight

Sunday, April 13th, 2008

Miguel de Icaza from the Mono project, tells us more about Moonlight, and where the Mono project is headed, at LugRadio Live USA 2008.

- shows us about Silverlight 1.1 (Moonlight is the Mono equivalent)
- works a charm in Firefox, but there’s issues with the implementation in IE (something JavaScript related)
- Demos the chess application
- Microsoft will provide a Media Pack (they will incur the licensing costs for the media codecs) for all Moonlight users on Linux. Microsoft will also provide regression test suites, and complete specifications for implementation. Novell will deliver a 100% compatible Moonlight and will support it on all major Linux distributions (contractually, only the top 3 Linux distributions - no mention of what the top 3 are). This is the Microsoft/Novell agreement, as of last September 2007.
- The codecs come with a restriction - you can’t use it outside Moonlight. Its only for the in-browser experience. If you use Totem, you’ll need to make use of gstreamer, etc…
- The MSPL is better than the X11 license. Miguel would like to change the Mono license to the MSPL, but everyone that hates him now, will hate him more because of the “Microsoft” substring! Why is the MSPL better? It has a patent clause, so that the code you use there, if covered by a patent, you will not be sued, ever. That in a way, is similar to the Apache license.
- Self-contained applications - traditional GNU software is spread out, quite unlike Mac OS X applications where you drag an application into the Applications folder, and everything is contained in one directory. Mono has an application guideline, where everything is also in one directory.
- Like all good demos, something broke. Miguel starts debugging on stage, and fixes the problem, and the demo works!
- “Programmers have no taste for design”
- “I have a roadmap, but I don’t think anyone gives a fuck, so lets just go to questions”
- How long will it take to get mixed-mode assembly working? If you are Chris Toshok, it will take 2 weeks. If you’re not, definitely longer. He spoke to Dan Kegel from the WINE project :) Patches are being accepted… The aim is to allow WINE to run Windows applications on a fully open source stack

Technorati Tags: , , , , , , , , , , ,

Selenium at the MyOSS meetup

Friday, April 4th, 2008

I was at yesterday’s MyOSS meetup, and the topic was on the Selenium Web Testing Framework, presented by Yuen-Chi Lian. Here are some notes, and hopefully the slides and code make it up to the website soon.

- Java guy, who is a MyJUG guy
- Employed by CustomWare Asia Pacific, and is experienced in JIRA, Confluence, and Mule (are they an Atlassian reseller?)
- He started web development using PHP. Didn’t do unit tests then. As he started to do web development again, 2 years ago, he found that JIRA guys used Selenium to test their web UI. He started Selenium, last week :)
- A Common Web Development flow: analysis, design, development, then its testing… Unit test, integration tests, and acceptance tests using Selenium
- for web UI testing, Selenium helps you invoke a JavaScript method, rather than clicking a button to trigger it… These tests can be recorded and scripted. You can do it in a simulated browser environment, or use a real user agent
- He hasn’t tested Sahi yet, but he thinks its better than Selenium, based on the blogs that he’s read
- Selenium can be integrated with Continuous Integration (CI)
- Lots of examples using Java and Ruby
- Imagine doing FOSS development, on the Windows platform. It actually looks scary…

Overall, a rather basic talk, with a highly motivated/dedicated speaker. This being my second talk that I’ve attended on Selenium (last year at the Ruby Conf), and now, its pretty cemented in my head that I’ve got to make use of it, the next time I write a web-front end. Oh, it has great Firefox integration, with the Web Developer Tools plugin…

After that, it was off to Pelita for dinner. This ended up becoming supper, and there was lots of chatter… Drive home was eventful - on the way to Puchong, to send KageSenshi back, got pulled over twice - once for a license inspection, once to find out where we were headed. Odd. This has never happened before.

Technorati Tags: , , , , , , , ,

Hitchhacker’s Guide to the MySQL Conference - Ruby/Ruby on Rails Edition

Monday, March 31st, 2008

The Hitchhacker’s Guide to the MySQL Conference
Ruby/Ruby on Rails Developer’s Edition
Following on from the excellent Hitchhacker’s Guide to the MySQL Conference - PHP Edition by Jay Pipes, I’m doing one for the Ruby and Ruby on Rails developer in you. If you haven’t registered yet, remember, I can provide you a 20% discount code, so make sure you get it from me, via emailing me. Tutorials, are selling out, fast.

The Keynotes
A Head in the Cloud - The Power of Infrastructure as a Service is a keynote delivered by Werner Vogels, CTO of Amazon.com. Why would the typical Rubyist be interested in this? Clearly because of the fact that many sites, end up using Amazon Web Services to scale. An example, being Twitter, whom store a lot of data on AWS, and we all know they’re written using Rails.

While the other keynotes aren’t Rails specific, they are a great start to the day, and interesting announcements tend to be made before or after a keynote, so wake up early! Yes, even if you were at a BoF till 2am in the morning…

Tutorial Day (Monday, 14 April 2008) - schedule
My recommendations would include going to the MySQL Replication Tutorial by Lars Thalmann and Mats Kindahl, in the morning, as this is a great way to ensure your Rails application scales. This can be followed by either Memcached and MySQL: Everything You Need to Know by Brian Aker, and Alan Kasindorf (dormando, if you’re on IRC) or Real World Web: Performance & Scalability MySQL Edition by Ask Hansen, but I’m told that its completely sold out! If you’re interested in something to spend the entire day in, I can highly recommend either Giuseppe Maxia and Jan Kneschke’s talk on MySQL Proxy: The Complete Tutorial, or head over to Stewart Smith’s talk on MySQL Cluster Tutorial. Keep in mind that Stewart’s tutorial is going to be quite hands on.

Sessions (Tuesday, 15 April 2008) - schedule
After the keynotes (remember to be there!), I would personally recommend that you attend Lessons Learned in Building a Highly Scalable MySQL Database presented by the folk, behind The Hive. Alternatively, visit Mike Zinner’s talk about MySQL Workbench: The Ultimate Database Design Tool for Developers - the ease of creating and designing databases, makes it feel very “Rails-like”.

At 11:55am, your choices are wide-varied, and choosing one talk, is going to be hard. Consider paying a visit to Practical MySQL for Web Applications by Domas Mituzas. Not only is he a support engineer at MySQL, he also engineers the back-end for Wikipedia; sure, they’re not a Rails-based application, but I can assure you, the commonality between web applications will ensure this is an interesting talk. If your application makes use of full-text search, consider going to Full-Text Search with MySQL 5.1: New Features & How To, by Alexander Rubin. If you’re writing a new application, it probably makes sense to start using 5.1. Replication for Dummies by Pat Galbraith should also be an interesting talk - if you missed the tutorial the day before, definitely go for this; if you attended the tutorial before, you’ll be re-enforcing your knowledge, and might make use of good Q&A time as well.

After the hearty lunch, a must not miss would be Big Bird (Scaling Twitter) by Blaine Cook. Popular, used by many, micro-blogging tool, they’ve gone through improving how the application performs, and scaling it to heights, much beyond simple ActiveRecord usage. Be there.

At 3:05pm, Monty Taylor’s High Availability Landscape of MySQL should be the one you’re at. Monty is very conversant with many a language as well, as part of his work on the NDB connectors, but here, you’ll be learning about replication, DRBD, and possibly Cluster/NDB. Anyone know of a Rails application using MySQL Cluster/NDB?

At 4:25pm, definitely go to the talk by Jeremy McAnally, titled: Talk = Ruby + MySql.new(bie): An Introduction to Using MySQL with Ruby. Jeremy’s the author of books and articles on Ruby, Rails, and MySQL, and granted the talk is targeted at beginners, no matter what level you’re at, you will probably learn something new.

By 5:15pm, your energy levels might slowly be sapped, but persevere, and you’ll be rewarded. While none of the talks are Ruby/Rails specific, I’d recommend attending either Backup and Recovery Basics by Kai Voigt (trainer at MySQL, will be an interesting talk as you will have to backup, and recover your database at some stage) or Services Oriented Architecture with PHP and MySQL by Joe Stump (learn from Digg, and apply your knowledge to Ruby/Rails).

Sessions (Wednesday, 16 April 2008) - schedule
Begin the morning having a hearty breakfast, and moving on to the keynotes. After which, if you’re into GIS and spatial extensions, the talk you must be at is the one offered by Seth Fitzsimmons, from Yahoo!, titled Using MySQL’s Spatial Extensions with Rails. If however you aren’t a GIS junkie, consider either Giuseppe Maxia’s talk on MySQL Sandbox, or Roland Bouman’s talk on Information Schema and its applications.

At 11:55am, I can recommend either: Falcon from the Beginning by Jim Starkey & Ann Harrison, or Tom Daly’s talk on Web Workloads for Comparing, Testing and Tuning MySQL Performance , SPECjAppServer2004, EAStress and Faban. Its definitely a tough sell, with the Applied Partitioning and Scaling Your Database System by Phil Hildebrand, and if you’re after contributing to MySQL, and being part of our community, don’t hesitate to come see me talk about Paying It Forward: Harnessing the MySQL Contributory Resources.

After lunch, at 2:00pm, if you’re into database normalization, consider How to be Normal, a Guide for Developers by Mike Hillyer. However, the two talks I’d personally be at (if only I can split myself) would be Monty’s talk (the father of MySQL!), titled Architecture of Maria: A New Storage Engine with a Transactional Design and Jay & Tobias’s talk, titled MySQL Performance Under a Microscope: The Tobias and Jay Show. Did I mention, that nowadays, it only make sense to write code and web applications with great character set support, and Domas Mituzas will be giving you an interesting session on Practical Character Sets. With so many conflicting talks at 2pm, all I can hope is that there are some excellent blog entries, and folk end up taking videos! (And no, I checked - no way to split myself, 4-ways, unlike today’s modern processors).

At 3:05pm, take a break, and enjoy yourself at Astronomy, Petabytes and MySQL by Kian-Tat Lim. If you’re still fuelled, go take a gander at Markus & Dups talk, titled Integration of Frameworks for Rapid Web Development (sure, it might be PHP-centric, but you can learn). Once thing Rails developers will want to know though, is how to make sure you’re using the query cache properly - Baron Schwartz will tell you in The MySQL Query Cache.

At 4:25pm, I can highly recommend going to Grazr: Lessons Learned Building a Web 2.0 Application Using MySQL by Patrick Galbraith and Michael Kowalchik, because even if you don’t find much Rails-centric content, the lessons learned and what worked/didn’t, will be useful to all. However, if you’re interested in storage engines, where Falcon is really the “Web 2.0 enhanced” storage engine for MySQL, consider Falcon for InnoDB users by Kevin Lewis and Ann Harrison.

At 5:15pm, its a no-brainer that you should be at ActiveRecord Under the Microscope by Jeremy McAnally. There are times to use it, and there are times to avoid it - Jeremy will tell you when, in general.

Sessions (Thursday, 17 April 2008) - schedule
After the fun from last night (quiz show, et al), make sure you’re at the keynotes yet again…

At 10:50am, I’m sure the realisation that this is the last day of this great conference is going to hit. Never fear, you better savour it. Assuming you’re deploying your application on software made by our new corporate overlords, consider visiting Frank Mash’s talk, titled: Optimizing MySQL and InnoDB on Solaris 10 for World’s Largest Photo Blogging Community. That’s Fotolog for what it’s worth. There are a whole bunch of scaling related talks that are sure to be interesting, but let’s try to focus!

At 11:55am, DTrace and MySQL by Ben Rockwood from Joyent, might be interesting to ensure you get a performant database. However, seeing that the hooks themselves aren’t mainstream (yet), consider
Sheeri Kritzer Cabral’s talk titled: Database Security Using White-Hat Google Hacking or if you’re wondering what Google does, visit Mark Callaghan, and listen to him speak about Helping InnoDB Scale on Servers with Many CPU Cores and Disks.

At 2:00pm, Ronald Bradford will share the Top 20 Database Design Tips Every Architect Needs to Know, and it would be my definite pick.

At 2:50pm, the last session of this great conference before the closing keynote, I’ll recommend High Availability MySQL with DRBD and Heartbeat: MTV Japan Mobile Services by Patrick Bolduan (whom I met in Japan last year, great guy, and the talk should be real interesting). While centred around PHP, Arjen Lentz should impart general knowledge of what a deadly sin is in general, if you weren’t using ActiveRecord and you were querying things the wrong way from your Rails application, so consider visiting Deadly Sins Using MySQL & PHP by Arjen Lentz and Jonathon Coombes.

And that my friends, is me signing off, and telling you what a jam-packed week this is going to be.

Register Now!
There are a ton of options for the discerning Ruby, or Ruby on Rails developer. If you’ve not registered yet, please do so now! If you’re not averse to paying full-price for items, I (and any other speaker) have a 20% discount code, so drop me an email at colin AT mysql DOT com.

Technorati Tags: , , , , , , , ,

DtTace, Web 2.0, Java, AJAX, PHP and the rest

Saturday, March 8th, 2008

No, its not alphabet soup. Just some notes from the session at the Sun Tech Days. I’ve not looked at DTrace much (my only look into instrumentation, has been from SystemTap, which doesn’t deal with applications), but plan on doing so soon… I’ve managed to get OpenSolaris Developer Preview 2 installed in VirtualBox, so it can only start being more fun from here…

Want to learn more about DTrace and MySQL? Then come to the MySQL Conference & Expo 2008, in Santa Clara, California, because on Thursday, Ben Rockwood, from Joyent, will be presenting a session on DTrace and MySQL (read the abstract, its good). The talk covers the fact that you can get useful information currently, even without the embedded probes in current versions of MySQL. For more DTrace and MySQL tips, don’t hesitate to read Joyeur, Joyent’s weblog.

DtTace, Web 2.0, Java, AJAX, PHP and the rest (notes from the talk)
by Peter Karlsson, Solaris Technology Evangelist

DTrace now has providers for a large number of languages: JavaScript, Java, PHP, Python, Ruby. Perl is on the way.

MySQL 6.0 will have DTrace support; PostgreSQL already has this in Solaris currently. If building from source, there’s a flag that needs to be enabled. A lot of work was done thanks to a community member.

You need a Solaris kernel. Ported to OS X and FreeBSD. Supports “dynamic instrumentation”. D is the dynamic language, used to script instrumentation

Very common request? Find how much time is spent in a given function. The thread local variable (self->variable = expression;) - nowadays, you can be running two threads coming down in the same function call. DTrace - so this is great for multi-threaded debugging.

PHP doesn’t have DTrace integrated, so, get the Coolstack PHP.

DTrace probes have been added to Mozilla to help debug JavaScript applications. This is available in Firefox 3 (in beta now). There is also a generic DTrace framework, that isn’t just JavaScript only - the networking parts of Firefox, to look at how DNS lookups work, etc. all can be instrumented via DTrace.

Further reading? DTrace and PHP, demonstrated.

Technorati Tags: , , ,

So you want to start a successful open source business? (notes, from the Paul Fenwick talk)

Friday, February 29th, 2008

So, today was the OSIA Melbourne meeting. It was most fun. Met lots of people, had interesting conversations. Kudos to Donna for organising it, and all those who came to dinner and drinks, much fun was had. I wrote notes down from the talk, but it looks like Paul Fenwick and Jacinta Richardson had already written a paper on Starting an Open Source Business. They both run Perl Training Australia. Not one to throw away notes, the following are my random scraps from the talk. Also to note, Paul is a most interesting speaker!

Paul’s elevator pitch? All his course notes (and talks) are available online. I did this for my OpenOffice.org stuff, so this kind of thing, greatly interests me. Kudos to Perl Training Australia, for having such foresight.

Let the notes begin…

Paul isn’t covering moonlighting, big business (where you have VC money). The focus is an open source consultancy (small business, easy to start up).

Systems administration is covered. You don’t even need to write open source software. Training? Support?

Selling FOSS – most customers don’t care if its FOSS or proprietary – they just want to get the job done. So its easy to pitch to small/medium scale business. The low-up front costs is useful, and think about the insurance aspect (i.e. Others can work on it, even if you exit the industry).

His first business, at university, was there to support his hobbies. Just odd jobs for IT buddies, some Html, and C under Linux. Then he learned Perl for Web/CGI, and before he knew it, he started his own business. As a sole trader, he was also a university tutor, and enjoyed tutoring, and the pay was peanuts in general. Eventually he got a real job, and he realised that having a real job sucks! (long hours, commute times, boring work, deadlines, not learning new things)

He then looked at consulting friends, and they earned $100/hour. He then thought, to earn $50,000 a year, he’d only need to work 2 hours per day (!). So, he started a second business…

Lesson 1: Money. Start personal accounting, and use GnuCash. If you want to start a business, start doing this now, because you want to know your financial status instantly. It makes taxes easier. You can also profile expenses – know what you’re spending on is crucial (know your savings longevity).

When you start your business, your savings will dwindle. Dwindling savings is scary, and you might be scared back into a real job, resulting in you wasting time and money.

Business with friends, was great. Meetings by pool, over BBQs, making beer, etc. Business focused on consulting, but he wanted to teach.

Lesson 2: Business with friends. When there is irreconcilable differences of opinion, you tend to lose friendships. Imagine, losing time, money, and friends!

He then started Perl Training Australia, as business number three.

Lesson 3: Contacts. Contacts from university, work, contacts (friends of friends). Most work came from word of mouth, as opposed to advertising. This is good, its cheap advertising. How do you get contacts? You network. There was one stage when he was cornering people on the bus even – he just talked to everyone. 30 seconds of what you do, what your skills are, why you’re important, and give them a business card.

So, you need money and contacts. What about talent? This is optional ;)

Lesson 4: Social Skills. What you really need is social skills with non-geeks. Your clients, don’t know if you write good code. They just want solutions! The only way your client knows you’re doing a good job, is if you’re telling them. Give them a daily report, if need be. Effective communication is important.

Most people don’t use the golden rule of social skills. Don’t be unwarrantably honest, don’t be insulting, be creative. Appreciate others, be polite. Don’t cause anyone actual hardship.

Discovery: clients were also small to medium sized businesses. They appreciate ‘personalised service’. No one likes going through the helpdesk loop. Have penalty rates before hand – imagine getting called at 2am on a Sunday morning!

Remember, there are different types of clients, and the difficult clients produce the most work. Ideal clients? Technically clueful and well-resourced. They hire you for specialist skills. Unfortunately, you won’t get too much work – too clueful and organised. Call them regularly, make them feel loved, so remain fresh in their memories.

Difficult clients, tend to be disorganised, have few technical skills, and may need full-time staff. Everything is always an emergency with them!

Intermediary clients – these are people that want you to do work for their clients. These folk can be interesting to work with – they can do specifications, scoping, management & client liaison, and even invoice on your behalf. They can also be awful – imagine getting poor specifications and scope. Not having access to the real client, you have to wait ages to get an answer. Worst? “You get paid, when we get paid”.

Most satisfying work, tend to have good closure. Some things never have good closure – this is like system administration. Its never going to end! Software maintenance, doesn’t have good closure (features, documentation, etc.).

Poor closure = good income stream!

“As a consultant, I can choose the work I do.” However, what it really means is that you choose between work and starvation! You cannot be picky at the beginning. You will have to do grunt work, before you gain the reputation.

Sys-admin and development work during the start, was hard for Perl Training Australia. He couldn’t develop training materials, and develop the actual training. He left his full-time work to gain more time, but during the first year of the business, he was working 12 hours per day! 2 hours per day, is clearly not enough. Clients want their work done now, not by Christmas.

So he worked 60 hours/week, and was happy. He kept saying he would take time off later. Remember, clients need constant support, so you’re not going to go on holidays.

Consultants get heaps of money. But only for billable hours. They don’t include things like office tasks (getting stamps!), book-keeping, travel time, systems administration of your own systems, meetings with clients that don’t employ you.

Ideally, you would like to make money without spending time. This is probably the number one reason to start a business. Good way of doing this? Recurring revenue via a hosted service or a subscription service. In training, each extra person on a course, don’t represent a big cost. Product sales is also useful.

Employees do work for you. They spend their time, to make you money. This means you can then do more work, or grow the business.

Hiring employees is a lot more work. There are legal aspects (tax department, contract negotiation, etc.). There is the requirement of office space. You need to show them the ropes of the business, because they will not know how your business works.

When you’re busy, it is the wrong time to hire. Think of the Mythical Man Month. You’re going to be overloaded. The right time to hire is when things are quiet. Always, have foresight, and planning as a small business owner!

In a large business, there are differences between sales and systems administrators. In a small business, the positions become less well-defined, so you’re going to have to ensure you and your staff multi-task. University students don’t really have this “Small Business Shock”.

Keeping the perfect employee? Keep them happy. Spoil them. Do whatever it takes. Because remember, hiring someone new, is actually expensive; you’ve already trained your employee!

Technorati Tags: , , , , ,