<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html>
<html b:version='2' class='v2' expr:dir='data:blog.languageDirection' xmlns='http://www.w3.org/1999/xhtml' xmlns:b='http://www.google.com/2005/gml/b' xmlns:data='http://www.google.com/2005/gml/data' xmlns:expr='http://www.google.com/2005/gml/expr'>
<head>
<meta content='IE=EmulateIE7' http-equiv='X-UA-Compatible'/>
<b:if cond='data:blog.isMobile'>
<meta content='width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0' name='viewport'/>
<b:else/>
<meta content='width=1100' name='viewport'/>
</b:if>
<b:include data='blog' name='all-head-content'/>
<title><data:blog.pageTitle/></title>
<style>
/*
* Derived from einaros's Sons of Obsidian theme at
* http://studiostyl.es/schemes/son-of-obsidian by
* Alex Ford of CodeTunnel:
* http://CodeTunnel.com/blog/post/71/google-code-prettify-obsidian-theme
*/
.str
{
color: #EC7600;
}
.kwd
{
color: #93C763;
}
.com
{
color: #66747B;
}
.typ
{
color: #678CB1;
}
.lit
{
color: #FACD22;
}
.pun
{
color: #F1F2F3;
}
.pln
{
color: #F1F2F3;
}
.tag
{
color: #8AC763;
}
.atn
{
color: #E0E2E4;
}
.atv
{
color: #EC7600;
}
.dec
{
color: purple;
}
pre.prettyprint
{
border: 0px solid #888;
}
ol.linenums
{
margin-top: 0;
margin-bottom: 0;
}
.prettyprint {
background: #000;
}
li.L0, li.L1, li.L2, li.L3, li.L4, li.L5, li.L6, li.L7, li.L8, li.L9
{
color: #555;
list-style-type: decimal;
}
li.L1, li.L3, li.L5, li.L7, li.L9 {
background: #111;
}
@media print
{
.str
{
color: #060;
}
.kwd
{
color: #006;
font-weight: bold;
}
.com
{
color: #600;
font-style: italic;
}
.typ
{
color: #404;
font-weight: bold;
}
.lit
{
color: #044;
}
.pun
{
color: #440;
}
.pln
{
color: #000;
}
.tag
{
color: #006;
font-weight: bold;
}
.atn
{
color: #404;
}
.atv
{
color: #060;
}
}
</style>
<b:skin><![CDATA[/*
-----------------------------------------------
Blogger Template Style
Name: Simple
Designer: Josh Peterson
URL: www.noaesthetic.com
----------------------------------------------- */
/* Variable definitions
====================
<Variable name="keycolor" description="Main Color" type="color" default="#66bbdd" value="#cc6611"/>
<Group description="Page Text" selector="body">
<Variable name="body.font" description="Font" type="font"
default="normal normal 12px Arial, Tahoma, Helvetica, FreeSans, sans-serif" value="normal normal 12px Arial, Tahoma, Helvetica, FreeSans, sans-serif"/>
<Variable name="body.text.color" description="Text Color" type="color" default="#222222" value="#222222"/>
</Group>
<Group description="Backgrounds" selector=".body-fauxcolumns-outer">
<Variable name="body.background.color" description="Outer Background" type="color" default="#66bbdd" value="#eeaa00"/>
<Variable name="content.background.color" description="Main Background" type="color" default="#ffffff" value="#ffffff"/>
<Variable name="header.background.color" description="Header Background" type="color" default="transparent" value="#cc6611"/>
</Group>
<Group description="Links" selector=".main-outer">
<Variable name="link.color" description="Link Color" type="color" default="#2288bb" value="#cc6611"/>
<Variable name="link.visited.color" description="Visited Color" type="color" default="#888888" value="#888888"/>
<Variable name="link.hover.color" description="Hover Color" type="color" default="#33aaff" value="#ff9900"/>
</Group>
<Group description="Blog Title" selector=".header h1">
<Variable name="header.font" description="Font" type="font"
default="normal normal 60px Arial, Tahoma, Helvetica, FreeSans, sans-serif" value="normal normal 60px Arial, Tahoma, Helvetica, FreeSans, sans-serif"/>
<Variable name="header.text.color" description="Title Color" type="color" default="#3399bb" value="#ffffff"/>
</Group>
<Group description="Blog Description" selector=".header .description">
<Variable name="description.text.color" description="Description Color" type="color"
default="#777777" value="#ffffff"/>
</Group>
<Group description="Tabs Text" selector=".tabs-inner .widget li a">
<Variable name="tabs.font" description="Font" type="font"
default="normal normal 14px Arial, Tahoma, Helvetica, FreeSans, sans-serif" value="normal normal 14px Arial, Tahoma, Helvetica, FreeSans, sans-serif"/>
<Variable name="tabs.text.color" description="Text Color" type="color" default="#999999" value="#999999"/>
<Variable name="tabs.selected.text.color" description="Selected Color" type="color" default="#000000" value="#000000"/>
</Group>
<Group description="Tabs Background" selector=".tabs-outer .PageList">
<Variable name="tabs.background.color" description="Background Color" type="color" default="#f5f5f5" value="#f5f5f5"/>
<Variable name="tabs.selected.background.color" description="Selected Color" type="color" default="#eeeeee" value="#eeeeee"/>
</Group>
<Group description="Post Title" selector="h3.post-title, .comments h4">
<Variable name="post.title.font" description="Font" type="font"
default="normal normal 22px Arial, Tahoma, Helvetica, FreeSans, sans-serif" value="normal normal 22px Arial, Tahoma, Helvetica, FreeSans, sans-serif"/>
</Group>
<Group description="Date Header" selector=".date-header">
<Variable name="date.header.color" description="Text Color" type="color"
default="$(body.text.color)" value="$(body.text.color)"/>
<Variable name="date.header.background.color" description="Background Color" type="color"
default="transparent" value="transparent"/>
</Group>
<Group description="Post Footer" selector=".post-footer">
<Variable name="post.footer.text.color" description="Text Color" type="color" default="#666666" value="#666666"/>
<Variable name="post.footer.background.color" description="Background Color" type="color"
default="#f9f9f9" value="#f9f9f9"/>
<Variable name="post.footer.border.color" description="Shadow Color" type="color" default="#eeeeee" value="#eeeeee"/>
</Group>
<Group description="Gadgets" selector="h2">
<Variable name="widget.title.font" description="Title Font" type="font"
default="normal bold 11px Arial, Tahoma, Helvetica, FreeSans, sans-serif" value="normal bold 11px Arial, Tahoma, Helvetica, FreeSans, sans-serif"/>
<Variable name="widget.title.text.color" description="Title Color" type="color" default="#000000" value="#000000"/>
<Variable name="widget.alternate.text.color" description="Alternate Color" type="color" default="#999999" value="#999999"/>
</Group>
<Group description="Images" selector=".main-inner">
<Variable name="image.background.color" description="Background Color" type="color" default="#ffffff" value="#ffffff"/>
<Variable name="image.border.color" description="Border Color" type="color" default="#eeeeee" value="#eeeeee"/>
<Variable name="image.text.color" description="Caption Text Color" type="color" default="$(body.text.color)" value="$(body.text.color)"/>
</Group>
<Group description="Accents" selector=".content-inner">
<Variable name="body.rule.color" description="Separator Line Color" type="color" default="#eeeeee" value="#eeeeee"/>
<Variable name="tabs.border.color" description="Tabs Border Color" type="color" default="$(body.rule.color)" value="$(body.rule.color)"/>
</Group>
<Variable name="body.background" description="Body Background" type="background"
color="$(body.background.color)" default="$(color) none repeat scroll top left" value="$(color) none repeat scroll top left"/>
<Variable name="body.background.override" description="Body Background Override" type="string" default="" value=""/>
<Variable name="body.background.gradient.cap" description="Body Gradient Cap" type="url"
default="url(//www.blogblog.com/1kt/simple/gradients_light.png)" value="url(http://www.blogblog.com/1kt/simple/gradients_light.png)"/>
<Variable name="body.background.gradient.tile" description="Body Gradient Tile" type="url"
default="url(//www.blogblog.com/1kt/simple/body_gradient_tile_light.png)" value="url(http://www.blogblog.com/1kt/simple/body_gradient_tile_light.png)"/>
<Variable name="content.background.color.selector" description="Content Background Color Selector" type="string" default=".content-inner" value=".content-inner"/>
<Variable name="content.padding" description="Content Padding" type="length" default="10px" value="10px"/>
<Variable name="content.padding.horizontal" description="Content Horizontal Padding" type="length" default="$(content.padding)" value="$(content.padding)"/>
<Variable name="content.shadow.spread" description="Content Shadow Spread" type="length" default="40px" value="40px"/>
<Variable name="content.shadow.spread.webkit" description="Content Shadow Spread (WebKit)" type="length" default="5px" value="5px"/>
<Variable name="content.shadow.spread.ie" description="Content Shadow Spread (IE)" type="length" default="10px" value="10px"/>
<Variable name="main.border.width" description="Main Border Width" type="length" default="0" value="0"/>
<Variable name="header.background.gradient" description="Header Gradient" type="url" default="none" value="url(http://www.blogblog.com/1kt/simple/gradients_light.png)"/>
<Variable name="header.shadow.offset.left" description="Header Shadow Offset Left" type="length" default="-1px" value="1px"/>
<Variable name="header.shadow.offset.top" description="Header Shadow Offset Top" type="length" default="-1px" value="2px"/>
<Variable name="header.shadow.spread" description="Header Shadow Spread" type="length" default="1px" value="3px"/>
<Variable name="header.padding" description="Header Padding" type="length" default="30px" value="30px"/>
<Variable name="header.border.size" description="Header Border Size" type="length" default="1px" value="0"/>
<Variable name="header.bottom.border.size" description="Header Bottom Border Size" type="length" default="$(header.border.size)" value="$(header.border.size)"/>
<Variable name="header.border.horizontalsize" description="Header Horizontal Border Size" type="length" default="0" value="0"/>
<Variable name="description.text.size" description="Description Text Size" type="string" default="140%" value="140%"/>
<Variable name="tabs.margin.top" description="Tabs Margin Top" type="length" default="0" value="0"/>
<Variable name="tabs.margin.side" description="Tabs Side Margin" type="length" default="30px" value="30px"/>
<Variable name="tabs.background.gradient" description="Tabs Background Gradient" type="url"
default="url(//www.blogblog.com/1kt/simple/gradients_light.png)" value="url(http://www.blogblog.com/1kt/simple/gradients_light.png)"/>
<Variable name="tabs.border.width" description="Tabs Border Width" type="length" default="1px" value="1px"/>
<Variable name="tabs.bevel.border.width" description="Tabs Bevel Border Width" type="length" default="1px" value="1px"/>
<Variable name="date.header.padding" description="Date Header Padding" type="string" default="inherit" value="inherit"/>
<Variable name="date.header.letterspacing" description="Date Header Letter Spacing" type="string" default="inherit" value="inherit"/>
<Variable name="date.header.margin" description="Date Header Margin" type="string" default="inherit" value="inherit"/>
<Variable name="post.margin.bottom" description="Post Bottom Margin" type="length" default="25px" value="25px"/>
<Variable name="image.border.small.size" description="Image Border Small Size" type="length" default="2px" value="2px"/>
<Variable name="image.border.large.size" description="Image Border Large Size" type="length" default="5px" value="5px"/>
<Variable name="page.width.selector" description="Page Width Selector" type="string" default=".region-inner" value=".region-inner"/>
<Variable name="page.width" description="Page Width" type="string" default="auto" value="auto"/>
<Variable name="main.section.margin" description="Main Section Margin" type="length" default="15px" value="15px"/>
<Variable name="main.padding" description="Main Padding" type="length" default="15px" value="15px"/>
<Variable name="main.padding.top" description="Main Padding Top" type="length" default="30px" value="30px"/>
<Variable name="main.padding.bottom" description="Main Padding Bottom" type="length" default="30px" value="30px"/>
<Variable name="paging.background"
color="$(content.background.color)"
description="Background of blog paging area" type="background"
default="transparent none no-repeat scroll top center" value="transparent none no-repeat scroll top center"/>
<Variable name="footer.bevel" description="Bevel border length of footer" type="length" default="0" value="0"/>
<Variable name="mobile.background.overlay" description="Mobile Background Overlay" type="string"
default="transparent none repeat scroll top left" value="transparent none repeat scroll top left"/>
<Variable name="mobile.background.size" description="Mobile Background Size" type="string" default="auto" value="auto"/>
<Variable name="mobile.button.color" description="Mobile Button Color" type="color" default="#ffffff" value="#ffffff"/>
<Variable name="startSide" description="Side where text starts in blog language" type="automatic" default="left" value="left"/>
<Variable name="endSide" description="Side where text ends in blog language" type="automatic" default="right" value="right"/>
*/
/* Content
----------------------------------------------- */
body {
font: $(body.font);
color: $(body.text.color);
background: $(body.background);
padding: 0 $(content.shadow.spread) $(content.shadow.spread) $(content.shadow.spread);
$(body.background.override)
}
html body $(page.width.selector) {
min-width: 0;
max-width: 100%;
width: $(page.width);
}
a:link {
text-decoration:none;
color: $(link.color);
}
a:visited {
text-decoration:none;
color: $(link.visited.color);
}
a:hover {
text-decoration:underline;
color: $(link.hover.color);
}
.body-fauxcolumn-outer .fauxcolumn-inner {
background: transparent $(body.background.gradient.tile) repeat scroll top left;
_background-image: none;
}
.body-fauxcolumn-outer .cap-top {
position: absolute;
z-index: 1;
height: 400px;
width: 100%;
background: $(body.background);
$(body.background.override)
}
.body-fauxcolumn-outer .cap-top .cap-left {
width: 100%;
background: transparent $(body.background.gradient.cap) repeat-x scroll top left;
_background-image: none;
}
.content-outer {
-moz-box-shadow: 0 0 $(content.shadow.spread) rgba(0, 0, 0, .15);
-webkit-box-shadow: 0 0 $(content.shadow.spread.webkit) rgba(0, 0, 0, .15);
-goog-ms-box-shadow: 0 0 $(content.shadow.spread.ie) #333333;
box-shadow: 0 0 $(content.shadow.spread) rgba(0, 0, 0, .15);
margin-bottom: 1px;
}
.content-inner {
padding: $(content.padding) $(content.padding.horizontal);
}
$(content.background.color.selector) {
background-color: $(content.background.color);
}
/* Header
----------------------------------------------- */
.header-outer {
background: $(header.background.color) $(header.background.gradient) repeat-x scroll 0 -400px;
_background-image: none;
}
.Header h1 {
font: $(header.font);
color: $(header.text.color);
text-shadow: $(header.shadow.offset.left) $(header.shadow.offset.top) $(header.shadow.spread) rgba(0, 0, 0, .2);
}
.Header h1 a {
color: $(header.text.color);
}
.Header .description {
font-size: $(description.text.size);
color: $(description.text.color);
}
.header-inner .Header .titlewrapper {
padding: 22px $(header.padding);
}
.header-inner .Header .descriptionwrapper {
padding: 0 $(header.padding);
}
/* Tabs
----------------------------------------------- */
.tabs-inner .section:first-child {
border-top: $(header.bottom.border.size) solid $(tabs.border.color);
}
.tabs-inner .section:first-child ul {
margin-top: -$(header.border.size);
border-top: $(header.border.size) solid $(tabs.border.color);
border-left: $(header.border.horizontalsize) solid $(tabs.border.color);
border-right: $(header.border.horizontalsize) solid $(tabs.border.color);
}
.tabs-inner .widget ul {
background: $(tabs.background.color) $(tabs.background.gradient) repeat-x scroll 0 -800px;
_background-image: none;
border-bottom: $(tabs.border.width) solid $(tabs.border.color);
margin-top: $(tabs.margin.top);
margin-left: -$(tabs.margin.side);
margin-right: -$(tabs.margin.side);
}
.tabs-inner .widget li a {
display: inline-block;
padding: .6em 1em;
font: $(tabs.font);
color: $(tabs.text.color);
border-$startSide: $(tabs.border.width) solid $(content.background.color);
border-$endSide: $(tabs.bevel.border.width) solid $(tabs.border.color);
}
.tabs-inner .widget li:first-child a {
border-$startSide: none;
}
.tabs-inner .widget li.selected a, .tabs-inner .widget li a:hover {
color: $(tabs.selected.text.color);
background-color: $(tabs.selected.background.color);
text-decoration: none;
}
/* Columns
----------------------------------------------- */
.main-outer {
border-top: $(main.border.width) solid $(body.rule.color);
}
.fauxcolumn-left-outer .fauxcolumn-inner {
border-right: 1px solid $(body.rule.color);
}
.fauxcolumn-right-outer .fauxcolumn-inner {
border-left: 1px solid $(body.rule.color);
}
/* Headings
----------------------------------------------- */
h2 {
margin: 0 0 1em 0;
font: $(widget.title.font);
color: $(widget.title.text.color);
}
/* Widgets
----------------------------------------------- */
.widget .zippy {
color: $(widget.alternate.text.color);
text-shadow: 2px 2px 1px rgba(0, 0, 0, .1);
}
.widget .popular-posts ul {
list-style: none;
}
/* Posts
----------------------------------------------- */
.date-header span {
background-color: $(date.header.background.color);
color: $(date.header.color);
padding: $(date.header.padding);
letter-spacing: $(date.header.letterspacing);
margin: $(date.header.margin);
}
.main-inner {
padding-top: $(main.padding.top);
padding-bottom: $(main.padding.bottom);
}
.main-inner .column-center-inner {
padding: 0 $(main.padding);
}
.main-inner .column-center-inner .section {
margin: 0 $(main.section.margin);
}
.post {
margin: 0 0 $(post.margin.bottom) 0;
}
h3.post-title, .comments h4 {
font: $(post.title.font);
margin: .75em 0 0;
}
.post-body {
font-size: 110%;
line-height: 1.4;
position: relative;
}
.post-body img, .post-body .tr-caption-container, .Profile img, .Image img,
.BlogList .item-thumbnail img {
padding: $(image.border.small.size);
background: $(image.background.color);
border: 1px solid $(image.border.color);
-moz-box-shadow: 1px 1px 5px rgba(0, 0, 0, .1);
-webkit-box-shadow: 1px 1px 5px rgba(0, 0, 0, .1);
box-shadow: 1px 1px 5px rgba(0, 0, 0, .1);
}
.post-body img, .post-body .tr-caption-container {
padding: $(image.border.large.size);
}
.post-body .tr-caption-container {
color: $(image.text.color);
}
.post-body .tr-caption-container img {
padding: 0;
background: transparent;
border: none;
-moz-box-shadow: 0 0 0 rgba(0, 0, 0, .1);
-webkit-box-shadow: 0 0 0 rgba(0, 0, 0, .1);
box-shadow: 0 0 0 rgba(0, 0, 0, .1);
}
.post-header {
margin: 0 0 1.5em;
line-height: 1.6;
font-size: 90%;
}
.post-footer {
margin: 20px -2px 0;
padding: 5px 10px;
color: $(post.footer.text.color);
background-color: $(post.footer.background.color);
border-bottom: 1px solid $(post.footer.border.color);
line-height: 1.6;
font-size: 90%;
}
#comments .comment-author {
padding-top: 1.5em;
border-top: 1px solid $(body.rule.color);
background-position: 0 1.5em;
}
#comments .comment-author:first-child {
padding-top: 0;
border-top: none;
}
.avatar-image-container {
margin: .2em 0 0;
}
#comments .avatar-image-container img {
border: 1px solid $(image.border.color);
}
/* Comments
----------------------------------------------- */
.comments .comments-content .icon.blog-author {
background-repeat: no-repeat;
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9sLFwMeCjjhcOMAAAD+SURBVDjLtZSvTgNBEIe/WRRnm3U8RC1neQdsm1zSBIU9VVF1FkUguQQsD9ITmD7ECZIJSE4OZo9stoVjC/zc7ky+zH9hXwVwDpTAWWLrgS3QAe8AZgaAJI5zYAmc8r0G4AHYHQKVwII8PZrZFsBFkeRCABYiMh9BRUhnSkPTNCtVXYXURi1FpBDgArj8QU1eVXUzfnjv7yP7kwu1mYrkWlU33vs1QNu2qU8pwN0UpKoqokjWwCztrMuBhEhmh8bD5UDqur75asbcX0BGUB9/HAMB+r32hznJgXy2v0sGLBcyAJ1EK3LFcbo1s91JeLwAbwGYu7TP/3ZGfnXYPgAVNngtqatUNgAAAABJRU5ErkJggg==);
}
.comments .comments-content .loadmore a {
border-top: 1px solid $(widget.alternate.text.color);
border-bottom: 1px solid $(widget.alternate.text.color);
}
.comments .comment-thread.inline-thread {
background-color: $(post.footer.background.color);
}
.comments .continue {
border-top: 2px solid $(widget.alternate.text.color);
}
/* Accents
---------------------------------------------- */
.section-columns td.columns-cell {
border-$startSide: 1px solid $(body.rule.color);
}
.blog-pager {
background: $(paging.background);
}
.blog-pager-older-link, .home-link,
.blog-pager-newer-link {
background-color: $(content.background.color);
padding: 5px;
}
.footer-outer {
border-top: $(footer.bevel) dashed #bbbbbb;
}
/* Mobile
----------------------------------------------- */
body.mobile {
background-size: $(mobile.background.size);
}
.mobile .body-fauxcolumn-outer {
background: $(mobile.background.overlay);
}
.mobile .body-fauxcolumn-outer .cap-top {
background-size: 100% auto;
}
.mobile .content-outer {
-webkit-box-shadow: 0 0 3px rgba(0, 0, 0, .15);
box-shadow: 0 0 3px rgba(0, 0, 0, .15);
}
body.mobile .AdSense {
margin: 0 -$(content.shadow.spread);
}
.mobile .tabs-inner .widget ul {
margin-left: 0;
margin-right: 0;
}
.mobile .post {
margin: 0;
}
.mobile .main-inner .column-center-inner .section {
margin: 0;
}
.mobile .date-header span {
padding: 0.1em 10px;
margin: 0 -10px;
}
.mobile h3.post-title {
margin: 0;
}
.mobile .blog-pager {
background: transparent none no-repeat scroll top center;
}
.mobile .footer-outer {
border-top: none;
}
.mobile .main-inner, .mobile .footer-inner {
background-color: $(content.background.color);
}
.mobile-index-contents {
color: $(body.text.color);
}
.mobile-link-button {
background-color: $(link.color);
}
.mobile-link-button a:link, .mobile-link-button a:visited {
color: $(mobile.button.color);
}
.mobile .tabs-inner .section:first-child {
border-top: none;
}
.mobile .tabs-inner .PageList .widget-content {
background-color: $(tabs.selected.background.color);
color: $(tabs.selected.text.color);
border-top: $(tabs.border.width) solid $(tabs.border.color);
border-bottom: $(tabs.border.width) solid $(tabs.border.color);
}
.mobile .tabs-inner .PageList .widget-content .pagelist-arrow {
border-$startSide: 1px solid $(tabs.border.color);
}
]]></b:skin>
<b:template-skin>
<b:variable default='930px' name='content.width' type='length' value='1000px'/>
<b:variable default='0' name='main.column.left.width' type='length'/>
<b:variable default='360px' name='main.column.right.width' type='length' value='250px'/>
<![CDATA[
body {
min-width: $(content.width);
}
.content-outer, .content-fauxcolumn-outer, .region-inner {
min-width: $(content.width);
max-width: $(content.width);
_width: $(content.width);
}
.main-inner .columns {
padding-left: $(main.column.left.width);
padding-right: $(main.column.right.width);
}
.main-inner .fauxcolumn-center-outer {
left: $(main.column.left.width);
right: $(main.column.right.width);
/* IE6 does not respect left and right together */
_width: expression(this.parentNode.offsetWidth -
parseInt("$(main.column.left.width)") -
parseInt("$(main.column.right.width)") + 'px');
}
.main-inner .fauxcolumn-left-outer {
width: $(main.column.left.width);
}
.main-inner .fauxcolumn-right-outer {
width: $(main.column.right.width);
}
.main-inner .column-left-outer {
width: $(main.column.left.width);
right: 100%;
margin-left: -$(main.column.left.width);
}
.main-inner .column-right-outer {
width: $(main.column.right.width);
margin-right: -$(main.column.right.width);
}
#layout {
min-width: 0;
}
#layout .content-outer {
min-width: 0;
width: 800px;
}
#layout .region-inner {
min-width: 0;
width: auto;
}
]]>
</b:template-skin>
<script src='//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js'/>
<link href='//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/themes/smoothness/jquery-ui.css' rel='stylesheet'/>
<script src='//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min.js'/>
<script src='http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.css' type='text/javascript'/>
<script src='http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js' type='text/javascript'/>
<script src='http://yaregreso.com/syntaxhighlighter_3.0.83/scripts/shCore.js' type='text/javascript'/>
<script src='http://yaregreso.com/syntaxhighlighter_3.0.83/scripts/shBrushJScript.js' type='text/javascript'/>
<script src='http://yaregreso.com/syntaxhighlighter_3.0.83/scripts/shBrushCSharp.js' type='text/javascript'/>
<script type='text/javascript'>SyntaxHighlighter.all();</script>
<link href='http://yaregreso.com/syntaxhighlighter_3.0.83/styles/shCoreDefault.css' rel='stylesheet' type='text/css'/>
</head>
<body expr:class='"loading" + data:blog.mobileClass'>
<b:section class='navbar' id='navbar' maxwidgets='1' showaddelement='no'>
<b:widget id='Navbar1' locked='true' title='Barra de navegación' type='Navbar'>
<b:includable id='main'><script type="text/javascript">
function setAttributeOnload(object, attribute, val) {
if(window.addEventListener) {
window.addEventListener('load',
function(){ object[attribute] = val; }, false);
} else {
window.attachEvent('onload', function(){ object[attribute] = val; });
}
}
</script>
<div id="navbar-iframe-container"></div>
<script type="text/javascript" src="https://apis.google.com/js/plusone.js"></script>
<script type="text/javascript">
gapi.load("gapi.iframes:gapi.iframes.style.bubble", function() {
if (gapi.iframes && gapi.iframes.getContext) {
gapi.iframes.getContext().openChild({
url: 'https://www.blogger.com/navbar.g?targetBlogID\0751856013197571600479\46blogName\75expressraider\46publishMode\75PUBLISH_MODE_BLOGSPOT\46navbarType\75LIGHT\46layoutType\75LAYOUTS\46searchRoot\75http://expressraider.blogspot.com/search\46blogLocale\75es\46v\0752\46homepageUrl\75http://expressraider.blogspot.com/\46readAccessMode\75PRIVATE\46vt\0757391293466080875560',
where: document.getElementById("navbar-iframe-container"),
id: "navbar-iframe"
});
}
});
</script><script type="text/javascript">
(function() {
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = '//pagead2.googlesyndication.com/pagead/js/google_top_exp.js';
var head = document.getElementsByTagName('head')[0];
if (head) {
head.appendChild(script);
}})();
</script>
</b:includable>
</b:widget>
</b:section>
<div class='body-fauxcolumns'>
<div class='fauxcolumn-outer body-fauxcolumn-outer'>
<div class='cap-top'>
<div class='cap-left'/>
<div class='cap-right'/>
</div>
<div class='fauxborder-left'>
<div class='fauxborder-right'/>
<div class='fauxcolumn-inner'>
</div>
</div>
<div class='cap-bottom'>
<div class='cap-left'/>
<div class='cap-right'/>
</div>
</div>
</div>
<div class='content'>
<div class='content-fauxcolumns'>
<div class='fauxcolumn-outer content-fauxcolumn-outer'>
<div class='cap-top'>
<div class='cap-left'/>
<div class='cap-right'/>
</div>
<div class='fauxborder-left'>
<div class='fauxborder-right'/>
<div class='fauxcolumn-inner'>
</div>
</div>
<div class='cap-bottom'>
<div class='cap-left'/>
<div class='cap-right'/>
</div>
</div>
</div>
<div class='content-outer'>
<div class='content-cap-top cap-top'>
<div class='cap-left'/>
<div class='cap-right'/>
</div>
<div class='fauxborder-left content-fauxborder-left'>
<div class='fauxborder-right content-fauxborder-right'/>
<div class='content-inner'>
<header>
<div class='header-outer'>
<div class='header-cap-top cap-top'>
<div class='cap-left'/>
<div class='cap-right'/>
</div>
<div class='fauxborder-left header-fauxborder-left'>
<div class='fauxborder-right header-fauxborder-right'/>
<div class='region-inner header-inner'>
<b:section class='header' id='header' maxwidgets='1' showaddelement='no'>
<b:widget id='Header1' locked='true' title='expressraider (cabecera)' type='Header'>
<b:includable id='main'>
<b:if cond='data:useImage'>
<b:if cond='data:imagePlacement == "BEHIND"'>
<!--
Show image as background to text. You can't really calculate the width
reliably in JS because margins are not taken into account by any of
clientWidth, offsetWidth or scrollWidth, so we don't force a minimum
width if the user is using shrink to fit.
This results in a margin-width's worth of pixels being cropped. If the
user is not using shrink to fit then we expand the header.
-->
<b:if cond='data:mobile'>
<div id='header-inner'>
<div class='titlewrapper' style='background: transparent'>
<h1 class='title' style='background: transparent; border-width: 0px'>
<b:include name='title'/>
</h1>
</div>
<b:include name='description'/>
</div>
<b:else/>
<div expr:style='"background-image: url(\"" + data:sourceUrl + "\"); " + "background-position: " + data:backgroundPositionStyleStr + "; " + data:widthStyleStr + "min-height: " + data:height + "_height: " + data:height + "background-repeat: no-repeat; "' id='header-inner'>
<div class='titlewrapper' style='background: transparent'>
<h1 class='title' style='background: transparent; border-width: 0px'>
<b:include name='title'/>
</h1>
</div>
<b:include name='description'/>
</div>
</b:if>
<b:else/>
<!--Show the image only-->
<div id='header-inner'>
<a expr:href='data:blog.homepageUrl' style='display: block'>
<img expr:alt='data:title' expr:height='data:height' expr:id='data:widget.instanceId + "_headerimg"' expr:src='data:sourceUrl' expr:width='data:width' style='display: block'/>
</a>
<!--Show the description-->
<b:if cond='data:imagePlacement == "BEFORE_DESCRIPTION"'>
<b:include name='description'/>
</b:if>
</div>
</b:if>
<b:else/>
<!--No header image -->
<div id='header-inner'>
<div style="position: relative; float: left;padding: 10px">
<form id="formBuscar" action="/search">
<input type="text" name="q" size="30" />
<input type="hidden" name="m" value="0" />
<input type="submit" value="Buscar" />
</form>
</div>
<div style="position: relative; float: right;padding: 10px">
<a href='https://www.blogger.com/blogger.g?blogID=1856013197571600479#overview' style='background-color: white; padding: 3px; font-weight: bold'>Editar</a>
</div>
<div style="position: relative; float: right;padding: 10px">
<a href='https://www.blogger.com/blogger.g?blogID=1856013197571600479#editor' style='background-color: white; padding: 3px; font-weight: bold'>Nueva entrada</a>
</div>
<div class='titlewrapper'>
<h1 class='title'>
<b:include name='title'/>
</h1>
</div>
<b:include name='description'/>
</div>
</b:if>
</b:includable>
<b:includable id='description'>
<div class='descriptionwrapper'>
<p class='description'><span><data:description/></span></p>
</div>
</b:includable>
<b:includable id='title'>
<b:if cond='data:blog.url == data:blog.homepageUrl'>
<data:title/>
<b:else/>
<a expr:href='data:blog.homepageUrl'><data:title/></a>
</b:if>
</b:includable>
</b:widget>
</b:section>
</div>
</div>
<div class='header-cap-bottom cap-bottom'>
<div class='cap-left'/>
<div class='cap-right'/>
</div>
</div>
</header>
<div class='tabs-outer'>
<div class='tabs-cap-top cap-top'>
<div class='cap-left'/>
<div class='cap-right'/>
</div>
<div class='fauxborder-left tabs-fauxborder-left'>
<div class='fauxborder-right tabs-fauxborder-right'/>
<div class='region-inner tabs-inner'>
<b:section class='tabs' id='crosscol' maxwidgets='1' showaddelement='yes'>
<b:widget id='PageList1' locked='false' title='Páginas' type='PageList'>
<b:includable id='main'>
<b:if cond='data:title'><h2><data:title/></h2></b:if>
<div class='widget-content'>
<b:if cond='data:mobile'>
<select expr:id='data:widget.instanceId + "_select"'>
<b:loop values='data:links' var='link'>
<b:if cond='data:link.isCurrentPage'>
<option expr:value='data:link.href' selected='selected'><data:link.title/></option>
<b:else/>
<option expr:value='data:link.href'><data:link.title/></option>
</b:if>
</b:loop>
</select>
<span class='pagelist-arrow'>&#9660;</span>
<b:else/>
<ul>
<b:loop values='data:links' var='link'>
<b:if cond='data:link.isCurrentPage'>
<li class='selected'><a expr:href='data:link.href'><data:link.title/></a></li>
<b:else/>
<li><a expr:href='data:link.href'><data:link.title/></a></li>
</b:if>
</b:loop>
</ul>
</b:if>
<b:include name='quickedit'/>
</div>
</b:includable>
</b:widget>
</b:section>
<b:section class='tabs' id='crosscol-overflow' showaddelement='no'/>
</div>
</div>
<div class='tabs-cap-bottom cap-bottom'>
<div class='cap-left'/>
<div class='cap-right'/>
</div>
</div>
<div class='main-outer'>
<div class='main-cap-top cap-top'>
<div class='cap-left'/>
<div class='cap-right'/>
</div>
<div class='fauxborder-left main-fauxborder-left'>
<div class='fauxborder-right main-fauxborder-right'/>
<div class='region-inner main-inner'>
<div class='columns fauxcolumns'>
<div class='fauxcolumn-outer fauxcolumn-center-outer'>
<div class='cap-top'>
<div class='cap-left'/>
<div class='cap-right'/>
</div>
<div class='fauxborder-left'>
<div class='fauxborder-right'/>
<div class='fauxcolumn-inner'>
</div>
</div>
<div class='cap-bottom'>
<div class='cap-left'/>
<div class='cap-right'/>
</div>
</div>
<div class='fauxcolumn-outer fauxcolumn-left-outer'>
<div class='cap-top'>
<div class='cap-left'/>
<div class='cap-right'/>
</div>
<div class='fauxborder-left'>
<div class='fauxborder-right'/>
<div class='fauxcolumn-inner'>
</div>
</div>
<div class='cap-bottom'>
<div class='cap-left'/>
<div class='cap-right'/>
</div>
</div>
<div class='fauxcolumn-outer fauxcolumn-right-outer'>
<div class='cap-top'>
<div class='cap-left'/>
<div class='cap-right'/>
</div>
<div class='fauxborder-left'>
<div class='fauxborder-right'/>
<div class='fauxcolumn-inner'>
</div>
</div>
<div class='cap-bottom'>
<div class='cap-left'/>
<div class='cap-right'/>
</div>
</div>
<!-- corrects IE6 width calculation -->
<div class='columns-inner'>
<div class='column-center-outer'>
<div class='column-center-inner'>
<b:section class='main' id='main' showaddelement='no'>
<b:widget id='Blog1' locked='true' title='Entradas del blog' type='Blog'>
<b:includable id='main' var='top'>
<b:if cond='data:mobile == "false"'>
<!-- posts -->
<div class='blog-posts hfeed'>
<b:include data='top' name='status-message'/>
<data:defaultAdStart/>
<b:loop values='data:posts' var='post'>
<b:if cond='data:post.isDateStart'>
<b:if cond='data:post.isFirstPost == "false"'>
</div></div>
</b:if>
</b:if>
<b:if cond='data:post.isDateStart'>
<div class="date-outer">
</b:if>
<b:if cond='data:post.dateHeader'>
<h2 class='date-header'><span><data:post.dateHeader/></span></h2>
</b:if>
<b:if cond='data:post.isDateStart'>
<div class="date-posts">
</b:if>
<div class='post-outer'>
<b:include data='post' name='post'/>
<b:if cond='data:blog.pageType == "static_page"'>
<b:include data='post' name='comment_picker'/>
</b:if>
<b:if cond='data:blog.pageType == "item"'>
<b:include data='post' name='comment_picker'/>
</b:if>
</div>
<b:if cond='data:post.includeAd'>
<b:if cond='data:post.isFirstPost'>
<data:defaultAdEnd/>
<b:else/>
<data:adEnd/>
</b:if>
<div class='inline-ad'>
<data:adCode/>
</div>
<data:adStart/>
</b:if>
</b:loop>
<b:if cond='data:numPosts != 0'>
</div></div>
</b:if>
<data:adEnd/>
</div>
<!-- navigation -->
<b:include name='nextprev'/>
<!-- feed links -->
<b:include name='feedLinks'/>
<b:if cond='data:top.showStars'>
<script src='//www.google.com/jsapi' type='text/javascript'/>
<script type='text/javascript'>
google.load("annotations", "1", {"locale": "<data:top.languageCode/>"});
function initialize() {
google.annotations.setApplicationId(<data:top.blogspotReviews/>);
google.annotations.createAll();
google.annotations.fetch();
}
google.setOnLoadCallback(initialize);
</script>
</b:if>
<b:else/>
<b:include name='mobile-main'/>
</b:if>
<b:if cond='data:top.showDummy'>
<data:top.dummyBootstrap/>
</b:if>
</b:includable>
<b:includable id='backlinkDeleteIcon' var='backlink'>
<span expr:class='"item-control " + data:backlink.adminClass'>
<a expr:href='data:backlink.deleteUrl' expr:title='data:top.deleteBacklinkMsg'>
<img src='//www.blogger.com/img/icon_delete13.gif'/>
</a>
</span>
</b:includable>
<b:includable id='backlinks' var='post'>
<a name='links'/><h4><data:post.backlinksLabel/></h4>
<b:if cond='data:post.numBacklinks != 0'>
<dl class='comments-block' id='comments-block'>
<b:loop values='data:post.backlinks' var='backlink'>
<div class='collapsed-backlink backlink-control'>
<dt class='comment-title'>
<span class='backlink-toggle-zippy'> </span>
<a expr:href='data:backlink.url' rel='nofollow'><data:backlink.title/></a>
<b:include data='backlink' name='backlinkDeleteIcon'/>
</dt>
<dd class='comment-body collapseable'>
<data:backlink.snippet/>
</dd>
<dd class='comment-footer collapseable'>
<span class='comment-author'><data:post.authorLabel/> <data:backlink.author/></span>
<span class='comment-timestamp'><data:post.timestampLabel/> <data:backlink.timestamp/></span>
</dd>
</div>
</b:loop>
</dl>
</b:if>
<p class='comment-footer'>
<a class='comment-link' expr:href='data:post.createLinkUrl' expr:id='data:widget.instanceId + "_backlinks-create-link"' target='_blank'><data:post.createLinkLabel/></a>
</p>
</b:includable>
<b:includable id='comment-form' var='post'>
<div class='comment-form'>
<a name='comment-form'/>
<b:if cond='data:mobile'>
<h4 id='comment-post-message'>
<a expr:id='data:widget.instanceId + "_comment-editor-toggle-link"' href='javascript:void(0)'><data:postCommentMsg/></a></h4>
<p><data:blogCommentMessage/></p>
<data:blogTeamBlogMessage/>
<a expr:href='data:post.commentFormIframeSrc' id='comment-editor-src'/>
<iframe allowtransparency='true' class='blogger-iframe-colorize blogger-comment-from-post' frameborder='0' height='410' id='comment-editor' name='comment-editor' src='' style='display: none' width='100%'/>
<b:else/>
<h4 id='comment-post-message'><data:postCommentMsg/></h4>
<p><data:blogCommentMessage/></p>
<data:blogTeamBlogMessage/>
<a expr:href='data:post.commentFormIframeSrc' id='comment-editor-src'/>
<iframe allowtransparency='true' class='blogger-iframe-colorize blogger-comment-from-post' frameborder='0' height='410' id='comment-editor' name='comment-editor' src='' width='100%'/>
</b:if>
<data:post.friendConnectJs/>
<data:post.cmtfpIframe/>
<script type='text/javascript'>
BLOG_CMT_createIframe('<data:post.appRpcRelayPath/>');
</script>
</div>
</b:includable>
<b:includable id='commentDeleteIcon' var='comment'>
<span expr:class='"item-control " + data:comment.adminClass'>
<b:if cond='data:showCmtPopup'>
<div class='goog-toggle-button'>
<div class='goog-inline-block comment-action-icon'/>
</div>
<b:else/>
<a class='comment-delete' expr:href='data:comment.deleteUrl' expr:title='data:top.deleteCommentMsg'>
<img src='//www.blogger.com/img/icon_delete13.gif'/>
</a>
</b:if>
</span>
</b:includable>
<b:includable id='comment_count_picker' var='post'>
<b:if cond='data:post.commentSource == 1'>
<span class='cmt_count_iframe_holder' expr:data-count='data:post.numComments' expr:data-onclick='data:post.addCommentOnclick' expr:data-post-url='data:post.url' expr:data-url='data:post.canonicalUrl'>
</span>
<b:else/>
<a class='comment-link' expr:href='data:post.addCommentUrl' expr:onclick='data:post.addCommentOnclick'>
<data:post.commentLabelFull/>:
</a>
</b:if>
</b:includable>
<b:includable id='comment_picker' var='post'>
<b:if cond='data:post.commentSource == 1'>
<b:include data='post' name='iframe_comments'/>
<b:else/>
<b:if cond='data:post.showThreadedComments'>
<b:include data='post' name='threaded_comments'/>
<b:else/>
<b:include data='post' name='comments'/>
</b:if>
</b:if>
</b:includable>
<b:includable id='comments' var='post'>
<div class='comments' id='comments'>
<a name='comments'/>
<b:if cond='data:post.allowComments'>
<h4><data:post.commentLabelFull/>:</h4>
<b:if cond='data:post.commentPagingRequired'>
<span class='paging-control-container'>
<b:if cond='data:post.hasOlderLinks'>
<a expr:class='data:post.oldLinkClass' expr:href='data:post.oldestLinkUrl'><data:post.oldestLinkText/></a>
 
<a expr:class='data:post.oldLinkClass' expr:href='data:post.olderLinkUrl'><data:post.olderLinkText/></a>
 
</b:if>
<data:post.commentRangeText/>
<b:if cond='data:post.hasNewerLinks'>
 
<a expr:class='data:post.newLinkClass' expr:href='data:post.newerLinkUrl'><data:post.newerLinkText/></a>
 
<a expr:class='data:post.newLinkClass' expr:href='data:post.newestLinkUrl'><data:post.newestLinkText/></a>
</b:if>
</span>
</b:if>
<div expr:id='data:widget.instanceId + "_comments-block-wrapper"'>
<dl expr:class='data:post.avatarIndentClass' id='comments-block'>
<b:loop values='data:post.comments' var='comment'>
<dt expr:class='"comment-author " + data:comment.authorClass' expr:id='data:comment.anchorName'>
<b:if cond='data:comment.favicon'>
<img expr:src='data:comment.favicon' height='16px' style='margin-bottom:-2px;' width='16px'/>
</b:if>
<a expr:name='data:comment.anchorName'/>
<b:if cond='data:blog.enabledCommentProfileImages'>
<data:comment.authorAvatarImage/>
</b:if>
<b:if cond='data:comment.authorUrl'>
<a expr:href='data:comment.authorUrl' rel='nofollow'><data:comment.author/></a>
<b:else/>
<data:comment.author/>
</b:if>
<data:commentPostedByMsg/>
</dt>
<dd class='comment-body' expr:id='data:widget.instanceId + data:comment.cmtBodyIdPostfix'>
<b:if cond='data:comment.isDeleted'>
<span class='deleted-comment'><data:comment.body/></span>
<b:else/>
<p>
<data:comment.body/>
</p>
</b:if>
</dd>
<dd class='comment-footer'>
<span class='comment-timestamp'>
<a expr:href='data:comment.url' title='comment permalink'>
<data:comment.timestamp/>
</a>
<b:include data='comment' name='commentDeleteIcon'/>
</span>
</dd>
</b:loop>
</dl>
</div>
<b:if cond='data:post.commentPagingRequired'>
<span class='paging-control-container'>
<a expr:class='data:post.oldLinkClass' expr:href='data:post.oldestLinkUrl'>
<data:post.oldestLinkText/>
</a>
<a expr:class='data:post.oldLinkClass' expr:href='data:post.olderLinkUrl'>
<data:post.olderLinkText/>
</a>
 
<data:post.commentRangeText/>
 
<a expr:class='data:post.newLinkClass' expr:href='data:post.newerLinkUrl'>
<data:post.newerLinkText/>
</a>
<a expr:class='data:post.newLinkClass' expr:href='data:post.newestLinkUrl'>
<data:post.newestLinkText/>
</a>
</span>
</b:if>
<p class='comment-footer'>
<b:if cond='data:post.embedCommentForm'>
<b:if cond='data:post.allowNewComments'>
<b:include data='post' name='comment-form'/>
<b:else/>
<data:post.noNewCommentsText/>
</b:if>
<b:else/>
<b:if cond='data:post.allowComments'>
<a expr:href='data:post.addCommentUrl' expr:onclick='data:post.addCommentOnclick'><data:postCommentMsg/></a>
</b:if>
</b:if>
</p>
</b:if>
<b:if cond='data:showCmtPopup'>
<div id='comment-popup'>
<iframe allowtransparency='true' frameborder='0' id='comment-actions' name='comment-actions' scrolling='no'>
</iframe>
</div>
</b:if>
<div id='backlinks-container'>
<div expr:id='data:widget.instanceId + "_backlinks-container"'>
<b:if cond='data:post.showBacklinks'>
<b:include data='post' name='backlinks'/>
</b:if>
</div>
</div>
</div>
</b:includable>
<b:includable id='feedLinks'>
<b:if cond='data:blog.pageType != "item"'> <!-- Blog feed links -->
<b:if cond='data:feedLinks'>
<div class='blog-feeds'>
<b:include data='feedLinks' name='feedLinksBody'/>
</div>
</b:if>
<b:else/> <!--Post feed links -->
<div class='post-feeds'>
<b:loop values='data:posts' var='post'>
<b:if cond='data:post.allowComments'>
<b:if cond='data:post.feedLinks'>
<b:include data='post.feedLinks' name='feedLinksBody'/>
</b:if>
</b:if>
</b:loop>
</div>
</b:if>
</b:includable>
<b:includable id='feedLinksBody' var='links'>
<div class='feed-links'>
<data:feedLinksMsg/>
<b:loop values='data:links' var='f'>
<a class='feed-link' expr:href='data:f.url' expr:type='data:f.mimeType' target='_blank'><data:f.name/> (<data:f.feedType/>)</a>
</b:loop>
</div>
</b:includable>
<b:includable id='iframe_comments' var='post'>
<b:if cond='data:post.allowIframeComments'>
<script expr:src='data:post.iframeCommentSrc' type='text/javascript'/>
<div class='cmt_iframe_holder' expr:data-href='data:post.canonicalUrl' expr:data-viewtype='data:post.viewType'/>
<b:if cond='data:post.embedCommentForm == "false"'>
<a expr:href='data:post.addCommentUrl' expr:onclick='data:post.addCommentOnclick'><data:postCommentMsg/></a>
</b:if>
</b:if>
</b:includable>
<b:includable id='mobile-index-post' var='post'>
<div class='mobile-date-outer date-outer'>
<b:if cond='data:post.dateHeader'>
<div class='date-header'>
<span><data:post.dateHeader/></span>
</div>
</b:if>
<div class='mobile-post-outer'>
<a expr:href='data:post.url'>
<h3 class='mobile-index-title entry-title' itemprop='name'>
<data:post.title/>
</h3>
<div class='mobile-index-arrow'>&rsaquo;</div>
<div class='mobile-index-contents'>
<b:if cond='data:post.thumbnailUrl'>
<div class='mobile-index-thumbnail'>
<div class='Image'>
<img expr:src='data:post.thumbnailUrl'/>
</div>
</div>
</b:if>
<div class='post-body'>
<b:if cond='data:post.snippet'><data:post.snippet/></b:if>
</div>
</div>
<div style='clear: both;'/>
</a>
<div class='mobile-index-comment'>
<b:if cond='data:blog.pageType != "static_page"'>
<b:if cond='data:post.allowComments'>
<b:if cond='data:post.numComments != 0'>
<b:include data='post' name='comment_count_picker'/>
</b:if>
</b:if>
</b:if>
</div>
</div>
</div>
</b:includable>
<b:includable id='mobile-main' var='top'>
<!-- posts -->
<div class='blog-posts hfeed'>
<b:include data='top' name='status-message'/>
<b:if cond='data:blog.pageType == "index"'>
<b:loop values='data:posts' var='post'>
<b:include data='post' name='mobile-index-post'/>
</b:loop>
<b:else/>
<b:loop values='data:posts' var='post'>
<b:include data='post' name='mobile-post'/>
</b:loop>
</b:if>
</div>
<b:include name='mobile-nextprev'/>
</b:includable>
<b:includable id='mobile-nextprev'>
<div class='blog-pager' id='blog-pager'>
<b:if cond='data:newerPageUrl'>
<div class='mobile-link-button' id='blog-pager-newer-link'>
<a class='blog-pager-newer-link' expr:href='data:newerPageUrl' expr:id='data:widget.instanceId + "_blog-pager-newer-link"' expr:title='data:newerPageTitle'>&lsaquo;</a>
</div>
</b:if>
<b:if cond='data:olderPageUrl'>
<div class='mobile-link-button' id='blog-pager-older-link'>
<a class='blog-pager-older-link' expr:href='data:olderPageUrl' expr:id='data:widget.instanceId + "_blog-pager-older-link"' expr:title='data:olderPageTitle'>&rsaquo;</a>
</div>
</b:if>
<div class='mobile-link-button' id='blog-pager-home-link'>
<a class='home-link' expr:href='data:blog.homepageUrl'><data:homeMsg/></a>
</div>
<div class='mobile-desktop-link'>
<a class='home-link' expr:href='data:desktopLinkUrl'><data:desktopLinkMsg/></a>
</div>
</div>
<div class='clear'/>
</b:includable>
<b:includable id='mobile-post' var='post'>
<div class='date-outer'>
<b:if cond='data:post.dateHeader'>
<h2 class='date-header'><span><data:post.dateHeader/></span></h2>
</b:if>
<div class='date-posts'>
<div class='post-outer'>
<div class='post hentry uncustomized-post-template' itemscope='itemscope' itemtype='http://schema.org/BlogPosting'>
<b:if cond='data:post.thumbnailUrl'>
<meta expr:content='data:post.thumbnailUrl' itemprop='image_url'/>
</b:if>
<meta expr:content='data:blog.blogId' itemprop='blogId'/>
<meta expr:content='data:post.id' itemprop='postId'/>
<a expr:name='data:post.id'/>
<b:if cond='data:post.title'>
<h3 class='post-title entry-title' itemprop='name'>
<b:if cond='data:post.link'>
<a expr:href='data:post.link'><data:post.title/></a>
<b:else/>
<b:if cond='data:post.url'>
<b:if cond='data:blog.url != data:post.url'>
<a expr:href='data:post.url'><data:post.title/></a>
<b:else/>
<data:post.title/>
</b:if>
<b:else/>
<data:post.title/>
</b:if>
</b:if>
</h3>
</b:if>
<div class='post-header'>
<div class='post-header-line-1'/>
</div>
<div class='post-body entry-content' expr:id='"post-body-" + data:post.id' itemprop='articleBody'>
<data:post.body/>
<div style='clear: both;'/> <!-- clear for photos floats -->
</div>
<div class='post-footer'>
<div class='post-footer-line post-footer-line-1'>
<span class='post-author vcard'>
<b:if cond='data:top.showAuthor'>
<b:if cond='data:post.authorProfileUrl'>
<span class='fn' itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'>
<meta expr:content='data:post.authorProfileUrl' itemprop='url'/>
<a expr:href='data:post.authorProfileUrl' rel='author' title='author profile'>
<span itemprop='name'><data:post.author/></span>
</a>
</span>
<b:else/>
<span class='fn' itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'>
<span itemprop='name'><data:post.author/></span>
</span>
</b:if>
</b:if>
</span>
<span class='post-timestamp'>
<b:if cond='data:top.showTimestamp'>
<data:top.timestampLabel/>
<b:if cond='data:post.url'>
<meta expr:content='data:post.canonicalUrl' itemprop='url'/>
<a class='timestamp-link' expr:href='data:post.url' rel='bookmark' title='permanent link'><abbr class='published' expr:title='data:post.timestampISO8601' itemprop='datePublished'><data:post.timestamp/></abbr></a>
</b:if>
</b:if>
</span>
<span class='post-comment-link'>
<b:if cond='data:blog.pageType != "item"'>
<b:if cond='data:blog.pageType != "static_page"'>
<b:if cond='data:post.allowComments'>
<b:include data='post' name='comment_count_picker'/>
</b:if>
</b:if>
</b:if>
</span>
</div>
<div class='post-footer-line post-footer-line-2'>
<b:if cond='data:top.showMobileShare'>
<div class='mobile-link-button goog-inline-block' id='mobile-share-button'>
<a href='javascript:void(0);'><data:shareMsg/></a>
</div>
</b:if>
<b:if cond='data:top.showDummy'>
<div class='goog-inline-block dummy-container'><data:post.dummyTag/></div>
</b:if>
</div>
</div>
</div>
<b:if cond='data:blog.pageType == "static_page"'>
<b:include data='post' name='comment_picker'/>
</b:if>
<b:if cond='data:blog.pageType == "item"'>
<b:include data='post' name='comment_picker'/>
</b:if>
</div>
</div>
</div>
</b:includable>
<b:includable id='nextprev'>
<div class='blog-pager' id='blog-pager'>
<b:if cond='data:newerPageUrl'>
<span id='blog-pager-newer-link'>
<a class='blog-pager-newer-link' expr:href='data:newerPageUrl' expr:id='data:widget.instanceId + "_blog-pager-newer-link"' expr:title='data:newerPageTitle'><data:newerPageTitle/></a>
</span>
</b:if>
<b:if cond='data:olderPageUrl'>
<span id='blog-pager-older-link'>
<a class='blog-pager-older-link' expr:href='data:olderPageUrl' expr:id='data:widget.instanceId + "_blog-pager-older-link"' expr:title='data:olderPageTitle'><data:olderPageTitle/></a>
</span>
</b:if>
<a class='home-link' expr:href='data:blog.homepageUrl'><data:homeMsg/></a>
<b:if cond='data:mobileLinkUrl'>
<div class='blog-mobile-link'>
<a expr:href='data:mobileLinkUrl'><data:mobileLinkMsg/></a>
</div>
</b:if>
</div>
<div class='clear'/>
</b:includable>
<b:includable id='post' var='post'>
<div class='post hentry uncustomized-post-template' itemprop='blogPost' itemscope='itemscope' itemtype='http://schema.org/BlogPosting'>
<b:if cond='data:post.firstImageUrl'>
<meta expr:content='data:post.firstImageUrl' itemprop='image_url'/>
</b:if>
<meta expr:content='data:blog.blogId' itemprop='blogId'/>
<meta expr:content='data:post.id' itemprop='postId'/>
<a expr:name='data:post.id'/>
<b:if cond='data:post.title'>
<h3 class='post-title entry-title' itemprop='name'>
<b:if cond='data:post.link'>
<a expr:href='data:post.link'><data:post.title/></a>
<b:else/>
<b:if cond='data:post.url'>
<b:if cond='data:blog.url != data:post.url'>
<a expr:href='data:post.url'><data:post.title/></a>
<b:else/>
<data:post.title/>
</b:if>
<b:else/>
<data:post.title/>
</b:if>
</b:if>
</h3>
</b:if>
<div class='post-header'>
<div class='post-header-line-1'/>
</div>
<b:if cond='data:blog.metaDescription == ""'>
<!-- Then use the post body as the schema.org description,
for good G+/FB snippeting. -->
<div class='post-body entry-content' expr:id='"post-body-" + data:post.id' itemprop='description articleBody'>
<data:post.body/>
<div style='clear: both;'/> <!-- clear for photos floats -->
</div>
<b:else/>
<div class='post-body entry-content' expr:id='"post-body-" + data:post.id' itemprop='articleBody'>
<data:post.body/>
<div style='clear: both;'/> <!-- clear for photos floats -->
</div>
</b:if>
<b:if cond='data:post.hasJumpLink'>
<div class='jump-link'>
<a expr:href='data:post.url + "#more"' expr:title='data:post.title'><data:post.jumpText/></a>
</div>
</b:if>
<div class='post-footer'>
<div class='post-footer-line post-footer-line-1'>
<span class='post-author vcard'>
<b:if cond='data:top.showAuthor'>
<data:top.authorLabel/>
<b:if cond='data:post.authorProfileUrl'>
<span class='fn' itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'>
<meta expr:content='data:post.authorProfileUrl' itemprop='url'/>
<a class='g-profile' expr:href='data:post.authorProfileUrl' rel='author' title='author profile'>
<span itemprop='name'><data:post.author/></span>
</a>
</span>
<b:else/>
<span class='fn' itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'>
<span itemprop='name'><data:post.author/></span>
</span>
</b:if>
</b:if>
</span>
<span class='post-timestamp'>
<b:if cond='data:top.showTimestamp'>
<data:top.timestampLabel/>
<b:if cond='data:post.url'>
<meta expr:content='data:post.canonicalUrl' itemprop='url'/>
<a class='timestamp-link' expr:href='data:post.url' rel='bookmark' title='permanent link'><abbr class='published' expr:title='data:post.timestampISO8601' itemprop='datePublished'><data:post.timestamp/></abbr></a>
</b:if>
</b:if>
</span>
<span class='reaction-buttons'>
<b:if cond='data:top.showReactions'>
<table border='0' cellpadding='0' cellspacing='0' width='100%'><tr>
<td class='reactions-label-cell' nowrap='nowrap' valign='top' width='1%'>
<span class='reactions-label'>
<data:top.reactionsLabel/></span> </td>
<td><iframe allowtransparency='true' class='reactions-iframe' expr:src='data:post.reactionsUrl' frameborder='0' name='reactions' scrolling='no'/></td>
</tr></table>
</b:if>
</span>
<span class='post-comment-link'>
<b:if cond='data:blog.pageType != "item"'>
<b:if cond='data:blog.pageType != "static_page"'>
<b:if cond='data:post.allowComments'>
<b:include data='post' name='comment_count_picker'/>
</b:if>
</b:if>
</b:if>
</span>
<!-- backlinks -->
<span class='post-backlinks post-comment-link'>
<b:if cond='data:blog.pageType != "item"'>
<b:if cond='data:blog.pageType != "static_page"'>
<b:if cond='data:post.showBacklinks'>
<a class='comment-link' expr:href='data:post.url + "#links"'><data:top.backlinkLabel/></a>
</b:if>
</b:if>
</b:if>
</span>
<span class='post-icons'>
<!-- email post links -->
<b:if cond='data:post.emailPostUrl'>
<span class='item-action'>
<a expr:href='data:post.emailPostUrl' expr:title='data:top.emailPostMsg'>
<img alt='' class='icon-action' height='13' src='http://img1.blogblog.com/img/icon18_email.gif' width='18'/>
</a>
</span>
</b:if>
<!-- quickedit pencil -->
<b:include data='post' name='postQuickEdit'/>
</span>
<!-- share buttons -->
<div class='post-share-buttons goog-inline-block'>
<b:if cond='data:post.sharePostUrl'>
<b:include data='post' name='shareButtons'/>
</b:if>
</div>
</div>
<div class='post-footer-line post-footer-line-2'>
<span class='post-labels'>
<b:if cond='data:post.labels'>
<data:postLabelsLabel/>
<b:loop values='data:post.labels' var='label'>
<a expr:href='data:label.url' rel='tag'><data:label.name/></a><b:if cond='data:label.isLast != "true"'>,</b:if>
</b:loop>
</b:if>
</span>
</div>
<div class='post-footer-line post-footer-line-3'>
<span class='post-location'>
<b:if cond='data:top.showLocation'>
<b:if cond='data:post.location'>
<data:postLocationLabel/>
<a expr:href='data:post.location.mapsUrl' target='_blank'><data:post.location.name/></a>
</b:if>
</b:if>
</span>
</div>
<b:if cond='data:post.authorAboutMe'>
<div class='author-profile' itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'>
<b:if cond='data:post.authorPhoto.url'>
<img expr:src='data:post.authorPhoto.url' itemprop='image' width='50px'/>
</b:if>
<div>
<a class='g-profile' expr:href='data:post.authorProfileUrl' itemprop='url' rel='author' title='author profile'>
<span itemprop='name'><data:post.author/></span>
</a>
</div>
<span itemprop='description'><data:post.authorAboutMe/></span>
</div>
</b:if>
</div>
</div>
</b:includable>
<b:includable id='postQuickEdit' var='post'>
<b:if cond='data:post.editUrl'>
<span expr:class='"item-control " + data:post.adminClass'>
<a expr:href='data:post.editUrl' expr:title='data:top.editPostMsg'>
<img alt='' class='icon-action' height='18' src='http://img2.blogblog.com/img/icon18_edit_allbkg.gif' width='18'/>
</a>
</span>
</b:if>
</b:includable>
<b:includable id='shareButtons' var='post'>
<b:if cond='data:top.showEmailButton'><a class='goog-inline-block share-button sb-email' expr:href='data:post.sharePostUrl + "&target=email"' expr:title='data:top.emailThisMsg' target='_blank'><span class='share-button-link-text'><data:top.emailThisMsg/></span></a></b:if><b:if cond='data:top.showBlogThisButton'><a class='goog-inline-block share-button sb-blog' expr:href='data:post.sharePostUrl + "&target=blog"' expr:onclick='"window.open(this.href, \"_blank\", \"height=270,width=475\"); return false;"' expr:title='data:top.blogThisMsg' target='_blank'><span class='share-button-link-text'><data:top.blogThisMsg/></span></a></b:if><b:if cond='data:top.showTwitterButton'><a class='goog-inline-block share-button sb-twitter' expr:href='data:post.sharePostUrl + "&target=twitter"' expr:title='data:top.shareToTwitterMsg' target='_blank'><span class='share-button-link-text'><data:top.shareToTwitterMsg/></span></a></b:if><b:if cond='data:top.showFacebookButton'><a class='goog-inline-block share-button sb-facebook' expr:href='data:post.sharePostUrl + "&target=facebook"' expr:onclick='"window.open(this.href, \"_blank\", \"height=430,width=640\"); return false;"' expr:title='data:top.shareToFacebookMsg' target='_blank'><span class='share-button-link-text'><data:top.shareToFacebookMsg/></span></a></b:if><b:if cond='data:top.showPinterestButton'><a class='goog-inline-block share-button sb-pinterest' expr:href='data:post.sharePostUrl + "&target=pinterest"' expr:title='data:top.shareToPinterestMsg' target='_blank'><span class='share-button-link-text'><data:top.shareToPinterestMsg/></span></a></b:if><b:if cond='data:top.showDummy'><div class='goog-inline-block dummy-container'><data:post.dummyTag/></div></b:if>
</b:includable>
<b:includable id='status-message'>
<b:if cond='data:navMessage'>
<div class='status-msg-wrap'>
<div class='status-msg-body'>
<data:navMessage/>
</div>
<div class='status-msg-border'>
<div class='status-msg-bg'>
<div class='status-msg-hidden'><data:navMessage/></div>
</div>
</div>
</div>
<div style='clear: both;'/>
</b:if>
</b:includable>
<b:includable id='threaded-comment-form' var='post'>
<div class='comment-form'>
<a name='comment-form'/>
<b:if cond='data:mobile'>
<p><data:blogCommentMessage/></p>
<data:blogTeamBlogMessage/>
<a expr:href='data:post.commentFormIframeSrc' id='comment-editor-src'/>
<iframe allowtransparency='true' class='blogger-iframe-colorize blogger-comment-from-post' frameborder='0' height='410' id='comment-editor' name='comment-editor' src='' style='display: none' width='100%'/>
<b:else/>
<p><data:blogCommentMessage/></p>
<data:blogTeamBlogMessage/>
<a expr:href='data:post.commentFormIframeSrc' id='comment-editor-src'/>
<iframe allowtransparency='true' class='blogger-iframe-colorize blogger-comment-from-post' frameborder='0' height='410' id='comment-editor' name='comment-editor' src='' width='100%'/>
</b:if>
<data:post.friendConnectJs/>
<data:post.cmtfpIframe/>
<script type='text/javascript'>
BLOG_CMT_createIframe('<data:post.appRpcRelayPath/>');
</script>
</div>
</b:includable>
<b:includable id='threaded_comment_js' var='post'>
<script async='async' expr:src='data:post.commentSrc' type='text/javascript'/>
<script type='text/javascript'>
(function() {
var items = <data:post.commentJso/>;
var msgs = <data:post.commentMsgs/>;
var config = <data:post.commentConfig/>;
// <![CDATA[
var cursor = null;
if (items && items.length > 0) {
cursor = parseInt(items[items.length - 1].timestamp) + 1;
}
var bodyFromEntry = function(entry) {
if (entry.gd$extendedProperty) {
for (var k in entry.gd$extendedProperty) {
if (entry.gd$extendedProperty[k].name == 'blogger.contentRemoved') {
return '<span class="deleted-comment">' + entry.content.$t + '</span>';
}
}
}
return entry.content.$t;
}
var parse = function(data) {
cursor = null;
var comments = [];
if (data && data.feed && data.feed.entry) {
for (var i = 0, entry; entry = data.feed.entry[i]; i++) {
var comment = {};
// comment ID, parsed out of the original id format
var id = /blog-(\d+).post-(\d+)/.exec(entry.id.$t);
comment.id = id ? id[2] : null;
comment.body = bodyFromEntry(entry);
comment.timestamp = Date.parse(entry.published.$t) + '';
if (entry.author && entry.author.constructor === Array) {
var auth = entry.author[0];
if (auth) {
comment.author = {
name: (auth.name ? auth.name.$t : undefined),
profileUrl: (auth.uri ? auth.uri.$t : undefined),
avatarUrl: (auth.gd$image ? auth.gd$image.src : undefined)
};
}
}
if (entry.link) {
if (entry.link[2]) {
comment.link = comment.permalink = entry.link[2].href;
}
if (entry.link[3]) {
var pid = /.*comments\/default\/(\d+)\?.*/.exec(entry.link[3].href);
if (pid && pid[1]) {
comment.parentId = pid[1];
}
}
}
comment.deleteclass = 'item-control blog-admin';
if (entry.gd$extendedProperty) {
for (var k in entry.gd$extendedProperty) {
if (entry.gd$extendedProperty[k].name == 'blogger.itemClass') {
comment.deleteclass += ' ' + entry.gd$extendedProperty[k].value;
} else if (entry.gd$extendedProperty[k].name == 'blogger.displayTime') {
comment.displayTime = entry.gd$extendedProperty[k].value;
}
}
}
comments.push(comment);
}
}
return comments;
};
var paginator = function(callback) {
if (hasMore()) {
var url = config.feed + '?alt=json&v=2&orderby=published&reverse=false&max-results=50';
if (cursor) {
url += '&published-min=' + new Date(cursor).toISOString();
}
window.bloggercomments = function(data) {
var parsed = parse(data);
cursor = parsed.length < 50 ? null
: parseInt(parsed[parsed.length - 1].timestamp) + 1
callback(parsed);
window.bloggercomments = null;
}
url += '&callback=bloggercomments';
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = url;
document.getElementsByTagName('head')[0].appendChild(script);
}
};
var hasMore = function() {
return !!cursor;
};
var getMeta = function(key, comment) {
if ('iswriter' == key) {
var matches = !!comment.author
&& comment.author.name == config.authorName
&& comment.author.profileUrl == config.authorUrl;
return matches ? 'true' : '';
} else if ('deletelink' == key) {
return config.baseUri + '/delete-comment.g?blogID='
+ config.blogId + '&postID=' + comment.id;
} else if ('deleteclass' == key) {
return comment.deleteclass;
}
return '';
};
var replybox = null;
var replyUrlParts = null;
var replyParent = undefined;
var onReply = function(commentId, domId) {
if (replybox == null) {
// lazily cache replybox, and adjust to suit this style:
replybox = document.getElementById('comment-editor');
if (replybox != null) {
replybox.height = '250px';
replybox.style.display = 'block';
replyUrlParts = replybox.src.split('#');
}
}
if (replybox && (commentId !== replyParent)) {
document.getElementById(domId).insertBefore(replybox, null);
replybox.src = replyUrlParts[0]
+ (commentId ? '&parentID=' + commentId : '')
+ '#' + replyUrlParts[1];
replyParent = commentId;
}
};
var hash = (window.location.hash || '#').substring(1);
var startThread, targetComment;
if (/^comment-form_/.test(hash)) {
startThread = hash.substring('comment-form_'.length);
} else if (/^c[0-9]+$/.test(hash)) {
targetComment = hash.substring(1);
}
// Configure commenting API:
var configJso = {
'maxDepth': config.maxThreadDepth
};
var provider = {
'id': config.postId,
'data': items,
'loadNext': paginator,
'hasMore': hasMore,
'getMeta': getMeta,
'onReply': onReply,
'rendered': true,
'initComment': targetComment,
'initReplyThread': startThread,
'config': configJso,
'messages': msgs
};
var render = function() {
if (window.goog && window.goog.comments) {
var holder = document.getElementById('comment-holder');
window.goog.comments.render(holder, provider);
}
};
// render now, or queue to render when library loads:
if (window.goog && window.goog.comments) {
render();
} else {
window.goog = window.goog || {};
window.goog.comments = window.goog.comments || {};
window.goog.comments.loadQueue = window.goog.comments.loadQueue || [];
window.goog.comments.loadQueue.push(render);
}
})();
// ]]>
</script>
</b:includable>
<b:includable id='threaded_comments' var='post'>
<div class='comments' id='comments'>
<a name='comments'/>
<h4><data:post.commentLabelFull/>:</h4>
<div class='comments-content'>
<b:if cond='data:post.embedCommentForm'>
<b:include data='post' name='threaded_comment_js'/>
</b:if>
<div id='comment-holder'>
<data:post.commentHtml/>
</div>
</div>
<p class='comment-footer'>
<b:if cond='data:post.allowNewComments'>
<b:include data='post' name='threaded-comment-form'/>
<b:else/>
<data:post.noNewCommentsText/>
</b:if>
</p>
<b:if cond='data:showCmtPopup'>
<div id='comment-popup'>
<iframe allowtransparency='true' frameborder='0' id='comment-actions' name='comment-actions' scrolling='no'>
</iframe>
</div>
</b:if>
<div id='backlinks-container'>
<div expr:id='data:widget.instanceId + "_backlinks-container"'>
<b:if cond='data:post.showBacklinks'>
<b:include data='post' name='backlinks'/>
</b:if>
</div>
</div>
</div>
</b:includable>
</b:widget>
</b:section>
</div>
</div>
<div class='column-left-outer'>
<div class='column-left-inner'>
<aside>
<macro:include id='main-column-left-sections' name='sections'>
<macro:param default='0' name='num'/>
<macro:param default='sidebar-left' name='idPrefix'/>
<macro:param default='sidebar' name='class'/>
<macro:param default='true' name='includeBottom'/>
</macro:include>
</aside>
</div>
</div>
<div class='column-right-outer'>
<div class='column-right-inner'>
<aside>
<macro:include id='main-column-right-sections' name='sections'>
<macro:param default='2' name='num'/>
<macro:param default='sidebar-right' name='idPrefix'/>
<macro:param default='sidebar' name='class'/>
<macro:param default='true' name='includeBottom'/>
</macro:include>
</aside>
</div>
</div>
</div>
<div style='clear: both'/>
<!-- columns -->
</div>
<!-- main -->
</div>
</div>
<div class='main-cap-bottom cap-bottom'>
<div class='cap-left'/>
<div class='cap-right'/>
</div>
</div>
<footer>
<div class='footer-outer'>
<div class='footer-cap-top cap-top'>
<div class='cap-left'/>
<div class='cap-right'/>
</div>
<div class='fauxborder-left footer-fauxborder-left'>
<div class='fauxborder-right footer-fauxborder-right'/>
<div class='region-inner footer-inner'>
<macro:include id='footer-sections' name='sections'>
<macro:param default='2' name='num'/>
<macro:param default='footer' name='idPrefix'/>
<macro:param default='foot' name='class'/>
<macro:param default='false' name='includeBottom'/>
</macro:include>
<!-- outside of the include in order to lock Attribution widget -->
<b:section class='foot' id='footer-3' showaddelement='no'>
<b:widget id='Attribution1' locked='true' title='' type='Attribution'>
<b:includable id='main'>
<b:if cond='data:feedbackSurveyLink'>
<div class='mobile-survey-link' style='text-align: center;'>
<data:feedbackSurveyLink/>
</div>
</b:if>
<div class='widget-content' style='text-align: center;'>
<b:if cond='data:attribution != ""'>
<data:attribution/>
</b:if>
</div>
<b:include name='quickedit'/>
</b:includable>
</b:widget>
</b:section>
</div>
</div>
<div class='footer-cap-bottom cap-bottom'>
<div class='cap-left'/>
<div class='cap-right'/>
</div>
</div>
</footer>
<!-- content -->
</div>
</div>
<div class='content-cap-bottom cap-bottom'>
<div class='cap-left'/>
<div class='cap-right'/>
</div>
</div>
</div>
<script type='text/javascript'>
window.setTimeout(function() {
document.body.className = document.body.className.replace('loading', '');
}, 10);
$(function() {
prettyPrint();
});
</script>
</body>
<macro:includable id='sections' var='col'>
<macro:if cond='data:col.num == 0'>
<macro:else/>
<b:section mexpr:class='data:col.class' mexpr:id='data:col.idPrefix + "-1"' preferred='yes' showaddelement='yes'/>
<macro:if cond='data:col.num >= 2'>
<table border='0' cellpadding='0' cellspacing='0' mexpr:class='"section-columns columns-" + data:col.num'>
<tbody>
<tr>
<td class='first columns-cell'>
<b:section mexpr:class='data:col.class' mexpr:id='data:col.idPrefix + "-2-1"'/>
</td>
<td class='columns-cell'>
<b:section mexpr:class='data:col.class' mexpr:id='data:col.idPrefix + "-2-2"'/>
</td>
<macro:if cond='data:col.num >= 3'>
<td class='columns-cell'>
<b:section mexpr:class='data:col.class' mexpr:id='data:col.idPrefix + "-2-3"'/>
</td>
</macro:if>
<macro:if cond='data:col.num >= 4'>
<td class='columns-cell'>
<b:section mexpr:class='data:col.class' mexpr:id='data:col.idPrefix + "-2-4"'/>
</td>
</macro:if>
</tr>
</tbody>
</table>
<macro:if cond='data:col.includeBottom'>
<b:section mexpr:class='data:col.class' mexpr:id='data:col.idPrefix + "-3"' showaddelement='no'/>
</macro:if>
</macro:if>
</macro:if>
</macro:includable>
<b:section-contents id='sidebar-right-1'>
<b:widget id='Label1' locked='false' title='Etiquetas' type='Label'>
<b:includable id='main'>
<b:if cond='data:title'>
<h2><data:title/></h2>
</b:if>
<div expr:class='"widget-content " + data:display + "-label-widget-content"'>
<b:if cond='data:display == "list"'>
<ul>
<b:loop values='data:labels' var='label'>
<li>
<b:if cond='data:blog.url == data:label.url'>
<span expr:dir='data:blog.languageDirection'><data:label.name/></span>
<b:else/>
<a expr:dir='data:blog.languageDirection' expr:href='data:label.url'><data:label.name/></a>
</b:if>
<b:if cond='data:showFreqNumbers'>
<span dir='ltr'>(<data:label.count/>)</span>
</b:if>
</li>
</b:loop>
</ul>
<b:else/>
<b:loop values='data:labels' var='label'>
<span expr:class='"label-size label-size-" + data:label.cssSize'>
<b:if cond='data:blog.url == data:label.url'>
<span expr:dir='data:blog.languageDirection'><data:label.name/></span>
<b:else/>
<a expr:dir='data:blog.languageDirection' expr:href='data:label.url'><data:label.name/></a>
</b:if>
<b:if cond='data:showFreqNumbers'>
<span class='label-count' dir='ltr'>(<data:label.count/>)</span>
</b:if>
</span>
</b:loop>
</b:if>
<b:include name='quickedit'/>
</div>
</b:includable>
</b:widget>
</b:section-contents><b:section-contents id='sidebar-right-2-1'>
<b:widget id='Profile1' locked='false' title='Datos personales' type='Profile'>
<b:includable id='main'>
<b:if cond='data:title != ""'>
<h2><data:title/></h2>
</b:if>
<div class='widget-content'>
<b:if cond='data:team == "true"'> <!-- team blog profile -->
<ul>
<b:loop values='data:authors' var='i'>
<li><a class='profile-name-link g-profile' expr:href='data:i.userUrl' expr:style='"background-image: url(" + data:i.profileLogo + ");"'><data:i.display-name/></a></li>
</b:loop>
</ul>
<b:else/> <!-- normal blog profile -->
<b:if cond='data:photo.url != ""'>
<a expr:href='data:userUrl'><img class='profile-img' expr:alt='data:photo.alt' expr:height='data:photo.height' expr:src='data:photo.url' expr:width='data:photo.width'/></a>
</b:if>
<dl class='profile-datablock'>
<dt class='profile-data'>
<a class='profile-name-link g-profile' expr:href='data:userUrl' expr:style='"background-image: url(" + data:profileLogo + ");"' rel='author'>
<data:displayname/>
</a>
<b:if cond='data:hasgoogleprofile'>
<br/>
<div class='g-follow' data-annotation='bubble' data-height='20' expr:data-href='data:userUrl'/>
</b:if>
</dt>
<b:if cond='data:showlocation == "true"'>
<dd class='profile-data'><data:location/></dd>
</b:if>
<b:if cond='data:aboutme != ""'><dd class='profile-textblock'><data:aboutme/></dd></b:if>
</dl>
<a class='profile-link' expr:href='data:userUrl' rel='author'><data:viewProfileMsg/></a>
</b:if>
<b:include name='quickedit'/>
</div>
</b:includable>
</b:widget>
</b:section-contents><b:section-contents id='sidebar-right-2-2'/><b:section-contents id='sidebar-right-3'>
<b:widget id='Followers1' locked='false' title='Seguidores' type='Followers'>
<b:includable id='main'>
<b:if cond='data:title != ""'>
<b:if cond='data:codeSnippet != ""'>
<h2 class='title'><data:title/></h2>
<b:else/>
<b:if cond='data:totalFollowerCount != ""'>
<h2 class='title'><data:title/> (<data:totalFollowerCount/>)</h2>
</b:if>
</b:if>
</b:if>
<div class='widget-content'>
<div expr:id='data:widget.instanceId + "-wrapper"'>
<b:if cond='data:codeSnippet != ""'>
<div style='margin-right:2px;'>
<data:codeSnippet/>
</div>
<b:else/>
<b:if cond='data:totalFollowerCount == ""'>
<span class='item-control following-not-admin'>
<b><data:failureSnippet/></b>
</span>
<span class='item-control blog-admin'>
<b><data:adminFailureSnippet/></b>
</span>
<b:else/>
<b:if cond='data:followingLinkPresent'>
<div class='follow-this profile-link item-control following-follow-this'>
<a expr:href='"javascript:_FollowersView._openPopup(\"" + data:followUri + "\");"'>
<data:followThisMessage/>
</a>
</div>
<div class='follow-this profile-link item-control following-stop-following-this'>
<a expr:href='"javascript:_FollowersView._openPopup(\"" + data:followUri + "\");"'>
<data:stopFollowingMessage/>
</a>
</div>
</b:if>
<div class='followers-grid'>
<b:if cond='data:totalFollowerCount == 0'>
<div class='profile-link item-control following-follow-this'>
<data:emptyFollowersMessage/>
</div>
</b:if>
<!--
Relies on the js written out in navbar.gxp
-->
<b:loop values='data:followers' var='follower'>
<div class='follower'>
<a expr:href='data:follower.profileUrl' expr:title='data:follower.displayName' rel='nofollow'>
<img class='follower-img' expr:alt='data:follower.displayName' expr:height='data:follower.imageHeight' expr:onerror='"this.onerror=null;this.src=\"" + data:anonFollowerImageUrl + "\";"' expr:onload='"setAttributeOnload(this, \"src\", \"" + data:follower.imageUrl + "\")"' expr:width='data:follower.imageWidth' src='http://img1.blogblog.com/img/blank.gif'/>
</a>
</div>
</b:loop>
<div class='clear'/>
</div>
<div class='followers-canvas profile-link'>
<data:followersFooterMessage/>
<span class='item-control following-not-admin'>
<a expr:href='data:followersUri'>
<data:viewAllMessage/>
</a>
</span>
<span class='item-control blog-admin'>
<a expr:href='data:manageFollowersUri'>
<data:manageFollowersMessage/>
</a>
</span>
</div>
</b:if>
</b:if>
</div>
<b:include name='quickedit'/>
</div>
</b:includable>
</b:widget>
</b:section-contents><b:section-contents id='footer-1'/><b:section-contents id='footer-2-1'/><b:section-contents id='footer-2-2'/></html>
Migrar un diagrama de base de datos a otra base
/*
SrsScriptDiagram
Adapted from script found online at http://www.conceptdevelopment.net/Database/ScriptDiagram2008/
This script will extract the database diagram @DiagramName from <Database Name> and build
a script that can be used to load that diagram into another copy of the database.
Instructions:
1. Open this script in SQL Server Management Studio
2. Use the Specify values for Template Parameters (Ctrl+Shift+M) to set parameter values:
2a. Replace <Database Name,,> with the source database name.
2b. Replace <Diagram Name,,MainDiagram> with the desired diagram name.
3. Change the value of @TargetDatabase to the target database name, or leave as db_name() to use the current database.
4. Execute the script to build a diagram load script.
5. Save the output script.
6. Run the output script on a copy of the target database to restore the diagram.
Modification History:
Downloaded script from http://www.conceptdevelopment.net/Database/ScriptDiagram2008/
Formatting cleaned up to bring it closer to our standards.
Diagram name creation was set to original name if possible, date/time suffix is only used for uniqueness if needed.
Added explicit Target Database variable
Refactored FOR Template Parameters
*/
USE CFE
GO
DECLARE @DiagramName varchar(128)
, @TargetDatabase nvarchar(255)
SELECT @DiagramName = 'DiagramaCompleto'
, @TargetDatabase = db_name()
DECLARE @diagram_id int
, @index int
, @size int
, @chunk int
, @line varchar(max)
, @eol varchar(10)
, @CurrentDateString nvarchar(100)
-- Set start index, and chunk 'constant' value
SELECT @index = 1 --
, @chunk = 32 -- values that work: 2, 6
-- values that fail: 15,16, 64
, @eol = char(13) + char(10)
, @CurrentDateString = convert ( varchar(60) , sysdatetimeoffset() , 121 )
-- Get PK diagram_id using the diagram's name (which is what the user is familiar with)
SELECT @diagram_id = diagram_id
, @size = DATALENGTH(definition)
FROM sysdiagrams sd
WHERE sd.[name] = @DiagramName
IF ( @diagram_id IS NULL )
BEGIN
print '/**<error>' + @eol + @eol + 'Diagram name [' + @DiagramName + '] could not be found.' + @eol + @eol + '</error>*/'
END
ELSE -- Diagram exists
BEGIN
-- Now with the diagram_id, do all the work
print '/**'
print '<summary>'
print 'Restore diagram ''' + @DiagramName + ''''
print '</summary>'
print '<remarks>'
print 'Generated by SrsScriptDiagram Script'
print 'Will attempt to create [sysdiagrams] table if it doesn''t already exist'
print '</remarks>'
print '<generated>' + @CurrentDateString + '</generated>'
print '*/'
print ''
print ''
print 'USE ' + @TargetDatabase
print ''
print 'print ''=== Tool_ScriptDiagram2008 restore diagram [' + @DiagramName + '] ==='''
print ' -- If the sysdiagrams table has not been created in this database, create it!
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = ''sysdiagrams'')
BEGIN
-- Create table script generated by Sql Server Management Studio
-- _Assume_ this is roughly equivalent to what Sql Server/Management Studio
-- creates the first time you add a diagram to a 2008 database
CREATE TABLE [dbo].[sysdiagrams]
(
[name] [sysname] NOT NULL,
[principal_id] [int] NOT NULL,
[diagram_id] [int] IDENTITY(1,1) NOT NULL,
[version] [int] NULL,
[definition] [varbinary](max) NULL,
PRIMARY KEY CLUSTERED ( [diagram_id] ASC ) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ,
CONSTRAINT [UK_principal_name] UNIQUE NONCLUSTERED ( [principal_id] ASC , [name] ASC ) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF)
)
EXEC sys.sp_addextendedproperty @name=N''microsoft_database_tools_support'', @value=1 , @level0type=N''SCHEMA'',@level0name=N''dbo'', @level1type=N''TABLE'',@level1name=N''sysdiagrams''
print ''[sysdiagrams] table was created as it did not already exist''
END
-- Target table will now exist, if it didn''t before'
print 'SET NOCOUNT ON -- Hide (1 row affected) messages'
print 'DECLARE @newid INT'
print 'DECLARE @DiagramSuffix varchar (50)'
print 'DECLARE @NewDiagramName nvarchar(100)' -- asw 2010/03/25 use default name if diagram does not already exist.
print ''
print 'SET @DiagramSuffix = '' '' + LEFT(CONVERT(VARCHAR(23), GETDATE(), 121), 16)'
print ''
print 'IF EXISTS ( SELECT * FROM sysdiagrams sd WHERE ( sd.name = ''' + @DiagramName + ''' ) )'
print 'BEGIN'
print ' print ''Suffix diagram name with date, to ensure uniqueness.'''
print ' SELECT @NewDiagramName = ''' + @DiagramName + ''' + '' '' + LEFT(CONVERT(VARCHAR(23), GETDATE(), 121), 16)'
print 'END'
print 'ELSE'
print 'BEGIN'
print ' print ''Use diagram name without suffix.'''
print ' SELECT @NewDiagramName = ''' + @DiagramName + ''''
print 'END'
print ''
print 'print ''Create row for new diagram'''
-- Output the INSERT that _creates_ the diagram record, with a non-NULL [definition],
-- important because .WRITE *cannot* be called against a NULL value (in the WHILE loop)
-- so we insert 0x so that .WRITE has 'something' to append to...
print 'BEGIN TRY'
print ' print ''Write diagram ' + @DiagramName + ' as '' + @NewDiagramName + '' into new row (and get [diagram_id])'''
SELECT @line =
' INSERT INTO sysdiagrams ([name], [principal_id], [version], [definition])'
+ ' VALUES ( @NewDiagramName , '+ CAST (sd.principal_id AS VARCHAR(100))+', '+CAST (sd.version AS VARCHAR(100))+', 0x)'
FROM sysdiagrams sd
WHERE ( sd.diagram_id = @diagram_id )
print @line
print ' SET @newid = SCOPE_IDENTITY()'
print 'END TRY'
print 'BEGIN CATCH'
print ' print ''XxXxX '' + Error_Message() + '' XxXxX'''
print ' print ''XxXxX END Tool_ScriptDiagram2008 - fix the error before running again XxXxX'''
print ' RETURN'
print 'END CATCH'
print ''
print 'print ''Now add all the binary data...'''
print 'BEGIN TRY'
WHILE ( @index < @size )
BEGIN
-- Output as many UPDATE statements as required to append all the diagram binary
-- data, represented as hexadecimal strings
SELECT @line =
' UPDATE sysdiagrams SET [definition] .Write ('
+ ' ' + UPPER(sys.fn_varbintohexstr (SUBSTRING (sd.definition, @index, @chunk)))
+ ', null, 0) WHERE ( diagram_id = @newid ) -- index:' + CAST(@index AS VARCHAR(100))
FROM sysdiagrams sd
WHERE (sd.diagram_id = @diagram_id )
print @line
SET @index = @index + @chunk
END
print ''
print ' print ''=== Finished writing diagram id '' + CAST(@newid AS VARCHAR(100)) + '' ==='''
print ' print ''=== Refresh your Databases-[DbName]-Database Diagrams to see the new diagram ==='''
print 'END TRY'
print 'BEGIN CATCH'
print ' -- If we got here, the [definition] updates didn''t complete, so delete the diagram row'
print ' -- (and hope it doesn''t fail!)'
print ' DELETE FROM sysdiagrams WHERE diagram_id = @newid'
print ' print ''XxXxX '' + Error_Message() + '' XxXxX'''
print ' print ''XxXxX END Tool_ScriptDiagram2008 - fix the error before running again XxXxX'''
print ' RETURN'
print 'END CATCH'
END
print 'USE master'
print ''
SrsScriptDiagram
Adapted from script found online at http://www.conceptdevelopment.net/Database/ScriptDiagram2008/
This script will extract the database diagram @DiagramName from <Database Name> and build
a script that can be used to load that diagram into another copy of the database.
Instructions:
1. Open this script in SQL Server Management Studio
2. Use the Specify values for Template Parameters (Ctrl+Shift+M) to set parameter values:
2a. Replace <Database Name,,> with the source database name.
2b. Replace <Diagram Name,,MainDiagram> with the desired diagram name.
3. Change the value of @TargetDatabase to the target database name, or leave as db_name() to use the current database.
4. Execute the script to build a diagram load script.
5. Save the output script.
6. Run the output script on a copy of the target database to restore the diagram.
Modification History:
Downloaded script from http://www.conceptdevelopment.net/Database/ScriptDiagram2008/
Formatting cleaned up to bring it closer to our standards.
Diagram name creation was set to original name if possible, date/time suffix is only used for uniqueness if needed.
Added explicit Target Database variable
Refactored FOR Template Parameters
*/
USE CFE
GO
DECLARE @DiagramName varchar(128)
, @TargetDatabase nvarchar(255)
SELECT @DiagramName = 'DiagramaCompleto'
, @TargetDatabase = db_name()
DECLARE @diagram_id int
, @index int
, @size int
, @chunk int
, @line varchar(max)
, @eol varchar(10)
, @CurrentDateString nvarchar(100)
-- Set start index, and chunk 'constant' value
SELECT @index = 1 --
, @chunk = 32 -- values that work: 2, 6
-- values that fail: 15,16, 64
, @eol = char(13) + char(10)
, @CurrentDateString = convert ( varchar(60) , sysdatetimeoffset() , 121 )
-- Get PK diagram_id using the diagram's name (which is what the user is familiar with)
SELECT @diagram_id = diagram_id
, @size = DATALENGTH(definition)
FROM sysdiagrams sd
WHERE sd.[name] = @DiagramName
IF ( @diagram_id IS NULL )
BEGIN
print '/**<error>' + @eol + @eol + 'Diagram name [' + @DiagramName + '] could not be found.' + @eol + @eol + '</error>*/'
END
ELSE -- Diagram exists
BEGIN
-- Now with the diagram_id, do all the work
print '/**'
print '<summary>'
print 'Restore diagram ''' + @DiagramName + ''''
print '</summary>'
print '<remarks>'
print 'Generated by SrsScriptDiagram Script'
print 'Will attempt to create [sysdiagrams] table if it doesn''t already exist'
print '</remarks>'
print '<generated>' + @CurrentDateString + '</generated>'
print '*/'
print ''
print ''
print 'USE ' + @TargetDatabase
print ''
print 'print ''=== Tool_ScriptDiagram2008 restore diagram [' + @DiagramName + '] ==='''
print ' -- If the sysdiagrams table has not been created in this database, create it!
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = ''sysdiagrams'')
BEGIN
-- Create table script generated by Sql Server Management Studio
-- _Assume_ this is roughly equivalent to what Sql Server/Management Studio
-- creates the first time you add a diagram to a 2008 database
CREATE TABLE [dbo].[sysdiagrams]
(
[name] [sysname] NOT NULL,
[principal_id] [int] NOT NULL,
[diagram_id] [int] IDENTITY(1,1) NOT NULL,
[version] [int] NULL,
[definition] [varbinary](max) NULL,
PRIMARY KEY CLUSTERED ( [diagram_id] ASC ) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ,
CONSTRAINT [UK_principal_name] UNIQUE NONCLUSTERED ( [principal_id] ASC , [name] ASC ) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF)
)
EXEC sys.sp_addextendedproperty @name=N''microsoft_database_tools_support'', @value=1 , @level0type=N''SCHEMA'',@level0name=N''dbo'', @level1type=N''TABLE'',@level1name=N''sysdiagrams''
print ''[sysdiagrams] table was created as it did not already exist''
END
-- Target table will now exist, if it didn''t before'
print 'SET NOCOUNT ON -- Hide (1 row affected) messages'
print 'DECLARE @newid INT'
print 'DECLARE @DiagramSuffix varchar (50)'
print 'DECLARE @NewDiagramName nvarchar(100)' -- asw 2010/03/25 use default name if diagram does not already exist.
print ''
print 'SET @DiagramSuffix = '' '' + LEFT(CONVERT(VARCHAR(23), GETDATE(), 121), 16)'
print ''
print 'IF EXISTS ( SELECT * FROM sysdiagrams sd WHERE ( sd.name = ''' + @DiagramName + ''' ) )'
print 'BEGIN'
print ' print ''Suffix diagram name with date, to ensure uniqueness.'''
print ' SELECT @NewDiagramName = ''' + @DiagramName + ''' + '' '' + LEFT(CONVERT(VARCHAR(23), GETDATE(), 121), 16)'
print 'END'
print 'ELSE'
print 'BEGIN'
print ' print ''Use diagram name without suffix.'''
print ' SELECT @NewDiagramName = ''' + @DiagramName + ''''
print 'END'
print ''
print 'print ''Create row for new diagram'''
-- Output the INSERT that _creates_ the diagram record, with a non-NULL [definition],
-- important because .WRITE *cannot* be called against a NULL value (in the WHILE loop)
-- so we insert 0x so that .WRITE has 'something' to append to...
print 'BEGIN TRY'
print ' print ''Write diagram ' + @DiagramName + ' as '' + @NewDiagramName + '' into new row (and get [diagram_id])'''
SELECT @line =
' INSERT INTO sysdiagrams ([name], [principal_id], [version], [definition])'
+ ' VALUES ( @NewDiagramName , '+ CAST (sd.principal_id AS VARCHAR(100))+', '+CAST (sd.version AS VARCHAR(100))+', 0x)'
FROM sysdiagrams sd
WHERE ( sd.diagram_id = @diagram_id )
print @line
print ' SET @newid = SCOPE_IDENTITY()'
print 'END TRY'
print 'BEGIN CATCH'
print ' print ''XxXxX '' + Error_Message() + '' XxXxX'''
print ' print ''XxXxX END Tool_ScriptDiagram2008 - fix the error before running again XxXxX'''
print ' RETURN'
print 'END CATCH'
print ''
print 'print ''Now add all the binary data...'''
print 'BEGIN TRY'
WHILE ( @index < @size )
BEGIN
-- Output as many UPDATE statements as required to append all the diagram binary
-- data, represented as hexadecimal strings
SELECT @line =
' UPDATE sysdiagrams SET [definition] .Write ('
+ ' ' + UPPER(sys.fn_varbintohexstr (SUBSTRING (sd.definition, @index, @chunk)))
+ ', null, 0) WHERE ( diagram_id = @newid ) -- index:' + CAST(@index AS VARCHAR(100))
FROM sysdiagrams sd
WHERE (sd.diagram_id = @diagram_id )
print @line
SET @index = @index + @chunk
END
print ''
print ' print ''=== Finished writing diagram id '' + CAST(@newid AS VARCHAR(100)) + '' ==='''
print ' print ''=== Refresh your Databases-[DbName]-Database Diagrams to see the new diagram ==='''
print 'END TRY'
print 'BEGIN CATCH'
print ' -- If we got here, the [definition] updates didn''t complete, so delete the diagram row'
print ' -- (and hope it doesn''t fail!)'
print ' DELETE FROM sysdiagrams WHERE diagram_id = @newid'
print ' print ''XxXxX '' + Error_Message() + '' XxXxX'''
print ' print ''XxXxX END Tool_ScriptDiagram2008 - fix the error before running again XxXxX'''
print ' RETURN'
print 'END CATCH'
END
print 'USE master'
print ''
Listar las tablas que no tienen claves foranea (FK)
DECLARE @TablasConFk TABLE
(
[object_Id] int
)
INSERT @TablasConFk ( [object_Id] )
SELECT referenced_object_id
FROM sys.foreign_keys
UNION
SELECT [parent_object_id]
FROM sys.foreign_keys
SELECT name as Tabla
FROM sys.objects obj
LEFT OUTER JOIN @TablasConFk conFk ON ( obj.[object_id] = conFk.[object_Id] )
WHERE type_desc = 'USER_TABLE'
AND conFk.[object_Id] IS NULL
ORDER BY Tabla
(
[object_Id] int
)
INSERT @TablasConFk ( [object_Id] )
SELECT referenced_object_id
FROM sys.foreign_keys
UNION
SELECT [parent_object_id]
FROM sys.foreign_keys
SELECT name as Tabla
FROM sys.objects obj
LEFT OUTER JOIN @TablasConFk conFk ON ( obj.[object_id] = conFk.[object_Id] )
WHERE type_desc = 'USER_TABLE'
AND conFk.[object_Id] IS NULL
ORDER BY Tabla
Listar comentarios de tablas y campos
Listar comentarios de las tablas
SELECT objname, CONVERT(VARCHAR(500), value)
FROM ::FN_LISTEXTENDEDPROPERTY(N'MS_DESCRIPTION', N'USER', N'DBO', N'TABLE', NULL, NULL, NULL)
where objtype = 'TABLE'
Listar comentarios de los campos de una tabla
select
st.name [Table],
sc.name [Column],
sep.value [Description]
from sys.tables st
inner join sys.columns sc on st.object_id = sc.object_id
left join sys.extended_properties sep on st.object_id = sep.major_id
and sc.column_id = sep.minor_id
and sep.name = 'MS_Description'
where st.name = 'Nombre de la Tabla'
Con stored procedures...
//crea o actualiza la propiedad MS_description, de la tabla especificada
exec mer_ActualizarDescripcionTabla 'Cliente', 'tabla de clientes de la empresa'-
//actualiza o crea la propiedad especificada, para el campo de la tabla especifcadas, y le pone el valor indicado
exec mer_ActualizarPropiedadCampo 'Tipo', 'Cliente', 'Nombre', 'Nombre del cliente'
//elimina la propiedad MS_description, de la tabla especificada
exec mer_EliminarDescripcionTabla 'Cliente'
//elimina la propiedad que tenga el nombre especificado, del campo de la tabla especificados
exec mer_EliminarPropiedadCampo 'Tipo', 'Cliente', 'Nombre'
//lista los comentarios de todas las tablas
exec mer_listarComentariosTablas
//lista todas las propiedades del tipo especificado, de todos los campos de todas las tablas
exec mer_listarPropiedadesCampos 'Tipo'
//lista el valor de una propiedad dada de un campo de una tabla.
exec mer_listarPropiedadCampo 'Tipo', 'Cliente', 'FechaNacimiento'
Stored procedures
--Comienzo de SPs -------------------------------------------------------
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
CREATE PROCEDURE [dbo].[mer_ActualizarDescripcionTabla]
-- Los parámetros son el nombre de la tabla y la descripción
@nombre_tabla sysname = '',
@descripcion_tabla sql_variant = ''
AS
BEGIN
BEGIN TRY
IF EXISTS (SELECT OBJNAME AS 'tabla', VALUE AS 'COMENTARIO'
FROM ::FN_LISTEXTENDEDPROPERTY(N'MS_DESCRIPTION', N'USER', N'DBO', N'TABLE',
@nombre_tabla, NULL, NULL) XP
WHERE XP.NAME IN (N'MS_DESCRIPTION'))
EXEC sys.sp_updateextendedproperty
@name=N'MS_Description',
@value=@descripcion_tabla,
@level0type=N'SCHEMA',
@level0name=N'dbo',
@level1type=N'TABLE',
@level1name=@nombre_tabla
ELSE
EXEC sys.sp_addextendedproperty
@name=N'MS_Description',
@value=@descripcion_tabla,
@level0type=N'SCHEMA',
@level0name=N'dbo',
@level1type=N'TABLE',
@level1name=@nombre_tabla
END TRY
BEGIN CATCH
SELECT
ERROR_LINE() as ErrorLine,
ERROR_MESSAGE() as ErrorMessage;
PRINT 'No se pudo agregar la descripción ''' + convert(nvarchar(128),@descripcion_tabla) + '''a la tabla ' + convert(nvarchar(128),@nombre_tabla)
PRINT 'Error Line: ' + convert(varchar(50),ERROR_LINE())
PRINT 'ErrorMessage: ' + ERROR_MESSAGE()
ROLLBACK TRANSACTION
END CATCH
END
-------------------------------------------------------------------------------------------------------------
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
CREATE PROCEDURE [dbo].[mer_ActualizarPropiedadCampo]
-- Los parámetros son el nombre de la tabla, el nombre de la columna y la descripción
@propiedad sysname = '',
@nombre_tabla sysname = '',
@nombre_campo sysname = '',
@descripcion_campo sql_variant = ''
AS
BEGIN TRY
IF EXISTS(SELECT objname, value
FROM fn_listextendedproperty (@propiedad, N'schema', 'dbo',
N'table', @nombre_tabla, N'column', null) WHERE objname = @nombre_campo)
EXEC sys.sp_updateextendedproperty
@name=@propiedad,
@value=@descripcion_campo,
@level0type=N'SCHEMA',
@level0name=N'dbo',
@level1type=N'TABLE',
@level1name=@nombre_tabla,
@level2type=N'COLUMN',
@level2name=@nombre_campo
ELSE
EXEC sys.sp_addextendedproperty
@name=@propiedad,
@value=@descripcion_campo,
@level0type=N'SCHEMA',
@level0name=N'dbo',
@level1type=N'TABLE',
@level1name=@nombre_tabla,
@level2type=N'COLUMN',
@level2name=@nombre_campo
END TRY
BEGIN CATCH
SELECT
ERROR_LINE() as ErrorLine,
ERROR_MESSAGE() as ErrorMessage;
PRINT 'No se pudo agregar la descripción ''' + convert(nvarchar(128),@descripcion_campo) + '''al campo ' + convert(nvarchar(128),@nombre_campo) + ' en la tabla ' + convert(nvarchar(128),@nombre_tabla)
PRINT 'Error Line: ' + convert(varchar(50),ERROR_LINE())
PRINT 'ErrorMessage: ' + ERROR_MESSAGE()
ROLLBACK TRANSACTION
END CATCH
-------------------------------------------------------------------------------------------------------------
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
CREATE PROCEDURE [dbo].[mer_EliminarDescripcionTabla]
@nombre_tabla sysname = ''
AS
BEGIN TRY
EXEC sys.sp_dropextendedproperty
@name=N'MS_Description',
@level0type=N'SCHEMA',
@level0name=N'dbo',
@level1type=N'TABLE',
@level1name=@nombre_tabla
END TRY
BEGIN CATCH
SELECT
ERROR_LINE() as ErrorLine,
ERROR_MESSAGE() as ErrorMessage;
PRINT 'No se pudo agregar la descripción ''' + '''al campo ' + ' en la tabla ' + convert(nvarchar(128),@nombre_tabla)
PRINT 'Error Line: ' + convert(varchar(50),ERROR_LINE())
PRINT 'ErrorMessage: ' + ERROR_MESSAGE()
ROLLBACK TRANSACTION
END CATCH
-------------------------------------------------------------------------------------------------------------
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
CREATE PROCEDURE [dbo].[mer_EliminarPropiedadCampo]
@propiedad sysname = '',
@nombre_tabla sysname = '',
@nombre_campo sysname = ''
AS
BEGIN TRY
EXEC sys.sp_dropextendedproperty
@name=@propiedad,
@level0type=N'SCHEMA',
@level0name=N'dbo',
@level1type=N'TABLE',
@level1name=@nombre_tabla,
@level2type=N'COLUMN',
@level2name=@nombre_campo
END TRY
BEGIN CATCH
SELECT
ERROR_LINE() as ErrorLine,
ERROR_MESSAGE() as ErrorMessage;
PRINT 'No se pudo agregar la descripción ''' + '''al campo ' + convert(nvarchar(128),@nombre_campo) + ' en la tabla ' + convert(nvarchar(128),@nombre_tabla)
PRINT 'Error Line: ' + convert(varchar(50),ERROR_LINE())
PRINT 'ErrorMessage: ' + ERROR_MESSAGE()
ROLLBACK TRANSACTION
END CATCH
-------------------------------------------------------------------------------------------------------------
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
CREATE PROCEDURE [dbo].[mer_ListarComentariosTablas]
AS
DECLARE @comentarios TABLE(tabla sysname, descripcion VARCHAR(500))
INSERT INTO @comentarios (tabla, descripcion)
SELECT objname, CONVERT(VARCHAR(500), value)
FROM ::FN_LISTEXTENDEDPROPERTY(N'MS_DESCRIPTION', N'USER', N'DBO', N'TABLE', NULL, NULL, NULL)
INSERT INTO @comentarios (tabla)
SELECT table_name
FROM information_schema.tables
WHERE table_name NOT IN
(select tabla FROM @comentarios)
AND TABLE_TYPE <> 'VIEW'
SELECT * from @comentarios ORDER BY tabla
-------------------------------------------------------------------------------------------------------------
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
CREATE PROCEDURE [dbo].[mer_ListarPropiedadesCampos]
@propiedad sysname = ''
AS
DECLARE @propiedades TABLE (
esquema sysname,
tabla sysname,
columna sysname,
valor VARCHAR(500))
DECLARE c CURSOR FOR
SELECT table_schema, table_name
FROM information_schema.tables
WHERE table_type != 'VIEW'
DECLARE @s sysname, @t sysname
OPEN c
FETCH c INTO @s, @t
WHILE @@FETCH_STATUS = 0 BEGIN
INSERT INTO @propiedades (esquema, tabla, columna, valor)
SELECT @s, @t, objname, convert(varchar(500), value)
FROM fn_listextendedproperty (@propiedad, N'schema', @s, N'table', @t, N'column', null);
FETCH c INTO @s, @t
END
CLOSE c
DEALLOCATE c
INSERT INTO @propiedades (esquema, tabla, columna)
SELECT table_schema, table_name, column_name
FROM information_schema.columns s
WHERE table_name IN
(SELECT table_name
FROM information_schema.tables
where TABLE_TYPE <> 'VIEW')
AND NOT EXISTS
(SELECT *
FROM @propiedades c
WHERE s.table_schema = c.esquema
AND s.table_name = c.tabla
AND s.column_name = c.columna)
SELECT *
FROM @propiedades
ORDER BY esquema, tabla, columna
-------------------------------------------------------------------------------------------------------------
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
CREATE PROCEDURE [dbo].[mer_ListarPropiedadCampo]
@propiedad sysname = '',
@tabla sysname = '',
@campo sysname = ''
AS
DECLARE @propiedades TABLE (
esquema sysname,
tabla sysname,
columna sysname,
valor VARCHAR(500))
DECLARE c CURSOR FOR
SELECT table_schema, table_name
FROM information_schema.tables
WHERE table_type != 'VIEW' and
table_name = @tabla
DECLARE @s sysname, @t sysname
OPEN c
FETCH c INTO @s, @t
WHILE @@FETCH_STATUS = 0 BEGIN
INSERT INTO @propiedades (esquema, tabla, columna, valor)
SELECT @s, @t, objname, convert(varchar(500), value)
FROM fn_listextendedproperty (@propiedad, N'schema', @s, N'table', @tabla, N'column', @campo);
FETCH c INTO @s, @t
END
CLOSE c
DEALLOCATE c
select *
from @propiedades
SELECT objname, CONVERT(VARCHAR(500), value)
FROM ::FN_LISTEXTENDEDPROPERTY(N'MS_DESCRIPTION', N'USER', N'DBO', N'TABLE', NULL, NULL, NULL)
where objtype = 'TABLE'
Listar comentarios de los campos de una tabla
select
st.name [Table],
sc.name [Column],
sep.value [Description]
from sys.tables st
inner join sys.columns sc on st.object_id = sc.object_id
left join sys.extended_properties sep on st.object_id = sep.major_id
and sc.column_id = sep.minor_id
and sep.name = 'MS_Description'
where st.name = 'Nombre de la Tabla'
and sc.name = 'Nombre del campo'
Con stored procedures...
//crea o actualiza la propiedad MS_description, de la tabla especificada
exec mer_ActualizarDescripcionTabla 'Cliente', 'tabla de clientes de la empresa'-
//actualiza o crea la propiedad especificada, para el campo de la tabla especifcadas, y le pone el valor indicado
exec mer_ActualizarPropiedadCampo 'Tipo', 'Cliente', 'Nombre', 'Nombre del cliente'
//elimina la propiedad MS_description, de la tabla especificada
exec mer_EliminarDescripcionTabla 'Cliente'
//elimina la propiedad que tenga el nombre especificado, del campo de la tabla especificados
exec mer_EliminarPropiedadCampo 'Tipo', 'Cliente', 'Nombre'
//lista los comentarios de todas las tablas
exec mer_listarComentariosTablas
//lista todas las propiedades del tipo especificado, de todos los campos de todas las tablas
exec mer_listarPropiedadesCampos 'Tipo'
//lista el valor de una propiedad dada de un campo de una tabla.
exec mer_listarPropiedadCampo 'Tipo', 'Cliente', 'FechaNacimiento'
Stored procedures
--Comienzo de SPs -------------------------------------------------------
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
CREATE PROCEDURE [dbo].[mer_ActualizarDescripcionTabla]
-- Los parámetros son el nombre de la tabla y la descripción
@nombre_tabla sysname = '',
@descripcion_tabla sql_variant = ''
AS
BEGIN
BEGIN TRY
IF EXISTS (SELECT OBJNAME AS 'tabla', VALUE AS 'COMENTARIO'
FROM ::FN_LISTEXTENDEDPROPERTY(N'MS_DESCRIPTION', N'USER', N'DBO', N'TABLE',
@nombre_tabla, NULL, NULL) XP
WHERE XP.NAME IN (N'MS_DESCRIPTION'))
EXEC sys.sp_updateextendedproperty
@name=N'MS_Description',
@value=@descripcion_tabla,
@level0type=N'SCHEMA',
@level0name=N'dbo',
@level1type=N'TABLE',
@level1name=@nombre_tabla
ELSE
EXEC sys.sp_addextendedproperty
@name=N'MS_Description',
@value=@descripcion_tabla,
@level0type=N'SCHEMA',
@level0name=N'dbo',
@level1type=N'TABLE',
@level1name=@nombre_tabla
END TRY
BEGIN CATCH
SELECT
ERROR_LINE() as ErrorLine,
ERROR_MESSAGE() as ErrorMessage;
PRINT 'No se pudo agregar la descripción ''' + convert(nvarchar(128),@descripcion_tabla) + '''a la tabla ' + convert(nvarchar(128),@nombre_tabla)
PRINT 'Error Line: ' + convert(varchar(50),ERROR_LINE())
PRINT 'ErrorMessage: ' + ERROR_MESSAGE()
ROLLBACK TRANSACTION
END CATCH
END
-------------------------------------------------------------------------------------------------------------
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
CREATE PROCEDURE [dbo].[mer_ActualizarPropiedadCampo]
-- Los parámetros son el nombre de la tabla, el nombre de la columna y la descripción
@propiedad sysname = '',
@nombre_tabla sysname = '',
@nombre_campo sysname = '',
@descripcion_campo sql_variant = ''
AS
BEGIN TRY
IF EXISTS(SELECT objname, value
FROM fn_listextendedproperty (@propiedad, N'schema', 'dbo',
N'table', @nombre_tabla, N'column', null) WHERE objname = @nombre_campo)
EXEC sys.sp_updateextendedproperty
@name=@propiedad,
@value=@descripcion_campo,
@level0type=N'SCHEMA',
@level0name=N'dbo',
@level1type=N'TABLE',
@level1name=@nombre_tabla,
@level2type=N'COLUMN',
@level2name=@nombre_campo
ELSE
EXEC sys.sp_addextendedproperty
@name=@propiedad,
@value=@descripcion_campo,
@level0type=N'SCHEMA',
@level0name=N'dbo',
@level1type=N'TABLE',
@level1name=@nombre_tabla,
@level2type=N'COLUMN',
@level2name=@nombre_campo
END TRY
BEGIN CATCH
SELECT
ERROR_LINE() as ErrorLine,
ERROR_MESSAGE() as ErrorMessage;
PRINT 'No se pudo agregar la descripción ''' + convert(nvarchar(128),@descripcion_campo) + '''al campo ' + convert(nvarchar(128),@nombre_campo) + ' en la tabla ' + convert(nvarchar(128),@nombre_tabla)
PRINT 'Error Line: ' + convert(varchar(50),ERROR_LINE())
PRINT 'ErrorMessage: ' + ERROR_MESSAGE()
ROLLBACK TRANSACTION
END CATCH
-------------------------------------------------------------------------------------------------------------
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
CREATE PROCEDURE [dbo].[mer_EliminarDescripcionTabla]
@nombre_tabla sysname = ''
AS
BEGIN TRY
EXEC sys.sp_dropextendedproperty
@name=N'MS_Description',
@level0type=N'SCHEMA',
@level0name=N'dbo',
@level1type=N'TABLE',
@level1name=@nombre_tabla
END TRY
BEGIN CATCH
SELECT
ERROR_LINE() as ErrorLine,
ERROR_MESSAGE() as ErrorMessage;
PRINT 'No se pudo agregar la descripción ''' + '''al campo ' + ' en la tabla ' + convert(nvarchar(128),@nombre_tabla)
PRINT 'Error Line: ' + convert(varchar(50),ERROR_LINE())
PRINT 'ErrorMessage: ' + ERROR_MESSAGE()
ROLLBACK TRANSACTION
END CATCH
-------------------------------------------------------------------------------------------------------------
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
CREATE PROCEDURE [dbo].[mer_EliminarPropiedadCampo]
@propiedad sysname = '',
@nombre_tabla sysname = '',
@nombre_campo sysname = ''
AS
BEGIN TRY
EXEC sys.sp_dropextendedproperty
@name=@propiedad,
@level0type=N'SCHEMA',
@level0name=N'dbo',
@level1type=N'TABLE',
@level1name=@nombre_tabla,
@level2type=N'COLUMN',
@level2name=@nombre_campo
END TRY
BEGIN CATCH
SELECT
ERROR_LINE() as ErrorLine,
ERROR_MESSAGE() as ErrorMessage;
PRINT 'No se pudo agregar la descripción ''' + '''al campo ' + convert(nvarchar(128),@nombre_campo) + ' en la tabla ' + convert(nvarchar(128),@nombre_tabla)
PRINT 'Error Line: ' + convert(varchar(50),ERROR_LINE())
PRINT 'ErrorMessage: ' + ERROR_MESSAGE()
ROLLBACK TRANSACTION
END CATCH
-------------------------------------------------------------------------------------------------------------
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
CREATE PROCEDURE [dbo].[mer_ListarComentariosTablas]
AS
DECLARE @comentarios TABLE(tabla sysname, descripcion VARCHAR(500))
INSERT INTO @comentarios (tabla, descripcion)
SELECT objname, CONVERT(VARCHAR(500), value)
FROM ::FN_LISTEXTENDEDPROPERTY(N'MS_DESCRIPTION', N'USER', N'DBO', N'TABLE', NULL, NULL, NULL)
INSERT INTO @comentarios (tabla)
SELECT table_name
FROM information_schema.tables
WHERE table_name NOT IN
(select tabla FROM @comentarios)
AND TABLE_TYPE <> 'VIEW'
SELECT * from @comentarios ORDER BY tabla
-------------------------------------------------------------------------------------------------------------
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
CREATE PROCEDURE [dbo].[mer_ListarPropiedadesCampos]
@propiedad sysname = ''
AS
DECLARE @propiedades TABLE (
esquema sysname,
tabla sysname,
columna sysname,
valor VARCHAR(500))
DECLARE c CURSOR FOR
SELECT table_schema, table_name
FROM information_schema.tables
WHERE table_type != 'VIEW'
DECLARE @s sysname, @t sysname
OPEN c
FETCH c INTO @s, @t
WHILE @@FETCH_STATUS = 0 BEGIN
INSERT INTO @propiedades (esquema, tabla, columna, valor)
SELECT @s, @t, objname, convert(varchar(500), value)
FROM fn_listextendedproperty (@propiedad, N'schema', @s, N'table', @t, N'column', null);
FETCH c INTO @s, @t
END
CLOSE c
DEALLOCATE c
INSERT INTO @propiedades (esquema, tabla, columna)
SELECT table_schema, table_name, column_name
FROM information_schema.columns s
WHERE table_name IN
(SELECT table_name
FROM information_schema.tables
where TABLE_TYPE <> 'VIEW')
AND NOT EXISTS
(SELECT *
FROM @propiedades c
WHERE s.table_schema = c.esquema
AND s.table_name = c.tabla
AND s.column_name = c.columna)
SELECT *
FROM @propiedades
ORDER BY esquema, tabla, columna
-------------------------------------------------------------------------------------------------------------
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
CREATE PROCEDURE [dbo].[mer_ListarPropiedadCampo]
@propiedad sysname = '',
@tabla sysname = '',
@campo sysname = ''
AS
DECLARE @propiedades TABLE (
esquema sysname,
tabla sysname,
columna sysname,
valor VARCHAR(500))
DECLARE c CURSOR FOR
SELECT table_schema, table_name
FROM information_schema.tables
WHERE table_type != 'VIEW' and
table_name = @tabla
DECLARE @s sysname, @t sysname
OPEN c
FETCH c INTO @s, @t
WHILE @@FETCH_STATUS = 0 BEGIN
INSERT INTO @propiedades (esquema, tabla, columna, valor)
SELECT @s, @t, objname, convert(varchar(500), value)
FROM fn_listextendedproperty (@propiedad, N'schema', @s, N'table', @tabla, N'column', @campo);
FETCH c INTO @s, @t
END
CLOSE c
DEALLOCATE c
select *
from @propiedades
Conectar Nexus 5 con MyPhoneExplorer
1. Habilitar opciones de desarrollo en el celular:
Ajustes / Informacion del telefono / Dar 7 taps sobre Numero de compilacion
Ir a Ajustes / Opciones de desarrollo / Habilitar Depuracion USB
2. Enchufar el cel con cable usb
3. Si el driver no se instala, ir a dispositivos, actualizar driver, y poner esta ruta:
C:\android-studio\sdk\extras\google\usb_driver
4. Abrir MyPhoneExplorer
5. Si da un error, ir al celular y ver si hay un mensaje indicando si se autoriza al pc a conectarse con el cel, poner sí.
Crear plugin para Windows Live Writer
http://blogs.msdn.com/b/dawate/archive/2010/12/30/how-to-create-a-windows-live-writer-twitter-plugin-that-supports-bit-ly.aspx
Ubicacion de WindowsLive.Writer.Api.dll:
C:\Program Files\Windows Live\Writer
Ubicacion de WindowsLive.Writer.Api.dll:
C:\Program Files\Windows Live\Writer
SyntaxHighlighter para Windows Live Writer
Plugin:
http://wlwsyntaxhighlighter.codeplex.com/
Cambios en la plantilla HTML de blogger:
http://wlwsyntaxhighlighter.codeplex.com/
Cambios en la plantilla HTML de blogger:
<script src='http://agorbatchev.typepad.com/pub/sh/3_0_83/scripts/shCore.js' type='text/javascript'/>
<script src='http://agorbatchev.typepad.com/pub/sh/3_0_83/scripts/shBrushJScript.js' type='text/javascript'/>
<script src='http://agorbatchev.typepad.com/pub/sh/3_0_83/scripts/shBrushCSharp.js' type='text/javascript'/>
<link href='http://agorbatchev.typepad.com/pub/sh/3_0_83/styles/shCore.css' rel='stylesheet' type='text/css'/>
<link href='http://agorbatchev.typepad.com/pub/sh/3_0_83/styles/shCoreDefault.css' rel='stylesheet' type='text/css'/>
<link href='http://agorbatchev.typepad.com/pub/sh/3_0_83/styles/shThemeDefault.css' rel='stylesheet' type='text/css'/>
<script type='text/javascript'>
$(document).ready(function() {
$("pre").removeClass("php");
$("pre").removeClass("js");
$("pre").removeClass("c");
$("pre").addClass("brush: csharp");
SyntaxHighlighter.config.clipboardSwf = 'http://agorbatchev.typepad.com/pub/sh/3_0_83/scripts/clipboard.swf';
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.all()
});
</script>
<script src='http://agorbatchev.typepad.com/pub/sh/3_0_83/scripts/shBrushJScript.js' type='text/javascript'/>
<script src='http://agorbatchev.typepad.com/pub/sh/3_0_83/scripts/shBrushCSharp.js' type='text/javascript'/>
<link href='http://agorbatchev.typepad.com/pub/sh/3_0_83/styles/shCore.css' rel='stylesheet' type='text/css'/>
<link href='http://agorbatchev.typepad.com/pub/sh/3_0_83/styles/shCoreDefault.css' rel='stylesheet' type='text/css'/>
<link href='http://agorbatchev.typepad.com/pub/sh/3_0_83/styles/shThemeDefault.css' rel='stylesheet' type='text/css'/>
<script type='text/javascript'>
$(document).ready(function() {
$("pre").removeClass("php");
$("pre").removeClass("js");
$("pre").removeClass("c");
$("pre").addClass("brush: csharp");
SyntaxHighlighter.config.clipboardSwf = 'http://agorbatchev.typepad.com/pub/sh/3_0_83/scripts/clipboard.swf';
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.all()
});
</script>
Microsoft Live Writer con Blogger
Cuando hay problemas de conexion, es por la seguridad de dos pasos que implementa Google:
Leer:
http://lehsys.blogspot.com/2013/11/windows-live-writer-2012-problems-with.html
Java EE - instructivo
Java EE
Pasos para crear un EJB Stateless con Web Service:
1. Crear Enterprise Application:
File / New Project... -> Java EE -> Enterprise application (desmarcar Create EJB module y Create Web Application Module)
2. Crear EJB Module
File / New Project... -> Java EE -> EJB Module
Elegir el enterprise application creado en el paso 1, y GlassFish como servidor
3. Crear aplicación java para contener las interfaces Remotas
File / New Project... -> Java -> Java Application
(Desmarcar la opción Create Main Class)
[TODAVIA NO PONER EL CODIGO DE LA INTERFAZ, 1RO CREAR EL SESSION BEAN, Y VINCULARLO CON LO CREADO EN EL PASO 3]
4. Crear un Stateless Session Bean
Click derecho sobre el package del EJB creado en el paso 2, New / Session Bean...
Marcar Stateless
Definir el nombre del package (ej, org.empresa.prueba)
Elegir como Remote in Project: Interfaces (o como se nombró en el paso 3)
Agregar este código:
package com.paquete1.interfaces;
import javax.ejb.Stateless;
@Stateless
public class SessionBean1 implements Temperatura {
@Override
public int obtenerTemperatura()
{
return 23;
}
}
5. Este es el código de la interfaz:
@Remote
public interface Temperatura {
public int obtenerTemperatura();
}
6. Crear el Cliente Remoto:
- Crear una aplicación java y marcar la opción Create Main Class
- Sobre la carpeta Libraries, agregar el JAR gf-client.jar que está en c:\glassfish3\glassfish\lib
- Sobre la carpeta Libraries, Add Project y luego seleccionar la ubicacion del proyecto de interfaz, creado en el punto 3
Agregar este código en el cliente remoto:
package cliente;
import org.empresa.prueba.Temperatura;
import java.util.Properties;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class Cliente {
public static void main(String[] args) throws NamingException {
try {
Properties prop = new Properties();
prop.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
prop.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
InitialContext ctx = new InitialContext(prop);
Temperatura temp = (Temperatura)ctx.lookup("java:global/EnterpriseApplication1/EJBModule1/SessionBean1");
int t = temp.obtenerTemperatura();
System.out.println("Temperatura: " + t);
} catch (Exception e)
{
System.out.println("error!");
}
}
}
7. Asegurarse que está corriendo GlassFish
8. Botón derecho sobre el Enterprise Application / Deploy
[SI NO FUNCIONA EL DEPLOY, verificar en la ficha "services" en netbeans, que no haya ninguna conexión rota a Java DB]
9. Seleccionar el proyecto del cliente remoto, y luego poner play [el PLAY se ejecuta siempre sobre lo que esté seleccionado. Si se elije el EBJ por ej, y se da PLAY, da error!]
PASOS PARA CONVERTIR EL SESSION BEAN EN UN WEBSERVICE
1. Cambiar el código del session bean para que quede así:
package org.empresa.prueba;
import javax.ejb.Stateless;
import javax.jws.WebMethod;
import javax.jws.WebService;
@Stateless
@WebService
public class SessionBean1 implements Temperatura {
@Override
public int obtenerTemperatura()
{
return 34;
}
@WebMethod
public String sayHello(String name) {
return "HELLO!!";
}
}
2. Hacer deploy del enterprise application.
3. Para testear el webservice:
abrir el admin de GlassFish (http://localhost:4848)
click en Applications
click en el Enterprise Application que corresponda
buscar el nombre del EJB y click en View Endpoint
hacer click en la url que dice Tester
4. SI SE HACEN CAMBIOS, HAY QUE HACER DEPLOY DEL ENTERPRISE APPLICATION, SI SE HACE SOLO DEL MODULO EJB, DA ERROR!!
CLIENTE DEL WEBSERVICE
1. Crear una clase java para el webservice:
package cliente;
import javax.jws.WebService;
import javax.jws.WebMethod;
@WebService
public class Hello {
private String message = new String("Hello, ");
public void Hello() {
}
@WebMethod
public String sayHello(String name) {
return message + name + ".";
}
}
1. Crear Enterprise Application:
File / New Project... -> Java EE -> Enterprise application (desmarcar Create EJB module y Create Web Application Module)
2. Crear EJB Module
File / New Project... -> Java EE -> EJB Module
Elegir el enterprise application creado en el paso 1, y GlassFish como servidor
3. Crear aplicación java para contener las interfaces Remotas
File / New Project... -> Java -> Java Application
(Desmarcar la opción Create Main Class)
[TODAVIA NO PONER EL CODIGO DE LA INTERFAZ, 1RO CREAR EL SESSION BEAN, Y VINCULARLO CON LO CREADO EN EL PASO 3]
4. Crear un Stateless Session Bean
Click derecho sobre el package del EJB creado en el paso 2, New / Session Bean...
Marcar Stateless
Definir el nombre del package (ej, org.empresa.prueba)
Elegir como Remote in Project: Interfaces (o como se nombró en el paso 3)
Agregar este código:
package com.paquete1.interfaces;
import javax.ejb.Stateless;
@Stateless
public class SessionBean1 implements Temperatura {
@Override
public int obtenerTemperatura()
{
return 23;
}
}
5. Este es el código de la interfaz:
@Remote
public interface Temperatura {
public int obtenerTemperatura();
}
6. Crear el Cliente Remoto:
- Crear una aplicación java y marcar la opción Create Main Class
- Sobre la carpeta Libraries, agregar el JAR gf-client.jar que está en c:\glassfish3\glassfish\lib
- Sobre la carpeta Libraries, Add Project y luego seleccionar la ubicacion del proyecto de interfaz, creado en el punto 3
Agregar este código en el cliente remoto:
package cliente;
import org.empresa.prueba.Temperatura;
import java.util.Properties;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class Cliente {
public static void main(String[] args) throws NamingException {
try {
Properties prop = new Properties();
prop.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
prop.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
InitialContext ctx = new InitialContext(prop);
Temperatura temp = (Temperatura)ctx.lookup("java:global/EnterpriseApplication1/EJBModule1/SessionBean1");
int t = temp.obtenerTemperatura();
System.out.println("Temperatura: " + t);
} catch (Exception e)
{
System.out.println("error!");
}
}
}
7. Asegurarse que está corriendo GlassFish
8. Botón derecho sobre el Enterprise Application / Deploy
[SI NO FUNCIONA EL DEPLOY, verificar en la ficha "services" en netbeans, que no haya ninguna conexión rota a Java DB]
9. Seleccionar el proyecto del cliente remoto, y luego poner play [el PLAY se ejecuta siempre sobre lo que esté seleccionado. Si se elije el EBJ por ej, y se da PLAY, da error!]
PASOS PARA CONVERTIR EL SESSION BEAN EN UN WEBSERVICE
1. Cambiar el código del session bean para que quede así:
package org.empresa.prueba;
import javax.ejb.Stateless;
import javax.jws.WebMethod;
import javax.jws.WebService;
@Stateless
@WebService
public class SessionBean1 implements Temperatura {
@Override
public int obtenerTemperatura()
{
return 34;
}
@WebMethod
public String sayHello(String name) {
return "HELLO!!";
}
}
2. Hacer deploy del enterprise application.
3. Para testear el webservice:
abrir el admin de GlassFish (http://localhost:4848)
click en Applications
click en el Enterprise Application que corresponda
buscar el nombre del EJB y click en View Endpoint
hacer click en la url que dice Tester
4. SI SE HACEN CAMBIOS, HAY QUE HACER DEPLOY DEL ENTERPRISE APPLICATION, SI SE HACE SOLO DEL MODULO EJB, DA ERROR!!
CLIENTE DEL WEBSERVICE
1. Crear una clase java para el webservice:
package cliente;
import javax.jws.WebService;
import javax.jws.WebMethod;
@WebService
public class Hello {
private String message = new String("Hello, ");
public void Hello() {
}
@WebMethod
public String sayHello(String name) {
return message + name + ".";
}
}
2. Crear el cliente:
package cliente;
import javax.naming.NamingException;
import javax.xml.ws.WebServiceRef;
public class Cliente {
@WebServiceRef(wsdlLocation="http://localhost:8080/SessionBean1Service/SessionBean1?wsdl")
static Hello service;
public static void main(String[] args) throws NamingException {
try {
Hello h = new Hello();
String s = h.sayHello("abc");
System.out.println(s);
} catch(Exception e) {
e.printStackTrace();
}
}
}
import javax.naming.NamingException;
import javax.xml.ws.WebServiceRef;
public class Cliente {
@WebServiceRef(wsdlLocation="http://localhost:8080/SessionBean1Service/SessionBean1?wsdl")
static Hello service;
public static void main(String[] args) throws NamingException {
try {
Hello h = new Hello();
String s = h.sayHello("abc");
System.out.println(s);
} catch(Exception e) {
e.printStackTrace();
}
}
}
Logger log4net en C# (para una aplicacion de escritorio)
Ejemplo de un Rolling log file appender: en este ejemplo, se guarda el log en un archivo de texto, con tamaño máximo de 10Mb (atributo: maximumFileSize).
Cuando se llega al tamaño máximo se sobreescribe el archivo, dejando hasta 5 archivos de backup (atributo: maxSizeRollBackups)
1. Descargar las dll's de log4j desde esta ubicación:
http://apache.mirrors.pair.com//logging/log4net/binaries/log4net-1.2.13-bin-newkey.zip
(http://logging.apache.org/log4net/download_log4net.cgi)
2. Agregar una referencia al archivo log4net.dll
3. En App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<log4net>
<root>
<level value="ALL" />
<appender-ref ref="RollingLogFileAppender" />
</root>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="c:\log\MySampleLogFile.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="5" />
<maximumFileSize value="10MB" />
<staticLogFileName value="true" />
<filter type="log4net.Filter.LoggerMatchFilter">
<loggerToMatch value="Amazon" />
<acceptOnMatch value="false" />
</filter>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-5p %d %5rms %-22.22c{1} %-18.18M - %m%n" />
</layout>
</appender>
</log4net>
</configuration>
4. Ejemplo de uso:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using log4net;
using log4net.Config;
namespace log1
{
class Program
{
private static readonly ILog logger = LogManager.GetLogger(typeof(Program));
static void Main(string[] args)
{
log4net.Config.XmlConfigurator.Configure();
for (int i = 0; i < 100; i++)
{
logger.Debug("Log de debug");
logger.Info("Log informativo");
logger.Warn("Log de warning");
logger.Error("Log de error");
logger.Fatal("Log de error fatal");
}
}
}
}
Cuando se llega al tamaño máximo se sobreescribe el archivo, dejando hasta 5 archivos de backup (atributo: maxSizeRollBackups)
1. Descargar las dll's de log4j desde esta ubicación:
http://apache.mirrors.pair.com//logging/log4net/binaries/log4net-1.2.13-bin-newkey.zip
(http://logging.apache.org/log4net/download_log4net.cgi)
2. Agregar una referencia al archivo log4net.dll
3. En App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<log4net>
<root>
<level value="ALL" />
<appender-ref ref="RollingLogFileAppender" />
</root>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="c:\log\MySampleLogFile.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="5" />
<maximumFileSize value="10MB" />
<staticLogFileName value="true" />
<filter type="log4net.Filter.LoggerMatchFilter">
<loggerToMatch value="Amazon" />
<acceptOnMatch value="false" />
</filter>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-5p %d %5rms %-22.22c{1} %-18.18M - %m%n" />
</layout>
</appender>
</log4net>
</configuration>
4. Ejemplo de uso:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using log4net;
using log4net.Config;
namespace log1
{
class Program
{
private static readonly ILog logger = LogManager.GetLogger(typeof(Program));
static void Main(string[] args)
{
log4net.Config.XmlConfigurator.Configure();
for (int i = 0; i < 100; i++)
{
logger.Debug("Log de debug");
logger.Info("Log informativo");
logger.Warn("Log de warning");
logger.Error("Log de error");
logger.Fatal("Log de error fatal");
}
}
}
}
Suscribirse a:
Entradas (Atom)

