Egresado de Psicología PUCV
Front y programación en AyerViernes y clerk.im
Blogueo sobre Internet, tecnología, FOSS, etc. en yukei.net y sobre otras tonteras en contrasentido.net
Me puedes contactar en felipe.lavin@gmail.com
UFW es una herramienta para facilitar la configuración del firewall iptables en Linux, por lo que conocerla un poquito tarde o temprano puede resultar vital.
Hace poco, pude constatar un claro intento de hacer un ataque de fuerza bruta contra este blog, y a pesar que el excelente plugin Limit Login Attempts estaba bloqueando correctamente los intentos de login, había una IP en particular que seguía intentando acceder incansablemente a la página de login.
Tras acceder por SSH, llegó la hora de aplicar un sencillo comando para hacer la ley del hielo a este molestoso:
$: ufw deny from 192.168.144.xx
Sin embargo, el registro de nginx seguía mostrando intentos de acceso… ¿qué podía estar pasando?
Tras un par de búsquedas en Google pude dar con la respuesta: básicamente, había un problema de prioridades en las reglas del firewall, ya que sólo va a aplicar la primera coincidencia.
Para pode resolver este impasse, en primer lugar debes obtener el listado de reglas activas y sus prioridades, lo que puedes lograr con ufw status numbered.
Este comando te devuelve el listado de reglas activas y un número identificador de la prioridad. A partir de esto, puedes crear una nueva regla e insertarla en un lugar específico; por ejemplo para agregarla en primer lugar:
$: ufw insert 1 deny from 192.168.144.xx
¡Listo!
The post Bloquear una IP con UFW appeared first on yukei.net.
Aunque una de las grandes ventajas de WordPress es que sus herramientas de edición te pueden permitir dedicarte tranquilamente a escribir sin necesidad de tocar una línea de código, por diversos motivos a veces es necesario utilizar algo un poco más complejo que la pestaña de HTML.
Si bien los quicktags ayudan, en más de una vez terminé necesitando solamente un buen editor de código, que me permitiera hacer dos cosas fundamentales que el editor actual no permite:
Obviamente, escribir en un editor, pegar y refrescar cada vez que se hace un cambio es poco menos que ideal, por lo que cuando encontré CodeMirror me pareció que la solución ideal sería integrarlo en WordPress.
Existen varios plugins que hacen justamente eso, pero sólo para el editor de temas; ninguno para el editor de posts… por lo que obviamente me dí a la tarea de hacerlo yo mismo. Hace ya varios días está en el repositorio de plugins de WordPress, y aunque es una versión muy preliminar, es lo suficientemente completa como para poder utilizarla en escribir esta misma entrada.
Descárgalo desde el repositorio de WordPress: CodeMirror for Post Editor
The post Nuevo plugin para WordPress: CodeMirror for Post Editor appeared first on yukei.net.
Un tip pequeño pero muy útil: si estás trabajando con archivos LESS en Linux y necesitas un método rápido para compilarlos automáticamente al hacer modificaciones, puedes lograrlo con el compilador para node.js más inoticoming.
En primer lugar, es necesario instalar node.js y su gestor de paquetes además de less.
Luego, toca instalar inoticoming, la utilidad que permite vigilar las modificaciones a los archivos:
Y finalmente, ejecutar el comando que permite realizar la compilación cada vez que se modifica un archivo. En mi caso, realizo mis modificaciones en less/style.less y compilo en css/style.css:
Listo, mucho más cómodo.
The post Compilar archivos LESS automáticamente en Linux appeared first on yukei.net.
La historia es la siguiente: Rodrigo Ferrari (@_safari) creó una cuenta de Twitter con el nombre losluksic en marzo del 2010, con el evidente objetivo de parodiar a una de las familias más poderosas de Chile.
El lunes la fiscalía logró su formalización en el delito de suplantación de identidad, en un proceso que implicó la dedicación de la policía de investigaciones en “vigilancia discreta” de Ferrari y la obtención de datos desde el ISP (VTR) sin orden judicial.
El caso de @_safari, el tuitero formalizado por “usurpar” identidad de los Luksic es clave para la libertad de expresión en Internet Chile
— Miguel Paz (@miguelpaz) February 20, 2013
Este caso representa el triste estado de la legislación sobre libertad de expresión en internet en Chile como la abismante desigualdad en el acceso a la justicia, en tanto el alcance de la indagación es manifiestamente desmedida en proporción al hecho, ya que en el transcurso de dos años de investigación con recursos fiscales ha recurrido a métodos utilizados en delitos graves como narcotráfico (con la consecuente transgresión a la vida privada de Ferrari) en circunstancias que ni siquiera existe perjuicio económico sino solamente un rasguño en el ego de Luksic.
Más información en:
The post Libertad de expresión y derecho a parodia en los tiempos de Twitter appeared first on yukei.net.
A estas alturas, para nadie debería ser una sorpresa la existencia de servicios como Dropbox, Google Drive o Ubuntu One, que te permiten almacenar una carpeta en “la nube” y compartir archivos con tus contactos.
Si bien todos estos servicios cumplen de forma satisfactoria con su propósito, ownCloud te permite armar un servicio con características similares completamente bajo tu control, que es una buena alternativa para implementar un sistema colaborativo de bajo costo o reutilizar una máquina en desuso.
Lo puedes utilizar para montar un repositorio de archivos compartidos de forma muy fácil: te permite gestionar cuotas de almacenamiento por usuario, compartir con grupos o usuarios en específico (o incluso a través de un enlace público que puede estar protegido con contraseña) y guardar el historial de versiones de un archivo. Se aprovecha muy bien como una herramienta de trabajo en equipo.
Además es posible acceder a través de WebDAV, por lo que se puede integrar con distintos programas que soportan este protocolo: en Linux se integra perfecto con los gestores de archivos de Gnome y KDE, en OSX funciona a medias con Finder ya que su implementación del protocolo tiene más de algún problema (puedes usar Transmit), y también hay clientes para Windows, Android, iOS, etc. De todos modos, la interfaz web es muy cómoda y potente. Existen también clientes de sincronización tipo Dropbox, es decir, que monitorean una carpeta local y la mantienen actualizada.
También tiene otras funcionalidades que quizás no son tan críticas pero sí definitivamente agradables, como la posibilidad de navegar por las imágenes de tus archivos como galerías de imágenes, poder escuchar directamente archivos MP3, previsualizador de archivos PDF y ODT (LibreOffice), etc; y puedes agregar más aplicaciones a modo de plugins, a través de la misma interfaz de administración.
The post Arma tu propia nube colaborativa con ownCloud appeared first on yukei.net.
Hace algunos días, necesitaba crear una forma de visualizar la cantidad de entradas publicadas en un sitio. Después de algunas líneas de PHP y Javascript, tenía un pequeño widget para el escritorio de WordPress funcionando, y tras un par de vueltas más decidí compartirlo como plugin.
El resultado es Dashboard Posts Stats que te permite ver la actividad de publicación durante los últimos 30 días.
Por el momento es muy sencillo, pero ciertamente hay varias ideas y pendientes que pretendo aplicar para hacerlo cada vez más útil.
Se puede descargar desde el repositorio de plugins de WordPress, y si tienes alguna idea, solicitud o contribución, puedes enviarla a su repositorio en GitHub.
The post Nuevo plugin para WordPress: Dashboard Posts Stats appeared first on yukei.net.
La clase WP_Post recientemente introducida en WordPress 3.5 permite facilitar muchas tareas comunes en el desarrollo sobre este CMS, en particular el trabajo con campos personalizados almacenados en la tabla {$wpdb->prefix}postmeta.
Sin embargo, la forma en que está implementada esta clase aparentemente pone una limitante importante, ya que al estar definida como final no puede ser extendida mediante herencia:
class MiPost extends WP_Post{}
// Error Fatal: Class MiPost may not inherit from final class
Sin embargo, y aunque quizás no parezca obvio, es totalmente posible extender la funcionalidad de esta clase no utilizando herencia sino composición, por ejemplo, utilizando el patrón Decorator.
abstract class PostDecorator{
/**
* Almacena el objeto post
* @access private
*/
private $post;
/**
* @param object $post Un objeto de tipo WP_Post
*/
public function __construct( WP_Post $post ){
$this->post = $post;
}
}
class PostProyecto extends PostDecorator{
/**
* @param string Nombre de la propiedad que se desea obtener
* @return string Valor de la propiedad
*/
public function __get( $key ){
// permite acceso como $objeto->autor
if ( $key === 'autor' )
return $this->getAuthor();
// si no corresponde a la funcionalidad que estamos agregando
// podemos aprovechar el método __get() del objeto post
return $this->post->{ $key };
}
/**
* @return string Nombre del autor o enlace
*/
public function getAuthor(){
// el nombre del autor se almacena como un post meta con clave "_author"
$author = $this->post->_author;
// la url está en un post meta con clave "_author_url"
$author_url = $this->post->_author_url;
return ( $author_url ) ? '<a href="'. esc_url($author_url) .'">'. $author .'</a>' : $author;
}
}
$project_post = get_post(123);
$project = new PostProyecto( $project_post );
echo $project->autor;
// <a href="http://felipe.lv">Felipe</a>
De este modo, podríamos crear una clase para cada tipo personalizado de contenido, de modo de poder separar ordenadamente la lógica de la presentación y obtener una sintaxis muy clara y simple.
The post Usando decoradores para extender WP_Post appeared first on yukei.net.
Una de las novedades más interesantes para desarrolladores que trae WordPress 3.5 es que a partir de esta versión los objetos tipo “post” ya no son objetos estándares de PHP (stdClass) sino instancias de WP_Post.
Por supuesto, este cambio está asociado a algunas ventajas inmediatas, relacionadas con una mejor performance y una optimización en que estos objetos se pueden almacenar en la caché de objetos (sobre todo si estás usando una caché externa, como APC, XCache o memcached). Esto es en parte debido a la utilización de métodos mágicos, tales como __isset( $key ), y el que resulta mucho más interesante, __get( $key ), que por ejemplo, permite cargar los “ancestros” de una entrada sobre demanda (con “lazy loading”), pero además tiene la posiblidad de cargar cualquier campo personalizado con la misma técnica.
En la práctica, esto significa que la utilización de datos de postmeta es muchísimo más sencilla. Por ejemplo:
<?php // WordPress pre-3.5 // Deseo mostrar el campo personalizado "_ubicacion" $ubicacion = get_post_meta( $post->ID, '_ubicacion', true ); echo $ubicacion; // WordPres 3.5+ echo $post->_ubicacion;
Es decir, puedes acceder cualquier postmeta simplemente indicando el correspondiente meta_key como propiedad del objeto $post… ¡más conveniente, imposible!
Y si como yo tienes una “sana preocupación” por la performance de esta funcionalidad, puedes estar tranquilo: desde hace varias versiones WordPress carga en caché toda la información de postmeta al acceder a cualquier campo personalizado, lo que significa que no estará realizando una consulta a la base de datos cada vez que debas acceder a una propiedad de postmeta.
El único “pero” de la implementación de la clase WP_Post es que está marcada en el core como una clase final, por lo que si deseas utilizarla en un contexto mayor, no podrás extender la clase mediante herencia (como en MiClase extends WP_Post), sino que deberás hacerlo mediante composición, un patrón de diseño que quizás es un poco menos obvio… pero eso es motivo para otro post.
The post Objetos de posts de WordPress y la clase WP_Post appeared first on yukei.net.
Uno de los métodos que incluye la clase wpdb es prepare, que permite preparar una consulta a la base de datos para asegurarnos que se ejecute de forma segura.
Su utilización es bastante sencilla — y si hasta ahora no la estás utilizando deberías leer inmediatamente la sección sobre cómo proteger tus consultas ante ataques de inyección SQL — pero hasta hace poco no había ideado una forma sencilla de preparar consultas con cláusulas IN.
Una solución bastante sencilla que podemos aplicar es la siguiente:
// obtener un listado de IDs de entradas "especiales"
// $special_entries = array(1, 3, 5, 8, 13, [...]);
$special_entries = get_option('my_special_entries');
// ¿cuántas condiciones se van a seleccionar?
$how_many = count($special_entries);
// prepara la cantidad adecuada de reemplazos
// si se buscarán strings, el último parámetro sería '%s'
$placeholders = array_fill(0, $how_many, '%d');
// unir los reemplazos con comas
// $format = '%d, %d, %d, %d, %d, [...]'
$format = implode(', ', $placeholders);
// la consulta
$query = "SELECT ID, post_title, post_name, post_parent FROM $wpdb->posts WHERE post_parent IN($format)";
// obtener los resultados de forma segura
$results = $wpdb->get_results( $wpdb->prepare($query, $special_entries) );
The post Sanitizar consultas con cláusulas “IN” con $wpdb en WordPress appeared first on yukei.net.
Una buena fuente para tu código puede ser tan importante como elegir un buen editor.
Durante algún tiempo he deambulado entre diversas alternativas, como Inconsolata, Ubuntu Mono e incluso la reciente Source Code Pro de Adobe (todas ellas tienen licencias de código abierto y se pueden descargar desde los enlaces indicados).
Pero hoy encontré una nueva que es realmente una belleza: Computer Modern Typewriter.
La fuente es parte de una familia bastante amplia, que incluye variantes con y sin serifas en negritas e itálicas. Tiene soporte para Unicode y es una de las fuentes incluídas originalmente con TeX.
También tiene una licencia de código abierto, y se puede descargar desde su sitio web.
Actualización (28 octubre 2012): en Ubuntu (y supongo que también en otras distribuciones) está disponible Latin Modern, que puedes instalar desde repositorios con apt-get install lmodern.
The post Computer Modern Typewriter, una bella fuente para tu código appeared first on yukei.net.
No es que el incrédulo no deba creer en nada. No cree en todo. Cree una cosa cada vez, y en una segunda cuando deriva de alguna manera de la primera. Avanza como un miope, es metódico, no aventura horizontes. Dos cosas no relacionadas entre sí, creer en las dos, y con la idea de que, en algún lugar, haya una tercera, oculta, que las vincula, esto es la credulidad.
La incredulidad, lejos de excluir la curiosidad, la sostiene.
Umberto Eco, El péndulo de Foucault
Tags: ateísmo, Literatura, umberto ecoThe scientific method followed printing as a more refined way to deal with the exploding amount of information humans were generating. Via peer-reviewed correspondence and, later, journals, science offered a method of extracting reliable information, testing it, and then linking it to a growing body of other tested, interlinked facts
Kevin Kelly, What Technology Wants (p. 48)
Tags: ciencia, imprenta, journals, método científicovía Neopren… hubiese preferido David Presley
Tags: David Bowie, Elvis Presley, ilustración, Música, pop, rockPorque el socialismo no es sólo una doctrina obrera, sino que representa el ateísmo en su forma contemporánea; es la cuestión de la torre de Babel, que se construyó a espaldas de Dios no por alcanzar el cielo desde la tierra, sino por baja a la tierra el cielo.
Los hermanos Karamazov
Tags: Literatura, política, religión, socialismoEl verdadero realista, si es incrédulo, halla siempre en sí mismo la voluntad y la energía para no creer en el milagro, y si éste se le presenta como un hecho incontrastable, dudará de sus sentidos antes que admitir el hecho. Y si lo admite, lo considerará como un hecho natural que anteriormente no conocía. Para el realista no es la fe lo que nace del milagro, sino el milagro el que nace de la fe.
Los hermanos Karamazov
Tags: ateísmo, Literatura, religiónEl movimiento estudiantil, surgido en las universidades pertenecientes al Consejo de Rectores, y al cual se han sumado académicos y autoridades, ha puesto en evidencia algo que estaba a la vista, y que sin embargo los chilenos nos negábamos a ver. El escándalo de la educación en Chile: colegios municipalizados que reciben un financiamiento miserable; particulares subvencionados que maximizan sus utilidades estrujando a los profesores con cuarenta y más horas de trabajo en aula. Y universidades, perfectamente acreditadas (¿CÓMO?) en las cuales, mediante la figura de las inmobiliarias, accionistas pueden retirar capital y utilidades; ser compradas y vendidas. En las cuales los alumnos al ingresar deben firmar una renuncia a su legítimo derecho a asociación; o que prácticamente carecen de profesores contratados, y recurren a un proletariado del conocimiento (profesores-taxi) al cual sólo pagan honorarios (nada para previsión social; nada para salud); al que, en algunos casos, contabilizan sólo las horas efectivamente dictadas, sin admitir excepción: si un día te tocaba clase, y hubo terremoto, fiesta nacional, paro del transporte, lo que sea, no se te paga, y punto. Y todo esto, frente a la mirada benévola de las autoridades.
Eduardo Sabrovsky en El mostrador
Tags: Chile, educación, movimiento estudiantil, política, universidad"Zsh is the new hotness. Well newer and hotter than Bash anyway, since the first version of Bash was released in June 1989, while the young and peppy Zsh was released in December 1990. In large parts thanks to the configuration “skin” oh-my-zsh, Zsh has gained a lot of popularity during the last year or so. I have used it for a few months myself and could not be happier, unless it produced chocolate ice cream"
"Postalicious is a WordPress plugin that automatically posts your delicious, Google Reader, Reddit, Yahoo Pipes, Jumptags, Pinboard, or Diigo bookmarks "
In a world of growing front-end complexity, what are we handing off to clients?
I've traditionally used python for web scraping but I'd been increasingly thinking about using Node given that it is pure JS and therefore could be a more natural fit when getting info out of web pages. In particular, when my first steps when looking to extract information from a website is to open up the Chrome Developer tools (or Firebug in Firefox) and try and extract information by inspecting the page and playing around in the console - the latter is especially attractive if jQuery is available. What I often end up with from this is a few lines of jQuery selectors. My desire here was to find a way to directly reuse these same css selectors I use in my browser experimentation directly in the scraping script. Now, things like pyquery do exist in python (and there is some css selector support in the brilliant BeautifulSoup) but a connection with something like Node seems even more natural - it is after the JS engine from a browser!
"Symfony Console component enables us to create commands in PHP. It does all the nasty work of handling input and output."