tag:blogger.com,1999:blog-37671038029448285952024-02-07T04:39:53.714-08:00Imma DeveloperDesarrollo / Programación Web =)Unknownnoreply@blogger.comBlogger7125tag:blogger.com,1999:blog-3767103802944828595.post-26429331491907444112011-01-24T09:32:00.003-08:002011-02-07T10:17:32.056-08:00Amazon S3<!--[if !mso]> <style> v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} </style> <![endif]--><!--[if gte mso 9]><xml> <w:worddocument> <w:view>Normal</w:View> <w:zoom>0</w:Zoom> <w:trackmoves>false</w:TrackMoves> <w:trackformatting/> <w:hyphenationzone>21</w:HyphenationZone> <w:punctuationkerning/> <w:validateagainstschemas/> <w:saveifxmlinvalid>false</w:SaveIfXMLInvalid> <w:ignoremixedcontent>false</w:IgnoreMixedContent> <w:alwaysshowplaceholdertext>false</w:AlwaysShowPlaceholderText> <w:donotpromoteqf/> <w:lidthemeother>ES</w:LidThemeOther> <w:lidthemeasian>X-NONE</w:LidThemeAsian> <w:lidthemecomplexscript>X-NONE</w:LidThemeComplexScript> <w:compatibility> <w:breakwrappedtables/> <w:snaptogridincell/> <w:wraptextwithpunct/> <w:useasianbreakrules/> <w:dontgrowautofit/> <w:splitpgbreakandparamark/> <w:dontvertaligncellwithsp/> <w:dontbreakconstrainedforcedtables/> <w:dontvertalignintxbx/> <w:word11kerningpairs/> <w:cachedcolbalance/> </w:Compatibility> <w:browserlevel>MicrosoftInternetExplorer4</w:BrowserLevel> <m:mathpr> <m:mathfont val="Cambria Math"> <m:brkbin val="before"> <m:brkbinsub val="--"> <m:smallfrac val="off"> <m:dispdef/> <m:lmargin val="0"> <m:rmargin val="0"> <m:defjc val="centerGroup"> <m:wrapindent val="1440"> <m:intlim val="subSup"> <m:narylim val="undOvr"> </m:mathPr></w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:latentstyles deflockedstate="false" defunhidewhenused="true" defsemihidden="true" defqformat="false" defpriority="99" latentstylecount="267"> <w:lsdexception locked="false" priority="0" semihidden="false" unhidewhenused="false" qformat="true" name="Normal"> <w:lsdexception locked="false" priority="9" semihidden="false" unhidewhenused="false" qformat="true" name="heading 1"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 2"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 3"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 4"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 5"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 6"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 7"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 8"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 9"> <w:lsdexception locked="false" priority="39" name="toc 1"> <w:lsdexception locked="false" priority="39" name="toc 2"> <w:lsdexception locked="false" priority="39" name="toc 3"> <w:lsdexception locked="false" priority="39" name="toc 4"> <w:lsdexception locked="false" priority="39" name="toc 5"> <w:lsdexception locked="false" priority="39" name="toc 6"> <w:lsdexception locked="false" priority="39" name="toc 7"> <w:lsdexception locked="false" priority="39" name="toc 8"> <w:lsdexception locked="false" priority="39" name="toc 9"> <w:lsdexception locked="false" priority="35" qformat="true" name="caption"> <w:lsdexception locked="false" priority="10" semihidden="false" unhidewhenused="false" qformat="true" name="Title"> <w:lsdexception locked="false" priority="1" name="Default Paragraph Font"> <w:lsdexception locked="false" priority="11" semihidden="false" unhidewhenused="false" qformat="true" name="Subtitle"> <w:lsdexception locked="false" priority="22" semihidden="false" unhidewhenused="false" qformat="true" name="Strong"> <w:lsdexception locked="false" priority="20" semihidden="false" unhidewhenused="false" qformat="true" name="Emphasis"> <w:lsdexception locked="false" priority="59" semihidden="false" unhidewhenused="false" name="Table Grid"> <w:lsdexception locked="false" unhidewhenused="false" name="Placeholder Text"> <w:lsdexception locked="false" priority="1" semihidden="false" unhidewhenused="false" qformat="true" name="No Spacing"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 1"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 1"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 1"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 1"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 1"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 1"> <w:lsdexception locked="false" unhidewhenused="false" name="Revision"> <w:lsdexception locked="false" priority="34" semihidden="false" unhidewhenused="false" qformat="true" name="List Paragraph"> <w:lsdexception locked="false" priority="29" semihidden="false" unhidewhenused="false" qformat="true" name="Quote"> <w:lsdexception locked="false" priority="30" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Quote"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 1"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 1"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 1"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 1"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 1"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 1"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 1"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 1"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 2"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 2"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 2"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 2"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 2"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 2"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 2"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 2"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 2"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 2"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 2"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 2"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 2"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 2"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 3"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 3"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 3"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 3"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 3"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 3"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 3"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 3"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 3"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 3"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 3"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 3"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 3"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 3"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 4"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 4"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 4"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 4"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 4"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 4"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 4"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 4"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 4"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 4"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 4"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 4"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 4"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 4"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 5"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 5"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 5"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 5"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 5"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 5"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 5"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 5"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 5"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 5"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 5"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 5"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 5"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 5"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 6"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 6"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 6"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 6"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 6"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 6"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 6"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 6"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 6"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 6"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 6"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 6"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 6"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 6"> <w:lsdexception locked="false" priority="19" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Emphasis"> <w:lsdexception locked="false" priority="21" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Emphasis"> <w:lsdexception locked="false" priority="31" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Reference"> <w:lsdexception locked="false" priority="32" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Reference"> <w:lsdexception locked="false" priority="33" semihidden="false" unhidewhenused="false" qformat="true" name="Book Title"> <w:lsdexception locked="false" priority="37" name="Bibliography"> <w:lsdexception locked="false" priority="39" qformat="true" name="TOC Heading"> </w:LatentStyles> </xml><![endif]--><!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Tabla normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-qformat:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin-top:0cm; mso-para-margin-right:0cm; mso-para-margin-bottom:10.0pt; mso-para-margin-left:0cm; line-height:115%; mso-pagination:widow-orphan; font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin;} </style> <![endif]--> <p class="MsoNormal"><b style=""><i style="">Amazon</i></b> tiene espacio de almacenamiento en Internet: <b style="">Amazon Simple Storage Service (Amazon S3)</b>. Proporciona una interface que puede utilizarse para almacenar y recuperar datos, en cualquier momento y en cualquier parte de la web.</p> <p class="MsoNormal">La funcionalidad y datos prácticos los podemos encontrar en el siguiente link: <a href="http://aws.amazon.com/es/s3/#functionality">http://aws.amazon.com/es/s3/#functionality</a></p> <p class="MsoNormal">Estos son los principales pasos a seguir en el almacenamiento de un objeto:</p> <p class="MsoNormal"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaIkRy6WJi6NDF1BJNYb5oeaSzr4wQ3tFrcJWKMMTyIecgZtJrgOiPjr8p0DVZ3O5hXEf2V-03uaIn1yXDoitx1wcVvlwzM5L8rEN444b59bcqvBGcalmdHjRJeuhyphenhyphenRXEgFPv4rDO16cQ/s1600/Amazon+s3.GIF"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 567px; height: 57px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaIkRy6WJi6NDF1BJNYb5oeaSzr4wQ3tFrcJWKMMTyIecgZtJrgOiPjr8p0DVZ3O5hXEf2V-03uaIn1yXDoitx1wcVvlwzM5L8rEN444b59bcqvBGcalmdHjRJeuhyphenhyphenRXEgFPv4rDO16cQ/s400/Amazon+s3.GIF" alt="" id="BLOGGER_PHOTO_ID_5571011538688734210" border="0" /></a></p> <p class="MsoNormal">(<a href="http://docs.amazonwebservices.com/AmazonS3/latest/gsg/">http://docs.amazonwebservices.com/AmazonS3/latest/gsg/</a>)</p> <p class="MsoNormal">En la web en la que trabajo hemos subido los videos y las imágenes a <b style=""><i style="">Amazon</i></b>, por lo que tuve que hacer un pequeño proyecto para hacer el <i style="">upload</i> desde la web y el backoffice.</p> <p class="MsoNormal">Lo primero que hice fue instalar el Plugin de <b style=""><i style="">AWS</i></b> para <i style="">Eclipse</i> (<a href="http://aws.amazon.com/es/eclipse/">http://aws.amazon.com/es/eclipse/</a>), y lo que aconsejan en su web, crear un “<i style="">sample code</i>”. Es una forma sencilla de empezar a probar la API.</p> <p class="MsoNormal">Una vez familiarizada con las librerías, creé un Project para el <i style="">upload</i> de los videos y las imágenes. Este se compone de dos ficheros: una clase que he llamado <i style="">s3Access</i> y un fichero de <i style="">properties</i>.</p> <p class="MsoNormal">El fichero de <i style="">properties</i> contiene la <i style="">Secret Key</i> y la <i style="">Access Key</i> de <b style=""><i style="">Amazon</i></b>. De esta forma, si por alguna razón cambian no es necesario modificar el proyecto. <span style=""> </span></p> <p class="MsoNormal">La clase la explico un poco, quitando código superfluo, así no alargo demasiado el post.</p> <p class="MsoNormal">A partir de este proyecto se generará un <i style="">JAR</i> que incluiremos en el path de la web, de forma que crearemos un objeto en la web de la clase <i style="">s3Access</i>, y llamaremos a sus métodos según convenga.</p> <p class="MsoNormal">La clase se compone de un constructor que al ser llamado creará el objeto <b style=""><i style="">S3</i></b> y cargará los <i style="">buckets</i> (espacios propios en <b style=""><i style="">Amazon</i></b>):</p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;font-family:courier new;"><span style="font-size:100%;"><span style="" lang="EN-US">public</span></span><span style=";font-size:100%;color:black;" lang="EN-US"> S3Access() {</span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;font-family:courier new;"><span style=";font-size:100%;color:black;" lang="EN-US"><span style=""> </span></span><span style="font-size:100%;"><span style="" lang="EN-US">this</span></span><span style=";font-size:100%;color:black;" lang="EN-US">.</span><span lang="EN-US" style="font-size:100%;">s3</span><span style=";font-size:100%;color:black;" lang="EN-US"> = </span><span style="font-size:100%;"><span style="" lang="EN-US">new</span></span><span style=";font-size:100%;color:black;" lang="EN-US"> AmazonS3Client(</span><span style="font-size:100%;"><span style="" lang="EN-US">new</span></span><span style=";font-size:100%;color:black;" lang="EN-US"> PropertiesCredentials(</span></p> <p class="MsoNormal" style="margin: 0cm 0cm 0.0001pt 35.4pt; line-height: normal;font-family:courier new;"><span style=";font-size:100%;color:black;" lang="EN-US">S3Access.</span><span style="font-size:100%;"><span style="" lang="EN-US">class</span></span><span style=";font-size:100%;color:black;" lang="EN-US">.getResourceAsStream(</span><span lang="EN-US" style="font-size:100%;">awsCredentialsProperties</span><span style=";font-size:100%;color:black;" lang="EN-US">)));</span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;font-family:courier new;"><span style=";font-size:100%;color:black;" lang="EN-US"><span style=""> </span>loadMXMBuckets();</span></p> <p class="MsoNormal" style="font-family:courier new;"><span style="line-height: 115%;font-size:100%;color:black;" lang="EN-US">}</span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;font-family:courier new;"><span style="font-size:100%;"><b><span style="" lang="EN-US">private</span></b></span><span style=";font-size:100%;color:black;" lang="EN-US"> </span><span style="font-size:100%;"><b><span style="" lang="EN-US">void</span></b></span><span style=";font-size:100%;color:black;" lang="EN-US"> loadMXMBuckets() {</span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;font-family:courier new;"><span style="font-size:100%;"><b><span style="" lang="EN-US"><span style=""> </span>for</span></b></span><span style=";font-size:100%;color:black;" lang="EN-US"> (Bucket bucket : </span><span style="font-size:100%;"><b><span style="" lang="EN-US">this</span></b></span><span style=";font-size:100%;color:black;" lang="EN-US">.</span><span lang="EN-US" style="font-size:100%;">s3</span><span style=";font-size:100%;color:black;" lang="EN-US">.listBuckets()) {</span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;font-family:courier new;"><span style="font-size:100%;"><b><span style="" lang="EN-US"><span style=""> </span><span style="color: rgb(255, 255, 255);">__</span>for</span></b></span><span style=";font-size:100%;color:black;" lang="EN-US"> (</span><span style="font-size:100%;"><b><span style="" lang="EN-US">int</span></b></span><span style=";font-size:100%;color:black;" lang="EN-US"> i=0; i< </span><span lang="EN-US" style="font-size:100%;">listObjectType</span><span style=";font-size:100%;color:black;" lang="EN-US">.</span><span lang="EN-US" style="font-size:100%;">length</span><span style=";font-size:100%;color:black;" lang="EN-US">; i++) {</span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;font-family:courier new;"><span style=";font-size:100%;color:black;" lang="EN-US"><span style=""> </span></span><span style="font-size:100%;"><b><span style="" lang="EN-US"><span style="color: rgb(255, 255, 255);">__</span></span></b></span><span style="font-size:100%;"><b><span style="" lang="EN-US"><span style="color: rgb(255, 255, 255);">__</span></span></b></span><span style="font-size:100%;"><b><span style="" lang="EN-US">if</span></b></span><span style=";font-size:100%;color:black;" lang="EN-US"> (bucket.getName().indexOf(</span><span lang="EN-US" style="font-size:100%;">listObjectType</span><span style=";font-size:100%;color:black;" lang="EN-US">[i]) != -1) {</span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;font-family:courier new;"><span style="font-size:100%;"><b><span style="" lang="EN-US"><span style="color: rgb(255, 255, 255);">__</span></span></b></span><span style="font-size:100%;"><b><span style="" lang="EN-US"><span style="color: rgb(255, 255, 255);">__</span></span></b></span><span style="font-size:100%;"><b><span style="" lang="EN-US"><span style="color: rgb(255, 255, 255);">__</span></span></b></span><span style=";font-size:100%;color:black;" lang="EN-US"><span style=""> </span><span style=""> </span></span><span lang="EN-US" style="font-size:100%;">listMXMBuckets</span><span style=";font-size:100%;color:black;" lang="EN-US">.put(</span><span lang="EN-US" style="font-size:100%;">listObjectType</span><span style=";font-size:100%;color:black;" lang="EN-US">[i], bucket.getName());</span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;font-family:courier new;"><span style="font-size:100%;"><b><span style="" lang="EN-US"><span style="color: rgb(255, 255, 255);">__</span></span></b></span><span style="font-size:100%;"><b><span style="" lang="EN-US"><span style="color: rgb(255, 255, 255);">__</span></span></b></span><span style=";font-size:100%;color:black;" lang="EN-US"><span style=""> </span></span><span style=";font-size:100%;color:black;" >}</span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;font-family:courier new;"><span style="font-size:100%;"><b><span style="" lang="EN-US"><span style="color: rgb(255, 255, 255);">__</span></span></b></span><span style=";font-size:100%;color:black;" >}</span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;font-family:courier new;"><span style=";font-family:courier new;font-size:100%;color:black;" ><span style=""> </span>}</span><span style="font-size:100%;"></span></p> <p class="MsoNormal" style="font-family:courier new;"><span style="line-height: 115%;font-size:100%;color:black;" >}</span></p> <p class="MsoNormal">El método <i style="">uploadFile</i> hace el <i style="">upload</i> de un fichero en una carpeta en un <i style="">bucket</i> determinado, y devuelve la url de acceso a ese fichero:</p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;font-family:courier new;"><span style="font-size:100%;"><b><span style="" lang="EN-US">public</span></b></span><span style=";font-size:100%;color:black;" lang="EN-US"> String uploadFile (String filePath, String objectType, String folderName) {</span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;font-family:courier new;"><span style="font-size:100%;"><b><span style=";font-family:";" lang="EN-US"><span style="color: rgb(255, 255, 255);">__</span></span></b></span><span style=";font-size:100%;color:black;" lang="EN-US">String urlFile = </span><span style="font-size:100%;"><b><span style="" lang="EN-US">null</span></b></span><span style=";font-size:100%;color:black;" lang="EN-US">;</span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;font-family:courier new;"><span style=";font-size:100%;color:black;" lang="EN-US"><span style=""> </span></span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;font-family:courier new;"><span style="font-size:100%;"><b><span style=";font-family:";" lang="EN-US"><span style="color: rgb(255, 255, 255);">__</span></span></b></span><span style=";font-size:100%;color:black;" lang="EN-US">String bucketName = </span><span style="font-size:100%;"><b><span style="" lang="EN-US">this</span></b></span><span style=";font-size:100%;color:black;" lang="EN-US">.</span><span lang="EN-US" style="font-size:100%;">listMXMBuckets</span><span style=";font-size:100%;color:black;" lang="EN-US">.get(objectType);</span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;font-family:courier new;"><span style="font-size:100%;"><b><span style=";font-family:";" lang="EN-US"><span style="color: rgb(255, 255, 255);">__</span></span></b></span><span style=";font-size:100%;color:black;" lang="EN-US">String key = extractNameFileFromPath(filePath);</span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;font-family:courier new;"><span style="font-size:100%;"><b><span style=";font-family:";" lang="EN-US"><span style="color: rgb(255, 255, 255);">__</span></span></b></span><span style=";font-size:100%;color:black;" lang="EN-US">String pathBucket = bucketName + </span><span lang="EN-US" style="font-size:100%;">"/"</span><span style=";font-size:100%;color:black;" lang="EN-US"> + folderName;</span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;font-family:courier new;"><span style=";font-size:100%;color:black;" lang="EN-US"><span style=""> </span></span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;font-family:courier new;"><span style="font-size:100%;"><b><span style=";font-family:";" lang="EN-US"><span style="color: rgb(255, 255, 255);">__</span></span></b></span><span style="font-size:100%;"><b><span style="" lang="EN-US">try</span></b></span><span style=";font-size:100%;color:black;" lang="EN-US"> {</span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;font-family:courier new;"><span style="font-size:100%;"><b><span style=";font-family:";" lang="EN-US"><span style="color: rgb(255, 255, 255);">__</span></span></b></span><span style="font-size:100%;"><b><span style=";font-family:";" lang="EN-US"><span style="color: rgb(255, 255, 255);">__</span></span></b></span><span style=";font-size:100%;color:black;" lang="EN-US">File file = </span><span style="font-size:100%;"><b><span style="" lang="EN-US">new</span></b></span><span style=";font-size:100%;color:black;" lang="EN-US"> File(filePath);</span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;font-family:courier new;"><span style=";font-size:100%;color:black;" lang="EN-US"><span style=""> </span></span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;font-family:courier new;"><span style="font-size:100%;"><b><span style=";font-family:";" lang="EN-US"><span style="color: rgb(255, 255, 255);">__</span></span></b></span><span style="font-size:100%;"><b><span style=";font-family:";" lang="EN-US"><span style="color: rgb(255, 255, 255);">__</span></span></b></span><span lang="EN-US" style="font-size:100%;">s3</span><span style=";font-size:100%;color:black;" lang="EN-US">.putObject(</span><span style="font-size:100%;"><b><span style="" lang="EN-US">new</span></b></span><span style=";font-size:100%;color:black;" lang="EN-US"> PutObjectRequest(pathBucket, key, file)); </span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;font-family:courier new;"><span style=";font-size:100%;color:black;" lang="EN-US"><span style=""> </span></span><span style="font-size:100%;"><b><span style=";font-family:";" lang="EN-US"><span style="color: rgb(255, 255, 255);">__</span></span></b></span><span style="font-size:100%;"><b><span style=";font-family:";" lang="EN-US"><span style="color: rgb(255, 255, 255);">__</span></span></b></span><span lang="EN-US" style="font-size:100%;">s3</span><span style=";font-size:100%;color:black;" lang="EN-US">.setObjectAcl(pathBucket, key, </span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; text-indent: 35.4pt; line-height: normal;font-family:courier new;"><span style=";font-size:100%;color:black;" lang="EN-US">CannedAccessControlList.</span><span style="font-size:100%;"><i><span style="" lang="EN-US">PublicRead</span></i></span><span style=";font-size:100%;color:black;" lang="EN-US">);</span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;font-family:courier new;"><span style=";font-size:100%;color:black;" lang="EN-US"><span style=""> </span></span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;font-family:courier new;"><span style="font-size:100%;"><b><span style=";font-family:";" lang="EN-US"><span style="color: rgb(255, 255, 255);">__</span></span></b></span><span style="font-size:100%;"><b><span style=";font-family:";" lang="EN-US"><span style="color: rgb(255, 255, 255);">__</span></span></b></span><span style=";font-size:100%;color:black;" lang="EN-US">urlFile = </span><span lang="EN-US" style="font-size:100%;">urlAmazonAws</span><span style=";font-size:100%;color:black;" lang="EN-US"> + pathBucket + </span><span lang="EN-US" style="font-size:100%;">"/"</span><span style=";font-size:100%;color:black;" lang="EN-US"> + key;</span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;font-family:courier new;"><span style="font-size:100%;"><b><span style=";font-family:";" lang="EN-US"><span style="color: rgb(255, 255, 255);">__</span></span></b></span><span style=";font-size:100%;color:black;" lang="EN-US">} </span><span style="font-size:100%;"><b><span style="" lang="EN-US">catch</span></b></span><span style=";font-size:100%;color:black;" lang="EN-US"> (AmazonServiceException ase) {</span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;font-family:courier new;"><span style=";font-size:100%;color:black;" lang="EN-US"><span style=""> </span><span style=""> </span></span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;font-family:courier new;"><span style="font-size:100%;"><b><span style=";font-family:";" lang="EN-US"><span style="color: rgb(255, 255, 255);">__</span></span></b></span><span style=";font-size:100%;color:black;" lang="EN-US">} </span><span style="font-size:100%;"><b><span style="" lang="EN-US">catch</span></b></span><span style=";font-size:100%;color:black;" lang="EN-US"> (AmazonClientException ace) {</span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;font-family:courier new;"><span style=";font-size:100%;color:black;" lang="EN-US"><span style=""> </span></span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;font-family:courier new;"><span style="font-size:100%;"><b><span style=";font-family:";" lang="EN-US"><span style="color: rgb(255, 255, 255);">__</span></span></b></span><span style=";font-size:100%;color:black;" lang="EN-US">} </span><span style="font-size:100%;"><b><span style="" lang="EN-US">catch</span></b></span><span style=";font-size:100%;color:black;" lang="EN-US"> (Exception e) {</span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;font-family:courier new;"><span style="font-size:100%;"><b><span style=";font-family:";" lang="EN-US"><span style="color: rgb(255, 255, 255);">__</span></span></b></span><span style=";font-size:100%;color:black;" lang="EN-US">}</span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;font-family:courier new;"><span style=";font-size:100%;color:black;" lang="EN-US"><span style=""> </span></span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;font-family:courier new;"><span style="font-size:100%;"><b><span style=""><span style=""> </span>return</span></b></span><span style=";font-size:100%;color:black;" > urlFile;</span></p> <p class="MsoNormal" style="font-family:courier new;"><span style="line-height: 115%;font-size:100%;color:black;" >}</span></p> <p class="MsoNormal">Un método interesante para el backoffice sería el de borrar un objeto:</p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal; font-family: courier new;"><span style="font-size:100%;"><span style="" lang="EN-US">public</span></span><span style=";font-size:100%;color:black;" lang="EN-US"> </span><span style="font-size:100%;"><span style="" lang="EN-US">boolean</span></span><span style=";font-size:100%;color:black;" lang="EN-US"> deleteObject (String filePath, String objectType, String folderName) {</span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal; font-family: courier new;"><span style="font-size:100%;"><span style="" lang="EN-US"><span style="color: rgb(255, 255, 255);">__</span></span></span><span style=";font-size:100%;color:black;" lang="EN-US">String bucketName = </span><span style="font-size:100%;"><span style="" lang="EN-US">this</span></span><span style=";font-size:100%;color:black;" lang="EN-US">.</span><span style=";font-size:100%;" lang="EN-US">listMXMBuckets</span><span style=";font-size:100%;color:black;" lang="EN-US">.get(objectType);</span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal; font-family: courier new;"><span style="font-size:100%;"><span style="" lang="EN-US"><span style="color: rgb(255, 255, 255);">__</span></span></span><span style=";font-size:100%;color:black;" lang="EN-US">String pathBucket = bucketName + </span><span style=";font-size:100%;" lang="EN-US">"/"</span><span style=";font-size:100%;color:black;" lang="EN-US"> + folderName;</span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal; font-family: courier new;"><span style="font-size:100%;"><span style="" lang="EN-US"><span style="color: rgb(255, 255, 255);">__</span></span></span><span style="font-size:100%;"><span style="" lang="EN-US">boolean</span></span><span style=";font-size:100%;color:black;" lang="EN-US"> objectDeleted = </span><span style="font-size:100%;"><span style="" lang="EN-US">true</span></span><span style=";font-size:100%;color:black;" lang="EN-US">;</span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal; font-family: courier new;"><span style=";font-size:100%;color:black;" lang="EN-US"><span style=""> </span></span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal; font-family: courier new;"><span style="font-size:100%;"><span style="" lang="EN-US"><span style="color: rgb(255, 255, 255);">__</span></span></span><span style="font-size:100%;"><span style="" lang="EN-US">try</span></span><span style=";font-size:100%;color:black;" lang="EN-US"> {</span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal; font-family: courier new;"><span style="font-size:100%;"><span style="" lang="EN-US"><span style="color: rgb(255, 255, 255);">__</span></span></span><span style="font-size:100%;"><span style="" lang="EN-US"><span style="color: rgb(255, 255, 255);">__</span></span></span><span style="font-size:100%;"><span style="" lang="EN-US">this</span></span><span style=";font-size:100%;color:black;" lang="EN-US">.</span><span style=";font-size:100%;" lang="EN-US">s3</span><span style=";font-size:100%;color:black;" lang="EN-US">.deleteObject(pathBucket, filePath);</span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal; font-family: courier new;"><span style="font-size:100%;"><span style="" lang="EN-US"><span style="color: rgb(255, 255, 255);">__</span></span></span><span style=";font-size:100%;color:black;" lang="EN-US">} </span><span style="font-size:100%;"><span style="" lang="EN-US">catch</span></span><span style=";font-size:100%;color:black;" lang="EN-US"> (AmazonClientException e) {</span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal; font-family: courier new;"><span style="font-size:100%;"><span style="" lang="EN-US"><span style="color: rgb(255, 255, 255);">__</span></span></span><span style=";font-size:100%;color:black;" lang="EN-US">objectDeleted = </span><span style="font-size:100%;"><span style="" lang="EN-US">false</span></span><span style=";font-size:100%;color:black;" lang="EN-US">;</span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal; font-family: courier new;"><span style="font-size:100%;"><span style="" lang="EN-US"><span style="color: rgb(255, 255, 255);">__</span></span></span><span style=";font-size:100%;color:black;" >}</span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal; font-family: courier new;"><span style="font-size:100%;"><span style="" lang="EN-US"><span style="color: rgb(255, 255, 255);">__</span></span></span><span style="font-size:100%;"><span style="">return</span></span><span style=";font-size:100%;color:black;" > objectDeleted;</span></p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-family: courier new;font-family:";font-size:100%;color:black;" >}</span><span style=";font-family:";font-size:10pt;" ></span></p> <p class="MsoNormal"><span style="line-height: 115%;font-family:";font-size:10pt;color:black;" > </span></p> <p class="MsoNormal">Recomiendo ver el video: <a href="http://media.amazonwebservices.com/videos/eclipse-java-sdk-video.html">http://media.amazonwebservices.com/videos/eclipse-java-sdk-video.html</a></p>Unknownnoreply@blogger.com3tag:blogger.com,1999:blog-3767103802944828595.post-89567668561009901552011-01-23T08:25:00.000-08:002011-01-23T08:35:56.448-08:00NoSQL: El fin de las Bases de Datos relacionales?<p style="margin-bottom: 0cm;">El primer día del curso de J2EE el profe nos dijo que a las Bases de Datos le quedaban 10 años de vida y la idea me entusiasmó. </p> <p style="margin-bottom: 0cm; font-weight: normal;">Y cuanto más pienso en ello, más sentido le encuentro.</p> <p style="margin-bottom: 0cm; font-weight: normal;">Para extraer datos de la BD tenemos que hacer un acceso a un repositorio externo, algo ajeno a nuestra aplicación.<br /></p><p style="margin-bottom: 0cm; font-weight: normal;">Además tienen un lenguaje propio, el SQL, que nos obliga a tratar nuestros objetos de una manera poco lógica e intuitiva. Se pierde mucho tiempo en lograr queries de bajo coste, a veces sacrificando un código limpio y sencillo.</p> <p style="margin-bottom: 0cm; font-weight: normal;">Cuánto podríamos mejorar el rendimiento de nuestra aplicación si tuviéramos los datos más accesibles?</p> <p style="margin-bottom: 0cm; font-weight: normal;">He buscado información al respecto y encontré lo que llaman <b>NoSQL</b>.</p> <p style="margin-bottom: 0cm;"><b>Amazon </b><span style="font-weight: normal;">creó su propia base de datos </span><b>NoSQL</b><span style="font-weight: normal;">, de código cerrado, y de uso exclusivo: </span><b>Amazon Dynamo</b><span style="font-weight: normal;">. Fue en octubre de 2007 cuando se publicó un </span><i><span style="font-weight: normal;">paper</span></i><span style="font-weight: normal;"> con el diseño y la especificación a grandes rasgos de </span><b>Dynamo</b><span style="font-weight: normal;">, rompiendo con conceptos como la consistencia o modelo relacional. Su objetivo se definió claramente: escalabilidad y disponibilidad.</span></p> <p style="margin-bottom: 0cm;"><span style="font-weight: normal;">Garantizan en el 99.9% de los accesos, un tiempo de respuesta menor de 300ms, aunque el servicio esté caído.</span></p> <p style="margin-bottom: 0cm; font-weight: normal;"><a href="http://www.nosql.es/blog/nosql/amazon-dynamo.html">http://www.nosql.es/blog/nosql/amazon-dynamo.html</a></p> <p style="margin-bottom: 0cm;"><b>Google</b><span style="font-weight: normal;"> empezó el desarrollo de </span><b>BigTable </b><span style="font-weight: normal;">en 2004, un almacen de datos masivo, para proveer a sus propias aplicaciones. Cuenta con una API de uso público, por lo que cualquier desarrollador puede trabajar con él.</span></p> <p style="margin-bottom: 0cm;"><span style="font-weight: normal;">Uno de los clusters más grande de BigTable gestiona 6 petabytes de datos sobre miles de servidores.</span></p> <p style="margin-bottom: 0cm; font-weight: normal;"><a href="http://labs.google.com/papers/bigtable.html">http://labs.google.com/papers/bigtable.html</a></p> <p style="margin-bottom: 0cm; font-weight: normal;">El proyecto <b>Cassandra de Apache</b> desarrolla una base de datos distribuida de segunda generación altamente escalable.</p> <p style="margin-bottom: 0cm; font-weight: normal;">Está en uso en <span style="font-weight: bold;">Digg</span>, <span style="font-weight: bold;">Facebook</span>, <span style="font-weight: bold;">Twitter</span>, <span style="font-weight: bold;">Reddit, Rackspace, Cloudkick, Cisco, SimpleGEO, Ooyala, OpenX, etc.</span></p> <p style="margin-bottom: 0cm; font-weight: normal;">Según escribe Avinash Lakshaman, ingeniero de <span style="font-weight: bold;">Facebook</span>, <span style="font-weight: bold;">Cassandra </span>puede escribir hasta 50GB de datos en disco en tan solo 0.12ms, más de 2500 veces más rápido que MySQL.</p> <p style="margin-bottom: 0cm; font-weight: normal;"><a href="http://cassandra.apache.org/">http://cassandra.apache.org/</a></p> <p style="margin-bottom: 0cm;"><span style="font-weight: normal;"><span style="font-weight: bold;">Adobe </span>utiliza </span><b>Hbase</b><span style="font-weight: normal;">, porque según ellos necesitan un sistema de almacenamiento de datos estructurado, genérico, y a tiempo real, que pueda manejar cualquier volumen de datos, con tiempos de acceso menores a 50ms, sin pérdida de datos.</span></p><br /><a href="http://hstack.org/why-were-using-hbase-part-1/"><span style="font-weight: normal;">http://hstack.org/why-were-using-hbase-part-1/</span></a> <p style="margin-bottom: 0cm;"><a href="http://hstack.org/why-were-using-hbase-part-2/"><span style="font-weight: normal;">http://hstack.org/why-were-using-hbase-part-2/</span></a></p> <p style="margin-bottom: 0cm;"><span style="font-weight: normal;">Hay más proyectos en marcha: Hadoop, Voldemort, Dynomite, etc.</span></p> <p style="margin-bottom: 0cm;"><span style="font-weight: normal;">Dejo unos cuantos links que me han parecido interesantes.<br /></span></p><br /><a href="http://www.dosideas.com/noticias/base-de-datos/657-nosql-el-movimiento-en-contra-de-las-bases-de-datos.html">NoSQL: el movimiento en contra de las bases de datos</a><br /><a href="http://highscalability.com/blog/2010/3/16/1-billion-reasons-why-adobe-chose-hbase.html">1 billion reasons why adobe chose HBase</a><br /><a href="http://www.nosql.es/blog/nosql/google-bigtable.html">Google BigTable blog NoSql</a><br /><a href="http://kellblog.com/2010/02/24/the-database-tea-party-the-nosql-movement/">The Database tea party: The NoSQL Movement</a><br /><a href="http://blog.oskarsson.nu/2009/06/nosql-debrief.html">NoSQL debrief</a>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3767103802944828595.post-2873232225887907962011-01-19T08:47:00.000-08:002011-01-23T12:02:26.430-08:00Composición JS y CSS<!--[if !mso]> <style> v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} </style> <![endif]--><!--[if gte mso 9]><xml> <w:worddocument> <w:view>Normal</w:View> <w:zoom>0</w:Zoom> <w:trackmoves>false</w:TrackMoves> <w:trackformatting/> <w:hyphenationzone>21</w:HyphenationZone> <w:punctuationkerning/> <w:validateagainstschemas/> <w:saveifxmlinvalid>false</w:SaveIfXMLInvalid> <w:ignoremixedcontent>false</w:IgnoreMixedContent> <w:alwaysshowplaceholdertext>false</w:AlwaysShowPlaceholderText> <w:donotpromoteqf/> <w:lidthemeother>ES</w:LidThemeOther> <w:lidthemeasian>X-NONE</w:LidThemeAsian> <w:lidthemecomplexscript>X-NONE</w:LidThemeComplexScript> <w:compatibility> <w:breakwrappedtables/> <w:snaptogridincell/> <w:wraptextwithpunct/> <w:useasianbreakrules/> <w:dontgrowautofit/> <w:splitpgbreakandparamark/> <w:dontvertaligncellwithsp/> <w:dontbreakconstrainedforcedtables/> <w:dontvertalignintxbx/> <w:word11kerningpairs/> <w:cachedcolbalance/> </w:Compatibility> <m:mathpr> <m:mathfont val="Cambria Math"> <m:brkbin val="before"> <m:brkbinsub val="--"> <m:smallfrac val="off"> <m:dispdef/> <m:lmargin val="0"> <m:rmargin val="0"> <m:defjc val="centerGroup"> <m:wrapindent val="1440"> <m:intlim val="subSup"> <m:narylim val="undOvr"> </m:mathPr></w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:latentstyles deflockedstate="false" defunhidewhenused="true" defsemihidden="true" defqformat="false" defpriority="99" latentstylecount="267"> <w:lsdexception locked="false" priority="0" semihidden="false" unhidewhenused="false" qformat="true" name="Normal"> <w:lsdexception locked="false" priority="9" semihidden="false" unhidewhenused="false" qformat="true" name="heading 1"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 2"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 3"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 4"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 5"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 6"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 7"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 8"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 9"> <w:lsdexception locked="false" priority="39" name="toc 1"> <w:lsdexception locked="false" priority="39" name="toc 2"> <w:lsdexception locked="false" priority="39" name="toc 3"> <w:lsdexception locked="false" priority="39" name="toc 4"> <w:lsdexception locked="false" priority="39" name="toc 5"> <w:lsdexception locked="false" priority="39" name="toc 6"> <w:lsdexception locked="false" priority="39" name="toc 7"> <w:lsdexception locked="false" priority="39" name="toc 8"> <w:lsdexception locked="false" priority="39" name="toc 9"> <w:lsdexception locked="false" priority="35" qformat="true" name="caption"> <w:lsdexception locked="false" priority="10" semihidden="false" unhidewhenused="false" qformat="true" name="Title"> <w:lsdexception locked="false" priority="1" name="Default Paragraph Font"> <w:lsdexception locked="false" priority="11" semihidden="false" unhidewhenused="false" qformat="true" name="Subtitle"> <w:lsdexception locked="false" priority="22" semihidden="false" unhidewhenused="false" qformat="true" name="Strong"> <w:lsdexception locked="false" priority="20" semihidden="false" unhidewhenused="false" qformat="true" name="Emphasis"> <w:lsdexception locked="false" priority="59" semihidden="false" unhidewhenused="false" name="Table Grid"> <w:lsdexception locked="false" unhidewhenused="false" name="Placeholder Text"> <w:lsdexception locked="false" priority="1" semihidden="false" unhidewhenused="false" qformat="true" name="No Spacing"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 1"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 1"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 1"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 1"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 1"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 1"> <w:lsdexception locked="false" unhidewhenused="false" name="Revision"> <w:lsdexception locked="false" priority="34" semihidden="false" unhidewhenused="false" qformat="true" name="List Paragraph"> <w:lsdexception locked="false" priority="29" semihidden="false" unhidewhenused="false" qformat="true" name="Quote"> <w:lsdexception locked="false" priority="30" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Quote"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 1"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 1"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 1"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 1"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 1"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 1"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 1"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 1"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 2"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 2"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 2"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 2"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 2"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 2"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 2"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 2"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 2"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 2"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 2"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 2"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 2"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 2"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 3"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 3"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 3"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 3"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 3"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 3"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 3"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 3"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 3"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 3"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 3"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 3"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 3"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 3"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 4"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 4"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 4"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 4"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 4"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 4"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 4"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 4"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 4"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 4"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 4"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 4"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 4"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 4"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 5"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 5"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 5"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 5"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 5"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 5"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 5"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 5"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 5"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 5"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 5"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 5"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 5"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 5"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 6"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 6"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 6"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 6"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 6"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 6"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 6"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 6"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 6"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 6"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 6"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 6"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 6"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 6"> <w:lsdexception locked="false" priority="19" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Emphasis"> <w:lsdexception locked="false" priority="21" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Emphasis"> <w:lsdexception locked="false" priority="31" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Reference"> <w:lsdexception locked="false" priority="32" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Reference"> <w:lsdexception locked="false" priority="33" semihidden="false" unhidewhenused="false" qformat="true" name="Book Title"> <w:lsdexception locked="false" priority="37" name="Bibliography"> <w:lsdexception locked="false" priority="39" qformat="true" name="TOC Heading"> </w:LatentStyles> </xml><![endif]--><!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Tabla normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-qformat:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin-top:0cm; mso-para-margin-right:0cm; mso-para-margin-bottom:10.0pt; mso-para-margin-left:0cm; line-height:115%; mso-pagination:widow-orphan; font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin;} </style> <![endif]-->En una web una de las cosas más importantes es la velocidad de carga de cada una de las páginas que la componen, por lo que tenemos que limitar al mínimo las llamadas a otras url dentro de una página. <p class="MsoNormal">Propongo e siguiente escenario en desarrollo: tenemos diferentes archivos JS en el proyecto estructurados por funcionalidad, también tendremos ficheros con funciones comunes, y por último ficheros con funciones que se usan en más de una página.</p> <p class="MsoNormal">Si los dividimos de ese modo, es más fácil saber donde tenemos cada función, evitamos duplicarlas, y solo cargamos las necesarias para la página solicitada.</p> <p class="MsoNormal">La opción de tener todo el código JS en un solo fichero no es la más eficiente porque tendríamos que cargar un fichero mucho más pesado, con funciones que en realidad no vamos a usar en todas las páginas.</p> <p class="MsoNormal">Con un ejemplo se verá claro:</p> <p class="MsoNormal" style="text-align: center;" align="center"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6wS8ctDdxuN3BGkejB1oGByH17-ZUSvgmjihPNU5P5UbC4ljgKdkJTV3mgX534HDd40-Ao6NQ3kusgfoM_djqjCfMGF2NV4oS0Rv3doXETaab27WkZsZ6Jnk91luCfdQknBtfyjSGJEk/s1600/ficherosJS.GIF"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 237px; height: 74px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6wS8ctDdxuN3BGkejB1oGByH17-ZUSvgmjihPNU5P5UbC4ljgKdkJTV3mgX534HDd40-Ao6NQ3kusgfoM_djqjCfMGF2NV4oS0Rv3doXETaab27WkZsZ6Jnk91luCfdQknBtfyjSGJEk/s400/ficherosJS.GIF" alt="" id="BLOGGER_PHOTO_ID_5563940314687369618" border="0" /></a></p> <p class="MsoNormal">El fichero <i style="">validacionAlta.js</i> contendrá las funciones JS necesarias para el alta en la web, y solo se cargará en las páginas de alta. Por otro lado los ficheros <i style="">validacionBuscador.js</i> y <i style="">validacionLogin.js</i> contienen las funciones necesarias para el buscador y el login, y estas funcionalidades están en todas las páginas de la web, por lo que son necesarios en todas ellas. El fichero <i style="">validacionForm.js</i> tiene funciones varias que servirán para todos los formularios de la web.</p> <p class="MsoNormal">En desarrollo se cargarán por separado, pero en la web del alta los agruparemos de forma que haremos una sola llamada al fichero que podríamos llamar <i style="">composed_alta_20110101<fecha_actual>.js</fecha_actual></i>.</p> <p class="MsoNormal">La fecha actual servirá para tener diferentes versiones del fichero cada vez que lo generemos. De ese modo cuando hayan cambios y tengamos que subirlos a la web, el nuevo fichero se cargará con todos los cambios (pensemos que un fichero JS se guarda en la caché, y no se recarga a menos que se haga expresamente. Está claro que los usuarios al no conocer dichos cambios no harán el <i style="">ctrol+F5</i>).</p> <p class="MsoNormal">Lo primero que hice fue reestructurar los JS que teníamos en el proyecto en ese momento, de forma que quedaran bien separados por funcionalidades y no hubiera duplicados. </p> <p class="MsoNormal">Lo siguiente era revisar página a página los archivos JS que se estaban cargando, y pensar en las posibles agrupaciones.</p> <p class="MsoNormal">En las páginas se elegirán los JS a incluir en función de un booleano, en pseudo-código (en desarrollo) sería:</p> <div style="border: 1pt solid windowtext; padding: 1pt 4pt;font-family:courier new;"> <p class="MsoNormal" style="border: medium none; padding: 0cm; margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size:100%;">// Si estamos en una de las páginas del alta</span></p> <p class="MsoNormal" style="border: medium none; padding: 0cm; margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size:100%;">if (bJSAlta) {</span></p> <p class="MsoNormal" style="border: medium none; padding: 0cm; margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size:100%;"><span style=""> </span>include ‘validacionAlta.js’</span></p><p class="MsoNormal" style="border: medium none; padding: 0cm; margin-bottom: 0.0001pt; text-indent: 35.4pt; line-height: normal;"><span style="font-size:100%;">include ‘validacionBuscador.js’</span></p> <p class="MsoNormal" style="border: medium none; padding: 0cm; margin-bottom: 0.0001pt; text-indent: 35.4pt; line-height: normal;"><span style="font-size:100%;">include ‘validacionForms.js’</span></p> <p class="MsoNormal" style="border: medium none; padding: 0cm; margin-bottom: 0.0001pt; text-indent: 35.4pt; line-height: normal;"><span style="font-size:100%;">include ‘validacionLogin.js’</span></p> <p class="MsoNormal" style="border: medium none; padding: 0cm; margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size:100%;">// En cualquier otra página de la web</span></p> <p class="MsoNormal" style="border: medium none; padding: 0cm; margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size:100%;">else {</span></p> <p class="MsoNormal" style="border: medium none; padding: 0cm; margin-bottom: 0.0001pt; text-indent: 35.4pt; line-height: normal;"><span style="font-size:100%;">include ‘validacionBuscador.js’</span></p> <p class="MsoNormal" style="border: medium none; padding: 0cm; margin-bottom: 0.0001pt; text-indent: 35.4pt; line-height: normal;"><span style="font-size:100%;">include ‘validacionLogin.js’</span></p> <p class="MsoNormal" style="border: medium none; padding: 0cm; margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size:100%;">}</span></p> </div> <p class="MsoNormal"> </p> <p class="MsoNormal">Y en producción sería:</p> <div style="border: 1pt solid windowtext; padding: 1pt 4pt;font-family:courier new;"> <p class="MsoNormal" style="border: medium none; padding: 0cm; margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size:100%;">if (bJSAlta) {</span></p> <p class="MsoNormal" style="border: medium none; padding: 0cm; margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size:100%;"><span style=""> </span>include ‘composed_alta_<fecha_actual>.js’</fecha_actual></span></p> <p class="MsoNormal" style="border: medium none; padding: 0cm; margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size:100%;">else {</span></p> <p class="MsoNormal" style="border: medium none; padding: 0cm; margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size:100%;"><span style=""> </span>include ‘composed_all_<fecha_actual>.js’</fecha_actual></span></p> <p class="MsoNormal" style="border: medium none; padding: 0cm; margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size:100%;">}</span></p> </div> <p class="MsoNormal"> </p> <p class="MsoNormal">Para diferenciar entre desarrollo y producción podríamos tener una variable Application, bTest, que podríamos consultar para incluir un código u otro.</p> <p class="MsoNormal">A partir de aquí empezamos con la composición propiamente dicha. Lo he automatizado de con un proceso hecho en Java, para no tener cada vez que revisar los cambios hechos por cada uno de los componentes del equipo técnico.</p> <p class="MsoNormal">Ese proceso tiene programado lo siguiente:</p> <div style="border: 1pt solid windowtext; padding: 1pt 4pt;"> <p class="MsoNormal" style="border: medium none; padding: 0cm; margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size:100%;"><i style=""><span style=";font-family:";" >Parseo del fichero de desarrollo que contiene los includes de los JS por funcionalidad. Cada vez que encontremos el if guardamos los includes y como key el boleano</span></i></span><span style=";font-family:";font-size:100%;" >.</span></p> <p class="MsoNormal" style="border: medium none; padding: 0cm; margin-bottom: 0.0001pt; line-height: normal;"><span style=";font-family:";font-size:100%;" > </span></p> <p class="MsoNormal" style="border: medium none; padding: 0cm; margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size:100%;"><i style=""><span style=";font-family:";" >Merge de los archivos agrupados por la key de funcionalidad.</span></i></span></p> <p class="MsoNormal" style="border: medium none; padding: 0cm; margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size:100%;"><i style=""><span style=";font-family:";" > </span></i></span></p> <p class="MsoNormal" style="border: medium none; padding: 0cm; margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size:100%;"><i style=""><span style=";font-family:";" >Compresion de los ficheros agrupados.</span></i></span></p> <p class="MsoNormal" style="border: medium none; padding: 0cm; margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size:100%;"><i style=""><span style=";font-family:";" > </span></i></span></p> <p class="MsoNormal" style="border: medium none; padding: 0cm; margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size:100%;"><i style=""><span style=";font-family:";" >Modificamos el fichero que contiene los includes de los Compuestos JS, con la nueva fecha.</span></i></span></p> </div> <p class="MsoNormal"> </p> <p class="MsoNormal">De esta forma cuando hayan cambios en algún JS se habrá modificado el fichero que contiene los includes, y por lo tanto al parsearlo trabajaremos siempre con los últimos cambios.</p> <p class="MsoNormal">A continuación concatenamos los archivos por cada funcionalidad, y los comprimimos. </p> <p class="MsoNormal">La modificicación del fichero que contiene los includes de producción nos ahorra la tarea de cambiar la versión una vez generado el nuevo nombre del fichero compuesto.</p> <p class="MsoNormal">El <span style=""> </span>compresor que he utilizado es <a href="http://developer.yahoo.com/yui/compressor/">YUI Compressor</a>, que sirve tanto para JS como para CSS, y es gratis.</p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3767103802944828595.post-39123239250795789222011-01-17T03:17:00.000-08:002011-01-18T05:53:09.743-08:00Fechas en Java (Date, Calendar)Me parece que no soy la única persona que se queja de como está montado todo el tema de fechas en Java. Para obtener algunas fechas hay que hacer algunas operaciones extra que "ensucian" el código.<br /><br />Un día creé una clase propia Fecha para no tener que repetir el mismo código en diferentes clases. La verdad es que lo he ido montando en función de lo que iba necesitando, así que hay un poco de todo.<br /><br /><span style="font-family: courier new;">import java.text.ParseException;</span><br /> <span style="font-family: courier new;">import java.text.SimpleDateFormat;</span><br /> <span style="font-family: courier new;">import java.util.Calendar;</span><br /> <span style="font-family: courier new;">import java.util.Date;</span><br /> <br /> <span style="font-family: courier new;">public class Fecha {</span><br /> <br /> <span style="font-family: courier new;"><span style="color: rgb(255, 255, 255);">__</span>private static String formatoDefecto = "yyyy/MM/dd HH:mm:ss";</span><br /> <span style="font-family: courier new;"> </span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">public static Date getDate(String sFecha) {</span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">SimpleDateFormat sdf = new SimpleDateFormat(formatoDefecto);</span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">Date fecha;</span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">try {</span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">fecha = sdf.parse(sFecha);</span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">} catch (ParseException e) {</span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">fecha = null;</span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">}</span><br /> <span style="font-family: courier new;"> </span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">return fecha;</span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">}</span><br /> <span style="font-family: courier new;"> </span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">public static Date getDate(String sFecha, String formato) {</span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">SimpleDateFormat sdf = new SimpleDateFormat(formato);</span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">Date fecha;</span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">try {</span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">fecha = sdf.parse(sFecha);</span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">} catch (ParseException e) {</span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">fecha = null;</span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">}</span><br /> <span style="font-family: courier new;"></span> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">return fecha;</span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">}</span><br /> <span style="font-family: courier new;"> </span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">public static String getDateStringNDaysAgo(int nDaysAgo, String formato) {</span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">SimpleDateFormat sdf = new SimpleDateFormat(formato);</span><br /> <span style="font-family: courier new;"> </span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">Calendar dateEnd = Calendar.getInstance();</span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">dateEnd.add(Calendar.DATE, nDaysAgo * (-1));</span><br /> <span style="font-family: courier new;"> </span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">return sdf.format(dateEnd.getTimeInMillis());</span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">}</span><br /> <span style="font-family: courier new;"> </span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">public static Calendar getCalendarNDaysAgo(int nDaysAgo) {</span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">Calendar dateEnd = Calendar.getInstance();</span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">dateEnd.add(Calendar.DATE, nDaysAgo * (-1));</span><br /> <span style="font-family: courier new;"> </span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">return dateEnd;</span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">}</span><br /> <span style="font-family: courier new;"> </span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">public static Calendar getCalendar(String sFecha, String formato) {</span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">Calendar calendar = Calendar.getInstance();</span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">Date dateStart = getDate(sFecha,formato); </span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">calendar.setTime(dateStart);</span><br /> <span style="font-family: courier new;"> </span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">return calendar;</span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">}</span><br /> <br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">public static String getToday() {</span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">Date date = Calendar.getInstance().getTime();</span><br /> <span style="font-family: courier new;"></span> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">SimpleDateFormat sdf = new SimpleDateFormat(formatoDefecto);</span><br /> <span style="font-family: courier new;"> </span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">return sdf.format(date);</span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">}</span><br /> <span style="font-family: courier new;"> </span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">public static String getToday(String formato) {</span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);"></span><span style="font-family: courier new;">Date date = Calendar.getInstance().getTime();</span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">SimpleDateFormat sdf = new SimpleDateFormat(formato);</span><br /> <span style="font-family: courier new;"> </span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">return sdf.format(date);</span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">}</span><br /> <span style="font-family: courier new;"> </span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">public static String getDateString (Calendar cFecha) {</span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">SimpleDateFormat sdf = new SimpleDateFormat(formatoDefecto);</span><br /> <span style="font-family: courier new;"> </span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">return sdf.format(cFecha.getTimeInMillis());</span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">}</span><br /> <span style="font-family: courier new;"> </span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">public static String getDateString (Calendar cFecha, String formato) {</span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">SimpleDateFormat sdf = new SimpleDateFormat(formato);</span><br /> <span style="font-family: courier new;"> </span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">return sdf.format(cFecha.getTimeInMillis());</span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">}</span><br /> <span style="font-family: courier new;"> </span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">public static String getDateString (Date dFecha, String formato) {</span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">SimpleDateFormat sdf = new SimpleDateFormat(formato);</span><br /> <span style="font-family: courier new;"> </span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">return sdf.format(dFecha);</span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">}</span><br /> <span style="font-family: courier new;"> </span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">public static Calendar getCalendar(Date dFecha) {</span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">Calendar calendar = Calendar.getInstance();</span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">calendar.setTime(dFecha);</span><br /> <span style="font-family: courier new;"> </span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="color: rgb(255, 255, 255);"> </span><span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">return calendar;</span><br /> <span style="font-family: courier new; color: rgb(255, 255, 255);">__</span><span style="font-family: courier new;">}</span><br /> <span style="font-family: courier new;">}<br /><br /></span>Las clases que utilzo son <span style="font-style: italic; font-weight: bold;">java.util.Date</span> y <span style="font-style: italic; font-weight: bold;">java.util.Calendar</span>, y para el formato <span style="font-style: italic; font-weight: bold;">java.text.SimpleDateFormat</span>.<br /><br /><span style="font-weight: bold; font-style: italic;">Date getDate(String fecha)</span><br />A partir de un <span style="font-style: italic;">String </span>devolvemos un <span style="font-style: italic;">Date </span>con formato. El método está <span style="font-style: italic;">overide </span>dependiendo de si le explicito el formato o no.<br /><br />Para esto utilizamos la clase <span style="font-style: italic; font-weight: bold;">SimpleDateFormat</span>, y transformamos a <span style="font-style: italic;">Date </span>con el método <span style="font-style: italic;">parse() </span>de la misma.<br /><br /><span style="font-weight: bold; font-style: italic;">Calendar getCalendar(Date fecha)<br /></span>A partir de una fecha tipo <span style="font-weight: bold; font-style: italic;">Date</span> devolvemos una fecha tipo <span style="font-weight: bold; font-style: italic;">Calendar</span>. Este método también está <span style="font-style: italic;">overide </span>dependiendo de si le explicito el formato o no.<br /><span style="font-weight: bold; font-style: italic;"></span><br /><span style="font-weight: bold; font-style: italic;">Calendar getCalendarNDaysAgo(int ndaysAgo)</span><br />En este método obtenemos la fecha y le restamos los días especificados, y devolvemos el <span style="font-style: italic;">Calendar</span>.<br /><span style="font-weight: bold; font-style: italic;"><br />String getDateStringNDaysAgo(int ndaysAgo, format)</span><br />En este caso devolvemos un <span style="font-style: italic;">String </span>con una fecha anterior a la actual. Así que con <span style="font-style: italic; font-weight: bold;">SimpleDateFormat </span>obtenemos la fecha, y devolvemos la fecha en <span style="font-style: italic;">String </span>con el formato deseado.<br /><br /><span style="font-weight: bold; font-style: italic;">String getToday()</span><br />Devuelve un String con la fecha actual. El método está <span style="font-style: italic;">overide </span>dependiendo de si le explicito el formato o no.<br /><br /><span style="font-weight: bold; font-style: italic;">String getDateString (Calendar cFecha)</span><br />Devuelve un String partiendo de una fecha <span style="font-style: italic; font-weight: bold;">Calendar</span>. Este método también está <span style="font-style: italic;">overide </span>para explicitar el formato, o si le pasamos la fecha <span style="font-weight: bold; font-style: italic;">Date</span>.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3767103802944828595.post-85452215826544972242011-01-11T02:50:00.000-08:002011-01-16T04:28:15.699-08:00SQL: row_number over partitionHoy voy a hacer una entrada sobre una consulta en <span style="font-weight: bold;">Oracle</span> que me parece muy interesante, utilizando la funcion <i style=""><span style="font-weight: bold;">row_number over partition</span></i>. <p class="MsoNormal">Se utiliza para ordenar registros en grupos.<br /></p><p class="MsoNormal">Lo más sencillo es que lo explique con un ejemplo: Necesitamos el primer curso publicado por un autor.</p> <p class="MsoNormal">Nos ponemos en situación... un autor tiene una serie de cursos publicados, tenemos que hacer una consulta de forma que tengamos los cursos de cada autor, y sacar de alguna forma cual fue el primero que publicó.</p> <p class="MsoNormal">Podríamos hacer la consulta completa de todos los autores y sus cursos, y por programa sacar el más reciente de cada uno. Pero esa consulta tiene un coste muy alto, y hay que añadirle además el coste de recorrer todo el resultset.</p> <p class="MsoNormal">La mejor opción sería utilizar el <i style="font-weight: bold;">row_number over partition</i>:</p><p class="MsoNormal"><span style="font-family:courier new;"> <span style="font-size:85%;">row_number() over (order by col_1 [, col_2</span></span><span style="font-size:85%;">...])</span></p><p class="MsoNormal"><span style=";font-family:courier new;font-size:85%;" > row_number() over (partition by col_n [, col_m...] order by col_1 [, col_2</span><span style="font-size:85%;">...])</span></p><br />En el ejemplo la consulta sería:<br /><br /><span style=";font-family:courier new;font-size:85%;" >select id_autor, nombre_autor, id_curso, titulo_curso<br /></span><span style=";font-family:courier new;font-size:85%;" >from (</span><span style="font-size:85%;"><br /></span><span style=";font-family:courier new;font-size:85%;" ><span style="color: rgb(255, 255, 255);">__</span>select cursos.id_autor, nombre_autor, id_curso,<br /></span><span style=";font-family:courier new;font-size:85%;" ><span style="color: rgb(255, 255, 255);">__</span></span><span style=";font-family:courier new;font-size:85%;" ><span style="color: rgb(255, 255, 255);">__</span></span><span style=";font-family:courier new;font-size:85%;" >titulo_curso, fecha_publi<br /></span><span style=";font-family:courier new;font-size:85%;" ><span style="color: rgb(255, 255, 255);">__</span></span><span style=";font-family:courier new;font-size:85%;" ><span style="color: rgb(255, 255, 255);">__<span style="color: rgb(0, 0, 0);">row_number() over<br /></span></span></span><span style=";font-family:courier new;font-size:85%;" ><span style="color: rgb(255, 255, 255);">__</span></span><span style=";font-family:courier new;font-size:85%;" ><span style="color: rgb(255, 255, 255);">__</span></span><span style=";font-family:courier new;font-size:85%;" ><span style="color: rgb(255, 255, 255);">__</span></span><span style=";font-family:courier new;font-size:85%;" ><span style="color: rgb(255, 255, 255);"><span style="color: rgb(0, 0, 0);">(partition by cursos.id_autor order by fecha_publi) ncurso</span></span></span><span style="font-size:85%;"><br /></span><span style=";font-family:courier new;font-size:85%;" ><span style="color: rgb(255, 255, 255);">__<span style="color: rgb(0, 0, 0);">from autores<br /></span></span></span><span style=";font-family:courier new;font-size:85%;" ><span style="color: rgb(255, 255, 255);">__<span style="color: rgb(0, 0, 0);">left join cursos<br /></span></span></span><span style=";font-family:courier new;font-size:85%;" ><span style="color: rgb(255, 255, 255);">__<span style="color: rgb(0, 0, 0);">on autores.id_autor=cursos.id_autor) cursos_autor</span></span></span><span style=";font-family:courier new;font-size:85%;" ><span style="color: rgb(255, 255, 255);"><span style="color: rgb(0, 0, 0);"><br />where ncurso=1;<br /><br /></span></span></span><p class="MsoNormal">Vemos que hacemos la join entre cursos y autores para relacionarlos, y en un campo asginamos un <i style="">row_number</i> particionado por el <i style="">id_autor</i>, y ordenado por la <i style="">f</i><i style="">echa_publicacion</i>. La subconsulta con el <i style="">row_number </i>devuelve lo siguiente:</p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEsnRtOiw8jK9nsaWWztvUclTjS_0EUQfxYjHlVZa0tRwdt5A1i26uekdvGZFul78yr2WLh3qL8FQyPMLJmXRu5RhCjZdZAu2JXkZG0a7gTYdb1tPJVgxg1C3U16G3BHViW_xB91y7_lc/s1600/resultset_row_number.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 126px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEsnRtOiw8jK9nsaWWztvUclTjS_0EUQfxYjHlVZa0tRwdt5A1i26uekdvGZFul78yr2WLh3qL8FQyPMLJmXRu5RhCjZdZAu2JXkZG0a7gTYdb1tPJVgxg1C3U16G3BHViW_xB91y7_lc/s400/resultset_row_number.JPG" alt="" id="BLOGGER_PHOTO_ID_5560884876024667378" border="0" /></a><p class="MsoNormal">Vemos que el campo <i style="">ncurso</i> es un número correlativo por autor, y se asigna por el orden de la <i style="">fecha_publicacion</i>. </p> <p class="MsoNormal">En la consulta completa vemos que hemos seleccionado solo los cursos que tienen <i style="">ncurso</i> igual a 1, es decir, el primero que son los que tienen la fecha más antigua.</p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3767103802944828595.post-56014232420114759092010-12-28T09:35:00.000-08:002011-01-16T04:28:48.127-08:00Social Graph Facebook: Acceso a datos de usuariosEsta última semana he estado trabajando con el <span style="font-weight: bold;">Social Graph</span> de <span style="font-weight: bold;">Facebook</span> para agregar alguna funcionalidad de <span style="font-weight: bold;">Facebook</span> a la web en la que trabajo. Voy a postear un pequeño resumen de lo que he encontrado, dividido en varios post. <p class="MsoNormal" style="text-align: justify;">El core de <span style="font-weight: bold;">Facebook </span>es el<span style="font-weight: bold;"> </span><i style="font-weight: bold;">social graph</i>. La API graph presenta una vista sobre el <i style="">social graph</i> de Facebook, donde se representan los objetos del <i style="">graph</i> (ej. gente, fotos, eventos y páginas), y las conexiones entre ellos (ej. relaciones entre amigos, contenido compartido, y tags de fotos).</p> <p class="MsoNormal">Cada objeto en el <i style="font-weight: bold;">social graph</i> tiene un ID único. Se puede acceder a las propiedades de cada objeto mediante ese ID.</p> <p class="MsoNormal">Por ejemplo, si accedemos al muro de nuestro facebook y observamos la url, podemos encontrar nuestro propio id:</p> <p class="MsoNormal"><a href="http://www.facebook.com/profile.php?id=100000602488758&sk=wall">http://www.facebook.com/profile.php?id=100000602488758&sk=wall</a></p> <p class="MsoNormal">Si hacemos la petición siguiente obtenemos nuestra información pública con el ID que tenemos:</p> <p class="MsoNormal"><a href="https://graph.facebook.com/100000602488758">https://graph.facebook.com/100000602488758</a></p> {<br />"id": "100000602488758",<br />"name": "Inma Tecnico Mxm",<br />"first_name": "Inma",<br />"last_name": "Tecnico Mxm",<br />"link": "http://www.facebook.com/people/Inma-Tecnico-Mxm/100000602488758",<br />"gender": "female",<br />"locale": "es_ES"<br />} <p class="MsoNormal">La foto del usuario es información pública y podemos obtenerla con la siguiente petición:</p> <p class="MsoNormal"><a href="https://graph.facebook.com/100000602488758/picture/">https://graph.facebook.com/100000602488758/picture/</a></p> <p class="MsoNormal">Podemos inlcuir el parámetro <i style="">type</i>, para elegir el tamaño:</p> <p class="MsoNormal"><a href="https://graph.facebook.com/100000602488758/picture/?type=small">https://graph.facebook.com/100000602488758/picture/?type=small</a></p> <p class="MsoNormal"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://graph.facebook.com/100000602488758/picture/?type=small"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 50px; height: 38px;" src="https://graph.facebook.com/100000602488758/picture/?type=small" alt="" border="0" /></a></p> <p class="MsoNormal">Los posibles valores son: <i style="">square</i> (50x50)<i style="">, small</i> (50x?) y <i style="">large</i> (200x?).</p> <p class="MsoNormal">Para acceder al resto de la información pública necesitamos un <i style="">access_token</i> y autorización del usuario.</p> <p class="MsoNormal">Si necesitamos otra información específica de un usuario, como su dirección de correo o el historial de trabajo, se requiere una autorización con “<i style="font-weight: bold;">extended permissions</i>”.</p> <p class="MsoNormal"><span style=""> </span><span style="font-size:130%;"><b style="">Permisos</b></span></p> <p class="MsoNormal">Existen tres niveles de permisos: acceso a la información básica del usuario, acceso a datos privados del usuario, y acceso a los amigos del usuario.</p> <p class="MsoNormal"><b style="">Acceso a la información básica </b></p> <p class="MsoNormal">Con la autorización para el acceso a la información básica del usuario tenemos el nombre, la foto de perfil, el sexo y la lista de amigos de este usuario.</p> <p class="MsoNormal"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhK4kodiG3qq6P84WEw2LVoPHxpdptt_uVOecUFklmghXdPTOCQn1hsiVDc5MMUazlr5EjwGTO-VPxkXc9mhgnYV-W76BZJrdcFjqoE8tU7bdJve0tgJQjpAzO5xorIxPwjXr9S6RJBlpQ/s1600/permisosInfoBasica.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 174px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhK4kodiG3qq6P84WEw2LVoPHxpdptt_uVOecUFklmghXdPTOCQn1hsiVDc5MMUazlr5EjwGTO-VPxkXc9mhgnYV-W76BZJrdcFjqoE8tU7bdJve0tgJQjpAzO5xorIxPwjXr9S6RJBlpQ/s400/permisosInfoBasica.JPG" alt="" id="BLOGGER_PHOTO_ID_5555789931340883810" border="0" /></a></p> <p class="MsoNormal">Para solicitar permisos a un usuario para acceder a su información pública necesitamos una aplicación en <span style="font-weight: bold;">facebook</span>, y una página web donde redirigirnos una vez haya obtenido el permiso.</p> <p class="MsoNormal">En los settings de la aplicación obtenemos el id de la aplicación, y le indicaremos la página de redirección (Apartado Facebook Integration -> Canvas URL).</p> <p class="MsoNormal">La canvas url es una url del tipo <a href="http://www.immadeveloper.com/callbackFacebook/">http://www.ImmaDeveloper.com/callbackFacebook/</a>, que redirecciona al archivo que hayamos creado en nuestro servidor, para la vuelta de la request de los permisos.</p> <p class="MsoNormal">Con estos datos podemos solicitar permiso a los datos públicos con la siguiente url:</p> <p class="MsoNormal"><a href="http://graph.facebook.com/oauth/authorize?client_id=???????????&redirect_uri=http://www.InmaDeveloper.com/callbackFacebook/">http://graph.facebook.com/oauth/authorize?client_id=</a><a href="https://graph.facebook.com/oauth/access_token?client_id=1740266092710&redirect_uri=http://www.%20ImmaDeveloper.com/callbackFacebook/&client_secret=31111f39c0bd86a34affdc6&code=2.zQNpk1ahT30YbHWTQ__.3600.92940000-707637371%257CD4Gey5ISqUGacG2JWvo4">1740266092710</a><a href="http://graph.facebook.com/oauth/authorize?client_id=???????????&redirect_uri=http://www.InmaDeveloper.com/callbackFacebook/">&redirect_uri=http://www.InmaDeveloper.com/callbackFacebook/</a></p> <p class="MsoNormal">Si el usuario nos concede el permiso nos llegará la variable <i style="">code</i> con un valor:</p> <p class="MsoNormal"><a href="http://www.%20immadeveloper.com/callbackFacebook?code=2.zQNpk1ahT30YbHWTQ__.3600.92940000-707637371%257CD4Gey5ISqUGacG2JWvo4">http://www.ImmaDeveloper.com/callbackFacebook?code=2.zQNpk1ahT30YbHWTQ__.3600.92940000-707637371%257CD4Gey5ISqUGacG2JWvo4</a></p> <p class="MsoNormal">Si el usuario no nos lo concede, nos llegan parámetros con el error.</p> <p class="MsoNormal"><span style="" lang="EN-US"><a href="http://www.%20immadeveloper.com/callbackFacebook?error_reason=user_denied&error=access_denied&error_description=The+user+denied+your+request">http://www. ImmaDeveloper.com/callbackFacebook?error_reason=user_denied&error=access_denied&error_description=The+user+denied+your+request</a>.</span></p> <p class="MsoNormal">Si tenemos permiso del usuario podemos obtener el <i style="">access_token</i> con la siguiente url (el <i style="">client secret</i> lo tenemos en las settings de la aplicación, junto al id de la aplicación):</p> <p class="MsoNormal"><a href="https://graph.facebook.com/oauth/access_token?client_id=1740266092710&redirect_uri=http://www.%20ImmaDeveloper.com/callbackFacebook/&client_secret=31111f39c0bd86a34affdc6&code=2.zQNpk1ahT30YbHWTQ__.3600.92940000-707637371%257CD4Gey5ISqUGacG2JWvo4">https://graph.facebook.com/oauth/access_token?client_id=1740266092710&redirect_uri=http://www. ImmaDeveloper.com/callbackFacebook/&client_secret=31111f39c0bd86a34affdc6&code=2.zQNpk1ahT30YbHWTQ__.3600.92940000-707637371%257CD4Gey5ISqUGacG2JWvo4</a></p> <p class="MsoNormal">Con el <i style="">access_token</i> que nos devuelve esta petición, podemos acceder a la información pública del usuario de la siguiente forma:</p> <p class="MsoNormal"><a href="https://graph.facebook.com/707637371?access_token=174026609282710%7C2.zQNpkhmlaX1ahT30YbHWTQ__.3600.1292940000-707637371%7CfGOfoW9OISEV5j5CF70NWQzjiI8&expires=6470">https://graph.facebook.com/100000602488758?access_token=17402282710|2.zQNpmlaX1ahT30YbHWTQ__.3600.140000-707637371|fGOfoWV5j5CF70NWzjiI8&expires=6470</a></p> <p class="MsoNormal">Y el resultado sería el siguiente:</p>{<br />"id": "707637371",<br />"name": "Inma Tecnico Mxm",<br />"first_name": "Inma",<br />"last_name": "Tecnico Mxm",<br />"link": "http://www.facebook.com/profile.php?id=100000602488758",<br />"hometown":<br />{<br />"id": "106287062743373",<br />"name": "Barcelona, Spain"<br />},<br />"timezone": 1,<br />"locale": "en_US",<br />"verified": true,<br />"updated_time": "2010-12-05T12:36:08+0000"<br />}<p class="MsoNormal"> </p> <p class="MsoNormal">(En este punto debo explicar que el dominio y los valores de los parámetros están modificados para proteger mi propio perfil, así que las url no funcionan. Se debe probar con un usuario y una aplicación propias :P).</p> <p class="MsoNormal"> </p> <p class="MsoNormal"><b style="">Acceso a la información privada </b></p> <p class="MsoNormal">Para conseguir el acceso a datos privados del usuario tenemos que hacer una petición de autorización al usuario con la lista de los permisos requeridos.</p> <p class="MsoNormal">Por ejemplo, si necesitamos el email del usuario, la ventana de autorización sería:</p><p class="MsoNormal"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-ae58Ysx3w6O7ufkKiPnxjus5uBDb-4Ic65rAntTH34SFBvLSlz7s6Lr6NmJAQoHbmJGI4dv36xjo22oxtvr863ojQ0uEz0_7vfG4gDimCAEt27eHe1mkxz5tRNG04fd3sLWVZCXOzSg/s1600/permisosInfoPrivada.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 174px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-ae58Ysx3w6O7ufkKiPnxjus5uBDb-4Ic65rAntTH34SFBvLSlz7s6Lr6NmJAQoHbmJGI4dv36xjo22oxtvr863ojQ0uEz0_7vfG4gDimCAEt27eHe1mkxz5tRNG04fd3sLWVZCXOzSg/s400/permisosInfoPrivada.JPG" alt="" id="BLOGGER_PHOTO_ID_5555791181981572370" border="0" /></a></p> <p class="MsoNormal"><span style=""><br /></span></p> <p class="MsoNormal">En el caso de que solicitaramos más permisos, se vería la lista completa en la ventana. </p> <p class="MsoNormal">Se le añade a la url de solicitud de permisos el parámetro <i style="">scope,</i> y como valor la lista de permisos que queramos solicitar separados por comas. </p> <p class="MsoNormal">En el ejemplo solicitamos el email del usuario. La url sería:</p> <p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style=";font-family:";font-size:100%;" ><a href="https://graph.facebook.com/oauth/authorize?client_id=1740266092710&redirect_uri=http://www.%20ImmaDeveloper.com/callbackFacebook/&scope=email">https://graph.facebook.com/oauth/authorize?client_id=1740266092710&redirect_uri=http://www.<span style=";font-family:";" > </span>ImmaDeveloper.com/callbackFacebook/&scope=email</a></span></p> <p class="MsoNormal"> </p> <p class="MsoNormal">Si el usuario nos autoriza nos devolvería un valor en la variable <i style="">code</i>, y conseguiríamos el <i style="">access_token</i> como lo hemos hecho para los permisos de la información básica.</p> <p class="MsoNormal">Y en el resultado obtendríamos incluido el email:</p>{<br />"id": "707637371",<br />"name": "Inma Tecnico Mxm",<br />"first_name": "Inma",<br />"last_name": "Tecnico Mxm",<br />"link": "http://www.facebook.com/profile.php?id=100000602488758",<br />"hometown":<br />{<br />"id": "106287062743373",<br />"name": "Barcelona, Spain"<br />},<br />"email": "inmaTecnico@gmail.com",<br />"timezone": 1,<br />"locale": "en_US",<br />"verified": true,<br />"updated_time": "2010-12-05T12:36:08+0000"<br />}<p class="MsoNormal"> </p> <p class="MsoNormal">Las tablas con las <i style="">extended permissions</i> están en <a href="http://developers.facebook.com/docs/authentication/permissions">http://developers.facebook.com/docs/authentication/permissions</a></p> <p class="MsoNormal">Debemos tener en cuenta que las aplicaciones que más permisos solicitan, tienden a tener un menor rate de clicks en la ventana de autorización. Es por esto, que es conveniente solicitar solo los permisos necesarios para ese momento, siempre se pueden pedir otros permisos más tarde.</p><p class="MsoNormal"><br /></p> <p class="MsoNormal">En este post he explicado como obtener información pública y privada de un usuario, muy útil si queremos incorporar datos en nuestra web de usuarios. Por ejemplo, yo lo utilizaré para incorporar la foto de facebook en el alta de nuestros usuarios.</p> <p class="MsoNormal">En la siguiente entrada explicaré como solicitar permiso para hacer un post en el muro de un usuario desde nuestra web (con su permiso, claro ;)), y como utilizar los datos de <span style="font-weight: bold;">facebook </span>para el alta en nuestra web.</p> <p class="MsoNormal">Link relacionado: <a href="http://developers.facebook.com/docs/authentication">http://developers.facebook.com/docs/authentication</a></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3767103802944828595.post-89470827656150645422010-12-15T07:23:00.000-08:002010-12-15T07:34:11.735-08:00Inicio Blog Desarrollo WebHola,<br /><br />Empiezo este blog con la idea de escribir sobre proyectos, ideas y noticias que me surjan en el trabajo.<br /><br />Soy ingeniera superior informática, y trabajo como programadora en una web de Grupo Intercom.<br /><br />A priori puede parecer que una web no tiene mucho trabajo, al final es mostrar datos guardados en una BD, no? Pero nada más lejos de la realidad. En este momento en el que Internet es uno de los medios de comunicación más usados hay que estar a la última, y eso requiere investigación y desarrollo.<br /><br />=)Unknownnoreply@blogger.com1