Usos y fundamentos del ODB2


¿Ha notado que la luz indicadora de mal funcionamiento aparece en su tablero de instrumentos? Pues ese mensaje  le dice que hay un problema y que debe visitar a un mecánico. En el pasado, esto solo indicaría un problema, ¡pero hoy en dia gracias al interfaz ODB2  hay  más orientación pues  su mecánico utilizará un escáner OBD2 para identificar la causa, para lo cual  conectará el lector OBD2 al conector OBD2 de 16 pines cerca de la rueda del conductor y  esto le permitirá leer los códigos OBD2 AKA Códigos de diagnóstico de problemas (DTC) y comprender el problema. ¡Sin desarmar el coche!

El diagnóstico a bordo (OBD) es el sistema de autodiagnóstico incorporado en la mayoria de los  vehículos modernos indicando cuando hay un error a través de la ‘luz indicadora de mal funcionamiento’ permitiendo a un mecánico (o a usted) solucionar problemas al escanear códigos de diagnóstico de problemas (DTC) .OBD2 se ejecuta en bus CAN en la mayoría de los vehículos hoy y  lo mas importante; se puede acceder al sistema OBD2 a través de un conector OBD2 de 16 clavijas que se encuentra a 0,61 m del volante lo cual dará  muchas posibilidades para un sinfin de aplicaciones

 

 

 

Historia

El sistema se origina en California, donde la Junta de Recursos del Aire de California(CARB) que requirió en todos los automoviles nuevos a partir de 1991 para fines de control de emisiones determimando  que todos los automóviles a gasolina contaran con OBD (On Board Diagnostics), el cual  controlara los límites máximos de emisiones y además un autocontrol, el On Board Diagnostics de componentes relevantes de las emisiones de gas a través de dispositivos de mando electrónicos. Ademas ,para que el conductor detectese  un mal funcionamiento del OBD se impuso la obligación de tener una lámpara que indique fallos (MIL – Malfunction Indicator Lamp).

Medidas más estrictas en los límites de emisiones en 1996 llevó a la creación del OBD II.  El estándar OBD2 fue recomendado por la Society of Automotive Engineers (SAE) y los DTC estandarizados y el conector OBD en todos los fabricantes ( SAE j1962 )  y desde 1996 el OBD II es un requisito legal para automóviles nuevos en Estados Unidos. 

En Europa se introdujo el OBD ajustándose al OBD-II americano y con base en esta regla americana se impuso en los noventa la inclusión de sistemas de diagnóstico también para los automóviles destinados al mercado europeo,mas concretamente según la Directiva 98/69EG, los automóviles a gasolina del año 2000 en adelante, los diésel de 2003 en adelante, y los camiones de 2005 en adelante tienen que estar provistos de un OBD. La interfaz estándar del OBD-II no solamente es utilizada por el fabricante para sus funciones avanzadas de diagnóstico sino también por aquellos que van más allá de lo que la ley exige.

 

A partir de ahí, el estándar OBD2 se implementó paso a paso :

  • 1996: OBD2 se hizo obligatorio en Estados Unidos para automóviles y camiones ligeros.
  • 2001: Requerido en la UE para automóviles de gasolina.
  • 2003: Requerido en la UE también para autos diesel (EOBD)
  • 2005: OBD2 fue requerido en los EE. UU. Para vehículos de servicio mediano
  • 2008: los autos de los EE . UU. Debían usar ISO 15765-4 (una variante de CAN) como base para OBD2
  • 2010: Finalmente, se requirió OBD2 en vehículos pesados ​​de EE. UU.

¿Mi coche tiene OBD2?

La siguiente etapa planeada es el OBD-III, en el que los propios automóviles se comunican con las autoridades si se produce un empeoramiento de las emisiones de gases nocivos mientras está en marcha. Si esto sucede, se pedirá a través de una tarjeta indicativa, que se corrijan los defectos

Interfaz de diagnóstico OBD1

OBD I fue la primera regulación de OBD que obligaba a los productores a instalar un sistema de monitorización de algunos de los componentes controladores de emisiones en automóviles. Obligatorios en todos los vehículos a partir de 1991, sin embargo fue creada esta tecnología en 1983 así como implementada en algunos vehículos americanos en 1987 y 1988, los sistemas de OBD I no eran tan efectivos porque solamente monitorizaban algunos de los componentes relacionados con las emisiones, y no eran calibrados para un nivel específico de emisiones.

OBD II

OBD II es la segunda generación del sistema de diagnóstico a bordo, sucesor de OBD I. Alerta al conductor cuando el nivel de las emisiones es 1.5 mayor a las diseñadas. A diferencia de OBD I, OBD II detecta fallos eléctricos, químicos y mecánicos que pueden afectar al nivel de emisiones del vehículo. Por ejemplo, con OBD I, el conductor no se daría cuenta de un fallo químico del catalizador. Con OBD II, los dos sensores de oxígeno, uno antes y el otro después del catalizador, garantizan el buen estado químico del mismo.

El sistema verifica el estado de todos los sensores involucrados en las emisiones, como por ejemplo la inyección o la entrada de aire al motor. Cuando algo falla, el sistema se encarga automáticamente de informar al conductor encendiendo una luz indicadora de fallo (Malfunction Indication Lamp (MIL), también conocida como Check Engine o Service Engine Soon).

Para ofrecer la máxima información posible para el mecánico, guarda un registro del fallo y las condiciones en que ocurrió. Cada fallo tiene un código asignado. El mecánico puede leer los registros con un dispositivo que envía comandos al sistema OBD II llamados PID (Parameter ID).

Generalmente el conector OBD II suele encontrarse en la zona de los pies del conductor, consola central o debajo del asiento del copiloto.

Actualmente se puede conectar con la máquina de diagnosis de diferentes maneras, mediante Bluetooth, WiFi, USB, cayendo en desuso el protocolo de conexión por el puerto serie (RS232). Este enlace, unido a un software ejecutándose desde un ordenador o un terminal móvil permite la monitorización en tiempo real de códigos de error y diversos parámetros directamente de la centralita del motor tales como las revoluciones del motor, el consumo de combustible en tiempo real (sin que el automóvil lleve equipado ordenador de a bordo) o la temperatura del aceite, entre muchos otros parámetros dependiendo del modelo. El controlador ELM327 es el más extendido para establecer dichos enlaces entre la centralita del motor y el dispositivo con el software instalado.

Existen controladores más avanzados, clones del software original de los fabricantes, que permiten adicionalmente programar ciertas configuraciones del vehículo, como el equipamiento y la realización de testeos. OP-COM, VAG-COM, etc son algunos ejemplos.

EOBD

EOBD es la abreviatura de European On Board Diagnostics (Diagnóstico de a Bordo Europeo), la variación europea de OBD II. Una de las diferencias es que no se monitorizan las evaporaciones del depósito de combustible. Sin embargo, EOBD es un sistema mucho más sofisticado que OBD II ya que usa «mapas» de las entradas a los sensores basados en las condiciones de operación del motor, y los componentes se adaptan al sistema calibrándose empíricamente. Esto significa que los repuestos necesitan ser de alta calidad y específicos para el vehículo y modelo.

JOBD

JOBD es una versión de OBD-II para los vehículos vendidos en Japón.

 

 

Conector SAE-J1962

El conector OBD2 le permite acceder fácilmente a los datos de su automóvil, pero ¿qué es realmente?

El estándar OBD2 (SAE J1962) especifica dos tipos de conector hembra de 16 pines OBD2 (A y B).

A continuación se muestra un ejemplo de un conector pin OBD2 tipo A (también conocido como conector de enlace de datos, DLC):

 

pin descripción
2
SAE J1850 Bus +
4
Chasis
5
Señal de Masa (signal Ground)
6
ISO 15765-4 CAN BUS High
7
ISO9141 K Line
10
SAE J1850 Bus –
14
ISO 15765-4 CAN bus Low
15
ISO9141 L-Line
16
+12V  procedentes de  la bateria  del vehiculo   (siempre  activo)

Los pines 1,3,8,9,11,13  no se usan

El DLC OBD2 debe ubicarse en el compartimiento del pasajero o del conductor en el área delimitada por el extremo del conductor del panel de instrumentos a 300 mm (~ 1 pie) más allá de la línea central del vehículo, acoplado al panel de instrumentos y de fácil acceso desde el asiento del conductor . La ubicación preferida es entre la columna de dirección y la línea central del vehículo. 

 

De acuerdo con la norma SAE J1962, el DLC tipo A «debe estar ubicado en el compartimiento del pasajero o del conductor en el área delimitada por el extremo del conductor del panel de instrumentos a 300 mm (~ 1 pie) más allá de la línea central del vehículo, unido al panel de instrumentos y fácil para acceder desde el asiento del conductor. La ubicación preferida es entre la columna de dirección y la línea central del vehículo «. El DLC tipo B «se ubicará en el compartimiento del pasajero o del conductor en el área delimitada por el extremo del conductor del panel de instrumentos, incluido el lado exterior, y una línea imaginada de 750 mm (~ 2.5 pies) más allá de la línea central del vehículo. Será conectado al panel de instrumentos y de fácil acceso desde el asiento del conductor o desde el asiento del copiloto o desde el exterior. El conector del vehículo debe montarse para facilitar el acoplamiento y el desacoplamiento «.

 


El conector OBD2 está cerca del volante, pero puede estar oculto detrás de las cubiertas / panelesNo todos los conectores macho se adaptan a todos los enchufes hembra OBD2; verifique el tipo y las clavijas OBDEl pin 16 suministra energía a través de la batería del automóvil, a menudo también cuando el encendido está apagadoLos pines 6 (CAN-H) y 14 (CAN-L) son más relevantes ya que CAN (ISO 15765-4) es estándar en la mayoría de los automóviles modernos (incl. EVs)

 casi todos los vehículos modernos cuentan  con una interfaz OBD2 / EUOBD.  Para conocer si su  vehículo  lo es  puede abrir el capó del motor y debería encontrar una pegatina, si la etiqueta tiene la letra “OBDII CERTIFIED”, significa que puede instalar el HUD.   No obstante , aunque el vehículo no cuente con esta pegatina, lo normal es que si es un vehículo del 2010  en adelante , esta característica la soporte. 

ond2.PNG

Para verificar el conector de diagnóstico del vehículo debajo del volante, puede encontrar la  toma de 16 pins del vehículo.

figura2
IMG_20180120_162125[1].jpg

 

 

 

¿Por qué debería preocuparse por los datos OBD2?

Los mecánicos obviamente se preocupan por los DTC (quizás usted también lo haga), mientras que las entidades reguladoras lo necesitan para controlar las emisiones.

Pero OBD2 en realidad admite una amplia gama de ID de parámetros estándar (PID) que se pueden registrar en la mayoría de los automóviles lo cual  significa que, por ejemplo, puede obtener datos OBD2 en vivo legibles para el ser humano desde su automóvil en velocidad, RPM, posición del acelerador y más, datos que podemos vusualizar  bien en un HUD  en el parabrisas o  usando  una app movil( ODDB2 doctor por ejemplo)   por medio de un  dispositivo  odb2 con bluettoth .

 

 
OBD2 es la forma más sencilla de obtener datos básicos legibles por personas desde su vehículo.

Pero, ¿no puede obtener estos datos directamente del bus CAN? No necesariamente, ya que los datos CAN sin procesar en la mayoría de los autos son propietarios; para obtener más información, expanda lo siguiente:Decodificación – OBD2 vs CAN Bus Data

Wikipedia tiene un excelente artículo sobre los PID OBD2 estandarizados. También existe una herramienta de conversión en línea OBD2 donde puede ingresar un mensaje para devolver la información PID y los datos convertidos.

OBD2 PIDS Y MENSAJES EXPLICADOS

Para comenzar a grabar datos OBD2, es útil comprender los conceptos básicos de la estructura del mensaje .

En términos simplificados, un mensaje OBD2 se compone de un identificador y datos .

Además, los datos se dividen en modo, PID y bytes de datos Ah, Bh, Ch, Dh (en valores hexadecimales) – cf. la figura de abajo.

OBD2 PIDs Desglose de la estructura del mensaje OBD-ii explicado

Un ejemplo de un mensaje CAN de solicitud / respuesta para el PID ‘Velocidad del vehículo’ con un valor de 50 km / h puede verse así:

Solicitud: 7DF 02 01 0D 55 55 55 55 55 
Respuesta: 7E8 03 41 0D 32 aa aa aa aa aa

(Aquí el 32 es el valor hexadecimal de 50) .

 

A continuación, se explica cada parte del mensaje OBD2:

  • IDENTIFICADOR: Para los mensajes OBD2, el identificador es estándar de 11 bits y se utiliza para distinguir entre » mensajes de solicitud » (ID 7DF) y » mensajes de respuesta » (ID 7E8 a 7EF). Tenga en cuenta que 7E8 normalmente será donde el motor principal o la ECU responda.
  • LONGITUD: Esto simplemente refleja la longitud en número de bytes de los datos restantes (03 a 06). Para el ejemplo de Velocidad del vehículo, es 02 para la solicitud (ya que solo siguen 01 y 0D), mientras que para la respuesta es 03, ya que siguen 41, 0D y 32.
  • MODO: Para solicitudes, esto será entre 01-0A. Para las respuestas, el 0 se reemplaza por 4 (es decir, 41, 42, …, 4A). Hay 10 modoscomo se describe en el estándar SAE J1979 OBD2. El Modo 1 muestra los Datos actuales y, por ejemplo, se usa para observar la velocidad del vehículo en tiempo real, RPM, etc. Otros modos se utilizan para, por ejemplo, mostrar o borrar códigos de diagnóstico de problemas almacenados y mostrar datos de imágenes congeladas.
  • PID: para cada modo, existe una lista de PID OBD2 estándar, por ejemplo, en el Modo 01, PID 0D es la Velocidad del vehículo Cada PID tiene una descripción y algunos tienen una fórmula de conversión / mínimo / máximo especificada. La fórmula para la velocidad es, por ejemplo, simplemente A, lo que significa que el byte de datos Ah (que está en HEX) se convierte a decimal para obtener el valor convertido en km / h (es decir, 32 se convierte en 50 km / h arriba). Para, por ejemplo, RPM (PID 0C), la fórmula es (256 * A + B) / 4. 
  • > Ah, Bh, Ch, Dh: Estos son los bytes de datos en HEX , que deben convertirse a formato decimal antes de que se usen en los cálculos de la fórmula PID. Tenga en cuenta que el último byte de datos (después de Dh) no se utiliza.

 

¿CÓMO REGISTRAR DATOS OBD2?

El registro de datos OBD2 funciona de la siguiente manera:

  • Conectar un escáner OBD2 o un registrador de datos OBD2 al conector OBD2 de 16 pines.
  • A través de la herramienta, usted ingresa “ mensajes de solicitud ” (consultas) transmitidos a través del bus CAN
  • Las ECU relevantes reaccionan y envían » mensajes de respuesta » a través del bus CAN

Esto es importante:

Esto significa que no verá datos OBD2 si simplemente conecta un registrador o interfaz «pasivo» a su automóvil.(Sin embargo, esto produciría datos CAN sin procesar ya que se «difunde»).

Para registrar mensajes de respuesta OBD2 , su registrador de datos OBD2 debe poder enviar los mensajes de solicitud.

Solicitud de datos OBD2 de Car Response PID Velocidad del vehículo OBD-II

 

 

¿QUÉ GRABADORA OBD2 NECESITO?

Existen varias opciones: a continuación, describimos las principales categorías de analizadores OBD2 :

ESCÁNERES OBD2 / LECTORES DE CÓDIGO: se utilizan principalmente en la lectura / eliminación estática de códigos de diagnóstico de problemas. Por ejemplo, los mecánicos los utilizan para buscar el problema subyacente detrás de una lámpara indicadora de mal funcionamiento (MIL). 

REGISTRADORES DE DATOS OBD2: se utilizan para registrar datos OBD2 de un automóvil a lo largo del tiempo, por ejemplo, en una tarjeta SD ; esto puede ser útil para el análisis posterior y, por ejemplo, para analizar patrones, correlaciones, etc. Además, para fines de diagnóstico / optimización, un registrador de datos proporciona un cuadro «vista de patrones de datos antes y después de que un código de diagnóstico se haya activado.

Los registradores de datos OBD2 con Bluetooth o WiFi también se utilizan, por ejemplo , en la gestión de la flota de vehículos para mejorar la eficiencia del combustible, evitar la conducción insegura y permitir diagnósticos remotos proactivos a través de los parámetros compatibles con OBD2.

INTERFACES DE DATOS OBD2: Se utilizan para proporcionar datos en tiempo real en tiempo real sobre varios parámetros OBD2. Las aplicaciones pueden incluir pantallas / aplicaciones visuales que guían al conductor en cuanto a eficiencia de combustible o rendimiento, o como un chequeo de estado en vivo.

Las interfaces OBD2 más avanzadas también se pueden usar para transmitir datos OBD2 junto con datos de bus CAN patentados, que pueden ser útiles para el rastreo de CAN y el pirateo de automóviles .

Además, también existen híbridos : la serie CLX000 puede, por ejemplo, actuar como un registrador de datos y una interfaz OBD2 .

Anuncio publicitario

Shell scripting :funciones ,subshells y variables de entorno


Bash , c-shell  o simplemente shell scripting es  un lenguaje de script  creado a fines de la década de 1980 por un programador llamado Brian Fox, que trabajaba para la Free Software Foundation . Fue pensado como una alternativa de software libre para el shell Bourne (de hecho, su nombre es un acrónimo de Bourne Again SHell ), e incorpora todas las características de ese shell, así como nuevas características como la aritmética de enteros y el control de trabajo

Bash es un “shell de Unix”, es decir  una interfaz de línea de comandos para interactuar con el sistema operativo por lo que está ampliamente disponible, siendo el shell predeterminado en muchas distribuciones de GNU / Linux y en Mac OSX, con puertos existentes para muchos otros sistemas.

En post anteriores hemos hablado en una primera aproximación  al lenguaje c-sheall  con el primer ejemplo famoso de  Hello world y avanzando comandos ,tuberías ,variables ,parámetros y salidas posibles y en un segundo post  sobre el  uso de las Tuberías , sustitución de comandos,operadores ,asignación de variables ,Bucles , literales , variables   y aritmética no entera

En este  post  vamos  a continuar  avanzando en el conocimiento de este lenguaje con el uso de las funciones, subshells  y las  variables de entorno

close up code coding computer

 

 

 

Funciones de shell 

Una función de shell es un tipo especial de variable que es esencialmente un script dentro de otro script. Gracias a estas funciones c-shell  nos permite agrupar una secuencia de comandos en un solo comando con nombre, lo cual es particularmente útil si la secuencia de comandos necesita ejecutarse desde muchos lugares dentro del script  .

Como una función de shell puede incluso consistir en un solo comando; esto puede ser útil si el comando es particularmente complicado, o si su significado no sería inmediatamente obvio para un lector,es  decir, las funciones de shell pueden servir para dos propósitos:

  • pueden guardar la escritura
  • Pueden permitir un código más legible mediante la creación de comandos con nombres intuitivos

Como ejemplo considere la siguiente secuencia de comandos:

#! / bin / bash
# Uso: get_password VARNAME 
# Le pide al usuario una contraseña y lo guarda como $ VARNAME. 
# Devuelve un estado de salida distinto de cero si la entrada estándar no es un terminal, o si el 
comando # "leer" devuelve un estado de salida distinto de cero. 
get_password ()  { 
  si  [[ -t 0  ]]  ;  then
    read -r -p 'Contraseña:' -s "  $ 1  "  &&  echo 
  else 
    return  1
   fi
 }

get_password PASSWORD &&  echo  "  $ PASSWORD  "

El script anterior crea una función de shell llamada get_password que le pide al usuario que escriba una contraseña y almacena el resultado en una variable específica. Luego ejecuta get_password PASSWORD para almacenar la contraseña como $ PASSWORD ; y por último, si la llamada a get_password tuvo éxito (según lo determinado por su estado de salida), la contraseña recuperada se imprime en la salida estándar (que obviamente no es un uso realista pues  el objetivo aquí es simplemente demostrar el comportamiento de get_password ).

La función get_password no hace nada que no se pueda hacer sin una función de shell, pero el resultado es mucho más legible. La función invoca la lectura de comando incorporada (que lee una línea de entrada del usuario y la guarda en una o más variables) con varias opciones con las que la mayoría de los programadores de Bash no estarán familiarizados:

  • La opción -r desactiva un significado especial para el carácter de barra diagonal inversa;
  • la opción -p hace que aparezca un mensaje específico, en este caso Contraseña:, al principio de la línea;
  • la opción -s evita que se muestre la contraseña a medida que el usuario lo escribe. Desde la -s la opción también evita que se muestre la nueva línea del usuario,

El comando echo proporciona una nueva línea y además, la función usa la expresión condicional -t 0 para asegurarse de que la entrada del script proviene de un terminal (una consola) y no de una archivo o de otro programa que no sabría que se está solicitando una contraseña. (Esta última característica es discutible; dependiendo de la funcionalidad general del script,pues  puede ser mejor aceptar una contraseña de entrada estándar independientemente de su origen, suponiendo que la fuente se diseñó teniendo en cuenta el script). El punto general es que darle un nombre a la secuencia de comandos – get_password – hace que sea mucho más fácil para un programador saber qué hace.

Dentro de una función de shell, los parámetros posicionales$ 1 , $ 2 , etc., así como $ @ , $ * y $ # ) se refieren a los argumentos con los que se llamó a la función, no a los argumentos del script que contiene la función. Si se necesitan estos últimos, entonces deben pasarse explícitamente a la función, usando "$ @" . (incluso entonces, shift y set solo afectarán a los parámetros posicionales dentro de la función, no a los de la persona que llama).

Una llamada de función devuelve un estado de salida, al igual que un script (o casi cualquier comando). Para especificar explícitamente un estado de salida, use el comando return , que finaliza la llamada a la función y devuelve el estado de salida especificado. (El comando de salida no se puede usar para esto, ya que terminaría la secuencia de comandos completa, como si se llamara desde fuera de una función). Si no se especifica ningún estado de salida, ya sea porque no se da ningún argumento al comando de devolución o porque se llega al final de la función sin haber ejecutado un comando de retorno , a función devolverá el estado de salida del último comando que se ejecutó.

Incidentalmente, cualquiera de las funciones o () pueden omitirse de una declaración de función, pero al menos una debe estar presente. En lugar de , muchos programadores escriben  de manera similar, la notación {...} que no es exactamente necesaria y no es específica de las funciones; es simplemente una notación para agrupar una secuencia de comandos en un solo comando compuesto.

El cuerpo de una función debe ser un comando compuesto, como un bloque {…} o una instrucción if ; {…} Es la opción convencional, incluso cuando todo lo que contiene es un comando compuesto único y, por lo tanto, teóricamente podría prescindirse de él.function get_password ( )get_password ()

Subshells 

En Bash, uno o más comandos se pueden envolver entre paréntesis, lo que hace que esos comandos se ejecuten en una «subshell»(también hay algunas formas en que se pueden crear subshells implícitamente) Un subshell recibe una copia del «entorno de ejecución» del contexto circundante, que incluye cualquier variable, entre otras cosas; pero cualquier cambio que haga a subshell al entorno de ejecución no se vuelve a copiar cuando se completa la subshell.

Así, por ejemplo, este script: #! / bin / bash

foo  = barra
 echo  "  $ foo  "  # imprime 'barra'

# subshell:
 (
  echo  "  $ foo  "  # imprime 'barra' - la subshell hereda las variables de sus padres 
  baz  = bip
   echo  "  $ baz  "  # imprime 'bip' - la subshell puede crear sus propias variables 
  foo  = foo
   echo  "  $ foo  "  # imprime ' foo '- la subshell puede modificar variables heredadas
 )

echo  "  $ baz  "  # no imprime nada (solo una nueva línea) - se pierden las nuevas variables de la subshell 
echo  "  $ foo  "  # imprime 'barra' - los cambios de la subshell a las variables antiguas se pierden

La ejecución imprimirá esta salida:

bar

bar

bip

foo

bar

Si necesitase llamar a una función que modifica una o más variables, pero en realidad no desea que esas variables se modifiquen, puede ajustar la llamada a la función entre paréntesis, para que tenga lugar en una subshell. Esto «aislará» las modificaciones y evitará que afecten el entorno de ejecución circundante.Dicho esto: cuando sea posible, es mejor escribir funciones de tal manera que este problema no se presente para comenzar, pues la palabra clave local puede ayudar con esto.

Lo mismo ocurre con las definiciones de funciones; al igual que una variable regular, una función definida dentro de una subshell no es visible fuera de la subshell.

Una subshell también delimita los cambios a otros aspectos del entorno de ejecución; en particular, el comando cd («cambiar directorio») solo afecta a la subshell. Así, por ejemplo, este script:

  #! / bin / bash

cd /
 pwd  # imprime '/'

# subshell:
 (
  pwd  # prints '/' - la subshell hereda el directorio de trabajo 
  cd home
   pwd  # prints '/ home' - la subshell puede cambiar el directorio de trabajo 
)  # end of subshell

pwd  # prints '/': los cambios de la subshell en el directorio de trabajo se pierden

imprime esto:

/ / /casa /

Si su script necesita cambiar el directorio de trabajo antes de ejecutar un comando dado, es una buena idea usar una subshell si es posible,. de lo contrario, puede resultar difícil hacer un seguimiento del directorio de trabajo al leer un script. Alternativamente, los comandos incorporados pushd y popd se pueden usar para un efecto similar.

 

Una declaración de salida dentro de una subshell termina solo esa subshell. Por ejemplo, este script:

  #! / bin / bash
(  exit  0  )  &&  echo  'subshell successed' 
(  exit 1  )  ||  echo  'subshell failed'

imprime esto:

 subshell tuvo éxito
subshell falló

Al igual que en una secuencia de comandos en su conjunto, exit de los valores predeterminados  devuelve el estado de salida del comando de última ejecución, y una subshell que no tiene una instrucción de salida explícita devolverá el estado de salida del comando de última ejecución.

Variables de entorno

Ya hemos visto que, cuando se llama a un programa, recibe una lista de argumentos que se enumeran explícitamente en la línea de comandos. Lo que no hemos mencionado es que también recibe una lista de pares nombre-valor denominados «variables de entorno».

Diferentes lenguajes de programación ofrecen diferentes formas para que un programa acceda a una variable de entorno; Los programas C pueden usar getenv (" variable_name ") (y / o aceptarlos como un tercer argumento para main ), los programas Perl pueden usar $ ENV {' variable_name '} , los programas Java pueden usar System.getenv (). Get (" variable_name ") , y así sucesivamente.

En Bash, las variables de entorno se convierten simplemente en variables regulares de Bash. Así, por ejemplo, la siguiente secuencia de comandos imprime el valor de la variable de entorno HOME :

#! / bin / bash
echo  "  $ HOME  "

Sin embargo, lo contrario no es cierto: las variables regulares de Bash no se convierten automáticamente en variables de entorno. Así, por ejemplo, este script:

#! / bin / bash
foo  = bar
bash -c 'echo $ foo'

Esto no imprimirá la barra , porque la variable foo no se pasa al comando bash como una variable de entorno. ( De bash -c scripts argumentos ... corre el Bash script de una línea de la escritura ).

Para convertir una variable Bash normal en una variable de entorno, tenemos que «exportarla» al entorno. La siguiente secuencia de comandos hace la impresión de barras :

#! / bin / bash
export  foo  = bar
bash -c 'echo $ foo'

Tenga en cuenta que la exportación no solo crea una variable de entorno; en realidad marca la variable Bash como una variable exportada, y las asignaciones posteriores a la variable Bash también afectarán a la variable de entorno. Ese efecto es ilustrado por este script:

#! / bin / bash
foo  = bar
bash -c 'echo $ foo'  # no imprime nada 
export foo
bash -c 'echo $ foo'  # imprime 'bar' 
foo  = baz
bash -c 'echo $ foo'  # imprime 'baz'

El comando de exportación también se puede usar para eliminar una variable de un entorno, incluyendo la opción -n ; por ejemplo, export -n foodeshace el efecto de export foo. Y múltiples variables pueden ser exportadas o no exportadas en un solo comando, como export foo barexport -n foo bar.

Es importante tener en cuenta que las variables de entorno solo se pasan a un comando; nunca se reciben de vuelta de un comando. En este sentido, son similares a las variables y subshells regulares de Bash. Así, por ejemplo, este comando:

#! / bin / bash
export  foo  = bar
bash -c 'foo = baz'  # no tiene efecto 
echo  "  $ foo  "  # print 'bar'

barra de estampados ; el cambio a $ foo dentro del script de una línea no afecta el proceso que lo invocó. (Sin embargo, podría afectar a cualquier script que fueron llamados a su vez por ese guión.)

Si se desea una variable de entorno dada para un solo comando, se puede usar la sintaxis, con la sintaxis de una asignación de variable (o múltiples asignaciones de variables) que precede a un comando en la misma línea. (Tenga en cuenta que, a pesar de usar la sintaxis de una asignación de variable, esto es muy diferente de una asignación de variable Bash normal, en que la variable se exporta automáticamente al entorno y en que solo existe para el comando. Si desea evitar la confusión de sintaxis similar hacer las cosas diferentes, se puede utilizar la común utilidad Unix env para el mismo efecto que la utilidad también hace que sea posible. eliminar una variable de entorno para un comando – o incluso para eliminar todas las variables de entorno para un comando) Si. $ varvar =value commandya existe, y se desea incluir su valor real en el entorno para un solo comando, que se puede escribir como .var = " $var " command

Aparte: a veces es útil colocar definiciones de variables, o definiciones de funciones, en un script de Bash (por ejemplo, header.sh ) que puede ser llamado por otro script de Bash (por ejemplo, main.sh ). Podemos ver que simplemente invocar ese otro script Bash, como ./header.sh o como bash ./header.sh , no funcionará: las definiciones de variables en header.sh no serán vistas por main.sh , ni siquiera si «exportado» esas definiciones. (Este es un punto de confusión común: exportar las variables de exportación al entorno para que otros procesos puedan verlas, pero solo las ven los procesos secundarios , no los padres.) Sin embargo, podemos usar el comando incorporado Bash («punto») o fuente , que ejecuta un archivo externo casi como si fuera una función de shell. Si header.sh se ve así:

 foo  = función de barra
 baz ()
 {
  echo  "  $ @  "
 }

entonces este script:

#! / bin / bash
. header.sh
baz "  $ foo  "

imprimirá 'barra' .

Alcance 

Ahora hemos visto algunos de los caprichos del alcance variable en Bash.

Para resumir lo que hemos visto hasta ahora:

  • Las variables regulares de Bash están orientadas al shell que las contiene, incluidas las subshells en ese shell.
    • No son visibles para ningún proceso secundario (es decir, para programas externos).
    • Si se crean dentro de una subshell, no son visibles para el shell principal.
    • Si se modifican dentro de una subshell, esas modificaciones no son visibles para el shell principal.
    • Esto también se aplica a las funciones, que en muchos aspectos son similares a las variables regulares de Bash.
  • Las llamadas de función no se ejecutan inherentemente en subshells.
    • Una modificación de variable dentro de una función generalmente es visible para el código que llama a la función.
  • Las variables de Bash que se exportan al entorno tienen un alcance al shell que las contiene, incluidas las subshells o procesos secundarios en ese shell.
    • El comando incorporado de exportación se puede utilizar para exportar una variable al entorno. (También hay otras formas, pero esta es la forma más común).
    • Difieren de las variables no exportadas solo en que son visibles para los procesos secundarios. En particular, todavía no son visibles para shells principales o procesos primarios.
  • Los scripts de Bash externos, como otros programas externos, se ejecutan en procesos secundarios. El o el comando integrado de origen se puede utilizar para ejecutar un script de este tipo internamente, en cuyo caso no se ejecuta de forma inherente en una subshell.

Ademas a  esto añadimos ahora:

  • Las variables de Bash que están localizadas en una función-llamada están sujetas a la función que las contiene, incluyendo cualquier función llamada por esa función.
  • El comando incorporado local se puede usar para localizar una o más variables a una llamada de función, usando la sintaxis local var1 var2o . (también hay otras formas, por ejemplo, el comando declarar incorporado tiene el mismo efecto, pero esta es probablemente la forma más común).local var1 = val1 var2 = val2)
  • Se diferencian de las variables no localizadas en que desaparecen cuando finaliza su función-llamada. En particular, todavía son visibles para subshells y llamadas de función hijo. Además, al igual que las variables no localizadas, se pueden exportar al entorno para que también las vean los procesos secundarios.

En efecto, usar local para localizar una variable en una función-llamada es como poner la función-llamada en una subshell, excepto que solo afecta a una variable; otras variables pueden dejarse sin ser «locales».

 

Una variable que se establece dentro de una función (ya sea mediante asignación o mediante un comando for-loop u otro comando incorporado) debe marcarse como «local» utilizando el comando incorporado local , para evitar que se afecte accidentalmente el código fuera del función, a menos que se desee específicamente que la persona que llama vea el nuevo valor.

Es importante tener en cuenta que, aunque las variables locales en Bash son muy útiles, no son tan locales como las variables locales en la mayoría de los otros lenguajes de programación, ya que son vistos por llamadas de funciones secundarias. Por ejemplo, este script:

#! / bin / bash

foo  = bar

function f1 ()
 {
  echo  "  $ foo  "
 }

function f2 ()
 {
  local  foo  = baz
  f1 # imprime 'baz'
 }

 f2

En realidad se imprimirá baz en lugar de barra . Esto se debe a que el valor original de $ foo está oculto hasta que devuelve f2 . (En la teoría del lenguaje de programación, una variable como $ foo se dice que tiene un «ámbito dinámico» en lugar de un «ámbito léxico»).

Una diferencia entre local y subshell es que mientras que un subshell toma inicialmente sus variables de su shell principal, una declaración como local foo oculta inmediatamente el valor anterior de $ foo ; es decir, $ foo se desestabiliza localmente. Si se desea inicializar el $ foo local al valor del $ foo existente , debemos especificarlo explícitamente, mediante el uso de una declaración como local foo = "$ foo" .

Cuando una función sale, las variables recuperan los valores que tenían antes de sus declaraciones locales (o simplemente se anulan, si no se habían anulado). Curiosamente, esto significa que un script como este:

 #! / bin / bash

function f ()
 {
  foo  = baz
   local  foo  = bip
 }

foo  = bar
 F
echo  "  $ foo  "

Realmente imprimirá baz : la declaración foo = baz en la función surte efecto antes de que la variable se localice, por lo que el valor baz es lo que se restaura cuando la función regresa.Y dado que local es simplemente un comando ejecutable, una función puede decidir en tiempo de ejecución si localizar una variable dada, por lo que este script:

#! / bin / bash

function f ()
 {
  si  [[  "  $ 1  "  ==  'sí'  ]]  ;  entonces
    Foo
   local fi
  foo  = baz
 }

foo  = bar
f yes # modifica un $ foo localizado, por lo que no tiene ningún efecto 
echo  "  $ foo  "  # imprime 'barra' 
f # modifica el $ foo no localizado, configurándolo en 'baz' 
echo  "  $ foo  "  # imprime 'baz'

Este script en realidad se imprimirá

 bar
baz

 

Radio por internet con Raspberry pi


Desde Adafruit nos enseñan como construir  un  controlador de pantalla táctil para nuestra  Raspberry pi   con la idea de usar  esta  con la pantalla táctil , como  un Radio Reproductor por internet  gracias al  número creciente de emisoras de radio de internet disponibles. Obviamente  esta idea de instalar una pantalla táctil  a nuestra raspberry pi es ideal no solo para usar nuestra Pi como a radio por internet sino también para muchísimas  mas funciones como  reproductor mp3,cámara Ip, como tableta, para modding  y una infinidad de ideas      

Concretamente este interesante proyecto combina la versatilidad de la Raspberry Pi y el económico  PiTFT 2,8″ con pantalla táctil TFTdisplay. Una interfaz de visualización personalizada le permite controlar el volumen, la estación y ver lo que se está reproduciendo siendo ideal para personas que tienen una Raspberry Pi  y no le encuentran  otra  utilidad o simplemente para probar la funcionalidad del interfaz táctil

Como vamos a ver  hay bastantes pasos, pero el resultado merece la pena .

Resumidamente estos son los pasos a seguir:

  1. Montar  la PiTFT 320 x 240 2,8″ con pantalla táctil (esto puede no ser necesario si su PiTFT esta ya  premontado)
  2. Calibrar la pantalla táctil
  3. Instalar Music Player Daemon (MPD) y el cliente de reproductor de música (MPC) en laPi
  4. Encontrar y añadir emisoras de radio internet a mpc
  5. Descargar el código de radioplayer 
  6. Disfrutar de streaming de radio por internet en su escritorio Deben completarse todos los pasos de configuración y calibración para la pantalla de PiTFT.

Como adelanto en el siguiente vídeo podemos ver el proyecto en funcionamiento

 

 

Sin duda  es una idea muy interesante , veamos los pasos más en detalle.

 

1-Preparación y calibrado del sensor tactil 

Si su PiTFT de Adafruit pantalla táctil de 2,8″ vino como un kit ( por ejemplo el de Adafruit) necesitara completar las instrucciones para montar la pantalla,  aunque resumidamente hay que descargar y grabar la imagen PiTFT o bien utilizar una instalación existente de Raspbian e instalar el script de configuración sencilla. 

Si usa una  imagen para  instalar o utiliza el script instalador,entonces  todos los  pasos que vamos a ver  no son necesarios pues  ya están hechos  de modo que lo que vamos  a ver  es sólo para usuarios avanzados que tengan curiosidad sobre cómo configurar y personalizar la pantalla táctil siendo el procedimiento  idéntico para el 2.4″, 2.8″, 3.2″y 3.5″ PiTFTs resistivas.
Lo realmente interesante de este procedimiento es que ademas puede ser útil para otras pantallas diferentes a la de Adafruit en Amazon , pues  existen opciones razonables  por 25€ ( pantallas , soporte  y dializador incluidos )   que tendremos que configurar .
Como vamos a  ver el procedimiento es superable  aunque es cierto  que tengamos que pasar por un proceso de  calibración , pero no es difícil en absoluto.
Pantalla táctil de 3,5 pulgadas TFT LCD pantalla con protector caja de acrílico para Raspberry Pi 3 B+ [3 x disipador de calor de aluminio, CD con sistema instalado, lápiz capacitivo]
En este el caso  de comprar un kit , el montaje  físico es bastante sencillo  pues se reduce a  montar sobre la respberry pi sobre el  conector  de la GPIO  ,colocar el puente de hdmi  (segun el  modelo  especialmente en las pantallas mas grandes )   y montar finalmente los acrílicos
Este vídeo  nos puede servir para hacernos idea  de modo que nos  puede ayudar https://www.youtube.com/watch?v=gVK9MpPzK44,
No obstante  aun siendo sencillos  loa pasos , según el modelo puede haber variaciones  asi que lo recomendables es consultar las instrucciones que del fabricante del kit 
 
Veamos los  pasos a seguir una vez hayamos ,montado  la pantalla sobre la Raspberry Pi
 
  • Antes de empezar, vamos a hacer una regla udev para la pantalla táctil. Eso es porque el nombre eventX del dispositivo va a cambiar mucho y su molesto para averiguar lo que su llamada dependiendo de si tiene un teclado o el otro ratón instalado.   Ejecutar   sudo nano /etc/udev/rules.d/95-stmpe.rules   para crear un nuevo archivo de udev y copia y pega la siguiente línea: SUBSYSTEM==»input», ATTRS{name}==»stmpe-ts», ENV{DEVNAME}==»*event*», SYMLINK+=»input/touchscreen» 
  •  Quite y vuelva a instalar la pantalla táctil con  sudo rmmod stmpe_ts; sudo modprobe stmpe_ts  
  • A continuación  realize un listado del directorio  escribiendo ls -l /dev/input/touchscreen  debe apuntar a eventX donde X es algún número, que número será diferente en diferentes configuraciones ya que otros teclados/ratones y dispositivos USB se llevará una ranura de evento
  • Hay algunas herramientas que podemos utilizar para calibrar y depurar la pantalla táctil. Instalar el «evento de prueba» y «biblioteca de pantalla táctil» paquetes con sudo apt-get install evtest tslib libts-bin
  • Evtest corriente :Ahora usted puede utilizar algunas herramientas como  sudo evtest /dev/input/touchscreen  ,  que le permitirá ver eventos de la pantalla táctil en tiempo real, pulsar en la pantalla táctil para ver los informes.
  • Script de calibración AutoMagic :Si se gira la pantalla necesita volver a calibrar la pantalla táctil para trabajar con la nueva orientación de la pantalla. Puede ejecutar manualmente los procesos de calibración en la sección siguiente, o puede volver a ejecutar el script instalador y seleccionar una nueva rotación.Intente utilizar este script de calibración por defecto para calibrar fácilmente su pantalla táctil. Tenga en cuenta que los valores de calibración pueden no ser adecuados para la pantalla, pero deben ser lo suficientemente cercanas para la mayoría de las necesidades. Si usted necesita la calibración de pantalla táctil más precisa, siga los pasos en la siguiente sección manualmente calibrar la pantalla táctil.
  • Calibración manual :Si la técnica de calibración «automagic» no funciona para usted o si tiene alguna otra instalación donde tiene que calibrar cuidadosamente te puede hacer ‘manualmente’se quiere calibrar la pantalla una vez pero no tiene que hacer más que eso. Empezaremos por la calibración en la línea de comandos ejecutando sudo TSLIB_FBDEVICE=/dev/fb1 TSLIB_TSDEVICE=/dev/input/touchscreen ts_calibrate .Siga las instrucciones en la pantalla, tocando cada punto. Utilizando un lápiz es sugerido para obtener un toque preciso. No uso algo de metal, plástico.Veremos cinco objetivos de punto de mira. Si ve menos que esos, la pantalla táctil probablemente genera señales múltiples de un solo toque, y usted debe tratar de calibrar otra vez.A continuación se puede ejecutar sudo TSLIB_FBDEVICE=/dev/fb1 TSLIB_TSDEVICE=/dev/input/touchscreen ts_test que le permitirá dibujar-prueba de la pantalla táctil. Volver atrás y volver a calibrar si sientes que la pantalla no es suficientemente precisa.
  • X calibración :También puede calibrar el sistema de entrada de X pero tienes que usar un programa diferente llamado xtcal (xinput_calibrator ya no funciona).Puede hacer esto si la calibración de la pantalla no es de tu agrado o cualquier momento cambiar la rotación = XX ajustes del módulo de la pantalla. Puesto que el controlador de pantalla y touch son completamente separados, la pantalla táctil no rotara automáticamente
sudo apt-get install libxaw7-dev libxxf86vm-dev libxaw7-dev libxft-dev
git clone https://github.com/KurtJacobson/xtcal
cd xtcal
make
  • Debe estar ejecutando PIXEL (GUI) mientras se calibra.Antes de empezar el calibrador tendrá que ‘reiniciar’ el viejo calibración datos entonces ejecutar DISPLAY=:0.0 xinput set-prop "stmpe-ts" 'Coordinate Transformation Matrix' 1 0 0 0 1 0 0 0 1 Ahora tendrá que ejecutar el calibrador mientras se ejecuta también X. Puede hacerlo abriendo el programa terminal y ejecuta el comando xtcal (que es difícil hacerlo en una pequeña pantalla) o se puede hacer lo que hacemos que es crear un shell SSH/Terminal y ejecutar el calibrador de la misma cáscara , que requiere el siguiente comando:DISPLAY=:0.0 xtcal/xtcal -geometry 640x480
  • Tenga en cuenta que el puede variar!geometry .Si está utilizando un 2.4″/2.8″/3.2 «pantalla de 320 x 240 con orientación horizontal, utilizar 640 x 480. Si es retrato, utilizar 640 x 480.Si está utilizando una pantalla de 3.5» con paisaje, utilizar 720 x 480, retrato es 480 x 720   Siga las instrucciones en pantalla
 
  • Ejecute sudo nano /usr/share/X11/xorg.conf.d/20-calibration.conf y copiar la linea número 9 en la opción de TransformationMatrix por lo que parece:
  1. Section «InputClass»
  2. Identifier «STMPE Touchscreen Calibration»
  3. MatchProduct «stmpe»
  4. MatchDevicePath «/dev/input/event*»
  5. Driver «libinput»
  6. Option «TransformationMatrix» «-0.000087 1.094214 -0.028826 -1.091711 -0.004364 1.057821 0 0 1»
  7. EndSection
  • Por ultimo hay que  reiniciar tu Pi para comprobar que está hecho Si esa asi ¡Su pantalla táctil esta ahora super calibrado, Lai lá!
¡No se debe usar con el PiTFT capacitiv pues no funcionara! Encontrara que para el uso más efectivo de la pantalla táctil es necesario llevar a cabo la calibración manual de la pantalla táctil.
Ahora que la pantalla está funcionando muy bien, nos encargamos de la pantalla táctil.

2-Instalar el Daemon

Ya tenemos  una raspberry Pi  con una pantalla táctil  de modo qeu podemos continuar .
En esta etapa es digno  la comprobación que la Raspberry Pi está actualizada antes de continuar, por lo que debe ejecutar el siguiente comando. 

sudo aptget update

Ahora ya podemos instalar el mpc y mpd  y añadir algunas emisoras de radio a tu lista de reproducción.

Las estaciones de ejemplo se enumeran a continuación son canales de la BBC del Reino Unido, pero  existen muchos mas disponibles en otros paises  

  • sudo aptget install mpd mpc
  • mpc add http://bbcmedia.ic.llnwd.net/stream/bbcmedia_intl_lc_radio1_p?s=1365376033&e=1365390433&h=a0fef58c2149248d6bff1f7b7b438931
  • mpc add http://bbcmedia.ic.llnwd.net/stream/bbcmedia_intl_lc_radio2_p?s=1365376067&e=1365390467&h=d43dc8ae0f888809462a6cb7c389b46b
  • mpc add http://bbcmedia.ic.llnwd.net/stream/bbcmedia_intl_lc_radio3_p?s=1365376123&e=1365390523&h=d53cf2a92272f3289b314a2251d23bc8
  • mpc add http://bbcmedia.ic.llnwd.net/stream/bbcmedia_intl_lc_radio4_p?s=1365376126&e=1365390526&h=ed9a0642b30c422b07fbcd8683c52335
  • mpc add http://bbcmedia.ic.llnwd.net/stream/bbcmedia_intl_lc_5live_p?s=1365376271&e=1365390671&h=e0d82133f35ae74d41d5eab6b9c150a6

Usted puede ahora comprobar con el comando mpc funciona a partir de una emisora sin olvidar conectar sus auriculares en el jack de 3 1/2 de  la salida de audio de la raspberry 

mpc play

Una copia de la lista de reproducción se puede guardar con el comando   mpc save my_playlist

La lista de reproducción se guarda en /var/lib/mpd/listas/  y  a lista de reproducción puede ser editada a mano con

sudo nano /var/lib/mpd/playlists/my_playlist

Una vez editada la lista de reproducción se puede cargar en mpc con

mpc load /var/lib/mpd/playlists/my_playlist

De esta forma podemos tener  un número de listas de reproducción guardadas en /var/lib/mpd/playlists con diversos géneros dependiendo del  estado de ánimo

 

3-Instalar Radio Player

El software de front-end Radioplayer se ha escrito en Python con Pygame y es específico para la pantalla TFT de 320 x 240 2,8″. Sin embargo, es relativamente sencillo adaptar el código para trabajar en una ventana de  mayor tamaño

Debe descargar el código de Python y los iconos desde el enlace Descargar el código de Python y los iconos. Extraiga los archivos en un memory stick y copielos  en una carpeta en la Raspberry Pi. (O puede colocarlo en el directorio de tarjeta SD en el ordenador de casa, los archivos en boot al arranca la tarjeta SD en la Pi)

Guardar en una carpeta llamada pi-radio 

Asegúrese de que todos los iconos y python código se guarda en la carpeta /home/pi/pi-radio

¡En esta etapa todo debería estar listo para funciona asi que solo tiene que ejecutar los siguientes comandos

cd /home/pi/piradio

sudo python radioplayer.py

 

 

Uso de Radioplayer

La interfaz ha sido funestamente mantenida simple para que puede accionarse con los dedos en lugar de un lápiz.
projects_Raspberry_Pi_Radio.jpg
  • Play – mpc inicia en la lista de reproducción
  • Pausa – mpc se detiene en la lista de reproducción
  • Bajar volumen – reduce el volumen
  • Subir volumen – aumenta el volumen de
  • Mute – volumen cero
  • Refrescar – para la reproduccion, vuelve a reproducir  y actualiza la pantalla.
  • Exit – cierra radioplayer interfaz pero mantiene mpc ejecutandose

 

Se extrae la información de la estación de la salida  con el comando  mpc status

Muchas estaciones de usan un formato común de  Nombre de emisora: nombre/información del circuito, es decir 

  • Nombre de la estación se muestra en la primera línea de la pantalla.
  • El nombre de la pista se muestra en la segunda línea de la pantalla.
  • Si no hay ningún nombre de la pista se muestra un mensaje de «ninguna información adicional«.

 

 

 

 

 

Mas   información en  https://learn.adafruit.com/raspberry-pi-radio-player-with-touchscreen/

Almacenamiento ilimitado para los clientes de Movistar Fusion



Conexión Segura, Movistar Junior y Movistar Cloud son los nuevos servicios gratis para Fusión que se han presentado recientemente

  • Con Movistar Cloud, tendremos almacenamiento ilimitado en la nube de forma gratuita. 
  • Conexión Segura es un servicio que protege nuestra conexión y dispositivos de las diferentes amenazas que pululan por la red.
  • Movistar Junior es  una app  de entretenimiento infantil online para smartphones y tablets, en un entorno seguro y protegido para los niños en el que  los padres pueden estar tranquilos de lo que ven sus hijos, al existir una zona de padres donde pueden limitar el tiempo de uso de la aplicación.

 Movistar Cloud

Este servicio de almacenamiento  en la nube   pasa a tener capacidad ilimitada y a ser gratuito para los clientes Fusión y para los clientes con líneas #15 y #25. Para los que tengan contrato y líneas adicionales #1,5, #4 o #8 el servicio costará 3 euros al mes. Se puede activar Movistar Cloud   bien  llamando al 1004 o desde su   nuevo sitio web https://micloud.movistar.es/ui/html/mobileconnect.html#start

Por cierto  desde micloud.movistar.es se pude descargar también las aplicaciones para iOS y Android. Los  links de la app son :  en Google Play  y en App Store

Con este servicio se puede guardar cualquier  contenido en la nube y acceder a ellos desde cualquier dispositivo en cualquier lugar siendo  accesible  desde  una app para móvil, tablet y ordenador y una página web de disfrute del servicio.
 
Con el servicio se pueden compartir fotos, vídeos o documentos por email, whatsapp o redes sociales y ver sus fotos y vídeos de su cuenta de Facebook o Instagram,  archivos de Dropbox o incluso archivos anexados a sus emails de Gmail de manera inmediata.
 
 

Puede acceder a Movistar Cloud desde un ordenador (PC Windows 7 o superior o Mac OS IX o superior) y desde un smartphone o tablet con sistema operativo Android (4.x y superior), iOS (6.x, 7.x, 8.x y superior).

En el caso de que prefiera usar  un navegador  web, puede utilizar los navegadores Mozilla Firefox v25 o posterior, Google Chrome v31 o posterior, o Internet Explorer v9 o posterior.

Movistar Cloud no tiene ningún compromiso de permanencia y podemos activarlo en tantas líneas móviles de contrato como tengamos.

Por cierto ,el servicio  se ha lanzado hace unos días  es del segmento de Gran Público, y no el de Empresas. El servicio Conexión Segura Empresas se lanzará próximamente

Conexión Segura de Movistar

Este nuevo servicio para los clientes de Movistar Fusión ofrece protección eficaz e inmediata al bloquear las amenazas de malware y fraude que se puedan encontrar al navegar tanto en la red fija como en la red móvil como en los dispositivos conectados a la primera. Se trata de un servicio gratuito si somos cliente Fusión   (4 líneas móviles fuera del hogar (3G/4G) y  5 licencias multidispositivo) o  si tenemos una línea móvil(1 licencia móvil).

La protección de la navegación por tu red de Movistar no requiere de instalaciones ya que esta se presta desde la red tanto en 3G/4G como en la red Wifi del hogar.

  •  Si se cuenta con  equipamiento Smart Wifi(antiguo HGU)   la seguridad por la red wifi del hogar se presta desde el router,
  •  Si no dispone de equipamiento Smart Wifi(antiguo HGU) , la protección de la red Wifi del hogar se presta desde la red y aplica sólo a la navegación por tráfico abierto (webs http) y no tráfico encriptado (webs https).

El servicio Conexión Segura chequea la reputación de la página web a la que quiere acceder y si esta, es de dudosa reputación  alerta y bloquea el acceso, pudiendo continuar bajo la responsabilidad del usuarios.De esta manera  mantiene protegido en tiempo real de potenciales amenazas del tipo Malware, así como de Fraude (suplantaciones de identidad conocidas como Phishing). 

Puede descargar la app Seguridad Dispositivo Movistar desde:

  •  El portal https://conexionsegura.movistar.es una vez tengas activado el servicio Conexión Segura, accediendo con las credenciales Movistar del titular de la línea.
  •  Accediendo a través del línk de descarga que se muestra en las páginas de bloqueo.
  • A través de la app Smart Wifi (sólo para clientes Fusión con equipamiento Smart Wifi)

 Si activamos Conexión segura y descargamos la App Seguridad Dispositivo podremos:

  • Localizar del dispositivo en todo momento, ante robo o perdida.
  • Gestionar dispositivo en remoto. Hacer una foto a quien intenta manipularlo e identificar el lugar donde se encuentra quién se lo haya llevado.
  • Activar Conexión Segura

Compartimos un vídeo muy divertido sobre el servicio Conexión Segura (de Gran Público)

Reciclar un módem usb 3G y de paso mejorar la cobertura Wifi


En efecto  estos simples dispositivos de almacenamiento de datos que permiten conectarse   desde su  ordenador  a Internet mediante un puerto USB  mediante tecnología 3G o 4G a través de una de las redes del operador de telefonía móvil con el que tenga suscrito el contrato  también llamados « llaves 3G» o «pinchos 3G »   son dispositivos claramente en desuso  .

Estos  módem USB no solo son compatibles tanto con ordenadores  convencionales como con ordenadores  portátiles sino también con cualquier tipo de sistema operativo y además incluso  se pueden utilizar con tabletas, siempre y cuando estas dispongan de un puerto USB, por lo que en efecto son dispositivos bastante compatibles con una enorme cantidad de equipos  y diferentes sistemas operativos .

Estos dispositivos  ciertamente nos reafirmamos han dejado de sernos útiles desplazados por las facilidades de creación de zona wifi  de  todos los smartphone tanto Android como Ios, lo cual ha hecho que estos dispositivos queden definitivamente relegados  a ser olvidados en un triste cajón.

 

 

A pesar de sus puntos negativos, estos  módems USB aun pueden ser una gran solución si necesita conectarse de forma temporal a Internet. Entre sus grandes ventajas están:

  • Algunos operadores ofrecen tarifas para tener Internet móvil con un módem USB sin necesidad de contratar un plan de voz ni pagar una cuota de alta.  Este tipo de tarifas de Internet prepago era una gran solución  durante viajes  o en una segunda residencia.
  • La instalación rápida y sencilla. Nada de recibir al técnico ni añadir más cables a su salón. Los módem USB son auto-instalables.
  • Los módem USB multi-banda solucionan en gran parte el problema de la cobertura  ya que son capaces saltar de una red a otra buscando la mejor cobertura.

Debemos puntualizar que los módem USB se siguen utilizando en determinados ámbitos por su facilidad de transporte, pero sin duda , aparte de la facilidad de la zona wifi que cualquier smartphone  puede crear , en  el caso de necesitar algo mas especifico  hay opciones  como por ejemplo los router 4G, que no dejan de ser  dispositivos  similares, pero con evidentes mejoras pues no solo dotan de conexión a Internet a un solo dispositivo compatible con la conexión USB, sino que generan una red WiFi a la que pueden conectarse cuantos dispositivos sean necesarios.

 

Instalación de un módem 3G

Bien  si tenemos algún que otro módem 3g guardado en el cajón porque  ya no es util en su función principal ¿ para que nos puede servir?  pues  sencillamente como  adaptador wifi  pues la mayoría de estos pinchos también soportan este tecnología

Tomemos como  ejemplo un pincho Huawei E173 de la operadora Movistar dado que  el proceso sera muy similar con otros modelos

Si lo pinchamos en un puerto USB libre enseguida, debería aparecemos una unidad adicional con 0 bytes disponibles donde solo tenemos acceso a  lectura dado que se encuentran los drivers del módem usb.

 

Si hacemos doble click  sobre la unidad , enseguida se ejecutará el autorun que hará que comience la instalación del sw, la cual seleccionaremos que sea personalizada dado que solo queremos usar el módem como adaptador wifi 

 

Ahora solo seleccionaremos zona wifi ( ocupa unos 42,5Mb)   ,le daremos a siguiente para que lo instale en el directorio por defecto 

 

según las necesidades que tengamos si lo  deseamos podemos bien que se inicie automáticamente o  simplemente que se ejecute a demanda

Ahora ya simplemente se ejecutaría el escritorio donde lo importante  a la derecha del logo de movistar aparezca el nombre del módem ( en este caso HUAWEI) pues es señal de que se han instalado correctamente los drivers del módem y este esta funcionando correctamente

Para conectarnos por wifi, solo pulsaremos en Redes disponibles y acto seguido introduciremos  la clave de la red wifi  y desde ese momento ya podemos navegar mediante la red wifi  seleccionada  a través del viejo  pincho 3G  que teníamos  relegado  en un cajón  

 

 

Con total seguridad observara  que la calidad de la conexión es mucho mejor que  muchos adaptadores genéricos  e incluso propietarios incluidos en equipos de fabrica ( que quizás se hayan averiado  o no sean capaces de lograr conexiones estables) . Ademas sobre todo disfrutara  de una mayor   cobertura y mejor alcance  , todo ello reciclando equipamiento electrónico  que  ya nos era útil dándole ahora una segunda oportunidad ! reciclemos todos en pro de un mundo mejor!!

 

Introdución a OpenScad


Para el modelado en 3D,  la famosa aplicación web de AutoDesk  Tinkercad debería ayudarnos ante cualquier diseño inicial  de una manera  más sencilla con el proceso de modelado 3D, tanto es así, que incluso los modeladores experimentados lo hacen  explorando las formas de Tinkercad,  pues curiosamente, una herramienta “simple” como Tinkercad puede utilizarse para crear formas complejas.

Lógicamente detrás del interfaz gráfico de  Tinkercad  ( o de cualquier otro programa de modelado 3D),   está el código que procesa las manipulaciones del diseñador , de modo que a medida que arrastra y suelta formas, los algoritmos complejos están trabajando para calcular cómo aparecerán los gráficos en la pantalla  y generando las formas 3d.

 

OpenSad   en efecto surgen ante el dilema de que  también debería ser posible crear figuras geométricas directamente mediante código, de un  modo  mucho mas eficiente   y conciso   que el  proceso de diseño que cualquier otra herramienta gráfica como por ejemplo Tinkercad.

A diferencia de Tinkercad, OpenSCAD no es una aplicación basada en la web , de  modo que si esta interesado  en la herramienta   tendrá que descargarla  gratuitamente   desde http://www.openscad.org  ( está disponible para Windows, Mac OS X y Linux)   e instalarla en su PC para usarla.

La interfaz OpenSCAD es sencilla  en comparación con Tinkercad ,constando  de sólo tres ventanas, siendo la ventana de la izquierda un editor de texto utilizado para ingresar el código.

panel

Con OpenSCAD pues está diseñando código, pero no se preocupe: escribir código con Open SCAD es muy similar a la sintaxis  HTML  siendo el código para crear objetos  autoexplicativo   ,por ejemplo, el comando del cubo crea cubos, el comando de esfera crea esferas y el comando del cilindro crea cilindros, etc.

Probablemente haya alrededor de 60 comandos en OpenSCAD , algunos de ellos que enunciaremos mas abajo, muchos de los cuales  permitirán manipular la geometría ,  como por ejemplo mover, rotar, escalar y usar operaciones booleanas para combinar objetos, pero no se preocupe porque  para modelar  la mayoría de la piezas solo necesitaran  unos pocos comandos como  son union , difference, translate, cylinder o  cube.

Es facil deducir que en base a esos , es decir mediante secuencias de comandos en el lenguaje de OpenSCAD , se utilizaran para crear modelos en 2D o 3D.

Este script es una lista de formato libre de instrucciones de acción.

 object(); variable = value;
operator() action();
operator()
{ action();
action();
}
operator()
operator()
{ action();
action();
}
operator()
{ operator()
action();
operator()
{ action();
action();
}
}

Como vemos  en el ejemplo  hay  objetos, acciones  y operadores para construir una pieza:

  • Objetos:Los objetos son los bloques de construcción de modelos, creados por primitivas 2D y 3D. Los objetos terminan en un punto y coma ‘;’.
  • Acciones: Instrucciones de acción  que incluyen la creación de objetos usando las primitivas y asignar valores a variables. Las instrucciones de acción también terminan en un punto y coma ‘;’.
  • Operadores :Los operadores o las transformaciones, modifican la ubicación, color y otras propiedades de los objetos. Los operadores usen llaves ‘{}’ cuando su ámbito de aplicación abarca más de una acción. Más de un operador puede usarse para la misma acción o grupo de acciones. Varios operadores se procesan de derecha a izquierda, es decir, el más cercano a la acción del operador se procesa primero. Los operadores no terminan en punto y coma ‘;‘, pero la persona hacen acciones que contienen.

Por ultimo y no menos importante sobre todo para llevar las piezas modeladas al mundo real por ejemplo mediante impresion en 3d, as unidades en OpenSCAD son genéricas  de modo que no hay sistemas de medición en OpenSCAD, es decir , no hay designación para las unidades, y le corresponde al diseñador definir el tamaño del objeto al configurar el archivo antes de la impresión 3D.

 

A modo de resumen  vamos a ver de forma sintetica los entresijos del lenguaje OpenScad;

 

 

RESUMEN DE LAS FUNCIONES MAS IMPORTANTES

Sintaxis de elementos principales

Los usuarios pueden ampliar el lenguaje  definiendo sus propios módulos y funciones. Esto permite agrupar partes de secuencia de comandos de fácil reutilización con diferentes valores. Nombres bien escogidos también ayudan a documentar la secuencia de comandos.

OpenSCAD proporciona: funciones que devuelven valores. módulos que realizan acciones pero no devuelven valores.

OpenSCAD calcula el valor de variables en tiempo de compilación, no tiempo de ejecución. La última asignación variable dentro de un ámbito se aplicará en todo el mundo en ese ámbito. También se aplica a los ámbitos internos, ni los niños, sus. Ver alcance de variables para obtener más detalles. Puede ser útil pensar en ellos como constantes capaz de anular en lugar de variables.

En resumen estas son las cinco construcciones mas usadas ; 

var = value;
Variables en OpenSCAD son creadas por una declaración con un nombre o identificador, asignación a través de una expresión y un punto y coma. El papel de los arreglos de discos, en muchos lenguajes imperativos, se maneja en OpenSCAD mediante vectores.
module name(…) { … } 
Módulos pueden utilizarse para definir objetos o, mediante children(), definir los operadores. Una vez definido, módulos temporalmente se agrega al lenguaje.
function name(…) = … 
Las funciones operan sobre valores para calcular y devolver valores nuevos.
include <….scad>

actúa como si el contenido del archivo incluido fueron escrito en el archivo incluido
use <….scad>

importaciones de módulos y funciones, pero no se ejecuta ningún comando que no sea de esas definiciones

2D

circle (r=radius | d=diameter)

Se crea un círculo en el origen. Todos los parámetros, excepto la r, deben ser nombrados.


Parámetros
radius: radio (debe antecederse la r)
diameter:diametro ( debe antecederse la d)

polygon ([points])

Crea un polígono en base a una  lista de x, y puntos del polígono. : Un vector de vectores elemento 2. (los puntos son indizados desde 0 hasta n-1)

 

polygon ([points], [paths])

Crea una forma echada a un lado múltiples de una lista de coordenadas x, y. Un polígono es el más poderoso objeto 2D. Nada puede crear ese círculo y plazas pueden, y mucho más. Esto incluye formas irregulares con los bordes cóncavos y convexos. Además puede colocar agujeros dentro de esa forma
square ([width, height], center)

Crea un cuadrado o un rectángulo en el primer cuadrante. Cuando el centro es cierto la plaza se centra en el origen. Nombres de argumento son opcionales si en el orden que se muestra a continuación
text (text, size, font, halign, valign, spacing, direction, language, script)

El módulo crea texto como un objeto geométrico 2D, utilizando tipos de letra instalados en el sistema local o como archivo de fuente independiente.

3D

cube (size)

Crea un cubo en el primer octante. Cuando el centro es cierto, el cubo se centra en el origen. Nombres de argumento son opcionales si en el orden que se muestra a continuación.
Al teber solo un valor,el  cubo tiene los lados de esta longitud

cube ([width, depth, height])



Crea un cubo en el primer octante. Cuando el centro es cierto, el cubo se centra en el origen. Nombres de argumento son opcionales si en el orden que se muestra a continuación.
Array de 3 valores [x, y, z] que responde  a las dimensiones x, y y z.

parámetros:
tamaño
solo valor, cubo con los lados de esta longitud
3 valor array [x, y, z], cubo con dimensiones x, y y z.
Centro
falso (predeterminado), 1 º octante (positivo), una de las esquinas en (0,0,0)
cierto, cubo está centrado en (0,0,0)
cylinder (height, BotttonRadios,TopRadius, center)

Crea un cilindro centrado sobre el eje z. Cuando el centro es cierto, también se centra verticalmente a lo largo del eje z.
Nombres de los parámetros son opcionales si en el orden que se muestra Si un parámetro se denomina, deben también llamarse todos los parámetros siguientes.

cylinder (h, r1|d1, r2|d2, center)

Crea un un cono centrado sobre el eje z. Cuando el centro es cierto, también se centra verticalmente a lo largo del eje z. 
Nombres de los parámetros son opcionales si en el orden que se muestra Si un parámetro se denomina, deben también llamarse todos los parámetros siguientes
 Si se utilizan r, d, d1 o d2 deben llamarse.

Parámetros
h : altura del cilindro o de cono
r : radio del cilindro. R1 = r2 = r.
R1 : radio, parte inferior del cono.
R2 : radio superior del cono.
d : diámetro del cilindro. R1 = r2 = 2 d.
D1 : diámetro, parte inferior del cono. R1 = d1/2
D2 : diámetro superior del cono. R2 = d2/2
(Nota: d, d1, d2 requiere 2014.03 o posterior. Debian en la actualidad se sabe que detrás de esto)
Centro
falso (por defecto), z va desde 0 a h
cierto, rangos de z de -h/2 a + h/2

polyhedron (points, triangles, convexity)

Un poliedro es el sólido primitivo 3D más general. Puede utilizarse para crear cualquier figura regular o irregular, incluyendo aquellos con características tanto cóncavos como convexos. Superficies curvas se aproximan por una serie de superficies planas.

Parámetros
puntos
Vector 3d puntos o vértices. Cada punto es a su vez un vector [x, y, z], de sus coordenadas.
Puntos pueden definirse en cualquier orden. N puntos se hace referencia en el orden definido como 0 a N-1.
triángulos (obsoleto en 2014,03, caras de uso versión)
Vector de caras que incluyen colectivamente el sólido. Cada cara es un vector que contiene los índices (basado en 0) de 3 puntos desde el vector de puntos.
caras (introducido en la versión 2014.03)
Vector de caras que incluyen colectivamente el sólido. Cada cara es un vector que contiene los índices (basado en 0) de 3 o más puntos el vector de puntos.
Caras pueden definirse en cualquier orden. Definir bastante caras para incluir completamente el sólido, sin traslapo.
Puntos que describen una sola cara deben estar en el mismo plano.
convexidad
Entero. El parámetro de convexidad especifica el número máximo de caras puede penetrar un rayo que se intersecan el objeto. Este parámetro sólo es necesario para visualizar correctamente el objeto en modo de vista previa OpenCSG. Tiene ningún efecto en la prestación del poliedro. Para problemas de la pantalla, ponerla a 10 debería funcionar bien para la mayoría de los casos.

sphere (radius | d=diameter)

Crea una esfera en el origen del sistema coordinado. El nombre de argumento de r es opcional. Para utilizar d en lugar de r, d debe ser nombrado.

 

 

Parámetros

Radio. Este es el radio de la esfera. La resolución de la esfera se basará en el tamaño de la esfera y el $fa, $fs y $fn variables. Para obtener más información sobre estas variables especiales: 
Diámetro. Esto es el diámetro de la esfera.

(Nota: d sólo está disponible en versiones de 2014.03. Debian en la actualidad se sabe que detrás de esto)

$fa 
Ángulo de fragmento en grados
$fs 
Dimensión en mm del fragmento
$fn 
Resolución

Transformaciones

translate ([x, y, z])

Se traduce (se mueve) en sus elementos secundarios a lo largo del vector especificado. El nombre de argumento es opcional.
rotate ([x, y, z])

Gira su child  ‘a’ grados sobre el eje del sistema coordinado o alrededor de un eje arbitrario. Los nombres de argumento son opcionales si los argumentos se dan en el mismo orden como se especifica.
scale ([x, y, z])

La escala de sus elementos secundarios mediante el vector especificado. El nombre de argumento es opcional.
resize ([x, y, z], auto)

Modifica el tamaño del objeto secundario para que coincida con el dado x,y y z

mirror ([x, y, z])

Refleja el elemento en un plano que pase por el origen 
multmatrix (m)

Multiplica la geometría de todos los elementos secundarios con la matriz de transformación de 4 x 4 dada.
Uso: multmatrix (m = […]) { … }
color («colorname»)

Los nombres de los colores disponibles son los de lista del color SVG la World Wide Web consortium.

color ([r, g, b, a])

Muestra los elementos secundarios mediante el color RGB especificado + valor alfa. Sólo se utiliza para la previsualización de F5 como CGAL y STL (F6) actualmente no admiten color. El valor de alfa por defecto 1.0 (opaco) si no se especifica.

offset (r|delta, chamfer)

Desplazamiento permite mover contornos 2D hacia afuera o hacia adentro por una cantidad dada.
hull()

Muestra el casco convexo de los nodos secundarios.

minkowski()


Muestra la suma de minkowski de nodos secundarios. Se suele utilizar para hace figuras redondeadas en las aristas 


Operaciones booleanas

union()

Crea una Unión de su hijo nodos. Es la suma de todos los hijos (lógica de o).
Se puede utilizar con objetos 2D o 3D, pero no mezclarlas.
difference()

Resta los nodos hijo 2 º (y todos los otros) de la primera ( y no).
Se puede utilizar con objetos 2D o 3D, pero no mezclarlas.
intersection()

Crea la intersección de todos los nodos secundarios. Esto mantiene la porción traslapada (lógica y).
Se conserva sólo la zona que es común o compartido por todos los hijos.
Se puede utilizar con objetos 2D o 3D, pero no mezclarlas.

Modificadores de carácter

*Desactivar
!Mostrar sólo
#Destacar / debug
%Transparente / antecedentes

Matemáticas

abs

Corresponde a la funcion del valor absoluto. Devuelve el valor positivo de un número decimal con signo.
acos

arcoseno, o coseno inverso, expresado en grados.
asin

arco seno, o seno inverso, expresado en grados
atan

arco tangente, o tangente inversa, matemática. Devuelve el valor principal de la arco tangente de x, expresada en grados.
atan2

atan dos argumentos , tomando y como su primer argumento. Devuelve el valor principal de la arco tangente de y / x, expresada en grados

ceil

Función matemática techo .
Devuelve el valor de entero más próximo por redondeo el valor si es necesario.
cos

Función matemática coseno de grados.

exp

Función matemática exp . Devuelve la función exponencial de base e de x, que es el número e elevado a la potencia x.
floor

Función matemática flooro . Floor(x) = el entero más grande no es mayor que x
len

Función matemática longitud . Devuelve la longitud de una matriz, un vector o un parámetro de cadena.

let

Asignación secuencial de variables dentro de una expresión. La siguiente expresión se evalúa en el contexto de las tareas que y puede utilizar las variables. Esto es principalmente útil para realizar complicadas expresiones más legible mediante la asignación de resultados provisionales a las variables.
ln

Función matemática logaritmo natural.
log

Función matemática del logaritmo en base 10.

max

Devuelve el máximo de los parámetros. Si se da un único vector como parámetro, devuelve el máximo elemento de ese vecto
min

Devuelve el mínimo de los parámetros. Si se da un único vector como parámetro, devuelve el mínimo elemento de ese vector.

pow

Función matemática potencia
rands

Generador de números aleatorios. Genera un vector constante de pseudo números aleatorios, al igual que una matriz. Los números son dobles no enteros. Cuando se genera un único número, se llama todavía con variable [0]
round


El operador devuelve la parte entera más o menos, respectivamente, si la entrada numérica es positivo o negativo
sign


Función matemática signum . Devuelve un valor de unidad que extrae la señal de un valor
sin

Función matemática seno
sqrt

Función matemática de raíz cuadrada .
tan

Función de la tangente de matemática.

Funciones

chr

Convertir a números en una cadena que contiene caracteres con el código correspondiente. OpenSCAD utiliza Unicode, por lo que el número se interpreta como punto de código Unicode. Números fuera del intervalo de punto de código válido producirá una cadena vacía.
concat

Devuelven un vector que contiene los argumentos.
Donde argumento es un vector de los elementos del vector se agregan individualmente al vector resultado. Cadenas son diferentes de vectores en este caso
cross


Calcula el producto cruzado de dos vectores en el espacio 3D. El resultado es un vector que es perpendicular a ambos vectores de entrada.
Utilizando parámetros de entrada no válidos (por ejemplo vectores con una longitud diferente de 3 o de otro tipo) producirá un resultado indefinido.
lookup

Buscar valor en tabla e interpolar linealmente si no hay ninguna coincidencia exacta. El primer argumento es el valor a buscar. La segunda es la tabla de búsqueda–un vector de pares de clave y valor.
norm

Devuelve la norma euclideana de un vector. Tenga en cuenta que esto devuelve la longitud numérica real mientras que len devuelve el número de elementos en el vector o matriz.

parent_module (idx)

$parent_modules contiene el número de módulos en la pila de ejecución. parent_module(i) devuelve el nombre del módulo niveles por encima del módulo actual en la pila de ejecución. La pila es independiente de donde se definen los módulos. Es donde ellos son instancias que cuenta. Esto puede usarse para construir por ejemplo, las listas de materiale
search

Buscar valor en tabla e interpolar linealmente si no hay ninguna coincidencia exacta. El primer argumento es el valor a buscar. La segunda es la tabla de búsqueda–un vector de pares de clave y valor.
str

Convertir todos los argumentos a las cadenas y concatenar.
version

devuelve el número de versión de OpenSCAD.

version_num

devuelve el número de versión de OpenSCAD

Otros

children ([idx])


Los objetos se indizan mediante enteros de 0 a $children-1. OpenSCAD establece $children el número total de objetos en el ámbito de aplicación. Objetos agrupados en un ámbito sub se tratan como un hijoo.
echo (…)

Esta función imprime el contenido de la ventana de compilación (también conocido como consola). Útil para depurar código.
Valores numéricos se redondean a 5 dígitos significativos.
La consola OpenSCAD soporta un subconjunto de lenguaje de marcado HTML
for (i = [start:end]) { … }

Bucle para evaluar cada valor en un rango, aplicándola a la acción siguiente.


Parámetros
start – valor inicial
end – parada cuando el siguiente valor sea final
for (i = [start:step:end]) { … }

Bucle para evaluar cada valor en un rango , aplicándola a la acción siguiente.


Parámetros
start – valor inicial
step o paso – cantidad para aumentar el valor, opcional, por defecto = 1
end – parada cuando el siguiente valor sea final
for (i = […, …, …]) { … }

Bucle evaluando cada valor en un  vector, aplicándola a la acción siguiente.
if (…) { … }

Estructura condicional realizando una prueba para determinar si las acciones en un ámbito secundario deben realizarse o no.

import («….stl»)

Importa un archivo para su uso en el modelo actual de OpenSCAD. OpenSCAD actualmente soporta importación de DXF, apagado y ficheros STL (ASCII y binario). La extensión de archivo se utiliza para determinar el tipo.
intersection_for (i = [start:end]) { … }

Iterar sobre los valores en un rango y crear la intersección de objetos creados por cada pasada.
Además de crear instancias independientes para cada paso, el estándar for() también agrupa todas estas instancias de creación de una Unión implícita.

Parámetros
start – valor inicial
end – parada cuando el siguiente valor sea final

intersection_for (i = [start:step:end]) { … }


Iterar sobre los valores en un rango y crear la intersección de objetos creados por cada pasada.
Además de crear instancias independientes para cada paso, el estándar for() también agrupa todas estas instancias de creación de una Unión implícita.

Parámetros
start – valor inicial
step o paso – cantidad para aumentar el valor, opcional, por defecto = 1
end – parada cuando el siguiente valor sea final
intersection_for (i = […, …, …]) { … }


Iterar sobre los valores en un  vector y crear la intersección de objetos creados por cada pasada.
Además de crear instancias independientes para cada paso, el estándar for() también agrupa todas estas instancias de creación de una Unión implícita.
linear_extrude (height, center, convexity, twist, slices)



Es una operación de modelado que toma un polígono 2D como entrada y extiende en la tercera dimensión de modo que se crea así una forma 3D. Tenga en cuenta que la protuberancia se realiza siempre del plano XY a la altura indican a lo largo del eje Z ; así que si se gira o aplicar otras transformaciones antes de extrusión, la extrusión se aplica a la proyección del polígono 2D en el plano XY.


Parámetros

height -altura, 
center -centro, 
convexity-convexidad, 
twits-torcedura, 
slices-rodajas
projection (cut)


Utilizando la función, puede crear dibujos en 2d de modelos en 3d y exportarlos al formato dxf. Funciona proyectando un modelo 3D (x, y) plano, con z en 0. If, sólo puntos con z = 0 se considerará (cortando efectivamente el objeto), con (el valor predeterminado), puntos por encima y por debajo del plano se considerarán así (creando una proyección adecuada).
projection()cut=truecut=false
render (convexity)

Las fuerzas de la generación de una malla incluso en modo de vista previa. Útil para ser demasiado lentos para seguir las operaciones booleanas.

rotate_extrude (convexity)

Gira alrededor del eje z para formar un sólido que tiene simetría de rotación una figura en 2D. Una forma de pensar de esta operación es imaginar un torno de alfarero colocada en el plano X-Y con su eje de rotación hacia arriba hacia + Z. Luego colocando el objeto por el hecho de ser en esta virtual de alfarero (posiblemente extendido hacia abajo por debajo del plano X-Y a -Z, tomar la sección de este objeto en el plano X-Z pero mantener solamente el derecho de la mitad (X > = 0). Es la forma 2D que necesitan ser alimentados a rotate_extrude() como el niño con el fin de generar este sólido.
Desde una forma 2D se procesa por OpenSCAD en el plano X-Y, una manera alternativa de pensar de esta operación es la siguiente: hace girar una figura en 2D alrededor del eje y para formar un sólido. El sólido resultante se coloca de modo que su eje de rotación se encuentra a lo largo del eje z.
No puede utilizarse para producir una hélice o rosca.
La forma 2D necesita mentir completamente en el derecho de cualquiera de los dos (recomendado) o el lado izquierdo del eje y. Más precisamente hablando, cada vértice de la forma debe tener ya sea x > = 0 o x < = 0. Si la forma cruza el eje X una advertencia aparecerá en la ventana de consola y se ignorará el rotate_extrude(). Para OpenSCAD versiones anteriores a 2016.xxxx, si la forma es en el eje negativo las caras será al revés, que puede causar efectos no deseados
surface (file, center, invert, convexity)


Lee mapa información de archivos de texto o imagen.

Parámetros
file : La ruta del archivo que contiene los datos del mapa.
center:Esto determina la posición del objeto generado. Si es cierto objeto se centra en x y el eje y. De lo contrario, el objeto se coloca en el cuadrante positivo. Por defecto false.
invert: Invierte como los valores de color de imágenes importadas se traducen en valores de altura. Esto no tiene ningún efecto al importar archivos de datos de texto. Por defecto false.
convexity. El parámetro de convexidad especifica el número máximo de partes delanteras (lados traseros) podría penetrar un rayo que se intersecan el objeto. Este parámetro sólo es necesario para visualizar correctamente el objeto en modo de vista previa OpenCSG y no tiene ningún efecto en la prestación final.

Compresiones de listas

Generar[ for (i = range|list) i ]
es decir

[para (i = rango | lista) i]
Condiciones[ for (i = …) if (condition(i)) i ]

es decir 
[para (i =…) si (conditcon(i)) i]
Asignaciones[ for (i = …) let (assignments) a ]

es decir

[para (i =…) que (asignaciones) un]

Variables especiales

$childrenNúmero de hijos de módulo
$faÁngulo mínimo
$fsTamaño mínimo
$fnNúmero de fragmentos
$tPaso de la animación
$vprRotación de la vista
$vptTraducción de ventanilla
$vpdDistancia de la cámara de ventanilla

Mas información en  https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/

htt

Shell scripting : variables y operaciones


Bash , c-shell  o simplemente shell scripting es  un lenguaje de script  creado a fines de la década de 1980 por un programador llamado Brian Fox, que trabajaba para la Free Software Foundation . Fue pensado como una alternativa de software libre para el shell Bourne (de hecho, su nombre es un acrónimo de Bourne Again SHell ), e incorpora todas las características de ese shell, así como nuevas características como la aritmética de enteros y el control de trabajo

Bash es un «shell de Unix», es decir  una interfaz de línea de comandos para interactuar con el sistema operativo por lo que está ampliamente disponible, siendo el shell predeterminado en muchas distribuciones de GNU / Linux y en Mac OSX, con puertos existentes para muchos otros sistemas.

Además del modo interactivo, donde el usuario escribe un comando a la vez, con ejecución y respuesta inmediatas, Bash (como muchos otros shells) también tiene la capacidad de ejecutar un script completo de comandos, conocido como «Bash shell script» (o «Bash script» o «shell script» o simplemente «script»)  que es justo   lo que vamos a tratar en este post como continuación de un  post anterior introductorio donde exponimos ale tipico Hello world en c-shell

close up code coding computer

Tuberías y sustitución de comandos 

Como hemos visto, el valor de retorno de un comando, tomado estrictamente, es solo un pequeño entero no negativo destinado a indicar el éxito o el fracaso. Su salida real es lo que escribe en el flujo de salida estándar. De forma predeterminada, el texto escrito en el flujo de salida estándar se imprime en el terminal, pero hay algunas formas en que se puede «capturar» y usar como el verdadero valor de retorno del comando.

Tuberías 

Cuando una secuencia de comandos se vincula entre sí en una tubería, la salida de cada comando se pasa como entrada al siguiente. Esta es una técnica muy poderosa, ya que nos permite combinar varios programas de utilidad pequeños para crear algo complejo.

Sustitución de comandos 

La sustitución de comandos es un poco como expansión de variable, pero ejecuta un comando y captura su salida, en lugar de simplemente recuperar el valor de una variable. Por ejemplo, considere nuestro ejemplo de get_password anterior:

#! / bin / bash

función get_password (  ) 
# Uso: get_password VARNAME 
#Le pide al usuario una contraseña; lo guarda como $ VARNAME.
# Devuelve un estado de salida distinto de cero si la entrada estándar no #es un terminal, o si el comando  "leer" devuelve un estado de salida #tinto de cero.
{
  if [[ -t 0 ]] ; then
    read -r -p 'Password:' -s "$1" && echo
  else
    return 1
  fi
}
 
get_password PASSWORD && echo "$PASSWORD"

Realmente no hay razón para que la persona que llama deba guardar la contraseña en una variable.

Si get_password simplemente imprimió la contraseña en su salida estándar, entonces la persona que llama podría usar la sustitución de comandos y usarla directamente:

 #! / bin / bash
 
función get_password (  ) 
# Uso: get_password 
# Pide al usuario una contraseña; Imprime para capturar llamando al código. 
# Devuelve un estado de salida distinto de cero si la entrada estándar no es un terminal, o si 
# salida estándar * es * un terminal, o si el comando "leer" devuelve un 
estado de salida distinto de cero #.
 {
  if [[ -t 0 ]] && ! [[ -t 1 ]] ; then
    local PASSWORD
    read -r -p 'Password:' -s PASSWORD && echo >&2
    echo "$PASSWORD"
  else
    return 1
  fi
}
 
echo "$(get_password)"

Para evaluar "$ (get_password)" , Bash ejecuta el comando get_password en una subshell, capturando su salida estándar y reemplaza $ (get_password) por la salida capturada.

Además de la notación $ (...) , también se admite una notación más antigua  (con comillas inversas), y aún se encuentra con bastante frecuencia. Las dos notaciones tienen el mismo efecto, pero la sintaxis de  es más restrictiva y, en casos complejos, puede ser más complicado acertar.

La sustitución de comandos permite anidar como vemos .  Se permite, expresiones  "$ (b" $ (c) ")" . (es decir ,ejecuta el comando c , usando su salida como un argumento para b , y usando la salida de eso como un argumento para a .)

Una sustitución de comando puede contener una secuencia de comandos, en lugar de un solo comando de modo que se captura la salida de todos estos comandos.

Como hemos visto anteriormente, se pueden usar puntos y coma en lugar de líneas nuevas para separar los comandos, lo cual  es particularmente común en la sustitución de comandos.

Una sustitución de comando puede incluso contener asignaciones de variables y definiciones de funciones (aunque, como los comandos sustituidos se ejecutan dentro de una subshell, las asignaciones de variables y las definiciones de funciones dentro del comando no se verán fuera de ella; solo son útiles si se usan dentro de los comandos sustituidos ).

Aritmética de shell 

Las expresiones aritméticas en Bash se modelan estrechamente en las de C, por lo que son muy similares a las de otros lenguajes derivados de C, como C ++, Java, Perl, JavaScript, C # y PHP.

Una diferencia importante es que Bash solo admite aritmética de enteros (números enteros), no aritmética de punto flotante (decimales y fracciones); Por ejemplo  algo como 3 + 4 significa lo que esperarías (7), pero algo como 3.4 + 4.5 es un error de sintaxis. Algo así como 13/5 está bien, pero realiza una división de enteros, por lo que se evalúa en 2 en lugar de en 2.6.

Expansión aritmética 

Quizás la forma más común de usar expresiones aritméticas es en la expansión aritmética , donde el resultado de una expresión aritmética se usa como un argumento para un comando

. La expansión aritmética se denota $ ((...)) . Por ejemplo, este comando:

 echo  $ ((  3  +  4  *  (  5  -  1  )  ))

impresiones 19 .

expr (en desuso) 

Otra forma de usar expresiones aritméticas es mediante el programa Unix «expr», que era popular antes de que Bash admitiera las matemáticas.  Similar a la expansión aritmética, este comando:

 echo  ` expr 3 + 4  \ *  \ (  5 - 1  \)  `

impresiones 19 .

Tenga en cuenta que el uso de «expr» requiere un carácter de escape «\» antes del operador de multiplicación «*» y los paréntesis. Tenga en cuenta los espacios entre los símbolos de cada operador, incluidos los paréntesis.

Operadores numéricos

Además de las notaciones familiares + (adición) y - (resta), las expresiones aritméticas también son compatibles con * (multiplicación), / (división entera, descrita anteriormente), % (división de módulo, la operación «resto»; por ejemplo, 11 dividido por 5 es 2 el resto 1, entonces 11% 5 es 1 ), y ** («exponenciación», es decir, involución; por ejemplo, 2 4 = 16, entonces 2 ** 4 es 16 ).

Los operadores + y - , además de sus sentidos «binarios» (dos operandos) de «suma» y «resta», tienen sentidos «unarios» (un operando) de «positivo» y «negativo». Unary + tiene básicamente ningún efecto; unary - invierte el signo de su operando. Por ejemplo, - (3 * 4) evalúa a -12 , y - (- (3 * 4)) evalúa a 12 .

Referente a variables 

Dentro de una expresión aritmética, se puede hacer referencia a las variables de shell directamente, sin usar expansión variable (es decir, sin el signo de dólar $ ).

Por ejemplo, esto:

 i  =  2 +3
 echo  $ ((  7  * i ))

impresiones 35 . (Tenga en cuenta que primero se evalúa i , que produce 5 y luego se multiplica por 7. Si hubiéramos escrito $ i en lugar de i , se habría realizado una mera sustitución de cadenas; 7 * 2 + 3 es igual a 14 + 3, es decir, 17 – Probablemente no sea lo que queremos.

El ejemplo anterior se muestra usando «expr»:

 i  =  ` expr 2 + 3  ' 
eco  ' expr 7  \ *  $ i  `

impresiones 35 .

Asignación a variables 

Las variables de shell también se pueden asignar dentro de una expresión aritmética. La notación para esto es similar a la asignación de variables regulares, pero es mucho más flexible.

Por ejemplo, el ejemplo anterior podría reescribirse así:

 echo  $ ((  7  *  (  i  =  2  +  3  )  ))

excepto que esto establece $ i a 5 en lugar de a 2 + 3 .

Tenga en cuenta que, aunque la expansión aritmética parece un poco a la sustitución de comandos, se no se ejecuta en un subnivel; este comando realmente establece $ i a 5 , y los comandos posteriores pueden usar el nuevo valor. (Los paréntesis dentro de la expresión aritmética son solo el uso matemático normal de paréntesis para controlar el orden de las operaciones).

Además del operador de asignación simple = , Bash también admite operadores compuestos como + = , - = , * = , / = y % = , que realizan una operación seguida de una asignación. Por ejemplo, ((i * = 2 + 3)) es equivalente a ((i = i * (2 + 3))) . En cada caso, la expresión en su conjunto se evalúa al nuevo valor de la variable; por ejemplo, si $ i es 4 , entonces ((j = i * = 3)) establece tanto $ i como $ j en 12 .

Por último, Bash soporta operadores de incremento y decremento.

El operador incremental ++ incrementa el valor de una variable en 1; si precede al nombre-variable (como el operador «pre-incremento»), entonces la expresión se evalúa al nuevo valor de la variable , y si sigue al nombre-variable (como el operador «post-incremento»), entonces la expresión se evalúa al valor antiguo de la variable .

Por ejemplo, si $ i es 4 , entonces ((j = ++ i)) establece tanto $ i como $ j en 5 , mientras que ((j = i ++)) establece $ i en 5$ j a 4 . El operador de disminución - es exactamente el mismo, excepto que disminuye el valor de la variable en 1. La reducción previa y posterior de la reducción son completamente análogas al incremento previo y al incremento posterior.

Las expresiones aritméticas como sus propios comandos 

Un comando puede consistir completamente en una expresión aritmética, usando cualquiera de las siguientes sintaxis:

 ((  i  =  2 + 3  ))
 let  'i = 2 + 3'

Cualquiera de estos comandos establecerá $ i en 5 . Ambos estilos de comando devuelven un estado de salida de cero («exitoso» o «verdadero») si la expresión se evalúa como un valor distinto de cero, y un estado de salida de uno («falla» o «falso») si la expresión se evalúa como cero. Por ejemplo, esto:

 ((  0  ))  ||  echo zero
 ((  1  ))  &&  echo non-zero

imprimirá esto:

zero
non-zero

La razón de este comportamiento contraintuitivo es que en C, cero significa «falso» y los valores distintos de cero (especialmente uno) significan «verdadero». Bash mantiene ese legado dentro de las expresiones aritméticas, luego lo convierte en la convención habitual de Bash al final.

El operador de coma 

Las expresiones aritméticas pueden contener múltiples sub-expresiones separadas por comas , . El resultado de la última sub-expresión se convierte en el valor general de la expresión completa. Por ejemplo, esto:

 echo  $ ((  i  =  2 , j  =  2  + i, i * j ))

establece $ i en 2 , establece $ j en 4 e imprime 8 .

De hecho , la función incorporada admite múltiples expresiones directamente sin necesidad de una coma; por lo tanto, los siguientes tres comandos son equivalentes:

 ((  i  =  2 , j  =  2 + i, i * j ))
 let  'i = 2, j = 2 + i, i * j'
 let  'i = 2'  'j = 2 + i'  'i * j'

Operadores de comparación, booleanos y condicionales 

Las expresiones aritméticas son compatibles con los operadores de comparación de enteros < , > , <= (significado ≤), > = (significado ≥), == (significado =) y ! = (Significado). Cada uno evalúa a 1 para «verdadero» o 0 para «falso».

También son compatibles con los operadores booleanos:

  • && («and»), que se evalúan como 0 si cualquiera de sus operandos es cero, y 1 de lo contrario;
  •  ||(«or»), que se evalúa en 1 si alguno de sus operandos es distinto de cero, y en 0 en caso contrario;
  • ! («not»), que se evalúa en 1 si su operando es cero, y en 0 en caso contrario.

Aparte de que utilizan cero para significar valores «falsos» y valores distintos de cero para significar «verdaderos», son como los operadores && , || , y ! que hemos visto fuera de expresiones aritméticas. Al igual que esos operadores, estos son operadores «abreviados» que no evalúan su segundo argumento si su primer argumento es suficiente para determinar un resultado. Por ejemplo, (((i = 0) &&(j = 2))) no evaluará el (j = 2)parte, y por lo tanto no establecerá $ j en 2 , porque el operando izquierdo de && es cero («falso»).

¿Y soportan el operador condicional b ? e1 : e2 . Este operador evalúa e1 y devuelve su resultado, si b es distinto de cero; de lo contrario, evalúa e2 y devuelve su resultado.

Estos operadores se pueden combinar de formas complejas:

 ((  i  =  (  ( a> b && c <d + e ||  f  == g + h ) ? j: k )  ))

Aritmética de bucles 

Arriba, vimos un estilo de for-loop, que se veía así:

# imprimir todos los enteros del 1 al 20: 
for i in {1..20} ; do
  echo $i
done

Bash también admite otro estilo, modelado en los bucles for de C y lenguajes relacionados, usando aritmética de shell:

# imprimir todos los enteros del 1 al 20: 
for (( i = 1 ; i <= 20 ; ++i )) ; do
  echo $i
done

Este bucle for utiliza tres expresiones aritméticas separadas, separadas por punto y coma (y no comas , son expresiones completamente separadas, no solo subexpresiones):

  • La primera es una expresión de inicialización, se ejecuta antes de que comience el bucle.
  • El segundo es una expresión de prueba; se evalúa antes de cada posible iteración del bucle (incluida la primera), y si se evalúa a cero («falso»), entonces el bucle sale.
  • El tercero es una expresión de conteo; Se evalúa al final de cada iteración de bucle. En otras palabras, este bucle for es exactamente equivalente a este bucle while:
# imprimir todos los enteros del 1 al 20: 
(( i = 1 ))
while (( i <= 20 )) ; do
  echo $i
  (( ++i ))
done

pero, una vez que se acostumbre a la sintaxis, se hace más claro lo que está sucediendo.

Operadores bitwise 

Además de aritméticas y booleanas operadores regulares, Bash también ofrece a los operadores bit a bit «», significa que los operadores que operan sobre números enteros qua cadenas de bits en lugar de qua enteros.

Si aún no está familiarizado con este concepto, puede ignorarlo de manera segura.

Al igual que en C, los operadores bitwise son :

  • & (bitwise «and»),
  • (bitwise «or»),
  • ^ (bitwise «exclusive or»),
  • ~ (bitwise «not»),
  •  << (desplazamiento a la izquierda en modo bit), y
  • >> (desplazamiento a la derecha en modo bit), así como
  •  & =
  •  | =
  • ^ = (que incluyen la asignación, al igual que + = ).

Literales enteros 

Una constante entera se expresa como un entero literal . Ya hemos visto muchos de estos; 34 , por ejemplo, es un literal entero que denota el número 34.

Todos los ejemplos anteriores  han sido decimales (base diez) literales enteros, que es el valor predeterminado; pero, de hecho, los literales pueden expresarse en cualquier base en el rango 2–64, utilizando el valor de base de notación # (la propia base se expresa en base diez).

Por ejemplo, esto:

 echo $ (( 12 )) # usa el valor predeterminado de base diez (decimal)
 echo $ (( 10 # 12 )) # especifica explícitamente base diez (decimal)
 echo $ (( 2 # 1100 )) # base dos (binario)
 echo $ (( 8 # 14 )) # base ocho (octal)
 echo $ (( 16 # C )) # base dieciseis (hexadecimal)
 eco $ (( 8 + 2 # 100 )) # ocho en base diez (decimal), más cuatro en base dos (binario)

Imprimirá 12 seis veces. (Tenga en cuenta que esta notación solo afecta a cómo se interpreta un literal entero. El resultado de la expansión aritmética todavía se expresa en base diez, independientemente).

Para las bases 11 a 36, ​​las letras inglesas A a Z se usan para los valores de dígitos 10 a 35. Esto no distingue entre mayúsculas y minúsculas. Sin embargo, para las bases 37 a 64, son las letras inglesas en minúsculas las que se usan para los valores de dígitos 10 a 35, mientras que las letras mayúsculas se usan para los valores de dígitos 36 a 61, el signo at @ se usa para las cifras el valor 62, y el subrayado _ se usa para el valor de dígitos 63. Por ejemplo, 64 # @ A3 indica 256259 ( 62 × 64 2 + 36 × 64 + 3 ).

También hay dos notaciones especiales: el prefijo de un literal con 0 indica la base ocho (octal), y el prefijo de 0x o 0X indica la base dieciséis (hexadecimal). Por ejemplo, 030 es equivalente a 8 # 30 , y 0x6F es equivalente a 16 # 6F .

Variables enteras 

Una variable se puede declarar como una variable entera, es decir, su «atributo entero» se puede «establecer», usando esta sintaxis:

declare -i n
Después de ejecutar el comando anterior, cualquier asignación subsiguiente a n hará que el lado derecho se interprete automáticamente como una expresión aritmética. Por ejemplo, esto:
declare -i n
n='2 + 3 > 4'
 Es más o menos equivalente a esto:
 n  =  $ ((  2  +  3 > 4  ))

excepto que la primera versión declare -incontinuará afectando las tareas posteriores también.

En la primera versión, note el uso de comillas en el lado derecho de la tarea. Si hubiéramos escrito n = 2 + 3> 4 , habría significado «ejecutar el comando + con el argumento 3 , pasando la variable de entorno n configurada a 2 y redirigiendo la salida estándar al archivo 4 «; es decir, establecer el atributo entero de una variable no afecta el análisis global de las declaraciones de asignación, sino que simplemente controla la interpretación del valor que finalmente se asigna a la variable.

Podemos «anular» el atributo entero de una variable, desactivando este comportamiento, usando el comando opuesto:


declare +i n

El comando declare incorporado también tiene otros usos: hay algunos otros atributos que una variable puede tener, y declare tiene algunas otras características además de activar y desactivar los atributos. Además, algunas de sus propiedades destacan:

  • Al igual que con local y export , el argumento puede ser una asignación de variable; por ejemplo, establece el atributo entero de $ n y lo establece en 5 .declare -i n = 2 +3
  • Al igual que con local y export , se pueden especificar múltiples variables (y / o asignaciones) a la vez; por ejemplo, declare -i n=2+3 establece tanto el atributo entero de $ m como el de $ n .
  • Cuando se usa dentro de una función, declare implícitamente localiza la variable (a menos que la variable ya sea local), lo que también tiene el efecto de desarmarla localmente (a menos que se use la sintaxis de asignación).

Aritmética no entera 

Como se mencionó anteriormente, Bash shell arithmetic solo admite aritmética de enteros. Sin embargo, los programas externos a menudo se pueden usar para obtener una funcionalidad similar para valores no enteros.

En particular, la utilidad de Unix común bc se usa a menudo para esto. El siguiente comando:

 echo  "  $ (  echo  '3.4 + 2.2'  | bc )  "

impresiones 5.6 .

No hace falta decir que, dado que bc no está tan estrechamente integrado con Bash como lo es la aritmética de shell, no es tan conveniente; por ejemplo, algo como esto:

# imprimir las potencias de dos, de 1 a 512: 
for (( i = 1 ; i < 1000 ; i *= 2 )) ; do
  echo $i
done

sería, para soportar no enteros, convertirse en algo como esto:

# imprimir los poderes de la mitad, de 1 a 1/512: 
i=1
while [ $( echo "$i > 0.001" | bc ) = 1 ] ; do
  echo $i
  i=$( echo "scale = scale($i) + 1 ; $i / 2" | bc )
done

Parte de esto se debe a que ya no podemos usar un aritmética for-loop; parte de esto se debe a que hacer referencia a las variables y asignarlas a las variables es más complicado ahora (ya que bc no es consciente de las variables de la shell, solo de las suyas, no relacionadas); y parte de ello se debe a que bc se comunica con el shell solo a través de entrada y salida.

!Y  esto  es todo por hoy!Pero no se preocupe en proximos post trataremos otrso temas como entrada/salida, funcionaes complejas y mucho mas

Mas informacion en  https://en.wikibooks.org/wiki/Bash_Shell_Scripting

Sencilla cámara para impresora 3d


En efecto  gracias  a la aplicación gratuita   IP Webcam se puede convertir su viejo  smartthone   quizás, guardado por alguna avería en el sensor táctil o  en la pantalla , o simplemente porque tiene unos ciertos años , en una cámara en red con múltiples opciones de visualización.

Esta app  esta   disponible  en Google Play   y funciona en cualquier plataforma con VLC player o navegador web emitiendo a través de una red WiFi sin conexión a internet.

La  app es compatible ademas con emisión opcional a través de cloud por  Ivideon , el cual da acceso global e instantáneo.

Captura de pantalla

Asimismo también esta app es  compatible con audio bidireccional en tinyCam Monitor desde otro dispositivo Android , como vamos  a ver.

Por cierto, también se  puede usar  con  software MJPG de terceros, incluyendo software de videovigilancia, monitores de seguridad y la mayoría de reproductores de audio.

Entre sus características mas llamativas se encuentran:

  •  Subida de videos a Dropbox, SFTP, FTP y correo electrónico usando el plugin de subida de archivos.
  •  Varios renderizadores web entre los que elegir: Flash, Javascript o integrado.
  •  Grabación de video en WebM, MOV, MKV o MPEG4 (en Android 4.1 o superior)
  •  Transmisión de audio en wav, opus y AAC (AAC requiere Android 4.1 o superior)
  •  Detección de movimiento por sonido e integración de Tasker.
  •  Superposición del video a la fecha, hora y nivel de batería.
  •  Adquisición de datos del sensor con un gráfico web en línea.
  •  Compatible con videochat (retransmisión de video solo para Windows y Linux mediante un controlador de emisión de video MJPEG universal)
  •  Notificaciones Push en nube sobre movimiento y sonido, grabación nube para grabaciones iniciadas tras detectar movimiento, potenciado por Ivideon.

La versión Lite que es gratuita, funciona con publicidad no intrusiva siendo  completamente funcional, pero carece de la integración Tasker, de una interfaz de usuario personalizable (solo incluye el editor), y tiene una marca de agua en los vídeos grabados,lo cual no esta na.

Instalación y uso

En el caso muy normal de que queramos  usar un terminal   android con el  digitalizador   o la pantalla estropeadas ,dado que el smartphone deja de detectar las pulsaciones sobre la pantalla de modo y  no pasaremos  del desbloqueo de la pantalla,   podemos usar  un adaptador OTG (on the go)  que   supla el sensor táctil del terminal  por el puntero de  un ratón USB  , el cual por cierto también puede ser incluso mejorado con un dongle para  raton+ teclado inalámbrico pues el receptor siempre es USB  y normalmente también sera reconocido  por Android.

En todo  caso simplemente  conectemos un  ratón  a la hembra USB del OTG  y el otro extremo del adaptador OTG   a nuestro terminal . En seguida  el smartphone lo detectará como un dispositivo de entrada mostrando un puntero en pantalla. permitiéndonos  movernos como si de un ordenador se tratase con la ventaja de que no tendremos que instalar ningún driver ni nada parecido: enchufar y listo.

Cable Adaptador Micro USB OTG compatible con Dispositivos USB OTG

En este punto,  hay que hacer varias menciones una vez conectado el ratón :

  • El puntero del ratón se puede mover como lo haríamos con el dedo.
  • El botón derecho derecho simula el botón atrás ( normalmente el botón físico no funcionara).
  • Se puede arrastrar manteniendo pulsado el botón izquierdo y moviendo el ratón, de hecho por ejemplo lo necesitaremos  para desbloquear la pantalla.Incluso puede servir  para teclear el pin o trazar el código de desbloqueo.
  • El scroll sirve para  moverse por la pantalla.
  • El botón izquierdo con un click sirve para activar  opciones disponibles en esa porción de pantalla como barras de menús , check-box , etc

IMG_20181108_234637[1]

Por  cierto ,respecto al precio del adaptador OTG , no se asuste , apenas cuesta unos 2€ o menos en Amazon

Una vez tengamos acceso al terminal , en primer lugar crearemos una conexión  wifi (en caso   de no tenerlo instalado ) pues en las pruebas necesitaremos que ambos equipos ( cámara  y visualizador ) estén en la misma red

Ahora  toca los importante:  instalaremos la  aplicación IP  webcam desde este enlace de google play; https://play.google.com/store/apps/details?id=com.pas.webcam

Alternativamente  según la avería que tenga el terminal android ademas  puede instalar :

  • Keep Screen on : sirve como su nombre indica para que no se apague la pantalla nunca ( por ejemplo si el sensor táctil no funciona)
  • AutoStart: sirve para arrancar automáticamente cualquier  app al encender el dispositivo( en nuestro caso pondríamos justo esta)

Una vez instalada ,arrancaremos la aplicación  de modo que en  cuanto pulsemos iniciar servidor enseguida debería estar transmitiendo video

Captura de pantalla

Desde la app se pueden cambiar diferentes  configuraciones como por ejemplo las resolución ,la gestión  de energía,  si vamos asignar un usuario , el audio ,etc

Captura de pantalla

Lo interesante obviamente es acceder de forma remota ,por lo que al iniciar el servidor veremos la ip  en la propio pantalla del terminal indicandonos la direccion desde la que nos conectaremos sera del tipo http://192.168.1.49:8080/greet.html )

Ahora nos iremos a un navegador , introduciremos la  ip   y si seleccionamos el menú de  introducir user/pwd ,  si pulsamos la opción de  navegador  deberíamos ver lo que esta captando la cámara:

Opcionalmente esta  el vídeoaccesible si entramos en la dir ip_puerto/video ,es decir en nuestro caso en http://192.168.1.49:8080/video 

Visualización con app externas

Puede  descargar el driver  si  los descarga aquí.

Tras instalar el controlador, ejecute la herramienta de configuración y escriba http://192.168.1.49:8080/video en el campo de enlace, introduciendo  su nombre de usuario/contraseña tal y como los configuró en la aplicación, y pulse Autodetectar para comprobar si funciona y detectar la resolución automáticamente.

Ahora puede utilizar su aplicación de videochat favorita (por ejemplo Skype)  y disfrutar de su nueva cámara.

Configurar tinyCam Monitor

TinyCam Monitor, de Alexey Vasilyev, es una aplicación Android de vigilancia remota y compatible con todos los vendedores principales de cámaras, incluido IP Webcam.

Es compatible con el audio de IP Webcam (versión Pro) y otras características como control LED y autoenfoque y puede descargarlo desde aquí

En la aplicación, seleccione «Gestionar cámaras», añada una nueva cámara y seleccione el vendedor «IP Webcam para Android».Inserte el nombre de

host 192.168.1.49, seleccione su puerto configurado 8080 y listo.

Reproducción via VLC

VLC Media Player es un reproductor de video multiplataforma, servidor de retransmisión y solución de conversión de formatos, todo en uno. Puede descargarlo desde su sitio ofiical.

Para usar IP Webcam con VLC media player, vaya al menú y seleccione Medio ⇨ Abrir ubicación de red e introduzca http://192.168.1.49:8080/video para retransmitir video o http://192.168.1.49:8080/audio.wav para retransmitir audio.

También puede usar VLC Media player para grabar videos:

  • Seleccione Medio -> Convertir/Guardar.
  • Seleccione la pestaña Red
  • Introduzca http://192.168.1.49:8080/video como enlace
  • Haga clic en convertir/guardar
  • Seleccione el archivo de destino, el formato en que quiere guardarlo y listo

Acceder a IP Webcam fuera de la red local WiFi (por ejemplo, a través de internet)

Puede acceder a su cámara IP  a través de internet cuando aquel esté conectado a una red WiFi o si el router WiFi tiene una IP externa (lo más probable es que la tenga). Configurarlo requiere cierto esfuerzo, pero casi cualquiera puede hacerlo.

El dispositivo que se encarga de asignar las IP es el router WiFi. La asignación de IP («renta») se da por algún tiempo y puede cambiar después de que expire, lo cual podría provocar que IP Webcam sea inaccesible usando la dirección anterior.

Para evitar que esto ocurra, necesita abrir la interfaz web del router y asignar al dispositivo una IP estática. En el menú, busque un elemento del menú con nombre parecido a «Clientes DHCP», «Static leases» o «Redirección IP/MAC» y añada aquí una redirección MAC a la IP que desee.

Puede encontrar la dirección MAC de su celular en Opciones->Sobre el celular->Estado->Dirección MAC WiFi.

A través de la interfaz web de su router, debería abrir el puerto servidor a internet y acceder a la cámara usando la IP externa del router. Esta función suele recibir el nombre de «Redirección de puertos», «Servidores virtuales».

Puede servirse del manual de su router para ver cómo se hace. También hay una base de datos gratuita de manuales para la redirección de puertos en http://portforward.com/No es necesario pagar, solo necesita un manual.

La configuración quedará así:

Camara IP (192.168.3.198, servidor en 8080) --->
Router (Redirección 192.168.3.198:8080, la IP externa es 66.77.88.99) 
<--- Cualquier cliente con acceso a internet (abriendo http://66.77.88.99:8080).

Hay un atajo para determinar su IP externa y comprobar la visibilidad de IP Webcam en internet. Si no encuentra su IP externa en la configuración del router, puede averiguarla visitando http://whatismyip.org.

Para comprobar que ha configurado su router correctamente, utilice cualquier escaneador de puertos en línea como este. Introduzca su IP externa en el campo IP(en mi ejemplo, 66.77.88.99), y el puerto externo abierto en el campo «lista de puertos» (8080 en mi ejemplo).

Recuerde que lo más probable es que no pueda acceder a su smartphone a través de la interfaz externa del router mientras esté conectado a la red de dicho router. Ello se debe a un fallo común en el firmware de los routers. Deberá estar en otra red WiFi o conectado al 3G para poder hacerlo.

Mas info en https://play.google.com/store/apps/details?id=com.pas.webcam

Cámara trasera inteligente con Raspberry Pi. Parte 2


Añadiendo reconocimiento de imágenes

 

En los tutoriales de instalación de OpenCV  se  recomienda compilar desde la fuente; sin embargo, en el último año ha sido posible instalar OpenCV a través de pip, el propio administrador de paquetes de Python. Si bien la instalación desde la fuente le dará el mayor control sobre su configuración de OpenCV, también es la más difícil y la que más tiempo consume. Si está buscando la manera más rápida posible de instalar OpenCV en su sistema, querrá  usar pip para instalar OpenCV, pero hay algunas cosas que pueden hacer que se tropiece en el camino, así que asegúrese de leer el resto de este  post. 

Script  en Python

Ahora  este script    puede  ser nombrado  como  car_detector.py  y lanzarlo desde  la consola  .

Ojo no basta con lanzarlo F5 desde el propio Python pues dará probablemente error a l ahora de importar al libreria cv2, pero no se preocupe situarse en la ruta del scrript  en prython  y   ejecutar

sudo python car_detector.py

IMG_20181113_224935[1].jpg

A partir desde ahí debería funcionar la detección de imágenes  con lo que capte la imagen de  la Raspberry Pi

En el siguiente vídeo podemos ver el script en acción

 

 

Como vemos en elvideo en pequeña escala, lo hizo bastante bien detectando un montón de objetos innecesarios, ( aunque  a veces detecta las sombras como objetos.)En un escenario del mundo real, los resultados fueron sorprendentemente precisos ,pero si es  cerca de las condiciones perfectas, Tenga en cuenta que el código es  básico actualmente y necesitaria muchas más pruebas y depuración)

De los dos métodos,este  método , pero el primer método  es más confiable en múltiples situaciones. Así que si usted fuera a hacer esto para su coche, iría con el método  inicial ( el que usa overlay).

 

 

Conexión hacia la Raspberry Pi via vnc

Ya que se ha conectado exitósamente a la consola de comandos por ssh , seguro que le interesa también poderse conectar tambien  al interfaz gráfico por lo que ahora nos toca instalar y configurar el servidor de VNC sobre Raspberry Pi  en su tablet/smartphone.

Para instalar y configurar el VNC viewer en su tablet/smartphon en  android  siga los siguientes pasos:

  • Descargue la app Vnc Viewwer desde Google Play desde la url  oficial https://play.google.com/store/apps/details?id=com.realvnc.viewer.android
  • Al ejecutar la   app por primera vez le pedira una cuenta de  vnc, de modo qeu si no la tiene tendra que creala desde la propia aplicacion introduciendo una cuenta de correo, un nombre , apellido,pais   y un catcha,
  • En nuestro correo electrónico recibiremos un email que debemos validar para confirmar que  cuenta nos pertenece
  • Una vez que haya confirmado los datos puede intentar volver a entrar en la app VNV Viewer ingresando las credenciales que introdujo
  •  Ahora  siga el procedimiento similar al del ssh
    • Haga clic en el el Boton del signo más en la parte inferior izquierda de la pantalla y seleccione la opción Nuevo Host.
    • Entrar los siguientes datos:

    Alias: cualquier nombre es aceptable como por ejemplo Raspberry Pi 

    Username: pi

    Nombre de host: la  dirección Ip  obatnida con el comando ifconfig

    Contraseña: la pwd que haya puesto

    Los demás campos se pueden dejar espacios en blanco, luego toque la marca de verificación en la derecha superior. Después de eso, haga clic en una Conectar cuando se le preguntó » Si desea conectar el dispositivo

  • Para  conectarse  a  su Raspberry Pi , dado que ya ha creado la conexión, pulse  sobre el icono nuevo que aparece en la pantalla de inicio
  • Enseguida deberían aparecer   las credenciales de acceso  y probablemente el pwd en blanco que deberemos completar  .
  • Finalmente progresar la conexión  pulsando en CONTINUE
  • Una vez dado el botón de conectar debería aparecer la pantalla principal de Raspbian que ahora podremos controlar desde nuestro smartphone
  • Podemos ver la imagen de la cámara  ahora desde el propio teléfono

Screenshot_2018-11-13-22-55-52-301_com.realvnc.viewer.android[1]

 

Mas información en :https://www.hackster.io/tinkernut/raspberry-pi-smart-car-8641ca

 

Introduccion al shell scripting o c-shell


Bash , c-shell  o simplemente shell scripting es  un lenguaje de script  creado a fines de la década de 1980 por un programador llamado Brian Fox, que trabajaba para la Free Software Foundation . Fue pensado como una alternativa de software libre para el shell Bourne (de hecho, su nombre es un acrónimo de Bourne Again SHell ), e incorpora todas las características de ese shell, así como nuevas características como la aritmética de enteros y el control de trabajo

Bash es un «shell de Unix», es decir  una interfaz de línea de comandos para interactuar con el sistema operativo por lo que está ampliamente disponible, siendo el shell predeterminado en muchas distribuciones de GNU / Linux y en Mac OSX, con puertos existentes para muchos otros sistemas.

Además del modo interactivo, donde el usuario escribe un comando a la vez, con ejecución y respuesta inmediatas, Bash (como muchos otros shells) también tiene la capacidad de ejecutar un script completo de comandos, conocido como «Bash shell script» (o «Bash script» o «shell script» o simplemente «script»)  que es justo   lo que vamos a tratar en este post

 

 

Un scriptl  cinstituye un fichero normalmente con extensión .sh  que  puede contener solo una lista muy simple de comandos, o incluso un solo comando, aunque   los normal es que  contenga funciones, bucles, construcciones condicionales y todas las demás características de la programación imperativa.

Por otra parte los scripts de shell se pueden llamar desde línea de comandos interactiva descrita anteriormente o  bien, se pueden llamar desde otras partes del sistema. Por ejemplo se puede configurar un script para que se ejecute cuando se inicie el sistema; otro podría configurarse para funcionar todos los días de la semana a las 2:30 AM; otro podría ejecutarse cada vez que un usuario inicia sesión en el sistema.

Los scripts de shell se usan comúnmente para muchas tareas de administración del sistema, como realizar copias de seguridad en disco, evaluar registros del sistema, etc. También se utilizan comúnmente como scripts de instalación para programas complejos. Son especialmente adecuados para todo esto porque alejan la complejidad sin necesidad de casi hacer nada  si un script solo necesita ejecutar dos programas externos, puede ser un script de dos líneas, y si necesita toda la capacidad de toma de decisiones y poder de un lenguaje de programación imperativo Turing-completo, entonces puede tener eso también.

Cuando esté experimentando, es probable que le resulte útil consultar la documentación de varios comandos. Para los comandos que están integrados en Bash, puede usar el comando de ayuda incorporado(comando help ) ; por ejemplo, help echo «imprimirá» (es decir, mostrará) información sobre el comando echo incorporado. Para programas externos, es probable que sus páginas de manual estén instaladas en su sistema, en cuyo caso puede verlas a través del comando man («manual»); por ejemplo, para información sobre el comando cp(«copiar»), puede escribir man cp . Además, la mayoría de los programas, cuando se ejecutan con el argumento --help , imprimirán información de ayuda; por ejemplo, cp --help proporciona casi tanta información como man cp . (Sin embargo, con muchos programas, el enfoque de ayuda no brinda tanta información como el enfoque del comando  man ).

 

close up code coding computer
Photo by Lorenzo Cafaro on Pexels.com

Hello world en bash script

Empecemos con un programa simple «hola mundo»:

  echo 'Hola mundo!'

Podemos escribir esto directamente en el indicador de Bash, o bien guardar esto como un archivo (por ejemplo, hello_world.sh ) y ejecutarlo escribiendo bash hello_world.sh en el indicador de Bash  o también  mendiante el comando Kash  (kash hello_world.sh  ).

En cualquier caso, se imprimirá Hello, world! :

 $ echo 'Hello, world!'  ¡Hola Mundo!

Aquí hemos utilizado el símbolo $ para indicar el indicador de Bash: después de $ , el resto de la línea muestra el comando que escribimos, y la siguiente línea muestra la salida del comando.

Aquí hay un script un poco más complejo:

  if [[ -e readme.txt ]] ;  then 
   echo 'El archivo "readme.txt" existe.'
 else
   echo 'El archivo "readme.txt" no existe.'
 fi

Esta secuencia de comandos comprueba si existe un archivo llamado readme.txt en el directorio actual y utiliza una instrucción if para controlar, en función de esa prueba, qué comandos se ejecutan. También se puede escribir directamente en el indicador de comandos (cualquier script), pero en este caso no es probable que sea útil.

Es decir todo lo  anterior es  completamente «dentro de Bash», ya que no requiern que Bash ejecute ningún programa externo. (Los comandos echo , if ... then ... else ... fi , y [[-e ...]] son comandos incorporados, implementados por Bash.) Pero, al ser un lenguaje de shell-scripting, una gran parte del propósito de Bash es para ejecutar programas externos.

La siguiente secuencia de comandos demuestra esta capacidad:

  if [[ -e config.txt ]] ;  then
   echo 'El archivo "config.txt" ya existe.  Comparando con el predeterminado.  .  .'
   diff -u config-default.txt config.txt> config-diff.txt
   echo 'A diff se ha escrito en "config-diff.txt".'
 else
   echo 'El archivo "config.txt" no existe.  Copia por defecto.  .  .'
   cp config-default.txt config.txt
   echo '.  .  .  hecho.'
 fi

Aquí diff y cp son dos programas de utilidad comunes que, aunque no forman parte de Bash, se encuentran en la mayoría de los sistemas que tienen Bash.

La secuencia de comandos anterior asume la presencia de un archivo de configuración predeterminado llamado config-default.txt , y verifica la presencia de un archivo de configuración llamado config.txt . Si existe config.txt , entonces el script usa el programa externo diff para producir un «dif» (un informe de las diferencias entre, en este caso, dos archivos), para que el usuario pueda ver qué configuraciones no predeterminadas están en su lugar. . Si config.txt no existe, entonces el script usa el programa externo cp («copiar») para copiar el archivo de configuración predeterminado en config.txt .

Como puede ver, los programas externos se ejecutan utilizando el mismo tipo de sintaxis que los comandos incorporados ( ambos son solo «comandos»).

La versión anterior de este script es muy «detallada», ya que genera una gran cantidad de resultados. Es probable que una secuencia de comandos más típica no incluya los comandos de eco , ya que es poco probable que los usuarios necesiten este nivel de información. En ese caso, podríamos usar la notación # para incluir comentarios que Bash ignore por completo y que no aparezcan al usuario. Tales comentarios son simplemente notas informativas para alguien que lee el script en sí:

  if [[ -e config.txt ]] ;  then
   # si config.txt existe:
   diff -u config-default.txt config.txt> config-diff.txt # ver qué ha cambiado
 else
   # si config.txt no existe:
   cp config-default.txt config.txt # toma el valor predeterminado
 fi

Pero lo anterior es simplemente por el bien de la demostración. En realidad, un script tan simple no requiere ningún comentario.

Comandos simples 

Un comando simple consiste en una secuencia de palabras separadas por espacios o tabulaciones. La primera palabra se toma como el nombre de un comando, y las palabras restantes se pasan como argumentos al comando. Ya hemos visto una serie de ejemplos de comandos simples

Aquí algunos comandos más  usuales:

  • cd ..
    • Este comando usa cd («cambiar directorio»; un comando incorporado para navegar por el sistema de archivos) para navegar «hacia arriba» en un directorio.
    • La notación .. significa «directorio padre». Por ejemplo, /foo/bar/../baz.txt es equivalente a /foo/baz.txt .
  • rm foo.txt bar.txt baz.txt
    • Suponiendo que el programa rm («remove») está instalado, este comando elimina los archivos foo.txt , bar.txt y baz.txt en el directorio actual.
    • Bash encuentra el programa rm buscando en una lista configurable de directorios un archivo llamado rm que sea ejecutable (según lo determinen sus permisos de archivos).
  • /foo/bar/baz bip.txt
    • Este comando ejecuta el programa ubicado en / foo / bar / baz , pasando bip.txt como único argumento.
    • / foo / bar / baz debe ser ejecutable (según lo determinado por sus permisos de archivo). Por cierto ,asegúrese de que NO HAY ESPACIO entre la barra inclinada y los archivos que la siguen:por ejemplo, asumiendo que la carpeta «foo» existe en el directorio «raíz», luego ejecute el siguiente comando: «rm -r / foo» destruirá su computadora si se realiza con el acceso «sudo». Usted ha sido advertido. Si no entiende lo anterior, no se preocupe por el momento.
    • Si / foo / bar / baz es un archivo de texto en lugar de un programa binario, y su primera línea comienza con #! , luego, el resto de esa línea determina el intérprete a usar para ejecutar el archivo. Por ejemplo, si la primera línea de / foo / bar / baz es #! / Bin / bash , entonces el comando anterior es equivalente a / bin / bash / foo / bar / baz bip.txt .

Ese ejemplo con / foo / bar / baz tiene una nota especial, ya que ilustra cómo se puede crear un script Bash que se pueda ejecutar como un programa ordinario: simplemente incluya #! / Bin / bash como la primera línea del script (suponiendo ahí es donde se encuentra Bash en su sistema; de lo contrario, ajuste según sea necesario) y asegúrese de que el script tenga los permisos de archivo correctos para ser legible y ejecutable. Para el resto des ejemplos de scripts de shell completos comenzarán con la línea #! / Bin / bash .

El problema con los espacios 

Vimos anteriormente que el comando rm foo.txt bar.txt baz.txt elimina tres archivos separados: foo.txt , bar.txt y baz.txt . Esto sucede porque Bash divide el comando en cuatro palabras separadas basadas en espacios en blanco, y tres de esas palabras se convierten en argumentos para el programa rm . Pero, ¿y si necesitamos eliminar un archivo cuyo nombre contiene un espacio?

Bash ofrece varios mecanismos de cotización que son útiles para este caso; las más utilizadas son comillas simples y comillas dobles.

Cualquiera de estos comandos eliminará un archivo llamado this file.txt :

  rm 'este archivo.txt'
  rm "este archivo.txt"

Dentro de las comillas, el carácter de espacio pierde su significado especial como separador de palabras. Normalmente envolvemos una palabra completa entre comillas, como se muestra arriba, pero de hecho, solo el espacio en sí necesita ser encerrado; este '' archivo.txt o este "" archivo.txt es equivalente a 'este archivo.txt' .

Otro mecanismo de citación comúnmente usado es la barra invertida \ , pero funciona de manera ligeramente diferente; Cita (o «escapa») un solo carácter. Este comando, por lo tanto, es equivalente al anterior:

  rm este \ archivo.txt

En todos estos casos, los mismos caracteres de cita no se pasan al programa. (Esto se denomina eliminación de comillas ). Como resultado, rm no tiene forma de saber si se invocó, por ejemplo, como rm foo.txt o como rm 'foo.txt' .

Comodines de nombre de archivo y expansión de tilde

Bash admite una serie de notaciones especiales, conocidas como expansiones , para pasar tipos de argumentos de uso común a los programas.

Uno de ellos es la expansión del nombre de archivo , donde un patrón como * .txt se reemplaza con los nombres de todos los archivos que coinciden con ese patrón. Por ejemplo, si el directorio actual contiene los archivos foo.txt , bar.txt , este archivo.txt y algo.else , entonces este comando:

  echo * .txt

es equivalente a este comando:

  echo 'bar.txt' 'foo.txt' 'este archivo.txt'

Aquí el asterisco  significa «cero o más caracteres»; hay algunos otros caracteres de patrón especiales (como el signo de interrogación ?, que significa «exactamente un carácter»), y algunas otras reglas de coincidencia de patrón, pero este uso de  es, con mucho, el uso más común de patrones.

La expansión del nombre de archivo no se limita necesariamente a los archivos en el directorio actual. Por ejemplo, si queremos listar todos los archivos que coincidan con t * .sh dentro del directorio / usr / bin , podemos escribir esto:

  echo /usr/bin/t*.sh

que puede expandirse a algo como esto:

  echo /usr/bin/test.sh /usr/bin/time.sh

Si no hay archivos que coincidan con un patrón específico, no se realizará ninguna sustitución; por ejemplo, este comando:

  echo asfasefasef * avzxv

probablemente solo imprima asfasefasef * avzxv .

 

Si algún nombre de archivo comienza con un guión, entonces la expansión del nombre del archivo a veces puede tener consecuencias sorprendentes. Por ejemplo, si un directorio contiene dos archivos, llamados -n y tmp.txt , cat * se expande a cat -n tmp.txt , y cat interpretará -n como una opción en lugar de un nombre de archivo; en su lugar, es mejor escribir cat ./* o cat - * , que se expande a cat ./-n ./tmp.txt o cat - -n tmp.txt , eliminando este problema.

 

 

¿Qué sucede si tenemos un archivo real llamado * .txt al que queremos referirnos? (es decir  si los nombres de archivo pueden contener asteriscos). Pues podemos usar cualquiera de los estilos de cita que vimos anteriormente. Cualquiera de estos:

  cat '* .txt'
  gato "* .txt"

imprimirá el archivo real * .txt , en lugar de imprimir todos los archivos cuyos nombres terminen en .txt .

Otra expansión similar es la expansión de tilde . La expansión de tilde tiene muchas características, pero la principal es esta: en una palabra que consiste únicamente en una tilde ~ , o en una palabra que comienza con ~ / (tilde-barra), la tilde se reemplaza con la ruta completa a directorio de inicio del usuario actual. Por ejemplo, este comando:

  echo ~ / *. txt

imprimirá los nombres de todos los archivos nombrados * .txt en el directorio de inicio del usuario actual.

 

 

Uso de las llaves

Similar a la expansión de nombre de archivo es la expansión de refuerzo , que es una forma compacta de representar múltiples argumentos similares. Los siguientes cuatro comandos son equivalentes:

  ls file1.txt file2.txt file3.txt file4.txt file5.txt
  ls archivo { 1 , 2,3,4,5 } .txt
  ls archivo { 1 ..5..1 } .txt
  ls archivo { 1 ..5 } .txt

El primer comando enumera cada argumento explícitamente. Los otros tres comandos utilizan la expansión de refuerzo para expresar los argumentos de forma más concisa: en el segundo comando, se dan todas las posibilidades 1 a 5 , separadas por comas; en el tercer comando, se da una secuencia numérica («de 1 a 5, incrementando en 1»); y el cuarto comando es el mismo que el tercero, pero deja el … 1 implícito.

También podemos listar los archivos en el orden opuesto:

  ls file5.txt file4.txt file3.txt file2.txt file1.txt
  ls archivo { 5 , 4,3,2,1 } .txt
  ls archivo { 5 ..1 ..- 1 } .txt
  ls archivo { 5 ..1 } .txt

siendo el tamaño de incremento predeterminado -1, cuando el punto final de la secuencia es menor que el punto de inicio.

Como en Bash, la primera palabra de un comando es el programa que se ejecuta, también podríamos escribir el comando de esta manera:

  { ls, archivo { 1 ..5 } .txt }

pero obviamente eso no es propicio para la legibilidad. (El mismo tipo de cosas, por cierto, se puede hacer con la expansión del nombre de archivo).

La expansión del refuerzo, como la expansión del nombre de archivo, se puede desactivar por cualquiera de los mecanismos de cotización; '{' , "{" , o \ { produce una llave literal real.

 

Redireccionando la  salida 

Bash permite que la salida estándar de un comando (descriptor de archivo 1) se envíe a un archivo, en lugar de a la consola. Por ejemplo, el programa de utilidad común cat escribe un archivo en una salida estándar; Si redirigimos su salida estándar a un archivo, tenemos el efecto de copiar el contenido de un archivo en otro archivo.

Si queremos sobrescribir el archivo de destino con la salida del comando, usamos esta notación:

  cat input.txt> output.txt

Si queremos mantener los contenidos existentes del archivo de destino como están y simplemente agregar la salida del comando al final, usamos esta notación:

  cat input.txt >> output.txt

Sin embargo, no todo lo que un programa escribe en la consola pasa por la salida estándar. Muchos programas utilizan el error estándar (descriptor de archivo 2) para los mensajes de error y algunos tipos de mensajes de «registro» o «canal lateral». Si deseamos que el error estándar se combine con la salida estándar, podemos usar cualquiera de estas notaciones:

  cat input.txt y >> output.txt
  cat input.txt >> output.txt 2 > & 1

Si deseamos que el error estándar se adjunte a un archivo diferente de la salida estándar, usamos esta notación:

  cat input.txt >> output.txt 2 >> error.txt

De hecho, podemos redirigir solo el error estándar, dejando solo la salida estándar:

  cat input.txt 2 >> error.txt

En todos los ejemplos anteriores, podemos reemplazar >> con > si queremos sobrescribir el objetivo de redireccionamiento en lugar de agregarlo.

Más adelante veremos algunas cosas más avanzadas que podemos hacer con la redirección de salida.

Redireccionando la entrada 

Así como Bash permite que la salida de un programa se envíe a un archivo, también permite que la entrada de un programa se tome de un archivo. Por ejemplo, la utilidad común de Unix cat copia su entrada a su salida, de manera que este comando:

  cat <input.txt

Escribirá el contenido de input.txt en la consola.

Como ya hemos visto, este truco no es necesario en este caso, ya que a Cat se le puede pedir que copie un archivo específico a su salida; el comando anterior es simplemente equivalente a este:

  cat input.txt

Esta es la regla en lugar de la excepción; Las utilidades más comunes de Unix que pueden tomar entrada desde la consola también tienen la funcionalidad incorporada para tomar su entrada de un archivo en su lugar. De hecho, muchos, incluido cat , pueden recibir información de varios archivos, lo que los hace aún más flexibles que los anteriores. El siguiente comando imprime input1.txt seguido de input2.txt :

  cat input1.txt input2.txt

No obstante, la redirección de entrada tiene sus usos, algunos de los cuales veremos más adelante.

 

Tuberías (pipes) 

Una canalización  o  Pipe es una serie de comandos separados por el carácter de canalización | . Cada comando se ejecuta al mismo tiempo, y la salida de cada comando se usa como entrada para el siguiente comando.

Por ejemplo, considere esta tubería:

  cat input.txt |  grep foo |  grep -v bar

Ya hemos visto la utilidad de cat cat input.txt simplemente escribe el archivo input.txt en su salida estándar. El programa grep es una utilidad común de Unix que filtra («greps», en el lenguaje de Unix) según un patrón; por ejemplo, el comando grep foo imprimirá en su salida estándar cualquier línea de entrada que contenga la cadena foo . El comando grep -v bar usa la opción -v para invertir el patrón; El comando imprime las líneas de entrada que no contienen la barra de cadena. Dado que la entrada de cada comando es la salida del comando anterior, el resultado neto es que la canalización imprime cualquier línea de input.txt que contenga foo y no contenga barra .

Variables 

En un script de Bash, hay algunos tipos diferentes de parámetros que pueden contener valores . Un tipo importante de parámetro son las variables : parámetros nombrados. Si está familiarizado con casi cualquier otro lenguaje de programación imperativo (como C, BASIC, Fortran o Pascal), entonces ya está familiarizado con las variables. La siguiente secuencia de comandos simple utiliza la ubicación variable para mantener el mundo del valor, e imprime un «¡Hola, mundo!» mensaje:

  location = world # store "world" en la variable "location"
 echo "Hola, $ { ubicación } !"  # imprimir "¡Hola mundo!"

Como puede ver, la cadena $ {ubicación} en la segunda línea fue reemplazada por world antes de que se ejecutara ese comando. Esta sustitución se conoce como expansión variable , y es más flexible de lo que podría sospechar. Por ejemplo, incluso puede contener el nombre del comando para ejecutar:

  cmd_to_run = echo # store "echo" en la variable "cmd_to_run"
 " $ { cmd_to_run } " '¡Hola mundo!'  # imprimir "¡Hola mundo!"

En los dos ejemplos anteriores, hemos usado la notación $ { variable_name } para realizar la expansión de la variable. La notación más breve nombre_variable , sin llaves, tendría el mismo efecto en estos casos. A veces, los corchetes son necesarios (por ejemplo, $ {foo} bar no se puede escribir como $ foobar , porque este último se interpretaría como $ {foobar} ), pero generalmente se pueden omitir, y los guiones del mundo real por lo general los omiten .

Por supuesto, no hace falta decir que los anteriores no son ejemplos muy realistas; solo demuestran cómo usar las variables, no por qué o cuándo usarlas. Si está familiarizado con otros lenguajes de programación imperativos, entonces probablemente ya sea obvio por qué y cuándo usaría las variables; si no, entonces esto debería quedar claro a medida que lee este libro y vea ejemplos que los usan de manera más realista.

Es posible que haya notado que hemos usado comillas dobles " , en lugar de comillas simples cadenas de caracteres que incluyen expansiones variables':en general, es una buena idea envolver las expansiones variables entre comillas dobles; por ejemplo, use "$ var" en lugar de $ var .  . Esto se debe a que las comillas simples evitan la expansión de variables; un comando como echo' $ {location} ' imprimirá la cadena real $ {ubicación} , en lugar de imprimir el valor de una variable llamada ubicación .

En general, es una buena idea envolver las expansiones de las variables con comillas dobles, porque de lo contrario, los resultados de la expansión de las variables sufrirán la expansión del nombre de archivo, así como la división de palabras (donde se utiliza el espacio en blanco para separar las palabras que forman un comando). Por ejemplo, este script:

  foo = 'ab *' # tienda "ab *" en la variable "foo"
 echo $ foo

es probable que imprima algo como ba.txt bd.sh , que probablemente no sea lo que queremos. Las secuencias de comandos del mundo real con frecuencia no incluyen comillas dobles, excepto cuando son claramente necesarias, pero esta práctica a veces conduce a errores confusos.

Una serie de variables tienen un significado especial. Por ejemplo, la variable PATH determina la lista de directorios en los que Bash debería buscar cuando intenta ejecutar un programa externo; si está configurado en / usr / bin: / bin , entonces el comando cp src.txt dst.txt buscará ejecutar / usr / bin / cp o / bin / cp . La variable HOME está preinicializada en el directorio inicial del usuario actual y determina el comportamiento de la expansión de tilde. Por ejemplo, si una secuencia de comandos establece HOME = / foo , echo ~/bar imprimirá / foo / bar . (Sin embargo, esto no cambiará el directorio de inicio del usuario).

Parámetros posicionales 

En la mayoría de los comandos anteriores, tanto los que ejecutan un comando integrado como los que usan un programa externo, hemos suministrado uno o más argumentos , que indican en qué debe funcionar el comando. Por ejemplo, cuando invocamos la utilidad común de Unix mkdir («make directory») para crear un nuevo directorio, lo invocamos con un comando como este:

  mkdir tmp

donde tmp es el nombre del nuevo directorio para crear.

Y como hemos visto, los scripts de Bash son programas que pueden ejecutarse. Así que no hace falta decir que ellos también pueden tomar argumentos. Estos argumentos están disponibles para el programa como sus parámetros posicionales . Anteriormente, vimos que las variables son un tipo de parámetro. Los parámetros posicionales son muy similares, pero se identifican por números en lugar de por nombres. Por ejemplo, $ 1 (o $ {1} ) se expande al primer argumento del script. Supongamos que queremos crear un script simple llamado mkfile.sh que tome dos argumentos, un nombre de archivo y una línea de texto, y cree el archivo especificado con el texto especificado. Podemos escribirlo de la siguiente manera:

  #! / bin / bash
 echo " $ 2 " > " $ 1 "

(Observe la línea #!/bin/bash al principio del archivo; cubrimos esa línea en los comandos básicos . Cuando ejecute este código, esa línea garantizará que será interpretada por el shell Bash, incluso si está ejecutándose desde otro programa o su computadora tiene una configuración no estándar.)

y (después de hacerlo ejecutable ejecutando chmod + x mkfile.sh ) podemos ejecutarlo de la siguiente manera:

  ./mkfile.sh file-to-create.txt 'línea para poner en el archivo'

También podemos referirnos a todos los argumentos a la vez usando $ @ , que se expande a todos los parámetros posicionales, en orden. Cuando se envuelven en comillas dobles, como "$ @" , cada argumento se convierte en una palabra separada. (Nota: la alternativa $ * es quizás más común, pero "$ *" se convierte en una sola palabra, con espacios entre los parámetros originales. "$ @" Casi siempre es preferible a $ @ o $ * , lo que permite un argumento para dividirse en varias palabras si contiene espacios en blanco, y para "$ *" , que combina múltiples argumentos en una sola palabra.) Esto suele ser útil en concierto con el comando incorporado shift , que elimina el primer parámetro posicional, como que $ 2 se convierte en $ 1 , $ 3 se convierte en $ 2 , y así sucesivamente. Por ejemplo, si cambiamos mkfile.sh de la siguiente manera:

  #! / bin / bash
 file = " $ 1 " # guarda el primer argumento como "$ file"
 shift # suelta el primer argumento de "$ @"
 echo " $ @ " > " $ file " # escribe los argumentos restantes en "$ file"

entonces podemos ejecutarlo de la siguiente manera:

  ./mkfile.sh file-to-create.txt línea para poner en el archivo

y todos los argumentos, excepto el nombre de archivo, se escribirán en el archivo.

El número de parámetros posicionales está disponible como $ # ; por ejemplo, si $ # es 3 , entonces los parámetros posicionales son $ 1 , $ 2 y $ 3 .

Tenga en cuenta que los parámetros posicionales más allá de $ 9 requieren las llaves; Si necesita referirse al décimo argumento, por ejemplo, debe escribir $ {10} en lugar de $ 10 . (Este último se interpretaría como $ {1} 0 ). Dicho esto, no suele ser una buena idea tener tantos argumentos con significados específicos, ya que es difícil para los usuarios realizar un seguimiento de ellos. Si se encuentra específicamente refiriéndose al décimo argumento de su guión, puede valer la pena volver a evaluar su enfoque.

Si tiene alguna experiencia con Bash, o con las utilidades de Unix, lo más probable es que haya notado que muchos comandos pueden tomar varias «opciones», indicadas con un guión principal, además de sus argumentos habituales. Por ejemplo, rm " $filename" elimina un archivo individual, mientras que rm -r " $dirname " elimina un directorio completo con todo su contenido. (La -r es la abreviatura de «recursivo»: el comando «recursivamente» elimina un árbol completo de directorios). Estas opciones son en realidad solo argumentos. En rm " $filename " , solo hay un argumento ( "$ filename" ), mientras que en rm -r " $dirname " hay dos ( -r y "$ dirname" ). En cierto sentido, no hay nada intrínsecamente especial en estos argumentos, pero esta notación para las opciones está tan extendida que se considera estándar; muchos o la mayoría de los comandos incorporados de Bash pueden aceptar varias opciones, y más adelante veremos varias técnicas para respaldar las opciones como argumentos para nuestros scripts de Bash.

Salida de un script 

Cuando se completa un proceso, devuelve un pequeño valor entero no negativo, llamado su estado de salida o su estado de retorno , al sistema operativo. Por convención, devuelve cero(es decir un exit 0  )  si se completó con éxito, y un número positivo si falló con un error ( es decir un exit <>0)  y de este modo se puede distinguir varios errores diferentes mediante el uso de diferentes números positivos

 Un script Bash puede obedecer esta convención mediante el uso del comando integrado exit . El siguiente comando:

  exit 4

termina el script de shell, devolviendo un estado de salida de cuatro, indicando algún tipo de error. Cuando no se especifica ningún estado de salida (ya sea porque la salida se ejecuta sin argumentos, o porque la secuencia de comandos finaliza sin llamar a exit ), la secuencia de comandos devuelve el estado de salida del último comando que ejecutó.

Una forma en que se utilizan los estados de salida es con los operadores Bash && («y») y || («o»). Si dos comandos están separados por && , entonces el comando de la izquierda se ejecuta primero, y el comando de la derecha solo se ejecuta si el primer comando tiene éxito. Por el contrario, si están separados por || , entonces el comando de la derecha solo se ejecuta si el comando de la izquierda falla.

Por ejemplo, supongamos que queremos eliminar el archivo file.txt y volver a crearlo como un archivo en blanco. Podemos eliminarlo utilizando la utilidad común de Unix rm («eliminar»), y volver a crearlo utilizando la utilidad común de Unix touch ; así, podríamos escribir esto:

  rm file.txt
 touch file.txt

Pero realmente, si rm falla, no queremos ejecutar el comando  touch : no queremos volver a crear el archivo si no pudimos eliminarlo para empezar. Entonces, podemos escribir esto en su lugar:

  rm file.txt && touch file.txt

Esto es lo mismo que antes, excepto que no intentará ejecutar touch a menos que rm haya tenido éxito.

Un tercer operador booleano similar, («no»), invierte el estado de salida de un comando. Por ejemplo, este comando:

  ! rm file.txt

es equivalente a rm file.txt, excepto que indicará éxito si rm indica error, y viceversa. (Esto no suele ser útil cuando los estados de salida se usan como estados de salida reales, lo que indica éxito o fracaso, pero pronto veremos algunos usos extendidos de los estados de salida donde una operación «no» es más útil).

El estado de salida de un comando está (breve mente) disponible como $? .Esto puede ser útil cuando es necesario distinguir entre varios estados de falla diferentes; por ejemplo, el comando grep (que busca líneas en un archivo que coinciden con un patrón específico) devuelve 0 si encuentra una coincidencia, 1 si no encuentra coincidencias y 2 si se produce un error genuino.

emacs1

 

¿A  que no es tan difícil programar en c-shell?Le invitamos a que si tiene un terminal Unix o Linux ( por ejemplo una Raspberry Pi)   lo intente!seguro  que se le ocurren mil ideas interesantes que hacer !

 

 

Instalar Google Street View en una tableta Kindle Fire


Nadie puede discutir la excelente relacion calidad/precio de la nueva generación de unos de los  tabletas más vendido: la Fire 7 ahora más fina y ligera ycon mayor autonomía

Esta tableta  cuenta con una pantalla mejorada  (con pantalla IPS de 7 pulgadas con mayor contraste y textos más definidos,)  un procesador Quad-Core de 1,3 GHz , hasta 8 horas de batería,  almacenamiento interno de 8 o 16 GB y ranura microSD para obtener hasta 256 GB de espacio adicional.

Una de las principales características de las famosas  tabletas  Fire de Amazon es que se encuentran ancladas a su ecosistema ,incluso cuando son  adquiridas,  pues vienen pre-configuradas  para un  usuario  de Amazon,  para que la experiencia de instalación sea la  mas sencilla posible .Desgraciadamente esta comodidad tiene también una gran  pega pues todo el interfaz  :solo orientado a ser usada dentro del ecosistema de Amazon , que  sin duda resulta muy seductor  pues ofrece entre otras las siguientes ventajas:

  • Acceso a  de millones de canciones, eBooks Kindle, apps y juegos del Appstore de Amazon, como Prime Video, Netflix, Facebook, Instagram y Spotify (no es compatible con Google Play Store).
  • Los miembros Prime tienen acceso ilimitado a películas, series y almacenamiento seguro para fotos sin ningún coste adicional.

Como  vemos , la experiencia «Amazon» incluye una pantalla de inicio de Amazon, aplicaciones de Amazon precargadas , contenidos exclusivos de Amazon   y por supuesto  la tienda de aplicaciones y contenidos de Amazon  (obviamente no incluye Google Pay Store)

Aún no contando con el market de Google  como hemos visto en este blog , es posible instalar  aplicaciones  que no estén en el market de Amazon  de manera extraoficial desde hace años, y esta nueva tableta de Amazon no es una excepción.

El proceso en términos generales siempre que la app no use los servicios de Google es  de lo más sencillo ,pues  solo necesita descargar desde la red la aplicación   en formato APK . Por  ejemplo  de hecho en efecto podemos instalar la app de Gooogle Street View buscando el apk correspondiente en la red   e instalando el apk  en la tableta,pero desgraciadamente  con  esta app  y otras tantas  hay un problema, que aunque en efecto se puede instalar desde un apk, no funciona  por si mismo  porque  necesita de los servicios de Google para funcionar ,   de modo que si quiere instalar alguna app que haga  uso del algún  servicio de Google  no sera posible  pues por defecto pues en la Fire necesitaremos un componente básico : Google Play y todos los servicios de Google  asociados que no están soportados oficialmente por Amazon, pero no se preocupe , pues incluso sin root  es posible instalar estos componentes como vamos a ver a continuación.

Pasos para instalar Play Store en las tabletas Fire

En efecto a veces necesitaremos instalar Google Play Store  para usar otras apps  como por ejemplo Google Street View   o cualquier otra que haga uso de los servicios de Google.

La sencillez es una de las claves de este nuevo proceso, pues no necesitamos  desproteger (rootear) o instalar herramientas adicionales, como por ejemplo el ADB de Android.

Estos son los pasos de forma resumida si contamos con una tableta  con sistema operativo Fire 5.0 o posterior:

Como vemos  este método   tiene una facilidad adicional , pues todo el proceso para instalar Play Store en los tablets Fire se ejecuta desde el mismo tablet, lo que aumenta su comodidad y, por lo tanto, no hay que conectarlo a ordenador alguno

Veamos de forma detallada el proceso.

1-Instalación  Google Account Manager

Google Account Mnager es una aplicación cuyo objetivo principal es el de a administrar todas las cuentas de google sincronizadas en su dispositivo android.

En algunos dispositivos esta aplicación es utilizada para remover y  reemplazar las cuentas de google olvidadas (FRP) permitiendo así el acceso al dispositivo android.

Para instalar  este componente desde el propio navegador de la Fire  desde apkmirror  podemos descargar directamente el apk ( desde es link Google Account Manager) y una  vez descargado ,procederemos a lanzar su instalación.

 

2-Instalación Google services Framework

El marco de servicios de Google Play se utiliza para actualizar las aplicaciones de Google y las aplicaciones de Google Play.

Este componente proporciona una funcionalidad central como la autenticación a sus servicios de Google, contactos sincronizados, acceso a las últimas configuraciones de privacidad del usuario y servicios basados en la ubicación de alta calidad y menor potencia.

El marco de servicios de Google Play también mejora la experiencia de su aplicación:acelera las búsquedas fuera de línea, proporciona mapas más inmersivos y mejora las experiencias de juego.

Para instalar  este componente desde el propio navegador de la Fire  desde apkmirror  podemos descargar directamente el apk ( desde este link Google Services Framework )y una  vez descargado ,procederemos a lanzar su instalación

 

3-Instalación de Google  Play Services

Las funciones principales son:
  • La autentificación de servicios de Google
  • La sincronización de contactos,
  • El acceso a la última configuración de privacidad del usuario
  • Los servicios basados en la ubicación de mayor calidad y menor potencia.
Además de todo esto, Google Play Services mejora la experiencia general de uso del terminal. Permite agilizar las búsquedas sin conexión, proporciona mapas más envolventes y mejora la experiencia de juego mediante la optimización de memoria RAM.

Otras opciones dentro del menú de Google Play Services nos permitirán gestionar las aplicaciones de nuestra cuenta (no necesariamente las que tengamos instaladas), o establecer diferentes ajustes de localización, o incluso de Google Fit

La aplicación Google Play Services siempre tiene un código numérico adjunto a su nombre, con el formato X.X.XX (XXXXXXX-ABC).  Ese código numérico junto al nombre es importante para determinar si esa aplicación Google Play Services es compatible o no con un dispositivo. Es importante fijarse en la versión de la aplicación y en los tres últimos números “ABC” dentro del paréntesis, (el resto de números 2645110 es irrelevante).

Estos tres números ABC indican con qué dispositivos es compatible esa aplicación:

“A” representa la versión de Android:
0: Android 4.4.4 o inferior
2: Android 5.0 y 5.1 (Google Play Services 8.X.XX o superior).
4: Android 5.0 y 5.1 (Google Play Services 7.X.XX o inferior) y para Android 6.0 o superior (Google Play Services 8.X.XX o superior).
7: Android 5.0
8: Android TV
“B” representa la arquitectura del CPU:
1: armeabi
3: armeabi-v7a
4: arm64-v8a
7: x86
“C” representa el DPI de la pantalla:
0: compatible con todos los dispositivos
2: 160 DPI
4: 240 DPI
6: 320 DPI
8: 480 DPI

En el caso de que se vaya a actualizar manualmente la aplicación Google Play Services existente en el dispositivo Android, lo recomendable es ver el código “ABC” de la aplicación (Ajustes > Aplicaciones > Google Play Services) y descargar una versión actualizada de Google Play Services con ese mismo código ABC.

En el caso de la Kindle Amazon Fire 5ºgeneracion   lleva instalada  Android  Lollipop_MR1 ,version LVY48F  Release  5.1.1, SDK 22  por  lo deberemos instalar la version  Google Play Services 11.5.09 (230-164803921) (230) que hemos probado desde este blog  y que puede descargar desde este link Google Play Services version 11.5.09.230

En caso de los modelo Fire HD 8 2017 de séptima generación, debe instalar Google Play Services  veesion 11-5-09-240 

 

4-Instalación Google Play

Como todos sabemos  Google Play Store (anteriormente Android Market) es la  plataforma de distribución digital de aplicaciones móviles para los dispositivos con sistema operativo Android , así como la tienda en línea desarrollada y operada por Google.

Las aplicaciones se encuentran disponibles de forma gratuita, así como también con costo,  por lo que también incluye  una plataforma de pagos (Google Pay)

Es posible también instalar esta aplicación directamente y sin necesidad de ordenador  pero antes debería haber instalado los tres componentes anteriores : Google Account Manager, Google Services Framework  y  Google Play Services 

Para instalar  este componente desde el propio navegador de la Fire  desde apkmirror  podemos descargar directamente el apk ( desde este link; Google Play Store) y una  vez descargado ,procederemos a lanzar su instalación.

 

5-Pasos  finales

Si ha descargado y ejecutado en el orden anterior  las cuatros   apk  citadas   habrá terminado . Si no  lo ha hecho ,una vez que  tenga todas las apk , debe proceder a la instalación de cada uno de los 4 apk  en el orden en los que los descargo :Google Account Manager, Google Services Framework  ,  Google Play Services y Google Play 

En cualquier caso una vez instaladas las 4 apk’s  ,no olvide reiniciar el tablet de forma habitual y todo debería funciona de forma correcta de modo que ya debería ver el acceso a Google Play  en el que tendrá que validarse con su cuenta de google para hacer uso

En nuestro caso ,  si antes había instalado  el apk de  Google Street View, ahora   ya no debería darle el error de que no tiene instalado Google Play , pero si pedirá que necesita actualizar los servicios de Google ( ojo  pues puede tardar bastante)    , momento en el cual nos pedirá  las credenciales de Google  y  ya debería arrancar  esta aplicación en la kindle fire.

Como acceder a un teléfono con el sensor táctil roto


Si tenemos la desgracia de que no podamos acceder al terminal  presentándose sin embargo  la imagen correctamente en la pantalla , al  menos  podremos acceder a este  para recuperar su datos , pero antes de explicar «el truco»,  entendamos primero las parte de la pantalla de un  smartphone.

La pantalla de un smartphone suele estar compuesta por varios elementos:

  • El exterior de cristal endurecido .
  • Una capa intermedia donde se aloja el sensor táctil que da información al sistema de dónde se ponen los dedos.Suelen ser de dos tipos
    • Resistivas: Son más baratas y no les afectan el polvo ni el agua salada y, además de ser más precisas, pueden ser usadas con un puntero o con el dedo. Sin embargo, tienen hasta un 15% menos de brillo y son más gruesas, por lo que están siendo sustituidas por otras en los dispositivos móviles que precisan un tamaño y un peso ajustados y mayor brillo en la pantalla por la posibilidad de estar expuestos a la luz directa del sol.
    • Capacitivas: consisten en una capa de aislamiento eléctrico, como el cristal, recubierto con un conductor transparente, como el ITO (tin-doped indium oxide). Como el cuerpo humano es también un conductor eléctrico, el contacto con la superficie de la pantalla genera una distorsión del campo electrostático de la pantalla, que se mide a través del cambio en la capacitancia  . En este tipo de pantallas ,que por cierto son las mas normales, la imagen tiene una mayor calidad, la respuesta es mejor, y la mayoria permiten el uso de varios dedos a la vez (multitouch). Sin embargo, son más caras y no se pueden usar con el puntero habitual, sino con uno especial para las pantallas capacitiva.
  • La pantalla TFT propiamente dicha,  o display que se encarga de mostrar la imagen.

Gracias a esta  descomposición, si adquirimos  el pack completo ,    veremos  dos cables de cinta   en la parte  trasera de cualquier pantalla : el pequeño proveniente del sensor táctil   y otro cable de de muchas mas conexiones para la  pantalla  TFT

img_20170301_194132

Todas estas  capas están firmemente adheridas, por lo que resultan muy difíciles de separar ,rompiéndose a veces los tres componentes  a  la vez  o  en la mayoría de ocasiones sólo uno (el digitalizador) por ser el mas expuesto . Normalmente sin embrago cualquier problema  con alguna de estas partes   generalmente  se soluciona ,como vamos  mas adelante, cambiando el pack  completo del cristal+digitalizador+display para nuestro modelo de  teléfono.

 

 

Rotura del sensor táctil

En el caso muy normal de que se nos haya SOLO estropeado el digitalizador  el smartphone deja de detectar las pulsaciones sobre la pantalla de modo que  no pasaremos  del desbloqueo de la pantalla   y  cualquier uso que deseemos hacer del móvil estará imposibilitado.

De esta guisa  , al no  poder  acceder al terminal a todos los efectos el  smartphone se podria  considerar  inutilizable, pero, por fortuna, Android incluye maneras de gestionar el sistema más allá de la mera navegación con los dedos ,  siendo la manera más sencilla gracias a un adaptador OTG (on the go)  que   suple el sensor táctil del terminal  por el puntero de  un ratón USB  , el cual por cierto también puede ser incluso mejorado con un dongle para  raton+ teclado inalámbrico pues el receptor siempre es USB  y normalmente también sera reconocido  por Android.

En el caso mas sencillo   ,simplemente  conectemos un  ratón  a la hembra USB del OTG  y el otro extremo del adaptador OTG   a nuestro terminal . En seguida  el smartphone lo detectará como un dispositivo de entrada mostrando un puntero en pantalla. permitiéndonos  movernos como si de un ordenador se tratase con la ventaja de que no tendremos que instalar ningún driver ni nada parecido: enchufar y listo.

Cable Adaptador Micro USB OTG compatible con Dispositivos USB OTG

En este punto  hay que hacer varias menciones una vez conectado el ratón :

  • El puntero del ratón se puede mover como lo haríamos con el dedo.
  • El botón derecho derecho simula el botón atrás ( normalmente el botón físico no funcionara).
  • Se puede arrastrar manteniendo pulsado el botón izquierdo y moviendo el ratón, de hecho por ejemplo lo necesitaremos  para desbloquear la pantalla.Incluso puede servir  para teclear el pin o trazar el código de desbloqueo.
  • El scroll sirve para  moverse por la pantalla.
  • El botón izquierdo con un click sirve para activar  opciones disponibles en esa porción de pantalla como barras de menús , check-box , etc

 

IMG_20181108_234637[1]

Por  cierto ,respecto al precio del adaptador OTG , no se asuste , apenas cuesta unos 2€ o menos en Amazon

 

 

 

Cambio de pantalla y sensor

Es cierto que con el adaptador OTG podemos solucionar el problema de acceder a  los datos que tuviese el telefono  o para darle una segunda vida ( cámara ip, despertador , estación meteorológica , etc ) pero es evidente que si buscamos mantener la usabilidad esto no sera suficiente.

Si con el OTG no es suficiente, si queremos seguir usando el terminal de forma normal,  deberemos  cambiar tanto la pantalla como el sensor capacitivo ,  aunque no pese .

También  si no ha recibido ningún golpe ,podría ser que se hay soltado el cable del digitalizador a la placa madre ,pero esto no es muy habitual aunque tampoco deberíamos descartarlo al menos si no presenta desperfectos en la pantalla

En este ejemplo vamos   a ver como hacerlo  en  un Doogee Y100 Plus    aunque el procedimiento general es bastante parecido a  u otros modelos )  pues la mecánica es bastante parecida  en todos los casos cuanto al procedimiento para el desmonte del terminal , reemplazo del sensor con el tft   y luego el posterior re-ensamblado de todos sus componentes.

img_20170301_1932431

En la imagen  esta  la evidencia: el terminal no solo presenta  desperfectos en la en sensor capacitivo del frontal  , el cual  incluso podría  reemplazarse de forma  separada , sino que además, también  presenta  zonas de la pantalla sin imagen ,lo cual es claramente un signo de que también  la pantalla TFT debe ser reemplazada pues presenta graves  problemas de deformaciones en el tft.

Afortunadamente , todo tiene solución en esta vida , y  aunque pueda parecer una gran  contrariedad que ambas partes se hayan estropeado, lo cierto es que lo ideal es reemplazar  ambas  partes simultáneamente( el TFT con el sensor capacitivo )   pues e suelen venir  pegadas de fabrica  de modo que suele ser muy difícil separarlas  para cambiar solo alguna de estas, como por ejemplo el sensor capacitivo ya  que al estar mas expuesto es el que mas sufre por las caidas y las rayaduras.

img_20170301_194105

Como es evidente que necesitamos sustituir ambas piezas ,lo primero es buscar  un reemplazo de ambas partes averiadas en alguno de los portales chinos , teniendo muy claro que debemos adquirir el modelo exacto para  nuestro terminal ,pues en incluso en versiones parecidas puede haber diferencias

Desmontando el terminal

Comenzaremos  por retirar la funda  así como las  carcasas  del teléfono  y retirar la placa posterior mediante una pequeña punción entre el conector micro usb  y parte de atrás  de plástico. Si tiene problemas, se recomienda una herramienta de levantamiento de plástico o en su defecto una púa de las usadas para tocar acordes.

Después de que la parte posterior plástica del teléfono se haya quitado, quite la batería, ambas tarjetas  sims  y la tarjeta micro SD (izquierda)

Nota:Insistimos  que no debemos olvidar extraer todas las tarjetas  SIM ‘s   y por supuesto la micro-sd ( si contamos con esta)  pues si las dejamos en la carcasa al intentar al extraer la tapa interior    corremos el grave riesgo de romperlas

Identificación

Bajo la batería se puede ver la etiqueta de identificación, que muestra el modelo de teléfono, las bandas del teléfono se puede conectar también y 2x IMEI.

Este teléfono en concreto tiene sims dual, lo que explica los dos números IMEI 2x.

Observe que tenemos una serie de tornillos philips  por toda la periferia del terminal

 

img_20170301_193818_li-2

Retire ahora  con cuidado  los 12 tornillos Phillips con un destornillador de cabeza Phillips de 1,8 x 40 mm  con mucho cuidado de no perder ninguno. Una vez desenroscado cada tornillo se puede usar un imán o un destornillador imantado  para extraer cada tornillo con objeto de no perder nada

Hay normalmente un tornillo verde o blanco que  tiene un adhesivo vacío que lo cubre. Si usted quita esta etiqueta usted anulará su garantía, pero ya sabe que una rotura de pantalla o sensor no esta cubierta por la garantía porque normalmente este tipo de problemas suelen ocurrir por caídas accidentales o fortuitas   hechos que nunca estarán cubiertas en las condiciones de la garantía .

img_20170301_193950

Utilize una herramienta de arrastre de plástico  para separar cuidadosamente la cubierta de plástico posterior (el primer marco medio) del segundo marco medio. Si no dispone de herramientas de desmonte también puede servir una púa de guitarra,el filo de una navaja  o incluso las uñas..

Se recomienda comenzar en la parte inferior y poco a poco trabajar  con su herramienta de extracción  a partir de ahí.

Cable de  antena y placa madre 

A continuación tendremos que quitar el cable de la antena para lo cual puede  utilizar un par de pinzas, levantando con cuidado el cable del conector. Puede haber cinta que lo sostenga allí que puede eliminar  también.

Hay personas que  quitan el otro extremo del cable de la antena pero en realidad no es fundamental.
img_20170301_194039_li-2
Ahora volvemos nuestra atención a la  placa  principal donde necesitamos desconectar 2 cables de cinta   : el del digitalizador y el de la pantalla TFT.
En primer lugar lo más probable es que haya cinta que cubra los conectores, la cual debería quitar o con un par de pinzas.
Ahora podemos ver el conector del TFT  a la derecha .Usando un par de pinzas levante el pequeño brazo que sostiene el cable en el conector. ! Tenga cuidado con sus pinzas pues  el brazo del conector es muy frágil !.Utilizando de nuevo las pinzas (herramienta muy útil) tire con cuidado del cable del conector.
img_20170301_195205_li

Ahora debemos repetir  este paso para el  conector del digitalizador  que esta en la parte superior a la izquierda.

Utilizando de nuevo las pinzas  tire con cuidado del cable del conector usando un par de pinzas para levantar el pequeño brazo que sostiene el cable en el conector. ! Tenga cuidado con sus pinzas pues  el brazo del conector es muy frágil !.
img_20170301_195258_li

Botonera de volumen y botón de encendido

 Ahora necesitaremos soltar  la plaquita de pulsadores de encendido  y el volumen del marco principal . Utilizando la lengüeta negra marcada en la imagen, tire de los contornos  con  cuidado e intente sacar  la placa soltando el recubrimiento negro usando para ello  las pinzas , intentando alejar  del marco de plástico medio. Tenga mucho cuidado porque el PCB es muy frágil.
img_20170301_201826_li

La placa  principal se sostiene sobre el chasis  por dos  tornillos de cabeza  ancha de  40mm. He marcado estos dos tornillos en  la foto.

img_20170301_200453_li-2

Extracción de la placa principal 

 No trate de quitar la placa principal todavía, porque todavía hay otro cable adjunto por debajo el cual debe  extremarse la precaución pues es muy frágil.
Levante lentamente la placa principal de la parte superior del teléfono y gírela hacia arriba. Ahora debe ver el conector. Este conector es el mismo que los otros dos en la parte superior de la placa principal. Desconecte el conector del mismo modo que lo hizo antes.
img_20170301_201957_li

Pasos intermedios en otros terminales diferentes al Doogee y100

  • Si no necesita reemplazar la cámara trasera o frontal, puede hacerlo ahora.
  • Para quitar la cámara frontal, desconecte la cámara de la tarjeta . El conector es el mismo que el otro conecta en la placa base.
  • Para quitar la cámara trasera, desconecte la cámara de la tarjeta . El conector es el mismo que el otro conecta en la placa base.
  • Encontrará el receptor auricular en el segundo marco medio. .

Eliminación de Pantalla averiada

Ahora ya estamos finalmente en la etapa final de quitar el bloque de la pantalla.Voltear el marco medio hacia atrás de modo que usted está mirando ahora en la parte delantera del teléfono de nuevo. Ahora necesitaremos usar un secador de pelo o una pistola de calor para calentar los bordes del teléfono para aflojar el pegamento que está sosteniendo en la pantalla y los botones delanteros, al marco medio .Una vez que el pegamento se ha calentado lo suficiente usted debe ser capaz de obtener una herramienta de plástico entre la pantalla de vidrio y el marco de plástico medio.

Lentamente y con cuidado, mueva su herramienta de arrastre alrededor del teléfono hasta que la pantalla se haya liberado desde el marco medio. Encontrara  que normalmente  el pegamento que sostiene la pantalla al marco medio no es fuerte,  lo cual  es bueno para poderlo soltar.

Hay muchas personas , que optan  si se va a desechar esta parte , con cuidado con  una navaja hacer presión  por el hueco interior  y luego intentar levantar el cristal por un lado  y desde ahi con sumo cuidado ir bordeando todo el perímetro hasta sacar por completo  todo el conjunto .

 

img_20170301_202544

Ahora debería estar a punto de reemplazar la pantalla con otra. El vidrio con la pantalla y el digitalizador son todos una pieza ,  lo cual  significa que las tres partes tendrán que ser reemplazadas si uno de ellos falla. Esto se está convirtiendo en la norma con la mayoría de los móviles de hoy.

Montaje

Nos toca ahora el proceso inverso ,por lo que primero  antes de continuar  primero deberíamos  comprobar que  el remplazo es el correcto al menos   a nivel de conectores y de dimensiones

img_20170301_194132

Antes de nada se deben  quitar las protecciones interiores pues al pegar por la parte posterior  puede ser un martirio sacarlas

img_20170301_203011

Nos toca echarle un poco de pegamento suave (yo he usado  pegamento para textiles  o calzado)  por los bordes  es introducir los dos cables por la canaladuras marcadas en la foto, la cuales están  practicadas sobre el propio armazón

img_20170301_202623_li

Esperaremos unos 15 minutos  para que seque un poco el pegamento , y luego fijaremos ambos componentes de modo que coincidan perfectamente

img_20170301_230154_li

Ahora toca conectar la placa madre  por lo deberemos empezar por el conector interior.

img_20170301_202052

Una vez ajustado el conector , llevaremos la placa a su posición correcta  horizontal  y una vez ajustada , atornillaremos con los dos tornillos correspondientes.

Acto seguido presentaremos los dos cables de cinta en sus conectores  y perfectamente alineados colocaremos la palanca de reten con un cuidado extremo (son muy frágiles)

img_20170301_231244

Tampoco debemos olvidar el cablecillo de antena que va por el lateral izquierdo .

Y ahora ya solo nos queda poner la tapa y atornillar todos los tornillos philips

 img_20170301_232734_li

Finalmente colocaremos la micro-sd,la sim ,la batería  y por supuesto la tapa: debería lucir nuestro terminal como nuevo pues en efecto eso es lo que hemos hecho

 

 

 

!Muchísima suerte  tanto si se apaña con el truco del OTG  o sei decide a reemplazar su pantalla rota de su terminal por otra nueva!

Bot de Telegram con Raspberry Pi


Telegram Messenger como todos sabemos  es una famosa aplicación de mensajería y VoIP  desarrollada por los hermanos Nikolái y Pável Dúrov    con altas  capacidades de  alojamiento de contenido (con historial de las conversaciones y mensajes guardados),6​7​ archivos (hasta 1.5 GB, incluyendo documentos, multimedia y animaciones gráficas), búsqueda global de usuarios, sincronización de contactos, llamadas, canales de difusión, supergrupos, entre otros.

Inicialmente en 2013  fue empleado en smartphones pero al poco tiempo en 2014 comenzo a ser  multi-plataforma para más de 10 sistemas operativos: Android, iOS, macOS, Windows, GNU/Linux, Firefox OS, navegadores web, entre otros y actualmente rivaliza  con Whatsapp al que poco a poco esta intentando arrebatando usuarios.

Además de las características citadas  Telegram ,ofrece la plataforma de bots que además de hacer conversaciones inteligentes y pueden realizar otros servicios y complementar la experiencia en las conversaciones.

En este post precisamente nos vamos a centraros  en el uso del bot Botfather para interactuar desde Telegram  con nuestra Raspberry Pi

En primer lugar,para empezar buscaremos  BotFather seleccionando la opción «Bot»

Ahora pretendemos crear un Bot nuevo ,por lo que pulsaremos en crear nuevo o enviaremos  /newbot
Screenshot_2018-11-06-22-34-27-741_org.telegram.messenger[1]
Enseguida nos pedirá un nombre   , como por ejemplo «soloelectronicos_bot»
ademas tenemos qeuñadir un usuario para nuestro bot ,La regla es que debe terminar en bot , como por ejemplo soloelectronicosbot

 Configurar nuestra Raspberry Pi

En primer lugar necesitamos ,  obtener la dirección IP de la Raspberry Pi

Para conocer la dirección IP del Raspberry Pi, tendrá que  conectar la Raspberry Pi  a la alimentación y  deberá tener conexión a  Internet   .

Ahora  desde    un terminal   ejecutar el comando ifconfig. La  salida  desde una Raspberry Pi 3 sera similar a esta:

[email protected]:~ $ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.64 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::625:6aec:6f57:df7c prefixlen 64 scopeid 0x20<link>
ether b8:27:eb:67:0c:6f txqueuelen 1000 (Ethernet)
RX packets 661 bytes 45810 (44.7 KiB)
RX errors 0 dropped 1 overruns 0 frame 0
TX packets 585 bytes 202270 (197.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 17 bytes 1004 (1004.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 17 bytes 1004 (1004.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

wlan0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether b8:27:eb:32:59:3a txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

[email protected]:~ $

 

Observe que en negrita casi al principio de la salida del comando donde  nos indica la dirección IP para podernos conectarnos  de forma remota, asi  que recomendamos que la anote aparte.

raspberrypi

Una vez que tenemos la ip   si antes no  se ha conectado de forma remota asegúrese de que esta habilitado la conexión tanto por SSH como por VNC , para lo cual  nos iremos a Preferencias-->Configuración de la Raspberry Pi y seleccionaremos la pestaña Interfaces.

Es esta pantalla , debemos seleccionar SSH y VNC . Finalmente pulsaremos aceptar  pero  para que se apliquen los cambios tendremos que reiniciar la Raspberry  Pi

 

ssh.PNG

Por cierto, si no recuerda la clave que escribió en la primera configuración debería ir a  Preferencias–>Configuración de la Raspberry Pi y en la pestaña Sistema pulsar cambiar clave, pues sera esta la que tendrá que escribir casa vez que intente conectarse a la Raspberry Pi

 

clave.PNG

Ahora nos conectaremos  con el vnc ingresando la dirección ip de l aRaspeberry Pi obtenida, anteriormente , el  nombre de usuario ( suele ser pi )   y la password

Ahora por si estamos en una version antigu de Python ( la version ultima ya lo incluye ) deberiamos instalar  el indice de paquetes Python

sudo apt-get install python-pip
 sudo pip install telepot

 Ejecutar el código de Python

Ahora ya tenemos todos los ingredientes faltándonos tan solo el script en python que nos permitirá   transcribir la información enviada por Telegram si corresponde con nuestro Token  ,   hacia   ordenes   qeu pueden ser procesada  por la Raspberry Py

El script en  Python escrito  por Salman Faris es bastante sencillo  pues tras importar los modulos necesarios , define el pin 11  con dos estados (on  y off) y en funcion de las ordenes que reciba del Telegram   pondrá o no a nivel alto dicho pin

Este el código completo del script escrito por Salman:

#coder :- Salman Faris

import sys
import time
import random
import datetime
import telepot
import RPi.GPIO as GPIO

#LED
def on(pin):
            GPIO.output(pin,GPIO.HIGH)
return  def off(pin):
           GPIO.output(pin,GPIO.LOW)
return

# para numerar en  la  placa  Raspberry Pi por el numero de los pines

GPIO.setmode(GPIO.BOARD)

# configurar el canal de salida del GPIO

GPIO.setup(11, GPIO.OUT)

bot = telepot.Bot('TOKEN OBTENIDO DESDE TELEGRAM')

def handle(msg):
chat_id = msg[‘chat’][‘id’]
command = msg[‘text’]

print ‘Got command: %s’ % command

if command == ‘on’:
bot.sendMessage(chat_id, on(11))
elif command ==’off’:
bot.sendMessage(chat_id, off(11))

bot = telepot.Bot(‘Bot Token’)
bot.message_loop(handle)
print ‘I am listening…’

while 1:
time.sleep(10)

 

Podemos sencillamente  clonar el script anterior desde  el respositorio  git de Salman mediante  el siguiente camando  git clone:

git clone https://github.com/salmanfarisvp/TelegramBot.git 

[email protected]:~ $ git clone https://github.com/salmanfarisvp/TelegramBot.git
Cloning into ‘TelegramBot’…
remote: Enumerating objects: 25, done.
remote: Total 25 (delta 0), reused 0 (delta 0), pack-reused 25
Unpacking objects: 100% (25/25), done.
[email protected]:~ $

Ahora  tenemos  que asignar el Token obtenido  en pasos anteriores al script por lo tendremos que editar  desde el editor de texto de Python    y  escribir  ahí su valor

 bot = telepot.Bot('TOKEN OBTENIDO DESDE TELEGRAM') 

Salvaremos los cambios  y ejecutaremos  el código  bien con F5 desde el entorno de programacion de Python o bien desde shell  mediante la siguiente orden:

python telegrambot.py 

Ahora  si conectamos un led entre el pin 11 y masa podremos activarlo o desactivarlo desde Telegram enviando al bot  las frases  «on» y «off»: inmediatamente, estemos donde estemos deberiamos poder encender  el LED  o apagarlo  cuando envíamos «on» y «off» a nuestro bot desde Telegram.

 

Obviamente puede modificar el script base de Salman para activar mas cargas ( de hecho hasta 26)  que obviamente pueden ser mas complejas que un  sencillo led ,  como puede ser  un rele , motor , etc mediante el driver adecuado     y a  traves de ordenes desde Telegram ( por ejemplo on1, off1, on2, etc) 

 

 

Cómo conectarse a una Raspberry Pi desde un smartphone


No siempre esta fácilmente accesible un ordenador para conectarnos cómodamente desde ssh o por vnc   o tal vez no tenga un segundo teclado o ratón disponibles, así que ¿porque no intentar acudir a  una  smartphone  o tableta para conectarnos desde allí ?

 

Screenshot_2018-11-04-23-01-45-352_com.realvnc.viewer.android[1]

 

Pues en  efecto es posible conectarse a una Raspberry Pi desde un smartphone o tableta , y de forma muy sencilla ,como vamos a  ver a  continuación, pero para ello, en primer lugar necesitamos ,  obtener la dirección IP de la Raspberry Pi

Para conocer la dirección IP del Raspberry Pi, tendrá que  conectar la Raspberry Pi  a la alimentación , deberá tener conexión a  Internet   .

Ahora  desde    un terminal   ejecutar el comando ifconfig. La  salida  desde una Raspberry Pi 3 sera similar a esta:

[email protected]:~ $ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.64 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::625:6aec:6f57:df7c prefixlen 64 scopeid 0x20<link>
ether b8:27:eb:67:0c:6f txqueuelen 1000 (Ethernet)
RX packets 661 bytes 45810 (44.7 KiB)
RX errors 0 dropped 1 overruns 0 frame 0
TX packets 585 bytes 202270 (197.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 17 bytes 1004 (1004.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 17 bytes 1004 (1004.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

wlan0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether b8:27:eb:32:59:3a txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

[email protected]:~ $

 

Observe que en negrita casi al principio de la salida del comando ,  el comado nos indica la dirección IP para podernos conectarnos  de forma remota, asi  que recomendamos que la anote aparte.

Una vez que tenemos la ip   si antes no  se ha conectado de forma remota asegúrese de que esta habilitado la conexión tanto por SSH como por VNC , para lo cual  nos iremos a Preferencias-->Configuración de la Raspberry Pi y seleccionaremos la pestaña Interfaces.

Es esta pantalla , debemos seleccionar SSH y VNC . Finalmente pulsaremos aceptar  pero  para que se apliquen los cambios tendremos que reiniciar la Raspberry  Pi

 

ssh.PNG

Por cierto, si no recuerda la clave que escribió en la primera configuración debería ir a  Preferencias–>Configuración de la Raspberry Pi y en la pestaña Sistema pulsar cambiar clave, pues sera esta la que tendrá que escribir casa vez que intente conectarse a la Raspberry Pi

 

clave.PNG

Conexión hacia la Raspberry Pi por ssh

Lo  primero  que quizás se nos ocurra es la la conexión de Pi con teléfono via  SSH cliente):SSH (Secure Socket Shell), el cual  es un protocolo de acceso  muy común a todo los equipos unix  y Linux que nos da acceso a la consola de comandos

Existe  una app llamada  Serverauditor  que se puede descargar desde la store de Android (Google Play ) gratuitamente. Asimismo también está disponible para dispositivos iOS.

Asegúrese de que el smartphone o tableta y la Raspberry  Pi están en la misma red para poder realizar la conexión

Los pasos para instalar Serverauditor en el teléfono:

Alias: cualquier nombre es aceptable como por ejemplo Raspberry Pi 

Username: pi

Nombre de host: la  dirección Ip  obtenida con el comando ifconfig

Contraseña: la pwd que haya puesto

Los demás campos se pueden dejar espacios en blanco, luego toque la marca de verificación en la derecha superior. Después de eso, haga clic en una Conectar cuando se le preguntó » Si desea conectar el dispositivo «

  • Nota:Nombre de usuario y contraseña son los de frambuesa Pi. Si uno ha cambiado del predeterminado, necesita entrar con el actual nombre de usuario y contraseña.
Screenshot_2018-11-04-22-30-22-624_com.server.auditor.ssh.client[1]

Ahora  ya tiene un modo muy sencillo de ejecutar consola de Raspberry Pi en la pantalla así que !disfrútelo!.

En el vídeo siguiente precisamente podemos ver el programa en funcionamiento

Conexión hacia la Raspberry Pi via vnc

Ya que se ha conectado exitósamente a la consola de comandos por ssh , seguro que le interesa también poderse conectar tambien  al interfaz gráfico por lo que ahora nos toca instalar y configurar el servidor de VNC sobre Raspberry Pi  en su tablet/smartphone.

Para instalar y configurar el VNC viewer en su tablet/smartphon en  android  siga los siguientes pasos:

  • Descargue la app Vnc Viewwer desde Google Play desde la url  oficial https://play.google.com/store/apps/details?id=com.realvnc.viewer.android
  • Al ejecutar la   app por primera vez le pedira una cuenta de  vnc, de modo qeu si no la tiene tendra que creala desde la propia aplicacion introduciendo una cuenta de correo, un nombre , apellido,pais   y un catcha,
  • En nuestro correo electrónico recibiremos un email que debemos validar para confirmar que  cuenta nos pertenece
  • Una vez que haya confirmado los datos puede intentar volver a entrar en la app VNV Viewer ingresando las credenciales que introdujo
  •  Ahora  siga el procedimiento similar al del ssh
    • Haga clic en el el Boton del signo másen la parte inferior izquierda de la pantalla y seleccione la opción Nuevo Host.
    • Entrar los siguientes datos:

    Alias: cualquier nombre es aceptable como por ejemplo Raspberry Pi 

    Username: pi

    Nombre de host: la  dirección Ip  obatnida con el comando ifconfig

    Contraseña: la pwd que haya puesto

    Los demás campos se pueden dejar espacios en blanco, luego toque la marca de verificación en la derecha superior. Después de eso, haga clic en una Conectar cuando se le preguntó » Si desea conectar el dispositivo

  • Para  conectarse  a  su Raspberry Pi , dado que ya ha creado la conexión, pulse  sobre el icono nuevo que aparece en la pantalla de inicio
  • Enseguida deberían aparecer   las credenciales de acceso  y probablemente el pwd en blanco que deberemos completar  .
  • Finalmente progresar la conexión  pulsando en CONTINUE
  • Una vez dado el botón de conectar debería aparecer la pantalla principal de Raspbian que ahora podremos controlar desde nuestro smartphone  haciedo uso de las herramientas que nos aparecen en la parte superior de la pantalla

 

Screenshot_2018-11-04-23-01-45-352_com.realvnc.viewer.android[1]

  • Para faciliar el manejo VNC sin teclado  y ratón   clásicos  aparte de la barra de herramientas , este  programa  añade soporte de gestos con los dedos  para  facilitarnos la interaccion con Raspbian:

Screenshot_2018-11-04-23-00-59-320_com.realvnc.viewer.android[1]Screenshot_2018-11-04-23-00-52-332_com.realvnc.viewer.android[1]

 

NOTA: En caso de versiones MUY  antiguas de Raspbian que no traigan VNC instalado deberá instalar al version servidor de VNC  en la Raspberry Pi de forma manual desde consola por   línea de consola, para ello introduzca los siguientes comandos en orden.

  1.  Instalar el paqueete TightVNC paquete:  sudo apt-get install tightvncserver
  2. Ejecutar servidor TightVNC; tightvncserver
  3. Se le pedirá que introduzca una contraseña y una contraseña de sólo lectura opcional.
  4. Crear un archivo de secuencia de comandos para iniciar el servidor VNC. Use Oeditor de texto  escribiendo el siguiente comando:nano
  5. Poner el siguiente script en él: #!/bin/sh  vncserver :1 -geometry 1920×1080 -depth 24 -dpi 96
  6. «Ctrl+o» para guardar el archivo. La extensión debe ser «.sh» por ejemplo llamelo «vnc.sh». A continuación, «Ctrl + X» para salir del editor de.
  7. Hacer el archivo ejecutable.sudo chmod +x vnc.shCon este archivo, puede iniciar servidor VNC desde tu tablet/smartphone enviando un comando a través de SSH: ./vnc.sh dsfs

 

 

 

:

 

Brazo bionico


En los próximos años  gracias a la  evolución de la tecnología , veremos cada vez más personas que  serán aumentadas de alguna manera a través de la tecnología. Estamos acostumbrados a los marcapasos y los implantes ortopédicos, pero ¿a qué más recurriremos? Youbionic ha estado trabajando en manos y brazos biónicos para que los usemos. De hecho en los últimos años, la compañía ha pasado de manos impresas en 3D bastante simples a este movimiento de trabajo que imita el brazo biónico

Hace ya mas de 4 años que Federico Ciccarese fundó Youbionic con la idea de  trabajar  «en una herramienta para la evolución de la especie humana».  De hecho desde Youbionic creen que la tecnología se puede utilizar para aumentar las capacidades humanas y la intervención en el reemplazo de partes de nuestro cuerpo que no funcionan correctamente  y por ellos  se comprometen a construir dispositivos para hacernos vivir mejor y por más tiempo; de hecho tienen  la intención de ocupar todos sus recursos para fusionar el cuerpo biológico con componentes mecatrónicos”.

 

 

 

BRAZO BIONICO

Youbionic ha estado trabajando en el desafío de hacer un brazo biónico desde 2014. 3DPrint.com habló con Frederico, y les contó que han estado estudiando durante años cómo funciona el cuerpo humano y diseñar interfaces que puedan integrarse con el. Realmente creen que en este momento pueden aparecer dispositivos experimentales, pero pronto serán una gran evolución. Como corresponde a sus precios bajos, Frederico utiliza la flexibilidad de la impresión 3D para crear prototipos de bajo costo, vendieron sus  resultados para financiar nuevos fondos. investigación y así sucesivamente»

Gracias a  la impresión 3D  Youbionic proporciona los elementos para crear robótica y biónica nunca antes vista.  enfoscandose  en  apéndices impresos en 3D son, como se podría sospechar, generalmente destinados a aquellos a los que les falta una extremidad.

Además, hay muchas otras personas que pueden retener la funcionalidad parcial de una mano, pero aún podrían usar la asistencia.

El modelado generado a través de algoritmos matemáticos y el estudio de las formas que la naturaleza nos ofrece cada día,  ha permitido desarrollar habilidades de diseño únicas,asi  que unos de su elementos mas sofisticados ( Youbionic Hand )  aporta una nueva dimensión de existencia: la prótesis mioeléctrica bellamente impresa en 3D de Youbionic  que está prevista para usarla desde  cualquier aplicación pues es capaz de ser controlada por la contracción muscular como si fuera una parte real del cuerpo.

 

 

Como vemos el brazo youbiónic, los dedos y todas las partes están impresas en 3D.  El paquete es extraordinariamente ligero y se usa sobre los brazos existentes  moviéndose de una manera muy suave y realista. Asimismo los dedos impresos en 3D se mueven en concierto con los reales o pueden controlarse externamente. Su creador Frederico está trabajando en una versión controlada por la mente de su brazo biónico (que a través de la interfaz del cerebro humano, los auriculares podrían estar disponibles mucho antes de lo que pensamos).

Lo más difícil de hacer con los brazos biónicos es hacer que los dedos trabajen con la resistividad correcta que se necesita para agarrar cosas o realmente recogerlas  pero  Frederico ha trabajado duro para lograr ese tipo de funcionalidad hasta el punto en que el brazo pueda levantar y manipular muchas cosas a su alrededor.De hecho  los dedos son modulares y podrían ser reemplazados por diferentes accesorios

Como se ve en el vídeo a continuación, la mano de Youbionic puede manipular muchos elementos diferentes, incluyendo una caja pequeña, una botella de agua y un juego de llaves. Dejando de lado la funcionalidad, el movimiento es extremadamente fluido y el acabado negro suave realmente lo hace lucir genial.

El dispositivo está equipado actualmente con un Arduino Micro , servos, varios sensores, un paquete de baterías y algunos interruptores. Incluso el tablero parece estar muy limpio , aunque entendemos  que una version  final usará algún tipo de PCB.

Han  rediseñado completamente los elementos mecánicos, por lo que ahora Hand es más resistente a los esfuerzos durante la operación pues han modificado los parámetros del proyecto para elevar la fuerza que logra hacer, de modo que está listo para la mayoría del ejercicio diario, cómo levantar objetos, apretar los mangos y luego interactuar con el mundo exterior como una mano biológica.

 

 

Otra característica única de Youbionic Hand es la modularidad como hemos ya  comentado , pues cada dedo es independiente y ha sido diseñado para ser parte de configuraciones alternativas. Próximamente, estarán disponibles los componentes que permiten diferentes montajes: podrá crear abrazaderas de tres dedos para instalaciones en robots antropomorfos o dispositivos portátiles con armadura humana

Estos dispositivos pueden aumentar las habilidades de las personas cuando son llevadas por un cuerpo sano, pero también pueden recuperar habilidades si reemplazan partes del cuerpo que no funcionan. De hecho su creador  Frederico piensa que tan pronto como nos acostumbramos a ver cosas como esta, es decir  costos protésicos de bajo costo, con todas las partes,pues entre otras coas estas  suponen  una vigésima parte de una disponible comercialmente en la actualidad.

 

 

 

Específicamente en el ámbito médico, veremos  en los próximos años una gran cantidad de innovaciones de impresión 3D, por lo que los inventores, diseñadores e innovadores utilizarán impresoras 3D para crear dispositivos novedosos.

La mayoría de los dispositivos médicos y otras cosas están reguladas fuera del alcance de la mayoría de los inventores pero en áreas donde la innovación es accesible, veremos mucha actividad de impresión 3D como ya lo ha hecho  hasta el momento (como por  ejemplo The UnLimbited Arm v2.1 – Alfie Edition  en  proceso de  mejora en thinginverse)

The UnLimbited Arm v2.1 - Alfie Edition

La fabricación de dispositivos médicos de bajo costo versátiles y, posiblemente, específicos para cada paciente, será un área de innovación importante para nuestra calidad de vida  en los próximos años destacando los brazos biónicos   y por supuesto el tren inferior, pues son son algunas de las cosas más difíciles que se me ocurren en esta área.

 

 

Precio

Youbionic   vende los archivos stl del brazo por $ 149, mientras que los archivos para la mano son $ 99  permitiendo a los usuarios imprimir su propio brazo pues ellos también tienen que sufragar su actividad ( aunque también se están embarcando en nuevos modelos de negocios en impresión 3D y en MedTech)  pero  también hay actuadores y otras piezas que necesitaríamos comprar por separado.

 El brazo está impreso en 3D de PLA y utiliza Actuonix Linear Actuators .Puede imprimir los otros componentes usted mismo o usar un servicio de impresión 3D si no tiene uno.

Además de varios brazos biónicos actualizados, Youbionic ha desarrollado un dispositivo de doble mano. En este momento, el brazo de Youbionic parece estar funcionando a la perfección, como se puede ver en el video anterior

Al vender los archivos stl  , Frederico espera financiar el desarrollo de su equipo y al mismo obtener retroalimentacion para mejorararlo. ¿Funcionará este tipo de modelo? ¿Llevaremos el ritmo vertiginoso de la innovación en la impresión 3D a la medicina y las prótesis? ¿O el miedo a los cuellos rotos significará que una carga regulatoria aumentada también caerá sobre nosotros? ¿Cuál es el futuro de la innovación de impresión 3D en esta área? Para Youbionic, el futuro significa «obtener retroalimentación y usar esto para mejorar los diseños» y «asociarse con inversionistas para ayudarnos a acelerar el progreso y alcanzar los objetivos más rápido.

 

 

 

 

Puedes aprender más y ordenar el suyo en el sitio web de Youbionic , eso si por unos 200 €.

Philips lanza una nueva tira de leds compatible con el ecosistema de Xiaomi


En efecto puede resultar sorprendente pero quizás intentando  cubrir el mercado asiático  e intentar competir  con otros  fabricantes,  la multinacional  Philips  ha introducido conjuntamente con Xiaomi  una nueva tira de leds no RGB   en Aliexpress  por una fracción de  lo que cuesta en Europa , pues  en efecto por unos 44€ se  puede adquirir no solo la  tira de leds RGB de 5mt  , sino  el driver  y el host para poderla controlar de forma remota(en Europa cuesta  sobre los 35€ únicamente una tira  2mt).

Ademas por si esta longitud fuese insuficiente    , desde el propio sitio   permiten ampliar la longitud  1 metros mas  añadiendo  esta tira    simplemente al otro extremo del la tira de 5mt .

La tira de leds de 5mt que trae  el host  conocida  con el nombre Xiao mi jia Smart light, incluye también  la fuente de alimentación para hacer  posible añadir incluso  1mt mas para llegar a  los 6mt    conectando  al final de cada  tira. También es posible conectar  mas unidades  de 5 o 1 mt hasta un máximo de  30  mt (para cubrir la demanda energética  para composiciones mayores se debería usar otro driver ).

Sin contar con las extensiones de 1 metro que podremos comprar para llegar hasta los citados 30 metros de longitud, la Philips ZhiYi Strip tiene un consumo de 6,7 W/m y deberemos alimentarla con tensiones de 220 a 240 voltios.

En todo caso ,lo normal pues son las  dos opciones disponibles por el momento : 5mt  o 6mt.

20181029_153929_050

La tira de leds por cierto no es RGB  ofreciendo tonos blancos  y amarillos pues solo incluye  leds  blancos  de tres tipos: W (white)  ,  C(Cyan)   y  RC (luz de noche)  , siendo posible modificar la  intensidad desde 2700K a 6500K   y por supuesto  también  subir   la intensidad de esta(con un mínimo de 30 lúmenes, siendo capaz de llagar hasta los 300 lúmenes)

20181029_153929_052

El driver  incluido en la tira de 5m cuenta con un modulo WiFi de tipo b/g/n a 2.4 GHz de modo  que como no podía ser menos esta tira de leds es controlable con nuestro smartphone por medio de la  app de Xiami Mi Home gracias a este modulo  siendo asi posible realizar  realizar escenas inteligentes con el resto de dispositivos del ecosistema Xiaomi, programar encendidos y apagados, cambiar su brillo y color con las escenas predefinidas o establecer nuestros propios ajustes favoritos

Lo que no esta tan claro al menos para el consumidor occidental es la automatizacion con el resto de dispositivos de del ecosistema Xioami pues por ejemplo solo soporta para su activación  por voz por el momento como idioma el chino .

 

20181029_153929_056

 

La tira led  cuenta con autoadhesivo 3M por una cara  y está ubicada dentro de un cuerpo elástico fabricado en PVC de alta resistencia a la temperatura, lo cual  no  hace posible   dividirla en partes mas pequeñas  como se hace con las convencionales que no llevan esta protección y llevan incluso lineas de corte  para hacer posible dividirlas para acomodarlas mas fácilmente por las esquinas , columnas ,etc.

No obstante,  este  recubrimiento translucido es  ideal  para ayudar a preservar física  y mecánicamente la tira  debido a  su  alta transmisión de la luz y las  propiedades anti-oxidantes para evitar su deterioro y coloración con el paso del tiempo.

 

Mas  información en https://es.aliexpress.com/item/Xiao-mi-jia-Smart-light-band-Smart-home-Phone-mi-home-App-wifi-light-strip-colorido/32950120069.html