With the release of Drupal 5, you might be wondering which version of Drupal is faster — the latest release in the Drupal 4 series, or the new Drupal 5?
Hasta ahora sólo se sabÃa que Google compró YouTube por u$s1650 millones pero como el pago fue en acciones, Google debió declararlo en sus documentos… con los números exactos que se llevaron los fundadores y los que invirtieron en la empresa
Jennifer, en un post en Search Engine Land nos da 25 consejos para optimizar nuestro blog tanto como para los lectores como para los buscadores. Aquà va una traducción de cada uno de los puntos y mis comentarios
Juan Pablo Puerta (Un gaditano en Silicon Valley) nos cuenta al detalle dos interesantes opciones para poder establecer conexiones sin tener que pagar las abusivas tarifas que se establecen en Aeropuertos, Hoteles, etc.
me he decidido a escribir una serie de artÃculos en los que tratare de desglosar el proceso de creación de un formulario de contacto que se pueda utilizar en cualquier pagina web.En este primer articulo quisiera tratar la estructura y presentación del
One of the nice things about Flickr is that because of their open API a whole host of developers have built more and more interesting things to do with the site. It’s interesting to me today that so many of the ways that I use Flickr…
Chad Hurley ha anunciado que Youtube compartirá ingresos con los usuarios que suban sus contenidos. Y esto lo hace a la vez que señala que tiene casi preparada su muy esperada tecnologÃa para detectar contenidos con copyright…
Jing es una aplicación de Windows y Mac que permite capturar imágenes y vÃdeos de nuestro escritorio y los sube a internet, copiando en el portapapeles la url final para nosotros pegarla en nuestra web.
Una herramienta muy útil si queremos realizar documentación o tutoriales. En las imágenes permite insertar flechas y texto, y los vÃdeos muestran con claridad las acciones que se realizan.
Tanto los vÃdeos como las imágenes se alojan en screencast.com, disponiendo todos los usuarios 200Mb de alojamiento. Jing
VÃa / WebAppers
Pues dicho y hecho, tan sólo se necesitan dos scripts, uno para recuperar los datos y otro para mostrarlos. El primero habrá que ponerlo en el cron para que recupere los datos cada cierto tiempo (en mi ejemplo busco “google” cada 2 minutos).
Hay que tener cuidado porque Twitter da un máximo de 2000 actualizaciones nuevas, por lo que tendremos que ajustar los tiempos de consulta en Twitter.
El script que lee los datos es el siguiente:
<? php
function insertar($consulta, $ult) {
global $db;
$data = json_decode(file_get_contents('http://search.twitter.com/search?q='.urlencode($consulta).'&refresh=true&since_id='.$ult));
$n = isset($data->total) && $ult != $data->max_id? $data->total:0;
$db->queryExec('INSERT INTO estadisticas (fecha, n) values ('.time().', '.$n.')');
if (!$ult) $db->queryExec("INSERT INTO opciones (clave, valor) values ('ultimo', ".$data->max_id.")");
else $db->queryExec("UPDATE opciones SET valor = ".$data->max_id." where clave='ultimo' ");
}
$consulta = $_GET['q'];
// Limpio para poder usarlo en el nombre para la BD
$_consulta = preg_replace('/[^A-Z0-9]/i', '_', $consulta);
if ($db = new SQLiteDatabase($_consulta.'.db')) {
$q = @$db->query("SELECT valor FROM opciones Where clave='ultimo'");
if (!$q) {
$db->queryExec('CREATE TABLE estadisticas (fecha real, n real, PRIMARY KEY (fecha));');
$db->queryExec('CREATE TABLE opciones (clave text, valor text, PRIMARY KEY (clave));');
$q = $db->query("SELECT valor FROM opciones Where clave='ultimo'");
}
$r = $q->fetchAll(SQLITE_ASSOC);
$ult = 0;
if (!empty($r)) $ult = $r[0]['valor'];
insertar($consulta, $ult);
}
?>
Y el script que dibuja la gráfica es:
<? php
$desde = strtotime($_GET['desde']);
$hasta = strtotime($_GET['hasta']);
$consulta = $_GET['q'];
// Limpio para poder usarlo en el nombre para la BD
$_consulta = preg_replace('/[^A-Z0-9]/i', '_', $consulta);
if ($db = new SQLiteDatabase($_consulta.'.db')) {
$q = $db->query("SELECT fecha, n FROM estadisticas Where fecha>".$desde." and fecha<".$hasta);
$r = $q->fetchAll(SQLITE_ASSOC);
foreach($r as $item) {
$x[] = $item['n'];
$l[] = $item['fecha'];
}
}
header('Location: http://chart.apis.google.com/chart?chtt=Line+Chart&chts=000000,12&chs=1000x600&chf=bg,s,ffffff|c,s,ffffff&chxt=x,y&chxl=0:|'.implode('|', $l).'|1:|'.implode('|', $x).'&cht=lc&chd=t:75.00,16.66,0.00,8.33,100.00&chdl=Label+1&chco=0000ff&chls=1,1,0');
Actualización: Google Charts no deja meter muchos valores por lo que la gráfica de arriba sólo saca las 20 últimas actualizaciones
Un sitio muy recomendable para los switchers que acaban de estrenarse en el sistema operativo de Apple. La web (realizada con WordPress pero no es un blog) contiene artÃculos muy interesantes, como Software P2P (peer to peer) para Mac OS X o Los atajos d
Como se puede ver, existen dos scripts dentro de npm: build que compila el js y extrae los CSS, y dev, que arranca el servidor de webpack habilitando HMR (🎶 ¡ya no puedo vivir sin él! 🎶).
Ambas configuraciones de webpack usan un script en común (webpack.config.common.js):
const webpack = require( 'webpack' );
const path = require( 'path' );
// Carga los ficheros .vueconst VueLoaderPlugin = require( 'vue-loader/lib/plugin' );
// Configura stylelintconst StyleLintPlugin = require( 'stylelint-webpack-plugin' );
// Para obtener un path para los aliasfunctionresolve( dir ) {
return path.join( __dirname, '.', dir );
}
module.exports = {
mode: 'production',
// Fichero inicial del proyecto
entry: './js/main.js',
// Fichero final para incluir
output: {
filename: 'js/main.js',
publicPath: '/dist/',
},
module: {
// Reglas para los ficheros
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
loader: 'babel-loader',
},
{
test: /\.vue$/,
loader: 'vue-loader',
},
{
test: /\.css$/,
use: [
'css-loader',
'sass-loader',
],
},
],
},
plugins: [
new webpack.HotModuleReplacementPlugin(),
new VueLoaderPlugin(),
new StyleLintPlugin( {
files: [ '**/*.{vue,htm,html,css,sss,less,scss,sass}' ],
} ),
],
resolve: {
extensions: [ '.js', '.vue', '.json' ],
alias: {
'@': resolve( '' ),
},
},
};
El frontend se gestiona desde el fichero main.js, que inicializará Vue y añadirá el componente principal:
import Vue from 'vue';
import Buefy from 'buefy';
import'buefy/dist/buefy.css';
import App from './components/App.vue';
import'@/assets/scss/main.scss';
Vue.use( Buefy );
new Vue( {
el: '#app',
components: {
App,
},
render: ( c ) => c( 'app' ),
} );
// accept replacement modulesif ( module.hot ) {
module.hot.accept();
}
Y ya por último el componente App.vue, que muestra simplemente un poco de HTML