Páginas

lunes, 26 de diciembre de 2016

[Drupal] Bloque adjuntos de todos los idiomas relacionados con el nodo actual

Hola amigos!

Hoy les voy a facilitar la configuración para una vista en Drupal 7 que les puede resultar útil.

El sitio es multilenguaje por parámetro de sesión, debido a que no todo el sitio permite traducción.
El boceto planteaba la inclusión de un bloque a la derecha que mostraba los adjuntos del contenido que se estaba viendo... hasta ahí todo fácil, pero decidieron que se muestren los adjuntos en los distintos idiomas en los que está permitida la traducción! Inglés, Español y Portugués.

Con el módulo Views solamente hay que configurar algunas cosas más de lo normal.
(la vista la cree para mostrar archivos y no contenido, pero creo que es indistinto ya que terminamos mostrando contenido).

En la parte de Avanzadas hay que incluir un filtro contextual:
Uso del Archivo: ID de la Entidad

y luego agregar 2 relaciones:
Uso del archivo: Contenido

y relacionado con este último (Contenido) Traducción del contenido: Traducciones

Finalmente en los campos podemos agregar los campos vinculados a la relación Traducciones
(Traducciones) Contenido: Adjuntos




Espero que les sirva!!

saludos!

lunes, 24 de octubre de 2016

MS SQL DateTime a formato Wordpress XML


Hola!!

Esta vez el trabajo era pasar un dump de 1GB de 5 años de laburo en formato MS SQL a un Wordpress en MySQL.

Encaré el problema con Python para traducirlo al formato de importación XML del Wordpress. En este post les pongo específicamente el conversor de fechas.

MS SQL el formato DateTime lo regresa en el dump como un hexadesimal. Me ayudó esta respuesta que lo traduce a MySQL http://stackoverflow.com/questions/4946292/how-to-cast-the-hexadecimal-to-varchardatetime.

Les dejo el código!


# necesito convertir las fechas de formato CAST(0x0000A5F000472C53 AS DateTime) = Viernes, 22 de Abril de 2016
import datetime
import re

# http://stackoverflow.com/questions/4946292/how-to-cast-the-hexadecimal-to-varchardatetime
# SELECT 
      # CAST(
          # '1900-01-01 00:00:00' + 
          # INTERVAL CAST(CONV(substr(HEX(BinaryData),1,8), 16, 10)  AS SIGNED) DAY +
          # INTERVAL CAST(CONV(substr(HEX(BinaryData),9,8), 16, 10)  AS SIGNED)* 10000/3 MICROSECOND
      # AS DATETIME) AS converted_datetime
# FROM
# (
# SELECT 0x0000987C00000000 AS BinaryData
# UNION ALL
# SELECT 0x00009E85013711EE AS BinaryData
# ) d

def getFiletime(dt):
    # CAST(0x0000A5F000472C53 AS DateTime)
    # print dt.group(0)
    temphex = dt.group(0)
    # print 'temphex:' + temphex
    tempsub18 = temphex[7:15]
    # print 'tempsub18:' + tempsub18
    tempsub916 = temphex[15:23]
    # print 'tempsub916:' + tempsub916
    dias = int(tempsub18, 16)
    microsegundos = int(tempsub916, 16) * 10000/3
    return format(datetime.datetime(1900, 1, 1) + datetime.timedelta(dias, 0, microsegundos), '%a, %d %B %Y %H:%M:%S %Z')
    
    
fname = raw_input("Ingresa nombre de archivo: ")
if len(fname) < 1 : fname = "contenido-demo.sql"

fh = open(fname)
f = open('contenido-fechasbien.sql','w+')
 
for linea in fh:
    if linea.find("CAST(0x") != -1: 
        
        linea = re.sub('CAST\(0x([^\s]+) AS DateTime\)', getFiletime, linea)        
        f.write(linea)
    else:
        #guardar la linea en la tabla creada antes
        f.write(linea)

lunes, 3 de octubre de 2016

Separar una base de datos MS SQL por tablas - Python

Escenario:
  • No tengo (y no voy a instalar) el MS SQL
  • Me pasan un dump de muuuuchos megas
  • Existe un encabezado de tabla donde está el nombre de la tabla por ejemplo:
    /****** Object:  Table [dbo].[Tabla]
  • Necesito importar solo algunas tabla de toda la base a un Wordpress
Decidí dividir el mega archivo en archivos más chiquitos por tabla...

Una anotación importante, el archivo que me habían pasado tenía como codificación UCS-2 Little Endian.... necesitás convertirlo a UTF-8

Con Python son un par de lineas hacer esto... les dejo el código: 

fname = raw_input("Ingresa nombre de archivo: ")
if len(fname) < 1 : fname = "base-utf8.sql"

fh = open(fname)
 
for linea in fh:
    if linea.find("/******") != -1: 
        #fijarse como se llama la tabla
        inibus = linea.find('[dbo].[');
        tabla = linea[inibus+7:linea.find(']',inibus+7)]

        #crear un nuevo archivo, a+ lo crea o lo abre al final para agregar        
        f = open(tabla + '.sql','a+')
        print "Se creo el archivo: " + tabla + ".sql"
        
    else:
        #guardar la linea en la tabla creada antes
        f.write(linea)

viernes, 30 de septiembre de 2016

Accesos Apache 2.4+ por archivo

Cortito y al pie...

Creo que tengo como 4 posteos encolados en borrador próximos a salir pero este lo quería poner por acá rápido.

Me pidieron subir un sitio Wordpress para trabajarlo online, pero que el resto de la humanidad no lo vea todavía... si, hay miles de soluciones, pongo una.

En el .htacces podés restringir el acceso por archivo entonces...
Subís un index.html con el mensaje que quieras, ojo que si accedes al dominio te tiene que reconocer la extensión html en DirectoryIndex

DirectoryIndex index.php index.html index.htm
<Files "index.php">
   Require ip 131.111.111.111 
   Require ip 111.111.111.131 
   Require ip 111.111.111.11
   Require ip 111.111.115.111 
</Files>

Espero le sirva a alguien.

Alek

miércoles, 28 de octubre de 2015

Juego de los Descamisados - Construct2

Durante octubre lanzamos varios productos en el marco del 70 aniversario del 17 de octubre de 1945.

El Documental Transmedia 70 Octubres es un trabajo de 5 meses de: recopilación de archivo de distintas fuentes, entrevistas, fotografía, edición de video, producción y difusión desde principio de septiembre a fines de octubre.

El Documental cuenta con 3 cuentas de Twitter
@70octubres
@descamisado1945
@peron1945

Una cuenta en Facebook , un canal de Youtube, un sitio web, un video 360 de Berisso y un juego realizado con la herramienta Construct2 (versión gratuita)

El juego se puede ver en: Juego de los Descamisados

La herramienta es espectacular para quienes empiezan con la producción de Juegos y para enseñar en niveles básico e intermedio, permite hacer juegos 2D entre otros muchos.

El juego de los descamisados es un juego pensado para escritorio, pero teniendo algunos detalles en cuenta para que se pueda probar en el celu.
Sos un empleado de un frigorífico de Berisso y el objetivo es juntar la mayor cantidad de compañeros y llevarlos a plaza de mayo para que pongan los pies en la fuente.

A continuación les pongo algunas capturas de pantalla y eventos para replicarlo.

Fuego:


Agua:
Para la parte del puente levantado de Avellaneda, cambiamos todas las propiedades del personaje principal y de todos los descamisados que entran con él.



Ranking: Web service creado con Slim Framework, y NotORM. Acá podés ver detalles de la parte de Construct2: 


Luego terminaré de poner capturas... no puedo dejar de jugar!! :D 

Update: no puedo dejar de agradecer a Cata Laval y a Lu Módena por la enorme ayuda para hacer el juego.


miércoles, 21 de octubre de 2015

Debate chequeado - visualizaciones, d3, isotipe y fullpage


Esta semana estuvimos junto a Alvaro Liuzzi y Maxi Ponz creando unas visualizaciones para Chequeado.com.

Se pueden ver en http://chequeado.com/debatechequeado/

Algunas de las tecnologías que me ayudaron a crear la página:

  • Las secciones con altura de 100% y arrastre completa por sección, vínculos desde el menú y algunos detalles más gracias a FullPage.js 
  • Las visualizaciones de círculos con gravedad al centro y arrastre  realizado gracias a las librerías d3.js, geniales y llenas de documentación.
  • El filtro de Bloques de datos chequeables y el de videos fue realizado con Isotipe. En el de videos se sumó la posibilidad de un filtro exclusivo por temática pero con un OR por candidato para lograr el versus. Básicamente se va actualizando un array de filtros y luego se inicializa el isotipe con una función como filtro y el array como parámetro.
  • La nube de Tags trae por ajax los discursos completos y parciales de los candidatos, es cierto, fue una tentación filtrar las palabras y hacerlo estático... pero no. Los colores se toman de un array con d3.scale.ordinal().range. Me baso en esta nube de tags: https://www.jasondavies.com/wordcloud/
  • Los tags que aparecen flotando abajo de los círculos y las palabras fueron hechos utilizando Tipsy, sumando algún parche para que anduviera bien en firefox.
Espero que le sirva a alguno!

lunes, 18 de mayo de 2015

Validaciones avanzadas en Laravel 4.2

Quería compartirles este pedazo de código de ejemplo que tal vez salve a más de uno de un aprieto.

Imaginensé que tienen una tabla de viajes y una tabla de pasajes. Los asientos dentro de la tabla de pasajes se pueden repetir pero no para el mismo viaje. Las reglas de laravel nos quedan chicas y acá hay una posible solución, crear una función que modifique las reglas dinámicamente pasando parámetros desde el controlador. (valido solo el asiento)

<?php
public static $rules = [
            'create' => [
                'asiento_id' => 'required|unique:pasajes,asiento_id,null,asiento_id,viaje_id,:id'
            ],
            'update' => [
                'asiento_id' => 'required|unique:pasajes,asiento_id,:idasiento,asiento_id,viaje_id,:idviaje'
            ]
        ];
        

public static function rules( $action, $merge=[], $id=false, $search=':id')
        {
            $rules = static::$rules[$action];
            if ($id) {
                foreach ($rules as &$rule) {
                    $rule = str_replace($search, $id, $rule);
                }
            }
            return array_merge( $rules, $merge );
        }
?>

Entonces desde el controlador podemos validar


<?php
$validator = Validator::make($data, Pasajes::rules('create', [], $data['viaje_id']));
?>
Y la función reemplazará :idviaje por el código del viaje en el string de validación.
Lo mismo si queremos pasar más de un parámetro ya que str_replace admite remplazar arrays.


<?php
$validator = Validator::make($data, Pasajes::rules('update', [], array($data->pasajero_id, $data->viaje_id, $data->asiento_id), array(':idpasajero', ':idviaje', ':idasiento'))); 
?>
Solamente hay que tener cuidado con el orden en los array.

saludos!!