The public draft of the JPA 2.0 specification is already out and includes a much-awaited feature: an API that lets you create queries by calling methods of Java objects, instead of by embedding JPA-QL into strings that are parsed by the JPA implementation. You can learn more about the API proposed by the public draft at Linda's blog.
There's several reasons to prefer the API-based approach:
(Note that JPA-QL syntax validation and autocompletion is available is some IDEs - in JBoss Tools, for example.)
There's two major problems with criteria query APIs in the Java language:
The first problem isn't really solvable without major new language features (usually described as DSL support). The second problem could easily be solved by adding a typesafe literal syntax for methods and fields to Java. This is now a sorely needed feature of the language, it's especially useful in combination with annotations.
There have been some previous efforts to work around the lack of method and field literals. One recent example is [Broken Link]. Unfortunately that particular approach forces you to represent every persistent attribute as a public getter method, which is not a restriction that is acceptable in the JPA specification.
I've proposed a different approach to the JPA EG. This approach comes in three layers:
Let's take go layer-by layer.
The MetamodelThe metamodel API is a bit like the Java reflection API, except that it is provided by the JPA persistence provider, is aware of the JPA metadata, and uses generics in a clever way. (Also it uses unchecked exceptions.)
For example, to obtain an object that represents an entity, we call the MetaModel object:
import javax.jpa.metamodel.Entity; ... Entity<Order> order = metaModel.entity(Order.class); Entity<Item> item = metaModel.entity(Item.class); Entity<Product> item = metaModel.entity(Product.class);To obtain attributes of the entity, we need to use string-based names, as usual:
import javax.jpa.metamodel.Attribute; import javax.jpa.metamodel.Set; ... Set<Order, Item> orderItems = order.set("items", Item.class); Attribute<Item, Integer> itemQuantity = item.att("quantity", Integer.class); Attribute<Item, Product> itemProduct = item.att("product", Product.class); Attribute<Product, BigDecimal> productPrice = product.att("price", BigDecimal.class)Notice how the metamodel types which represent attributes are parameterized not only by the type of the attribute they represent, but also by the type that they belong to.
Also notice that this code is non-typesafe and can fail at runtime if no persistent attribute with the given type and name exists in the entity class. This is the only non-typesafe code we'll see - our goal is keep the rest of the API completely typesafe. How does that help us? Well, the trick here is to notice that the metamodel objects represent completely static information about a persistent classes, state that doesn't change at runtime. So we can:
That's much better than having these error occur at query execution time, as they do in the previous criteria query proposal.
The metamodel API is generally useful, even independent of the query API. Currently it's very difficult to write generic code that interacts with JPA because JPA metadata may be partitioned between annotations and various XML documents.
But, of course, the most popular use of the metamodel is to build queries.
QueriesTo construct a query, we pass metamodel objects to the QueryBuilder API:
Query query = queryBuilder.create(); Root<Order> orderRoot = query.addRoot(order); Join<Order, Item> orderItemJoin = orderRoot.join(orderItems); Join<Item, Product> itemProductJoin = orderItemJoin.join(itemProduct); Expression<Integer> quantity = orderItemJoin.get(itemQuantity); Expression<BigDecimal> price = itemProductJoin.get(productPrice); Expression<Number> itemTotal = queryBuilder.prod(quantity, price); Expression<Boolean> largeItem = queryBuilder.gt(itemTotal, 100); query.restrict(largeItem); query.select(order); query.distinct(true);Of course, this could be written more compactly, but I'm trying to draw attention to the generic types of the objects that make up the query. The type parameters prevent me from writing something like this:
orderItemJoin.get(productPrice); //compiler errorThe use of generics means the compiler can detect when we try to create a path expression by combining a queried entity of one type and an attribute of some other type. The metamodel object productPrice has type Attribute<Product, BigDecimal> and therefore cannot be passed to the get() method of orderItemJoin. get() only accepts Attribute<Item, ?>, since orderItemJoin is of type Join<Order, Item>.
Expressions are also parameterized by the expression type, so the compiler detect mistakes like:
queryBuilder.gt(stringExpression, numericExpression); //errorIndeed, the API has sufficient typesafeness that it's more or less impossible to build an unexecutable query.
Generating a typesafe metamodelIt's completely possible to build queries with only the metamodel API and the query API. But to really make the most of these APIs, the final piece of the puzzle is a little code generation tool. This tooling doesn't need to be defined by the JPA specification, and different tools don't need to generate exactly the same code. Nevertheless, the generated code will always be portable between all JPA implementations. All the tool does is reflect upon the persistent entities and create a class or classes that statically cache references to the metamodel Entity and Attribute objects.
Why do we need this code generator? Because writing Attribute<Item, Integer> itemQuantity = item.att("quantity", Integer.class); by hand is tedious and slightly error prone, and because your refactoring tool probably isn't smart enough to change the string based name when you refactor the name of the attribute of the persistent class. Code generation tools don't make these kind of errors, and they don't mind re-doing their work from scratch each time you ask them to.
In a nutshell: the tool uses the non-typesafe metamodel API to build a typesafe metamodel.
The most exciting possibility is that this code generation tool could be an APT plugin for javac. You wouldn't have to run the code generator explicitly, since APT is now fully integrated into the Java compiler. (Or, it could be an IDE plugin.)
But didn't code generation tools go out of fashion recently? Wasn't one of the great features of ORM solutions like Hibernate and JPA that they didn't rely upon code generation? Well, I'm a great believer in using whatever tool is the right solution to the problem at hand. Code generation has certainly been applied to problems where it wasn't the best solution. On the other hand, I don't see anyone bashing ANTLR or JavaCC for their use of code generation to solve the problem they address. In this case, we're working around a specific problem in the Java type system: the lack of a typesafe metamodel (reflection is one of the worst-designed language features). And code generation is simply the only solution that works. Indeed, for this problem it works well.
-4seasons 1.0-drQ[C4PDA]
-Accounts 2.9.1-kidmoneys
-AirCoaster 3D 2.4.1-kidmoneys
-Airfare 1.6-TheGoonies
-Allure 1.3-kidmoneys
-American Presidents 2 in 1 2.3.0-D2[C4iD]
-Anytime Golf - Magic Touch 1.1-kidmoneys
-Aqualution - The Beginning 2.1-neppyfx
-Astronauts 1.0.3-drQ[C4PDA]
-Banner Deluxe 1.2.8-kidmoneys
-Battle Field 1.1-kidmoneys
102 MB
http://rapidshare.com/files/235248597/05-22-09-1.rar
-CongressPro 3.1-kidmoneys
-CozyQuest 1.0.15-kidmoneys
-Dead Words 1.2.1-D2&C4PDA
-DinoSmash Online 1.0.patched-C4PDA
-DOCUMENTS 2 1.1-kidmoneys
-Earth Scenery 1.0.1-alibaba
-Euro Radio 1.5-alibaba
-feX - Friend Exchange for Facebook 2.0-COREPDA
-Files (Email, Document Viewer, File Storage) 1.3.1-kidmoneys
-Flashback 1.1.patched-C4PDA
-GL Golf Deluxe 1.07-kidmoneys
-Glide Factor 1.1-kidmoneys
-Handwriting Typewriter ‘Notes’ 1.2.0-kidmoneys
-HDR Camera 1.4.0-kidmoneys
-HydroTilt 2.2.1-kidmoneys
97 MB
http://rapidshare.com/files/235250281/05-22-09-2.rar
-Grand Pro 1.1.4.patched-COREPDA
-i Sniper 0.2.1-kidmoneys
-iBear Money 2.6.2-kidmoneys
-iBody 1.7.2-kidmoneys
-iBrawl 1.1-kidmoneys
-iDrone 1.3-kidmoneys
-iFare Finder 1.7-heyyouguys
-IndyCar Mobile 1.0-alibaba
-iStudent 1.11-drQ[C4PDA]
-iStyle 1.2-kidmoneys
-iXpenselT 2.4.1-kidmoneys
-J Admin Mobile 1.2.1-kidmoneys
-jfControl - Allround Remote Control 2.0-kidmoneys
-Keeper 3.0-kidmoneys
-Mazetrix 1.1-kidmoneys
97 MB
http://rapidshare.com/files/235251978/05-22-09-3.rar
-Monkey Flight 1.10-kidmoneys
-Pee Monkey Jungle Fire 1.1.4-kidmoneys
-PhotoForge 1.2-kidmoneys
-Pinch ‘n Pop! 1.3.4-kidmoneys
-Platypus 1.20-kidmoneys
-Pocket God 1.16-chazzy
-Radio (91 norske kanaler) 2.0-touch_94
-RadioTimes 1.0.3-bellbrie
-Randgrid synthesizer and drum machine 1.0.4-kidmoneys
-RiverMote 1.4-kidmoneys
-Robotco 1.2.1-kidmoneys
-Ruben & Lullaby 1-Aloware
-Shift 001.patched-C4PDA
-Super Hangman Pro 1.1-kidmoneys
-Tower of Witch 1.1-kidmoneys
102 MB
http://rapidshare.com/files/235253600/05-22-09-4.rar
-Smokeless 1.4-most_uniQue
-StockAdvisor 1.1.0-D2[C4iD]
-StudioApp 1.2-kidmoneys
104 MB
http://rapidshare.com/files/235255145/05-22-09-5.rar
-Metro Maximus 1.5-kidmoneys
-StockWatch 4.01-alibaba
-Todo 2.0.1-kidmoneys
-Trixel 1.1-kidmoneys
-Twitterrific Premium 2.0.1-kidmoneys
-Unit Converter 1.0.24-iphoniak
-Upcoming Events 4.1.1.patched-C4PDA
-WarShip 1.1-kidmoneys
-XAtomic Ultimate 1.0.2-kidmoneys
79 MB
http://rapidshare.com/files/235256344/05-22-09-6.rar
-AC-130 iSniper from the sky! 1.1-kidmoneys
-Acupoints Ultimate 2.0-kidmoneys
-Ancient Legion 1.1-kidmoneys
-Assault on Mafia 1.1.1-kidmoneys
-Asso piglia tutto 1.1-ITALIA
-Autovelox 1.2-ITALIA
-Birdie 1.5.1-antdell
-Bones TestPeds 09 1.0-esi
-Cam 3D 1.0.2-mega4i
-Card Shark Solitaire Deluxe 3.5-dodoburd
-CatzEye 1.1-kidmoneys
-Convertbot 1.3.patched-C4PDA
-Credit Card Expense Manager 2.1-kidmoneys
-Currency FX 1.0-kidmoneys
-Diamond Hunter 1.2-kidmoneys
-Disneyland Resort Trivia 1.0-kidmoneys
-Downhill Bowling 1.0.6-kidmoneys
98 MB
http://rapidshare.com/files/235624282/05-23-09-1.rar
-FlickFlak 1.0-Mgssidley
-Free SMS 1.04-kidmoneys
-Friki Tricks 1.1-most_uniQue
-Fruited 1.02-kidmoneys
-GravSynth 1.0-kidmoneys
-Guitarist’s Reference 2.8.1-kidmoneys
-Human Atlas 1.0-kidmoneys
-i-c-LiveCams (IP-PTZ Webcam Streaming Video) 2.31-Mauro84
-i41CX+ RPN Calculator with Printer 2.1-kidmoneys
-iBot Sumo 1.2.0-Mgssidley
-iDcrm 1.0-kidmoneys
-Imagine Poker Touch 1.5.1-chazzy
-iSpadez - A Spades Game 2.2.1-meta
-iSébastien 1.0-esi
99 MB
http://rapidshare.com/files/235625627/05-23-09-2.rar
-iSpeak French 1.2-haxor133t
-iStudent 1.11-drQ[C4PDA]
-iText - Free SMS-MMS Texting 1.2-kidmoneys
-J Admin Mobile 1.2.1-kidmoneys
-Karate Terms 1.0-esi
-Keeper Password & Data Vault 3.0-kidmoneys
-LCube 1.30-COREPDA
-Les Blondes - Episode 10.6 1.0-esi
-Lexulous 1.0-alibaba
-LifeTicker 1.7.0-kidmoneys
102 MB
http://rapidshare.com/files/235627323/05-23-09-3.rar
-London Bus, Tube & Rail Journey Planner 1.1-alibaba
-Magic Filler 1.1-most_uniQue
-miWall Wallpaper-Backgrounds + 1.2kidmoneys
-MotivationalQuotes 1.35-alibaba
-Mouse Menace 1.0-esi
-My Secrets 1.2-alibaba
-myMovies 1.4.1-kidmoneys
-NBC’s The Office Challenge 1.1.2-kidmoneys
-Packing (+TO DO!) 4.3-topche
-ParaJumping 1.1-bteamer
-Parking App 2.0.2-kidmoneys
-PathBuilder 1.0-kidmoneys
-Peekababe 1.1-kidmoneys
-Photo Touch Purikura 1.3-kidmoneys
-PhotoCooker 1.0.3-kidmoneys
-Pirate Master III 1.12-kidmoneys
-Pirate Panic 1.0-isa
-politicoTracker 1.0-kidmoneys
-ProcessAway Credit Card Terminal 2.1-kidmoneys
-Property Evaluator 2.4-iont
-PsychMeds 1.0-esi
-Public Radio 1.5-kidmoneys
-Revelations1 1.7-esi
-Robot Wars 3D 1.1-kidmoneys
-Server Admin Remote 1.2.3-kidmoneys
-Sonic the Hedgehog 1.0.0-CX
90 MB
http://rapidshare.com/files/235629286/05-23-09-4.rar
-StepStones 1.0.1-kidmoneys
-Sticky Balls 1.0-esi
-Super Hangman Pro 1.1-most_uniQue
-Super Pender 1.5-esi
-Sushipedia 1.0.1-meta
-Terminator - Salvation Graphic Novel 1.0-esi
95 MB
http://rapidshare.com/files/235631448/05-23-09-5.rar
-The Quest- Islands of Ice and Fire 2.0-kidmoneys
-Trading Faces 1.0-alibaba
-TV Shows 1.3.0-kidmoneys
-USing Karaoke 1.0-isa
-Why all monkeys are long-armed 1.0-esi
-Wiki! pro 1.0.0-alibaba
-Wine Enthusiast Guide 1.3-kidmoneys
-World Countries and Leaders 1.0-alibaba
-ZAGAT TO GO ‘09 1.2.102-meta
-Terminator 1.0-D2[C4iD]
75 MB
http://rapidshare.com/files/235632592/05-23-09-6.rar
Talking Latin American Spanish to English Phrasebook 2.0-macosmovil (464MB):
http://www.megaupload.com/?d=UCRT2NCA
Talking Latin American Spanish to French Phrase Book 2.0.1-macosmovil (170MB):
http://www.megaupload.com/?d=9V22LAKS
-4 Tracks DX Pocket Studio 1.1-D2[C4PDA]
-a World of Lullabies - Lullaby your Kids 2.1-itaintrite
-ABCRacer 1.1-esi
-AlcoholCalc 1.0-alibaba
-Amateur Surgeon 1.0.1
-Arvale - Ocean of Time 1.0-Dheed
-aSmart HUD+Speedcams 1.3
-Atomic Clock (Gorgy Timing) 2.10-JackTrav
98 MB
http://rapidshare.com/files/235992786/05-24-09-1.rar
-Attack 1-attack
-Aw’ Shugs 1.1-kidmoneys
-Bark ‘n’ Woof ( Doggy Sounds ) 1.3-itaintrite
-Barzellette! 1.1.6-ITALIA
-Beijing Opera 1.0-esi
-Bellum - Tactics 1.0-esi
-Bird Tweets ( Tweeting Birds ) 1.1-itaintrite
-Brave Dwarves 1.1-kidmoneys
-BurgerBurger 1.0-esi
-CaloriesUS 1.00-alibaba
99 MB
http://rapidshare.com/files/235994244/05-24-09-2.rar
-Cambridge Advanced English-Chinese Dictionary 2.1-kidmoneys
-Camera Plus 2 2.1.1.patched-Calku
-Cams Ahoy ! Europe 2.0.1-ITALIA
-Carpenter’s Helper 1.0-kidmoneys
-Chimp Adventure 1.0-esi
-Clean My Screen - The Ultimate Screen Cleaner 1.0-Dheed
-Construction Site - Men at Work 1.3-itaintrite
-Cooking Star 1.1-WYSE
102 MB
http://rapidshare.com/files/235995572/05-24-09-3.rar
-Dave Matthews Band Revenge 1.0-most_uniQue
-Dillo! - Italiano - Loquendo Voice Dialer 1.1-ITALIA
-Easy DrumMachine 1.1.1-esi
-EdiMon+ 1.0-kidmoneys
-fantaFootball Serie A 08-09 1.1.1-ITALIA
-FiC - Filipino iPhone Community 1.0-D2[C4iD]
-FillCircle 1.0-esi
-Fleurs de Montagne 1.0-esi
-Fortune Cat 1.0-esi
-French History threw Kings, Emperors and Presidents 1.0-polk
-Friki Tricks 1.1-kidmoneys
-G-Park 2.4-ITALIA
-Gears 1.0-kidmoneys
-Gears 1.0-PhaseII
-Guimbarde 1.0.1-esi
90 MB
http://rapidshare.com/files/235996964/05-24-09-4.rar
-Hidden Music - Prank Box1.8-itaintrite
-Hungarian Wines 1.0-esi
-iBusiness News 2.1.1-alibaba
-iChainsawX 1.3-drQ[C4iD]
-iCorps - USMC Pocket Reference 3.0.0-esi
-iDownload 1.1-alibaba
-iNapkin 1.2-kidmoneys
-Inspirational Quotes 1.0-most_uniQue
-iPearl 1.0-esi
-iSmiley 1.0-esi
-Jellyfishes 1.0-esi
-Jisho Touch (Multilingual Japanese English Dictionary) 1.5-kidmoneys
-Johnny Crash 1.0.0-esi
-Join the Dots 1.0-esi
-Keyboard Shortcuts 1.0-esi
-Kitty (Meow ‘n’ Purr Kittens) 1.2-itaintrite
-Lange Biochemistry and Genetics Flash Cards 1.1
95 MB
http://rapidshare.com/files/235998442/05-24-09-5.rar
-Laughter 1.2-drQ[C4iD]
-Man United Anthems 1 1.0-esi
-Man United Heroes 1 1.0-esi
-Measures - Unit Converter 1.2.7-COREPDA
-MovieBase 1.0-kidmoneys
-MyReef 3D 1.01-kidmoneys
-Mystique. chapter 1 - foetus 1.0-esi
-Ninja Shadow 1.6.2-kidmoneys
-OzSlang 1.0
-Period Tracker 5.0-alibaba
-Phone Rings 1.1-itaintrite
-Pigskin Pass 1.0-esi
-Pipe 1.2-most_uniQue
-Port Defender - Tower Defense 1.0.6-kidmoneys
-Port Defender 1.0.6.patched-COREPDA
-Puzzle Ball 1.0-esi
-RateWatch Pro 1.0-alibaba
-RECalc - Real Estate Mortgage Loan Calculator 1.4.2-alibaba
-ReflexTest 1.1-drQ[C4iD]
-Romeo and Juliet 3.1-alibaba
75 MB
http://rapidshare.com/files/235999994/05-24-09-6.rar
-ScaryCastle 1.7-drQ[C4iD]
-Scoops 1.6-itaintrite
-Scream Illusions - Prank Box 1.8-itaintrite
-Sexy Sudoku 1.0-kidmoneys
-Shuffled 1.0-esi
-Sick Guy 1.1-itaintrite
-Sleuth 1.0-esi
-SomaFM Player 1.0-esi
-Speed Muscles MD 1.0-esi
-SpeedSurfer 1.0-esi
-SpiritWriter Trick 1.1-drQ[C4iD]
-Squeaky the Duck 1.1-itaintrite
-Stella GTD 1.0-esi
-StressTest 1.7-drQ[C4iD]
-SuccessIts! Motivational Poster Creator 1.0–most_uniQue
-Sugar Buzz 1.0-kidmoneys
-Super Marble Roll 1.0-kidmoneys
-SuperEnal8LE 1.2.0-ITALIA
-TanZen 1.5.4-lightmaster
-Taxiball 1.0-esi
-Tea Round 1.0-esi
75 MB
http://rapidshare.com/files/236001436/05-24-09-7.rar
-The Chemical Touch 1.5.1-lightmaster
-The Chemical Touch 1.5.1.patched-C4PDA
-The Gun - Ultimate Sound Box 1.4-itaintrite
-TheGun 1.3-drQ[C4iD]
-Tides of War 1-kidmoneys
-Toki Tori 1.0-VNMagicTeam
-Totem Quest Slot 1.0-esi
-Virtual Pool Online 1.97-dNaPOD
-WAR (Machine Gun, Bomb, Explosion, etc) 1.3-itaintrite
-YXflash.v1.0.rar
-ZOOZbeat Rock 1.0-kidmoneys
75 MB
http://rapidshare.com/files/236002472/05-24-09-8.rar
-25 Things Guys wish Girls Knew 1.0-phil
-3D Tunnel Vision 1.1.1-T_Z
-A Robo Riot! 1.0-phil
-A seXy nurse 1.0-F-14
-Absalt Alarm Clock 2.5.2-itaintrite
-Ambiance Classic 1.5.5-kopimi
-Apache HTTPD Directives 1.00-herewe
-aWake!Simply - 7 Day alarm and bedside clock 2.0.1-most_uniQue
-Barcelona 1.0-F-14
102 MB
http://rapidshare.com/files/236356232/05-25-09-1.rar
-Beer Opener 1.0.1-most_uniQue
-Blocks 1.3-most_uniQue
-Box of Sox 1.0-MeUp
-BSDMan 1.0-herewe
-CalcsPro - Mortgage Calculators 1.31-alibaba
-China (Travelto) 1.6-alibaba
-Clopy 1.0-esi
-Converted 1.6.2-alibaba
-Darkness - Sun, Moon, Clock 2.01-liddokun
-Deca Sudoku 1.0-herewe
-Doodle Jump 1.2.1-Isnt_me
-Dzikir and Doa Collections 1.0-alibaba
-Emailer - Wide SMTP Emailing 1.6-most_uniQue
-English Premier League Live 1.3.1-dNaPdA
-Faby - Air City 1.0-phil
-Flight Update 3.0-alibaba
-Food Observer 1.0.1-phil
-France (TravelTo) 1.6-alibaba
-Galactica 1.2-MeUp
-GameBox Arcade ( Oldschool SFX ) 1.3-itaintrite
-Geek Test 1.0-phil
-Germany (Travelto) 1.6-alibaba
-Hearing Test - Prank Box 1.9-itaintrite
97 MB
http://rapidshare.com/files/236357814/05-25-09-2.rar
-G-Park 2.5-most_uniQue
-Goaaal! 1.0-F-14
-Good Food 1.0-phil
-HomeBudget 1.1.2-alibaba
-iCab Mobile (Web Browser) 1.5-liddokun
-iCash 1.2-drQ[C4iD]
-iSwineFlu 1.0-F-14
-iTradeAnalysis - Improve Trading1.4-alibaba
-Kitty (Meow ‘n’ Purr Kittens) 1.3-itaintrite
-Kryzer Prologue 1.0-Dheed
-Mart Bingo 1.02-most_uniQue
-Math King 1.2-most_uniQue
-MegaHolidays 1.01-alibaba
-Microbiology Pronunciations 1.1-most_uniQue
-Morphing-Animal 1.0-herewe
-Most Addictive Game 1.0-phil
-Night Shift - Maids 2.0-herewe
-Night Shift - Nurses 2.0-herewe
-Night Shift - Secretaries 2.0-herewe
-Nombre Clef 2.0
-p-i-m Studies For Guitar 1.0.1-phil
-Palavras Cruzadas 1.0.1-brazzas
-Phone Rider 1.1-rickth64
-Pichirp Pro 1.0-most_uniQue
103 MB
http://rapidshare.com/files/236359324/05-25-09-3.rar
-Puzzle Bubble 1.0-F-14
-Reflexo 1.0-herewe
-Rise of Atlantis 1.0.0-herewe
-Robot Rover 1.0-herewe
-Russian English Dictionary 1.0-drQ[C4iD]
101 MB
http://rapidshare.com/files/236360918/05-25-09-4.rar
-Scotch 1.0-phil
-Sexy Game 2.0-alibaba
-Sherlock Holmes complete collection 3.1-herewe
-Social Butterfly 1.0-phil
-Sonic the Hedgehog - Sonic 2 MOD 1.0.0-DMI
-Space Shuttle 9.10-MeUp
-SpeedSurfer 1.0-esi
-Stupid Cloud! 1.0-phil
-SWIRL - 3D Arcade Racing 1.0-jerrymaguire
-SyncSing 1.0
-texTure MMS 1.3-most_uniQue
-Tough Topics 1.0-phil
-Turbo Subs 1.1.6-phil
-US President Quotes 1.65-alibaba
-Vegas Mate 1.5.3-phil
-Video Game Updates 1-herewe
-World View Live 1.3.2-luxbut
-Zip Codes 1.1-alibaba
82 MB
http://rapidshare.com/files/236362398/05-25-09-5.rar

Cuando hablamos de diseño web, sobre todo en la fase propiamente de diseño en programas de edición de gráficos, es relativamente frecuente observar un efecto conocido como ??page curl? o pliegue de página.
Para entendernos todos, es el efecto que observamos cuando pasamos las páginas de un libro por ejemplo.
Si quieres agregar un toque curioso a tu sitio web y agregar una esquina que se doble para mostrar el contenido de debajo te vendrá bien este plugin libre para jQuery creado por Elliott Kember.
Para hacerlo funcionar sólo necesitarás usar jQuery y jQuery UI (preferiblemente la versión 1.5) con el módulo resizable. Luego con un par de líneas de código y creando un elemento con id ??target, que contendrá lo que quieras que se vea tras la página, estarás listo.
The Sexy Curls jQuery plugin: http://www.elliottkember.com/sexy_curls.html
Vía Ajaxian
Otras entradas que pueden interesarte:The Flash Player contains a number of APIs for handling collision detection within Flash content. The DisplayObject class contains hitTest and hitTestPoint which can be useful if you need to detect bounding box collisions, or detect collisions between an individual point and bounding boxes or shapes.
However, BitmapData also contains a hitTest API, which can check collisions on BitmapData. Where the API really shines, is when you need to detect collisions between the visible areas of DisplayObjects (and not just of their bounding boxes). The API contains functionality for testing collisions between BitmapData and a Point, BitmapData and a Rectangle, and BitmapData and another BitmapData. It is the last item that I will focus on in this post.
Since you can get BitmapData from a DisplayObject the API can be used to detect very exact collisions between the visible areas of DisplayObjects, even if the DisplayObjects have irregular shapes.
Here is a simple example that uses the API to detect collisions between the visible areas of two MovieClips using BitmapData.hitTest.

And here is the code
var redRect:Rectangle = redClip.getBounds(this); var redClipBmpData = new BitmapData(redRect.width, redRect.height, true, 0); redClipBmpData.draw(redClip); var blueRect:Rectangle = blueClip.getBounds(this); var blueClipBmpData = new BitmapData(blueRect.width, blueRect.height, true, 0); blueClipBmpData.draw(blueClip); addEventListener(Event.ENTER_FRAME, enterFrame); function enterFrame(e:Event):void { blueClip.x = mouseX; blueClip.y = mouseY; if(redClipBmpData.hitTest(new Point(redClip.x, redClip.y), 255, blueClipBmpData, new Point(blueClip.x, blueClip.y), 255 )) { trace("hit"); redClip.filters = [new GlowFilter()]; } else { redClip.filters = []; } }
Basically, the content contains two MovieClips on the timeline. We draw the graphics for each MovieClip into a BitmapData instance, and then use the BitmapData.hitTest API to see if the visible parts of the MovieClip (non-transparent) instances collide.
Couple of notes on the example:
1. The initial fill for the BitmapData is transparent pixels. This is necessary to detect just the visible areas of the DisplayObject.
2. The Point instances passed to hitTest are used to align the BitmapData instances for the comparisons.
This example works regardless of the contents or shape of the DisplayObjects. However, if either of the DisplayObjects have had any transformations applied to them (such as rotation), then the collision detection wont work correctly.
In order to get it to work, you need to apply a Matrix when drawing the BitmapData to account for the transformation applied to one or both DisplayObjects. If you haven’t worked with Matrices and DisplayObject transformations, this can be a little daunting at first (it was for me). If you are new to using Matrices, I suggest reading this excellent article on Matrices in Flash over at senocular.com.
Luckily for me, Trevor McCauley, who runs senocular.com, also happens to works for Adobe on the Flash Player team. He really helped me understand how how to get the hit detection to work when the DisplayObjects have had transformations applied to them.
Here is the example:

and the code:
addEventListener(Event.ENTER_FRAME, enterFrame); function enterFrame(e:Event):void { blueClip.x = mouseX; blueClip.y = mouseY; redClip.rotation++; var blueRect:Rectangle = blueClip.getBounds(this); var blueOffset:Matrix = blueClip.transform.matrix; blueOffset.tx = blueClip.x - blueRect.x; blueOffset.ty = blueClip.y - blueRect.y; var blueClipBmpData = new BitmapData(blueRect.width, blueRect.height, true, 0); blueClipBmpData.draw(blueClip, blueOffset); var redRect:Rectangle = redClip.getBounds(this); var redClipBmpData = new BitmapData(redRect.width, redRect.height, true, 0); var redOffset:Matrix = redClip.transform.matrix; redOffset.tx = redClip.x - redRect.x; redOffset.ty = redClip.y - redRect.y; redClipBmpData.draw(redClip, redOffset); var rLoc:Point = new Point(redRect.x, redRect.y); var bLoc:Point = new Point(blueRect.x, blueRect.y); if(redClipBmpData.hitTest(rLoc, 255, blueClipBmpData, bLoc, 255 )) { trace("hit"); redClip.filters = [new GlowFilter()]; } else { redClip.filters = []; } blueClipBmpData.dispose(); redClipBmpData.dispose(); }
Note that we use the bounds of each DisplayObject to determine the BitmapData size and not the height / width of the DisplayObject. This is because the transformation will most likely modify the bounds, and we need to take this into account. In the first example, we could have just used the height and width of the DisplayObjects since they were the same as the bounds, but in general you should get in the habit of using the bounds.
We also pass a Matrix to each BitmapData.draw call to account for any transformations that may have been applied to the DisplayObjects (in this case rotations). I could try and explain what the Matrix is doing, but to be honest, im still trying to get my head around it. Instead, Ill let Trevor explain it (from an email he sent to me):
For this you need the transformation of the object as defined by DisplayObject.transform.matrix. Since everything is in the same container, we still won’t have to worry about walking up hierarchies to get contcatenated/global matrices – we can just use that which is directly applied to the target object (transform.matrix). This gives you the full transform of that object. But for the purposes of capturing a bitmap, we only want the non-translation parts of that transform. This is because when a bitmap is captured, it’s captured from the 0,0 location in the coordinate space of the captured object outward into positive space. The translation of the matrix of the desired object is its position in its parent coordinate space, not its own. HOWEVER, if that object’s own 0,0 location is within the middle of its graphic elements, drawing it into a Bitmap directly from 0,0 could cause cropping. So in terms of that translation as it is to be used with BitmapData.draw(), it’s still important to make sure everything in the target object is captured. And in doing that, it means shifting everything that would appear in negative coordinate space over into positive coordinate space.
Luckily, using getBounds (again) this is quite simple. We can use getBounds to determine the bounds of an object in its parent coordinate space – this includes its transformations. We also know the location of 0,0 within the parent coordinate space because that is the same location it places the target object using its x and y properties. With that, we can get the needed bitmap translation by simply subtracting the bounds x,y from the object’s own x,y. In code that essentially becomes
var b = t.getBounds(t.parent);
var m = t.transform.matrix;
m.tx = t.x – b.x;
m.ty = t.y – b.y;
var bmp = new BitmapData(b.width, b.height, true, 0);
bmp.draw(t, m);
where ‘t’ is the target display object.
Now, I will be the first to admit that I am still wrapping my head around some of this stuff, especially with the use of the Matrices to offset the transformation. However, the second example above is generic and robust enough to be used for general pixel perfect collision detection on visible portions of DisplayObjects.
One note, is that the examples above assumes that the items being compared share the same parent. If they don’t you need to make some additional adjustments (to take into consideration other transformations), but that is a post for another day.
Btw, if you don’t already, you need to read senocular.com. This is one of the best resources on understanding ActionScript 3 and the Flash Player.
Update : One optimzation which you can make is to first check if the bounding boxes of the DisplayObjects overlap (using DisplayObject.hitTestObject), and only if they do, use BitmapData.hitTest to see if their visible areas are touching.
Un truco recurrente en Youtube el de Anti Gravity Water, el truco es muy simple pero impresionante algo que puedes hacer a tus amigos.
Acontinuación el truco:
Y aquí el como lo hizo:
basehttp://www.comolohizo.com/2009/05/17/truco-de-anti-gravedad-con-una-botella-de-agua/Bob Arnson has been working on some simplifications to the WiX language in WiX v3.5, and he has posted some introductory information about a couple of these changes on his blog. I wanted to link to them here to hopefully help raise visibility for these simplifications:
I have found the major upgrade simplifications to be particularly useful. A while back, I wrote a step-by-step guide for authoring, building and testing major upgrades using WiX, and that guide later got added to the WiX documentation.
As you can see in Bob’s blog post and in the WiX MajorUpgrade element documentation, Bob’s simplifications will allow WiX v3.5 to handle creating the Upgrade table elements, scheduling the RemoveExistingProducts action, and optionally blocking downgrades if a user tries to install an older version of the MSI after installing a newer version. You only need to make sure that you include UpgradeCode and Version attributes in your Product element, and then you can use the new MajorUpgrade element in your WiX v3.5 authoring.
If you choose to, you can continue to use the more verbose syntax described in my previous blog post or the WiX documentation for authoring a major upgrade, but you could instead convert to the new MajorUpgrade element in order to more clearly express the behavior you intend for your MSI and to simplify your setup authoring.
The major upgrade and component authoring functionality described in the above blog posts is available in WiX v3.5 builds starting with the v3.5.1315.0 build on SourceForge, and I encourage you to check them out.
Or how to turn your Intel based Netbook into a Macbook nano and not spend 1600 euro trying1.
A couple of months ago both crews of Venera7 and El Geek Errante, driven by the geeky rush of the moment, decided to buy the quite sexy netbook from Acer, the Aspire One. The idea was to have something extremely light and portable that could be carried in a small bag with a book and some other small stuff.
The Acer Aspire One has a nice set of features: a 9? LED backlit glossy screen, 120Gb HD, a really small factor, 2 USB ports, 1Gb RAM (expandable to 1.5Gb), an Intel Atom 1.6GHz processor and an integrated Intel GMA 950 video card. And all for 350 Euro (taxes included). It??s quite easy to find in Spain and I guess in general around the world. We bought our white ones at PC City in Madrid; I guess after that they ran out of stock for the weekend in the white model :-)
We thoroughly evaluated the MSI Wind, the Dell Inspiron Mini, the HP whatevermodelitisthatisverysmall, and the Asus Eee PC. Turns out in terms of features/usability/size the Acer is the best option. Basically, MSI Wind and Dell are too big, HP is too slow, and Asus Eee PC is too crappy and too small (keyboard is for children). Anyway, go to Youtube and see the reviews, comparisons and tour de forces by yourself.
Surprise, I´m not only installing Mac OS X!Yep buddies, that´s right. I´ll also explain how to repartition the internal disk to have Mac OS X as the main OS and a small Ubuntu partition for Linux stuff (like wireless hacking), install both operating systems, and configure GNU´s Grub to be able to dual boot them.
The plan will be to partition the Aspire One internal disk into three different physical partitions: first one for Mac OS X (110Gb), second one for Ubuntu Desktop (9Gb) and the third one for Linux swap space (1Gb).
I´ll explain all the details in the upcoming sections.
What will work and what won??tEverything will work charmingly (including the official Apple Mac OS X updates and the integrated webcam) except for the following things (that we´ll try to minimize with different software toys):
If you have already googled about the Acer Aspire One and Mac OS X, yes, everything else is working. Amazing, huh? Just wait to see the steps to tune up your little creature!
Hardware you??ll needFirst of all, as I??ve already said, you don??t need to do this if you don??t want to either upgrade your memory or change your wireless card, although the latter is strongly recommended because it doesn??t make much sense to have a netbook that isn??t able to surf wirelessly, doesn??t it?
So, let??s assume you??re convinced and you??ve already purchased and received all your gear (typically for Spain the Dell WiFi card delivery takes 2-3 weeks).
Now breath deeply: you??ll have to open your Acer Aspire One. Fear not, my friend, because the operation is quite easy. What I??ll do here is point you to the best Aspire One hacking tutorial out there and just make some comments and remarks about what we??re interested in.
The Aspire One hardware hacking tutorial is a video made by TnkGrl that explains in very detail how to open it. Go there, watch it a couple of times, get the necessary gear to open it and follow her instructions while you´re opening your Aspire One.
So go watch it now!: Tnkgrl awesome Acer Aspire One hacking tutorial
My comments to the video:
If the process went OK and the original Linpus that came with the Aspire One is still installed, you should be able to see the upgrades from the OS. Don´t worry now, because we´ll see them as soon as Ubuntu Desktop and Mac OS X are installed.
Updating the Aspire One BIOSTo smoothly install Mac OS X in our computer, we´ll have to update the BIOS firmware with the official Acer BIOS update release 3304 you just downloaded. Here´s the detail of what´s inside the download from Acer:
The Aspire One is able to boot from external USB devices. Thanks to this, we´ll be able to upgrade our software without having to waste a DVD: we´ll just boot an MS-DOS compatible operating system from an external USB drive that has inside the proper upgrade image files and programs.
Now, for doing a bootable USB drive you have mainly two options: do it with Mac OS X or do it with Linux or Windows. The latter is pretty well documented in the Internet, so I won´t go with this one. Alternatively, I chose to make my life a bit more complicated and fight with the method to create bootable USB drives from Mac OS X. Once again, it´s not difficult, it was just poorly documented until now.
So, we´ll create our FreeDOS bootable USB drive and we´ll transfer the two necessary files for flashing our BIOS. The FreeDOS image will have to have enough room to host the extra BIOS flashing files. That´s the reason I´ve chosen to download a 11.52Mb image instead of the traditional floppy images. Anyway, here are the the steps to follow to create the flashing USB drive and update your Acer BIOS:
You should see a new /dev/disk device that corresponds to your USB drive. In my case, it was /dev/disk1 so from now on I´ll assume this is yours too.
Be careful because we´re going to completely erase the USB drive. If you have data inside it you want to keep, do a backup now.
The dd command copies bit by bit the FreeDOS image to your USB drive, so now you have a DOS bootable USB drive.
This creates a new file in the USB drive root called ZG5_3114.FD containing the actual BIOS. If anything goes south, we´ll always be able to recover our previous BIOS with this file following the instructions you have in Aspire One User Forums
Wait until the process is over. The Aspire One should restart automatically. When done, hit F2 to go to the BIOS setup utility and check that System BIOS information now points to v0.3304
That´s all.
Installing Ubuntu Desktop and configuring multiboot with GrubWhy install Ubuntu in the Aspire One?
Several reasons: it rocks, it??s perfect for wireless hacking if you??re on the go, and it gives you more control over what??s going on with your laptop. Ubuntu Desktop is a supported operating system for the Aspire One, so it??s only a good idea to have it. Besides, it??ll help us partition the Aspire One internal disk and boot Mac OS X properly.
I won??t go with a lot of detail for the Ubuntu installation in your Aspire One because the process is quite standard and well documented. The only three important steps for me were getting the Ubuntu Installation disk in an USB image, the disk partitioning and, of course, Grub configuration that??s far from obvious.
As I??ve already told you, I don??t have an external USB DVD drive, so what I did to install Ubuntu in my Aspire One was to burn and Ubuntu Live cd with the image you just downloaded from the download lists provided before, boot it in an Intel-based computer (your Mac, for example), and follow the instructions in Ubuntu community forums to create a bootable Ubuntu USB distribution. If it has enough space, use the USB drive you just used for upgrading your bios, or the one you??re going to use for Mac OS X Kalyway installation. It really doesn??t matter because you??ll use the Ubuntu bootable USB drive just once.
So, now you??ve got an Ubuntu bootable USB drive. Boot it in your Aspire One by hitting F12 and selecting the external USB drive to boot and start the installation. In my case, using the Ubuntu installer, I chose manual partitioning of the Aspire One disk. I made three partitions: the first one for Mac OS X, was about 110Mb. Second one was for Ubuntu, 8Gb, and the third one took the remaining disk space for Linux swap. Of course, I proceeded to install Ubuntu in the second partition using the third one as swap. When assigning mounting points to the partition, I told Ubuntu installer to locate boot information in /boot under the root directory in the second partition (the one prepared for Ubuntu). It??s there where we will be installing the PC_EFI boot necessary to boot Mac OS X.
Once Ubuntu is installed, boot it in your Aspire One, and prepare to do some administration to configure Grub as the multiboot program. These are the steps I followed to be able to boot Mac OS X after its installation:
Now you should be able to boot Mac OS X once it??s installed. I also tried this procedure with Chameleon EFI and for some reason it didn??t work, so PCI EFI is the one I??m recommending here.
Preparing Mac OS X installationThe Aspire One is now prepared for the Mac OS X Kalyway installation. Next steps will describe how to set up your USB drive to get a bootable Mac OS X image. You don??t need that if you have a working external USB DVD to use Kalyway DVD.
Did it work? Is your USB drive booting? Great, the following is where the rubber hits the road.
OK, Mac OS X is now up & running in your Aspire One, but we??re far from finished. Let??s go through the steps necessary to get it ready to use in the following section.
Upgrading your Mac OS X and post-installation stepsHere??s is where we take our Mac OS X to its latest version (at the time of writing this post, it??s 10.5.5) and do some tweaks to have as much as possible working in our personal MacBook nano.
We??ll need to have most of the stuff we listed as software downloads available for the Aspire One so Primo) you have it in an external USB drive that you??ll be plug in into the Aspire One or Secondo) you have now Internet connection from your MacBook nano so you??re able to download it from the Internet.
Currently we are using 9.2 Speedstep Kernel, but we want to use Vanilla Kernel from the original Mac OS X because it??ll allow us to get all the software updates from Apple. We will be installing it in the following steps, but we have to be ready for it. This means we??ll have to make some configuration changes in Mac OS X because for this system vanilla kernel will only support 1 cpu.
With your favorite editor, edit the /Library/Preferences/SystemConfiguration/com.apple.Boot.plist file to do the following modifications (you could open a Terminal and use vi or just use the Editor program located under ??Applications?? > ??Utilities??). Inside the file, look for ??Kernel Flags?, put there ??cpus=1? and save the file.
Keep this window open while you run the downloaded update and install it.
Keep this window open while you run the downloaded update and install it.
System will take a long time to reboot let the system be until it will restart, so be patient and give it plenty of time. If in case you run out of patience or it will not reboot you have to do hard reboot on the system and use ??update ??v? steps on boot you??ve already seen here.
Now you??re Mac OS X is Leopard 10.5.5. You??ve got still some steps to perform to get some things running, so let??s go for them.
Making the sound work
Fixing the ??About this Mac? message
Getting 1024?600 resolution
Getting the network plug & unplug to work
Getting the battery indicator to work
Avoiding system shutdowns while closing the lid
This one is really easy. Just install InsomniaX (the link is also in the ??Software you??ll need?? list) and configure it to fire up every time you start your Mac OS X. This can be done going to System Preferences > Accounts, clicking on your account and going to the ??Login Items?? tab. There you can click on the ??+?? button and add InsomniaX to the list.
And that??s all, my friends. You should be able to go to the Apple menu and click on ??Software Updates?? to get the latest updates from Apple, and also download and install your favorite Mac OS X applications.
Enjoy the fruit!
AcknowledgementsHere??s the list of people that has been done possible this step by step tutorial:
Hace algunos días un amigo necesitaba buscar y descargar un programa, concretamente un afinador de guitarras, le dije que lo hiciera desde mi computadora pero que tuviera cuidado con lo que instalara. Cuando vuelvo un par de horas después descubro que Firefox incluía una nueva y agradable barra de herramientas llamada Crawler, le pregunté si sabía lo que era y obviamente contestó que él no la había instalado. Al parecer el programita que probó venía con la barra de regalo que al instalarse sustituye al motor de búsquedas predeterminado y por supuesto, además de no inspirarme confianza, me molestaba.
(clic para ampliar)
"Supported Operating Systems: Windows Server 2003 Service Pack 2; Windows Server 2008; Windows Vista Service Pack 1; Windows XP Service Pack 3"
The client also supports a range of SQL database versions....
"Microsoft SQL Server 2008 Native Client (SQL Native Client) is a single dynamic-link library (DLL) containing both the SQL OLE DB provider and SQL ODBC driver. It contains run-time support for applications using native-code APIs (ODBC, OLE DB and ADO) to connect to Microsoft SQL Server 2000, 2005, or 2008"
Support tells me that there's only two ways to manage the updates on ESXi embedded systems, using the "VMware Infrastructure Update" application (which requires manually logging into each and every ESXi host), or using some command-line tool. This, frankly, seems insane to me considering the Update Manager seems to be orders of magnitude more powerful in terms of what it can do, and I can't picture ESXi users being forced to do things "the very hard way" like that.
Does anyone have experience with this they'd like to share? I'm beginning to get very frustrated....
Cheers,
Derek
En un artículo anterior os expliqué en qué consistía la filosofía Strobist y cuales eran los componentes básicos necesarios para iniciarte en la iluminación portátil. En este artículo te explico cómo conseguir tu equipo más básico por muy poco dinero. Por tan solo 80 euros he conseguido juntar mi equipo básico de iluminación, flash incluído. ¿No te lo crees? En este artículo te cuento cómo conseguir cada uno de los elementos del equipo. Verás como al final salen las cuentas.
Y como de vez en cuando algún amigo me pregunta sobre ideas para regalar a algún amante de la fotografía y me acaba tocando encargarlo a mí, me he decidido a hacer la recopilación para tenerlo a punto si me llega la oportunidad. Y como he hecho otras veces, quería compartirlo contigo.
Todos los artículos encontrados están en la modalidad "Compralo Ya" (el precio mostrado es el final, no se trata de subastas).
Como los productos tienen una duración finita, los enlaces apuntan a las correspondientes búsquedas en eBay. Dependiendo de la cotización del dolar y de las ofertas de los vendedores los precios fluctuarán al alza o a la baja. No olvides marcar la opción "Todo el mundo" en tus búsquedas y ordenar los resultados por "Precio + envío: más bajo primero".
1) Lo primero, el flashSi ya contáis con un flash os podéis ahorrar este paso (y una buena parte del presupuesto dedicado al equipo de iluminación).
Como vamos a disparar el flash remotamente, no es necesario disponer de un flash TTL, pero si es necesario que tenga la posibilidad de regular la potencia.
En mi caso opté por un Yongnuo YN460, de lo más barato que pude encontrar en el mercado. Lo conseguí nuevo por poco más de 40 euros gastos de envío incluídos, y acabo de ver que se puede conseguir ya por poco más de 30 euros.
En éste artículo te hablo en detalle del flash, donde además hay muchas opiniones y experiencias de usuarios que optaron por uno igual.
De nuevo, eBay es mi referencia. Hay que rebuscar un poco para encontrar lo que uno busca, porque se utiliza un término un tanto genérico para describirlo que coincide con otros productos más baratos. Puedes probar con "studio light stand".
En el momento de escribir estas líneas Next Digital tenía en stock un trípode de 180 cm como el mío por 21 euros gastos de envío incluídos. Un auténtico chollo. Y en Gadget Infinity los tienes por 24, más pequeños, eso si.
El soporte para la sombrilla (no se si existe un mejor nombre en español) es la pieza que se fija a la punta del trípode, sosteniendo la sombrilla y a la que se engancha el flash.
Tiene muchos nombres, pero los he podido encontrar muy baratos buscando "Flash Shoe Umbrella Holder Swivel Light Stand Bracket". Tan baratos como que cuestan otros 6 euros.
La última pieza para montar el flash en el trípode es la sombrilla. Se trata de una sombrilla blanca (translúcida) que permite disparar el flash hacia el objeto y actua a modo de ventana de luz, ampliando la fuente de luz a la vez que la difumina.
Se puede encontrar por tan solo 5 euros con los gastos de envío incluídos, y si te fijas bien, hay vendedores que venden la sombrilla junto con el soporte, con lo que puede que consigas un mayor ahorro.
Podría haberme ahorrado este elemento para que me saliera más barato el kit, pero creo que es un complemento fundamental.
En su momento adquirí un juego de emisor y receptor PT-04, pero posteriormente ha salido una evolución, el CTR-301, que me parece que cuenta con varias mejoras en su diseño, aunque se necesita un pequeño adaptador para engancharlo al soporte de la sombrilla, ya que por defecto viene con una rosca de trípode.
El PT-04 se puede encontrar por apenas 13 euros y el CTR-301 se puede encontrar por menos de 18 euros en kit de receptor y disparador.
Si no has hecho aún la suma, te ayudaré:
32 euros del flash, 21 del trípode, 6 del adaptador, 5 de la sombrilla y 13 del disparador remoto son exactamente 77 euros. Teniendo en cuenta que siempre que pago por PayPal me acaban subiendo un poco el tipo de cambio, seguro que se queda en los 80.
Parece increíble, ¿verdad? ¿A que al principio no te lo habías creído?
Enlaces RelacionadosPara ti si quieres ir más allá, aquí están los contenidos de la Zona Premium relacionados con este artículo...
Versión PDF
Este Artículo en Versión PDF
Con páginas a todo color y listo para guardar en tu disco duro
|
In continuation to the Library VMware Icons and Diagrams posted on VIOPS recently several people have made requests for using these wonderful graphics for designing Visio documents. These are the same Graphics from the official VMware Branding Team.
20/March/08 - Small Icons now available for documentation - Small VMware Icons
Intended Audience
Virtualization professionals that need to present documents and designs.
Outline
The Stencils have been separated into groups
ThinApp-Stencil- Objects for ThinApp
Build your Own-Stencil - Stand-alone objectsto create your own diagrams
VM-STencil - Objects that are related Virtual Machines
VMware-Stencil - General Objects for VMware
Products-Stencil - Diagrams and objects that are related to VMware products or technologies
Method
1. Download the Attached Files below.
2. Extract the Stencils from both files.
3. Open Visio and open the all the Stencils.
4. Use the Stencils to create a visio diagram of your infrastructure
Resources
This doc on the web @ VMware Icons and Diagrams - Visio Stencils
Original PowerPoint Presentation with Graphics - Library VMware Icons and Diagrams.
Visio Stencils Bundle - 1 (zip file) for your use - Attached to this document.
Small VMware Icons
Author
Stencils Created and sorted by Maish Saidel-Keesing
All Graphics are from - VMware Corporate Branding
VMware (NYSE: VMW) is the global leader in virtualization solutions from the desktop to the datacenter. Customers of all sizes rely on VMware to reduce capital and operating expenses, ensure business continuity, strengthen security and go green. With 2008 revenues of $1.9 billion, more than 130,000 customers and more than 22,000 partners, VMware is one of the fastest-growing public software companies. Headquartered in Palo Alto, California, VMware is majority-owned by EMC Corporation (NYSE: EMC). For more information, visit www.vmware.com.
Disclaimer
You use this proven practice at your discretion. VMware and the author do not guarantee any results from the use of this proven practice. This proven practice is provided on an as-is basis and is for demonstration purposes only.
These graphics have not been optimized for Visio. They are not vector-based and are not guaranteed to resize at best quality.

Llevaba tiempo queriendo traer por aquí los bodegones armados de Geliographic, pero se me habían quedado por ahí perdidos entre los favoritos en mis rss. De hoy no pasa…
Por otro lado, ya hemos comentado aquí en otras ocasiones el atractivo de las armas que llega, en ocasiones, al freakismo más llamativo.

(La pista, por suerte sin fecha de caducidad, sum1).
Artículos más o menos relacionados
El simulador de jubilaciones es una herramienta bastante útil que nos permite calcular las prestaciones que se recibirán al jubilarnos, valga la redundancia, en función de lo que se está aportando a la Seguridad Social y a los planes de pensión particulares.
Un simulador de este tipo puede ser muy beneficioso ya que nos puede ayudar a estimar y planificar los últimos años de nuestra vida laboral, así como la creación de algún plan de pensiones privado con el fin de conseguir un nivel de vida de nuestro gusto cuando estemos con estatus de jubilados.
Gracias a este simulador sobre todo seremos capaces de:
Conocer la aportación que debe realizar para obtener la prestación que desee a su jubilación.
Calcular el ahorro fiscal que obtendrá con su aportación.
Conocer el nivel de vida que tendrá a la jubilación, suma de la pensión de la Seguridad Social y su Plan de Pensiones.
Elegir el Plan de Pensiones que mejor se adapte a su perfil inversor.
La forma de uso de dicho simulador es muy sencilla y se divide en siete apartados muy dinámicos sobre los que podremos informar y en base al cual se constituye hoy en día el cálculo de la prestación final con la que contamos, pública y privada.
En primer lugar tendremos que rellenar nuestro datos personales: fecha de nacimiento, sexo, movilidad geográfica y lugar de residencia, acompañado de un segundo punto en donde indicaremos si poseemos algún tipo de discapacidad y en que grado. A continuación indicamos si tenemos ascendientes o descendientes por consanguinidad directa y la edad de cada uno ellos.
En el punto cuatro deberemos indicar todas las retribuciones económicas que hemos recibido a lo largo del año, indicando los cuatro tipos de retribuciones contempladas en la normativa actual: salario bruto, rentas del ahorro, actividades económicas y resto de rentas generales. Así como en el punto cinco todo lo referente a nuestra situación en la seguridad social.
Por último deberemos rellenar los apartados seis y siete en donde entra en juego las aportaciones a planes de pensiones privados, indicando la cantidad total aportada y el perfil de inversor que somos, dependiendo del riesgo al que hayamos sujeto estos planes.
El resultado, habiéndole dado al botón de calcular, es una página bastante entretenida a la vista ya que presenta la información con gráficas y datos muy concisos acerca de el nivel de ingresos total que recibiremos cuando nos jubilemos y la importancia en las mismas de la parte pública y la privada.
El ejemplo en la imagen es muy sencillo: nuestra cuantía al jubilarnos será un 105% la de nuestro sueldo medio durante las aportaciones a la Seguridad Social, un 95% proveniente de esta última y un 10 por ciento de nuestros fondos de pensiones privados. Además tenemos un botón de descarga en PDF en donde podremos guardar para ver de forma más tranquila el resultado de los cálculos y así estudiar, si nuestra jubilación ya está cerca, como conseguir una mejor rentabilidad.
En resumen, el simulador de jubilaciones nos puede ayudar a ser muy analíticos con todas las características específicas de nuestra aportaciones a la Seguridad Social y a las entidades financieras para conseguir un sueldo en nuestra jubilación digno de las necesidades y del trabajo que hemos realizado durante toda nuestra vida.
En Actibva | Simulador de jubilaciones
Miguel Lopez, editor de Pymes y Autónomos y El Blog Salmón

Todos pagamos tributos, incluso aquellos que no alcanzan el mínimo para tener que hacer la declaración a hacienda. Cuando somos pequeños y compramos cromos pagamos el IVA, cuando nos formamos tenemos que pagar tasas por la expedición de los títulos, cuando trabajamos y ganamos el IRPF. En esta entrada vamos a hablar sobre los distintos tipos de tributos que pagamos.
Un tributo no está definido por ley, aunque los distintos tipos de tributos (impuestos, tasas y contribuciones) si lo están definidas. No obstante podemos definir un tributo como prestaciones (algo que damos) patrimoniales (porque disminuyen nuestro patrimonio) obligatorias que debemos hacer a las entidades públicas. Los tributos surgen de la necesidad de financiar a las administraciones públicas, aunque en ocasiones también se persiguen otros fines. Con excepciones los tributos se pagan mediante prestaciones monetarias. Los tributos se pueden agrupar en tres categorías: impuestos, contribuciones y tasas.
Una figura importante antes de explicar lo que es un tributo es el hecho imponible. El hecho imponible es aquello (el hecho jurídico) que nos obliga a el pago del tributo según la normativa legal vigente. Por ejemplo para el IRPF será la obtención de renta o para el Impuesto de Bienes Inmuebles la posesión de un bien inmueble.
La Ley General Tributaria dice que los impuestos son tributos exigidos sin contraprestación cuyo hecho imponible está constituido por negocios, actos o hechos de naturaleza jurídica o económica que ponen de manifiesto la capacidad contributiva del sujeto pasivo como consecuencia de la posesión de un patrimonio, la circulación de bienes o la adquisición o gasto de la renta. Lo que viene a decir que los impuestos son pagos que hacemos porque demostramos que somos capaces de hacer el pago y financiar la administración pública.
La ley además define que no hay derecho a contraprestación, por lo que no podemos exigir nada (un bien o un servicio) a cambio de pagar impuestos. Por tanto no se tiene derecho a circular por una carretera, que nuestros hijos vayan a un colegio o utilizar el servicio de urgencias por pagar impuestos. La financiación de la administración y los servicios que presta son completamente independientes.
Los impuestos se pueden clasificar en directos (como el IRPF) e indirectos (como el IVA), en personales (porque el contribuyente paga por su capacidad global) y reales (el contribuyente paga por un hecho que demuestra su capacidad), en objetivos (no tienen en cuenta la capacidad del contribuyente) y subjetivos (la tienen en cuenta) y por último se pueden clasificar en periódicos (se pagan más de una vez en el tiempo) y en instantáneos (se pagan una vez por unos hechos).
El siguiente tipo de tributos son las contribuciones especiales. Según la ley general tributaria se trata de aquellos tributos cuyo hecho imponible consiste en la obtención por el sujeto pasivo de un beneficio o un aumento de valor de sus bienes por la realización de obras públicas o el establecimiento o ampliación de servicios públicos. Es decir, se trata de tributos (pagos a la administración) que hacemos porque hemos recibido una contraprestación, siendo esta la mayor diferencia que hay con los impuestos. Por ejemplo si se construye una obra pública como pueda ser una parada de metro que revalorice un terreno. Este tipo de contribuciones no ha de ser superior al coste del establecimiento o ampliación del servicio. Asimismo los ingresos recaudados han de dedicarse a sufragar los gastos de la obra o servicio que han hecho exigir la obra.
Por último tenemos las tasas, que la la semana pasada comentamos en mayor detalle son tributos que pagamos porque utilizamos para nuestro beneficio privado un bien público, porque la administración nos da un servicio o porque se realicen actividades en régimen de derecho público. También están los precios públicos, pero estos no son tributos ya que no obligatorios, sino que se trata de un pago por un bien o servicio prestado por la administración pública en el que también incurre el sector privado.
El estudio de los tributos no sólo es importante para aquellos interesados en sus finanzas personales, sino que también sirve para entender muchas de las decisiones que se toman desde el ente público ya que su fnanciación depende casi exclusivamente de lo que recauda con los tributos. Además entender el tipo de tributo que estamos pagando nos ayuda a la hora de saber el porqué se nos está cobrando y cuanto debe ser el pago.
Imagen | Paul Keleher, Flickr
En Actibva | Cómo cumplir con Hacienda sin pisar por sus oficinas, Preparar la declaración de la renta
Javier Navarro, editor de El Blog Salmón
I finally got around to trying out the new hardware overlay support in Windows 7:
http://msdn.microsoft.com/en-us/library/dd797814(VS.85).aspx
Hardware overlays are a quirk of video hardware that have survived in spite of their lack of evolution. They're essentially a secondary display scan out path in the video chip and are intended for video display, so that a video in a window can use a more optimized display format instead of the rest of the desktop for better playback performance. The biggest advantages of a hardware overlay are hardware accelerated scaling and color conversion from YCbCr to RGB, formerly very expensive operations; in some cases, you also got primitive deinterlacing and some additional TV-out support. Unfortunately, they were often also buggy in drivers. Windows Vista appeared to be the end of the line for overlays, as they were not supported in desktop composition mode, but guess what... they're back in Windows 7. As it turns out, hardware overlays are still valuable for a couple of reasons, one being that you can flip them faster and asynchronously from the composited desktop (good for performance) and because you can't capture their image in a screen grab operation (good for the paranoid). And this time, they have a few improvements, too.
The way you get to overlays is a bit different in Windows 7. In older versions, they were a feature of DirectDraw, and that meant you basically couldn't do anything other than lock-and-load -- DirectDraw couldn't even do color conversion, other than what the hardware overlay itself supported. This time, they're hooked up to Direct3D, which makes them a lot more useful since you can process video through DXVA and shader hardware and push the result into the overlay. The color space is now better defined, as there are flags for whether RGB output is computer RGB (0-255) or studio RGB (16-235), and whether YCbCr output is Rec.601/709 or xvYcc. So far, so good -- time to try it!
Now, it's not easy to get VirtualDub talking to the new overlays yet, for two reasons: the existing overlay code uses DirectDraw, and the Direct3D path only supports D3D9, whereas you need Direct3D9Ex in order to use the overlays. Therefore, I ended up just writing a one-off application to test it. Well, having gotten overlays to work and tested them a bit, I have to say they're a bit underwhelming. The good news:
Now, the bad news:
Disclaimer: I used Windows 7 RC for testing, since I don't have RTM.
So, what do we have at this point? Well, you can create a non-stretched RGB overlay with regular 0-255 range. That means unless you are either in a situation where you are being hampered by a low desktop composition rate or you need to prevent your image from being grabbed, it's unlikely that the overlay will have any advantages over plain blitting to the desktop. And of course, you need to use Direct3D9Ex to access them, which is juuuust different enough from regular Direct3D9 to be annoying. The situation might get better over time, and it may just be my crappy video card... but I'll wait until I actually see improvement.
If anyone wants to experiment with WDDM 1.1 overlays, here's the code I used to test them: d3doverlay.cpp. It's obviously not production code, but I assume if you're trying to build it you have some familiarity with setting up a project and with D3D9.
typetext/htmlbasehttp://virtualdub.org/blog/pivot/entry.php?id=282
¡Por fin lo desvelamos! ¿De dónde saca Patricia Conde su ropa? Del armario de Patricia. ¿Y quién es este usuario que últimamente se pasea por los pasillos de 11870.com guardándose las tiendas en las que encontrar la ropa y marcas que la presentadora lleva en Sé lo que hicisteis (SLQH)?. Detrás del armario de Patricia está Maia Kling, la autora del blog El Armario de Patricia, que, al igual que dolcecity nos ha elegido para ordenar y mostrar mejor su selección tiendas. Maia Kling tiene mucho que decir de moda, tiendas y de cómo visten los famosos en España. Pasen y lean:
Lo primero, ¿conoces a Patricia Conde?
No, no la conozco en persona, ni tampoco he tenido la oportunidad de cruzarme nunca con ella.
¿Por qué la elegiste?
La elegí porque pienso que es capaz de darle vida hasta a la prenda más sosa. Es sencilla pero a la vez tiene ese punto que se necesita para poder vestirse con un simple pantalón y una camiseta y estar perfecta.
¿Y quién se esconde detrás de Maia Kling? ¿Es un pseudónimo?
En realidad es un semipseudónimo. Mi verdadero nombre es María, aunque todo el mundo me llama Maia. Lo de Kling viene de la marca que usa de vez en cuando Patricia en SLQH? Cuando me surgió la idea de hacer el blog y estaba buscando un pseudónimo cibernético, me acordé de cual había sido la razón por la que empecé a ver el programa, que era un modelo de Kling, una lechera turquesa y marrón chocolate que me encantó. Es simplemente un pequeño ??homenaje? a cómo empezó toda esta historia.

¿Cómo surge entonces la idea de crear El armario de Patricia?
Bueno, al principio me dedicaba a fijarme en la marca que aparecía en los créditos del programa, y después la buscaba en Internet. En una de esas búsquedas, di con un foro en el que se hablaba de la ropa que usaba Patricia en el programa. Después de un tiempo leyendo el foro me di cuenta de que por lo que las chicas más preguntaban era por las imágenes del vestido de ese día y por la marca, y de que estaría bien que hubiese alguna página donde estuvieran recopilada toda esa información.
Lo que hago es anotar los créditos del día y después buscar la imagen de Patricia y la prenda en las webs de las marcas. En lo de las imágenes de Patricia, el blog de SLQH es una ayuda enorme, ya que el blog lo llevo yo sola, y la verdad es que se lleva bastante tiempo. De no ser por ellos, tendría que hacer yo las capturas desde misexta.tv o el canal de youtube de SLQH, y el blog tardaría siglos en actualizarse.
¿Cua?to tiempo llevas con tu blog? ¿Te esperabas un éxito así?
Empecé con el blog en Febrero de 2008, y desde entonces ya va por las 40.000 visitas. Al principio las visitas no subían mucho, pero un día uno de los chicos del blog de SLQH me propuso añadir un enlace de mi blog en el suyo, y a partir de ahí se notó muchísimo la diferencia. No me esperaba la repercusión que ha tenido el blog, yo sólo pretendía hacer una recopilación de los modelos de Patricia, y por lo visto, éso era lo que la gente echaba en falta en Internet.
¿Con qué frecuencia lo actualizas? ¿Ves alguna evolución desde que empezaste con tu blog?
Trato de actualizarlo a diario, o cada 2 ó 3 días, pero hay ocasiones en que no tengo tiempo y se me acumulan las imágenes. He ido cambiando el formato en el que pongo las imágenes, antes ponía una imagen en la que se veía sólo la parte superior del cuerpo, ahora pongo también una imagen de cuerpo entero en pequeño, para que se pueda ver todo el modelo. También dedico algún post que otro a eventos a los que acude Patricia, para que el blog esté dedicado a todo el armario de Patricia, no sólo a la ropa del programa.
¿Qué marcas despiertan más tu pasión?
Me gusta mucho BCBG, René Derhy, Kling, Maje, Alicia Rueda, Amaya Arzuaga, Bimba y Lola? pero no me las puedo permitir, así que sigo soñando. De todas éstas, donde vivo la única que he encontrado que no es demasiado cara es René Derhy, de la que tengo una chaqueta y un vestido. Kling tiene tienda online en su web, pero no me atrevo a comprar nada, no me fio de comprarme ropa sin probármela.
¿Gastas mucho en ropa?
Más que gastar mucho en mucha ropa, prefiero gastar más dinero en poca ropa, es decir, prefiero gastarme el dinero en alguna prenda más buena que tener por ejemplo, el mismo bolso en diez colores distintos.
¿Tu último capricho?
Mi último capricho aún no me lo he dado, va a ser un vestido precioso de René Derhy que he visto, se lo pediré a los Reyes?.

¿Y tu capricho más caprichoso? en moda?
Mi capricho más caprichoso es un vestido de punto que llevó Patricia el 26 de Septiembre de 2007. Estuve buscándolo mucho tiempo hasta que di con él. Ahora es mi vestido favorito.
No me había pasado algo parecido nunca, y por el bien de mi bolsillo, ¡rezo para que no me pase más!
¿Cómo encuentras los modelos que lleva Patricia luego en las tiendas? ¿Se pone en contacto la gente contigo para hacerte consultas?
En mi ciudad hay pocas oportunidades de encontrar los modelos de Patricia. Lo que hago es buscar en las webs de las marcas que aparecen en los créditos, y cuando encuentro alguna foto de la misma prenda que haya llevado Patricia la pongo al lado de su imagen.
Muchas personas me preguntan por alguna prenda que otra, o por dónde pueden adquirirlas, y yo trato de ayudarles en lo que puedo. También me comentan que debería hacerle llegar mi blog a la estilista de Patricia, para que me ayude con las marcas y eso? de hecho, sé que ella ha visto el blog y le ha gustado, pero no me atrevo a pedirle tanto.
¿De qué otros personajes te hubiera gustado hacer un blog de moda? ¿Cómo opinas que se visten los famosos en España?
Hay gente que me comenta que también podría hacer El armario de Berta (Berta Collado) y la verdad es que me lo estoy planteando. Me gusta mucho cómo la visten, es ropa del estilo de Patricia. Lo que no creo que haga es El armario de Pilar, no concuerda con mi estilo, aunque también hay que reconocer que hay veces que saca vestidos muy interesantes.
Aparte de las chicas de SLQH me gusta cómo viste Penélope Cruz; es una persona que acierta con la forma que se debe ir vestida en cada momento. Eugenia Silva y Martina Klein son otras de las famosas que creo que tienen mucho estilo. Pero la verdad es que hay de todo, no quisiera dar nombres, pero más de una vez pienso: ¿en qué estaría pensando esta chica cuando se miró en el espejo antes de salir de casa?
Hay muchos blogs de moda, qué es lo que más te gusta de ellos?
Suelo seguir bastantes, se puede aprender muchas cosas de los blogs de moda: saber cómo hay que vestirse en una situación determinada, saber lo que son unas victorias, un borsalino, unos zapatos oxford, un vestido babydoll?.
También otra de las cosas que más me gusta es ver que hay vida más allá de Inditex. Donde vivo no hay más tiendas aparte de éstas, y todo el mundo viste igual, está bien conocer otras marcas y otras formas de vestir.
Hemos visto además que tienes una actividad frenética en algunos foros en los que se comenta el vestuario de la gente de SLQH, ¿crees que es un fenómeno?
Quizá sí tiene algo de fenómeno. Desde que Patricia empezó a ponerse vestidos babydoll ese estilo se ha ido extendiendo, aunque quizá sea sólo casualidad. Las estilistas también tienen mucha culpa de esto.
¿Cómo conociste 11870.com y qué es lo que más te gusta de 11870.com? ¿Te gusta tener ordenadas las tiendas en donde se venden los modelos que viste Patricia Conde?
Di con 11870.com buscando qué era Japanese Closet (uno de los créditos que a veces aparecen en el programa), y descubrí gracias a esta página que es una tienda de Madrid. Me ha resultado una gran ayuda para el blog, porque gracias a 11870.com puedo dar respuesta a quien me pregunta por las direcciones de las tiendas de la ropa de Patricia. No he tenido tiempo de explorar la página a fondo, pero por lo que he ido viendo es una página muy interesante, porque permite a personas anónimas dar su opinión sobre comercios, restaurantes? y qué mejor que alguien que haya estado allí te hable de las características del sitio, de las ventajas o inconvenientes de tal tienda o tal otra?
Ya para terminar, ¿qué tiendas/marcas recomendarías a Patricia Conde?
A veces usa ropa de H&M, yo le recomiendo a su estilista que siga por ésa linea: Zara, Mango, Massimo Dutti? prendas un poco más económicas que los sufridos bolsillos de sus seguidoras nos podamos permitir. Aunque tengo entendido que son las firmas quienes prestan las prendas al programa como publicidad, que por otra parte también está bien, ya que esto es una oportunidad de conocer marcas que antes no conocía.
Since I started blogging about WebSocket, people have been kind enough to send me more information through comments, tweets, and emails. I am happy that everyone has been sending me all this cool information and I thought I would dump some of that information here. This below is my view of the world of the Real Time Web and WebSockets.
Aghh! They look all tangled up like spaghetti code! I've tried to untangle some of this and break it down into byte sized chunks. I've come up some common themes and lots of links. Hopefully this post will help you understand what kind of different technologies are out there.
From Wikipedia,
The real-time web is a set of technologies and practices which enable users to receive information as soon as it is published by its authors, rather than requiring that they or their software check a source periodically for updates. It is fundamentally different from real-time computing since there is no knowing when, or if, a response will be received. The information types transmitted this way are often short messages, status updates, news alerts or links to longer documents. The content is often “soft” in that it is based on the social web - people’s opinions, attitudes, thoughts and interests - as opposed to hard news or facts.
So, according to Wikipedia, my “Real Time Activity monitor” is more for “Real-Time Computing”, as it was periodic update and the content is not “soft”. However, in this article, I would like to combine both “non periodic update” of Real Time Web(RTW going forward), and “periodic, very frequent update” of Real Time Computing aspect, as it shares similar problems. The keyword is “Push, Not Pull”. The current Web Paradigm is capable of pulling “non frequent update”, up until daily or hourly. However, when the update is in very short or unknown intervals, then clients end up hitting servers very heavily.
The many ways to achieve RTW
Comet is an umbrella term, which covers a number of techniques to achieve push-technology on the web.
In web development, Comet is a neologism to describe a web application model in which a long-held HTTP request allows a web server to push data to a browser, without the browser explicitly requesting it. Comet is an umbrella term for multiple techniques for achieving this interaction. All these methods rely on features included by default in browsers, such as JavaScript, rather than on non-default plugins.
The most common approach to Comet, using XMLHttpRequest long polling is fine when the pushing interval is unknown, but begins to fall down when you have a known, frequent push interval.
In my my previous article I demonstrated an activity monitor using web sockets (Code). As a followup to that, Rob Righter cloned that app but used long polling instead. I suggest reading both the websockets code and the long polling code to understand how the techniques differ.
Regarding the lack of a Comet standard, there are several applications and frameworks which offer a Comet solution so that you can concentrate on writing your business logic, rather than implementing Comet from scratch. Jetty is an Java based HTTP server and Jetty Continuations is an early adopter to offer Comet solution. APE (Ajax Push Engine) also provides a complete comet solution which works with various javascript libraries.
Interestingly enough, both Jetty and APE now offer WebSocket, too.
Unlike Comet, XMPP stands for Extensible Messaging and Presence Protocol and it is a standards based protocol.
The main feature is “Presence” which takes care of authentication, and shows whether participants are online or not. You have already seen examples of XMPP use on web via GTalk and Google Wave.
XMPP Standards Foundation also defined “Bidirectional-streams Over Synchronous HTTP”(BOSH) which can be used to transport XMPP over HTTP. There is a library called strophe where you can write XMPP client in both JavaScript and C for use in a wide variety of languages (Thanks to Luis Cipriani for all the info).
There is a screencast which explains the combination of the three.
According to the screencast, BOSH is a fancy name for long polling, so you could use WebSocket instead of BOSH. In fact, Kaazing Gateway already supports it.
I haven’t explored XMPP much yet, but Luis is visiting New Bamboo soon, so hopefully we can write another blog post about this. For now, here is my list of questions to XMPP and its use on Web. If you already know answers, please feel free to comment.
Flash has supported socket programming for a long time. web-socket-js is actually an WebSocket browser side implementation on top of Flashsocket.
WebSocketsYes, I have discussed WebSockets in the previous blog entires and I will discuss more in the following sections.
The many implementations of WebSockets.I think the node.js evented approach goes very well with WebSockets, but does it mean that we should abandon our favourite server side language/framework? Not quite. Like Jetty and APE already support WebSocket, most concurrency orientated languages, libraries, and frameworks already have WebSocket support.
Here is how you write “Echo” example in a number of different languages/libraries/frameworks.
ErlangIt’s interesting to see so many ways to do the same thing. Which way did you like it? Is your favourite language listed here?
Are WebSockets the silver bullet for RTW?I have advocated a lot about WebSockets, but let’s do a few reality checks before everybody jumps onto the WebSockets bandwagon.
NOTE: I will skip the adoption rate of WebSocket in browser, because there are not much I can add to the existing info.
Video and Audio use.This area is still dominated by Flash technologies. Even though WebSockets can send binary data, you need something at client side to decode. The best that I can think of is to bridge between javascript and Flash, but I guess it’s better to learn Flash in that case.
Mobile useAs Ilya Grigorik mentioned in his blog, Websockets’ bi-directional push will be easier on the battery and much more efficient for bandwidth consumption. However, mobile networks tend to lose their connection or switch to different networks (eg: from 3G to wifi) frequently, so not sure how WebSockets works in real mobile scenario. Also, due to the nature of mobile phone mostly being standby mode, probably “Push notification” has bigger demand, and you may need to access devices’ native feature from various libraries like below.
Greg Wilkins, who implemented WebSocket feature on Jetty, posted a blog article about problems of Websocket protocol and how to improve it (or even suggested alternative approach)
Among his various arguments, I found the following two points very interesting.
Orderly Closewebsocket has no concept of an idle connection, and thus an implementation will either keep connections open forever (DOS risk) or risk closing an in-use connection. Note also that the burden of handling disconnection and message retries falls to the application with websocket. Short of acknowledging every message is a significant overhead and thus not practicable as a solution for all.
Message FragmentationAnother issue with HTTP/1.1 pipelining is that the time taken to transmit/receive/process one message in the pipeline can unreasonably delay the handling of subsequent messages. While websocket is not hampered in this regard by request response semantics, it still suffers from the issue that the sending of a large websocket message may unreasonably delay the transmission of other messages.
If you are going to bet on WebScokets for 2010, you might want to spend a little bit of time reading the above blog article, the WebSocket protocol draft, or the source code of any WebSocket supporting libraries.
SummaryAfter reading my yet another long blog post, did you get clear idea about RTW and WebSocket, or get confused?
Here are my takes after this brain dump.
The world of RTW and WebSockets is changing rapidly and new examples, blog posts, and libraries appear almost every day. Please let us know such new information as you find or create them.
Cassandra is a hybrid non-relational database in the same class as Google's BigTable. It is more featureful than a key/value store like Dynomite, but supports fewer query types than a document store like MongoDB.
Cassandra was started by Facebook and later transferred to the open-source community. It is an ideal runtime database for web-scale domains like social networks.
This post is both a tutorial and a "getting started" overview. You will learn about Cassandra's features, data model, API, and operational requirements—everything you need to know to deploy a Cassandra-backed service.
May 11, 2010: post updated for Cassandra gem 0.8 and Cassandra version 0.6.
featuresThere are a number of reasons to choose Cassandra for your website. Compared to other databases, three big features stand out:
Some other features that help put Cassandra above the competition :
You need a Unix system. If you are using Mac OS 10.5, all you need is Git. Otherwise, you need to install Java 1.6, Git 1.6, Ruby, and Rubygems in some reasonable way.
Start a terminal and run:
sudo gem install cassandraIf you are using Mac OS, you need to export the following environment variables:
export JAVA_HOME="/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home" export PATH="/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home/bin:$PATH"Now you can build and start a test server with cassandra_helper:
cassandra_helper cassandraIt runs!
live demoThe above script boots the server with a schema that we can interact with. Open another terminal window and start irb, the Ruby shell:
irbIn the irb prompt, require the library:
require 'rubygems' require 'cassandra' include SimpleUUIDNow instantiate a client object:
twitter = Cassandra.new('Twitter')Let's insert a few things:
user = {'screen_name' => 'buttonscat'} twitter.insert(:Users, '5', user) tweet1 = {'text' => 'Nom nom nom nom nom.', 'user_id' => '5'} twitter.insert(:Statuses, '1', tweet1) tweet2 = {'text' => '@evan Zzzz....', 'user_id' => '5', 'reply_to_id' => '8'} twitter.insert(:Statuses, '2', tweet2)Notice that the two status records do not have all the same columns. Let's go ahead and connect them to our user record:
twitter.insert(:UserRelationships, '5', {'user_timeline' => {UUID.new => '1'}}) twitter.insert(:UserRelationships, '5', {'user_timeline' => {UUID.new => '2'}})The UUID.new call creates a collation key based on the current time; our tweet ids are stored in the values.
Now we can query our user's tweets:
timeline = twitter.get(:UserRelationships, '5', 'user_timeline', :reversed => true) timeline.map { |time, id| twitter.get(:Statuses, id, 'text') } # => ["@evan Zzzz....", "Nom nom nom nom nom."]Two tweet bodies, returned in recency order—not bad at all. In a similar fashion, each time a user tweets, we could loop through their followers and insert the status key into their follower's home_timeline relationship, for handling general status delivery.
the data modelCassandra is best thought of as a 4 or 5 dimensional hash. The usual way to refer to a piece of data is as follows: a keyspace, a column family, a key, an optional super column, and a column. At the end of that chain lies a single, lonely value.
Let's break down what these layers mean.
Keyspace (also confusingly called "table"): the outer-most level of organization. This is usually the name of the application. For example, 'Twitter' and 'Wordpress' are both good keyspaces. Keyspaces must be defined at startup in the storage-conf.xml file.
Column family: a slice of data corresponding to a particular key. Each column family is stored in a separate file on disk, so it can be useful to put frequently accessed data in one column family, and rarely accessed data in another. Some good column family names might be :Posts, :Users and :UserAudits. Column families must be defined at startup.
Key: the permanent name of the record. You can query over ranges of keys in a column family, like :start => '10050', :finish => '10070'—this is the only index Cassandra provides for free. Keys are defined on the fly.
After the column family level, the organization can diverge—this is a feature unique to Cassandra. You can choose either:
A column: this is a tuple with a name and a value. Good columns might be 'screen_name' => 'lisa4718' or 'Google' => 'http://google.com'.
It is common to not specify a particular column name when requesting a key; the response will then be an ordered hash of all columns. For example, querying for (:Users, '174927') might return:
{'name' => 'Lisa Jones', 'gender' => 'f', 'screen_name' => 'lisa4718'}In this case, name, gender, and screen_name are all column names. Columns are defined on the fly, and different records can have different sets of column names, even in the same keyspace and column family. This lets you use the column name itself as either structure or data. Columns can be stored in recency order, or alphabetical by name, and all columns keep a timestamp.
A super column: this is a named list. It contains standard columns, stored in recency order.
Say Lisa Jones has bookmarks in several categories. Querying (:UserBookmarks, '174927') might return:
{'work' => { 'Google' => 'http://google.com', 'IBM' => 'http://ibm.com'}, 'todo': {...}, 'cooking': {...}}Here, work, todo, and cooking are all super column names. They are defined on the fly, and there can be any number of them per row. :UserBookmarks is the name of the super column family. Super columns are stored in alphabetical order, with their sub columns physically adjacent on the disk.
Super columns and standard columns cannot be mixed at the same (4th) level of dimensionality. You must define at startup which column families contain standard columns, and which contain super columns with standard columns inside them.
Super columns are a great way to store one-to-many indexes to other records: make the sub column names TimeUUIDs (or whatever you'd like to use to sort the index), and have the values be the foreign key. We saw an example of this strategy in the demo, above.
If this is confusing, don't worry. We'll now look at two example schemas in depth.
twitter schemaHere is the schema definition we used for the demo, above. It is based on Eric Florenzano's Twissandra:
<Keyspace Name="Twitter"> <ColumnFamily CompareWith="UTF8Type" Name="Statuses" /> <ColumnFamily CompareWith="UTF8Type" Name="StatusAudits" /> <ColumnFamily CompareWith="UTF8Type" Name="StatusRelationships" CompareSubcolumnsWith="TimeUUIDType" ColumnType="Super" /> <ColumnFamily CompareWith="UTF8Type" Name="Users" /> <ColumnFamily CompareWith="UTF8Type" Name="UserRelationships" CompareSubcolumnsWith="TimeUUIDType" ColumnType="Super" /> </Keyspace>What could be in StatusRelationships? Maybe a list of users who favorited the tweet? Having a super column family for both record types lets us index each direction of whatever many-to-many relationships we come up with.
Here's how the data is organized:
Cassandra lets you distribute the keys across the cluster either randomly, or in order, via the Partitioner option in the storage-conf.xml file.
For the Twitter application, if we were using the order-preserving partitioner, all recent statuses would be stored on the same node. This would cause hotspots. Instead, we should use the random partitioner.
Alternatively, we could preface the status keys with the user key, which has less temporal locality. If we used user_id:status_id as the status key, we could do range queries on the user fragment to get tweets-by-user, avoiding the need for a user_timeline super column.
multi-blog schemaHere's a another schema, suggested to me by Jonathan Ellis, the primary Cassandra maintainer. It's for a multi-tenancy blog platform:
<Keyspace Name="Multiblog"> <ColumnFamily CompareWith="TimeUUIDType" Name="Blogs" /> <ColumnFamily CompareWith="TimeUUIDType" Name="Comments"/> </Keyspace>Imagine we have a blog named 'The Cutest Kittens'. We will insert a row when the first post is made as follows:
require 'rubygems' require 'cassandra' include SimpleUUID multiblog = Cassandra.new('Multiblog') multiblog.insert(:Blogs, 'The Cutest Kittens', { UUID.new => '{"title":"Say Hello to Buttons Cat","body":"Buttons is a cute cat."}' })UUID.new generates a unique, sortable column name, and the JSON hash contains the post details. Let's insert another:
multiblog.insert(:Blogs, 'The Cutest Kittens', { UUID.new => '{"title":"Introducing Commie Cat","body":"Commie is also a cute cat"}' })Now we can find the latest post with the following query:
post = multiblog.get(:Blogs, 'The Cutest Kittens', :reversed => true).to_a.firstOn our website, we can build links based on the readable representation of the UUID:
guid = post.first.to_guid # => "b06e80b0-8c61-11de-8287-c1fa647fd821"If the user clicks this string in a permalink, our app can find the post directly via:
multiblog.get(:Blogs, 'The Cutest Kittens', :start => UUID.new(guid), :count => 1)For comments, we'll use the post UUID as the outermost key:
multiblog.insert(:Comments, guid, {UUID.new => 'I like this cat. - Evan'}) multiblog.insert(:Comments, guid, {UUID.new => 'I am cuter. - Buttons'})Now we can get all comments (oldest first) for a post by calling:
multiblog.get(:Comments, guid)We could paginate them by passing :start with a UUID. See this presentation to learn more about token-based pagination.
We have sidestepped two problems with this data model: we don't have to maintain separate indexes for any lookups, and the posts and comments are stored in separate files, where they don't cause as much write contention. Note that we didn't need to use any super columns, either.
storage layout and api comparisonThe storage strategy for Cassandra's standard model is the same as BigTable's. Here's a comparison chart:
| server | database | table* | primary key | column value | ||
| cluster | table | column family | key | column name | column value | |
| cluster | keyspace | column family | key | column name | column value | |
| cluster | keyspace | column family | key | super column name | column name | column value |
* With fixed column names.
Column families are stored in column-major order, which is why people call BigTable a column-oriented database. This is not the same as a column-oriented OLAP database like Sybase IQ—it depends on whether your data model considers keys to span column families or not.
In row-orientation, the column names are the structure, and you think of the column families as containing keys. This is the convention in relational databases.
In column-orientation, the column names are the data, and the column families are the structure. You think of the key as containing the column family, which is the convention in BigTable. (In Cassandra, super columns are also stored in column-major order—all the sub columns are together.)
In Cassandra's Ruby API, parameters are expressed in storage order, for clarity:
| SELECT `column` FROM `database`.`table` WHERE `id` = key; |
| table.get(key, "column_family:column") |
| keyspace.get("column_family", key, "column") |
| keyspace.get("column_family", key, "super_column", "column") |
Note that Cassandra's internal Thrift interface mimics BigTable in some ways, but this is being changed.
going to productionCassandra is an alpha product and could, theoretically, lose your data. In particular, if you change the schema specified in the storage-conf.xml file, you must follow these instructions carefully, or corruption will occur (this is going to be fixed). Also, the on-disk storage format is subject to change, making upgrading a bit difficult.
The biggest deployment is at Facebook, where hundreds of terabytes of token indexes are kept in about a hundred Cassandra nodes. However, their use case allows the data to be rebuilt if something goes wrong. Currently there are no known deployments of non-transient data. Proceed carefully, keep a backup in an unrelated storage engine...and submit patches if things go wrong.
That aside, here is a guide for deploying a production cluster:
Hardware: get a handful of commodity Linux servers. 16GB memory is good; Cassandra likes a big filesystem buffer. You don't need RAID. If you put the commitlog file and the data files on separate physical disks, things will go faster. Don't use EC2 or friends without being aware that the virtualized I/O can be slow, especially on the small instances.
Configuration: in the storage-conf.xml schema file, set the replication factor to 3. List the IP address of one of the nodes as the seed. Set the listen address to the empty string, so the hosts will resolve their own IPs. Now, adjust the contents of cassandra.in.sh for your various paths and JVM options—for a 16GB node, set the JVM heap to 4GB.
Deployment: build a package of Cassandra itself and your configuration files, and deliver it to all your servers (I use Capistrano for this). Start the servers by setting CASSANDRA_INCLUDE in the environment to point to your cassandra.in.sh file, and run bin/cassandra. At this point, you should see join notices in the Cassandra logs:
Cassandra starting up... Node 10.224.17.13:7001 has now joined. Node 10.224.17.14:7001 has now joined.Congratulations! You have a cluster. Don't forget to turn off debug logging in the log4j.properties file.
Visibility: you can get a little more information about your cluster via the tool bin/nodeprobe, included:
$ bin/nodeprobe --host 10.224.17.13 ring Token(124007023942663924846758258675932114665) 3 10.224.17.13 |<--| Token(106858063638814585506848525974047690568) 3 10.224.17.19 | ^ Token(141130545721235451315477340120224986045) 3 10.224.17.14 |-->|Cassandra also exposes various statistics over JMX.
Note that your client machines (not servers!) must have accurate clocks for Cassandra to resolve write conflicts properly. Use NTP.
conclusionThere is a misperception that if someone advocates a non-relational database, they either don't understand SQL optimization, or they are generally a hater. This is not the case.
It is reasonable to seek a new tool for a new problem, and database problems have changed with the rise of web-scale distributed systems. This does not mean that SQL as a general-purpose runtime and reporting tool is going away. However, at web-scale, it is more flexible to separate the concerns. Runtime object lookups can be handled by a low-latency, strict, self-managed system like Cassandra. Asynchronous analytics and reporting can be handled by a high-latency, flexible, un-managed system like Hadoop. And in neither case does SQL lend itself to sharding.
I think that Cassandra is the most promising current implementation of a runtime distributed database, but much work remains to be done. We're beginning to use Cassandra at Twitter, and here's what I would like to happen real-soon-now:
Go ahead and jump on any of those projects—it's a chance to get in on the ground floor.
Cassandra has excellent performance. There some benchmark results for version 0.5 at the end of the Yahoo performance study.
further resourcesLa secuenciación del genoma de Monosiga brevicollis, eucariota unicelular que no forma colonias, muestra que contiene genes para la adhesión y comunicación celular.
|
|
|
La vida sobre la Tierra comenzó hace miles de millones de años. Algunos autores sostienen que incluso pudo surgir hace 4000 millones de años más o menos. Es decir, al poco de haberse formado el planeta. Si esto es cierto durante 3500 millones de años sólo hubo vida unicelular. La vida pluricelular: los artrópodos, los peces, los dinosaurios, nosotros… ocupan una franja temporal de sólo 500 millones de años. Los científicos que estudian la evolución, incluso los que sostienen que ésta se da sólo de modo progresivo y no a saltos, admiten que el paso de la vida unicelular a la pluricelular supuso un salto evolutivo. Para que haya organismos multicelulares deben de darse al menos dos cosas: un sistema que permita a las células unirse unas a otras y un sistema que permite a las células comunicarse con las vecinas. Ambos permiten al sistema en su conjunto organizarse en un organismo pluricelular.
No podemos retroceder en el tiempo para ver qué sucedió, pero todavía ahora, sobre este mundo, hay un rompecabezas hermoso que estudiar. Los organismos que lo pueblan llevan genes que se originaron en distintos momentos de la historia biológica. Algunos de estos organismos incluso han pervivido hasta nuestros días casi sin sufrir alteraciones desde los tiempos más remotos. La comparación de los genomas entre sí nos permite, si somos inteligentes, inferir los cambiaos evolutivos que acontecieron hace cientos de millones de años.
Ahora Nicole King, Daniel Rokhsar y sus colaboradores de la Universidad de Berkeley han secuenciado el genoma de un coanoflagelado denominado Monosiga brevicollis y lo han comparado con los genomas que conocemos de animales pluricelulares o metazoos.
Monosiga brevicollis es un microorganismo unicelular eucariota que no forma colonias y que vive formando parte del plancton marino, alimentándose de bacterias. El krill se alimenta en parte de él y a su vez el krill sirve de alimento a algunas especies de ballenas. Aparte de esto no se conocía mucho más de este microorganismo.
Los animales pluricelulares y los coanoflagelado comparten un ancestro común de hace 600 millones de años y puede que su estudio permita que aprendamos más sobre la historia de la vida sobre la Tierra y en concreto entender mejor el origen y evolución de los animales.
El análisis de su genoma ha proporcionado algunas sorpresas. Contiene muchos genes que en animales producen las proteínas esenciales en la comunicación intercelular y los necesarios para mantener físicamente unidas unas células con otras. Pero recordemos que estos microorganismos no forman colonias por lo tanto la función de estas proteínas en estos seres es un misterio.
En los animales pluricelulares unas proteínas denominadas cadeinas evolucionaron para unir unas células a otras, actuando como si fueran un pegamento que impidiera la disgregación del conjunto. A pesar de que Monosiga brevicollis no muestra signos de formar colonias, contiene 23 proteínas de este tipo, el mismo número que en la mosca de la fruta o que en el ratón.
Algunas de estas proteínas las han localizado cerca de la base del microorganismo, región que utiliza para sujetarse a las superficies, y alrededor de la región tentacular que utiliza para atrapar las bacterias que luego “ingiere”.
Quizás el antepasado común a estos seres y los animales (incluyéndonos a nosotros) usó estas proteínas de la misma manera para capturar presas y fijarse a las superficies, y luego los metazoos las adoptaron en una nueva función para unir unas células a otras.
Según los autores los conoflagelados son como una ventana abierta al pasado, al origen de animales y por tanto de los humanos, siendo el mejor camino para estudiar el ancestro común que no ha dejado huellas en el registro fósil.
Los conoflagelados tienen un tamaño de unas 10 micras, forma de ovoide, están dotados de un flagelo para la propulsión y un collar de tentáculos para capturar presas. Se parecen hasta cierto punto a las células que componen las esponjas marinas, que están entre los animales más antiguos conocidos. Hace 165 años se propuso a este organismo como el antepasado de todos animales pluricelulares.
Aunque del mismo tamaño que las levaduras eran mucho peor conocidos a nivel genético que éstas y por eso se propuso la secuenciación de su genoma. ?ste consta de unos 9200 genes, siendo del mismo tamaño que el de las diatomeas o los hongos, pero mucho menor que el de los metazoos. Como curiosidad el genoma contiene tantos intrones (regiones no codificantes de proteínas y algunas veces llamado “ADN basura”) en sus genes como los humanos tenemos en los nuestros, frecuentemente en las mismas localizaciones. Estos intrones deben de ser “eliminados” antes de que sus genes correspondientes sirvan como planos para la producción de proteínas y se han asociado con organismos complejos.
Este genoma, al igual que otros genes secuenciados recientemente y correspondientes a organismos supuestamente simples, muestra un grado de complejidad sorprendentemente alto. Así por ejemplo, muchos genes relacionados con el sistema nervioso han sido encontrados en organismos que carecen del mismo.
Los conoflagelados tienen cinco dominios de inmunoglobulinas a pesar de que no tienen sistema inmunitario, dominios de colágeno, integrina y cadeina a pesar que no tienen esqueleto o una matriz que mantenga a las células juntas, contiene proteínas tirosina quinasas que son clave en la comunicación celular aunque estos microorganismos no se comuniquen entre sí ni formen colonias.
Los investigadores pueden imaginar al ancestro común formado por células que se podían unir unas a otras y comunicarse entre sí. Aunque no saben qué genes estaban en ese ancestro común y qué genes son nuevos. Conoflagelados y humanos (y sus antepasados) han estado evolucionando durante el mismo tiempo y los primeros pueden haber adquirido genes nuevos durante este tiempo (los segundos obviamente sí). La comparación con otros genomas de conoflagelados que sí forman colonias y con los de otros seres puede aportar más luz sobre el problema.
Es de suponer que tengamos más sorpresas en el futuro.
Quizás responder a la típica pregunta sobre qué es el hombre sea tan fácil como decir que el ser humano es simplemente un conoflagelado un poco más evolucionado que los demás, pero no mucho más.
Fuentes y referencias:
Nota de prensa en la Universidad de Berkeley.
Resumen en Science.
La secuenciación del genoma de Monosiga brevicollis, eucariota unicelular que no forma colonias, muestra que contiene genes para la adhesión y comunicación celular.
|
|
|
La vida sobre la Tierra comenzó hace miles de millones de años. Algunos autores sostienen que incluso pudo surgir hace 4000 millones de años más o menos. Es decir, al poco de haberse formado el planeta. Si esto es cierto durante 3500 millones de años sólo hubo vida unicelular. La vida pluricelular: los artrópodos, los peces, los dinosaurios, nosotros… ocupan una franja temporal de sólo 500 millones de años. Los científicos que estudian la evolución, incluso los que sostienen que ésta se da sólo de modo progresivo y no a saltos, admiten que el paso de la vida unicelular a la pluricelular supuso un salto evolutivo. Para que haya organismos multicelulares deben de darse al menos dos cosas: un sistema que permita a las células unirse unas a otras y un sistema que permite a las células comunicarse con las vecinas. Ambos permiten al sistema en su conjunto organizarse en un organismo pluricelular.
No podemos retroceder en el tiempo para ver qué sucedió, pero todavía ahora, sobre este mundo, hay un rompecabezas hermoso que estudiar. Los organismos que lo pueblan llevan genes que se originaron en distintos momentos de la historia biológica. Algunos de estos organismos incluso han pervivido hasta nuestros días casi sin sufrir alteraciones desde los tiempos más remotos. La comparación de los genomas entre sí nos permite, si somos inteligentes, inferir los cambiaos evolutivos que acontecieron hace cientos de millones de años.
Ahora Nicole King, Daniel Rokhsar y sus colaboradores de la Universidad de Berkeley han secuenciado el genoma de un coanoflagelado denominado Monosiga brevicollis y lo han comparado con los genomas que conocemos de animales pluricelulares o metazoos.
Monosiga brevicollis es un microorganismo unicelular eucariota que no forma colonias y que vive formando parte del plancton marino, alimentándose de bacterias. El krill se alimenta en parte de él y a su vez el krill sirve de alimento a algunas especies de ballenas. Aparte de esto no se conocía mucho más de este microorganismo.
Los animales pluricelulares y los coanoflagelado comparten un ancestro común de hace 600 millones de años y puede que su estudio permita que aprendamos más sobre la historia de la vida sobre la Tierra y en concreto entender mejor el origen y evolución de los animales.
El análisis de su genoma ha proporcionado algunas sorpresas. Contiene muchos genes que en animales producen las proteínas esenciales en la comunicación intercelular y los necesarios para mantener físicamente unidas unas células con otras. Pero recordemos que estos microorganismos no forman colonias por lo tanto la función de estas proteínas en estos seres es un misterio.
En los animales pluricelulares unas proteínas denominadas cadeinas evolucionaron para unir unas células a otras, actuando como si fueran un pegamento que impidiera la disgregación del conjunto. A pesar de que Monosiga brevicollis no muestra signos de formar colonias, contiene 23 proteínas de este tipo, el mismo número que en la mosca de la fruta o que en el ratón.
Algunas de estas proteínas las han localizado cerca de la base del microorganismo, región que utiliza para sujetarse a las superficies, y alrededor de la región tentacular que utiliza para atrapar las bacterias que luego “ingiere”.
Quizás el antepasado común a estos seres y los animales (incluyéndonos a nosotros) usó estas proteínas de la misma manera para capturar presas y fijarse a las superficies, y luego los metazoos las adoptaron en una nueva función para unir unas células a otras.
Según los autores los conoflagelados son como una ventana abierta al pasado, al origen de animales y por tanto de los humanos, siendo el mejor camino para estudiar el ancestro común que no ha dejado huellas en el registro fósil.
Los conoflagelados tienen un tamaño de unas 10 micras, forma de ovoide, están dotados de un flagelo para la propulsión y un collar de tentáculos para capturar presas. Se parecen hasta cierto punto a las células que componen las esponjas marinas, que están entre los animales más antiguos conocidos. Hace 165 años se propuso a este organismo como el antepasado de todos animales pluricelulares.
Aunque del mismo tamaño que las levaduras eran mucho peor conocidos a nivel genético que éstas y por eso se propuso la secuenciación de su genoma. ?ste consta de unos 9200 genes, siendo del mismo tamaño que el de las diatomeas o los hongos, pero mucho menor que el de los metazoos. Como curiosidad el genoma contiene tantos intrones (regiones no codificantes de proteínas y algunas veces llamado “ADN basura”) en sus genes como los humanos tenemos en los nuestros, frecuentemente en las mismas localizaciones. Estos intrones deben de ser “eliminados” antes de que sus genes correspondientes sirvan como planos para la producción de proteínas y se han asociado con organismos complejos.
Este genoma, al igual que otros genes secuenciados recientemente y correspondientes a organismos supuestamente simples, muestra un grado de complejidad sorprendentemente alto. Así por ejemplo, muchos genes relacionados con el sistema nervioso han sido encontrados en organismos que carecen del mismo.
Los conoflagelados tienen cinco dominios de inmunoglobulinas a pesar de que no tienen sistema inmunitario, dominios de colágeno, integrina y cadeina a pesar que no tienen esqueleto o una matriz que mantenga a las células juntas, contiene proteínas tirosina quinasas que son clave en la comunicación celular aunque estos microorganismos no se comuniquen entre sí ni formen colonias.
Los investigadores pueden imaginar al ancestro común formado por células que se podían unir unas a otras y comunicarse entre sí. Aunque no saben qué genes estaban en ese ancestro común y qué genes son nuevos. Conoflagelados y humanos (y sus antepasados) han estado evolucionando durante el mismo tiempo y los primeros pueden haber adquirido genes nuevos durante este tiempo (los segundos obviamente sí). La comparación con otros genomas de conoflagelados que sí forman colonias y con los de otros seres puede aportar más luz sobre el problema.
Es de suponer que tengamos más sorpresas en el futuro.
Quizás responder a la típica pregunta sobre qué es el hombre sea tan fácil como decir que el ser humano es simplemente un conoflagelado un poco más evolucionado que los demás, pero no mucho más.
Fuentes y referencias:
Nota de prensa en la Universidad de Berkeley.
Resumen en Science.
Disfruta de los fantásticos documentales sobre historia online y gratis que tenemos preparados en nuestro nuevo Canal Historia. Un canal que abre una nueva ventana rigurosa, atractiva y entretenida a nuestra Historia más reciente. Los hechos de mayor relevancia acontencidos y sus protagonistas tienen un espacio destacado en nuestra nueva parrila repleta de estrenos gratis.
Un canal temático donde aprender sobre los grandes invetores de la humanidad, las guerras destacadas a lo largo de la historia, artistas, músicos o lugares emblemáticos.

Vive la historia con nosotros y disfruta de los mejores documentales online y gratis.
basehttp://blog.adnstream.tv/feed/