tench muyouniden bearcat manualcardinal principle of homeowner personal loanscanine acl surgerytench muyouniden bearcat manualcardinal principle of homeowner personal loanscanine acl surgerytian an men square massacrechiefland newspaperbrazil ecotourbreast bud for girls pubertyfamily truckstermatt shirvington bulgejilliangracesilicone rubber awareness braceletvedic jewleryjustin timberlake bulgewrinkle smoothing serummsr xgk exzafarahighrises in las vegaszack wardenstanadyne injection pumptorvill and dean boleroexecutive outplacement cranberry township pamini snauzeranaerobic glove boxdarien ga intercoastal homesiteslittle leage world seriesfaye wong mp3tori no uta mp3lladro nursesalacia oblongabourget low blowflorida tangerinesgravely stump grinderstellersoutplacement consultant cleveland ohfrottage techniquefrottage orgasmcessna 310 picturesheber porcelainbulma and vegeta kissingatemreduktionantione lavoisierlevel f sadlier-oxford vocabulary workshop answersmgp6.comdurood shareefamsterdam vienna bucharest tickets flights travel airfaressuurikuplacroatia teflneebish islandphaser 6250dpphaser 8400dpcystic adenomatoid malformationvictoria secertssell trendwestyoko kanno inner universedownload libby hoelerjodie penfoldball pumperscolormax lensesglyconutrients and blood pressuresolar dehydratorshakespeare marlowe controversyhypotheque montrealmaeista pr0xyyulia nova russianskytel pagingcentrifugal mag drive pumpsshimmy shimmy hellogoodbyeleticia loyayiffy horsetypes of spider websgigi dagostino mp3withim temptationconsumtion junktionrembrandt van rijn self portraitinsane clown posse hatchetmanmorrowwind walkthroughinflatable snowglobediversified builders bemidjicindy breakspeargresham urgent carepsilocybe semilanceatagaltech semiconductor stock quote londongynecologist speculum examfemale russian contortionistsbali webquestamin nazemzadehgrex p635eton beamersnow lepordorianne collinscivil war weponscarbide tool resharpeningearlwood real estateforeplay breast rubatkingdom passwordgwen stefanie nakedwwfcnuff seddbernhart furnitureemilia fanjul pfeiflerwater caltropmechanical broadheadsbrandiloveprosthodontic societyhomestarrunner.comselling a home in ahwatukeecarly simon nudehayden pannetiereyaesu vx 1rwh autopilotsmuller advertyaesu ft817vietcong tunnelsdem franchise boyz white teeofficer krupkemachinable plasticmargarita jello shotsnikki ziering playmateautosleepervida guerromotorola subsidy code calculatormotorola talkabout t5820gaogaigar mp3temporary housing croftonfinal fantasy mithrastueve realtyannette otoole nude picsdeserts the falafel oasisdanielle delorenzobess passwordstgi joistfinal fanastystephenville lake front private communitystephenville lake front texas propertystephenville lakefront texas vacation homelinda evangelista nudemedieval jesterstrifocalsshana hyatt nudeurinalysis reagent stripslakefront properties in stephenville txcar leather protectantthird eye blind crystal ballersprint lg 5250anodize processcamp mastectomy brasabsesssomma air bedruki makinojpcarrenkotsulucy pinder sunday timesbanzhaf power indexbajar peliculas en formato mpgsoubrettesmega brushless motorjeremiah osboruger .22 hornetreyburn intermediate schoolmumbai auntiesride of the valkyries mp3cybermatetvfolsum prisonalcoholism belize treatmentmelanies uk swingersclematis roguchithundercraftfatlaneonlinesavanna biomeeri kitajimakiichiro toyodaboat junkyardsraymond waites dinnerwaregiant swallowtail butterflycaterpillar d6hshaved orientalsbuckshot treestandsspineshank smotheredprimitive rug hooking kitcataldo missionzoids leenabloodhound gang-foxtrot uniformkit patio haulerchamae roseinflatable joustsally gunnellglazing puttynunn hospitality group ltdloftstrand crutchesorganza ribbon necklacesspecial prices agritourism pratodownload motorola c350 device drivercomte de frontenacalexis bledel fakes nudebugling bull elkart herranz marcelinopeter ompirbernadett petersparachuterlowes kitchen remodeling pictures and pricesnorandalvezeauinsulated pexjeep stroker engineanekee picturesnappy punishmentproperty in terralzembo shrine circuslucky brand jeans dungareesmaya angelou timelinesaabs for salekerry mcfadden toplessmitch hedberg mp3elastration14971 consultant isonortherntoolsveronica verakovajccs ltdgenerac 4582gen gorderteen toplistsgolf course real estate calabash listingraquelsworlddime washburn guitarsjoggs user galleryspike harrowsherlock holmsasssstornado fuel saver kc-50-cal440lxvrlmsorshafrankie lymon wifesunset wooded homesitesgorden lightfootla mucurafhm beth ostroskynude beach goersbrevard nc properties riverfront for salepatricia javier nudemiracle ii moisturizing lotionla trochitapersian kittporcelain veneers hollywoodnoclothesallowedatec batting cagesmetacrawler horoscopemetacrawler horoscopeswooden quilt hangerwailea golf vistasvanishing retractable screen doorsoul calibur 2 takiakai pdp5016hhdi certification training orange county californiaeileen donanruss dalbey cash flow notesatlanta dissolution of marriagewhalen firepitmaaya sakamoto gravityslipknot members unmaskedstephenville investment propertystephenville lake front propertybundas maravilhosaschristina aguilar nudefree download truesynccarmelita montoya foxgangstas paridisecarmon electra nakedtisha venturinitransorbital lobotomydirk diggler galleryjoseph abboud beddinglakefront properties in alvord texaslakefront properties in stephenville texassleepyrealmwalvacbrunswick ga intercoastal homesitesattached earlobesscribe the crusaderoutplacement consultant akron ohoutrunner brushless motorscarole caplinant mcpartlinacorn lugnutmimi miyagi galleryrubin schronrammstein nebelmaglobealpaca ranchsmudvayne fucking determinedngoc lan mp3brady corbet shirtlesspropylene glycol antifreezecrate and barrel franchisehantaro nagaokaweimaraner purseutility trailorschuichi nagumoaqua aerobic shoesbojesse christopherreal estate tryon nc for saleroyal lepage foothillscrista nicole nudemotorola starpointlesbian orgiimbochmichelle pfeiffer as catwomanroyal antediluvian order of buffaloespiperinebeatrice mckinseymila kunassoundly spanked bottomabsolutely free motorola t900iranianmusiclatios pokemon rubysutherlandia frutescensgsm homagegsr engine swapshpinxcarrie southworthonsite training voip vonage voip adapter phone voipnaval technology.comed huckebyalternative menstral productsrainbow parrotfishidenity theft caseyoko naitofio dental bikinibluestone quarriesdean graziosi reviewdansko franlawn striping rollerhahara buffetsoapstone quarriespizelle makerexpobagno meetingfrere jaquesismael serrano mp3fretilty pills onlinedarien ga intercoastal homesitedermabrasion crystalsstacey haidukfripp island waterway real estatefripp island waterway south carolina homesitesfrisco temporary office spacealyssa alps gallerychicago gastric banding915 mhz rfidusa india chamber of commerce karun rishiigesturestiff nipsgunbeltsacth herbdarien intercoastal homesitesirving tooth whiteninggumdrop cakebarbara charline jordandisneyficationfrupacsexual spooningcuckold ankle braceletaparate auditivedw edge snarecillian murphy nudesusina bakery and cafeillinois gastric bandingmicro hole edmcorrector padfischerspooner mp3scorpio tattoo gallerythatch palapajunior high teens boner storylavinia milosovici nuderenee weingartneryardman mower partschiara mastalligsr evo club747 takeoffleland dog the bounty hunters sonportland maine instant orthodonticsburcitis2way pager activationamatuartoni overbyrearsetnozomi kurahashi bbsbleach asterisksamus pornhand grip exerciseruss callaghan ddg 994motorola surfboard sb4200dita liebelypolycystic ovarysbigwin innremicade lawsuitambyr teenerspenta prismdygta mp3welch dry vacuum pumpchatnow communicatortesticles squeezed kickedseiken densetsu 3 rom downloadcdgirls moviesbiggie smalls big poppatoonami sexshofars standsinverter kensington portable powerbarnardsville nc lakeview propertybarnardsville nc lakeview property for salelara croft wearing no bikinibeth ostrovskybilly grahmbrigitte nielsonpainting pictures herranz marcelinokate loprestmulatto boys erectionssupermagnetbohemien rhapsodypeoplepc complaintsdonkey lawn ornamentconveyor lube injectorallysa dollpugsley addamsmarmoset for saleramsesiijaime pressly in poison ivywarcraft 3 1.18 no cdmother maybelle carterjostens graduation supplyrocky horror picture show sweet transvestitelamellar armourlam ching-yingcauses of the taiping rebelliondressage arena lettersebac commercial dehumidifierscarmen elctra nudeannelise hesmepom pom zombiessculptress brabrussel griffons for saleememaschenectady gazette.comstephenville lakefront private communityunderneath the mango tree40inchrush red barchettajaoquin phoenixgarrotte36ddd gallerydecoder cv settingspostpress proofblake bosticanime fairysbaan yamuun-pimp my ridebound and diaperedcroopxact xs075holzschaukelpferd versandyumi hentairachel mclish gallerymirc 6.16 war38d breastsbutterfly webquestbrevard nc mountain homesites for salecopper kitchen backsplashel chubacabrasony cmd j70 manualsunset tx wooded homesitesdfwescapesfettes vettevengaboys mp3slippizaner stallionssenor ritas mexican cafedado trunkingsensallgbfarchivearlington porcelain veneerslisa pesciatabooedge voluson 730 prophoebe cates bikinilydia bersotkumpulan kruthom mcan footwearpassword manager software for macintochgoldsealeloping destinationsbertech la pompe de dosing chimiquethomas dygardbbq vertical smokersaskatchewan whitetail deer huntinghellogoodbye touchdown turnaroundpighinfantasia illiteratedodecahedron patternvodavi starplus stsolmec clothingolmec foodmitsubishi diamontelittle wonder hedge trimmereolake stobblehouse domaiolsin twinsdeep water properties eulonia georgiahumorous duet actingredware platesprk seacoastmc chris fetts vettephilippine newspaper sunstarcontinesntal airlines schedule continental airlines ticketsalgonquin indian tribethong vplkhd c710punxatawny philcolt bisleymlfseekerparaglide utahchloroform teennap videoeliza szonertdeflowered virgins storiesdale debonepetite sophisticate coupon codehgv trunkingtraci lords hardcore gallery tori welles hardcoregerrard packagingelisa cuthbert nudeproperties in terralinfested kerriganhistory of laura secordforecartnudist hall of shamezits comic archivejensen motor run capacitorlois smuckercellophane inventorjimmy nuetron pornbritt ekland nudemembers.videosz.com passwordpfa coatingnaked tweensrigid borescopesjilling for her1961 corvette restorationphallus impudicusamputator black metala copy of a blank venn diagramchineese symbolsmediteranian dietwtks orlandoaalya securacatdancerzcleveland metropark zoorideingmedusa floor lampwho invented the slinkymelanie brodeurcleco corporationjialing mopedkikyo nudetoyota mudguardsmelina kanakaredes lettermanparkside at ashburnphenclorsummer sanders slimedrichard nanesashford electronic spinnererin axtellfob sharonaphiladelphia chirowholesale fingertip towelbootytalk movieschisago lake mortgageseareypowerstar tankless hot water heaterdunwoody breast augmentationjennifer anistan nudeabnormally large clitorissatisfiers of alpha bluecontortion splitdegreaser engine spraybastinado womanratchet buckelsrhinoplasty journalscolorobbiameow mix commercialclittorispier headboardsmitzis dining loungehobie questtuggerah commercial realestategohan doujinshitencel jeansolongapo girlshemangioma lipludwig spaeth lilacmaxforce roach baitthe number 12 looks like you my sharonasteel whip cb antennatorri wilson playboyolivia hussey breastpreteur hypothequemx600oliver wendall holmessheree north nudevernon joynsoncommanche helicopterkubota b1550pigtailed laser diodevern gosdensash pulleytawny kitean nudebotox reston virginiatawnee stone unofficialrythm divine mp3ttokkyogolf course real estate in calabash listingdominick cicalekyoko schmidtheather lockyervox medicanorthrup auditoriumrefurbished varian equipmentsaran cling plusmastercraft ready to finish furnitureaston martin db5 for saledamon motorhomes for salevenepunctureveitnamesecasmir pulaskicolliodal silverumofiakeir wilmutgoverness caningjohns manville lawsuitpostpress proofingeurasian otterspre ejaculate fluidlafavredem franchise boyz i think they like mestephenville lake front texas lakefront propertyslip resistant bathtub matslilo and stich nudetruckbed linerdrew barrymoorejon bowermasterbinghamton lasik surgeonjonny appleseeduniden bearcat bc350a manualwesthampton vacation rentalcash loan yanktonalliance wakeboard magazineshiva bagherikaye wraggbartek wrona mp3titanium snowmobile racingclutchcitysister suductioncmaracingruffemarkus schenkenbergvaginaplastyharley rock rakespeedboat charter marylandspeedboats rental edgewatermindy vega wmvchrono trigger magus1952 transistor radiotekla ruchimark wahlberg penisrodney carrington audiosamsung amplified indoor hdtv antennaliberty xl2dreamteenneil sedaka mp3therma liftcase backhoe parts 580cspeedo swimmers backpacknfl rumors.comjoyce dewitt pantyhosei730 status lighta pittance of timecharisma carpendermucis lyricsweissport policetecsun bcl 2000samsung r225 melody composergabby roslinpainter marcelino herranzphotogenesishandfasting vowsmichael vick girlfriendairhostesscraig scott aberlepcmcai cardwastewater evaporatorsmichelle falsettaambassador minutemanbijan mortazavi mp3surah yasin mp3aprils foundation paradiseoxbow stirrupspioneer pdp 4345hdportsmouth migraine headacheportsmouth migraineadvanced nutrients piranhalateral recess stenosishalo dark tanning bronzerlesbian fivesomefuri kuri hentaifurby easter eggsedward scissorhands costumeaccompli 009 for salenichole richie nakedchichi gohanbanxxxnikolai lobachevskytrillian plugin sametimecisco icm reportingcoccozella ganeshasexy referee costumerotameter manufacturerfingering the vagina correctlyapple carmel martini recipesuruhanjaya pilihan raya malaysiasize 8 delicaguggenheim modern area rugsnovelty liquor flasksmanorahnightwish wanderlustenchanted fariessoapstone cookwarefripp island water way south carolina real estatenightforce nxscarter carburetor kitsexy deskmatespedal pumping revvingleapord geckodoppie penetrazionifrottage sexstun guns airsoft guns tasersskelatoriguanadonalyson hannigonderringer 4 barrelcorrelle dishesrephresh vaginal gelbarbed wire decalsfuel hemorageokapisencore heater tankless waterilana lesatricked out honda civicmamiko tayamahotdogs mckees rocks pafinishing a bat insulationspectacled porpoisehorseshoe flattopapple m7318ncis thememalette pedagogiquenike total magiamicrokinibeachncoalinklegitamate work from homelawn furniture webbingapplebys restaurantapplebys restaurantrenouvellement hypothequewinking smiley facemichihiro kurodanikon mc-35freebird mp3fisher 500clatin translaterreannamae.comtania katancarved tikismotorola model 120cfurrieexample of a pictograph chartcaryota gigasleuzemiadisturbed stricken mp3marina home for sale jekyll islandresnick twinscut stone retaining walls valencia paibc breast cancerian kinslerchevelle bass tabslexy santosgreek naturalist beachesimpacted caninesmichael bentinetrophy 2359overdeveloped titsspick span gallerywellmate tankechinaforcecns vasculitis foundationanthony toccooakley half wire xl sunglassesi say hella sweatshirtdynamark riding lawn mowerintracoastal homesite jekyll island ga401k rollover annuitysouth carolina secedes from the unionchromagen lensesjames bartley bureau of alien human affairsbw/wm interracial relationshipspsycho le cemu mp3teen cheval mirrorxuan locdirectv hr10 250 hd tivonepalese handicrafthouston chimney flashingairsoft guns tasers stun gunstarquinius priscusblank firing glockarctic lemmingjamey singletonlakefront property in alvordlakefront properties in alvordacrylic squeegeetewell vionebrookdale lenoxminiscusminiskirt mixed wrestlingunico the unicornbig melons.comblanco county appraisalmartin luther kingjrrunner zatopekstripperella xxxjollibee foods corporation mission and visionajijic jalisco mexicoxicon resistorlafayette cataract surgerylina sybiangovernor stufflebeamalleghany sparta nc land saleprc radiatorsbounty hunter discovery 3300 metal detectorpygmalion lesson planmoringa plantpoetic repercussioncrystal get lugia pokemongorey murder photosshimmy shimmy quarterturnbananas in pajamas songastroworld closinghydrodynastes gigasultralite brakesastro mapping relocation astrologymoosehide moccasinsdoa kasumi nudelisa apratifrank panabakermoonjumpscarborough migraine headachescarborough migrainekyra knightlyukranian catholic churchzafu zabutonnokia swotzain bhikha mp3mathew mcgrorynoma christmas lightsferno salesmakerkutless sheet musiczamia pumilapretear fanficssherlock holmes in the 22nd century fan fictionlita gets strippedwik sprayerbroken toilet flangedaydream believer mp3dihybrid cross punnett squaredigitech vocalist vrdiahrreapierre lorillard500 linebaughsabine ehrenfeld nudekosamui or info or yellow pages or thailandtullus hostiliushentaiquestzenith transoceanic 7000jeff balisnaples florida personal concierge servicesbaymount inngeorge thurogoodmcculloch eager beaverdeer jerkeymyceneanssharon moalemtiffany dillowsony pcga bp2nx laptop batteryart photos marcelino herranzmenard building supply cocellular passive repeaterinfantismbaldwin brass candlesticksthousand foot krutch mp3jenny finch nudethreadlike fungilogical falliciessimpsons large marge implantsancient aksumjla home beddingsteak and chesseinsane clown posse slim anusodette yustmaninnovis data solutionanaverde planned communityashlee simpson lip synctexasbeautiesmolly pitcher + biographybreaking substitution cipherspinich dipear wax removal peroxideoceanfront homesite st simons island gaboreal cordillerazuber et ciemohabbatein mp3rietschle vacuumvillandry castlefook mi costumeginny weasley nakedmegan caublemegaman x6 mp3dogshit.comkillingmesoftlyocns small business partnerchinese legalismkingscliff tafedroukiskirstie alley playboypetticoat disiplinedog flea and tick control zodiacsalomon 1080 gunklipsch rf35def leppard miss you in a heartbeatdrizunkthoroughbred racing syndicationmcculloch chipper shreddertiffin motorhome specscandida skin fungus picturenaoko moritabob seger mainstreetmy2way t900andy milinakisamericas army multihackdeep water homesite sea island georgiacandy code pokemon rare rubyadult yuna cosplaysneakboxsaban saulic mp3hodentritt285/70/17 tireshogtied and tapedcrazy train ozzy ozbournecaniglias venice innchore worksheets for teensshapeshift anthillbiography of florence griffith joynerphina oruchefrancesca kitten natividaddeduplication softwarenascar standupssherlock holmes otrfrank harberoslen twins nudeindependent distributor indianapolis herbalifeyuumibellevue facial plastic surgeryfree aim password stealerkemal malovcic mp3stephanie mcmahon revealedanimaniacs hentaiheadon headachewilliam orbit adagio for stringskeira knightley esquiretasco optima 2000anna nalick paper baganne arundel patioswilmer valderamamuscadine jelly recipetit maulinglakefront properties in terral tximpotencia ereccion calviciebehaviorism direct education in instructionsuperalexx fozyayoung rascals discographyinvention of the frisbeeseiko sna411anthons la mesanatural dog soft treatsmariana sea trenchimbel falmudbugshockeypual reverequeasy bake ovenautopsy layne staleyfree subsidy code v300honeycomb calcitekaraoke freemp-3aiden knife blood nightmarenilo train tableyomiko readman Tutoriales en Super Mag | Weblog de Armando Sosa
29 Mar 2006

Aplicación de 5 minutos con Cake

Cake es un entorno de desarrollo rápido para PHP basado en el modelo MVC (Si, como Rails) que es muy fácil de usar y muy potente para desarrollar aplicaciones con pocas lineas de código. A continuación te voy a enseñar como instalarlo y usar sus características de scaffolding para crear un sencillo y muy básico gestionador de bookmarks.

1. Instalando Cake
nota
Antes que nada, necesitas tener un entorno de desarrollo adecuado en tu maquina para correr PHP y MySQL. Existen paquetes completos, listos para instalar como Apache2triad y xampp para windows y Mamp para Mac. Si no sabes qué es todo ésto, igual es conveniente investigar algo antes de seguir leyendo.

Si ya tienes Apache y PHP, instalar Cake no tiene ninguna gracia, solo ve y descarga la última versión estable desde CakeForge y descomprime el archivo en una carpeta visible desde tu servidor web. Para este ejemplo vamos a llamar a esa carpeta cake.

2. Crea la tabla en tu base de datos

Usa la siguiente estructura para crear una tabla en tu base de datos:

CREATE TABLE bookmarks (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
url VARCHAR(255) NOT NULL,
created DATETIME,
modified DATETIME,
PRIMARY KEY (id) 
);
3. Configura la conexion a tu base de datos

Ahora ve al directorio app/config y busca un fichero llamado database.php.default y renómbralo a sólo database.php. Ábrelo para editarlo y cambia las los valores de host,login,password y databasepara que se ajusten a tu configuración. Despues guarda los cambios.

class DATABASE_CONFIG
{
    var $test    =  array('driver'    => 'mysql',
                         'connect'  => 'mysql_connect',
                         'host'     => 'localhost',
                         'login'    => 'user',
                         'password' => 'password',
                         'database' => 'project_name',
                         'prefix'    => '');

    var $test    =  array('driver'    => 'mysql',
                         'connect'  => 'mysql_connect',
                         'host'     => 'localhost',
                         'login'    => 'user',
                         'password' => 'password',
                         'database' => 'project_name-test',
                         'prefix'    => '');
}

Para la mayoría de las aplicaciones, esta parte será la unica vez que edites un archivo de configuración.

4. Crea un modelo

Dentro de la carpeta /app/models crea un nuevo fichero llamado bookmark.php. Copia y pega en ese archivo el código que está a continuación y guarda.

<?php
class Bookmark extends AppModel
{
	var $name = 'Bookmark';
}
?>
5. Crea un controlador

Dentro de la carpeta /app/controllers crea un nuevo fichero llamado bookmarks_controller.php. Copia y pega en ese archivo el código que está a continuación y guarda.

<?php
class BookmarksController extends AppController
{
	var $name = 'Bookmarks';
	var $scaffold;
}
?>
6. ¡Es todo!

Ahora dirige tu navegador a http://localhost/cake/bookmarks y mira como cake ha creado una miniaplicación 100% usable para tí.

index.gif

new_bookmark.gif

index_2.gif

Disclaimer: Este tutorial ha sido traducido y adaptado de éste otro por Graham Bird

03 Feb 2006

Tips de Diseño Web: Banderas de Fin de Sección

Como no tengo tiempo de escribir tutoriales en forma, he preparado esta serie de post cortitos con cosas que a mí me son muy útiles y que he ido usando religiosamente en cada nuevo proyecto en la misma forma en que mi vecina cambia de novio cada semana. Este es el segundo tip, nada de vida o muerte pero puede ser muy util para darle mantenimiento a grandes chorizos de código.

Pasa que uno diseña con lo mejor en mente pero siempre se debe estar preparado para lo peor. A mi me gusta mucho maquetar directamente en HTML y me preocupo por tener una estructura bien sólida de HTML tan válido y semántico como sea posible antes de poner una sola línea de CSS. Me gusta tener todas las etiquetas correctamente identadas para distinguir los elementos anidados y asegurarme de que nada se me escape. Además si en algun momento necesito añadir algun otro modulo, es más sencillo si el codigo está bonito y bien identado. Algo asi como este bebé:


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
  <head>
	  <title>Pretty Code - Qué código más bonito</title>
  </head>
  <body>
	  
    <h1>Que código tan chido</h1>
		<div id="afuera">
		  <h2>Lo de afuera no importa</h2>
		  <div class="adentro">
			  <h3>Lo que importa es lo de adentro</h3>
				<p class="uno">
				  Donec leo risus, tincidunt quis, pharetra sed, 
					eleifend et, libero. Morbi sollicitudin consectetuer nisl. 
					Duis dictum, turpis quis tincidunt laoreet, 
					nisi tortor convallis libero, vitae mollis libero nunc at pede.
				</p>	
				<p class="dos">	 
					Vestibulum augue lectus, sagittis id, congue in, consectetuer ac, dolor. 
					Integer sed lacus ut pede ullamcorper rutrum. 
					Sed tincidunt hendrerit ante. Nunc tempor blandit lacus. 
					Curabitur porttitor est auctor elit. Nulla libero ipsum,
				</p>
				<p class="tres">					 
					imperdiet et, mollis vitae, ornare ut, elit. 
					In hac habitasse platea dictumst. 
					Fusce eu nibh vitae turpis rhoncus porta. Nam ultricies. 
					Curabitur posuere gravida nulla. Curabitur sapien.
				</p>
		  </div>
		</div>
  </body>
</html>

Pero la triste realidad es que rara vez el código que escribes pasa tal cual a producción. Generalmente tienes que pasarlo por un CMS o un sistema de plantillas y/o generar las páginas dinamicamente. Luego ves el sitio en tu navegador y por fuera se ve igual que como lo habías diseñado pero cuando das “ver código fuente” te encuentras con que tu bebé código ha mutado en un deforme y amorfo monstruo de tags (el siguiente ejemplo es una dramatización):


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>	  <title>Pretty Code - Qué código más bonito</title>
  </head>
  <body>
	  
<h1>Que código tan chido</h1>		
<div id="afuera">
  <h2>Lo de afuera no importa</h2>		  
<div class="adentro">
  <h3>Lo que importa es lo de adentro</h3>
<p class="uno"> Donec leo risus, tincidunt quis, pharetra sed,  eleifend et, libero. Morbi sollicitudin consectetuer nisl. 	Duis dictum, turpis quis  ncidunt laoreet, nisi tortor convallis libero, vitae mollis libero nunc at pede.
</p>	
<p class="dos">	 
Vestibulum augue lectus, sagittis id, congue in, consectetuer ac, dolor. 
Integer sed lacus ut pede ullamcorper rutrum. Sed tincidunt hendrerit ante. Nunc tempor blandit lacus. Curabitur porttitor est auctor elit. Nulla libero ipsum,
</p>
<p class="tres">					 
imperdiet et, mollis vitae, ornare ut, elit. In hac habitasse platea dictumst. 
					Fusce eu nibh vitae turpis rhoncus porta. Nam ultricies. Curabitur posuere gravida nulla. Curabitur sapien.
		</p>
  </div>
</div>
  </body>
</html>

Diganme, ¿Pueden encontrarle sentido, forma o estructura a eso? ahora multipliquenlo por diez e imaginen que necesitan duplicar todo el <div id="afuera"> por alguna extraña ocurrencia de su cliente (no pongo ejemplos, ustredes saben).

Es relativamente fácil saber donde comienza cada sección y donde se está abriendo un nuevo elemento — sobre todo en un editor que coloree la sintaxis. ¿Pero el final?. ¿Cual de todos esos </divs> corresponde a <div id="afuera">?

La solución a la que yo llegué es la de usar unas banderas — o flags — dentro de un comentario al final de cada sección denotada por un id o class de la siguiente forma:


<div id="afuera">
  <div class="adentro">
  </div>< !-- /.adentro -->
</div>< !-- /#afuera -->

La diagonal o barra (/) significa que es el final de un elemento y uso el gato (#) y el punto (.) para significar si estamos cerrando un identificador o una clase, respectivamente.

Esto no soluciona el asunto de las identaciones deformes pero almenos me ha ayuda a escanear más rápido mi código y mover y modificar secciones enteras sin mayor problema. Como dije, esto no le va a salvar la vida a nadie, pero a mi me pareció util y quise compartirselos.

01 Feb 2006

Tips de Diseño Web: Resetear márgenes

Como no tengo tiempo de escribir tutoriales en forma, he preparado esta serie de post cortitos con cosas que a mi me son muy útiles y que he ido usando religiosamente en cada nuevo diseño tanto como Arjona usa rimas obvias en cada canción. Éste es el primer tip, sencillito pero básico.

Seguro que ya te ha pasado: terminas tu diseño en un navegador y al mirarlo en otro aparecen por todos lados espacios inexplicables o elementos encimados con valores salidos de quien sabe donde que rompen tu diseño y te ponen al borde del llanto. Sollozando, empiezas a moverle a los valores de margin y padding a cuanto elemento te parezca sospechoso hasta que todo se ve como debe de verse. Ahora regresas al primer navegador y ¡Oh sorpresa! Todo está inexplicablemente movido. Ahora si sueltate llorando.

Los valores por defecto de los navegadores son lo peor. Especialmente los margenes y los paddings se vuelven un problema porque cada navegador le pone a cada elemento el valor que se le ha pegado la gana. Afortunadamente, despues de mucho tiempo de diseñar con los ojos hinchados a causa del llanto por fin dí con una solución — no recuerdo como — y ahora la comparto con ustedes: Resetea todo a cero.


  *{
        margin:0;
        padding:0;
    }

Esa regla amigos mios, vale oro. Pónganla religiosamente al principio de todas sus hojas de estilo y se ahorraran muchos dolores de cabeza.

Despues solo habrá que añadir los valores necesarios segun se vayan necesitando:


  h1,h2,h3,h4,h5,p,ul,blockquote{
        margin-bottom:1em;
    }

07 Nov 2005

Inyección de vacío

Como prometí, aqui les traigo una de las cosas que aprendí/inventé durante el reciente rediseño de dospuntocero. No se si esta tecnica la inventé yo, pero se que no la copié asi que yo le pongo nombre. Les presento la Técnica de Inyección de Vacío.

Una de las metas del rediseño era tener la posibilidad de dar diferentes formatos a cada tipo de post. Creo que no es correcto que un post rapido y una reseña, un articulo de fondo y una noticia luzcan todo de la misma manera.

Ya que lo que necesitaba era flexibilidad, llegué a la conclusión de que la manera más correcta de obtenerla desde un punto de vista de diseño era utilizando una reticula y adaptar religiosamente el diseño a ella. Reconozco que mi decisión fue influenciada por éste, éste y especialmente éste articulo

Antes de escribir una sola línea de XHTML o CSS me senté a maquetar un diseño en photoshop e hice lo posible por no pensar mientras diseñaba como iba a hacer para convertir ese diseño en un sitio web funcional y enfocarme solamente en presentar la información de la mejor manera posible. Ésta es una pequeña parte de esa maqueta final:

dospuntocero_mockup.jpg

Cuando quedé 99% contento con el diseño que había planeado entonces una de muchas preguntas vino a mi mente: ¿Cómo rayos voy a hacer para que esas imágenes floten en su propia columna junto al texto?

La primera opción que consideré fue usar margenes negativos: mover la imágen un numero de pixeles a la izquierda igual a su ancho y luego subir el siguiente parrafo un numero de pixeles igual a la altura de la imagen. Algo así es lo que había usado en Disenamos

  

    

    div.cont{
      padding-left:120px;
    }
		
    img.side_img{
      margin-left:-110px;
      border:1px solid #ccc;
    }

    .clear_element{
       margin-top:-100px;
    }


       
    <div class="cont">
      <img src="imagen.gif" width="100" height="100" class="side_img" alt="imagen de ejemplo"/>
      <p class="clear_element">
         este parrafo debe tener un margen negativo igual a la imágen que se va a desplazar arriba
      </p>
    </div>
  

Sin embargo, esta no era una solución viable ya que había que establecer de antemano la altura de las imagenes — algo que yo no quería hacer — y usar clases como anclas de estilo tanto en la imágen como en el elemento siguiente. Asi que tuve que buscar otra solución.

La siguiente opción fue jugar con posicionamiento y gracias a algunos extraños convenientes comportamientos de position:relative y position:absolute pude lograr imagenes que flotaran en una columna paralela al texto, de una anchura fija sí — ajustadas a la retícula— pero de altura variable.

El markup necesario es algo asi:


  <div class="cont">
	  <h2>Encabezado</h2>
		<img src="imagen.jpg" alt="imagen de ejemplo" class="side_img"/>
		<p>
		  Praesent malesuada. Curabitur hendrerit aliquam libero. 
		  Duis ante risus, fringilla sed, convallis in, porttitor vitae, ipsum. 
		  Nulla facilisi. Nullam feugiat est vel ligula. 
		  Cras commodo libero et ligula. Nulla vestibulum ante ac dui. 
		  Pellentesque habitant morbi tristique senectus et 
		</p>
  </div>

El secreto está en posicionar relativamente (position:relative) el elemento que va a contener el texto y las imágenes ( en este caso es <div class="cont">) pero sin especificar ningun valor para top ni left, de esta manera el elemento queda intacto dentro del flujo normal de la página pero ahora será posible aplicar posición absoluta a sus descendientes.

vacio_esquema.gif

Para crear la columna donde flotarán las imágenes ( a esto se refiere el vacío del título, figúrese usted) especificamos un padding igual o mayor al tamaño predefinido de las imágenes (100px en el ejemplo).

El truco para que las imágenes floten es aplicarles, en la hoja de estilo correspondiente, position:absolute. Con esto, la imágen desaparece del flujo normal de la pagina y el resto de los elementos se recorren como si no existiera.

El posicionamiento absoluto se refiere a que es posible especificar las coordenadas de un elemento respecto al primer ancestro posicionado. Por eso posicionamos relativamente el elemento contenedor, para que poder colocar las imagenes con respecto a este, si no se encuentra ningun ancestro posicionado entonces los elementos se posicionan respecto al elemento body, esto es igual a la ventana del navegador. Especificados en pares, las reglas de css top, bottom,left yright señalan la posición deseada del elemento. Si no se especifica ningun valor para estas reglas, toman el valor por defecto auto, que es igual a la posición que tendría el elemento en el flujo normal del documento. Para colocarlo a la izquierda del contenedor sin afectar su posición vertical especificamos solo la regla left:0 (o puede ser left:5px, para simular un padding).

Puse un ejemplo de los pasos a seguir aquí: Tecnica de Inyección de Vacío

Esta técnica se puede usar no solamente para imagenes sino tambien para posicionar cualquier elemento de bloque con anchura definida y en cualquier posición con respecto al elemento padre ((yo la usé mucho en dospuntocero 2.0). Aca hay un par de ejemplos más: más Tecnica de Inyección de Vacío

Espero que les sea de utilidad.

25 Ago 2005

Haz una radio privada con GoogleTalk

Esto debe ser muy obvio para usuarios avanzados pero yo lo acabo de descubrir experimentando hace rato (a falta de micro, hay que ponerse creativos): Comparte lo que estás escuchando mediante Vo/IP.

  1. En WInXP Ve a Inicio > Todos los Programas > Accesorios > Entretenimiento > Control de Volumen ( ¡Uf! probablemente tengas un ícono de volumen en el sistem tray, dale doble click que es más rapido)
  2. En el cuadro de dialogo de Control de Volumen ve a opciones > propiedades y selecciona Ajustar propiedades de > Grabación. En Mostrar los controles de volumen siguientes: asegurate que esté seleccionado Mezcla Estéreo. Aceptar.
  3. Ahora de nuevo en el dialogo de Control de Volumen, activa la casilla seleccionar debajo del control y trépale al volumen.
  4. Abre tu reproductor de música predilecto y pon una rola muy cursi y romantica. (Un bolero de Luis Miguel debe funcionar)
  5. Busca a la chava(o) con la que quieres quedar bien entre tus contactos de GoogleTalk o Skype y dale al boton de llamar. Ella (o él) podrá escuchar todo lo que tu estés escuchando en tu computadora.
  6. Opcionalmente puedes acompañar con un mensaje instantaneo que diga algo como Que curioso, oí esta canción y pensé en tí
  7. Cuando te pregunten como lo hiciste, los mandas para acá.

Post no patrocinado por Google Talk.

10 Dic 2004

Vector Worn Look

Desde hace un rato por aqui y por allá se ha puesto muy de moda dotar a los diseños de un aspecto de viejo y desgastado que produce diseños cálidos y cargados de nostalgia, en oposición a la frialdad del minimalísmo y el look techie.

Hacer bitmaps desgastados es relativamente fácil de lograr en Photoshop si sigues los tutoriales de Wicked Worn Look pero ¿Qué si quieres hacer lo mismo o algo parecido con vectores?

Yo necesitaba hacer una playera para mi grupo, iba a estar impresa en serigrafía y quería que tuviera un aspecto de desgastado, como cuando la tinta se empieza a caer por el uso. Esta idea no es nueva, ya marcas como Furor y Diesel lo han hecho, pero verán, no con mi logotipo.

Como mi herramienta vectorial preferida es Corel Draw pues les plático como logré esto utilizando ademas Corel Trace:

paso12.gif

Para empezar necesitas abrir un logotipo bonito o una tipografía interesante, de preferencia de lineas gruesas y plastas abundantes.
paso1.gif

Para producir el pincel con el que desgastaremos el gráfico esta bien una pequeña foto, el chiste es que tenga mucho contraste y baja resolución. A mi me gustó esta de Seraph. Impórtala en tu documento.
paso2.gif

Ahora lo que vamos a hacer es vectorizar la imágen utilizando la utilidad Corel Trace para hacerlo, elige el comando Bitmaps->Trace Bitmap teniendo la pequeña imágen seleccionada.
paso3.gif

Ya en Trace seleccionamos la herrramienta Outline y trazamos la imágen con un 90 de Accuracy
paso4.gif

Este es el resultado en vista wireframe.
paso5.gif

Cierra Corel Trace y guarda los cambios. De regreso en corel tenemos ya la imágen vectorizada sobre la foto original. Seleccionalo y desagrupalo.
paso6.gif

Elimina algunos objetos, de preferencia los mas grandes. Aqui no hay reglas, solo sigue tu instinto asesino y quita objetos hasta que te sientas agusto.
paso7.gif

Ahora selecciona todos los objetos que te quedaron (aqui tenía 300 todavía) y abre el cuadro de dialogo Align and Distribute. En la pestaña distribute elige estos parametros:
paso8.gif

Ahora tenemos un conjunto aleatorio de objetos abstratos sin sentido. ¡Cool!
paso9.gif

Este paso es opcional, podrías simplemente agruparlo todo y cambiarle el color pero a mi me gusta tener la menor cantidad de objetos posibles. Asi que usando Weld, una de las herramientas booleanas de Corel Draw, convertimos todo en un solo objeto. Nota aclaratoria: Esto va a producir una curva muy compleja, si planeas exportar a otro formato vectorial es mejor agrupar.
paso10.gif

Entonces ya sea que soldes o que agrupes, ya tienes tu pincel solo hace falta cambiarle el color y ponerlo encima de tu logotipo o tipografía.
paso11.gif

Y asi es como queda. Ya de aquí puedes filmar tu positivo, quemar tu marco y empezar a hacer tus playeras a la moda.
paso12.gif

29 Sep 2004

Cómo hacer una buena página web

Continuamente veo páginas técnicamente mal diseñadas (ni siquiera las empresas gordas se salvan). Los culpables son webmasters que dicen saber HTML, pero que lo estudiaron hace años, cuando aún no existía CSS. Esto intenta ser un “manual de buen comportamiento” para los que colaboran con Internet escribiendo páginas web. Explicaré cómo hacer que una página se vea bien en todos los navegadores, usando HTML 4.01 Strict, que luego te permitirá pasar a lenguajes mejores, como XHTML, sin esfuerzo.

Daniel Clemente ha sacado una estupenda guía para aprender las bases de XHTML y CSS apegado a estándares: HTML correcto: Cómo hacer una buena página web

No lo he leído todo, pero a grandes rasgos puedo decir que hacía buena falta un recurso así y en español ahora que apenas comienza la evangelizacion hacia los estándares entre los hispanoparlantes.

Sólo que el diseño no me termina de gustar (eso de rodear cada parrafo con un borde y un efecto de hover me parece terrible idea). No es que esté mal pero luce muy developer-oriented una arregladita a la hoja de estílos y quedará más que listo para ser atráctivo para los diseñadores.

14 Sep 2004

Paletas de sabores

Una de las cosas mas dificiles de hacer cuando se comienza un proyecto nuevo es elegir la paleta de colores que utilizaremos. Recientemente me he topado con esta técnica para obtener una paleta a partir de una fotografía, y la he utilizado en algunos proyectos (que todavía son secretos, sorry) con resultados notablemente geniales.
Lo primero es elegir una fotografía, el tema puede ser lo de menos, lo importante son los colores. Busca en stock exchange o en las imágenes de google o donde quieras, a mi por ejemplo me gustó esta: Sunflower por Vertis (detalle) por que tiene una muy buena riqueza tonal.

Detalle de Sunflower (c) Vertis

Ahora puedes abrirla en tu editor de imágenes favorito y aplicarle un filtro de pixeleado. En photoshop yo lo hice así: Filter->Pixelate->Mosaic… y en el cuadro de dialogo elegí un valor de 68 para cell size. Tu puedes jugar con los valores hasta que tengas una serie de cuadros de colores sólidos. En mi caso el resultado fue éste:

Imagen Pixeleada

Entonces puedes usar la herramienta gotero, para copiar los colores con los que formarás tu paleta. A mi por lo general me gusta elegir dos colores oscuros, dos claros y dos acentos, para formar una paleta de seis colores aunque probablemente en el proyecto no los use todos ( a veces si, me gustan mucho los colores).

Paleta de seis colores

Recuerda que si quieres obtener los valores hexadecimales de los colores debes seleccionar web color sliders en el menú desplegable de la paleta colors

30 Ago 2004

Viste con estilo - 3era lección

Bienvenidos, sean todos ustedes a la tercera entrega de su tutorial favorito. Si estan por aquí por primera vez, tal vez quieran visitar la primera y segunda parte antes de continuar Pero si ya están listos, pues adelante, vamos a seguir confeccionando vestiditos.

viste con estilo (en 5 lecciones)

Tipos de buen gusto

Uno de los principales elementos que hacen que un diseño sea un buen diseño es la composición tipográfica. Igualmente una mala elección en este campo puede hacer que un diseño que pudo ser bueno se deslice inevitablemente en los terrenos de lo mediocre y amateur. En el diseño web estamos tipográficamente hablando, bastante limitados ya que tenemos a nuestra disposición una reducida selección de fuentes que la mayoría de lo susuarios tengan instaladas en su sistema. Y aunque por un lado esa es una desventaja, también es cierto que nos obliga a ser más creativos con las tipografías que están a nuestra disposición.

El cuerpo del delíto

Empezaremos con el cuerpo del post. Como dijimos en la lección pasada nuestro layout es semilíquido por lo cual, el texto de las entradas se ajusta al tamaño de ventana del navegador. Sin embargo esto puede presentar un problema para aquellas personas con un monitor grande ya que el texto se ajustaría a líneas de texto larguísimas muy dificiles para la lectura.
Dentro de las especificaciones de CSS existe una propiedad muy util para estos casos: max-width por medio de la cual es posible definir de antemano la anchura maxima que debe alcanzar un determinado elemento cuando el contenedor se ensanche.
Asi que si añadimos un selector para la clase .blogbody y le indicamos que no importa cuan enorme sea la anchura de su contenedor la suya no excedera la anchura de 50 letras “M” (max-width:50em;). ¿Fácil no?
La mala noticia es que Internet Explorer no soporta esta propiedad por lo que a los usuarios de este navegador que tengan monitores grandes le sera mas dificil la lectura. ¡Lástima! pero el resto de navegadores buenos desplegaran el contenido como se debe.
Para que el texto quede justificado usamos la propiedad text-align:justify; despues ajustamos un poco los margenes para separar cada post del siguiente (margin:30px 0 10em 0;) y listo!

Encabezados (como éste)

Ahora vamos a aplicarle algo de estílo a los títulos. En esta ocasión, para contrastar con el cuerpo del texto vamos a utilizar un tipografía serif para todos los títulos. Aplicamos, en nuestra hoja de estilo la siguiente regla


h2,h3,h4,h5{
font-family:georgia, "times new roman", serif;
color:#960;
}

Como ven, es posible aplicar una regla a varios selectores a la vez, esto para evitar redundancias en el código. En este caso queremos que todos los encabezados, excepto el h1 del que nos ocuparemos después, tengan la misma tipografía y color. Una vez establecidas las características generales podemos afinar cada uno de los detalles, por ejemplo para los títulos de cada post (h3) aplícaremos la siguiente regla.


h3{
font-size:250%;
letter-spacing:-.05em;
text-indent:10%;
width:100%;
border-bottom:1px solid #330;
}

¿Muchas cosas nuevas aqui verdad? Vamos a explicarlas una por una.
font-size:250%; significa que el tamaño de la fuente será 250% del tamaño definido en el body. Queremos encabezados grandes.

letter-spacing:-.05em; Aqui definimos el espaciado entre caracteres (lo que cualquier tipógrafo conoce como tracking ) y le definimos un valor negativo de -0.5em para que los caracteres se vean mas unidos entre si. Cuestión de gustos, a mi me agradan los títulos con un tracking reducido. Tal vez te estés preguntado que reyos significa ese em. Pues bien, los ems son unidades relativas y representa el ancho de una letra “M” en la fuente actual.

text-indent es el valor de identacion o sangría de un texto. En este caso le asignamos un valor relativo de 10% del ancho total de la linea. Definimos que la línea debe ser tan ancha como el bloque que lo contiene (width:100%; ) y debe presentar un borde inferior de 2 pixeles de espesor y que sea una línea continua (border-bottom:1px solid #330;)

Vean el resultado

Los enlaces
Ahora vamos a ver un concepto nuevo: Las pseudo-clases.
Las pseudo-clases son utilizadas para distinguir entre diferentes estados de un mismo elemento. Un mismo enlace presenta cuatro estados distintos:
  1. El enlace en su estado normal
  2. Cuando ya ha sido visitado
  3. Cuando el puntero del mouse le pasa por encima
  4. Cuando está activo
Cada uno de estos estados puede ser tratado de manera diferente en nuestra hoja de estilos por medio de las pseudo-clases que son a:link, a:visited, a:hover y a:active donde cada una corresponde respectivamente a uno de los enlistados arriba. Para nuestro diseño, nosotros utilizaremos el siguiente código:

a:link{
text-decoration:none;
color:#369;
}

a:visited{
text-decoration:line-through;
color:#666;
}

a:hover{
text-decoration:underline;
color:#ce3554;
}

a:active{
text-decoration:none;
color:#ce3554;
}

Para el estado normal del enlace (a:link) seleccionamos un bonito color azul (#369) y desactivamos el subrayado que tiene por defecto (text-decoration:none;) . Los enlaces ya visitados (a:visited) aparecerán en un gris mas tenue que el del cuerpo del texto y tachados (text-decoration:line-through;).
Una cosa muy importante en términos de usabilidad es agregar siempre a los enlaces un estado de hover para que el usuario sepa que se trata de un elemento interactivo. En este caso, cuando el puntero del mouse pase por un enlace (a:hover) reparecera el subrayado (text-decoration:underline;) y el texto cambiará de color. Y para cuando el enlace se encuentre activo(a:active) , dejaremos el mismo color del hover, solo que sin el subrayado.

Miren, vean como quedó.

Ahora… los otros enlaces.

El problema con el estílo anterior, es que mientras se ve muy bien en el cuerpo del texto, no se ve tan bien en la barra lateral (#links) que además esta llenísima de enlaces. Pero bueno, esto con CSS no representa ningun problema.
Como lo que queremos hacer es aplicarle estilo a los enlaces contenidos dentro de el elemento con el identificador #links solo tenemos que crear un selector dodne escribiremos la ruta hasta ese elemento. Primero, el elemento contenedor de mayor jerarquía seguido por el de menor separados por un espacio y asi consecutivamente hasta llegar al elemento objetivo. En este caso el código sería el siguiente:


#links a:link{
text-decoration:none;
display:block;
margin:0;
padding:2px 15px;
color:#c93;
}

#links a:visited{
text-decoration:none;
color:#000;
background:#666;
}

#links a:hover, #links a:active {
text-decoration:none;
color:#000;
background:#960;
}

No hay mayores novedades aquí. Seguramente ahora ya pueden ver el código e imaginarse como luce. Esta vez jugamos tambien con los colores de fondo y utilizamos la misma regla para a:hover y para a:visited .

Antes de dejar por la paz la barra de lateral, vamos a añadir algo de espacio entre las distintas secciones , esto lo lograremos facilmente modificando el margen superior margin-top de la clase .sidetitle que corresponde dentro de nuestro código al título de cada sección. YA que estamos aquí, aprovechamos para hacer que dichos títulos aparezcan centrados ( text-align:center;) y todos en mayusculas (text-transform:uppercase;.



.sidetitle{
text-transform:uppercase;
text-align:center;
margin-top:30px;
margin-bottom:5px;
}


Y así es como queda

Detalles finales.

Al final de cada post viene un elemento div con clase .posted que contiene la información sobre esa entrada: el autor , el enlace permanente, los comentarios y los trackbacks . Es importante diferenciarlo del cuerpo del post y para ello vamos a utilizar la siguiente regla:


.posted{
font-size:90%;
padding:15px;
margin-top:50px;
background:#eee;
border: 1px solid #930;
}

Ahora vamos a hacer algo creativo con los encabezados de fecha que como sabemos, en nuestro código pretence al elemento h3. Escribamos la siguiente regla:


h2{
font-size:110%;
position:relative;
padding:5px;
left:-75px;
top:6em;
width:50px;
color:#ce3554;
}

La propiedad position:relative;nos permite colocar un elemento en una posoción relativa a la que le corresponde en el flujo normal del documento. Así nosotros movemos nuestro elemento 75 pixeles a la izquierda, 6 ems hacía abajo y asignamos una anchura de 50 pixeles. Lo que provocará que quede alineado con el título del post en el espacio del margen izquierdo. Se ve bien ¿no?

Asi es como quedó nuestra plantilla hasta ahorita, como ven no hemos utilizado ni una sola imagen aún, sin embargo solo mediante la tipografía estamos dotando a nuestra página de una personalidad propia.

Nos vemos en la siguiente.

10 Ago 2004

Viste con estilo - 2da lección

Hola, amiguitos y amiguitas CSSeros bienvenidos sean a esta segunda lección de…

viste con estilo (en 5 lecciones)

En la lección pasada veíamos que lo mas importante para poder vestir nuestra pagina requeríamos de una estructura básica. Aprendimos sobre modulos, etiquetas y selectores y modificamos el tipo y color de letra de nuestra página y la ultima vez que la vimos la habíamos dejado así

En esta entrega vamos a comenzar a darle forma a nuestro diseño.

El Layout (no pienso traducir esa palabra)

A grandes rasgos, en jerga de diseño, se le llama layout a la guía que muestra la manera en que los modulos o elementos de diseño están distribuídos en un campo virtual, pudiendo ser este una pagina de revista, una etiqueta, o como en este caso, la pantalla de una dispositivo electrónico. El componente principal de un layout es por lo general una retícula (o red o rejilla) donde cada elemento esta justificado respecto a los demas, y tiene como función mantener la armonía, el equilibrio y la congruencia del diseño.

En terminos de diseño web, hay basicamente dos tipos de layout: el Liquido (liquid) y el Fijo (fixed). El primero es mas gustado por los AI ya que no los elementos de los que está compuesto no tienen definidas ninguna medida fija, sino que son relativas al tamaño de pantalla y el tamaño de fuente que el usuario elija. Los layouts fijos son mas del gusto de los diseñadores gráficos, aqui el control es total puesto que todas las medidas estan especificadas a nivel pixel. Asi es posible hacer intrincados diseños a costa de sacrificar la flexibilidad.

Pero no todo es negro y blanco, entre estos dos extremos hay una gran variedad de grises, es decir, layouts híbridos que aprovechan lo mejor de ambos mundos. Para este experimento he decidido utilizar un layout mas o menos asi:

layout_sample.gif

Donde el encabezado y la barra lateral tienen medidas fijas mientras el contenido se adapte al tamaño de la ventana del usuario. Osea que, utilizaremos un layout semilíquido.

Identidad y Clase

Como ya se habrán dado cuenta, dentro de algunas etiquetas de nuestro código se encuentran argumentos como id="content" y class="blog". Ambos sirven para diferenciar unos elementos de otros y para que sean mas faciles de alcanzar por las hojas de estilo y el DOM. Id sirve para definir un identificador unico, es decir, que sólo puede ser aplicado a un elemento, mientras que Class define una clase que puede ser aplicada a uno o varios elementos a la vez. Los nombres de las clases y los identificadores diferencian entre mayusculas y minusculas y no deben contener espacios. Un mismo elemento puede tener definido un identificador y una clase.

Posicionamiento

Antes que nada, vamos a añadir algunas propiedades al elemento body. Primero, configuraremos el tamaño de la fuente a 12 pixeles, para esto usaremos font-size:12px . Ademas, para evitar el error de algunos navegadores que añaden un margen por defecto a todas las páginas añadiremos estas dos reglas:
padding:0; margin:0;

Ahora lo que vamos a hacer es posicionar el encabezado de nuestro layout para ello utlizaremos el elemento <div id="banner">. Para modificar las propiedades de un elemento con identificador debemos crear un selector de indentidad en nuestra hoja de estilos y para ello utilizamos la siguiente sintaxis: elemento#identificador o si lo desean simplemente #identificador osea que para este caso cualquiera de estas dos opciones es correcta:

  1. div#banner
  2. #banner

Comencemos a definir sus propiedades. Lo primero que vamos a hacer es decirle al navegador que vamos a poner este elemento en donde se nos pegue la gana, independientemente de su posición dentro del código, para esto utilizamos la propiedad position:absolute;. Ahora hay que definir que queremos que se muestre hasta arriba ( top:0; ) y a la izquierda ( left:0; ) que se extienda a todo lo ancho de la página ( width:100%; ) y de alto deseamos que mida 200 pixeles ( height:200px; ).

Hay dos tipos de unidades de medida, las relativas y las “absolutas”. Aqui definimos la anchura del elemento con una unidad relativa a su contenedor (en este caso body) y la altura en una medida absoluta en pixeles. Cuando especificamos una medida cuyo valor es cero, no es necesario especificar ninguna unidad.

Ahora, para hacer la barra lateral modificaremos las propidades del elemento <div id="links">. Definimos el selector #links y como no conocemos el ancho de la ventana del usuario, le indicamos al navegador que queremos que se muestre a la derecha y debajo del banner ( position:absolute; top:200px; right:0; ). Esta vez definimos la anchura en pixeles ( width: 220px;) y la altura para que se ajuste automáticamente al contenido ( height: auto; ). Por ultimo, para que no quede el texto tan cerca a las orillas añadimos un padding de 10 pixeles (padding es el espacio entre el contenido y el contenedor). Aqui pueden ver el resultado

Me permití ademas, cambiar el color del fondo en el encabezado y fondo y color de la letra en la barra lateral.

Margenes

Como ya habrán notado, el encabezado y la barra lateral quedan por encima del contenido. Siguiendo la lógica que hemos usado hasta ahorita, lo lógico sería ahora modificar el elemento <div id="content"> . Pero como queremos que el contenido se adapte al tamaño de ventana del usuario no podemos especificar ni posicionamiento ni ancho ni alto absolutos. Asi que, vamos a recurrir mas bien a otro elemento dentro de #content que es <div class="blog">. Esta vez es una clase no un identificador asi que, utilizaremos un selector de clase que al igual que los otros puede ser expresado de dos maneras:

  1. div.blog
  2. .blog

Como en este caso no vamos a utilizar position:absolute; significa que el elemento va a estar en el lugar que le toca por su posición en el código y utilizaremos márgenes para evitar que se encime con otros elementos. Los márgenes pueden especificarse por separado con margin-top,margin-right,margin-bottom y margin-left, pero se puede abreviar de la siguiente manera: margin:superior, derecho, inferior, izquierdo y asi nos ahorramos unos cuantos bytes en la hoja de estilo.

Entonces vamos a añadir la siguiente propiedad al elemento .blog: margin:225px 300px 50px 100px; ¡ y voila ! pueden ver aquí el resultado.

Traten a cambiar el tamaño de la ventana y vean como el contenido se ajusta sin afectar el tamaño del encabezado y la barra lateral.

Este es el código hasta ahorita:


body{
font-family:Verdana,Helvetica,Arial, Sans-serif;
font-size:12px;
padding:0;
margin:0;
color:#333;
}


#banner{
position:absolute;
top:0px;
left:0px;
width:100%;
height:200px;
background:#ce3554;
}

.blog{
margin:225px 300px 50px 100px;
}

#links{
position:absolute;
right:0;
top:200px;
width:220px;
height:auto;
padding:10px;
color:#fff;
background:#333;
}


Como ven, esto ya esta empezando a tomar forma. Pero nuestro diseño se ve como otros miles de diseños que hay en toda la internet, así que en la siguiente lección comenzaremos a darle personalidad propia. ¿Saz? los veo entonces.

Dudas, comentarios y sugerencias serán bien recibidas.

¡Abur!

05 Ago 2004

Viste con estilo - 1era lección

viste con estilo (en 5 lecciones)

Bueno amiguitos y amiguitas, bienvenidos sean a la primera lección de este fantabuloso experimento. ¿Ya tiene listas sus tijeras de punta chata y su pegamento blanco resistol 850? ¡Pues tirenlos a un lado porque no los vamos a necesitar!

Antes de empezar

Este curso trata exclusivamente de diseño, o mas especificamente dicho, la manera en que yo diseño y que bueno, al menos a mi me funciona. Por lo regular un diseño efectivo requiere de extensa planeación e investigación, pero ya habrá tiempo para todos de aprender con ello despues. Ahorita la cosa es divertirse y aprender algunas cosillas mientras aprendemos.

Materiales

Necesitarás:

  1. Una página con la que estés dispuesto a jugar. Para este curso utilizaremos la plantilla por defecto de movable type version 2.64 (es la que yo tengo). Si no tienes MT y quieres aprender a instalarlo, aqui y aqui hay dos buenísimos tutoriales pa que te avientes.
  2. Cliente FTP (y al menos el conocimiento básico para utilizarlo) por si quieres subir imagenes a tu servidor mas facilmente. Si no, de cualquier forma puedes utilizar la interfase de MT para ello.
  3. Editor HTML. Puedes editar tu código directamente en MT, pero creeme que no hay como un buen editor que ademas coloreé el codigo. Yo utilizo HTML kit y lo recomiendo ampliamente. Tiene un cliente FTP integrado y ademas puedes editar los archivos directamente en el servidor . Y lo mejor de todo: es gratuito.
  4. Editor de Imagenes Especialmente útil si quieres añadir imágenes a tu sitio. Yo definitivamente elijo Photoshop CS pero supongo que fireworks o Paint Shop Pro igual funcionarán.
  5. Tu bebida favorita y algo de botana. (Yo soy especialmente productivo cuando consumo donitas bimbo y una pepsi de lata)
¡Manos a la obra!

Antes que otra cosa pase, veamos como luce nuestro conejillo de indias antes de que empecemos a experimentar. ¿Ya lo vieron? otra vez despidanse de el, porque probablemente quede traumatizado despues del proceso.

Ok. ahora hagamos algo drástico. Vayan a la plantilla de estilos, aqui es donde vamos a trabajar. Seleccionen todo el texto pertenecientes a su hoja de estilos y después presionen la tecla suprimir de su teclado. Guarden y Reconstruyan. Ahora su página debe de lucir mas o menos así ¿Mencioné que sería drástico…?

La estructura.

El estado actual de la pagina es el de una pagina sin estilo. Como mencioné antes diseñar con CSS es como vestir tus paginas, pues bien, para poder vestirla mejor lo importante es que primero que nada, el código de tu página tenga una estructura sólida.
De eso es, en primera instancia, de lo que se tratan los estándares web.

El HTML es el lenguaje en el que esta escrita la web y su principal función es la de dar estructura y forma a los contenidos de la web para que pueda ser interpretada de la misma manera en multitud de dispositivos y plataformas distintas.

Asi que, antes de empezar a vestir nuestra página demosle un vistazo a su estructura. Ande, vaya y vea el codigo fuente de Quedadencias examinelo cuidadosamente y aqui lo espero… ¿Ya? A grandes rasgos la estructura de la página es esta:


<body>
  
  <div id="banner">
    <h1><a href="#" accesskey="1">Quedadencias</a></h1>
    <span class="description"></span>
  </div>
  
  <div id="content">
  
    <div class="blog">
    
    	<h2 class="date">	Julio 17, 2004	</h2>
    	
    	<div class="blogbody">
      	
      	<a name="000221"></a>
      	<h3 class="title">Título</h3>
    
    		  [...]   Aqui va el post
      	
      	<div class="posted">Escrito por sosa en: <a href="#">12:24 AM</a>
      		| <a href="#">Comentarios (0)</a>
      		| <a href="#">TrackBack (0)</a>
      	</div>
  
    	</div>
  
    </div>
  
  </div>
  
  
  <div id="links">
    
    <div align="center" class="calendar">
      [...]  Aqui va el código del calendario
    </div>
    
    <div class="sidetitle">
      [...] Titulo de un sección lateral
    </div>
     
    <div class="side">
      [...] COntenido de sección lateral
    </div>
   
    <div class="syndicate">
      <a href="#">Sindica &eacute;ste sitio (XML)</a>
    </div>
    
    <div class="powered">
    Powered by<br /><a href="http://www.movabletype.org">Movable Type 2.64</a><br />    
    </div>
    
  </div>
  
  <br clear="all" />
  
</body>


Las palabras entre (<) y (>) se llaman etiquetas y son la base del lenguaje XHTML su función es proporcionar de una estructura lógica a los documentos. Veamos la primera etiqueta, esa es <body> y es la que marca el comienzo del cuerpo del documento. Al final de la estructura nos encontraremos con </body> que es una etiqueta de cierre por eso tiene una barra o diagonal (/) antes del nombre. A cada etiqueta de apertura le debe corresponder siempre una de cierre (algunas excepciones las veremos después) y entre una y otra pueden estar contenidas otros pares de etiquetas. Asi, dentro de <body> y </body> se encuentran <div id="banner">, <div id="content"> y <div id="links"> y dentro de <div id="content"> está <div class="blog"> y así sucesivamente. A esta particularidad se le llama anidación. Ilustrémoslo gráficamente:

viste con estilo (en 5 lecciones)

La etiqueta <div> define a un elemento — como su nombre lo indica — tiene como función semántica dividir la estructura del contenido en secciones osea que — por si hay diseñadores entre la audiencia — los divs son los módulos de los que disponemos para construír nuestro diseño.

Yo no me llamo Javier ( Elementos padres, hijos y herencia )

Como vemos en el esquema de arriba, el elemento body es el de mayor jerarquía y el que contiene a todos los demas. Cuando un elemento A contiene a otro, digamos B se dice entonces que A es padre de B y B es hijo de A. Si ademas dentro de B está contenido un elemento C entonces A Es padre de B y abuelo de C o mejor dicho, su ancestro. A esto se le llama herencia, las propiedades de los padres son pasadas a los hijos y luego a los nietos y los tataranietos etc. (A todos de igual forma y en partes sin necesidad de que nadie muera… mejor que la vida real ¿no?)

Mucho bla, bla, bla y poca acción

Bueno, regresemos a nuestra hoja de estilos, aquella que hace un rato dejamos completamente en blanco, ahí escriba lo siguiente:


body{
font-family:Verdana,Helvetica,Arial,Sans-serif;
color:#333;
}


guarde, reconstruya y vea los resultados.

¿Quiere saber que es lo que hicimo? bueno, dejeme le explico.
Para dar estilo a nuestras páginas (X)HTML lo que hacemos es crear dentro de nuestras hojas de estilo es crear selectores que esten enlazados a uno o varios elementos dentro de nuestro código. Cualquier elemento HTML dentro de nuestra página puede convertirse en un selector de CSS como en este caso lo hicimos con body.

Ya que body es el elemento con mayor jerarquía dentro de la estructura de nuestra página al crear un selector para este y modificar sus propiedades, estas propiedades serán heredadas por el resto de los elementos hijos. Las propiedades se definen dentro de llaves (o corchetes o curly brackets como le llamen ustedes) ( {...} ) después del nombre del selector. CSS no reconoce lo saltos de línea, asi que pueden escribirlo todo en varias líneas para que su código sea mas claro y fácil de leer. Para definir una propiedad se utiliza la siguiente sintáxis propiedad:valor[,valor2[,valor3...] ]

Ahora veamos algo de las dos propiedades que definimos:

Con font-family declaramos la familia tipográfica que utilizaremos en nuestro diseño. En este caso elegí en primer lugar Verdana que al ser la primera en la lista de fuentes, será la que se despliegue preferentemente. Si el usuario no la tiene instalada se ira por la segunda opción en este caso Helvetica que es más común en Mac o Arial para Windows. La ultima sans-serif es una fuente genérica, es decir en caso de no encontrar ninguna otra de la lista el navegador incluirá cualquier fuente san-serif. Es importante siempre nombrar al menos una fuente genérica en nuestras hojas de estilos.

color define el color del texto. Su valor se puede expresar de varias maneras:

  • Por medio de constantes, hay 16 nombres de color aceptados por la W3C que son aqua, black, blue, fuchsia, gray, green, lime, maroon, navy, olive, purple, red, silver, teal, yellow y white.
  • Por medio de valores rgb por ejemplo rgb(255,0,0)= rojo.
  • Por su valor hexagecimal, como #ffffff= blanco y #ff0000= rojo . Donde cada par de numeros representa un valor de 0 a 255 de rojo, verde y azul respectivamente. Ademas, estos se pueden resumir: #990000 = #900 y #999999 = #999

En este caso he elegido #333 un color oscuro que no llega a ser negro, y que sobre el fondo blanco porporciona suficiente contraste para dar buena legibilidad sin llegar a lastimar la vista. Es importante notar que ya desde este punto estamos tomando decisiones de diseño.

Por ahora es todo de esta primera lección. Tal vez parezca que no avanzamos mucho, pero hemos sentado las bases y después de esto, todo es pura diversión.

Dudas y sugerencias ya saben, en los comentarios.

26 Jul 2004

Viste con estilo en 5 lecciones

viste con estilo (en 5 lecciones)

Vestiditos para tus paginas

Diseñar una pagina utilizando hojas de estilo o CSS , puede ser un concepto extraño si no tienes ninguna experiencia en diseño web, pero verdaderamente rarísimo si eres veterano del diseño y todavía diseñas usando tablas o un editor WYSIWYG como Dreamweaver o Frontpage. Hace poco más de un año todavía, yo aún diseñaba a la antigüita pero cuando descubrí el mundo de posibilidades que esta nueva forma de concebir el diseño web ofrece, me dedique de lleno a aprenderlo, a abrazarlo y no he vuelto a mirar atras (aunque que suena a lavado de coco de una empresa de ventas multinivel).

Ahora quiero compartír con ustedes algo de lo que he aprendído para que puedan ustedes conocer los beneficios del CSS de una manera práctica y sencilla. Después de 5 lecciones usted pensará que estoy completamente loco o concordará conmigo que realízar un diseño web con mucho estílo es como hacerle vestiditos a sus páginas.

El reto

Aunque veremos algunos conceptos básicos de XHTML el propósito de esta serie de artículos es mostrar como “vestir” una página utilizando CSS sin necesidad de tocar en lo absoluto el codigo y para ejemplificarlo de la manera más prácticamente posible, he resuelto utilizar para nuestros experimentos la plantilla por defecto de Movable Type. De esta manera , tenemos un codigo válido y que probablemente sea muy común en cualquier cantidad de blogs circulando por ahí.

¿El conejillo de indias? Esta paginilla que inicié hace poco con unos amigos y que permanece dignamente en el anonimato porque para eso fue concebida. Pero ya que por flojera sigue teniendo la plantilla default de MT resulta perfecta para nuestros experimentos. ;)
  1. primera lección
  2. segunda lección
  3. tercer lección
  4. cuarta lección (próximamente)
  5. quinta lección (próximamente)
22 Jun 2004

Tu navegador apesta

Cómo desplegar contenido específico para internet explorer

Como ya algunos notaron, hasta el diseño de éste sitio pone su granito de arena en la mentada campaña de desinternetexplorerización ya que despliega un mensaje específico para los usuarios de este infame navegador. Si no lo han notado, anden vayan y desempolven su IE para que veand e lo que hablo, aqui los espero.

¿Estan de vuelta conmigo? Bien. El reto que me puse a mi mismo fué no modificar en lo absoluto el codigo HTML del sitio y sin embargo cambiar totalmetne el look del sitio utilizando solamente hojas de estilo. Así que esa es la premisa, no usar màs que CSS para lograr nuestro cometido.

Resulta que, el elemento de diseño que escogí para adornar esa solitaría esquina superior derecha era una especie de robot que pareciera flotar sobre el fondo. Esto fué bastante fácil de hacer sin alterar el HTML de mi anterior diseño ya que tenia un elemento DIV llamado cover (lo utilizaba para desplegar un encabezado al azar en el anterior diseño) que ya no iba a utilizar, asi que llo puse donde quería y le cambié el fondo por un bonito PNG transparente que me daba el efecto que necesitaba.

Desgraciadamente, al ver mi diseño en IE recordé que no soporta ese tipo de transparencias, así que e lugar de flotar con singular gracia y belleza, mi robot tenìa un espantoso fondo fris que obstruìa parte del conenido y el diseño. ¿Que hacer en estos casos? ¿Desechar algo que quieres hacer solo porque el explorador que casi todo mundo usa no se le pega la gana desplegarlo bien? A mi se me ocurriò otra solución.

Cuando declaras una propiedad en una hoja de estílo el valor que le asignes sobreescribe cualquier valor anterior que hubiese tenido antes. Es decir, si yo en una hoja de estilos declarara algo asi:


body {
background-color:white;
background-color:red;
}

el fondo de la página sería rojo, ya que la segunda declaración es la que cuenta. Para evitar que una segunda declaración de una regla sobrescriba un valor asignado CSS nos permite usar !important seguido del valor. Lo que indica que no importa qué se declare después este valor no será sobreescrito. Asi, en :


body {
background-color:white !important;
background-color:red;
}

el color de la página quedaría blanco.

Bueno eso no sucede en IE porque simplemente no soporta la declaración !important. Eso es algo malo, pero podemos tomar ventaja de ello. He aqui lo que yo hice:


#cover{
background:transparent url('images/robot.png') no-repeat !important;
background:transparent url('images/ie_sucks.gif') no-repeat; 
}

de esta manera para todos los navegadores que soporten !important el fondo sera robot.png, para el resto será ie_sucks.gif.

Otra forma de aplicar esta técnica es mediante la propiedad display:block y display:none que puede ser utilizada para mostrar o esconder un elemento de bloque, como puede ser un DIV. Por ejemplo, miremos el siguiente código:



<div id="good_browser">
  Estás utilizando un buen navegador, se ve que eres conocedor.
</div>

<div id="suckin_browser">
  Your browser sucks.
	
	Tienes la puerta abierta para que sinnúmero de aplicaciones 
	malignas que poblan la red hagan lo que quieran con tu sistema.
	
	Cambiate a <a href="http://www.mozilla.org"> algo mejor</a>
</div>

tenemos dos elementos de bloque (DIV) con dos diferentes identificadores #good_browser y #suckin_browser. Ahora, si este código aplicamos las siguientes reglas de CSS:


body {
background-color:white !important;
background-color:red;
}

#suckin_browser{
display:none !important;
display:block; 
}

#good_browser{
display:block !important;
display:none; 
}

Tendremos un mensaje para IE y otro para el resto de los navegadores. Vean el ejemplo (es necesario verlo en ambos navegadores pa’ que se note el efecto)

Esta técnica puede ser utilizada de muchas maneras distinatas, puede mostrar un pequeño mensaje por ahí , mas amigables que los mìos si quieren o de plano pueden ponerse un tanto drásticos y reservarse el derecho de admisión solo para aquellos usuarios conocedores que sean dignos de ver su selecto contenido. Ver ejemplo drástico

Espero que les sea de alguna utilidad.

21 Jun 2004

No soy guru

Durante el rediseño de este sitio, y en algunos otros proyectos en los que estoy trabajando, he venido aprendiendo mucho sobre CSS y estándares aplicados (porque una cosa es la teoría y otra la práctica) por lo tanto, aunque no soy ningun guru me gustaría compartír con ustedes, queridos tres lectores algo de lo que he aprendido. Inauguramos la sección tutoriales. (Corte simbólico de listón)