Will there be any additional charges to the already described rates for each service?
How can all the car wash services take the same amount of time?
All vehicles are loaded onto a series of conveyor belts. These conveyor belts are set at a fixed speed and do not adjust to specific vehicle services. Hand drying, vacuuming do vary based on vehicle size, as well as the amount of chemicals used, hence the premium charged for larger vehicles. All time estimates are listed beside each of the car wash services.
Available upon request. Given the sensitivity of engines on different vehicle, we do not offer it as a standard menu item. Please note we DO NOT take responsibility of your engine for this service.
Is Car Pride Auto Spa a franchise?
No. Car Pride Auto Spa is a privately owned company with only one location currently. Please call 416-357-3700 regarding franchising.
Can we clean child seats?
Can the Car PrideAuto Spa wash large vehicles like conversion vans or lifted trucks?
We do offer a hand wash service for such vehicles including exotic cars and motorcycles. The maximum height restriction for any vehicle is 88 inches for the car wash tunnel. However, we do detail larger vehicles. Contact a customer service advisor for more details.
How should I tip the workers?
What should I do if I'm not happy with my wash?
Our number one goal is to ensure customer satisfaction. Each vehicle goes through our quality assurance check before the keys are handed back to the Customer. Furthermore, if we should miss anything by chance, our customer service advisors are more than happy to assist touching up your vehicle once your wash service is complete. Please ask!
Do I have to make an appointment to have my car washed?
No! Car washing or express detailing are on a first come, first serve basis. Full detailing services require an appointment. Call 905.823.1000 to book an appointment.
If I visit the Car Pride Auto Spa frequently, is there a rewards system?
Yes! We love repeat customers and we offer a VIP club card program. It is free to sign up at the front desk and allows special discounts including free car washes! Ask a customer service representative for details.
Can Car Pride remove yellow/white line paint that I picked up from the roadway?
Yes, we can remove road paint. Unfortunately there is not a miracle chemical that will remove road paint thus it requires a great deal of time. You'll need to bring your car in for a price quote and appointment. Keep in mind the sooner the paint is removed the better, it only gets more difficult to remove as time moves on. Same applies for asphalt or tar stains.
Does Car Pride do buffing, scratch removals, or polishing?
Yes. Car Pride Auto Spa offers high speed buffing and polishing as part of detailing menu. The full menu can be found under Service menu tab.
Is the car wash an automatic or touch system?
Car Pride Auto Spa car wash is an automated light touch car wash with suede coated materials imported from Europe. We use the latest technology to wash each of our cars. We would be pleased to provide you a tour of the facility upon request. The typical wash process begins with vacuuming and interior cleaning based on the package purchased. Vehicle is then loaded onto the automatic tunnel; soaps, waxes, polishes, cleaners are applied automatically based on the length and width of the vehicle. We have a staff of 10-14 specialists that handle all aspects of your car wash experience.
Can I drop off my car to have it washed and the pick it up at a later time?
Yes, Car Pride Auto Spa offer shuttle service to the GO station should you need a ride for all detailing services. You may also drop off your vehicle if you have a detailing appointment.
What is the best time to have my car washed?
Anytime is a great time to wash your car at the Car Pride Auto Spa. We are capable of washing a car per minute with our equipment. Even if there are cars in line don't be fooled thinking it will take too long! You can call us at 905-823-1000 if you want to check the wait time.
What's the height maximum and width of vehicles that fit your machine wash?
For our hand wash option: We can accommodate vehicles 11.5 Ft in height and 100 inch width.
All time estimate can be found beside each of the packages listed under the Services menu tab. Please call us at 905-823-1000 if you should have any questions.
How long does it take to wash my car?
The complete wash process generally takes about 10 to 15 minutes with complete hand drying for our Exterior Wash package. All other time estimates are listed besides each package offering. Estimates are from the point of the greeting station. For line up, please add five mins per vehicle in front of you approximately.
Please contact us at 905-823-1000 if we have not answered your question above.


What personal information does this website collect from the people that visit it?
When ordering or registering on thissite, as appropriate, you may be asked to enter your name, email address, credit card information or other details to help you with your experience.
When does this website collect information?
The website collects information from you when you register on the site, place an order, subscribe to a newsletter, fill out a form, Use Live Chat or enter information on the site.
How does The Cuckold Consultant™ protect your information?
This website is scanned on a regular basis for security holes and known vulnerabilities in order to make your visit to this site as safe as possible. It uses regular Malware Scanning. Your personal information is contained behind secured networks and is only accessible by a limited number of persons who have special access rights to such systems, and are required to keep the information confidential. In addition, all sensitive/credit information you supply is encrypted via Secure Socket Layer (SSL) technology.
The Cuckold Consultant™ implements a variety of security measures when a user places an order enters, submits, or accesses their information to maintain the safety of your personal information. All transactions are processed through a gateway provider and are not stored or processed on our servers.
The Cuckold Consultant™ does not sell, trade, or otherwise transfer to outside parties your Personally Identifiable Information.
The Cuckold Consultant™ does not include or offer third-party products or services on this website.
The Cuckold Consultant™, along with third-party vendors such as Google use first-party cookies (such as the Google Analytics cookies) to compile data regarding user interactions as they relate to this website. Opting out: Users can set preferences and opt out by using the Google Analytics Opt Out Browser add on.
The Cuckold Consultant™ honors Do Not Track signals and Do Not Track, plant cookies, or use advertising when a Do Not Track (DNT) browser mechanism is in place.
It's also important to note that The Cuckold Consultant™does not allow third-party behavioral tracking.
The Cuckold Consultant™ does not specifically market to children under the age of 13 years old.
• Market to its mailing list or continue to send emails to clients after the original transaction has occurred.
If at any time you would like to unsubscribe from receiving future emails, you can follow the instructions at the bottom of each email and The Cuckold Consultant™ will promptly remove you from ALL correspondence.
The Cuckold Consultant™ will never use your private information, pictures, and any part of the information you provide. The Cuckold Consultant™ will never use, resell, or reshare any pictures or the chat logs on the chat system you send.
Always keep in mind that any information provided through an IP address will only be stored in the chat systems for a limited period of time (no longer than 24 hours).
The Cuckold Consultant™ does not store any chat logs on its servers or pictures on its server for longer than 24 hours. After 24 hours, everything is deleted.
Staff have access to 24 hours of chat transcripts/logs. Members do not.
The Cuckold Consultant™ will never use or share your IP address or ISP information unless required so by a law enforcement or government agency in an investigation into illegal acts.


text:
#include "shared.h"

// Cache size in Gb (to speed-up file I/O)
#define CACHE_SIZE 1

char const *version = "1.0.0";

int main (int argc, char **argv) {
	/////////////////////
	// Parse Arguments //
	/////////////////////
	params *pars = new params;
	init_pars(pars);
	parse_cmd_args(argc, argv, pars);
	if( pars->version ) {
		printf("ngsF v%s\nCompiled on %s @ %s", version, __DATE__, __TIME__);
#ifdef _USE_BGZF
		printf(" (BGZF library)\n");
#else
		printf(" (STD library)\n");
#endif

		exit(0);
	}
	if( pars->verbose >= 1 ) {
		printf("==> Input Arguments:\n");
		printf("\tglf file: %s\n\tinit_values: %s\n\tfreq_fixed: %s\n\tout file: %s\n\tn_ind: %d\n\tn_sites: %lu\n\tchunk_size: %lu\n\tfast_lkl: %s\n\tapprox_EM: %s\n\tcall_geno: %s\n\tmax_iters: %d\n\tmin_epsilon: %.10f\n\tn_threads: %d\n\tseed: %lu\n\tquick: %s\n\tversion: %s\n\tverbose: %d\n\n",
		       pars->in_glf, pars->init_values, pars->freq_fixed ? "true":"false", pars->out_file, pars->n_ind, pars->n_sites, pars->max_chunk_size, pars->fast_lkl ? "true":"false", pars->approx_EM ? "true":"false", pars->call_geno ? "true":"false", pars->max_iters, pars->min_epsilon, pars->n_threads, pars->seed, pars->quick ? "true":"false", version, pars->verbose);
	}
	if( pars->verbose > 4 ) printf("==> Verbose values greater than 4 for debugging purpose only. Expect large amounts of info on screen\n");

	/////////////////////
	// Check Arguments //
	/////////////////////
	if(pars->in_glf == NULL)
		error(__FUNCTION__,"GL input file (-glf) missing!");
	else if( strcmp(pars->in_glf, "-") == 0 ) {
	        pars->in_glf_type = new char[6];
  	        pars->in_glf_type = strcat(pars->in_glf_type, "STDIN");
	} else {
		pars->in_glf_type = strrchr(pars->in_glf, '.');
		if(pars->in_glf_type == NULL)
			error(__FUNCTION__,"invalid file type!");
	}
	if(pars->out_file == NULL)
		error(__FUNCTION__,"output file (-out) missing!");
	if(pars->n_ind == 0)
		error(__FUNCTION__,"number of individuals (-n_ind) missing!");
	if(pars->n_sites == 0)
		error(__FUNCTION__,"number of sites (-n_sites) missing!");

	///////////////////////
	// Check input files //
	///////////////////////
	// Get file total size
	struct stat st;
	stat(pars->in_glf, &st);
	if( strcmp(pars->in_glf_type, "STDIN") != 0 ) {
	  if( pars->n_sites == st.st_size/sizeof(double)/pars->n_ind/3 && strcmp(pars->in_glf_type, ".glf") == 0 ){
	    if(pars->verbose >= 1)
	      printf("==> UNCOMP input file (\"%s\"): number of sites (%lu) match expected file size\n", pars->in_glf_type, pars->n_sites);
	  }else if( strcmp(pars->in_glf_type, ".glf") != 0 ){
	    if( pars->verbose >= 1)
	      printf("==> COMPRESSED input file (\"%s\"): number of sites (%lu) do NOT match expected file size\n", pars->in_glf_type, pars->n_sites);
	  }else
	    error(__FUNCTION__,"wrong number of sites or invalid/corrupt file!");
	}

	// Adjust max_chunk_size in case of fewer sites
	if(pars->max_chunk_size > pars->n_sites) {
		if( pars->verbose >= 1 ) printf("==> Fewer sites (%lu) than chunk_size (%lu). Reducing chunk size to match number of sites\n", pars->n_sites, pars->max_chunk_size);
		pars->max_chunk_size = pars->n_sites;
	}
	// Calculate total number of chunks
	pars->n_chunks = ceil( (double) pars->n_sites/ (double) pars->max_chunk_size );
	if( pars->verbose >= 1 ) printf("==> Analysis will be run in %ld chunk(s)\n", pars->n_chunks);
	// Alocate memory for the chunk index
	pars->chunks_voffset = new int64_t[pars->n_chunks];
	memset(pars->chunks_voffset, 0, pars->n_chunks*sizeof(int64_t));
	// Adjust thread number to chunks
	if(pars->n_chunks < pars->n_threads) {
		if( pars->verbose >= 1 ) printf("==> Fewer chunks (%ld) than threads (%d). Reducing the number of threads to match number of chunks\n", pars->n_chunks, pars->n_threads);
		pars->n_threads = pars->n_chunks;
	}

	// Open input file
#ifdef _USE_BGZF
	if( pars->verbose >= 1 ) printf("==> Using BGZF I/O library\n");
	// Open BGZIP file
	if( strcmp(pars->in_glf_type, ".bgz") == 0 ) {
 	        if( (pars->in_glf_fh = bgzf_open(pars->in_glf, "rb")) < 0 )
		        error(__FUNCTION__,"Cannot open BGZIP file!");
	} else
	        error(__FUNCTION__,"BGZF library only supports BGZIP files!");

	bgzf_set_cache_size(pars->in_glf_fh, CACHE_SIZE * 1024uL * 1024uL * 1024uL);
#else

	if( pars->verbose >= 1 ) printf("==> Using native I/O library\n");
	// Open GLF file
	if( strcmp(pars->in_glf_type, "STDIN") == 0 )
	        pars->in_glf_fh = stdin;
	else if( strcmp(pars->in_glf_type, ".glf") == 0 ) {
	        if( (pars->in_glf_fh = fopen(pars->in_glf, "rb")) == NULL )
		        error(__FUNCTION__,"Cannot open GLF file!");
	} else
	        error(__FUNCTION__,"Standard library only supports UNCOMPRESSED GLF files!");

	// Allocate memory and read from the file
	pars->data = new double* [pars->n_sites];
	for(uint64_t s = 0; s < pars->n_sites; s++) {
		pars->data[s] = new double[pars->n_ind * 3];
		if( fread (pars->data[s], sizeof(double), pars->n_ind * 3, pars->in_glf_fh) != pars->n_ind * 3)
			error(__FUNCTION__,"cannot read GLF file!");
		if(pars->call_geno)
			call_geno(pars->data[s], pars->n_ind, 3);
	}
#endif
	if( pars->in_glf_fh == NULL )
		error(__FUNCTION__,"cannot open GLF file!");

	///////////////////////////////////
	// Declare variables for results //
	///////////////////////////////////
	out_data *output = new out_data;
	output->site_freq = new double[pars->n_sites];
	output->site_freq_num = new double[pars->n_sites];
	output->site_freq_den = new double[pars->n_sites];
	output->site_prob_var = new double[pars->n_sites];
	output->site_tmpprob_var = new double[pars->n_sites];
	output->indF = new double[pars->n_ind];
	output->indF_num = new double[pars->n_ind];
	output->indF_den = new double[pars->n_ind];
	output->ind_lkl = new double[pars->n_ind];
	// Initialize output
	init_output(pars, output);

	//////////////////
	// Analyze Data //
	//////////////////
	if( pars->verbose >= 1 && !pars->fast_lkl && strcmp("e", pars->init_values) != 0 ) {
		printf("==> Initial LogLkl: %.15f\n", full_HWE_like(pars, output->site_freq, output->indF, 0, pars->n_ind));
		fflush(stdout);
	}
	do_EM(pars, output);
	if( pars->verbose >= 1 ) printf("\nFinal logLkl: %f\n", output->global_lkl);

	//////////////////
	// Print Output //
	//////////////////
	FILE *out_file;
	if( pars->verbose >= 1 ) printf("Printing Output...\n");

	out_file = fopen(pars->out_file, "w");
	if(out_file == NULL)
	  error(__FUNCTION__,"Cannot open OUTPUT file!");
	for(uint16_t i = 0; i < pars->n_ind; i++)
		fprintf(out_file,"%f\n", output->indF[i]);
	fclose(out_file);

	//////////////////////
	// Close Input File //
	//////////////////////
	if( pars->verbose >= 1 ) printf("Exiting...\n");
#ifdef _USE_BGZF
	bgzf_close(pars->in_glf_fh);
#else
	for(uint64_t s = 0; s < pars->n_sites; s++)
		delete [] pars->data[s];
	delete [] pars->data;
	fclose(pars->in_glf_fh);
#endif

	/////////////////
	// Free Memory //
	/////////////////
	delete [] output->site_freq;
	delete [] output->site_freq_num;
	delete [] output->site_freq_den;
	delete [] output->site_prob_var;
	delete [] output->indF;
	delete [] output->indF_num;
	delete [] output->indF_den;
	delete [] output->ind_lkl;
	delete output;
	//if( strcmp("e", pars->init_values) == 0 )
		//delete [] pars->init_values;
	delete [] pars->chunks_voffset;
	delete pars;

	return 0;
}

redpajama_set_name: RedPajamaGithub


Bloom Cosmetics has created Pure Mineral Makeup, a 100% additive-free, mineral makeup range. It's healthy beauty without all the hard stuff.
Made from naturally occurring minerals that are mined from the earth and then ground to a fine powder, Pure Mineral Makeup is a natural, easy alternative to traditional makeup. It gives skin a soft, natural luminosity that feels like silk.
The quality of Bloom's Pure Mineral Makeup range hasn't been compromised by additives and other nasties. Binder, preservative, oil and talc free, means Pure Mineral Makeup won't clog pores and is perfect for sensitive skin. It is also water resistant and provides excellent coverage for women with acne, rosacea, scarring or broken capillaries.
Powder Foundation goes on like a powder but feels like silk - so you'll get the coverage and wear of a foundation, but not a 'cakey' look reminiscent of Marie Antoinette! Suitable for all skin types, Powder Foundation comes in three shades - light, medium and dark.
Radiant Touch Bronzer - Sunkissed and Radiant Touch Blush - Rosie can be used over Powder Foundation, or on their own. For a healthy hint of summer all year round, use Radiant Touch Bronzer on the face, décolletage and shoulders. Meanwhile, the pink tones in Radiant Touch Blush suit any complexion and give cheeks a 'just kissed' look.
Mineral Foundation Brush has brush hair that has been specially designed to work best with the ultra fine powder in Pure Mineral Makeup to ensure you achieve a perfectly even application.
Concealer Brush is perfect for using Pure Mineral Powder Foundation as a concealer. The brush hair is synthetic to provide heavier coverage to hide skin's problem areas.
Applying mineral makeup requires slightly different techniques to traditional makeup. To learn practical tips and how to apply Pure Mineral Makeup for a natural, flawless makeover, visit Bloom's online demonstration at www.bloomcosmetics.com/puremineral.


text:
Heartland: Show Jumping
The in-gate volunteer watched our ride and as I was walking out she was like "He looks like a fun ride." I laughed, because that pretty much summed up another...interesting...show jumping round. That's why I like this guy!
Warmup was like:
"I ain't touching that!"
And then it was like:
"LONG SPOT, WOOHOOOOOOOO!"
And then I asked him to please not leave out a stride and get to the base of the fence and it was like:
"I just touched that, sorry..." Note the flying rail.
So rest assured his next attempt was another sky scraper, and after we had both cruised over the fences enough times to be comfortable, with my trainer helping me to stabilize my lower leg, we went over to the ring, where Connor was all "SPECTATORS!" and I was all "Fence 1!"
Him: "Shiny..." Me: "They just rang the bell."
So he was predictably unpredictable at Fence One.
Getting my reins back on my jumper pony.
At 2, he did his classic peek before takeoff. My husband was standing with my teammate for our round, and he said he joked, "And this one smells like roses..." when Connor looked at this one:
3 and 4 were pretty straightforward, we had a good canter going:
Butts.
Fence 5 reminded me of that skinny that came off the rail quickly in team practice a couple of months ago, so I made an executive decision just before I went into the ring to trot it. It was also the only fence with filler, a gate:
He had no idea there was a fence just a few strides away here, so I was happy with my decision to trot.
Again, peeking.
But he isn't going to touch it!
Bending line to 6:
"We're going right..."
"...really."
Gratuitous cute.
Fence 7:
I don't have a picture of eight but I do have a picture of us cruising to it:
And then cruising to 9:
On the last fence, number 9, we really started to click:
And then we got done and everyone told him what a good pony he was, and he had a moment with his breeder:
"I'm a good boy!"
Good pony!
And then his braids were taken out and everyone fawned over his curly hair.
We ended up finishing 4th on our Dressage score of 31, if that tells you anything about how tough the division was! I was there to knock the rust off and see if we are ready to move up, and I think I got my answer. Starter is starting to get boring, now it's time to make 2'6 the new norm. Pony power!
Labels: heartland, show jumping
L.Williams April 21, 2014 at 7:56 PM
He Jumps SOOO CUTE. You guys totally rocked it, man you rocked all week!
Thanks, it was a crazy week!!
Hillary April 21, 2014 at 8:13 PM
Adorableness!
Nicole April 21, 2014 at 10:30 PM
What a wild ride! Nice knees :)
Mine or his? Haha. He is a wild ride, but that's why I like him. Not a kids' pony.
Erika April 21, 2014 at 11:00 PM
That last picture is just too cute! :)
Haha thanks, I just left it that way too. Too cute to wet down and brush out.
Karley April 21, 2014 at 11:54 PM
Omg too cute!! His fro hair is awesome!!!
Isn't it great? I just left it that way too, I was laughing to hard to want to brush it out.
Jessica April 21, 2014 at 11:59 PM
Ah, I LOVE that picture of him over the gate, so freaking cute!!
Thanks! Wish it was in focus but you can still see the cute!
Kitty Kat April 22, 2014 at 12:02 AM
OMG he's so adorable! Love that form o/f, he knows his job!
Thanks! He's always done that so I think it's more self-preservation than anything, but one way or another, good qualities for an event horse right? Haha.
Tarra Gakstatter April 22, 2014 at 12:13 AM
I love his curly hair picture! SO adorable! Congrats on a great weekend! BN will be a piece of cake
Thanks! Hope so, we're rocking 2'0 but not quite sure of ourselves at 2'6 yet so I'm a little nervous.
Alanna M. April 22, 2014 at 12:27 AM
Yah! How exciting.
Rosa Rantanen April 22, 2014 at 1:19 AM
He is the best!! Congrats!!
Alli + Dino April 22, 2014 at 8:14 AM
LOVE his jump! You two are such an awesome team. :)
Thanks! He's my little buddy!
Go, Connor, Go! Love the gratuitous photos<3
Jen April 22, 2014 at 11:15 AM
There are more where that came from, for once!
So cute!! And the knee to chin action is impressive :)
Thanks! He's definitely getting the hang of that these days.
T Myers April 22, 2014 at 10:55 AM
Love those careful little knees!
Thanks! Makes me feel better about XC fences when I see his jumping pictures.
SheMovedtoTexas April 22, 2014 at 11:11 AM
He's the cutest little show jumper ever! Such a trier and I love how he obviously HATES to hit a rail.
Thanks! Those donkey ears in the flying rail photo pretty much tell his whole story, don't they? Haha. I think it's why he puts his nose down to look at the fence before takeoff, just to be absolutely certain he won't hit anything.
Tracy April 22, 2014 at 11:55 AM
But gosh, he's adorable!!
Thanks, and agreed!
jenj April 22, 2014 at 1:43 PM
He's so cute O/F! Congrads on a nice round, well-ridden!
Thanks! You always tell me cute pony pictures are the way to peoples' hearts.
SprinklerBandit April 22, 2014 at 5:38 PM
Awesome!! Love all the cute pictures. :-)
Kelly April 23, 2014 at 4:56 PM
Great job Jen! Fantastic first show of the season!
Piccolopony April 23, 2014 at 10:14 PM
Great job Jen! He does have awesome tight knees and is really just totally adorable in every way. I'm so glad you got pictures!!

redpajama_set_name: RedPajamaCommonCrawl


Nutra Organics share with you an honest and heartfelt desire to help and encourage others to live life to the fullest, naturally. Nutra Organics mission is to, "help people live healthy, energetic and fulfilling lives" Nutra Organics strive to educate and empower people to build a community of like minded individuals passionate about clean eating and living life to the fullest. We provide practical, holistic support, teamed with organic healthy recipes and the use of wild harvested super foods products to help you all reach and maintain optimal health. Nutra Organics products are scientifically formulated to provide the wholesome goodness and essential nutrition many of us are missing in our modern lives. Nutra Organics formulations provide you with a convenient way to get the phytonutrients, vitamins, minerals, anti-oxidants, anthocyanins, alkaline greens and more that your body needs to look and feel healthy, refreshed and energised.


text:
package org.simplity.core.trans;

import org.simplity.core.app.AppConventions;
import org.simplity.core.data.DataPurpose;
import org.simplity.core.dm.DbTable;
import org.simplity.core.dt.BooleanDataType;
import org.simplity.core.dt.TextDataType;
import org.simplity.core.msg.Messages;
import org.simplity.core.rdb.DbUsage;
import org.simplity.core.service.DataStructureType;
import org.simplity.core.service.InputData;
import org.simplity.core.service.InputField;
import org.simplity.core.service.InputRecord;
import org.simplity.core.service.OutputData;
import org.simplity.core.service.OutputRecord;

/**
 * designed as enumeration, but idea is to delegate some static functionality
 * out of Service class
 *
 * @author simplity.org
 *
 */
public enum ServiceOperation {
	/**
	 * read/get a row based on primary key value
	 */
	GET {
		@Override
		public Service generateService(DbTable record) {
			String recordName = record.getQualifiedName();

			/*
			 * what is to be input
			 */
			InputRecord[] inRecs = {
					InputRecord.getInputRecord(recordName, record.getDefaultSheetName(), DataPurpose.READ, false) };
			InputData inData = new InputData();
			inData.setRecords(inRecs);

			/*
			 * We have just one action : read action
			 */
			AbstractAction action = new Read(record, record.getChildRecordsAsRelatedRecords(true));
			action.failureMessageName = Messages.NO_ROWS;

			AbstractAction[] actions = { action };
			TransactionProcessor task = new TransactionProcessor();
			task.actions = actions;
			task.dbUsage = DbUsage.READ_ONLY;
			task.schemaName = record.getSchemaName();

			/*
			 * output fields from record.
			 */
			OutputData outData = new OutputData();
			outData.setOutputRecords(record.getOutputRecords(false));

			Service service = new Service();
			service.inputData = inData;
			service.processor = task;
			service.outputData = outData;
			return service;
		}
	},
	/**
	 * insert/update/delete
	 */
	SAVE {
		@Override
		public Service generateService(DbTable record) {
			String recordName = record.getQualifiedName();

			/*
			 * data for this record is expected in fields, while rows for
			 * child-records in data sheets
			 */
			InputData inData = new InputData();
			inData.setRecords(record.getInputRecords());

			/*
			 * what should we output? We are not sure.
			 *
			 * May be we should read back the row that is updated?
			 *
			 * As of now, we just send back data that is received
			 */
			OutputRecord outRec = new OutputRecord();
			outRec.setRecordName(recordName);
			OutputData outData = new OutputData();
			OutputRecord[] outRecs = { outRec };
			outData.setOutputRecords(outRecs);

			/*
			 * processing
			 */
			RelatedRecord[] rrs = record.getChildRecordsAsRelatedRecords(false);
			Save action = new Save(record, rrs, false);
			action.failureMessageName = Messages.NO_UPDATE;
			AbstractAction[] actions = { action };
			TransactionProcessor task = new TransactionProcessor();
			task.actions = actions;
			task.dbUsage = DbUsage.READ_WRITE;
			task.schemaName = record.getSchemaName();

			Service service = new Service();
			service.inputData = inData;
			service.processor = task;
			service.outputData = outData;
			return service;
		}
	},
	/**
	 * search
	 */
	FILTER {
		@Override
		public Service generateService(DbTable record) {
			String recordName = record.getQualifiedName();

			/*
			 * input as fields for filter
			 */
			InputRecord[] inRecs = { InputRecord.getInputRecord(recordName, record.getDefaultSheetName(),
					DataPurpose.FILTER, false) };
			InputData inData = new InputData();
			inData.setRecords(inRecs);

			/*
			 * output to named array
			 */
			OutputData outData = new OutputData();
			outData.setOutputRecords(record.getOutputRecords(true));

			AbstractAction action = new Filter(record);
			action.failureMessageName = Messages.NO_ROWS;
			AbstractAction[] actions = { action };
			TransactionProcessor task = new TransactionProcessor();
			task.dbUsage = DbUsage.READ_ONLY;
			task.schemaName = record.getSchemaName();
			task.actions = actions;

			Service service = new Service();
			service.inputData = inData;
			service.processor = task;
			service.outputData = outData;
			return service;
		}
	},
	/**
	 * like drop-down list
	 */
	LIST {
		@Override
		public Service generateService(DbTable record) {
			Service service = new Service();

			/*
			 * do we need any input? we are flexible
			 */

			InputField f1 = InputField.createInputField(AppConventions.Name.LIST_SERVICE_KEY,
					TextDataType.getDefaultInstance(), false,
					null,
					AppConventions.Name.LIST_SERVICE_KEY, null);
			InputField[] inFields = { f1 };
			InputData inData = new InputData();
			inData.setInputFields(inFields);
			service.inputData = inData;

			/*
			 * output as sheet
			 */
			String sheetName = record.getDefaultSheetName();
			OutputRecord outRec = OutputRecord.getOutputRecordForList(sheetName,
					record.listServiceUsesTwoColumns());
			OutputRecord[] outRecs = { outRec };
			OutputData outData = new OutputData();
			outData.setOutputRecords(outRecs);
			service.outputData = outData;
			/*
			 * processing logic
			 */
			TransactionProcessor task = new TransactionProcessor();
			task.dbUsage = DbUsage.READ_ONLY;
			task.schemaName = record.getSchemaName();
			if (record.okToCache()) {
				String keyName = record.getValueListKeyName();
				if (keyName == null) {
					keyName = "";
				}
				String[] list = { keyName };
				service.cacheKeyNames = list;
			}

			/*
			 * use a List action to do the job
			 */
			AbstractAction action = new KeyValueList(record);
			AbstractAction[] actions = { action };
			task.actions = actions;
			service.processor = task;

			/*
			 * getReady() is called by component manager any ways..
			 */
			return service;
		}
	},
	/**
	 * for a suggestion drop-dowm for the client
	 */
	SUGGEST {
		@Override
		public Service generateService(DbTable record) {
			Service service = new Service();
			TransactionProcessor task = new TransactionProcessor();
			service.processor = task;
			task.dbUsage = DbUsage.READ_ONLY;
			task.schemaName = record.getSchemaName();

			/*
			 * input for suggest
			 */
			InputField f1 = InputField.createInputField(AppConventions.Name.LIST_SERVICE_KEY,
					TextDataType.getDefaultInstance(), true, null,
					AppConventions.Name.LIST_SERVICE_KEY, null);
			InputField f2 = InputField.createInputField(AppConventions.Name.SUGGEST_STARTING,
					BooleanDataType.getDefaultInstance(), false,
					null,
					AppConventions.Name.SUGGEST_STARTING, null);

			InputField[] inFields = { f1, f2 };
			InputData inData = new InputData();
			inData.setInputFields(inFields);
			service.inputData = inData;

			/*
			 * use a suggest action to do the job
			 */
			AbstractAction action = new Suggest(record);
			action.failureMessageName = Messages.NO_ROWS;
			AbstractAction[] actions = { action };
			task.actions = actions;

			/*
			 * output as sheet
			 */
			String sheetName = record.getDefaultSheetName();
			OutputRecord outRec = new OutputRecord(sheetName, sheetName, record.getQualifiedName(),
					DataStructureType.SHEET,
					DataStructureType.ARRAY);
			OutputRecord[] outRecs = { outRec };
			OutputData outData = new OutputData();
			outData.setOutputRecords(outRecs);
			service.outputData = outData;

			/*
			 * getReady() is called by component manager any ways..
			 */
			return service;

		}
	};

	/**
	 * generate service for this dbTable
	 *
	 * @param record
	 * @return service or null in case teh design does not allow such a
	 *         generation, or there is some error in generation
	 */
	public abstract Service generateService(DbTable record);
}


text:
Music tech Reviews
MediaMonkey Review: The Ultimate Music Player and Library Organizer for PC
Jaymis Loveday - September 26, 2006
For many of us, listening to music — and managing our collections of music — can be as important as making music. Jaymis has me sold on MediaMonkey, available in cheap / free versions, for Windows. Note that this doesn't run on the Mac — feel free to discuss Mac alternatives in comments. Listening software is often one of those few apps we run every day, so here's Jaymis' exhaustive review of his favorite. -PK
I received my first MP3 file over ten years ago, as a zip archive spanned over three 3.5″ floppy disks. In the time since there have been advances in codec, hardware and software players, metadata formats and online sales, but after more than a decade the humble MP3 is still a dominant force in computer based music listening.
In my time as an MP3 consumer I've used a plethora of players, both hard- and software. In the early days, developers racing to add new features had me switching and trying out new applications regularly, but by the late 90s I was a dedicated Winamp user, even through the troublesome Winamp3 days. This all had to change. When faced with a year travelling and working in Europe I decided to retire my trusty 256MB "James" and replace him with a shiny, white, inevitable, 20GB (3rd Gen) iPod. After considerable wrangling (warning NSFW language and unrelated ranting in comments) I grudgingly switched to iTunes, which is an ok piece of software. Really. If all of your music comes to you via iTunes music store or major label CDs you've faithfully purchased and ripped (after reading and understanding any included EULAs) then you probably won't ever need or want another media player. iTunes also has some truly fantastic features: Coupled with judicious iPod-based rating while travelling, Party Shuffle and Smart Playlists changed how I listen to music.
However, If you're a discerning music listener. If you consume music which is copied from friends or MP3 Blogs, acquaintances with bands, records digitized from your dad's vinyl collection, or if you occasionally change computers, use multiple computers or multiple ipods, then iTunes will eventually cause you grief.
It's not the most full-featured application either. Apple's "less is more" philosophy does make for friendly, simple software, but a quick look at Apple's supplied Applescripts give you an idea of the basic functions they haven't bothered with.
Enter Mediamonkey
MediaMonkey is amazing. I've been running it for 3 months now and still feel like I haven't scratched the surface of what it can do. Here's a quick feature overview from the site:
Organize music and edit tags in your audio library with a powerful, intuitive interface
Automatically lookup and tag Album Art and other metadata
Manage 50,000+ files in your music collection without bogging down
Play MP3s and other audio formats, and never again worry about varying volume
Record CDs into OGG, MP3, FLAC and WMA files
Convert MP3s, OGG, FLAC and WMA files into other formats with the Audio Converter
Synchronize with iPods / MP3 players effortlessly and convert tracks on-the-fly
Party Mode, which allows users to make requests while protecting your library from being modified.
There's a freeware version or you can pay US$19.99 for the "Gold" version ($39.99 for a lifetime licence to all future updates). The commercial features include:
Increased Speed CD Burning
File Monitor (automatically updates library)
Advanced Searches and AutoPlaylists
Advanced Portable Device Synchronization with on-the-fly format conversion (list of devices supported)
Unlimited MP3 encoding
Virtual CD / Previews
I use MediaMonkey more than any other piece of software on my machine, it's loaded just about 100% of the time, so for me $20 equates to just about no money for something I'll be running for 16 hours each day. The free version includes the advanced 3rd party scripting abilities though, so you may not even need the Gold licence to get the what you want out of the software.
Reasons Not to Use MediaMonkey
Just to get the major shortcomings out of the way early:
It's PC only, sorry Mac users, but fortunately the Apple platform's tighter integration and the huge quantity of 3rd party applescripts available will let you emulate many of these functions.
It's not the most beautiful user interface and tends to feel a little cluttered. There are a few skins available but I'm sad to say I ended up settling for the default "brushed metal" style skin.
It has a lot of features and options. I personally consider this to be a strength, but if you're scared of right clicking or want something that "just works", perhaps iTunes or Winamp is more your speed.
Now that the lightweights have left: I am so in love with this software. It has evolved how I listen to and organize music. When using iTunes I would actually put off downloading albums or tracks from mp3 blogs or other non-mainstream sources, because I knew I'd have to go through the annoying process of tagging and importing so the tracks would show up and sync correctly to my iPod. I ended up using a separate program to audition downloaded tracks before importing them into iTunes. I had also put off changing media players as I have built up years of ratings and statistics which I couldn't bear to lose.
Switching from Another Player
On installation MediaMonkey detects whether you have iTunes, Windows Media Player or Winamp installed and offers to import all of your rating and playcount information from those programs. When moving from iTunes the only thing left behind was my Smart Playlists. MediaMonkey calls them Autoplaylists and they follow a slightly different format, so you'll have to make new ones. Autoplaylists allow most of the filter criteria within iTunes (with the notable exclusion of playlists-within-playlists), and plenty of extras including 3 "custom" fields, which you can rename and fill with information of your own devising. This is quite typical of MediaMonkey, while the default program has plenty of features and some cool new ideas, it's the customization frameworks built in which makes it so powerful. If you're one of the aforementioned discerning music listeners you're hardly going to need me to hold your hand for the basics of a media player, so instead I'm going to touch on some of the more advanced features and superb 3rd party scripts and customizations which have me hooked.
MediaMonkey's Included Coolness
Auto-DJ is like iTunes' Party Shuffle, but integrated with the normal Now Playing window. If your queue is running out of tracks, Auto-DJ will automatically add new tracks to keep at least 10 upcoming songs at all times. These tracks can be chosen from the entire library, or from a specific playlist.
Auto Organize Files allows you to move and rename files from within the program, so moving previously imported and played tracks from a download directory takes 3 clicks (or 2 shortcut key combinations) rather than the painful open-explorer-move-files-and-locate-them-manually process within iTunes.
Copy and Delete from within the app. Want to send a track to a contact, include it in a project directory or delete something horrible you never want to hear again? Both drag/drop and shortcut key copy/paste work from anywhere in the program, and when deleting a track from the library or a regular playlist you have the option of deleting from the playlist, from the playlist and library, or removing it from the computer as well.
Album Artist Display: Album Artist was only just added to iTunes 7. It's been part of MediaMonkey since before it was called MediaMonkey, and it has helped me solve an issue I've had with media players since I started using them: How to tag and name compilation albums.
Without the Album Artist tag compilation tagging has always been a kludged affair: I had my compilation tracks tagged with the artist as "compilation name" and track name as "track artist – track name", which isn't a particularly intuitive solution.
If you use the musician's name in the "artist" field, then the various tracks from a various artists album will be spread throughout your library. If you use the compilation or dj name as the artist, then those tracks won't show up with others by the same musician. The Album Artist tag solves this by allowing you to have it both ways.
For instance: If I was to purchase and rip So Fresh – The Hits of Spring 2006 (which I believe to be around volume 572 of the groundbreaking So Fresh series) I would tag the tracks with "So Fresh" as album artist and the musician (or fashion victim) as artist. So if I want my library to display my whole So Fresh collection in all its glory I can sort by Album Artist, whereas if I'd like to see all of my Pussycat Dolls tracks I can sort by Artist.
Find More From The Same: To quickly locate related tracks without rearranging the library you can right click on any track and choose "Find More from Same" artist, album, genre, year etc.
Half Star Ratings: I've always had problems dealing with a 5 point rating system. It's just not enough flexible enough and left me with hundreds of 3 star songs which, really, aren't 3 star songs. I probably wouldn't choose to listen to them if presented with a list, but they're definitely not 2 star tracks. 2 star is for all those annoying hip hop skits and infuriating "hidden tracks". MediaMonkey allows for half-star ratings, and it also differentiates between "unrated" and "no stars" (bomb). Note that iTunes has been able to display half-star ratings since iTunes 6.0.2, but you need an applescript to set them and they don't actually do anything.
Advanced 3rd Party Stuff
The MediaMonkey Add-ons page displays a relatively paltry assortment of plugins. However, it is designed to be compatible with the Winamp 2 API, which opens up several thousand other options. However, apart from the Audioscrobbler plugin I haven't really explored this option, beause the user developed scripts are crazy delicious.
Looking at the official scripts page may again lull you into a false sense of disappointment. Apart from the excellent Magic Nodes there isn't much there. To find the really great stuff you need to jump into the Scripts and Components forum. To me this is the program's greatest weakness, all of the very best functionality is hidden away and completely disorganized. This is vaguely understandable as most scripts are constantly under development, so forums are great for people to discuss modifications and updates, but I'd love to see a scripts wiki or user scripts list on the main site. Of the 5200 registered forum members I'm sure a couple would be happy to keep this updated. There is an "All Scripts" thread on the forum, but it's woefully out of date and presents as an unwieldy list. Most scripts also need to be added manually to MediaMonkey by copying the script code from a forum thread, creating a new file in the MediaMonkey scripts directory and pasting in the code, once again not the most friendly process if you're trying to discover new functionality.
However, I have plenty of time on my hands, so I have spent several nights gleefully wading through forum threads and testing out scripts to bring you a list of my favourites.
Jaymis' Favourite MediaMonkey Scripts
Magic Nodes is fantastic. Outwardly it works like Smart Playlists, allowing advanced dynamic filtering, however Magic Nodes lets you use SQL filtering for increased awesomeness, and also displays the results in a tree structure. Example Magic Node strings can be found here.
Auto Album DJ: If you reach the end of your Now Playing list, this script adds a randomly selected album to play next. Minimum tracks, average rating, minimum rating, genre etc. are customizable within the script code.
ScrobblerDJ is another automatic playlist filler. When the final track in now playing is reached this script queries Last.fm for a list of similar artists, then chooses a track from your library from one of those artists. This can cause a bit of a "feedback loop", filling your playlists with similar, popular artists, but this is great if you'd like to stay within a certain genre or mood, and if the playlist starts going awry you can pull it into a new direction by dropping a track of your intended mood on the end.
Radio Free Monkey is a playlist creation script which weighs tracks based on rating, how long they've been in the library etc.
Rate Played Song: If an unrated track is played through to the end, playback is paused and a ratings dialogue pops up.
Predefined Rating creates shortcuts for rating and moving between tracks, allowing you to rate albums quickly.
TweakMonkey allows you to tweak startup settings (volume, auto-play, shuffle, repeat, startup playlist, randomize playlist on startup, startup node) and hide nodes you're not interested in.
Play History Node: Like having a local last.fm which actually your stats when you play the tracks, rather than a week later when you don't care anymore.
Extract Fields
allows you to re-tag files based on their current tags. This is useful if you've used the aforementioned kludged compilation tagging system instead of album artist tags.
This is only the tiny subset of the available scripts which I've found useful or exciting. For more check out the Scripts and Components forum, or the wiki which I'm sure is coming any day now, right? Devs?
Quirks and Requests
MediaMonkey's thickly piled awesomeness hasn't made me blind to the problems or aspects which could do with some improvement. Obviously the script discovery and installation system needs an overhaul. I'd like to see an associated filetype extension for MediaMonkey Scripts, or at least some kind of packaging system which will install them for you, rather than having to manually create files and drop them into directories, which feels archaic and will prevent less advanced users discovering how great the program can be.
Tagging or rating the currently playing track will cause the audio to skip. This is an issue as basic as Apple's longstanding lack of gapless playback: It should not happen, and a remedy should be of highest priority. It took Apple 5 years to add gapless support to the iPod, let's hope MediaMonkey fix this sooner.
The shortcut keys are rather incongruous: [ctrl + p] for play? [ctrl + n] for next track? These should at least be customizable.
On my dual monitor system (driven by a Radeon X1600) the program always opens in the primary monitor, no matter where it was located when last closed. I'm guessing this may have something to do with the clever, svelte "now playing mode", but this behaviour is well documented in the forums and doesn't occur with any other program I run.
Some iTunes features which could do with porting
Smart playlists able to reference other playlists: This opens another level of advanced playlist creation. Examples here, here and here. Apple's Smart Playlists are also able to match "all" or "any" rules, which can be very useful.
Start Time and Stop Time: Allows you to skip those annoying hip hop skits or "hidden track padding" at the beginning and end of otherwise good music, removing pointless banter and 15 minute silences from your playlists.
Skip Count Displayed: I believe MediaMonkey keeps count of skipped tracks, but it would be useful to have this information available for display and playlist creation.
Fantastic. iTunes 7 has caught up a little and is on another level in the looks department, but it doesn't come anywhere near the abilities of this Monkey. If you have a PC you owe it to your music, give MediaMonkey a try.
Tags: audio, iTunes, media-players, mediamonkey, MP3, music, players, Software, Windows
Reed Ghazala's flickr Set: From Circuit Bending to Digital Art to Generally Crazy Ideas
Impactist's Beautiful Stop Motion Spot for Peace Corps
SoftwareWindows
IK's model of the Neve 1081 console is free this month, plus free EQ and metering
musicSoftware
Celebrate your Blue Monday with the choir sound from New Order – and Kraftwerk's Orchestron
Dorico 4 is finally engraving-level notation with MIDI editing powers, in a single tool
Get lost in magical 1983 footage of Brilliant Trees, delicate IBM Dictaphone looping