OpenGLView y Controles Cocoa

Deja un comentario

Hacía mucho que tenía la intención de escribir éste post, realmente se trata de algo muy sencillo, crear una aplicación básica para OSX en la que se usen controles de Cocoa, tales como botones, sliders, etcétera, y usarlos para controlar una vista de un OpenGLView. Esto lo hice ya que en el último semestre, me pidieron una aplicación que fuera un display de siete segmentos “virtual”. El problema al que me enfrenté fue que no sabía como hacer la comunicación entre la vista y los controles. Pues bien, la respuesta fue muy sencilla, sólo hay que agregar outlets a una subclase que herede de (en éste caso) OpenGLView, guardarla y usar la clase resultante. Éste puede ser un punto de partida para construir aplicaciones de escritorio más grandes que usen vistas de gráficos más avanzados, espero que les sirva.

Les dejo mi código y un screenshot de cómo se ve la aplicación.

 

http://www.mediafire.com/?hug03590gzvv0vp

Resumidor automático usando ENERTEX

1 comentario

Mi último semestre de la carrera estuvo lleno de nuevas experiencias personales y académicas, de las cuales aprendí bastante. Fue en éste periodo que conocí algunos fundamentos de la lingüistica computacional, el tema de procesamiento de lenguaje natural siempre me ha llamado la atención y por eso fue que decidí inscribir dos materias relacionadas. Uno de los temas más importantes dentro del procesamiento de lenguaje es la creación de resúmenes automáticos, mi proyecto final fue crear un software que pudiera llevar a cabo dicha tarea, usando una técnica llamada ENTERTEX, la cual es una técnica que usa métodos estadísticos para determinar qué tan relevante es una frase dentro de un texto, una vez que se tienen las “relevancias” de cada frase, se puede crear un resumen mediante un filtrado tomando en cuenta el número de frases, la relevancia deseada y algún otro filtro como puede ser, una “temática”. En general, las entradas que se necesitan para realizar un resumen cualquiera son:

  • Un conjunto de textos de donde se hará el resumen
  • Un número máximo de frases que conformarán el  resumen
  • Un grado de relevancia respecto a una temática elegida
  • Un conjunto de frases que se desean filtrar
Un buen resumidor automático debería tener las siguientes características:
  • Crear un resumen entendible para el ser humano
  • Con una capacidad de realizar operaciones de manera rápida
  • Crear un resumen en orden cronológico, y con orden secuencial
Tomando en cuenta la metodología del modelo ENERTEX, las operaciones para realizar un resumen automático son únicamente matriciales, con un poco más de detalle, se debe generar una matriz en la que se tengan todas las palabras que conforman el corpus de documentos como columnas, y como filas, un índice que represente a cada una de las frases del corpus. La matriz se llena con unos y ceros, por ejemplo, si la frase 5[fila] contiene la palabra 6[columna], se coloca un uno en [5][6], si no la contiene, se coloca un cero. Una vez que la matriz fue llenada con unos y ceros, se procede a realizar la siguiente operación matricial (y es aquí donde se debe tomar en cuenta un mecanismo de paralelismo para acelerar el procesamiento ya que la matriz para un corpus de tamaño considerable puede llegar a tardar un buen rato):
A=(A*A’)^ 2
Una vez que la operación haya sido realizada, para cada frase, se suma cada valor de las palabras que corresponden a dicha fila, con lo cual se obtiene una frecuencia de cada frase. A mayor frecuencia, es mayor la relevancia que tiene la frase, con lo cual se puede comenzar a generar el resumen.
Otra de las cosas que me llevo de éste semestre es haber aprendido a programar en lenguaje PERL, lo cual realmente me fascinó, es un lenguaje muy flexible, y que es muy apropiado para realizar procesamiento de lenguaje natural. Mi resumidor lo hice en PERL y una pequeña parte en BashScript, el método que usé lo describo a continuación.
La implementación no toma en cuenta el paralelismo por lo que el procedimiento puede llegar a tardar un poco dependiendo del tamaño del corpus. La implementación que yo realicé la pueden descargar de aquí:
En el comprimido hay una carpeta llamada doc, donde pueden encontrar un documento con los detalles de implementación, ejecución, archivos de entrada, etcétera.
En general, el método funciona bastante bien, un update que podría ser realizado seria la paralelización del procesamiento. Si tienen dudas o comentarios, no duden en postearlos.

Editor de Subtítulos SRT BASH

1 comentario

¿Acaso no es molesto cuando bajas unos subtítulos y resulta que no están sincronizados con el video?, ésto pasa muy seguido cuando bajas películas de internet, ayer no podía ver el OVA 2 de Rurouni Kenshin por éste motivo, así que decidí hacer un script para hacer desplazamientos de tiempo en la pista de subtítulos.

¿Cómo usarlo?

  • Bájenselo de aqui
  • chmod 755 <filename>

Subfixer 0.1 by @Katzider
usage: subfixer <DIV> <AMMOUNT> <FILENAME>
DIV:
-h  -> hours
-m  -> minutes
-s  -> seconds
-ms -> milliseconds
AMMOUNT: Any
FILENAME: valid srt subtitle file

El code:

#!/bin/bash
#Katzider 2011
function input()
{
shopt -s nocasematch
if [ -f $3 ]
then
if [[ $3 =~ (.*)(\.)(ssa) ]]
then
transformSSA $1 $2 $3 0
else
if [[ $3 =~ (.*)(\.)(srt) ]]
then
transformSRT $1 $2 $3 1
else
printUsage
fi
fi
else
printUsage
fi
}

function printUsage()
{
echo “”
echo “Subfixer 0.1 by @Katzider”
echo “usage: subfixer


echo “DIV:”
echo “-h -> hours”
echo “-m -> minutes”
echo “-s -> seconds”
echo “-ms -> milliseconds”
echo “AMMOUNT: Any”
echo “FILENAME: valid srt subtitle file”
echo “”

function transformSRT()
{
grep “\->” $3 > .list1
cat .list1 | sed ‘s/\ \-\-\>\ /B/g’ > .list2
cat .list2 > .list1
echo “This may take few minutes…”
OFFSET=$2
if [[ $1 == "-h" ]]
then
let “OFFSET*=3600000″
else
if [[ $1 == "-m" ]]
then
let “OFFSET*=60000″
else
if [[ $1 == "-s" ]]
then
let “OFFSET*=1000″
else
printUsage
fi
fi
fi
cat $3 > $3″_2.srt”
for i in `cat .list1`
do
REPLACE=${i//$’\r’}
REPLACE=`echo $REPLACE|sed ‘s/B/\ –>\ /’`
TOTAL_MILLIS_S=0
TOTAL_MILLIS_E=0
START=`echo $i | awk ‘BEGIN {FS = “B”} ; {print $1}’`
END=`echo $i | awk ‘BEGIN {FS = “B”} ; {print $2}’`

TMP=`echo $START | awk ‘BEGIN {FS = “:”}; {print $1}’`
TMP=`echo $TMP|sed ‘s/^0*//’`
let “TMP*=3600000″
let “TOTAL_MILLIS_S+=TMP”
TMP=`echo $START | awk ‘BEGIN {FS = “:”}; {print $2}’`
TMP=`echo $TMP|sed ‘s/^0*//’`
let “TMP*=60000″
let “TOTAL_MILLIS_S+=TMP”

SECS_=`echo $START | awk ‘BEGIN {FS = “:”}; {print $3}’`
TMP=`echo $SECS_ | awk ‘BEGIN {FS = “,”}; {print $1}’`
TMP=`echo $TMP|sed ‘s/^0*//’`
let “TMP*=1000″
let “TOTAL_MILLIS_S+=TMP”

TMP=`echo $SECS_ | awk ‘BEGIN {FS = “,”}; {print $2}’`
TMP=`echo $TMP|sed ‘s/^0*//’`
let “TOTAL_MILLIS_S+=TMP”
TMP=`echo $END | awk ‘BEGIN {FS = “:”}; {print $1}’`
TMP=`echo $TMP|sed ‘s/^0*//’`

let “TMP*=3600000″
let “TOTAL_MILLIS_E+=TMP”
TMP=`echo $END | awk ‘BEGIN {FS = “:”}; {print $2}’`
TMP=`echo $TMP|sed ‘s/^0*//’`
let “TMP*=60000″
let “TOTAL_MILLIS_E+=TMP”
SECS_=`echo $END | awk ‘BEGIN {FS = “:”}; {print $3}’`
TMP=`echo $SECS_ | awk ‘BEGIN {FS = “,”}; {print $1}’`
TMP=`echo $TMP|sed ‘s/^0*//’`
let “TMP*=1000″
let “TOTAL_MILLIS_E+=TMP”

TMP=`echo $SECS_ | awk ‘BEGIN {FS = “,”}; {print $2}’`
TMP=`echo $TMP|sed ‘s/^0*//’`
TMP=${TMP//$’\r’}
let “TOTAL_MILLIS_E+=TMP”

let “TOTAL_MILLIS_S+=OFFSET”
let “TOTAL_MILLIS_E+=OFFSET”

let “H_S=(TOTAL_MILLIS_S/3600000)”
let “M_S=(TOTAL_MILLIS_S%3600000)/(1000*60)”
let “S_S=((TOTAL_MILLIS_S%3600000)%(1000*60))/1000″
let “MS_S=((TOTAL_MILLIS_S%3600000)%(1000*60))%1000″

let “H_E=(TOTAL_MILLIS_E/3600000)”
let “M_E=(TOTAL_MILLIS_E%3600000)/(1000*60)”
let “S_E=((TOTAL_MILLIS_E%3600000)%(1000*60))/1000″
let “MS_E=((TOTAL_MILLIS_E%3600000)%(1000*60))%1000″

if [ $H_S -lt 0 ]; then H_S=00; fi
if [ $M_S -lt 0 ]; then M_S=00; fi
if [ $S_S -lt 0 ]; then S_S=00; fi
if [ $MS_S -lt 0 ]; then MS_S=000; fi
if [ $H_E -lt 0 ]; then H_E=00; fi
if [ $M_E -lt 0 ]; then M_E=00; fi
if [ $S_E -lt 0 ]; then S_E=00; fi
if [ $MS_E -lt 0 ]; then MS_E=000; fi

if [ $(echo $H_S | wc -c) -eq 2 ]; then H_S=0$H_S; fi
if [ $(echo $M_S | wc -c) -eq 2 ]; then M_S=0$M_S; fi
if [ $(echo $S_S | wc -c) -eq 2 ]; then S_S=0$S_S; fi
if [ $(echo $MS_S | wc -c) -eq 2 ]; then MS_S=0$MS_S; fi
if [ $(echo $MS_S | wc -c) -eq 3 ]; then MS_S=0$MS_S; fi
if [ $(echo $H_E | wc -c) -eq 2 ]; then H_E=0$H_E; fi
if [ $(echo $M_E | wc -c) -eq 2 ]; then M_E=0$M_E; fi
if [ $(echo $S_E | wc -c) -eq 2 ]; then S_E=0$S_E; fi
if [ $(echo $MS_E | wc -c) -eq 2 ]; then MS_E=0$MS_E; fi
if [ $(echo $MS_E | wc -c) -eq 3 ]; then MS_E=0$MS_E; fi

REPLACEMENT=$(echo $H_S:$M_S:$S_S,$MS_S” –> “$H_E:$M_E:$S_E,$MS_E)
cat $3″_2.srt” | sed “s/$REPLACE/$REPLACEMENT/g” > .list3
cat .list3 > $3″_2.srt”
done

rm .list1 .list2 .list3
echo “Done, saved in $3_2.srt, enjoy!”
}

function transformSSA()
{
echo “SSA will be delivered in version v2.0″
}

input $1 $2 $3

Flickr Recomendado

Deja un comentario

Hola amigos, en ésta ocasión les traigo una muy buena recomendación, por si no lo sabían me gusta bastante la fotografía, y hay algunas galerías de Flickr que me parecen muy interesantes a la vista por su calidad. En esta ocasión les quiero mostrar la galería de oguherrera, quien tiene algunas fotos de la Ciudad de México desde sus diferentes ángulos y perspectivas.

 

 

Transferir, respaldar e instalar IPAS en el iPhone via SSH

1 comentario

 

En este post les voy a mostrar la forma de descargar e instalar aplicaciones ipa en su iPhone.

¿Que es necesario saber?

  • IPA
    Los archivos IPA son ejecutables que permiten al dispositivo móvil, la instalación de una aplicación. Cuando se instala una aplicación desde la AppStore comienza el proceso de descarga de un archivo IPA, el cual posteriormente es instalado en el equipo.
  • JailBreak
    Se le llama JailBreak a la modificación del firmware del dispositivo iOS con el fin de poder realizar acciones como la instalación de aplicaciones que no están permitidas por Apple que pueden ser desde aplicaciones de desarrollo, hasta servicios, permite además realizar configuraciones detalladas, entre muchas cosas más.
  • SSH
    SSH es un servicio de comunicación creado principalmente para sistemas UNIX en el cual, dos o equipos establecen un canal de comunicación seguro, el cual puede ser usado para la transferencia de archivos o la ejecución remota de comandos.
  • Installous
    Installous es un paquete que permite instalar archivos ipa en el iPhone sin el uso de iTunes o la App Store, para este tutorial es importante recordar que el directorio por default donde se encuentran los archivos IPA en el iPhone es: /private/var/mobile/Documents/Installous/Downloads

¿Que va a ser necesario para este post?

  • Tener un dispositivo iOS con JailBreak
    En internet hay una gran cantidad de tutoriales para realizar JailBreak, en mi caso usé PwnageTool
  • Tener instalado y funcionando el servicio de SSH en el iPhonePara instalar el servicio de SSH en el iPhone
    1. Abrir la aplicación Cydia y buscar OpenSSH
    2. Instalar OpenSSH 

    Una vez instalado, es necesario configurarlo y cambiar la contraseña por default
    La contraseña por default es ‘alpine’
    Para cambiar la contraseña ejecuta los siguientes comandos desde una terminal, puede ser con la aplicación MobileTerminal que puede ser encontrada desde Cydia, o bien conectandose desde un equipo en la misma red local que el iPhone, solo es cuestion de revisar la IP del iPhone desde las configuraciones de red en Ajustes>Wi-Fi>[SSID]>Dirección IP. Los comandos para cambiar la contraseña son los siguientes:

    I. Login de root
    Sin MobileTerminal y desde un equipo en la misma red (usando un cliente de ssh)
    $ssh root@<ip iPhone>
    <Pedira el password que es ‘alpine’, (no se ve lo que escribes, por directivas de seguridad de los UNIX)>
    Con MobileTerminal
    I.I   Abre MobileTerminal
    I.II  Introduce el comando
    $su
    <Pedira el password que es ‘alpine’, (no se ve lo que escribes, por directivas de seguridad de los UNIX)>
    II. Cambio de la contraseña
    #passwd
    <Introducir la contraseña nueva, dos veces>
    III. Salir de la sesión
    #exit
    IV. Comprueba que haya sido exitoso el cambio de contraseña volviendo a hacer el paso I

    *Para verlo más a detalle revisa este tutorial

  • Tener instalada la aplicación Installous en el iPhone
    Es necesario tener el source de cydia.hackulo.us instalado, para hacerlo
    1. Gestion > Sources > Editar
    2. Añadir cydia.hackulo.us
    Una vez instalada solo hay que buscar la aplicacion Installous 

    *Para verlo más a detalle revisa este tutorial

Transferir aplicaciones IPA al iPhone

  • La página que funciona como source para Installous es http://apptrackr.org/ aqui puedes encontrar practicamente cualquier aplicacion existente dentro de la AppStore y fuera de ella
  • Descarga tus archivos IPA, si quieres descargar varios es mejor que realices la descarga desde tu computadora ya que uno de los bugs de Installous es que cuando quieres descargar multiples archivos desde el iPhone usando la aplicación, ésta se muere y se cierra. Haz tu lista de aplicaciones y descargalas con algun gestor de descargas desde tu PC/Mac
  • Realizar la transferencia
    [La contraseña que te pide aqui es la de root, que cambiaste en la seccion anterior si acabas de instalar el servicio de SSH en el iPhone]
    Si quieres realizar la transferencia con algun cliente grafico WIN MAC
    1. Realiza la conexión a tu iPhone
    2. Transfiere los IPA’s desde tu equipo a la carpeta /private/var/mobile/Documents/Installous/Downloads
    Si quieres realizar la transferencia desde linea de comandos
    El comando sería para solo un archivo:
    scp -r <IPA_FILE> root@<IP_IPHONE>:/private/var/mobile/Documents/Installous/Downloads
    Para todos los ipas dentro de IPA_DIR
    scp -r <IPA_DIR>/* root@<IP_IPHONE>:/private/var/mobile/Documents/Installous/Downloads

Transferir aplicaciones IPA desde el iPhone

  • Realiza la conexión con tu iPhone
    Si quieres realizar la transferencia con algun cliente grafico WIN MAC
    1. Realiza la conexión a tu iPhone
    2. Transfiere los IPA’s desde la carpeta /private/var/mobile/Documents/Installous/Downloads a tu equipo
    Si quieres realizar la transferencia desde linea de comandos
    El comando sería para solo un archivo:
    scp -r root@<IP_IPHONE>:/private/var/mobile/Documents/Installous/Downloads/<IPA_NAME> <LOCAL_DIR>
    Para todos los ipas del iphone
    scp -r root@<IP_IPHONE>:/private/var/mobile/Documents/Installous/Downloads/* <LOCAL_DIR>
    <LOCAL_DIR> Es la ruta local de tu equipo donde recibiras tu(s) IPA(s)
    <IP_IPHONE>  Es la ruta del iPhone
    <IPA_NAME>   Es el nombre de archivo de la IPA que quieres trasnferir en caso de que solo quieras transferir una

Instalar las IPAS en el iPhone

  • Abre la aplicacion Installous en tu iPhone, tap en “Downloads” y realiza la instalacion de la aplicación que desees (previamente transferida)

Problemas posibles

  • Fallo de comunicación con el iPhone
    "Cannot resolve hostname"
    "Server is down"
    "El servidor no esta activo"

    Revisa que tengas correctos los parámetros de red con el iPhone

Entradas más antiguas

Seguir

Get every new post delivered to your Inbox.