text:
Cheap ski holidays in hundreds of ski resorts worldwide.
This group sledging experience is great fun for both adults and kids and involves snaking down the Savonnette piste on a linked sledge of up to 10 people. The sled rides start from 5.45pm, once the slopes have cleared and they run until midnight.
See our ski holidays in Val d'Isere
How fast can you ski? Race your friends and family, while testing your speed on this specially created run. The sessions will run between 10am and midday and will cost 2 Euros per turn.
Ever wondered how the lift system works? Or how fake snow is made? Now you can find out, with this behind the scenes tour of Val d'Isere, where you'll get to explore the places which are usually off-limits to the public, such as the machine room. Pre booking is essential as there are just 20 places available and you must book before 12pm on the 12th March. The tour group will meet at 3.30pm in front of the Solaise ski pass office.
This unusual alpine festival combines live music, comedy and downhill races with networking opportunities for European financial firms. There will be special guest appearances from comedian Marcus Brigstocke and Olympic skier Chemmy Alcott.
See our ski holidays in Crans Montana
To book a place, visit the Momentum website
Take the train to 3100 Kulmhotel Gornergrat where you'll be greeted with a comforting evening meal of cheese fondue and live music. After your meal you can then choose to take a train back to Zermatt or alternatively, you can enjoy a moonlit ski tour to the Riffelalp.
See our ski holidays in Zermatt
Enjoy a week of ski and snowboard contests, DJ's on the slopes, ski and board lessons, plus games such as snow volleyball and snow soccer. If you're looking for some great après ski combined with some serious skiing / boarding, then this is the event for you!
See our ski holidays in Les Deux Alpes
For more information visit the SnowZone Website
Head to Tignes for the Number 1 European gay sport and winter festival this March. Expect DJ's, plenty of partying and of course, lots of snow. There will be a host of après entertainment, a welcome buffet with cocktails, live shows and the chance to try dog sledding, snowshoe hiking and ski jeering (sled's pulled by horses). What's more, you can also bring your non-skiing friends as the festival welcomes those who don't wish to hit up the slopes.
See our ski holidays in Tignes
For more information visit the European Snow Pride website
The end of March sees this free music festival in the popular resort of Val Thorens. With lots of DJ's playing a range of Electro, House, Techno, Trance and more, there's something to suit everyone.
See our ski holidays in Val Thorens
For more information visit the Festi Val Tho website
With your lift pass as your ticket, this large free festival is ideal for après and music lovers alike. The line-up is set to feature the Klaxons, Babyshambles, Mad Professor and more, set to a stunning mountain backdrop.
See our ski holidays in Avoriaz
See our ski holidays in Morzine
For more information visit the Rock the Pistes website
Britain heads to France in this week-long festival, with live bands, a reggae BBQ and plenty of skiing/snowboarding. There will also be British Slopestyle, Snowboardcross, Skicross and Halfpipe championships, which you can register to compete in either online or on the day of the event.
For more information visit The Brits Website
Featuring well known comedians John Bishop, Marcus Brigstocke and Al Murray, this comedy festival is definitely not one to be missed. Spend a day carving up the slopes followed by an evening of live stand up spread across three different venues.
See our ski holidays in Mayrhofen
For more information visit the Altitude Festival Website
What's this? Club Med is launching a new resort?
Yes, Club Med are opening a brand new 4 Trident resort in the popular French ski area in Val Thorens in the 3 Vallées. The resort will be called Val Thorens Sensations and is due to open on the 14th December 2014. They've used crowdsourcing to help decide on certain aspects of the new build, starting a Facebook community where followers helped to make key decisions, such as whether there should be an indoor climbing wall (they voted yes!). Sensations is set to operate from November to May, promising optimal snow cover during that time due to the resort's high altitude.
Who is the new resort aimed at?
The new resort will be aimed at groups of friends, singles, couples and families with teenage children. The resort is accessible to young children too (from 2 years up), however, there will no kids clubs or kids entertainment programmes running.
So what makes this newbie stand out from the other Club Med resorts then?
The resort will stand out from the rest due to its contemporary design, which features huge bay windows that will give guests a fantastic view of the surrounding snow-covered mountains. There are 3 sun-facing terraces and the majority of rooms promise to have breathtaking mountain views. Each of the rooms will be one of four different categories – there will be 361 Club Rooms, 12 Deluxe Rooms, 5 Junior Suites and 6 Suites.
We know that Club Med is all inclusive, so what dining options will this new resort provide me with?
There will be 2 onsite restaurants which will stay open from 7.30am till midnight, so whether you're an early riser or a night owl then there will be something to suit you. One of the restaurants will provide a buffet set up and the other will be a concept restaurant, catering for the more gourmet tastes and offering a menu of local cuisine. For those dying to get out on the slopes, a self-service take-away corner will provide guests with a range of hot drinks and snacks, which can be taken out onto the slopes with them.
What about the après ski?
If you're after a drink, then Sensations will have the choice of 2 bars and a packed schedule of evening entertainment. One bar will offer a more cosy and intimate setting, whereas the other will provide a more open and lively atmosphere. From 3.30pm each day, the Wine Cellar and Grocery Store will play host to a range of wine tasting sessions, after which guests can purchase goodies to take home with them.
Can I hire equipment direct from the resort?
Val Thorens Sensations have struck up a partnership with Rossignol and will also be supplying equipment by Lacroix and Dupraz, meaning that guests will be able to rent top quality boots, boards, skis and more. Once you've got your equipment sorted, you'll also have the option to take ski and snowboard lessons, which are included in the price and aimed at all levels from beginner through to advanced. The resort is also in a ski-in ski-out position, making it super easy to get out on the slopes once you've got your equipment.
When I'm not on the slopes, what other activities can I do?
Sensations will put a special focus on health, fitness and wellbeing, offering a range of additional packages which include fitness training, nutritional advice and spa treatments. If you want a break from the slopes, or you just fancy working on your fitness a bit more, then a range of fitness classes are included in the price of your stay. Zumba, Body-Balance and Pilates are just some of the classes on offer. Alternatively, if you're a little shy about training in a room full of others, you can choose to join in with a toning workout video, which will be available from the privacy of your room. For all those gym and weight fanatics out there, there is a fully equipped cardio and weight training zone. If you're on the lookout for a bit more adrenaline then there is also a large 10 metre high climbing wall with 4 routes, mountain biking, sledging, snow mobiling and boardercross. If you fancy a swim, then you can head to a nearby pool, where you'll receive free entry as a Val Thorens Sensations guest.
I'm too tired for more exercise, what can I do to relax here?
After a hard day on the slopes, why not relax with a Turkish Bath? All customers will have free access to the onsite Turkish Bath and will have the option to pay extra for spa treatments to wind down after an exhausting day.
Spa treatments aren't really my thing, what else can I do?
If you're still looking for more to do, then the resort will also house a tenpin bowling alley and a shopping boutique. Also on offer is a selection of 'a la carte' excursions, which will allow guests to pick and choose outings as they please. These will include a Baroque art guided tour, a traditional themed evening in a yurt and a snowscooter outing.
What else can you tell me about Sensations?
This new resort promises to be very digitally focused and wi-fi will even be available out on the slopes. High speed internet, ranging from free packages to high speed paid packages will be available in the hotel. The resort even has its own app so that users can look at the daily schedule of events, find ski buddies and share content such as images and music. In most public areas, digital screens will display information relating to daily activities and weather conditions. To top it all off, Sensations promises effective queue management to heighten guests overall experience, making it as stress free, fun and relaxed as possible.
You've had a pretty eventful year, what have been your highlights so far? The highlight for me has been the X-Games, I think that's the pinnacle that everyone wants to get to. Only eight girls in the world get invited. Just to get an invite is an achievement in itself and I was happy just to be there. I got a fourth. When I look back over my season that's definitely the thing I was happiest with. Congratulations Thank you Where is your favourite place to ski? My favourite place to ski is Breckenridge in America, it has the best park in the world and also everyone from skiing & snowboarding is there so you can catch up with people you haven't seen for a couple of months. When you're not on the slopes what can we find you doing? I spend a lot of time in the gym and at the physiotherapist. Normally half my time when I'm not on the slope goes toward making me better on the slopes, a lot of trampolining. Apart from that I hang out with my friends a lot. Who's your hero? Sarah Burke. She unfortunately passed away last year due to an injury in the half pipe but she's the reason why girls get to compete in the X-games, and she's one of the main reasons why we're in the Olympics. She really pushed forward for that. When we're all skiing at the Olympics everyone will be skiing for her. Winter is just around the corner, what are your plans for the season? My plans are to be back in Breckenridge at the start of the season for a couple of months and then really just follow the competition circuit where ever that takes us. Not too sure yet, it will probably be a different country every week but it's cool. If you could ski somewhere in the world where you haven't been before, where would it be and why? I think New Zealand, I haven't managed to be there for their winter but that's somewhere that everyone goes and I think it looks like a pretty cool place, so it sounds good. It's a very exciting time for British snow sports with the Olympics coming up, what are your hopes for the games? Obviously I'd love to win a medal. I'm going to try and put the best run down that I can. I'll try my hardest and hopefully I can. If I finish top ten or top five I'll be happy. I just want to have fun and experience it and try and get the best result I can. What do you think chances are for the British ski and board team to get medals? I think we have a huge chance. There are loads of different athletes that are up with a chance of winning medals. Not just ski and snowboard but we've got loads of good skeleton people. I think this will be one of the best games that team GB have ever had. And that fact that slopestyle is in it for the first time and halfpipe skiing is going to be pretty cool. So I'm just looking forward to it. Thank you very much. Thank you.
You do not currently have any holidays in your shortlist.
You currently have in your shortlist.


text:
...London Eacorts Giselle is a sexy blonde busty big tit mature B...,Cambs / Cambridgeshire escorts - East Anglia escorts. ... UK escorts directory ..
.. cottage discreet, had to use the back door" - quot;Pretty Black girl with big tits. ...Birmingham escorts and NEC escorts guide. ... West Midlands Escorts ..
.. you can share with the one and only glamorous European Lady here in the UK. ..... natural figure with curves in all the rights places; with my naturally big boobs, a firm ...A busty blonde escort girl with big boobs and busty brunettes is exactly what you ll find at Babylon Girls of London. London finest busty escorts include young
...Big Tit Escorts | The Big Tit Hut - The BIGGEST and the BEST Tits ... The biggest and the best big tit escorts in the UK and further afield here just for you! 2. ...UK Busty Babes serves up delicious escorts with big ol hooters. Big boobed escort agency serving big tit escorts to London.The only big booes pse agency in uk
...Here a Free Movies galleries for the search "Uk Escorts" from our site. ... Big Preggo Tits, Click Here Want to fuck beautiful pregnant Asians that are ready to pop ...Search result for birmingham Escort, birmingham escorts, birmingham escort agency ..
. so i do hope you like big boobs (,)(,) Hope to see you soon 07944463507 ...Real dirty escorts getting paid and getting laid! ... Hooker Toni From London Has Huge Tits ... Take a look at more pics of this big tittied whore being fucked! ...
Views: 10
Comments are closed for this blog post
© 2011 Powered by womantopescorts.com.

subset: commoncrawl


text:
Displaying 1 - 38 of 38 results.
Good and honest trader.
Very nice trader , everything went smooth +rep
My first profile on SteamTrades(xRANGELASHx).
He went first, all good! +rep
Good trader , everything went smooth +REP
good trader,key me first +rep!!!
Good trader. He was willing to give key first. +rep
Good trader ^,^
+rep Fast and good trader
He Went First Trusted Fast Trader THX +REP.
+Rep Good trader
fast trader, rep +
Good trader, +Rep
Good trader, quick and easy!
Good trader, + rep
Gave his key first, quick and easy, +rep! :)
Good trader, sent key first and receive gift immediately. +rep
good and kind trader+ rep!
Good trader, +Rep
Good Trades, good deal. Easy to trade with.
thanks for the game, perfect
fantastic trader +rep
fast and nice
+rep - traded keys, friendly and good trader!
Very good trader, fast, patient and awesome!
+Rep I went first with the keys then he gave me the items, nice and trustworthy.
Good Trader +rep :)
good trader +rep!
+rep, everything is excellent
fast and easy++++
Good Lad, fast and easy trade! Recommended. Rep level up!
traded game keys, everything went smooth
+rep good trader!
Nice and fast trader +rep
Good trade, thanks!
Good trader ++
Honest and trustable trader +rep
Displaying 1 - 38 of 38 results.


text:
This was one I had to try. It was for Valentine's Day from Meatout Mondays, and they suggested shaping them as hearts, but they are just as tasty without the look!
Combine dry ingredients and chocolate chips.
In a separate bowl, combine soymilk, oil, and vanilla extract. Add to dry mixture.
Add strawberries; mix until most lumps disappear (don't over mix – a few lumps are fine).
Cook on preheated, lightly oiled pan. Turn when bubbles form on surface and edges begin to dry.


text:
For the rest of a person's life, it is of utmost importance to sip liquids slowly at and between meals, chew foods well, and consume very small portions. Following a gastric bypass Roux-en-Y procedure, in which the part of the small intestine is bypassed, taking a multivitamin supplement that includes iron, folate, and vitamins A, B12, D, E, and K will help prevent deficiencies. To meet calcium needs, an extra supplement is usually required. Injections of vitamin B12 may also be needed. Regular and life-long follow-up is required for evaluation of possible deficiencies.
Protein malnutrition is another possible side effect. Our bodies use protein to make new cells, enzymes, and hormones. Bypassing part of the small intestine and reduced stomach size results in less protein being consumed and reduced absorption of the protein eaten. Many people find liquid protein supplements are necessary for the first few months after surgery or longer, depending on their tolerance of protein-rich foods. Foods high in protein include beef, pork, fish, chicken, cheese, peanut butter, and eggs. Seeing a registered dietitian for dietary advice before and after the operation will help prevent nutrition problems.
What follows is an example of what may be consumed in the course of a day once your diet has advanced to solid foods (usually 2–3 months after surgery).
8 AM: Breakfast
1/4 cup Cream of Wheat (about 6 bites of food)
1 poached egg
1/2 cup low-lactose milk or soy milk
1 cup water, sipped slowly
10 AM: Snack
1/2 cup artificially sweetened or plain yogurt
1/2 cup water, sipped slowly
12 Noon: Lunch
1 slice bread
2 ounces turkey breast (about 2 slices)
1 tablespoon mayonnaise or salad dressing
1/3 cup unsweetened applesauce
1 cup water, sipped slowly
2–3 PM: Snack
1/2 ripe banana
1/3 cup vegetable juice
1 1/2 cups water, sipped slowly
6 PM: Dinner
2 ounces lean ham (about 2 slices)
1/3 cup mashed sweet potatoes
2 teaspoons margarine
1/3 cup green beans
1 cup water, sipped slowly
8–9 PM: Snack
1 tablespoon peanut butter
4 crackers
1/2 cup fresh strawberries
Other sugar-free beverages (such as Sugar Free Kool-Aid or Crystal Lite) may be substituted for water. After the first six weeks of surgery, you can try to drink small amounts of a soft drink, but many people find they cannot tolerate the carbonation. Alcohol is also not recommended.
As you can see, portions eaten after surgery are 1/4 to 1/2 the amount a typical person would eat.
Insurance coverage
If you think weight-loss surgery is an option you'd like to explore, discuss it with your primary-care physician. Ask whether you are a good candidate for surgery and, if so, ask for a referral to a surgeon or bariatric center in your area. Bariatric surgery is very expensive (it costs $20,000 to $25,000), so you would want to get insurance approval before surgery.
Going through all of the proper channels and insurance prerequisites can be a challenging task. You may be able to find advice on navigating the insurance process by talking to others who are or have been in your situation by going to a support group.
If you decide to move forward with surgery, your primary-care physician will need to write a "letter of necessity" to submit to your insurance company. This letter explains why this surgery is needed and its benefits. Contact your insurance company to determine what other documentation is needed. It is not uncommon for companies to require preoperative consultations with a dietitian, psychologist, cardiologist, and lung specialist and documentation of failed attempts at weight loss in the past. Having detailed records will help the approval process. People who have untreated depression or alcohol or drug abuse problems will want to get their condition under control before undergoing surgery to satisfy the insurance company's psychological evaluation.


text:
tag:blogger.com,1999:blog-82144019124805033662014-12-19T18:12:38.398+01:00My life with Android :-)Gabor Pallerhttp://firstname.lastname@example.com:blogger.com,1999:blog-8214401912480503366.post-37009839757297969602014-12-19T17:38:00.003+01:002014-12-19T18:12:38.418+01:00Parsing BLE advertisement packets
Ever since I created the Gas Sensor demo (post here, video here, presentation here), I had the feeling of an unfinished business. That demo sent the sensor data in BLE advertisement packets so the client never connected to the sensor but received data from the sensor in a broadcast-like fashion. The implementation looked like this:

 public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {
 String deviceName = device.getName();
...
 int addDataOffs = deviceName.length() + 16;
 int siteid = ((int)scanRecord[addDataOffs]) & 0xFF;
 int ad1 = ((int)scanRecord[addDataOffs+1]) & 0xFF;

This was a quick & dirty solution that remained there from my earliest prototypes. It sort of assumes that the structure of the BLE advertisement packet is fixed so the sensor data can always be found at fixed locations of the advertisement packet. This does not have to be the case, Bluetooth 4.0 Core Specification, Part C, Appendix C (or Core Specification Supplement in case of 4.2 version) describes, how the fields of the advertisement packets look like. It just so happens that with the given version of the RFDuino BLE module, the Manufacturer Specific Data field where RFDuino puts the user data for the advertisement packet can always be found at a specific location.

The proper way is of course to parse this data format according to the referred appendix of the specification and in this post I will show you how I implemented it.

The example programs are attached to the end of this post. You have to be logged to Sfonge site to access them.

Let's see first the BLEScan project. The parser code is under the hu.uw.pallergabor.ble.adparser package. Then you just give the scanRecord array to AdParser's parseAdData method like this:

 ArrayList<AdElement> ads = AdParser.parseAdData(scanRecord);

and then you get an array of objects, each describing an element in the scan record. These objects can also produce printable representation like this:

Now let's see the revised GasSensorDemo project, how the gas sensor measurement is properly parsed out of the scan record. First we parse the scan packet fields:

 ArrayList<AdElement> ads = AdParser.parseAdData(scanRecord);

Then we look for a TypeManufacturerData element which corresponds to a Manufacturer Specific Data field in BLE. We make an extra check to make sure that the manufacturer field in the Manufacturer Specific Data is 0x0000 because RFDuino always creates a Manufacturer Specific Data field like that if the application programmer specifies additional advertisement data.

 AdElement e = ads.get(i);
 if( e instanceof TypeManufacturerData ) {
 TypeManufacturerData em = (TypeManufacturerData)e;
 if( em.getManufacturer() == 0x0000) {

It would be tempting to use a custom manufacturer field or better, a Service Data field. But then we run into another limitation of RFDuino because RFDuino with its default firmware is only able to create advertisement packets like in the previous example. This is not bad because it allows the programmer to achieve quick success but later on, we will need more flexibility and that will need another BLE module.
Gabor Pallerhttp://firstname.lastname@example.com:blogger.com,1999:blog-8214401912480503366.post-51412740389468088272014-11-24T07:22:00.001+01:002014-11-24T07:22:33.330+01:00Connect your Android to the real world with Bluetooth Low Energy
This is my presentation at Londroid IoT meeting, 2014 nov. 19.

  Connect your Android to the real world with Bluetooth Low Energy  from Gabor Paller
 Gabor Pallerhttp://email@example.com:blogger.com,1999:blog-8214401912480503366.post-17713569010668682722014-11-21T10:27:00.002+01:002014-11-21T10:27:52.397+01:00Motor boat control with Bluetooth Low Energy
 My previous post about Bluetooth Low Energy applications with RFDuino and Android presented a connectionless gas sensor. That prototype was based solely on BLE advertisements, no connection was built between the scanner device (Android phone or tablet) and the sensor. While this connection-less operation is advantageous for sensors that just broadcast their measurement data, more complex scenarios that e.g. require authentication or build a communication session cannot be implemented in this model. The prototype I am going to present in this post demonstrates connection-oriented operation between RFDuino and an Android application.

Watch this video to see what the application is about.

<object width="320" height="266" class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="https://i.ytimg.com/vi/IWID35cOLZg/0.jpg"><param name="movie" value="https://www.youtube.com/v/IWID35cOLZg?version=3&f=user_uploads&c=google-webdrive-0&app=youtube_gdata" /><param name="bgcolor" value="#FFFFFF" /><param name="allowFullScreen" value="true" /><embed width="320" height="266" src="https://www.youtube.com/v/IWID35cOLZg?version=3&f=user_uploads&c=google-webdrive-0&app=youtube_gdata" type="application/x-shockwave-flash" allowfullscreen="true"></embed></object>

The story behind this motor boat project is that I bought this RC-controlled model boat while I worked in the UK. But when we moved back to Hungary, I lost the RC controller. So the boat had been unused for years until I realized how great it would be to use an Android device as a controller. Hence I quickly integrated the RFDuino with the motor boat's original control circuitry and wrote the necessary software. As you can see in the video, it has quite respectable range even though I did not dare go into the October water of Lake Balaton where the second part of the video was shot (water temperature: some 10 degrees centigrade).

First about the "hardware". I did not have the circuit schema of the original RC controller in the boat so I had to experiment a bit. By following the motors' cables I quickly found two three-legged stocky elements that looked like switching transistors (although the labels on them were not readable after all those years in service). I removed one end of the resistors that I thought connected the base of these transistors to the rest of the RC control circuit and tried out, how much current is needed to switch on the motors. To my pleasant surprise, 1 mA current was enough so I rather believe that these are actually not transistors but power switching ICs. Anyway, RFDuino outputs can provide 1 mA switching current so I just connected the other end of those removed resistors to two spare RFDuino I/O ports. Lo and behold, it worked. If RFDuino raises any of these pin to 1, the respective motor starts. One minor additional problem was about the power supply of RFDuino. The motor boat employs an 7.2 Volt battery and RFDuino needs 3.3 V. I added an LM1117-3.3V power regulator circuit between the battery and RFDuino and the "hardware" was ready.

Do you know about BLE concepts like service and characteristics? If not, please read this presentation for a quick introduction. In short: BLE services (also called GATT profiles) are composed of characteristics which are key-value pairs decorated by meta-information that the BLE specification calls descriptors. RFDuino with its default firmware is not able to implement any standard GATT profile except for its own custom GATT profile. This is a major disadvantage in product-level development but makes RFDuino code super-easy because the programmer does not have to deal with BLE details. In the RFDuino custom service, a "read" and a "write" characteristic is defined. Whatever the client (in our case, the Android application) writes into the "write" characteristic appears for the RFDuino code as incoming data callback. If the RFDuino code calls the RFduinoBLE.send(v) method, the data appears in the "read" characteristic. The Android client can register a callback for data manipulations of the "read" characteristic so it will receive callbacks when RFDuino code invokes the RFduinoBLE.send() method. There are additional callbacks for service connections and disconnections.

You can download the Android project and the RFDuino source at the end of this post. You have to be logged to the Sfonge site to access these.

First about the RFDuino code. Beside the familiar setup() and loop() functions, you will see three functions characteristic to RFDuino. RFduinoBLE_onConnect() is called if a client connects to the RFDuino BLE service, RFduinoBLE_onDisconnect() is called on disconnection and RFduinoBLE_onReceive() is called when there is incoming data. There is only one complication in the code that requires explanation: this is a powerful motorboat and it can go out of BLE radio range very quickly. In the early versions the boat became uncontrollable in this case meaning that it just continued with the last command received. That was not a nice feature so I implemented a heartbeat message feature which is sent in every 5 second. The loop() method starts by sending the heartbeat to the client and goes to sleep. It wakes up after 5 seconds and if it finds that the client did not send back the heartbeat, it stops the motors. Otherwise the client just sends a bit mask about which motors to stop or start and the RFDuino just responds with the same mask informing the client that the motors were indeed started or stopped. This means that the arrows on the user interface showing which motors are running represent the actual state of the boat which is advantageous if something goes wrong.

Then about the Android side. The code starts by discovering the device. Once the device is discovered, we connect to the device with the connectGatt() method then discover its services with gatt.discoverServices() method. Once the service discovery callback arrives, we retrieve the RFDuino service (getService(), we expect this custom service) and obtain the characteristic handles (getCharacteristic()). We use the "read" characteristic's client configuration descriptor to enable notifications from the RFDuino server to the Android client so that we get a callback when the RFDuino side sends something to us.

Disconnection is worth detailing because there's an RFDuino speciality here. Normally, one can just disconnect from the service with the disconnect() method invocation. RFDuino however is left in a limbo state in this case: the BLE session is disconnected but the RFDuino application does not receive a callback and cannot accept a new connection request. The "disconnect" characteristic has to be written to (the value does not matter) for the RFDuino server to properly disconnect.

Gabor Pallerhttp://firstname.lastname@example.com:blogger.com,1999:blog-8214401912480503366.post-73241178664372006602014-10-03T15:53:00.000+02:002014-10-07T21:21:28.319+02:00Award for our Android Gas Sensor
I just got a mail that our gas sensor entry (a gas sensor with Bluetooth Low Energy connectivity and the associated Android application) has just won 3rd place on the We Know RFDuino contest. Thanks to everyone who viewed our video and thus helped us to compete successfully! Meanwhile the source code of the prototype was made open source so you may want to check out that too!
Gabor Pallerhttp://email@example.com:blogger.com,1999:blog-8214401912480503366.post-81800618253378363622014-09-29T21:22:00.002+02:002014-09-29T21:22:52.123+02:00Gas sensor prototype explained
The "We know RFDuino" contest has not ended yet but its end is sufficiently close so that I can explain our prototype application. Our entry is a Bluetooth Low Energy-connected gas sensor and it is presented in the video below. Make sure that you watch it, you help us win the competition.

<object width="320" height="266" class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="https://i.ytimg.com/vi/iYWIzbJK81U/0.jpg"><param name="movie" value="https://www.youtube.com/v/iYWIzbJK81U?version=3&f=user_uploads&c=google-webdrive-0&app=youtube_gdata" /><param name="bgcolor" value="#FFFFFF" /><param name="allowFullScreen" value="true" /><embed width="320" height="266" src="https://www.youtube.com/v/iYWIzbJK81U?version=3&f=user_uploads&c=google-webdrive-0&app=youtube_gdata" type="application/x-shockwave-flash" allowfullscreen="true"></embed></object>

The prototype demonstrates a unique capability of Bluetooth Low Energy device advertisement messages: you can embed user data into these broadcasts. These come handy if you just want to send out some measurement data to whoever cares to listen without creating a session between the BLE client and server. This broadcast-type data transfer may support unlimited number of clients with very low energy consumption on the sensor side.

Click here to download the Android client application project.

Click here to download the RFDuino source code.

The prototype works like the following. The microcontroller presented in the video measures the Lower Explosion Limit and sends this value to the RFDuino microcontroller over a super-simpe serial protocol. A message of this protocol looks like this:

0xA5 <seq_no> <LEL%>

where seq_no is an increasing value and LEL% is the measured Lower Explosion Limit value. The microcontroller code is not shared here but you can get the idea. The RFDuino code receives the LEL% value over the serial port it creates on GPIO pins 3 and 4, creates a custom data structure for BLE advertisements consisting of the site ID and the LEL% value then starts advertising. This is performed cyclically so the LEL% value is updated in the sensor's BLE advertisement every second.

Now let's see what happens on the Android side. This is a non-trivial application with multiple activities but the Real Thing (TM) happens in the MapScreenActivity, in the onLeScan method. This method is called every time the Android device's BLE stack discovers a device. In this case we check whether the device's name is "g" (this is how we identify our sensor) and we retrieve the LEL% data from the advertisement packet. We also handle the Received Signal Strenght Indicator (rssi) value for proximity indication. Bluetooth device discovery is restarted in every 2 seconds so that we can retrieve the latest LEL% value. The rest is just Plain Old Android Programming.

The identification of the sensor and the encoding of the sensor data is obviously very naive but this is not really the point. You can make it as complex as you like, e.g. you can protect the sensor data with a hash and place that hash also into the advertisement so that the receiver can make sure that it gets data from an authorized sensor and not a fake one. The important thing is that the entire framework is sufficiently flexible so that relatively complex functionality can be implemented and RFDuino really simplifies sensor programming a lot.

If you enjoyed the example application, make sure you watch the video (many times if possible :-)) and if you happen to be in London on 2014 November 19, you might as well come to the Londroid meetup where I present this and another BLE project (a connection-oriented one, called MotorBoat).
Gabor Pallerhttp://firstname.lastname@example.com:blogger.com,1999:blog-8214401912480503366.post-37653323858512035742014-09-06T12:08:00.003+02:002014-09-06T20:25:48.692+02:00Camera shot on charger connection
Somebody came to me with an idea whether a cheap Android phone can be turned into an automatic camera. Some external sensor would send a signal to the phone and the phone would take a picture automatically. We started to discuss the possible connection of the external sensor and an interesting idea came up: the charger connection.

Android delivers an event whenever the charging power is connected or disconnected: can it be used to send a binary signal to an application in a very simple way, without fiddling with Bluetooth or USB?

Click here to download the example application.

You have to start the application once. Then whenever you connect the charger, it takes a picture. When the application is in the foreground, a preview is shown but as long as the application is active (not destroyed) it works from the background too.

Here are the experiences:

On my high-end device the application reacted quickly to charger connection, the reaction time from connecting the charger to the camera shot was less than a second. But when the application was tested on the very low-end Android target device, the picture was much less rosy: the delay increased to 3-4 seconds, effectively making the solution unusable.

In order for this application to work, it has to be started at least once manually. This pretty much kills all unattended use cases.

The shutter sound is almost impossible to remove. Update: on certain devices (Nexus 4 and Nexus 7 confirmed) there is no shutter sound in silent mode.

The takeaway for us was to reject the idea. But I share the example program anyway, maybe it can be useful for somebody.

One last thing. View our video about our Bluetooth Low Energy sensor application prototype and help us win the "We Know RFDuino" contest!

Gabor Pallerhttp://firstname.lastname@example.com:blogger.com,1999:blog-8214401912480503366.post-27506106503640898312014-09-02T22:33:00.001+02:002014-09-02T22:33:22.243+02:00Android gas sensor application with Bluetooth Low Energy/RFDuino
I have always had a fascination with sensors linked up with mobile devices so it seemed just a good opportunity to try out the latest fashionable technology in the area, Bluetooth Low Energy in the context of a competition. SemiconductorStore.com announced the "We know RFDuino" competition for applications of the RFDuino module. RFDuino is an Arduino module with Bluetooth Low Energy (BLE) support. It is ideal to act as an interface between a sensor and a BLE-enabled mobile device like the Nexus 7.

Eventually I will publish the entire source code of this prototype application on this blog. But as this is a contest, I will wait until the contest ends (Sept. 30). Till then, watch the (very amateurish) video we have prepared about our sensor and the Android application. The entry with the most views wins the contest so if you like the concept, share the video with others! Thanks in advance. :-)

<object width="320" height="266" class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="https://i.ytimg.com/vi/iYWIzbJK81U/0.jpg"><param name="movie" value="https://www.youtube.com/v/iYWIzbJK81U?version=3&f=user_uploads&c=google-webdrive-0&app=youtube_gdata" /><param name="bgcolor" value="#FFFFFF" /><param name="allowFullScreen" value="true" /><embed width="320" height="266" src="https://www.youtube.com/v/iYWIzbJK81U?version=3&f=user_uploads&c=google-webdrive-0&app=youtube_gdata" type="application/x-shockwave-flash" allowfullscreen="true"></embed></object>

Gabor Pallerhttp://firstname.lastname@example.com:blogger.com,1999:blog-8214401912480503366.post-91784464952435419012014-03-11T21:42:00.001+01:002014-03-11T21:42:54.730+01:00Beyond RenderScript - parallelism with NEON

My last post about the parallel implementation of Distributed Time Warping (DTW) algorithm was a disappointment. The RenderScript runtime executed the parallel implementation significantly slower than the single-core implementation (also implemented with RenderScript). It turned out that parallelizing the processing of 10000-50000 element vectors on multiple cores were not worth the cost of the multi-thread processing and all the overhead that comes with it (threads, semaphores, etc.). One core must be allocated a significantly larger workload but our DTW algorithm is not able to generate such a large, independent workload because rows of the DTW matrix depend on each other. So in order to exploit RenderScript multi-core support, it is best to have an algorithm where the output depends on only the input and not on some intermediate result because this type of algorithm can be sliced up easily to multiple cores.

It would have been such a waste to discard our quite complicated parallel processing DTW algorithm so I turned to other means of parallel execution. Multi-core is one option but the ARM processors in popular Android devices have another parallel execution engine, internal to the core, the NEON execution engine. One NEON instruction is able to process 4 32-bit integers in parallel (see picture below). Can we speed up DTW fourfold with this option?

NEON is actually quite an old technology, even Nexus One was equipped with it. It is much more widely deployed therefore than multi-core CPUs. While ordinary applications can take advantage of multi-core CPUs (e.g. two processes can execute in parallel on two cores), NEON programs are difficult to write. Although some compilers claim the ability to generate NEON code and template libraries are available, the experience is that the potential performance benefits cannot be exploited without hand-coding in assembly and that's not for the faint hearted.

The example program is attached at the end of this post. You have to be logged to the Sfonge site to access it.

The relevant functions are in jni/cpucore.c. There are 3 implementations, processNativeSlow, processNative and processNativeNEON, each is progressively more optimized than the previous one. The processNativeSlow and processNative functions are in C, in processNativeNEON the most time-critical loop ("tight loop") is entirely implemented in mixed ARM/NEON assembly. This tight loop produces 4 result elements in parallel so we expect huge performance gain over the single-core RenderScript implementation (dtw.rs).

The experience is completely different. While the NEON implementation is significantly faster on small datasets, one second of voice is 8000 samples so data sizes grow quickly. On 10 second data sets (80000 samples, 6.4 billion element DTW matrix) the simple nested loop C99 implementation and the complex, hard to understand NEON implementation produces about the same execution time.

How is this possible? Let's take an example of 10 second reference and evaluation samples. This means 80000 elements, 80000*80000=6.4 billion values to calculate. Calculating each value takes 20 bytes to access (2 input samples (2 bytes each), 3 neighbor cells (4 bytes each) and storing the result (4 bytes)). A1 SD Bench measures 800 Mbyte/sec copying performance on my Galaxy Nexus (and similar values on the two cheap Android tablets that the family has), that obviously means 2 accesses (one read and one write). For simplicity, let's assume that reads and writes take about the same time. This means that according to this very rough calculation, the memory accesses themselves take about 80 sec. The real execution time is about 120 sec, the difference can be explained by the simplifications. Cache does not really help because of the large data size. The performance is determined by the RAM speed and the simplest single-core implementation already reaches the bottleneck. All the wizardry with parallelism is futile.

Obviously the case was not helped by the selection of the DTW algorithm as benchmark which intentionally does not fit into the class of algorithms normally used to demonstrate the benefits of parallel processing. Grayscale conversion would be better (one read, one write and 3 multiplications per pixel). But this means that you actually have to be really lucky with your algorithms for these parallel options to speed up your code significantly. Even then, it is worth looking at the parallel options inside the core before going multi-core. And you definitely should not forget the auxiliary costs of parallel computation, e.g. distributing/gathering the data to/from the parallel processing units or whether other hardware (e.g. memory) is able to keep the pace with the CPU.

One wild idea at the end. Could RenderScript computation model be used to generate NEON code? With some limitations, the answer is probably yes.
Gabor Pallerhttp://firstname.lastname@example.com:blogger.com,1999:blog-8214401912480503366.post-64620285871774451592014-02-07T21:35:00.000+01:002014-02-07T21:35:22.092+01:00RenderScript in Android - the parallel version
In the previous post I promised to revisit the parallel case. The big promise of RenderScript is to exploit parallelism among different CPUs, GPUs and DSPs in the device at no additional cost. Once the algorithm is properly transformed into parallel version, the RenderScript runtime grabs whatever computing devices are available and schedules the subtask automatically.

The problem with DTW is that it is not so trivial to parallelize. Each cell in the matrix depends on cells at (x-1,y), (x-1,y-1) and (x,y-1) (provided that the cell to calculate is at (x,y)). By traversing the matrix horizontally or vertically, only two rows (one horizontal and one vertical) can be evaluated in parallel.

Michael Leahy recommended a paper that solves this problem. This algorithm traverses the matrix diagonally. Each diagonal row depends on the two previous diagonal rows but cells in one diagonal row don't depend on each other. One diagonal row can be then fed to RenderScript to iterate over it. The picture below illustrates the concept.

The example program can be downloaded at the end of this post. You have to be logged to Sfonge site to access it.

You will notice that there are two parallel implementations. The findReferenceSignalC99Parallel() is the "proper" implementation that follows closely the RenderScript tutorial. Here the diagonal rows are iterated in Java and only the parallel kernel is implemented in RenderScript. This version - even though it is functional - is not invoked by default because it delivers completely inacceptable performance on my 2-core Galaxy Nexus. By looking closely at the execution times, I concluded that even though RenderScript runtime invocations ( copying into Allocations and invoking forEach) are normally fast, sometimes very innocent-looking invocations (like copying 5 integers into an Allocation) can take about a second. This completely ruined this implementation's performance.

The other parallel implementation which is actually invoked and whose performance is compared to the 1-core RenderScript implementation (the fastest one) is findReferenceSignalC99ParallelRSOnly(). This version is implemented entirely in RenderScript. Unfortunately its performance is 2-2.5 times slower than the 1-core implementation. How can it be?

First, if you compare dtw.rs and dtwparallel2.rs, you will notice that the parallel implementation is considerably more complex. Indexing out those varying-length diagonal rows takes a bit of fiddling while the 1-core implementation can take the advantage of fast pointer arithmetic to move from cell to cell sequentially. So the parallel implementation starts with a handicap. This handicap is not compensated by the 2 cores of the Galaxy Nexus.

OK, Galaxy Nexus is the stone age but what happens on a 4-core processor like on a Nexus 4? The runtime does launch with 4 cores but then the Adreno driver kicks in and the result is that the parallel implementation is about 3 times slower than the serial one. What happens in the driver, I don't know, as far as I can see, the source code is not available.

Jasons Sams recommended to disable the GPU driver with
adb shell setprop debug.rs.default-CPU-driver 1
but I decided to stop my adventures here. The conclusion I drew for myself is that RenderScript in its present form is not ready for parallel programming. Clang-LLVM is a very promising compilation technology but the parallel runtime suffers from a number of problems. IMHO, there should be a way to programmatically control the way the workloads are allocated to CPUs/GPUs. Until then, if you want to harness the power of your multicore processor, code the parallel runtime yourself. Using RenderScript for the serial code if you wish.

Gabor Pallerhttp://email@example.com:blogger.com,1999:blog-8214401912480503366.post-47413771237900930412014-01-30T22:05:00.000+01:002014-01-30T22:05:59.334+01:00RenderScript in Android - anatomy of the benchmark program
 In the previous post I have presented our RenderScript benchmark and demonstrated that RenderScript implementation of the same algorithm can be 2-3 times faster than Java. How can a "script" be so fast? In order to understand this speed difference, let's see how the RenderScript fragment is executed.

The example program is attached to the end of this post. You have to be logged to the Sfonge site to access it.

First, let's see how the script looks like. The source can be found in dtw.rs, in the same directory where other Java sources (just one file in this case) are.

It looks like an innocent C function but there are some specialties. All the global variables like these ones:

int32_t s2len = 0;
int32_t *d0;

can be used to pass data to the script. The toolchain generates a Java wrapper for each .rs file, ours is called ScriptC_dtw.java. In order to set s2len, for example, one calls the set_s2len function in the ScriptC_dtw class. The d0 global variable is a pointer type, setting this variable requires an Allocation Java object. Open MainActivity.java and look up the findReferenceSignalC99() method. There you will find:

  Allocation signal1Allocation = Allocation.createSized(
 rsC,
 Element.I16(rsC),
 refSignal.length);
 signal1Allocation.copyFrom(refSignal);
 script.bind_signal1(signal1Allocation);

Here we created an allocation that holds 16-bit integers, copied the input signal into it and bound the allocation so that the allocation's data is available to the script. When the script is invoked, the data area of this allocation is simply available to the script as:

int16_t *signal1;

This sort of parameter passing is one-way for simple values but two-way for allocations. So whatever you write in your script into e.g. s2len, you won't be able to read it in the Java layer after the script finishes executing. In contrast, Allocations provide two-way data transfer, that's why the result value is passed back to Java in an Allocation.

In MainActivity.java:

  Allocation rAllocation = Allocation.createSized(
 rsC,
 Element.I32(rsC),
 1);
 script.bind_r(rAllocation);

In dtw.rs:

  *r = d1[s1len-1];

And again in MainActivity.java after the script finished executing:

  int result[] = new int[1];
 rAllocation.copyTo(result);
...
 int maxc = result[0];

The execution of the script seems simple enough but there's more than meets the eye.

Execution context and the script instance are created.

  RenderScript rsC = RenderScript.create( this);
 ScriptC_dtw script = new ScriptC_dtw(
 rsC,
 getResources(),
 R.raw.dtw);

ScriptC_dtw is the wrapper which was generated by RenderScript toolchain. But what is R.raw.dtw? Let's see how our "script" was turned into executable code. If you unzip the APK file, you find some interesting artifacts. Under the res/raw directory, you find dtw.bc. This is the LLVM bytecode that dtw.rs was compiled to. In addition, under the lib directory, you will find .so files for the ARM, MIPS and Intel platform. If you disassemble librs.dtw.so, you will find highly optimized binary compiled from our script which is really a piece of valid C code.

The RenderScript name generates a confusion. This name evokes a proprietary scripting language when in fact it is Clang's C99 front-end compiler with a set of libraries that are ported to a large number of processors. Optimized C code is fast, what is so surprising in it? When our "script" is executed on an ARM processor, the RenderScript runtime just has to load the precompiled ARM code and execute it. If it turns out that there is no precompiled native code for the target processor (e.g. it is a GPU) then LLVM backend compiler swings into action and generates code for that processor at installation time. Both compilation steps (from C to LLVM bytecode and from LLVM bytecode to native) are subject to optimization so the resulting native code is very fast. No wonder therefore that RenderScript beats Dalvik VM so easily and with such a large margin.

After all the global variables have been initialized, the script can be invoked.

  script.invoke_dtw();
 rsC.finish();

Note the finish() invocation here. The invoke_dtw() method is asynchronous meaning that when it returns, the execution of the "script" has not finished, in fact, it was not even started. The finish() method on the RenderScript instance blocks until the script invocations on that context all finish. Script invocations in the same context are executed sequentially.

But what happens when more than one context is created? Allocations and script execution in those contexts are independent. If you have enough cores/processors, script invocations in those contexts will execute in parallel. Be aware, however, that if you create more contexts than the number of processing units you have then those contexts will compete for the same processing units by means of context switching and these context switches will eventually decrease your performance. If your algorithm requires an element scan which is more complicated than the sequence that foreach() supports, you can always create a dummy allocation with as many elements as the processing elements your algorithm supports and release foreach() on that dummy allocation. Then your kernel will access elements of the data set in any order it wishes.

How does RenderScript compare to established technologies like Android SDK or NDK? For Google, the equation is simple: RenderScript is mainly for GPUs, hence its name. I tried to present the case here that for an average Android programmer, RenderScript provides a much more productive way to offload computation-intensive code fragments to highly optimized native code than NDK. RenderScript is integrated with the Android SDK, compilation is super-fast, wrappers are generated automatically, JNI issues are non-existing, coding parallel execution is simpler than either with the SDK or with the NDK. Faster execution also means lower battery consumption as this presentation demonstrated in a different context. And who knows, one day a device with a multicore CPU, GPU or DSP comes along that speeds up your application even further, at no cost. As RenderScript has LLVM at its heart, the possibility is there.
Gabor Pallerhttp://firstname.lastname@example.com:blogger.com,1999:blog-8214401912480503366.post-36267383578099987452014-01-27T21:24:00.000+01:002014-01-27T21:24:34.053+01:00RenderScript in Android - Java optimization in the benchmark program
I got into discussion with Michael Leahy with regards to the benchmark program posted at the end of the previous post. Michael claimed that the Java implementation of the benchmark algorithm in my test program is suboptimal and he contributed an optimized version that he claims could deliver 70% better performance.

Therefore I decided to re-evaluate the benchmark results - but with a twist. Not only I added Michael's optimized Java implementation but I optimized the RenderScript implementation too. The results are the following.

Michael's implementation did improve the execution time of the Java implementation by about 2.6 times.

RenderScript implementation is still about 2.3 times faster than Michael's optimized Java implementation.

The new version is attached to the end of this post. You need to be logged to Sfonge site to access it. I will continue with explaining this example program in the next post.

Gabor Pallerhttp://email@example.com:blogger.com,1999:blog-8214401912480503366.post-33005671184794307292014-01-25T22:02:00.000+01:002014-01-27T21:45:49.729+01:00RenderScript in Android - the benchmark program
The previous post of this series tried to present argument, why it is a good idea to consider implementing part of your code in RenderScript, instead of Java or native code. This part presents a benchmark that we will use to evaluate the technology. I intentionally chose the benchmark not to be an image manipulation algorithm or a convolution filter. I wanted a use case that processes large amount of data. Sound processing yields itself as a quite evident choice.

The algorithm I am going to present is quite naive and would require a lot of refinement for commercial deployment. But my goal was RenderScript benchmarking so the algorithm's tolerance to all kinds of environmental disturbances was not relevant. We will do voice fingerprinting that takes a voice sample array, compares this sample to a reference sample and returns true or false depending on whether the voice sample is sufficiently similar to the reference sample. The algorithm should return true if the voice sample contains the same word from the same speaker, false otherwise.

I implemented Dynamic Time-Warping (DTW) for the purpose. DTW compares two data series assuming that the timing between the two series may be different. For example the same speaker may say the same word with slightly higher pitch. Therefore DTW calculates a so called warping path, a pair of corresponding timestamps from series1 and series2. E.g. a part of a warping path may be (1,1), (1,2),(2,3),(3,3) meaning that a[1] (data at index #1 from series1) corresponds to b[1], a[1] corresponds to b[2], a[2] corresponds to b[3] and a[3] corresponds to b[3]. Knowing the warping path and a cost function, the distance between the two series can be calculated. DTW finds the warping path with the lowest cumulative cost (i.e. the sum of cost between the corresponding data items along the warping path). A detailed introduction to the algorithm can be found here.

This example program implements classic DTW calculating every possible pairing between the data items of the two series. This requires an NxM matrix where N is the size of series1 and M is the size of series2. DTW(i,n) (element at position (i,n) in this matrix) is the accumulated cost value (sum of the cost function values) of the optimal warping path that leads through the position at i,n. (i.e. with assuming that index i in series1 and index n in series2 correspond to each other). The function calculating DTW(i,n) is thus:

DTW(i,n)=min(DTW(i-1,n),DTW(i-1,n-1),DTW(i,n-1))+c(i,n)

where c(i,n) is the cost between a[i] and b[n]. The example program uses

c(i,n)=abs(a[i]-b[n]))

Cells at the edge of the matrix are initialized like

DTW(i,0)=sum(c(i,0))

and

DTW(0,i)=sum(c(0,i))

Classic DTW can require a large amount of space. Take for example a short voice sample. With a sampling rate of 44100Hz/5=8820Hz, even a short word can generate easily a vector of 5000-8000 elements. If the reference vector is of a similar size, the DTW matrix will consist of 25 million to 64 million elements, all of them integer (meaning 4 bytes each). A data item of that size may easily exhaust the fixed maximum process space allocated to Android applications. Therefore we do a simple optimization. The output of our algorithm is the optimal distance which will be found at DTW(M,N), the right-bottom element in the matrix. In order to calculate elements in row i, we need only elements in row i-1 plus the already calculated elements in row i. We can drop row i-2 and calculate DTW(i,0) on the fly, when we get there. This will reduce the memory requirement to 2*M data items instead of N*M.

DTW, however naive its application in the example program, satisfies our RenderScript benchmark needs because

The kernel function is non-linear, it is not so evident to break it down to sub-ranges (although FastDTW does precisely that).

Calculation of matrix cells depend on an intermediate result of the calculation and not only on the input values.

The example program is attached to the end of this post. You need a free registration to the Sfonge site to access it. The application exercises the DTW algorithm on speech samples. Launch the application and record a reference sample. E.g. record a word like "four". Then record a same or different word from the same or different speaker and observe the distance that DTW calculates. If the environment is not too noisy, you will find that same word from the same speaker yields a (normalized) distance below 1000-1200 while other words from the same speaker or the same word from a different speaker yields higher distance. The calculation takes a bit of time because the DTW algorithm is executed twice, once in Java and once in RenderScript. The application displays the execution time for both implementations.

For now, you can observe that RenderScript execution times are 4-5 times smaller than Java execution times even (Update: visit this post for an updated number. After optimization, RenderScript is still 2.3 faster). though the implementation does not exploit any parallelization features. I will go deeper into this observation in the next post.
Gabor Pallerhttp://email@example.com:blogger.com,1999:blog-8214401912480503366.post-16581634382280787122014-01-22T20:56:00.002+01:002014-01-22T20:56:59.460+01:00RenderScript in Android - why should you care?Before 3.0, Android application development meant either using the SDK - which is a Java toolchain - or the NDK - which is a C/C++ toolchain based on the gcc compiler. The 3.0 version added a third option, RenderScript. RenderScript was positioned as an auxiliary toolchain for special tasks like image manipulation operations. In this post I will investigate whether it makes sense to use RenderScript for more mainstream coding problems.

 If you search the web for RenderScript, you won't get too many hits. This is due to the fact that RenderScript is really just the Google name for the technology which is based on two powerful software packages: the clang compiler and the LLVM "virtual machine". Clang is a C/C++ front-end compiler and is a strong challenger to gcc. RenderScript code is processed by clang and is turned into LLVM bytecode. LLVM is not a virtual machine in a strong sense as it does not "execute" this bytecode. Rather, it provides a second compilation step when it turns the LLVM bytecode into machine code of the target processor.

 Much like Android's new runtime, the ART, LLVM is an Ahead-of-Time compiler. The second compilation step either happens on the developer's machine or directly on the device. The first option means that the Clang-LLVM toolchain generates code for 3 processor families: ARM, MIPS and Intel so your APK file already contains native code generated from RenderScript code for these processors and no further compilation is needed on the device. RenderScript code may run on graphical co-processors and other DSPs, however. In this case the on-device LLVM compiler accesses the LLVM bytecode which is also packaged into the APK file and may generate code for these specialized processors at install time.

 So if you write RenderScript instead of native implementation with the traditional NDK toolchain, you get the performance of the native code, support of many processor architectures including more exotic GPUs and DSPs without any hassles, get a simpler integration with the Java code and a much smoother integration with the Eclipse developer environment.

 RenderScript appeared in Android 3.0 and supporting Java packages reside under the android.renderscript hierarchy. This is called native RenderScript. Google, however, backported the feature to Android 2.2 (and higher) and this backported version is now the recommended way. Instead of being part of the platform, RenderScript support now resides in a support library and is under the android.support.v8.renderscript package hierarchy. Functionality of android.renderscript and android.support.v8.renderscript are largely similar.

 Even though the RenderScript runtime is general-purpose, Google positions the technology as a solution for specific tasks. The RenderScript tutorial, for example, concentrates mainly on the filtering runtime that executes a RenderScript function - so called "kernel" - on a large number of data items. This assumes a certain class of algorithm, i.e. when the output of the algorithm depends solely on the input and not on some intermediate result of the computation. Simple convolution filters (e.g. the 2D filters used widely for image filtering) are such algorithms and therefore they are very suitable for parallel execution on multiple CPU cores. We will see, however, that RenderScript can be exploited to speed up algorithms that do not fit into this computation model.

 In the next post I will present our benchmark program.Gabor Pallerhttp://email@example.com:blogger.com,1999:blog-8214401912480503366.post-9026192615021371722013-11-27T10:30:00.000+01:002013-11-27T11:16:17.497+01:00Podcast of my Droidcon London 2013 presentation
For those who prefer the live experience to the presentation, here is the podcast of my Droidcon London 2013 presentation titled "Sensor Fusion Between Car and Smartphone".
Gabor Pallerhttp://email@example.com:blogger.com,1999:blog-8214401912480503366.post-31888680462104105582013-10-25T18:17:00.002+02:002013-10-25T18:17:21.768+02:00Sensor fusion between car and smartphone
My presentation at Droidcon London 2013.

  Sensor fusion between car and smartphone  from Gabor Paller
Gabor Pallerhttp://email@example.com:blogger.com,1999:blog-8214401912480503366.post-77962037241379919532013-07-04T21:21:00.001+02:002013-07-04T21:21:36.951+02:00Converting classes with the Parcelable protocol
Many good tutorials can be found about the Parcelable protocol in Android. If the Android framework has to serialize a set of values (either for AIDL-based IPC or for Intent-based message passing), it can serialize basic types or objects that implement the Parcelable protocol. In short, Parcelable objects are able to serialize their states into a Parcel object and they can retrieve their state from the serialized form.

But what happens if the two classes (the one which is serializing and the one which is retrieving its state from serialized form) are not the same? If you remember my post about classloading in Android, there is no way loading a class from another APK. If you pass a serialized object to another application whose codebase comes from a different APK, the target application has to rely on its own version of the class with the same name. Android framework does not verify that the sender and receiving classes are the same, they just have to have the same name (including package name).

Click here to download the example application.

There are two apps in the package. Actually, it is one of my first example programs, here is the description from a 2007 post of this blog. There are two applications, intentsender and intentreceiver. Intentsender has an internal intentreceiver plus it can talk to the external intentreceiver app. Both applications have a version of aexp.data.TwoNumbers class. In this example they are just slightly different - they log different messages.

What happens when you click on the "exp / int" (explicit Intent with internal intentreceiver) button. Both of these activities are residing in the intentsender APK therefore the class which will be used to serialize and deserialize the object are the same.

D/TwoNumbers1( 1090): serializing in TwoNumbers#1: i1: 2; i2: 3
D/TwoNumbers1( 1090): deserializing in TwoNumbers#1: i1: 2; i2: 3

But if you click on the "exp / ext" (explicit Intent with external intentreceiver) button, the message has to pass the APK boundary (it is processed in the intentreceiver app). Intentreceiver has nothing else but its own version of aexp.data.TwoNumbers. The log demonstrates it:

D/TwoNumbers1( 1207): serializing in TwoNumbers#1: i1: 4; i2: 5
D/TwoNumbers2( 1166): deserializing in TwoNumbers#2: i1: 4; i2: 5

Android framework did not care that the two TwoNumbers classes were not the same, it just called them blindly to serialize and deserialize. Actually, if you look into the Parcel implementation, you will see that the serialized version of the Parcelable only stores the fully qualified class name so it is not surprising that intentreceiver loaded whatever version of the class it could find under the given name. Fortunately, the two versions were compatible (they produced and consumed the same serialized stream) so there were no problems.

Why is this useful other than misleading yourself with classes that look the same but they aren't? If you want to expose just part of your serialized object to the receiver application, this trick comes handy. Otherwise it is best to avoid it.
Gabor Pallerhttp://firstname.lastname@example.com:blogger.com,1999:blog-8214401912480503366.post-31320986959765198282013-06-20T22:02:00.000+02:002013-06-20T22:02:48.643+02:00Tap detection supported by the gyroscope

Once upon a time I made a Londroid presentation that briefly mentioned the possibility of detecting taps on the phone's body with an accelerometer (it is in slide 31). You may rightly ask, why do you want to detect taps with the accelerometer when there is the touchscreen? First, the touchscreen may be switched off by the screensaver or the user may have deactivated it because he or she is in a call or put the phone into a position where the touchscreen may be touched unintentionally. Then the user may want to tap the back of the phone. Lastly, the user may be interested in the strength of the tap, not only its location or the fact that the tap happened.

Let's recall that graph in that old Londroid presentation.

The graph shows the absolute value of the acceleration vector while the phone's body was tapped twice. The base rate is the gravity acceleration (about 10 m/sec^2) and the acceleration caused by the taps was added (in the actual configuration, subtracted) from the gravity acceleration, resulting two characteristic spikes.

But where was the phone's body tapped? By looking solely on the accelerometer's data, I don't think there is a way to find it out. But fortunately we have other sensors and the gyroscope is particularly relevant. Here is the well-known image of the sensor axes in Android.

In case of the gyroscope, the sensor measures rotation around the axes. If you tap the device in the right lower corner, we can expect a short rotation around the x and y axes if the phone supported by a reasonably flexible base (e.g. a human hand and not a block of granite).

But can this be really detected? I made a series of measurements to prove it. Note here that I was just interested in the theoretical possibility and did not want to do a product-grade implementation. So I tested only on my Galaxy Nexus.

First here is the absolute acceleration value for 3 consecutive taps.

As expected, the time of the tap can be safely detected. These taps were all in the lower right corner so let's see what the gyroscope measured along the x and y axes.

X axis, just for two taps:

Y axis, just for two taps:

As you can see, the taps are detected by the gyroscope too as short rotations. In case of both axes, there was a spike of positive rotation velocity first.

Now let's see what happens, if we tap the lower left corner.

X axis, just for two taps:

Y axis, just for two taps:

As you see, the X graph has the same character but the form of the Y graph has changed. Instead of a marked positive spike, there is a small negative spike, followed by a positive spike.

Let's see if the experience is repeated in the upper left corner.

X axis, just one tap:

Y axis, just one tap:

Now the character of the spikes on both axes changed. A small positive spike is followed by a large negative spike.

This is not a kind of movement the gyroscope was designed for so it is premature to state that this waveform pattern will be exactly the same for all the Android devices sporting gyroscope out there. But I found these measurements convincing enough to support the statement that it is possible to implement rudimentary tap location using only the accelerometer and the gyroscope in the device.
Gabor Pallerhttp://firstname.lastname@example.com:blogger.com,1999:blog-8214401912480503366.post-10917130660629038222013-04-28T21:58:00.003+02:002013-04-28T21:58:59.374+02:00Advantages and limitations of PhoneGap for sensor processing
This is my Droidcon Tunis 2013 presentation about the effect of the web application model on battery consumption.

Test programs related to the slideset are available here. You have to be logged into Sfonge website to access those.

Gabor Pallerhttp://email@example.com:blogger.com,1999:blog-8214401912480503366.post-2160157839180091202013-03-10T19:41:00.000+01:002013-03-11T10:07:42.105+01:00Data capture application for car speed, accelerometer, compass and gyro fusion experiments
In my previous post I wrote about my enthusiasm of integrating car sensors with the mobile device's own sensors. The first step was to implement a data capture application that saves sensor data into a file. This time I decided to save the gyro, accelerometer and compass sensor data from the phone and the speed as measured by the car's speedometer. The most interesting aspect here is how we obtain the speed data.

There are two levels of interfaces playing role here. OBD2 interface and the protocols accessible over it is the first level offered by the car's on-board electronics. This interface is not trivial to talk to but fortunately all the complexity of OBD2-related protocols is implemented by the super-popular ELM327 microcontroller from ELM Electronics (or its compatible copies). On one side the ELM327 chip talks to the car's ECU using the OBD2 interface. On the other side, it offers a modem-like serial interface. Popular connection option is USB but for our Android client, Bluetooth is a better option. ELM327-compatible adapters are available at a low cost, for example I bought the very basic version below.

ELM327 has a very simple, yet powerful interface. In the first phase the chip is set up by issuing a series of AT commands reminiscent of the Hayes modem commands. The best place for reference is the ELM327 specification. The most important command is the ATS0 command. This instructs the chip to auto-detect the protocol used on the OBD2 interface. Once this auto-detection is successful, the car sensors can be queried by sending the PID code of the sensor in question. For example for the car's speed one sends:

010D

The ELM327 chip then talks to the car's ECU, obtains the sensor data and returns a response like this:

410D0C

Where "4" is the ID for response, 10D is the PID of the sensor and 0C is the value. Some OBD2 PIDs have complex coding but fortunately for the speed sensor 0C simply means 12 km/h.

Click here to download the example program.

Before you start using this test application, make the Bluetooth pairing of your device with the sensor from the Android Bluetooth settings. Either you can use the real thing (ELM327 interface connected to a real car) or you can use Ryan C. Gordon's great OBDSim application that can run on a Linux box and can simulate a Bluetooth-connected ELM327. In theory, OBDSim can also run on Windows, I tested only on Linux. Setting it up is not trivial but it saves a great deal of time if you develop for the ELM327 interface.

Then you can start the test application. First connect to your ELM327 device from the menu ("Connect a device - secure"). If the connection works properly, you should see a series of AT commands and responses flashing on the screen then the speed appears (e.g. 0 km/h if you do it on a real car). This time you can start the sampling ("Sampling" check box) and the application will save all the sensor information into a file in the SDCARD in CSV format. The name of the file is gyrocarcapture_<date>.csv and its format is very simple. One warning here: sadly the timestamp format used for the speed sensor and the device's own sensor are different: the sensor timestamps are coming from the SensorEvent object and the time stamp for the speed data comes from System.currentTimeMillis(). As device sensor events are very frequent, I use the last device sensor timestamp for the speed sensor too when processing these files. The speed sensor sampling frequency is approximately 1 Hz.

The application can be extended easily to sample other car sensors too. However, in its present form it is good enough to detect if the driver slows down in front of a speed bump (accelerometer-car speed sensor fusion).

Or to figure whether the driver takes the bend too quickly (gyroscope-car speed sensor fusion).

Gabor Pallerhttp://firstname.lastname@example.com:blogger.com,1999:blog-8214401912480503366.post-2083947988192267502013-03-01T23:42:00.000+01:002013-03-01T23:42:00.209+01:00Call for papers for Droidcon Tunis 2013
Last year I had a presentation at Droidcon Tunis. The conference was inspiring with a clever and enthusiastic audience and the presentation became a success with over 16000 views since the end of the conference. Not bad for a sensor processing topic with some scary math in it. Plus my name became a landmark in Tunis which was pretty much a new sensation for me.

Call for papers for Droidcon Tunis 2013 is now open but sadly, I can't submit anything. My presentation material is not ready because some topics I could speak about are not public, others are not mature enough. But you out there, you should consider submitting papers to this conference. Last year's conference was fun - also my first time in Africa. I am sure that this year will be just better.
Gabor Pallerhttp://firstname.lastname@example.com:blogger.com,1999:blog-8214401912480503366.post-63660072205448312002013-02-22T23:06:00.001+01:002013-02-22T23:06:56.285+01:00Car sensors
My conclusion from the speed bump post was that the built-in accelerometer in the Android phone is probably not enough to detect the obstacle. Alexander Kosenkov commented that maybe the accelerometer vector can be processed in a more sophisticated way but my experience is that the car generates such an amount of vibrations that makes extracting relatively faint signals from the accelerometer rather hard if not impossible.

While I was contemplating on this issue, I got a mail from Edward Pultar, president of Valarm, a start-up based in Los Angeles. These guys created an Android application and associated web services that started as a theft-prevention tool and is being repositioned as a general platform for all sorts of sensor data acquisition and processing. Read their press kit about the exact features of their products.

The most fascinating idea in their product is the use of OBD2 interface to connect to the car's own sensors. OBD2 with a Bluetooth plug is widely used by car fanatics to obtain diagnostic data including speedometer, tachometer, engine temperature, on-board GPS (if the car is equipped with it) and many other sensors. Valarm's idea was to use this wealth of data for use cases other than car diagnostics, e.g. monitoring whether the car is driven recklessly. They do sensor fusion with the car sensors and with the phone's own sensors. For example cars don't normally have accelerometers that can detect excessive vehicle vibration caused by bumpy roads or faulty tires but a smartphone has. The phone is also equipped with a wealth of communication options, large memory and is an application platform. It is therefore an ideal device to aggregate data from different sensors (internal and external) and to send the data to web services.

This may sound like a futuristic research paper but to my utter surprise, even my own car which is well in its teenager years has the OBD2 interface. All I need is a commercially available Bluetooth plug (connection by cable is also possible but is less practical) and the car will talk to my Android phone. This makes Alexander's idea about incorporating the speed profile for the speed bump detection pretty easy to implement.
Gabor Pallerhttp://firstname.lastname@example.com:blogger.com,1999:blog-8214401912480503366.post-86194127132822165922013-02-19T22:42:00.001+01:002013-02-19T22:43:26.919+01:00Detecting speed bumps with accelerometer
Somebody came in from the internet some months ago and asked whether speed bumps (also called sleeping policemen) can be detected with an Android phone. You know, speed bumps like this:

I was cautious because there's a lot of traps here. Obviously the detected signal will differ depending on the form factor of the speed bump, the type of the car and even the way the phone is fixed to the car (or the lack of fixing). But I was also curious and as car-related phone applications are very fashionable today, I took the challenge. Meanwhile the guy who brought up the problem disappeared so I feel free to share what I achieved during the last one and half months.

The solution that I produced is far from perfect. First and foremost, I did not make any effort to target other phones than my trusty Nexus S. Phones which have sampling frequency of around 50 Hz in SENSOR_DELAY_FASTEST mode will work fine, significantly different sampling frequencies are not supported. It is more important, however, that I was not able to create a foolproof algorithm for the problem.

Initially I thought that some sort of rotation could be measured when the front of the car is lifted by the speed bump but I was not able to detect this rotation from the sensor signal. The car generates all sorts of vibrations and it is not easy to extract this relatively small rotation from the noisy background. So I went back to the acceleration spike which is generated when the car hits the bump and I used just the acceleration's absolute value as described in this presentation. The trouble is that this spike is pretty reminiscent of a class of other spikes like knocks, etc. For example here is a beautiful double street bump somewhere in Budapest.

One would think that signals like these could be easily detected. Now comes, however, a bumpy road with potholes, also typical in Budapest.

There are no street bumps in the second signal but the potholes generate "knocks" that are hard to distinguish from the "knocks" caused by street bumps.

There is no perfect solution to this problem, at least I could not find any. Eventually I obtained the best result by calculating the cross-correlation between the acceleration signal and a pre-recorded speed bump signal. I re-sampled this representative signal for +/- 10% of its initial frequency and calculated the cross-correlation with all the three variants (initial, +10% frequency, -10% frequency). Then I used a sliding window to calculate the power of the cross-correlation signal. This is the pre-recorded sample I used for cross-correlation:

Cross-correlating then calculating the power in a sliding window yields this signal for the double speed bump (different colors show the power of the 3 variants of the re-sampled signal):

And this is the result of the same calculation for the bumpy road:

Using a limit of about 150, the two signals can be separated and no fake bumps are detected even on the bumpy road.

Click here to download the example program.

There are a lot of problems with this approach. First, speed bumps come in all shapes and sizes and this method can detect speed bumps that are similar to the one used to generate the reference signal. Then there is the problem of the car itself. I did not have the chance to test with a lot of different cars but I bet the different suspension systems will yield drastically different signals in different car types. Anyway, I thought somebody may find this post and this post can start some thinking.

Gabor Pallerhttp://firstname.lastname@example.com:blogger.com,1999:blog-8214401912480503366.post-38955356327796247382012-06-19T20:13:00.001+02:002012-06-19T20:13:41.561+02:00Universal orientation, gravity and motion acceleration sensor
We have seen a number of fusion possibilities for 2 sensors.

We have seen accelerometer supported by gyroscope so that gravity and motion acceleration may be reliably separated. See this Droidcon Tunis presentation for more details.

We have seen accelerometer supported by the compass to achieve the same goal. There were some limitations that made this solution less flexible than the one based on accelerometer-gyroscope fusion.

We have seen the compass supported by the accelerometer to compensate for the tilt of the device.

Time has come to put all of these together and to take a step toward the Holy Grail of sensor processing. We want a sensor that measures gravity, motion acceleration and orientation reliably, no matter what the circumstances are. If we achieve this, then we have a good basis for the much researched in-door navigation problem because the linear acceleration may be used for step counting while the orientation can be used to calculate the vector of movement. Errors will accumulate but if we have occasional reference points like WiFi beacons, reasonably good results can be achieved.

So what prevents us realizing this vision? We already obtained a pretty reliable motion acceleration estimation from the accelerometer-gyroscope fusion. The orientation is the thing we don't have. Using the compass-accelerometer fusion we can eliminate the tilt problem. If we throw in the gravity calculation from the accelerometer-gyroscope fusion and use the gravity estimation instead of the raw accelerometer data for the compass tilt compensation then we have also compensated the motion acceleration. The only thing we don't have is the effect of external magnetic fields which may fool the compass and can be pretty nasty in-door in the presence of household appliances, large transformators or other electric machinery. That we will compensate with a compass-gyroscope fusion.

The idea of the compensation of the external magnetic field using the gyroscope is very similar to the compensation of the motion acceleration. If we assume that no external magnetic field is present (beside the Earth's magnetic field), we just use the compass data (and then post-compensate against tilt by the gravity vector which needs accelerometer-gyroscope fusion). If we suspect that there may be external magnetic field present, we use the gyroscope rotation data to rotate a previous, trusted compass vector (that is supposed to measure only the Earth's magnetic field) and use that as compass estimation. The difference between this compass estimation and the measured compass value is the estimation for the external magnetic field.

The trick is the detection whether an external magnetic field may be present. In this prototype the same trick was used as with the accelerometer: if the length of the compass vector is too long or too short compared to the reference measurement, then we have an external magnetic field to compensate.

Here is the summary of the sensor fusions used in this prototype:

Accelerometer-gyroscope fusion provides gravity and motion acceleration.

Compass-gravity fusion provides compass tilt compensation. The gravity is already a derived measurement coming from the accelerometer-gyroscope fusion.

Compass-gyroscope fusion provides orientation and external magnetic field.

Click here to download the example program.

The example program starts with a complex stationary and dynamic calibration process. When stationary, it measures the reference gravity and magnetic field values. In this stage it is very important that the device is not subject to motion acceleration or external magnetic field (beside the Earth's magnetic field). In the dynamic calibration phase we calculate the bias of the compass. We do this by instructing the user to rotate the device and measuring compass vectors in each special position. These are supposed to be points on a sphere. Once we collected the measurement points, we calculate the center of the sphere by solving a set of linear equations. The Jama package was incorporated into the example program for matrix manipulations.

Once the calibration is finished, the algorithm outlined above is executed. The measurement data is visualized in a 2D coordinate system - the z coordinate is not drawn. This is just my laziness, I did not take the effort to implement a 3D visualization engine. It is important to note, however, that the motion acceleration (yellow) and the external magnetic field (cyan) vectors are really 3D, they are just not drawn as such. The white vector is the final orientation compensated against tilt, motion acceleration and external magnetic field.

The prototype does have limitations. While it survives pretty nicely short-term disturbances from external magnetic fields (try with a small magnet), in longer term (e.g. after 5-10 minutes) it gets properly lost. For example when riding the Budapest underground there are strong and varying magnetic fields generated by the train's traction motors during the entire journey. If the compensation algorithm picks up a wrong reference vector, it may get lost for the rest of the journey until it is able to pick up the Earth's undisturbed magnetic field.

Gabor Pallerhttp://email@example.com:blogger.com,1999:blog-8214401912480503366.post-56793182814279018992012-05-13T22:11:00.000+02:002013-11-27T10:18:36.993+01:00Better motion control using accelerometer/gyroscope sensor fusion
This is my Droidcon Tunis 2012 presentation. Thanks for the great audience in Tunis!

  Better motion control using accelerometer/gyroscope sensor fusion  from Gabor Paller
Gabor Pallerhttp://firstname.lastname@example.com:blogger.com,1999:blog-8214401912480503366.post-59089072412703462562012-05-12T12:28:00.001+02:002013-02-20T18:24:00.718+01:00Landmark
My name as a Tunis landmark.

 I will talk about accelerometer and gyroscope sensor integration tomorrow at Droidcon Tunis.

Gabor Pallerhttp://email@example.com


text:
You've read all of your free items this month.
To register, get added benefits and unlimited access to articles, Become a Member. Already a Member? Sign in.
50 Years in the Family Ad Agency Business
Philly Adman Brownstein Shares Lessons on Running a Small Agency
Want more Access, Content & Connections? Upgrade to Membership.
We are glad you are enjoying Advertising Age. To get uninterrupted access and additional benefits, become a member today.
Already a member? Log in.


text:
Christmas Presents under £5
Posted: under Cheap Presents for Brothers, Cheap Presents for Gran, Cheap Presents for Grandad, Cheap Presents for Kids, Cheap Presents for Parents, Cheap Presents for Sisters, Cheap Presents for Wife.
Tags: less than £5, presents, under £5
If you are looking for a bargain this Christmas then you have come to the correct place, we have listed some great Christmas presents or under £5, these would make ideal stocking fillers or great little presents to make someone's Christmas present pile look a little bigger. We could have sorted the Christmas presents into categories however they could be for many people (i.e. the ice cream lip gloss would make a great presents for your sister, friend or even girlfriend).
If none of these Christmas presents under £5 quite tickle your fancy then don't fret because Play.com have some bargains with over 400 Christmas presents and each of them are under £5 and they all include free delivery so when it says £5 it really is only £5.
Play have a ton of Christmas presents for under a fiver these include Gadgets, music, books, DVD's and even clothing, so if you are looking for the ultimate Christmas bargains then Play have got you covered.
Ice Cream Flavoured Lip Gloss
£5 – Click here for more information
Bluetooth Headset
£5 – Click here for more information
The Head Massager
£5 – Click here for more information
Foot Massager
£5 – Click here for more information
Talking Dashboard Homer Simpson
£5 – Click here for more information
MP3 Player Speakers (Boombox Shaped)
£5 – Click here for more information
Comments (0) Oct 06 2011


text:
This website allows you to play arcade style games in all subject areas.
This is a website to help practice multiplication facts.
This website is great for practicing weekly spelling words. The students can even take a practice spelling test.
3823 Fortuna
San Antonio, TX 78237
Phone: 210-444-8375
Fax: 210-444-7798


text:
Articles Related to San Telmo
Showing 1 - 10 of 21 results
What's New in Buenos AiresBuenos Aires is thriving, thanks to avant-garde museums, sophisticated new hotels, and creative restaurants that span the Argentine city's colorful barrios.
The Lost MackenzieEighty years ago, the game's greatest architect drew up plans for a golf course unlike anything the world has known. Long forgotten, the design has...
Shopping in Buenos AiresOn a neighborhood-by-neighborhood shopping excursion in Argentina's style-obsessed capital, Lynn Yaeger finds enough trinkets to fill an extra suitcase—or two.
World's Coolest BazaarsHunt for that perfect souvenir and soak up the scene at these cool bazaars, flea markets, and souks.
The Best Foodie GetawaysThese foodie itineraries—be it barbecue in Texas or Michelin-starred restaurants in France—are guaranteed to satisfy your hunger.
San Pedro Telmo's Vintage Flea MarketVintage finds are where it's at when shopping San Pedro Telmo's flea market.
World's Most Spectacular Pedestrian BridgesPedestrian bridges are going to cool new heights, turning the need to get from here to there into an adventure.
Buenos Aires: Best New VenuesFrom art deco mansions to historic restaurants, a series of renovations has created great new hotels and restaurants in Buenos Aires.
A-List 2010: World's Top Travel AgentsT+L evaluated thousands of travel agents to create this highly selective list just for you.
World's Sexiest Hotel ShowersDesign-forward hotel showers—with tech savvy touches or incredible views—that make a room worth booking.


text:
Steve Sunu
Articles By Steve Sunu
Showing results 1600-1619 of 2644
Fox To Distribute Vaughn's "The Secret Service" Film
Wed, March 27th, 2013 | Category: TV/Film
20th Century Fox has won the battle with Universal Pictures for worldwide distribution rights to Matthew Vaughn's film adaptation of "The Secret Service" by Mark Millar and Dave Gibbons.
Telltale's "Fables" Game Is "The Wolf Among Us"
Wed, March 27th, 2013 | Category: Video Games
Telltale Games, the studio behind "The Walking Dead" game, has revealed "The Wolf Among Us," the final title for its "Fables" game that focuses on Bigby Wolf.
The Wolverine, Kick-Ass 2, Iron Man 3: March 27th Comic Reel
Wed, March 27th, 2013 | Category: TV/Film
"The Wolverine" full-length trailer hits the web! Jim Carrey gets his own "Kick-Ass 2" poster! Rebecca Hall talks flashback sequence in "Iron Man 3!" Plus, "The Walking Dead and more!
X-POSITION: "X-Termination" Targets Liu's "Astonishing X-Men"
Tue, March 26th, 2013 | Category: Comic Books
X-POSITION explores the current X-Event "X-Termination" with "Astonishing X-Men" writer Marjorie Liu, who discusses the family dynamic of her team and more. Plus, exclusive art!
Jackman In Motion For New "The Wolverine" Poster
Tue, March 26th, 2013 | Category: TV/Film
Hugh Jackman poses in a city filled with debris as he holds a samurai sword while rain falls in the newest motion poster for James Mangold's "The Wolverine."
EXCLUSIVE: Asmus & Fowler Resurrect "Quantum and Woody"
Tue, March 26th, 2013 | Category: Comic Books
Writer James Asmus spoke exclusively with CBR about the relaunch of "Quantum and Woody" in the new Valiant Universe, while CEO/CCO Dinesh Shamdasani teased plans with original series creator Christopher Priest.
Man of Steel, The Wolverine, Arrow: March 26th Comic Reel
Tue, March 26th, 2013 | Category: TV/Film
David S. Goyer discusses "Man of Steel" script motivations! New footage drops in anticipation of "The Wolverine" trailer! Marc Guggenheim teases A.R.G.U.S. for "Arrow!" Plus, "Ninja Turtles" casting & more!
"Marvel Heroes" Gets June 4 Release Date
Mon, March 25th, 2013 | Category: Video Games
Gazillion Entertainment has announced a June 4 release date for its long-awaited "Marvel Heroes" MMO, which allows players to take control of the movers and shakers of the Marvel U.
Black Adam Joins "Injustice" With Teases For Killer Frost, Ares
Mon, March 25th, 2013 | Category: Video Games
Coming out of PAX East 2013, "Injustice: Gods Among Us" has added Black Adam to its roster with Killer Frost and Ares rumored to be the final additions to the DC Comics fighter.
"The Wolverine" Teases Clawed Action In Six Seconds
Mon, March 25th, 2013 | Category: TV/Film
A six-second teaser for an upcoming "The Wolverine" trailer has hit the web, featuring a clawed Hugh Jackman, explosions, Viper and samurai swords. The full trailer hits March 27.
Little Orbit Releases "Young Justice: Legacy" Box Art
Mon, March 25th, 2013 | Category: Video Games
"Young Justice: Legacy" developer Little Orbit has released the box art image for the video game, which helps fill in the 5-year gap between season one and season two of the fan-favorite animated series.
DC's "Infinite Crisis" Game Mines Multiverse For Roster
Mon, March 25th, 2013 | Category: Video Games
DC's announced "Infinite Crisis" video game has released a partial roster, concept images and a trailer to give players a better idea of what to expect from the online battle arena.
The Wolverine, Iron Man 3, The Walking Dead: March 25th Comic Reel
Mon, March 25th, 2013 | Category: TV/Film
A first look at Viper in "The Wolverine!" Guy Pierce discusses Aldrich Killian in "Iron Man 3!" "The Walking Dead" teases its season three finale! Plus, "Thor: The Dark World" and more!
Venditti, DC State No Current Plans To Kill John Stewart
Fri, March 22nd, 2013 | Category: Comic Books
DC and "Green Lantern Corps" co-plotter Robert Venditti have stated that he has no current plans to kill John Stewart, contrary to a report earlier this week following the departure of Joshua Hale Fialkov.
RUMOR: Robert Redford In Talks For "Captain America: The Winter Soldier"
Fri, March 22nd, 2013 | Category: TV/Film
Legendary actor Robert Redford is rumored to be in discussions to join the cast of Marvel Studios' "Captain America: The Winter Soldier" directed by Joe and Anthony Russo.
Alan Ritchson Cast As Raphael in "Ninja Turtles" Reboot
Fri, March 22nd, 2013 | Category: TV/Film
"The Hunger Games: Catching Fire" actor Alan Ritchson has been cast as Raphael in the upcoming "Teenage Mutant Ninja Turtles" live-action film directed by Jonathan Liebsman and produced by Michael Bay.
Justice League, Amazing Spider-Man 2, Captain America: The Winter Soldier: March 22nd Comic Reel
Fri, March 22nd, 2013 | Category: TV/Film
Ryan Reynolds discusses possibility of a "Justice League" appearance! Marc Webb teases Ravencroft in "Amazing Spider-Man 2!" Agent Sitwell confirmed for "Captain America: The Winter Soldier!" Plus, "Deadpool" & more!
Fialkov Resigned From GL Titles Due To Disagreement Over John Stewart Death Story
Thu, March 21st, 2013 | Category: Comic Books
CBR News has confirmed a report that an editorial edict to kill off John Stewart played a strong part in writer Joshua Fialkov's resignation from "Green Lantern Corps" and "Red Lanterns."
Kirk & Spock Boldly Explore Paramount's "Star Trek: The Video Game"
Thu, March 21st, 2013 | Category: Video Games
Paramount Senior Vice President Brian Miller speaks with CBR about the upcoming "Star Trek" game, the challenges of bringing the franchise back to video games and avoiding the stigma of licensed games.
Arrow, X-Men: Days of Future Past, Iron Man 3: March 21st Comic Reel
Thu, March 21st, 2013 | Category: TV/Film
Manu Bennett joins "Arrow" as a series regular for season two! James McAvoy and Booboo Stewart tease "X-Men: Days of Future Past!" Tony Stark suits up in new "Iron Man 3" teaser! Plus, "Oblivion" & more!