/** * A simple set of functions to check our version 1.0 update service. * * @package WordPress * @since 2.3.0 */ /** * Check WordPress version against the newest version. * * The WordPress version, PHP version, and Locale is sent. Checks against the * WordPress server at api.wordpress.org server. Will only check if WordPress * isn't installing. * * @since 2.3.0 * @uses $wp_version Used to check against the newest WordPress version. * * @param array $extra_stats Extra statistics to report to the WordPress.org API. * @param bool $force_check Whether to bypass the transient cache and force a fresh update check. Defaults to false, true if $extra_stats is set. * @return mixed Returns null if update is unsupported. Returns false if check is too soon. */ function wp_version_check( $extra_stats = array(), $force_check = false ) { if ( defined('WP_INSTALLING') ) return; global $wpdb, $wp_local_package; include( ABSPATH . WPINC . '/version.php' ); // include an unmodified $wp_version $php_version = phpversion(); $current = get_site_transient( 'update_core' ); $translations = wp_get_installed_translations( 'core' ); // Invalidate the transient when $wp_version changes if ( is_object( $current ) && $wp_version != $current->version_checked ) $current = false; if ( ! is_object($current) ) { $current = new stdClass; $current->updates = array(); $current->version_checked = $wp_version; } if ( ! empty( $extra_stats ) ) $force_check = true; // Wait 60 seconds between multiple version check requests $timeout = 60; $time_not_changed = isset( $current->last_checked ) && $timeout > ( time() - $current->last_checked ); if ( ! $force_check && $time_not_changed ) return false; $locale = get_locale(); /** * Filter the locale requested for WordPress core translations. * * @since 2.8.0 * * @param string $locale Current locale. */ $locale = apply_filters( 'core_version_check_locale', $locale ); // Update last_checked for current to prevent multiple blocking requests if request hangs $current->last_checked = time(); set_site_transient( 'update_core', $current ); if ( method_exists( $wpdb, 'db_version' ) ) $mysql_version = preg_replace('/[^0-9.].*/', '', $wpdb->db_version()); else $mysql_version = 'N/A'; if ( is_multisite() ) { $user_count = get_user_count(); $num_blogs = get_blog_count(); $wp_install = network_site_url(); $multisite_enabled = 1; } else { $user_count = count_users(); $user_count = $user_count['total_users']; $multisite_enabled = 0; $num_blogs = 1; $wp_install = home_url( '/' ); } $query = array( 'version' => $wp_version, 'php' => $php_version, 'locale' => $locale, 'mysql' => $mysql_version, 'local_package' => isset( $wp_local_package ) ? $wp_local_package : '', 'blogs' => $num_blogs, 'users' => $user_count, 'multisite_enabled' => $multisite_enabled, ); $post_body = array( 'translations' => json_encode( $translations ), ); if ( is_array( $extra_stats ) ) $post_body = array_merge( $post_body, $extra_stats ); $url = $http_url = 'http://api.wordpress.org/core/version-check/1.7/?' . http_build_query( $query, null, '&' ); if ( $ssl = wp_http_supports( array( 'ssl' ) ) ) $url = set_url_scheme( $url, 'https' ); $options = array( 'timeout' => ( ( defined('DOING_CRON') && DOING_CRON ) ? 30 : 3 ), 'user-agent' => 'WordPress/' . $wp_version . '; ' . home_url( '/' ), 'headers' => array( 'wp_install' => $wp_install, 'wp_blog' => home_url( '/' ) ), 'body' => $post_body, ); $response = wp_remote_post( $url, $options ); if ( $ssl && is_wp_error( $response ) ) { trigger_error( __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server’s configuration. If you continue to have problems, please try the support forums.' ) . ' ' . __( '(WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.)' ), headers_sent() || WP_DEBUG ? E_USER_WARNING : E_USER_NOTICE ); $response = wp_remote_post( $http_url, $options ); } if ( is_wp_error( $response ) || 200 != wp_remote_retrieve_response_code( $response ) ) return false; $body = trim( wp_remote_retrieve_body( $response ) ); $body = json_decode( $body, true ); if ( ! is_array( $body ) || ! isset( $body['offers'] ) ) return false; $offers = $body['offers']; foreach ( $offers as &$offer ) { foreach ( $offer as $offer_key => $value ) { if ( 'packages' == $offer_key ) $offer['packages'] = (object) array_intersect_key( array_map( 'esc_url', $offer['packages'] ), array_fill_keys( array( 'full', 'no_content', 'new_bundled', 'partial', 'rollback' ), '' ) ); elseif ( 'download' == $offer_key ) $offer['download'] = esc_url( $value ); else $offer[ $offer_key ] = esc_html( $value ); } $offer = (object) array_intersect_key( $offer, array_fill_keys( array( 'response', 'download', 'locale', 'packages', 'current', 'version', 'php_version', 'mysql_version', 'new_bundled', 'partial_version', 'notify_email', 'support_email' ), '' ) ); } $updates = new stdClass(); $updates->updates = $offers; $updates->last_checked = time(); $updates->version_checked = $wp_version; if ( isset( $body['translations'] ) ) $updates->translations = $body['translations']; set_site_transient( 'update_core', $updates ); if ( ! empty( $body['ttl'] ) ) { $ttl = (int) $body['ttl']; if ( $ttl && ( time() + $ttl < wp_next_scheduled( 'wp_version_check' ) ) ) { // Queue an event to re-run the update check in $ttl seconds. wp_schedule_single_event( time() + $ttl, 'wp_version_check' ); } } // Trigger a background updates check if running non-interactively, and we weren't called from the update handler. if ( defined( 'DOING_CRON' ) && DOING_CRON && ! doing_action( 'wp_maybe_auto_update' ) ) { do_action( 'wp_maybe_auto_update' ); } } /** * Check plugin versions against the latest versions hosted on WordPress.org. * * The WordPress version, PHP version, and Locale is sent along with a list of * all plugins installed. Checks against the WordPress server at * api.wordpress.org. Will only check if WordPress isn't installing. * * @since 2.3.0 * @uses $wp_version Used to notify the WordPress version. * * @param array $extra_stats Extra statistics to report to the WordPress.org API. * @return mixed Returns null if update is unsupported. Returns false if check is too soon. */ function wp_update_plugins( $extra_stats = array() ) { include( ABSPATH . WPINC . '/version.php' ); // include an unmodified $wp_version if ( defined('WP_INSTALLING') ) return false; // If running blog-side, bail unless we've not checked in the last 12 hours if ( !function_exists( 'get_plugins' ) ) require_once( ABSPATH . 'wp-admin/includes/plugin.php' ); $plugins = get_plugins(); $translations = wp_get_installed_translations( 'plugins' ); $active = get_option( 'active_plugins', array() ); $current = get_site_transient( 'update_plugins' ); if ( ! is_object($current) ) $current = new stdClass; $new_option = new stdClass; $new_option->last_checked = time(); // Check for update on a different schedule, depending on the page. switch ( current_filter() ) { case 'upgrader_process_complete' : $timeout = 0; break; case 'load-update-core.php' : $timeout = MINUTE_IN_SECONDS; break; case 'load-plugins.php' : case 'load-update.php' : $timeout = HOUR_IN_SECONDS; break; default : if ( defined( 'DOING_CRON' ) && DOING_CRON ) { $timeout = 0; } else { $timeout = 12 * HOUR_IN_SECONDS; } } $time_not_changed = isset( $current->last_checked ) && $timeout > ( time() - $current->last_checked ); if ( $time_not_changed && ! $extra_stats ) { $plugin_changed = false; foreach ( $plugins as $file => $p ) { $new_option->checked[ $file ] = $p['Version']; if ( !isset( $current->checked[ $file ] ) || strval($current->checked[ $file ]) !== strval($p['Version']) ) $plugin_changed = true; } if ( isset ( $current->response ) && is_array( $current->response ) ) { foreach ( $current->response as $plugin_file => $update_details ) { if ( ! isset($plugins[ $plugin_file ]) ) { $plugin_changed = true; break; } } } // Bail if we've checked recently and if nothing has changed if ( ! $plugin_changed ) return false; } // Update last_checked for current to prevent multiple blocking requests if request hangs $current->last_checked = time(); set_site_transient( 'update_plugins', $current ); $to_send = compact( 'plugins', 'active' ); $locales = array( get_locale() ); /** * Filter the locales requested for plugin translations. * * @since 3.7.0 * * @param array $locales Plugin locale. Default is current locale of the site. */ $locales = apply_filters( 'plugins_update_check_locales', $locales ); if ( defined( 'DOING_CRON' ) && DOING_CRON ) { $timeout = 30; } else { // Three seconds, plus one extra second for every 10 plugins $timeout = 3 + (int) ( count( $plugins ) / 10 ); } $options = array( 'timeout' => $timeout, 'body' => array( 'plugins' => json_encode( $to_send ), 'translations' => json_encode( $translations ), 'locale' => json_encode( $locales ), 'all' => json_encode( true ), ), 'user-agent' => 'WordPress/' . $wp_version . '; ' . get_bloginfo( 'url' ) ); if ( $extra_stats ) { $options['body']['update_stats'] = json_encode( $extra_stats ); } $url = $http_url = 'http://api.wordpress.org/plugins/update-check/1.1/'; if ( $ssl = wp_http_supports( array( 'ssl' ) ) ) $url = set_url_scheme( $url, 'https' ); $raw_response = wp_remote_post( $url, $options ); if ( $ssl && is_wp_error( $raw_response ) ) { trigger_error( __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server’s configuration. If you continue to have problems, please try the support forums.' ) . ' ' . __( '(WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.)' ), headers_sent() || WP_DEBUG ? E_USER_WARNING : E_USER_NOTICE ); $raw_response = wp_remote_post( $http_url, $options ); } if ( is_wp_error( $raw_response ) || 200 != wp_remote_retrieve_response_code( $raw_response ) ) return false; $response = json_decode( wp_remote_retrieve_body( $raw_response ), true ); foreach ( $response['plugins'] as &$plugin ) { $plugin = (object) $plugin; } unset( $plugin ); foreach ( $response['no_update'] as &$plugin ) { $plugin = (object) $plugin; } unset( $plugin ); if ( is_array( $response ) ) { $new_option->response = $response['plugins']; $new_option->translations = $response['translations']; // TODO: Perhaps better to store no_update in a separate transient with an expiry? $new_option->no_update = $response['no_update']; } else { $new_option->response = array(); $new_option->translations = array(); $new_option->no_update = array(); } set_site_transient( 'update_plugins', $new_option ); } /** * Check theme versions against the latest versions hosted on WordPress.org. * * A list of all themes installed in sent to WP. Checks against the * WordPress server at api.wordpress.org. Will only check if WordPress isn't * installing. * * @since 2.7.0 * @uses $wp_version Used to notify the WordPress version. * * @param array $extra_stats Extra statistics to report to the WordPress.org API. * @return mixed Returns null if update is unsupported. Returns false if check is too soon. */ function wp_update_themes( $extra_stats = array() ) { include( ABSPATH . WPINC . '/version.php' ); // include an unmodified $wp_version if ( defined( 'WP_INSTALLING' ) ) return false; $installed_themes = wp_get_themes(); $translations = wp_get_installed_translations( 'themes' ); $last_update = get_site_transient( 'update_themes' ); if ( ! is_object($last_update) ) $last_update = new stdClass; $themes = $checked = $request = array(); // Put slug of current theme into request. $request['active'] = get_option( 'stylesheet' ); foreach ( $installed_themes as $theme ) { $checked[ $theme->get_stylesheet() ] = $theme->get('Version'); $themes[ $theme->get_stylesheet() ] = array( 'Name' => $theme->get('Name'), 'Title' => $theme->get('Name'), 'Version' => $theme->get('Version'), 'Author' => $theme->get('Author'), 'Author URI' => $theme->get('AuthorURI'), 'Template' => $theme->get_template(), 'Stylesheet' => $theme->get_stylesheet(), ); } // Check for update on a different schedule, depending on the page. switch ( current_filter() ) { case 'upgrader_process_complete' : $timeout = 0; break; case 'load-update-core.php' : $timeout = MINUTE_IN_SECONDS; break; case 'load-themes.php' : case 'load-update.php' : $timeout = HOUR_IN_SECONDS; break; default : if ( defined( 'DOING_CRON' ) && DOING_CRON ) { $timeout = 0; } else { $timeout = 12 * HOUR_IN_SECONDS; } } $time_not_changed = isset( $last_update->last_checked ) && $timeout > ( time() - $last_update->last_checked ); if ( $time_not_changed && ! $extra_stats ) { $theme_changed = false; foreach ( $checked as $slug => $v ) { if ( !isset( $last_update->checked[ $slug ] ) || strval($last_update->checked[ $slug ]) !== strval($v) ) $theme_changed = true; } if ( isset ( $last_update->response ) && is_array( $last_update->response ) ) { foreach ( $last_update->response as $slug => $update_details ) { if ( ! isset($checked[ $slug ]) ) { $theme_changed = true; break; } } } // Bail if we've checked recently and if nothing has changed if ( ! $theme_changed ) return false; } // Update last_checked for current to prevent multiple blocking requests if request hangs $last_update->last_checked = time(); set_site_transient( 'update_themes', $last_update ); $request['themes'] = $themes; $locales = array( get_locale() ); /** * Filter the locales requested for theme translations. * * @since 3.7.0 * * @param array $locales Theme locale. Default is current locale of the site. */ $locales = apply_filters( 'themes_update_check_locales', $locales ); if ( defined( 'DOING_CRON' ) && DOING_CRON ) { $timeout = 30; } else { // Three seconds, plus one extra second for every 10 themes $timeout = 3 + (int) ( count( $themes ) / 10 ); } $options = array( 'timeout' => $timeout, 'body' => array( 'themes' => json_encode( $request ), 'translations' => json_encode( $translations ), 'locale' => json_encode( $locales ), ), 'user-agent' => 'WordPress/' . $wp_version . '; ' . get_bloginfo( 'url' ) ); if ( $extra_stats ) { $options['body']['update_stats'] = json_encode( $extra_stats ); } $url = $http_url = 'http://api.wordpress.org/themes/update-check/1.1/'; if ( $ssl = wp_http_supports( array( 'ssl' ) ) ) $url = set_url_scheme( $url, 'https' ); $raw_response = wp_remote_post( $url, $options ); if ( $ssl && is_wp_error( $raw_response ) ) { trigger_error( __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server’s configuration. If you continue to have problems, please try the support forums.' ) . ' ' . __( '(WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.)' ), headers_sent() || WP_DEBUG ? E_USER_WARNING : E_USER_NOTICE ); $raw_response = wp_remote_post( $http_url, $options ); } if ( is_wp_error( $raw_response ) || 200 != wp_remote_retrieve_response_code( $raw_response ) ) return false; $new_update = new stdClass; $new_update->last_checked = time(); $new_update->checked = $checked; $response = json_decode( wp_remote_retrieve_body( $raw_response ), true ); if ( is_array( $response ) ) { $new_update->response = $response['themes']; $new_update->translations = $response['translations']; } set_site_transient( 'update_themes', $new_update ); } /** * Performs WordPress automatic background updates. * * @since 3.7.0 */ function wp_maybe_auto_update() { include_once( ABSPATH . '/wp-admin/includes/admin.php' ); include_once( ABSPATH . '/wp-admin/includes/class-wp-upgrader.php' ); $upgrader = new WP_Automatic_Updater; $upgrader->run(); } /** * Retrieves a list of all language updates available. * * @since 3.7.0 */ function wp_get_translation_updates() { $updates = array(); $transients = array( 'update_core' => 'core', 'update_plugins' => 'plugin', 'update_themes' => 'theme' ); foreach ( $transients as $transient => $type ) { $transient = get_site_transient( $transient ); if ( empty( $transient->translations ) ) continue; foreach ( $transient->translations as $translation ) { $updates[] = (object) $translation; } } return $updates; } /** * Collect counts and UI strings for available updates * * @since 3.3.0 * * @return array */ function wp_get_update_data() { $counts = array( 'plugins' => 0, 'themes' => 0, 'wordpress' => 0, 'translations' => 0 ); if ( $plugins = current_user_can( 'update_plugins' ) ) { $update_plugins = get_site_transient( 'update_plugins' ); if ( ! empty( $update_plugins->response ) ) $counts['plugins'] = count( $update_plugins->response ); } if ( $themes = current_user_can( 'update_themes' ) ) { $update_themes = get_site_transient( 'update_themes' ); if ( ! empty( $update_themes->response ) ) $counts['themes'] = count( $update_themes->response ); } if ( ( $core = current_user_can( 'update_core' ) ) && function_exists( 'get_core_updates' ) ) { $update_wordpress = get_core_updates( array('dismissed' => false) ); if ( ! empty( $update_wordpress ) && ! in_array( $update_wordpress[0]->response, array('development', 'latest') ) && current_user_can('update_core') ) $counts['wordpress'] = 1; } if ( ( $core || $plugins || $themes ) && wp_get_translation_updates() ) $counts['translations'] = 1; $counts['total'] = $counts['plugins'] + $counts['themes'] + $counts['wordpress'] + $counts['translations']; $titles = array(); if ( $counts['wordpress'] ) $titles['wordpress'] = sprintf( __( '%d WordPress Update'), $counts['wordpress'] ); if ( $counts['plugins'] ) $titles['plugins'] = sprintf( _n( '%d Plugin Update', '%d Plugin Updates', $counts['plugins'] ), $counts['plugins'] ); if ( $counts['themes'] ) $titles['themes'] = sprintf( _n( '%d Theme Update', '%d Theme Updates', $counts['themes'] ), $counts['themes'] ); if ( $counts['translations'] ) $titles['translations'] = __( 'Translation Updates' ); $update_title = $titles ? esc_attr( implode( ', ', $titles ) ) : ''; $update_data = array( 'counts' => $counts, 'title' => $update_title ); /** * Filter the returned array of update data for plugins, themes, and WordPress core. * * @since 3.5.0 * * @param array $update_data { * Fetched update data. * * @type array $counts An array of counts for available plugin, theme, and WordPress updates. * @type string $update_title Titles of available updates. * } * @param array $titles An array of update counts and UI strings for available updates. */ return apply_filters( 'wp_get_update_data', $update_data, $titles ); } function _maybe_update_core() { include( ABSPATH . WPINC . '/version.php' ); // include an unmodified $wp_version $current = get_site_transient( 'update_core' ); if ( isset( $current->last_checked ) && 12 * HOUR_IN_SECONDS > ( time() - $current->last_checked ) && isset( $current->version_checked ) && $current->version_checked == $wp_version ) return; wp_version_check(); } /** * Check the last time plugins were run before checking plugin versions. * * This might have been backported to WordPress 2.6.1 for performance reasons. * This is used for the wp-admin to check only so often instead of every page * load. * * @since 2.7.0 * @access private */ function _maybe_update_plugins() { $current = get_site_transient( 'update_plugins' ); if ( isset( $current->last_checked ) && 12 * HOUR_IN_SECONDS > ( time() - $current->last_checked ) ) return; wp_update_plugins(); } /** * Check themes versions only after a duration of time. * * This is for performance reasons to make sure that on the theme version * checker is not run on every page load. * * @since 2.7.0 * @access private */ function _maybe_update_themes() { $current = get_site_transient( 'update_themes' ); if ( isset( $current->last_checked ) && 12 * HOUR_IN_SECONDS > ( time() - $current->last_checked ) ) return; wp_update_themes(); } /** * Schedule core, theme, and plugin update checks. * * @since 3.1.0 */ function wp_schedule_update_checks() { if ( !wp_next_scheduled('wp_version_check') && !defined('WP_INSTALLING') ) wp_schedule_event(time(), 'twicedaily', 'wp_version_check'); if ( !wp_next_scheduled('wp_update_plugins') && !defined('WP_INSTALLING') ) wp_schedule_event(time(), 'twicedaily', 'wp_update_plugins'); if ( !wp_next_scheduled('wp_update_themes') && !defined('WP_INSTALLING') ) wp_schedule_event(time(), 'twicedaily', 'wp_update_themes'); if ( ( wp_next_scheduled( 'wp_maybe_auto_update' ) > ( time() + HOUR_IN_SECONDS ) ) && ! defined('WP_INSTALLING') ) wp_clear_scheduled_hook( 'wp_maybe_auto_update' ); } if ( ( ! is_main_site() && ! is_network_admin() ) || ( defined( 'DOING_AJAX' ) && DOING_AJAX ) ) return; add_action( 'admin_init', '_maybe_update_core' ); add_action( 'wp_version_check', 'wp_version_check' ); add_action( 'upgrader_process_complete', 'wp_version_check', 10, 0 ); add_action( 'load-plugins.php', 'wp_update_plugins' ); add_action( 'load-update.php', 'wp_update_plugins' ); add_action( 'load-update-core.php', 'wp_update_plugins' ); add_action( 'admin_init', '_maybe_update_plugins' ); add_action( 'wp_update_plugins', 'wp_update_plugins' ); add_action( 'upgrader_process_complete', 'wp_update_plugins', 10, 0 ); add_action( 'load-themes.php', 'wp_update_themes' ); add_action( 'load-update.php', 'wp_update_themes' ); add_action( 'load-update-core.php', 'wp_update_themes' ); add_action( 'admin_init', '_maybe_update_themes' ); add_action( 'wp_update_themes', 'wp_update_themes' ); add_action( 'upgrader_process_complete', 'wp_update_themes', 10, 0 ); add_action( 'wp_maybe_auto_update', 'wp_maybe_auto_update' ); add_action('init', 'wp_schedule_update_checks'); El pasado político del fundador de Tuenti: de la ONU a fundar el germen de Change.orgSesiónDeControl.com
Arrow

Tuenti y la política que lo parió


2
David G. Ortiz

Periodista 'geek'. Cofundador de HojaDeRouter.com. Escribo sobre tecnología en TecnoXplora (Antena3.com). Antes pasé por lainformacion.com y los micrófonos de la Cadena SER. Firme defensor de que dormir está sobrevalorado.


Escrito el 10 de junio de 2013 a las 12:35 | Clasificado en Tecnología

Zaryn Dentzel, fundador de Tuenti, tiene un largo historial de activismo político. Lideró las protestas en su universidad, viajó al Tercer Mundo, trabajó en la ONU y fundó la empresa que sería el germen de Causes y del fenómeno del activismo online que hoy abandera Change.org. Un periplo vital que choca a quien le escucha hablar de economía como los más duros de la CEOE.

Zaryn Dentzel, fundador de Tuenti (Foto: Tuenti en Flickr)
Zaryn Dentzel, fundador de Tuenti (Foto: Tuenti en Flickr)

“Sé que es malo decir esto, pero es muy complicado echar a alguien de una empresa y eso hace que a lo mejor contrates menos […] Muchas veces esa legislación que existe para proteger al empleado puede causarle más daño”.

Un chico alto, rubio, fuerte y con pinta de guiri pronuncia estas palabras en un acto con emprendedores organizado por el Partido Popular. Como joven empresario que ha tenido éxito en España tiene tres consejos para el Gobierno: simplificar la fiscalidad de las ‘stock options’ para que una pyme pueda ofrecer un porcentaje de la empresa a sus primeros empleados, mejorar la enseñanza técnica en las escuelas y fomentar el inglés. Él, por cierto, habla español perfectamente.

Su nombre es Zaryn Dentzel, es el fundador de Tuenti y ha empezado este artículo con mal pie. Es algo que, por otra parte, le sucede a casi cualquier estadounidense que venga a hablar de negocios a España. Sus palabras suenan a las de un tiburón capitalista que solo piensa en el dinero, sobre todo si en realidad no sabemos nada sobre su vida, su pasado y sus inclinaciones políticas.

Como todo el mundo merece el beneficio de la duda, os pido que antes de juzgar a Zaryn dediquéis unos minutos a leer su historia. Él mismo acaba de publicar un libro que, bajo el título ‘El futuro lo decides tú’, hace un repaso a gran parte de su trayectoria vital. Como es lógico, se centra en lo que más interesa al público español, especialmente a su público objetivo, que son los jóvenes emprendedores. En 164 páginas vemos como Tuenti nace, crece y se reproduce. Morir no ha muerto, aunque se podría debatir si, como transmite su máximo responsable, está (o no) más vivo que nunca.

¿De qué pie cojea?

Después de escuchar las palabras de Zaryn en la convención ‘Propuestas para el cambio’ que el Partido Popular organizó en 2009, lo primero que queremos es saber si es de derechas o de izquierdas. Él mismo habla de ello en su libro. “En cuanto a la política, es muy dificil encontrar algo en lo que yo encaje”, reconoce. “Tal vez podría decirse que soy un poco libertario, en el sentido estadounidense del término. Libertario según una interpretación capitalista”.

Zaryn sueña con un gobierno que se abstenga de tomar partido en la vida de los ciudadanos, que se quede al margen en los asuntos sociales y otorgue a las personas un amplio margen de libertad para actuar, “siempre y cuando no hagan daño a los otros, claro”. Por la parte económica, no es partidario de los impuestos ni de lo público. “Creo que tiene que haber menos impuestos, menos institución pública y más iniciativa privada. Pero con un sistema judicial eficiente, para que no haya abusos”, afirma.

En resumen, como él mismo dice, es “liberal en las cuestiones sociales y conservador en los aspectos económicos”. Para que nos entendamos, estaría de acuerdo con las leyes de aborto y matrimonio homosexual de los socialistas y aún le parece que se queda corta la reforma laboral del PP. Por eso no es capaz de encontrar un partido a su gusto, ni aquí ni en Estados Unidos.

Érase una vez…

Para entender la vertiente política del creador de nuestra red social por excelencia, hay que remontarse a su más tierna infancia. Sus padres, “genuinos productos de la contracultura de los años sesenta, hippies, ecologistas, alternativos y artistas”, nunca incitaron a sus hijos a llevar una vida convencional. No esperaban que Zaryn y sus dos hermanos se convirtieran en abogados, hombres de negocios o políticos.

“En el colegio éramos de esos niños que no tenían que pagar por comer en el comedor, pues éramos de los más pobres”, recuerda. A sus padres no les preocupaba especialmente, porque “tienen una actitud bastante extremista en el sentido de no consumir y llevar una vida lo más independiente posible del sistema capitalista”. Tal vez por eso, cuando William Dentzel III visitó las oficinas que ahora acogen el próspero negocio de su hijo en Madrid, no reaccionó con el entusiasmo que se espera de un padre orgulloso.

Las oficinas de Tuenti están en la Plaza de las Cortes, al lado del Congreso de los Diputados. ¡Vaya casualidad! (Foto: Tuenti en Flickr)

Las oficinas de Tuenti están en la Plaza de las Cortes, al lado del Congreso de los Diputados. ¡Vaya casualidad! (Foto: Tuenti en Flickr)

“Su rollo, supongo, es otro”, le disculpa el fundador de Tuenti. Siguiendo una tradición de cinco generaciones, William había consagrado su vida al negocio familiar: una antaño próspera empresa de fabricación de figuras para tiovivos. Así que Zaryn pasó sus años mozos entre caballitos, elefantes y otros coloridos animales de madera. Por supuesto, acabó detestándolo.

Sin embargo, hay una cosa en la que el pequeño Dentzel si salió a su padre. Tal y como él lo describe, William es un intelectual, que lee muchísimo y sigue con gran interés los asuntos políticos. Además, es un hombre viajero y habla cuatro idiomas.

Cabeza de Buey – Windhoek

Hay una parte de la historia de Tuenti que Zaryn ya ha contado en múltiples ocasiones. Con solo 14 años, y tras un curso entero estudiando en casa de forma autodidacta, el joven tomó la decisión de venir a España a aprender el idioma. Primero recaló en Salamanca, anduvo de fiesta en fiesta, y finalmente dio con sus huesos en Cabeza de Buey, un pequeño pueblo cerca de Badajoz donde un “guiri” como él era un fenómeno circense. Allí no pintaba nada, lo pasó bastante mal, y poco después se marchó a Málaga a vivir de gorra con una familia bien posicionada. Efectivamente, aprendió español, e hizo buenos amigos, pero tuvo que volver a Estados Unidos a completar el instituto y meterse en la universidad.

Es ahí, en la universidad, donde da comienzo la parte menos conocida de su historia. Tras un breve paso por la pública, Zaryn consiguió una beca para estudiar en el Occidental College, en Los Ángeles, donde Obama pasó dos años antes de ingresar en Columbia. El fundador de Tuenti, todavía con el recuerdo de la piel de toro muy vivo en su memoria, se matriculó en literatura española y relaciones internacionales y escogió fundamentalmente asignaturas vinculadas con la política y la economía.

No era un mal estudiante, pero ya entonces sus mayores cualidades eran la constancia y la capacidad de liderazgo. Se metió en la política de la facultad y llegó a ser representante de su residencia. Además, la casualidad quiso que se enrolara en un proyecto para estudiar la diversidad de aves endémicas en Namibia. Sí, sí, aves en Namibia. Zaryn era el mejor de su clase en la optativa de biología y consiguió una beca de 7.000 dólares para pasar dos meses en África investigando lo que en principio era un problema medioambiental, pero escondía una cuestión política.

Al poco tiempo de cruzar el charco se dio cuenta. Durante la ocupación sudafricana, la segregación racial del ‘apartheid’ se había impuesto en Namibia, que tras lograr la independencia en 1989 estaba tratando de sobreponerse y redistribuir las tierras entre los nativos. Esta redistribución estaba afectando a las rutas migratorias y a la población de aves, por supuesto, pero también traía consigo hambre y enfermedades para los más desfavorecidos de entre la población local.

Zaryn visitó hospitales y orfanatos y conoció el horror de primera mano. “Había gente llorando y gritando, gente en los huesos, desnutrida, madres muriendo al lado de sus niños desolados”, relata en su libro. Todo esto le impresionó tanto que decidió dejar de lado el asunto biológico y se hizo voluntario para ayudar a los huérfanos. “Mi informe final, el trabajo que presenté en la universidad, por supuesto tampoco trató sobre las aves, sino sobre lo terrible de aquel drama”, recuerda. Fue así como afloró su vena más activista. “Hacía falta actuar de alguna manera”.

Un idealista en la ONU

Cuando regresó a Estados Unidos, Zaryn ya era “un idealista con ganas de cambiar el mundo”. De nuevo gracias a su empuje y a su incansable persistencia, logró meterse en un programa muy exclusivo para hacer prácticas en el departamento de Operaciones de Paz de la ONU. Irse a vivir a Nueva York fue para él un giro de 180 grados.

Vivía de forma muy precaria con otros tres universitarios, en un alojamiento muy barato que habían conseguido gracias a un convenio con la Asociación de Jóvenes Cristianos (YMCA, por sus siglas en inglés). “Teníamos tan poco dinero que nos alimentábamos de pizzas que comprábamos entre cuatro, y todos los días comíamos lo mismo”, rememora. “La verdad es que era un curioso contraste trabajar en la ONU y luego llevar una vida tan precaria, tan cutre”.

Por las noches se hacinaba en una habitación diminuta, donde “apenas cabía la cama y solo quedaba un pequeño espacio para ponerse de pie”. Por las mañanas se enfundaba el traje y se iba a trabajar a la enorme y opulenta sede de la ONU, donde se codeaba con ministros, asesores, presidentes y hasta llegó a conocer a Kofi Annan, por aquel entonces secretario general de las Naciones Unidas. “Como organización, la ONU era íncreible”, relata el fundador de Tuenti. “Tenían un bufet para comer, al lado del río, donde podías conocer a gente de todos los países”.

Sede de la ONU en Nueva York (Foto: Wikimedia Commons)

Sede de la ONU en Nueva York (Foto: Wikimedia Commons)

A él, por sus experiencias pasadas, le destinaron a un departamento que se ocupaba de asuntos africanos. Una de sus misiones era velar por las negociaciones entre Sudán y los rebeldes de lo que hoy conocemos como Sudán del Sur (consiguió la independencia en 2011). Y allí sufrió su primer gran desencuentro con la política. “La ONU no me convenció”, confiesa. “Me quedé muy desilusionado porque es una organización completamente incapaz de actuar. En la práctica, no podían hacer nada”.

Zaryn se fue de Nueva York con la lección aprendida. “Entré en la ONU con el deseo de trabajar en asuntos de cooperación y salí pensando que la única forma de transformar el mundo es hacerlo por ti mismo, a través de una compañía o creando algo por tu cuenta y riesgo”. ¿Y entonces nació Tuenti? No, aún queda la parte más interesante (y política) del viaje.

De la primera red de activismo al padre de Tuenti

Tras otro viaje a Costa Rica y Nicaragua para estudiar las cooperativas del café y una de las experiencias más frustrantes de su vida en un despacho de abogados, Zaryn salió de la universidad con más dudas que certezas. Lo único que tenía claro es que le ilusionaban “la política y las ONG”, pero había aprendido que para cambiar las cosas debía hacer algo por su cuenta. Y así nació Essembly, la primera red social de activismo político, el germen del fenómeno Change.org y también, por supuesto, de Tuenti.

La verdad es que le pusieron muchas ganas, pero fue un auténtico fracaso, pese a que llegaron a tener unos 30.000 o 40.000 usuarios, recabaron casi 500.000 euros en dos rondas de financiación e incluso lograron convencer a Sean Parker, fundador de Napster y uno de los primeros inversores de Facebook, para que se sumara a su proyecto.

“Posteriormente se ha visto que las redes sociales son un instrumento muy útil para las causas políticas y sociales, y así lo han demostrado la Primavera Árabe o los movimientos del 15-M, por poner un par de ejemplos”, escribe Dentzel. Pero admite que cuando nació Essembly “la cosa todavía no estaba madura para este tipo de objetivos”.

El proyecto no iba bien, así que con la entrada de Parker decidieron cambiar de negocio. En aquel momento estaban empezando a surgir las primeras aplicaciones para Facebook, así que tras el fracaso de Essembly como red social autónoma decidieron reinventarse como una de las primeras ‘apps’ de la red de Zuckerberg bajo el nombre de Causes, que hoy es uno de los grandes estandartes del activismo político en la Red.

Capturas de pantalla de Causes (Foto: Facebook)

Capturas de pantalla de Causes (Foto: Facebook)

Y ahora sí es donde Tuenti entra en escena. Zaryn aprendió de los errores de Essembly y decidió enmendar lo que a su juicio era el principal problema de su pionera red social. “El inconveniente era que la gente no quería darse de alta, crear un perfil en una red social solo para causas políticas. Lo que la gente quiere es tener una identidad propia en internet primero, y luego asociar ambas cosas. Pero esa identidad no existía, no había ninguna red previa que tuviera eso”.

Así que decidió crearla. Y como en Estados Unidos Facebook ya había empezado a despegar y estaba naciendo una legión de competidores, se acordó de su querida España. Esa España suya, esa España nuestra. Se vino, llamó a sus amigos y montaron Tuenti. Pero esa es la parte de la historia que ya conocéis todos. ¿Volverá algún día a abrazar la política?

Los votantes dicen...
  1. […] Tuenti y la política que lo parió […]

  2. […] Tuenti y la política que lo parió (David G. Ortiz) […]

Comparte tu punto de vista

XHTML: Puedes usar estas etiquetas: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>