jueves, 3 de diciembre de 2015

Matlab/ Octave: Gráfica con plot( ... )

Uno de mis primeros ejercicios sobre métodos numéricos, a continuación un código que abarca algunos puntos sobre la programación en Matlab.
El código debe ser ejecutado en Matlab o en Octave (solución alternativa gratuita a Matlab). La gráfica fue hecha con Octave.
Puedes copiar el archivo sin incluir las líneas y guardarlo con extensión .m


--------------------------------------------- INICIO DE ARCHIVO --------------------------------

% Autor: Juan Carlos Miranda
% juancarlosmiranda81@gmail.com.
% www.otroblogdetecnologias.blogspot.com
% 03/12/2015
%
% Ejercicio en Matlab
% -----------------------
% En este ejemplo, se utilizan varios aspectos relacionados a la
% programación en Matlab, en base a un problema, se muestran varios
% items útiles en la resolución de problemas numéricos.

% Los aspectos que se desarrollan son:
%
% -Definición de variables.
% -Definición de vectores.
% -Uso de ciclos.
% -Ploteado de gráficas con una variable y con dos variables.
%
%
% Planteamiento del problema
% ---------------------------
% Dada la ecuación diferencial del aceleramiento de una masa en caída libre por, dv/dt=g-(cv/m) donde v es la velocidad en m/s, g es la constante gravitacional que tiene un valor
% de 9.8 m/s 2 , m es la masa con un valor de 68.1 kg y c es el coeficiente de
% resistencia con una valor de 12.5 kg/s.

% En la solución, se expondrán dos gráficas superpuestas, una con el
% resultado de la ecuación analítica y otro con el resultado del método de
% aproximación utilizando la fórmula de Euler.

% Inicializacion de variables de entorno
clear all;
close all;
clc;

% Datos del cuerpo en caida libre
g=9.8; %gravedad
c=12.5; % coeficiente de rozamiento
m=68.1; %masa

%Rango de tiempo para el cáculo.
ti=0;
tiempoFinal=14;

%paso de avance, refleja la cantidad que se incrementará en la Ecuación de
%aproximación por el método de Euler.
paso=0.5;
vi=0;  % velocidad con la que arranca el cuerpo.
va=0;  % definición de la velocidad por ecuación analítica
vti=0; % velocidad por método de Euler.

%inicializacion de vectores variables
tiempo=zeros(0,1,'double');
velocidadi=zeros(0,1,'double');
velocidada=zeros(0,1,'double');

%indice para el guardado en vectores
index=1;

% Impresión de cabecera
str = fprintf('-------------------------------------------------------\n');
str = fprintf('Ti; Vi ; Ti+h; VEuler(Ti); VAnalitica \n');   
str = fprintf('-------------------------------------------------------\n');

% se procede a calcular por cada unidad de tiempo luego se guarda en
% vectores que serán utilizados para la gráfica.
while ti < tiempoFinal
    %almacenamiento en vector de velocidad Euler y tiempo
    velocidadi(index)=vti;
    tiempo(index)=ti;

    %-----Ecuación del metodo Euler
    vti = vi+(g-((c/m)*(vi)))*(ti+paso);
    % Almacenamiento para el cálculo de velocidad en t+paso
    vi=vti;       
    %----------------------------
   
    %----Ecuación Analitica
    va=(g*m/c)*(1-exp((-c/m)*ti));
    %---guarda en vector resultado de ecuación analitica
    velocidada(index)=va;
   

    % Impresion de tabla
    str = fprintf('%d) %2.2i seg| %3.2f km/seg| %3.2f km/seg| \n', index,ti,vti,va);

    % incrementa el paso del indice de guardado de vectores
    index=index+1;
    %----se incrementa el paso del tiempo
    ti=ti+paso;

end

% gráfica con los vectores previamente cargados
plot(tiempo,velocidadi,'r');
%anexo de una segunda gráfica dentro de la figura, de manera a superponer
%las funciones.
figure(1),hold on,plot(tiempo,velocidada,'g');
% Definición de valores para representación del gráfico
set(gca,'fontsize',22);
xlabel('t=tiempo');
ylabel('Velocidad');
legend('Sol. Analitica','Sol. Numerica');
title('Ecuación de velocidad','FontSize',12);


--------------------------------------------- FIN DE ARCHIVO --------------------------------

miércoles, 12 de agosto de 2015

PHP: Ejecución de comandos PHP como tareas programadas en Windows

 1  Requisitos

Descargar los paquetes instaladores de PHP según la versión desde http://php.net/downloads.php
Descargar las librerías para Windows de los Redistributables for Visual Studio XXXX, según la versión de Windows. Ver http://windows.php.net/download#php-5.6  (para esta versión específica, verificar según la versión).

 2  Instalación y librerías

En mi caso necesitaba hacer uso de CURL, lo cual modifiqué el archivo php.ini en la línea
extension=php_curl.dll, quitando la coma.

 3  Preparación del script

En una carpeta instalar el código que se desea ejecutar. Ejemplo carpeta c:\cliente.
Crear un archivo con extensión .bat y colocar la siguiente línea de comando:
c:\php\carpeta\archivo.php

En este ejemplo seria:
c:\php\cliente\archivo.php

Permitir que los programas puedan ejecutarse, esto se debe marcar en la ventana que aparecerá la primera vez que se ejecute el script.

En el caso de Windows 7, abrir “Programador de Tareas”, y asignarle un horario y frecuencia.

Android: Manejo fechas

La idea es hacer un código que permita verificar si la fecha actual se encuentra dentro del rango de las 10:00 horas y las 14:00 horas. En tal caso se activaría una bandera para hacer algo.
Es solamente un fragmento de código, el cual se puede copiar y pegar dentro de cualquier función.
Para prueba, podría crearse una actividad e insertarlo en el método onCreate.
Los mensajes se podrán seguir en la consola de logs.

    //--------------------Manejo de horas----------------------------------------

    DateFormat dateFormat = new SimpleDateFormat ("HH:MM");
    String horaInicio = "10:00";
    String horaFinal = "14:00";

    Calendar c1 = Calendar.getInstance();

    int horaActual, minutosActual;
    horaActual =c1.get(Calendar.HOUR_OF_DAY);
    minutosActual = c1.get(Calendar.MINUTE);
    String horaActual2 = horaActual+":"+minutosActual;

    Date compararInicio=null, compararFinal=null, compararActual=null;

    try {
        compararInicio = dateFormat.parse(horaInicio); //HoraInicial
        compararFinal = dateFormat.parse(horaFinal); //Horafinal

        compararActual = dateFormat.parse(horaActual2); //Hora actual
 //       compararActual = dateFormat.parse("12:00"); //Para pruebas se puede asiganr un valor especifico

    } catch (Exception ex) {
        ex.printStackTrace();
    }
    Log.i("PRUEBA---<","Resultado "+compararInicio.compareTo(compararActual)+" "+compararFinal.compareTo(compararActual));
      if ((compararInicio.compareTo(compararActual) < 0) && (compararFinal.compareTo(compararActual) > 0)){
          Log.i("PRUEBA---<","Dentro del rango");
          Log.i("PRUEBA---<","Actual "+compararActual.toString()+"- > -"+compararInicio.toString()+" "+compararFinal.compareTo(compararActual));
          banderaHorarioCentral=1;
    }else{
          Log.i("PRUEBA---<","No cumple");
          Log.i("PRUEBA---<","Actual "+compararActual.toString()+"- > -"+compararInicio.toString()+" "+compararFinal.compareTo(compararActual));
          banderaHorarioCentral=0;
    }//

    //------------------------------------------------------------

jueves, 23 de julio de 2015

Lista de comandos útiles en Linux


- no title specified

Un listado de comandos útiles para realizar tareas desde consola, algo que muchas veces nos puede llegar a sacar de apuros en diferentes situaciones.

Es un listado en constante actualización y es recopilado de varios sitios. Se puede descargar un archivo en formato PDF desde https://github.com/freelanceparaguay/shellExamples

 

Tabla de contenidos

1 Manejo de unidades de disco

1.1 Visualizar unidades de almacenamiento

1.2 Crear un USB boot

1.3 Formatear un disco usb

1.4 Formatear discos como ext3

1.5 Montar un archivo ISO para poder leerlo.

1.6 Crear un ISO a partir de un directorio

2 Manejo de archivos y directorios

2.1 Ordenar archivos

2.2 Manejar archivos comprimidos

2.3 Buscar archivos

2.4 Listar archivos

2.5 Reemplazar una cadena en varios archivos

2.6 Reemplazar una cadena en un archivo

2.7 Partir archivos grandes en varios pedazos

2.8 Buscar una cadena de texto en todos los archivos encontrados

2.9 Renombrar archivos

2.10 Verificar integridad de archivos utilizando md5sum y shasum

2.11 Convertir archivos según codificaciones latin1 a utf-8 y viceversa

3 Manejo de imágenes y videos

3.1 Limpiar datos exift de imágenes .jpg

3.2 Convertir imágenes de format vectorial a png

3.3 Modificar el tamaño de imágenes

3.4 Crear un video a partir de un bloque de imágenes

3.5 Crear un video desde la terminal

4 Manejo de navegadores web

4.1 Descargar páginas web

5 Configuración de consola

 

1 Manejo de unidades de disco

1.1 Visualizar unidades de almacenamiento

Ver las unidades de bloques.

lsblk

Visualizar las unidades usb existentes con sus nombres y sistemas de archivos.

lsusb

Desmontar unidad usb

umount /run/media/usuario/pendrive

1.2 Crear un USB boot

Escribir una imagen .ISO para hacer un USB booteable.

dd if=Fedora-Live-Security-x86_64-20-1.iso of=/dev/sdb bs=4M

1.3 Formatear un disco usb

Formatear un disco usb con sistema de archivos vfat.

mkfs.vfat -n /dev/sdd

mkfs.vfat /dev/sdb -I -n "nombre_del_volumenMIPENDRIVE"

1.4 Formatear discos como ext3

Formatear una partición como ext3.

mke2fs -j /dev/hdaX

1.5 Montar un archivo ISO para poder leerlo.

Se pueden montar archivos .iso en directorios.

mount fichero.iso /mnt/directorio/ -t iso9660 -o ro,loop=/dev/loop0

mount -o loop dvd1.iso /mnt/isodisk

1.6 Crear un ISO a partir de un directorio

Se puede utilizar la herramienta mkisofs o también dd.

mkisofs -o /tmp/cd.iso /tmp/directory/

También se puede crear usando el comando dd. La unidad de CD (dev/hdd) tiene que estar desmontada.

dd if=/dev/hdd of=fichero.iso

2 Manejo de archivos y directorios

2.1 Ordenar archivos

Ordena las líneas de todos los archivos .txt, elimina las duplicadas y lo guarda todo en resultado.txt

cat *.txt | sort | uniq > resultado.txt

2.2 Manejar archivos comprimidos

Crear archivo tar con ficheros después de una fecha

tar cvf backup.tar -N yyyy-mm-dd

Crear archivo tgz manteniendo la ruta absoluta

tar cvfzP backup.tgz /ruta/al/dir/

2.3 Buscar archivos

Busca la cadena ‘unit1′ en el directorio /etc y subdirectorios en los archivos tipo f

find /etc -depth -type f -exec grep -il unit1 {} \;

 

Buscar archivos de tamaño mayor a 1000 Megas

find . -size +1000M

 

2.4 Listar archivos

Listar archivos y sumarizados y con bloques en Megas, ordenar en forma numérica y reversa para mostrar los de tamaño mayor, seleccionar los primeros 20.

du -sm * | sort -nr | head -20

 

2.5 Reemplazar una cadena en varios archivos

Reemplazar una cadena en varios ficheros.

find *.php -type f | xargs sed -i s/nombre/otronombre

find . -type f | xargs sed -i s/nombre/otronombre/g

 

Reemplaza una cadena por otra en todos los archivos del directorio DirectoryName guarda los originales con la extensión “.save”

perl -e "s/old_string/new_string/g;" -pi.save $(find DirectoryName -type f)

2.6 Reemplazar una cadena en un archivo

Otro ejemplo, buscar la cadena {PROXY_USER} (cadena completa incluso con las llaves) en el archivo settings.xml, el resultado se imprime en otro archivo llamado nuevosetting.xml

sed -s 's/${PROXY_USER}/pasantes/g' settings.xml > nuevosetting.xml

 

2.7 Partir archivos grandes en varios pedazos

Partir en varias partes un archivo grande.

split -b4300m MiPelicula.avi MiPeliculaPartida

Unir partes de archivos separados en un solo archivo.

cat MiPeliculaPartida.* > MiPelicula.avi

2.8 Buscar una cadena de texto en todos los archivos encontrados

find . -name *.ext -exec grep "cadena_buscada" '{}' \; -print > ~/archivo_destino

2.9 Renombrar archivos

Renombra *.png.jpg a *.jpg

rename 's/\.png\.jpg$/\.jpg/' *.jpg

2.10 Verificar integridad de archivos utilizando md5sum y shasum

Un archivo puede ser alterado, la forma de poder conocer si cambió en un determinado momento es obtener un hash de control y luego compararlo con la copia del archivo. El hash generado queda guardado en un archivo.

Crear hash :

shasum -b archivo.jpg > shasum.txt

Verificar hash:

shasum -c shasum.txt

Crear hash:

md5sum -b archivo.jpg > md5sum.txt

Verificar hash:

md5sum -c md5sum.txt

2.11 Convertir archivos según codificaciones latin1 a utf-8 y viceversa

Convertir un archivo de latin1 a utf-8

iconv -f latin1 -t utf8 archivo_entrada > archivo_salida

 

Vice-versa; de utf8 a latin1

iconv -f utf8 -t latin1 archivo_entrada > archivo_salida

3 Manejo de imágenes y videos

Es necesaio contar con las herramientas imagemagick y ffmpeg.

3.1 Limpiar datos exift de imágenes .jpg

A veces conviene limpiar los metadatos de las imágenes antes de subirlas a la web.

exiftool -all=imagen.jpg

3.2 Convertir imágenes de format vectorial a png

Se cuenta con varios archivos, los cuales se encuentran numerados. Ejemplo: archivo01.svg, archivo02.svg. Se convierte a archivos con el mismo nombre pero formato .png.

convert archivo*.svg midirectorio/archivo%02d.png

3.3 Modificar el tamaño de imágenes

Se cuenta con varios archivos, numerados. Ejemplo: archivo01.png, archivo02.png. Se cambian los tamaños a 300x300.

mogrify -resize 300x300 directorio/*.png

3.4 Crear un video a partir de un bloque de imágenes

Teniendo imágenes en formato .png y numeradas con dígitos de dos cifras al final, se produce un archivo de video en formato .avi. Ejemplo:  bloque01.png, bloque02.png, etc.

 ffmpeg -r 1 -i bloque_%02d.png  video.avi

3.5 Crear un video desde la terminal

Se puede grabar videos para tutoriales desde la terminal

ffmpeg -f x11grab -s 1024×768 -r 25 -i :0.0 -qscale 0 video.avi

ffmpeg -f x11grab -r 25 -i :0.0 -qscale 0 video.avi

4 Manejo de navegadores web

Modo seguro de Firefox (por ejemplo, para desactivar extensiones que funcionan mal)

firefox --safe-mode

lynx http://www.domain.com/

4.1 Descargar páginas web

Se pueden descargar páginas web desde línea de comandos.

wget -nH -r -np http://www.domain.com/bla/bla/bla/

5 Configuración de consola

Borrar historial de comandos.

history -c

 

Bash: Modificar y convertir bloques de imágenes a distintos tamaños

El problema que se planteó fue el siguiente:
Varios archivos dibujados en formatos .SVG, tenían que ser convertidos a formato .PNG.
Luego, estas imágenes debían ser convertidas a distintos tamaños y copiadas a distintos directorios.
Específicamente se aplicó a un proyecto Android, en el cual cada imagen se guardaba en distintos tamaños, en diferentes directorios según su resolución.
Hacerlo en forma manual, representaba la inversión de una gran cantidad de tiempo, con el script se acortaron tiempos.
A continuación el script.

-----------------------------------cortar aqui y colocar en un archivo-----
----------------------------------no incluir estas lineas

#!/bin/sh
#-------------------------------------------------------------------
# Toma como entrada los archivos dibujados en formato .SVG almacenados en un directorio
# y los convierte e formato .PNG
# Crea imagenes y directorios de diferentes tamanos
# Los archivos deben estar numerados con numeros de dos digitos al final
#
# ejemplo: archivo01.svg, archivo02.svg, archivo03.svg
# salida: archivo01.png, archivo02.png, archivo03.png
#-------------------------------------------------------------------

# PARAMETROS
# ---------------
#primer argumento el directorio
#segundo argumento los archivos en bloque .svg que luego seran convertidos

#ingresa al directorio posicionandose
cd $1

ARCHIVOPREFIJO=$2;
##obtiene el directorio
DIRECTORIO=`/usr/bin/pwd`;
MDPI="/";
echo $HOME;
echo $DIRECTORIO;

EXTENSION="png";

PNG="/png";
MDPI="/drawable-mdpi";
HDPI="/drawable-hdpi";
XHDPI="/drawable-xhdpi";
XXHDPI="/drawable-xxhdpi";
XXXHDPI="/drawable-xxxhdpi";
LDPI="/drawable-ldpi";

# convertir a png
############################3
rm -rf $DIRECTORIO$PNG;
mkdir $DIRECTORIO$PNG;
echo "-------------------------------------------------\n";
echo "Convirtiendo a PNG \n";
echo "-------------------------------------------------\n";
convert $ARCHIVOPREFIJO*.svg $DIRECTORIO$PNG"/"$ARCHIVOPREFIJO%02d.png

echo "-------------------------------------------------\n";
echo "Borrando directorios \n";
echo "-------------------------------------------------\n";
#limpiar directorios

rm -rf $DIRECTORIO$MDPI;
rm -rf $DIRECTORIO$HDPI;
rm -rf $DIRECTORIO$XHDPI;
rm -rf $DIRECTORIO$XXHDPI;
rm -rf $DIRECTORIO$XXXHDPI;
rm -rf $DIRECTORIO$LDPI;


echo "-------------------------------------------------\n";
echo "Creando directorios \n";
echo "-------------------------------------------------\n";
#crear directorios

mkdir $DIRECTORIO$MDPI;
mkdir $DIRECTORIO$HDPI;
mkdir $DIRECTORIO$XHDPI;
mkdir $DIRECTORIO$XXHDPI;
mkdir $DIRECTORIO$XXXHDPI;
mkdir $DIRECTORIO$LDPI;

#copiado de los archivos a cada directorio
#############################################
echo "-------------------------------------------------\n";
echo "Copiando archivos PNG \n";
echo "-------------------------------------------------\n";
cp $DIRECTORIO$PNG"/"*.$EXTENSION $DIRECTORIO$MDPI;
cp $DIRECTORIO$PNG"/"*.$EXTENSION $DIRECTORIO$HDPI;
cp $DIRECTORIO$PNG"/"*.$EXTENSION $DIRECTORIO$XHDPI;
cp $DIRECTORIO$PNG"/"*.$EXTENSION $DIRECTORIO$XXHDPI;
cp $DIRECTORIO$PNG"/"*.$EXTENSION $DIRECTORIO$XXXHDPI;
cp $DIRECTORIO$PNG"/"*.$EXTENSION $DIRECTORIO$LDPI;

#CONVERSION
##############################################
echo "-------------------------------------------------\n";
echo "Configurando resoluciones \n";
echo "-------------------------------------------------\n";

#echo $DIRECTORIO$MDPI"/"*.$EXTENSION;
mogrify -resize 300x300 $DIRECTORIO$MDPI"/"*.$EXTENSION
mogrify -resize 400x400 $DIRECTORIO$HDPI"/"*.$EXTENSION
mogrify -resize 700x700 $DIRECTORIO$XHDPI"/"*.$EXTENSION
mogrify -resize 1000x1000 $DIRECTORIO$XXHDPI"/"*.$EXTENSION
mogrify -resize 1280x1280 $DIRECTORIO$XXXHDPI"/"*.$EXTENSION
mogrify -resize 200x200 $DIRECTORIO$LDPI"/"*.$EXTENSION

echo "-------------------------------------------------\n";
echo "Finalizado \n";
echo "-------------------------------------------------\n";



-----------------------------------cortar hasta aqui y colocar en un archivo-----
----------------------------------no incluir estas lineas

Bash: Menúes de opciones


A veces es útil poder hacer un script con opciones numéricas desde teclado.
A continuación un ejemplo.

#!/bin/bash
OPCIONES="Menu1 Menu2 Salir"
echo "---------------------------------";
echo "INTERESANTE USO DE MENUES EN BASH";
echo "---------------------------------";
select opt in $OPCIONES; do
    if [ "$opt" = "Salir" ]; then
        echo done
        exit
    fi
    if [ "$opt" = "Menu1" ]; then
        echo "Menu 1"
    fi
    if [ "$opt" = "Menu2" ]; then
        echo "Menu 2"
    fi
done