/* Plugin Name: RSS Validator Plugin URI: http://andrewnorcross.com/plugins/ Description: Checks your RSS feed against the W3 RSS validator for errors Version: 1.1 Author: Andrew Norcross Author URI: http://andrewnorcross.com Copyright 2012 Andrew Norcross This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License, version 2, as published by the Free Software Foundation. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ // http://feed2.w3.org/docs/soap.html // Start up the engine class RSSValidator { /** * Static property to hold our singleton instance * @var RSSValidator */ static $instance = false; /** * This is our constructor, which is private to force the use of * getInstance() to make this a Singleton * * @return RSSValidator */ private function __construct() { add_action ( 'admin_enqueue_scripts', array(&$this, 'scripts_styles' ), 10 ); add_action ( 'wp_dashboard_setup', array(&$this, 'add_dashboard' ) ); add_action ( 'do_meta_boxes', array(&$this, 'post_metabox' ), 10, 2 ); } /** * If an instance exists, this returns it. If not, it creates one and * retuns it. * * @return RSSValidator */ public static function getInstance() { if ( !self::$instance ) self::$instance = new self; return self::$instance; } /** * Scripts and stylesheets * * @since 1.0 */ public function scripts_styles($hook) { // for post editor if ( $hook == 'post-new.php' || $hook == 'post.php' ) : wp_enqueue_style( 'validator-style', plugins_url('/lib/css/rss-validator.css', __FILE__), array(), null, 'all' ); wp_enqueue_script( 'validator-init', plugins_url('/lib/js/validator.init.js', __FILE__) , array('jquery'), null, true ); endif; // for dashboard $current_screen = get_current_screen(); if ( 'dashboard' == $current_screen->base ) : wp_enqueue_style( 'validator-style', plugins_url('/lib/css/rss-validator.css', __FILE__), array(), null, 'all' ); wp_enqueue_script( 'validator-init', plugins_url('/lib/js/validator.init.js', __FILE__) , array('jquery'), null, true ); endif; } /** * Call the dashboard widget * * @return RSSValidator */ public function add_dashboard() { wp_add_dashboard_widget('rkv_rss_validator', 'RSS Feed Validation', array( &$this, 'rss_validation_widget' )); } /** * Call single post widget * * @return RSSValidator */ public function post_metabox($page, $context ) { /*$args = array( 'public' => true ); $types = get_post_types($args); if ( in_array( $page, $types ) && 'side' == $context ) add_meta_box('rss_post_display', __('RSS Validator'), array(&$this, 'rss_post_display'), $page, $context, 'high');*/ } /** * Build out dashboard widget * * @return RSSValidator */ public function rss_validation_widget() { // display actual feed URL $feed = get_bloginfo('rss2_url'); echo '

Your main RSS feed: '.$feed.'

'; // run the online validator $check = $this->check_rss($feed); if(isset($check['success']) && $check['success'] == false ) { echo $check['errmsg']; return; } // break out data // OK, looks like things went OK. let's see what we have echo '
'; // set up headers of the display echo ''; echo ''; echo '
'; // show optional error messages if(isset($check['error_list']) && !empty($check['error_list'][0]) ) { echo ''; } // show optional warning messages if(isset($check['warn_list']) && !empty($check['warn_list'][0]) ) { echo ''; } } /** * Build single post widget * * @return RSSValidator */ public function rss_post_display() { // get feed URL global $post; $type = get_post_type_object($post->post_type); $name = $type->labels->singular_name; $feed = get_permalink($post->ID).'feed/'; echo '

This '.$name.' RSS feed
'.$feed.'

'; // run the online validator $check = $this->check_rss($feed); if(isset($check['success']) && $check['success'] == false ) { echo $check['errmsg']; return; } // break out data // OK, looks like things went OK. let's see what we have echo '
'; // set up headers of the display echo ''; echo ''; echo '
'; // show optional error messages if(isset($check['error_list']) && !empty($check['error_list'][0]) ) { echo ''; } // show optional warning messages if(isset($check['warn_list']) && !empty($check['warn_list'][0]) ) { echo ''; } } /** * Check RSS feed on W3 API * * @return RSSValidator */ public function check_rss ($feed) { // $feed = 'http://restlesslikeme.com/feed/'; $request = new WP_Http; $url = 'http://validator.w3.org/feed/check.cgi?url='.urlencode($feed).'&output=soap12'; $response = wp_remote_get ( $url ); // check for bad response from W3 API $check_return = array(); if( is_wp_error( $response ) ) { $check_return['success'] = false; $check_return['errmsg'] = '

Sorry, there was an error with your request.

'; } if(!is_wp_error( $response ) ) { $feed_data = $response['body']; $return_xml = simplexml_load_string( (string) $feed_data ); $return_xml->registerXPathNamespace( 'm', 'http://www.w3.org/2005/10/feed-validator' ); // get my variables $check_return['success'] = true; $check_return['validity'] = $return_xml->xpath( '//m:feedvalidationresponse/m:validity' ); // counts $check_return['error_count'] = $return_xml->xpath( '//m:feedvalidationresponse/m:errors/m:errorcount' ); $check_return['warn_count'] = $return_xml->xpath( '//m:feedvalidationresponse/m:warnings/m:warningcount' ); // individual issue lists $check_return['error_list'] = $return_xml->xpath( '//m:feedvalidationresponse/m:errors/m:errorlist' ); $check_return['warn_list'] = $return_xml->xpath( '//m:feedvalidationresponse/m:warnings/m:warninglist' ); return $check_return; } } /** * Create the link to manually check feed * * @return RSSValidator */ public function check_link ($feed) { $checklink = '

See complete details on W3 Validator site

'; return $checklink; } /// end class } // Instantiate our class $RSSValidator = RSSValidator::getInstance(); La gata y el ratón

La gata y el ratón

Por Gabriela Ramos / Fotos de Alonso Valdivia
Clifford Day y Mariana Bernal tienen un amor que combina perfectamente diversos elementos en una armonía musical. Juntos trabajan en Sonar, la empresa orientada a diseñar e implementar herramientas audiovisuales, y en su relación.
CLIFFORD1
¿Qué día y dónde se vieron por primera vez?
Clifford: En una fiesta.
Mariana: Una noche de verano entre música y luces. Yo estaba disfrazada de gata y el de ratón.

¿Quién fue la persona que los presentó?
C: Nadie. Me acerqué y le pregunté «¿eres la misma gata techera que vi el otro día?»
M: Nadie. Ja, ja, ja… digamos que Cliff me dijo «hola» y yo le dije «miauuuu».

Si tuvieras que elegir una canción para la relación, ¿cuál sería?
C: Siempre le pongo el disco The return of the Ipanemas. En su cumpleaños causó sensación.
M: Elijo un disco que me gusta escuchar cuando estamos en nuestra casa, The return of the Ipanemas.

¿Cómo y dónde fue la declaración de amor?
C: En un momento en el que ella no lo esperaba. Mariana buscaba algo que quería enseñar a su familia y, sin saber nada, sacó el anillo.
M: Sorpresa total. Cliff, que es siempre relajado, se puso serio para esa ocasión y le pidió mi mano a mi papá. Siempre le digo: «a mí nadie me preguntó nada»… Ja, ja, ja.
ASIA SUR - CLIFFORD DAY-312 ret
¿Cuánto tiempo llevan juntos?
C: Cuatro años
M: Cerca de cuatro años

¿Qué tal se lleva él/ella con tu mamá?
C: Súper.
M: Muy bien.

¿Cuál es su plato favorito?
C: Le encantan las pizzas, pero con poco queso.
M: Una buena burger.

Si tuvieras que definir tu relación en una palabra, ¿cuál sería?
C: Siempre lo mencionamos: ‘complicidad’. Yo entiendo que deriva de complicado… Ja, ja, ja. Mentira… la pareja es un equipo.
M: Complicidad.

¿Cuál fue el momento más romántico de la relación para ti?
C: Cuando viajamos se repite constantemente. Cada vez que coincidimos en no tener horario y hacer lo que nos da la gana.
M: No sé si es el más romántico, pero tengo un recuerdo reciente. Hace poco hicimos tándem en Señoritas. Yo solo había corrido un par de veces antes, y esa vez corrimos varias olas sin problema. Quizás Cliff no lo tenga registrado, pero estaba tan orgulloso de mí que me daba besos en la pierna mientras remábamos de regreso a la orilla.

¿Cuál fue el regalo que le diste que más le gustó?
C: Fue una casaca, en un último viaje a Nueva York. Entramos a una tienda y le dije: «¡Cómpralo de una vez antes de que me arrepienta!».
M: Haberle permitido poner un par de parlantes casi de mi tamaño y una colección de cinco mil discos de vinilo en nuestra sala.

¿Cómo le demuestras tu amor día a día?
C: Teniendo los mismos objetivos y concentrándonos en que nada nos desenfoque para hacer crecer Sonar, el negocio que creamos y manejamos juntos.

M: Trabajamos juntos en nuestra empresa. Sonar, arquitectura de sonido. Cada día nos deslumbramos el uno al otro con lo que vamos logrando. Hay harta admiración.

¿Cuál es su película favorita?
C: LA GRANDE BELLEZA, de Paolo Sorrentino.
M: Se me viene a la mente una sobre una pareja que graba un disco con poco presupuesto durante un verano en Nueva York.
CLIFFORD4
¿Cuántas de estas preguntas crees que han coincidido con sus respuestas?
C: Seguro que ninguna ja, ja, ja.
M: Creo que un par nos podría ligar.

Al entrar al apartamento de Mariana y Clifford en San Isidro lo primero que detectas son las melodías caribeñas y relajantes de The return of the Ipanemas, el disco que ninguno de los dos se cansa de escuchar.
—Ambos mencionan que coincidirán en muy pocas respuestas, pero le han atinado a la mayoría…
—De hecho coincidimos —apunta Clifford con voz pausada.
—Es que era broma. Sabíamos que íbamos a coincidir —dice Mariana riendo.
—No han hecho trampa, ¿no?
-—¡No! —jura Mariana—. Yo te respondí mientras me maquillaban y él mientras se cambiaba.

Sin embargo confiesan haber arreglado algunas respuestas. Él nunca estuvo disfrazado de ratón, por ejemplo. Y la frase sobre la gata techera ella apenas la escuchó. Aun así, en medio del bullicio, él la convenció de ir a caminar de su mano en esa fiesta en Punta Hermosa, pero el detalle que la terminó de animar ocurrió al día siguiente. Fueron a comer y él pidió una pizza básica con pocos ingredientes. «¡Wow! Este chico sabe lo que quiero», pensó Mariana al notar la simpleza y efectividad de Clifford.

Tiempo después de empezar la relación, él le preparó una pequeña sorpresa. En una reunión familiar, delante de los papás y hermanos de Mariana, la envió a buscar un objeto. Cuando ella se dio cuenta, tenía en sus manos un anillo de compromiso. Clifford, usualmente relajado, se puso serio esa noche y habló con su futuro suegro sobre sus intenciones de casarse. «Es que a veces hay que saber ponerse formal, pues», dice.
ASIA SUR - CLIFFORD DAY-268 ret_ROSADA

Fotografía: Alonso Valdivia.
Dirección de Arte y Styling: Ximena Espinosa y Pia Gonzales- Vigil.
Producción: Pia Gonzales-Vigil y Paula Ramírez.
Peinado y maquillaje: Soraida/ Mary para TresCuarenta. Agar García/ TresCuarenta.
Agradecimientos: Balkanica, Fiu Fiu, Maaji swimear, Anna Ricci, Boconcept, Wayqui, Sophie Crown, Hipnos Blu.