tag:blogger.com,1999:blog-3975575859081483272024-02-23T23:32:13.119-08:00tyrodeveloperDesarrollo de SoftwareAnonymoushttp://www.blogger.com/profile/03067267817882414787noreply@blogger.comBlogger200125tag:blogger.com,1999:blog-397557585908148327.post-45067178468525720002023-08-23T13:01:00.008-07:002023-08-23T13:12:23.680-07:00ENTENDER IDENTITY_INSERT DE SQL SERVERHola tyros!, aqui de nuevo.
<br /><br />
Aqui les dejo una pequeña explicación de como funciona <b>IDENTITY_INSERT</b> de SQL Server
<br />
<br />
Es muy simple, SIRVE PARA ACTIVAR O DESACTIVAR la insercción automática de datos enteros-autonuméricos-auto incrementales. <br />
Imaginate qte tienes una tabla con un campo "id", el cual se inserta automáticamente a su siguiente número. Pues consiste simplemente en desactivarlo para que lo insertes tu y no el sistema.
<br /><br />
<b>NOTA IMPORTANTE: </b>No deberás tratar de insertar un "id" que ya exista o tendrás un error cuando se trate de un campo llave o tengas una restricción que impida duplicados.
<br /><br />
Entonces, solo asegurate de que el registro no exista previamente en la tabla.
<br /><br />
Aqui te dejo un ejemplo de código y el resultado en una imagen:
<br />
<pre><code class="sql">
use mydatabase
go
if exists(select 1 from INFORMATION_SCHEMA.TABLES where TABLE_NAME='test_identity' and TABLE_SCHEMA='dbo')
begin
drop table dbo.test_identity
end
go
create table dbo.test_identity
(
id int not null identity,
valor nvarchar(50),
activo bit not null constraint df_test_identity_activo default(1),
constraint pk_test_identity primary key(id)
)
go
insert into dbo.test_identity(valor) values('Primer registro, id automatico')
insert into dbo.test_identity(valor) values('Segundo registro, id automatico')
go
--desactivar identity
SET IDENTITY_INSERT dbo.test_identity ON
insert into dbo.test_identity(id,valor) values(25,'Tercer registgro, id asignado por mi')
insert into dbo.test_identity(id,valor) values(27,'Cuarto registro, id asignado por mi')
--activar identity
SET IDENTITY_INSERT dbo.test_identity OFF
insert into dbo.test_identity(valor) values('Quinto registro, id automatico')
--desactivar identity
SET IDENTITY_INSERT dbo.test_identity ON
insert into dbo.test_identity(id,valor) values(11,'Sexto registro, id INTERMEDIO asignado por mi')
--activar identity
SET IDENTITY_INSERT dbo.test_identity OFF
insert into dbo.test_identity(valor) values('Septimo registro, id automatico')
go
select * from dbo.test_identity
</code>
</pre>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsel37imH3FqwppSJkUyvIEmY1CNl0j_16ov7zvsutzo_POIeMxz2rv3N806574e64lVUxbKboHVs03j4R3nMJqL-mbO_p30czyU5-rudXxnpcYyx88HsQJSnBEMTMv_7CWIzBkthjDdR4T5qhyPZqPZ7yXAVFqW5aNa-cXWjk_omOvdynxZvIWzUUkWjo/s533/identity2.png" style="display: block; padding: 1em 0px; text-align: center;"><img alt="" border="0" data-original-height="230" data-original-width="533" height="277" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsel37imH3FqwppSJkUyvIEmY1CNl0j_16ov7zvsutzo_POIeMxz2rv3N806574e64lVUxbKboHVs03j4R3nMJqL-mbO_p30czyU5-rudXxnpcYyx88HsQJSnBEMTMv_7CWIzBkthjDdR4T5qhyPZqPZ7yXAVFqW5aNa-cXWjk_omOvdynxZvIWzUUkWjo/w640-h277/identity2.png" width="640" /></a></div>
La maravilla de esta funcionalidad es que se ajusta automáticamente el siguiente máximo autonumerico!
<br /><br>
Es decir, que si el "id" mas alto que insertaste de manera directa es un 100, el siguiente auto asignado sería el 101.
<br /><br>
Me encantó!
<br>
<br />
Saludos!
JUAN GABRIEL CASTILLOhttp://www.blogger.com/profile/16893991344593161749noreply@blogger.com0Ciudad Victoria, Tamaulipas, Mexico23.7369164 -99.14111539999999-4.5733174361788471 -134.2973654 52.047150236178844 -63.98486539999999tag:blogger.com,1999:blog-397557585908148327.post-78231772582169108422020-08-08T08:47:00.002-07:002020-08-08T08:47:59.324-07:00Convert .Key file to .PEM in PHPHi tyros, im answering a question from a follower.
Here is the way to convert a ".key" file to ".pem", using "phpseclib" in php
<pre>
<code class="php">
spl_autoload_register(function ($class_name) {
$url = str_replace("\\", "/", $class_name);
include_once __DIR__ . "/" . $url . ".php";
});
use phpseclib\Crypt\RSA as RSA;
use phpseclib\Crypt\Common\Keys\PKCS1 as PKCS1;
</code>
</pre>
<pre>
<code class="php">
public function KeyPEM() {
$rsa = new RSA();
$rsa->setPassword($this->password_key); //"$this->password_key": your .key file password
$rsa->load(file_get_contents($this->path_archivo_key)); //"$this->path_archivo_key": your path to .key file
$private = openssl_pkey_get_private($rsa->getPrivateKey(), $this->password_key);
$result = "";
openssl_pkey_export($private, $result);
return $result;
}
</code>
</pre>
Here you can get PHPSecLib: <a href="https://github.com/phpseclib/phpseclib" target="_blank">Get it here</a>
<br />
Note: "phpseclib" needs "ParagonIE" library to works correctly, <a href="https://github.com/paragonie/constant_time_encoding" target="_blank">Get it here</a>.
<br />
Thanks!JUAN GABRIEL CASTILLOhttp://www.blogger.com/profile/16893991344593161749noreply@blogger.com4tag:blogger.com,1999:blog-397557585908148327.post-28696033408271745472020-05-14T11:10:00.001-07:002020-05-14T11:10:24.479-07:00Error de instalación en la fase SAFE_OS con un error durante la operación BOOTHola tyros!, yo de nuevo, con un post muy corto.
<br /><br />
Sucede que tengo una laptop que tenia Windows 7, deseando instalar Windows 10; para que la licencia se active, hay que migrarlo. Si intentas una instalación limpia de Windows 10, no va a funcionar la activación; o al menos a mi no me funcionó. Primero debes hacer la migración y asegurarte que Windows 10 quede activado, entonces podrás realizar una instalación limpia sin problemas.
<br /><br />
Comencemos...
<br /><br />
<div></div><div>Tenía varios días tratando de instalar Windows 10 en una computadora con Windows 7. La instalación se detenía en el primer reinicio, aqui les dejo una imagen:</div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/proxy/AVvXsEg_VFQTTcmNfExYjwGyENWDV2HWgu97UJxBn_V1v3KniVXFgKvRCLks7xRT-IkrvHIjmUFkN8pvCQKo-gHqeMqBHuqxGiSe78BqVDDTWNryRFSGOJdlsk7TKYKYacvIyC5ooAEYCjFw3CJUbeZd16iyNEIgxOT0MLebqOcD4vQwHvZIXiwpXWKhVtGQhIy4lanSnmCgBCSWRRZwt6BLWfkelQ=s2048" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="768" data-original-width="1024" src="https://blogger.googleusercontent.com/img/proxy/AVvXsEg_VFQTTcmNfExYjwGyENWDV2HWgu97UJxBn_V1v3KniVXFgKvRCLks7xRT-IkrvHIjmUFkN8pvCQKo-gHqeMqBHuqxGiSe78BqVDDTWNryRFSGOJdlsk7TKYKYacvIyC5ooAEYCjFw3CJUbeZd16iyNEIgxOT0MLebqOcD4vQwHvZIXiwpXWKhVtGQhIy4lanSnmCgBCSWRRZwt6BLWfkelQ=s320" width="320" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Instalación congelada</td></tr></tbody></table>
Luego de forzar el apagado (dejando presionado el botón de encendido), me aparecía el siguiente mensaje:
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/proxy/AVvXsEgVDphGGOvO6W_Gvf8k0KMG4dvMfcDgfbCcwZMaHKbzViNIqCytvklsPt1sfbIHzCOJLUlGNmpXKdyTjwlm6Fi5ZrhKESA9VVvzSrSoOvnnN0M3MKbzung2U2yPv5UV0-_OQ97sFxnvMrxgC8DUb6qjlt6MxFbYIfTL0Mx_tasHU5iqZWf53itXtaCVyLxdrepd_K27cBWYW5EcEkdlJ8Ny3w=s2048" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="763" data-original-width="1024" src="https://blogger.googleusercontent.com/img/proxy/AVvXsEgVDphGGOvO6W_Gvf8k0KMG4dvMfcDgfbCcwZMaHKbzViNIqCytvklsPt1sfbIHzCOJLUlGNmpXKdyTjwlm6Fi5ZrhKESA9VVvzSrSoOvnnN0M3MKbzung2U2yPv5UV0-_OQ97sFxnvMrxgC8DUb6qjlt6MxFbYIfTL0Mx_tasHU5iqZWf53itXtaCVyLxdrepd_K27cBWYW5EcEkdlJ8Ny3w=s320" width="320" /></a></div><div><br /></div>
Solución:
<br /><br />
Quitar la tarjeta WiFi "Broadcom". No basta quitar el controlador ni desactivarla, eso ya lo intenté. Es necesario abrir el equipo y quitarla fisicamente. Quizá sea una tarea un poco incomoda, pero es la solución.
<br />
En mi caso, se trata de una laptop SAMSUNG RP-RV411-A01MX.
<br />
NOTA IMPORTANTE: Durante los siguientes primeros reinicios, habrá algunas veces que se vuelva a congelar como durante la instalación. Hay que forzar el apagado, luego inicia normal.JUAN GABRIEL CASTILLOhttp://www.blogger.com/profile/16893991344593161749noreply@blogger.com1tag:blogger.com,1999:blog-397557585908148327.post-18510118512960155202020-04-28T08:11:00.000-07:002020-04-28T08:12:47.100-07:00Mandar Email Outlook/Hotmail con C# 2020Hola tyros, ya parezco cometa, pero heme aquí con un tema nuevo.<br />
<br />
No quiero entretenerlos mucho con una intro, se que quieren ir al punto, así que aquí les dejo el código y espero que les sirva. Abajo del código algunas consideraciones sobre lo que podría fallar.<br />
<pre><code class="c#">
//Configuración del Mensaje
MailMessage mail = new MailMessage();
mail.IsBodyHtml = true;
mail.From = new MailAddress("mail@outlook.com", "Nombre para mostrar", Encoding.UTF8);
//Aquí ponemos el asunto del correo
mail.Subject = "Prueba de enviar correos electrónicos";
//Aquí ponemos el mensaje que incluirá el correo
mail.Body = "Hola, este es un ejemplo de enviar mensajes";
//Especificamos a quien enviaremos el Email, no es necesario que sea Outlook, puede ser cualquier otro proveedor
string[] to = "juan@gmail.com, pedro@hotmail.com, jose@yahoo.com"; //Correos inventados
foreach (string item in to)
{
mail.To.Add(new MailAddress(item));
}
//Configuración SMTP
SmtpClient smtpClient = new SmtpClient("smtp.live.com", 587);
smtpClient.UseDefaultCredentials = false;
smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
smtpClient.EnableSsl = true;
smtpClient.Credentials = new NetworkCredential("mail@outlook.com", "p@ssword", "smtp.live.com");
smtpClient.Send(mail);
</code>
</pre><br />
<strong>¿Que podría salir mal?</strong><br />
<br />
Es probable que recibas un error del servidor SMTP indicándote que estás tratando de enviar SPAM. Si te sucede, solo debes ingresar al correo electrónico a través del explorador y seguir una serie de pasos para autenticarte. En mi caso, se me solicitó verificar a través de un mensaje SMS.JUAN GABRIEL CASTILLOhttp://www.blogger.com/profile/16893991344593161749noreply@blogger.com1tag:blogger.com,1999:blog-397557585908148327.post-66117218279943720052020-01-08T08:19:00.003-08:002020-01-08T08:19:51.335-08:00Conectar WiFi o Ethernet con Script (Windows)Hola tyros!<br />
<br />
Debido a mi trabajo, necesito conectarme o desconectarme entre redes. Incluso cambiar mi dirección IP. Para alguien como yo, esa tarea resulta tediosa. Y es que tengo hasta cinco opciones diferentes de conexión.<br />
Hubo un día que me resulto estresante pues me fue necesario cambiar de red mas de veinte veces en mi jornada laboral de ocho horas. Decidí investigar un poco sobre el tema y aquí les comparto el script que utilizo para conectarme a una red y la forma de utilizarlo:<br />
<br />
Lo primero. Es necesario conocer las conexiones disponibles de nuestra PC:<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsrzVOZGNen-Ljz2C8vg2_tDDoZoz7eKEVFHKjSGZCaLITAK58Rm6u8toBmcst7aIeFJvI2yNGZiVKvzNin5N5EWb6ZC-qxfawAP0yeltLlsBlF7E9uGvziNxB9hL7tlYHZCWP-WrUrUfh/s1600/NEtwork.png" imageanchor="1"><img border="0" data-original-height="276" data-original-width="792" height="224" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsrzVOZGNen-Ljz2C8vg2_tDDoZoz7eKEVFHKjSGZCaLITAK58Rm6u8toBmcst7aIeFJvI2yNGZiVKvzNin5N5EWb6ZC-qxfawAP0yeltLlsBlF7E9uGvziNxB9hL7tlYHZCWP-WrUrUfh/s640/NEtwork.png" width="640" /></a><br />
<br />
Script para conectarme a una red con IP Fija:<br />
<pre><code>
netsh interface ip set address "Ethernet" static 172.28.24.28 255.255.255.0 172.28.24.254
netsh interface ip set dns "Ethernet" static 172.28.24.12
netsh interface ip set dns "Ethernet" static 172.28.24.11 index=2
</code>
</pre><br />
Donde <br />
"Ethernet" es el nombre de mi adaptador<br />
"172.28.24.28" es la direccion IP que deseo asignarle<br />
"255.255.255.0" es la mascara de sub red<br />
"172.28.24.254" es la puerta de enlace<br />
"172.28.24.12" es el servidor DNS 1<br />
"172.28.24.11" es el servidor DNS 2<br />
<br />
En caso de que desees conectarte a una Red con IP dinámica, por ejemplo a un Wifi, este seria el script:<br />
<pre><code>
netsh interface ip set address "Wi-Fi" dhcp
netsh interface ip set dnsservers "Wi-Fi" source=dhcp
</code>
</pre><br />
Donde:<br />
"Wi-Fi" es el nombre de mi adaptador<br />
<br />
<b>¿Como utilizar o ejecutar el script?</b><br />
<br />
Guarda el script como ".bat" y ejecutalo con privilegios de Administrador:<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtgF0YKcZ0TsJP8pCJ1SJvvdIRm5a24BAcuwkKopaJy63vR75f8HhdMCUiayr9xUhKV3S-P87bNfEKxPbOOdLSx8PCbnN8tv69j1x09QzCKW9hBkqoLtgNWs8F3RzGQy6fmwSmstLbCURF/s1600/Script+confgurar+red.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtgF0YKcZ0TsJP8pCJ1SJvvdIRm5a24BAcuwkKopaJy63vR75f8HhdMCUiayr9xUhKV3S-P87bNfEKxPbOOdLSx8PCbnN8tv69j1x09QzCKW9hBkqoLtgNWs8F3RzGQy6fmwSmstLbCURF/s400/Script+confgurar+red.png" width="400" height="178" data-original-width="517" data-original-height="230" /></a><br />
<br />
Esto es todo por hoy tyros, espero que les sea de utilidad. <br />
<br />
<br />
JUAN GABRIEL CASTILLOhttp://www.blogger.com/profile/16893991344593161749noreply@blogger.com1tag:blogger.com,1999:blog-397557585908148327.post-30043569100868776332020-01-06T06:44:00.000-08:002020-01-06T06:44:05.704-08:00Copiar texto de paginas web protegidasHola tyros!!<br />
<br />
Hace apenas unos minutos estaba leyendo un articulo en una pagina de noticias. Como soy del tipo de personas que le investiga las fuentes, quise investigar un poco mas sobre un tema particular de la noticia. Así que intenté el clásico "copiar & pegar". Seleccioné el texto que quería copiar, lo copié, y sucedió esto:<br />
<br />
<pre><code>
Para que Usted pueda tener acceso a este material deberá de contar con previa autorización por HT Comunicación, S.A. de C.V., por tanto queda prohibida la publicación, retransmisión, distribución, venta, edición y cualquier otro uso de los contenidos. Si está interesado en el uso de este contenido por favor póngase en contacto con HT Agencia al +52 834 1340296. Muchas gracias
</code>
</pre><br />
Como mi intención no era realizar un acto de piratería, sino, mas bien investigar mas acerca de la noticia, empecé a buscar a manera de tener acceso al contenido. Hice lo siguiente:<br />
<br />
Paso 1: Ubicar la parte del contenido que deseo copiar y sombrearlo:<br />
<br />
<a href="https://4.bp.blogspot.com/-kZnz84AUsGU/XhNCvgdJzEI/AAAAAAAAGsg/Ek7A91HtAk8JZFYAw3OrkQIBpc7iRjswACLcBGAsYHQ/s1600/Aseguradora%2BCHUBB.png" imageanchor="1"><img border="0" data-original-height="78" data-original-width="678" height="73" src="https://4.bp.blogspot.com/-kZnz84AUsGU/XhNCvgdJzEI/AAAAAAAAGsg/Ek7A91HtAk8JZFYAw3OrkQIBpc7iRjswACLcBGAsYHQ/s640/Aseguradora%2BCHUBB.png" width="640" /></a><br />
<br />
Paso 2: Hacer clic derecho y seleccionar la opción "Inspeccionar":<br />
<a href="https://3.bp.blogspot.com/-1LwUOO6pgnk/XhNDI34qslI/AAAAAAAAGso/8dl2uryGmQosfTIBepiFjJPcfwVYGWeCwCLcBGAsYHQ/s1600/Inspeccionar.png" imageanchor="1"><img border="0" data-original-height="173" data-original-width="685" height="161" src="https://3.bp.blogspot.com/-1LwUOO6pgnk/XhNDI34qslI/AAAAAAAAGso/8dl2uryGmQosfTIBepiFjJPcfwVYGWeCwCLcBGAsYHQ/s640/Inspeccionar.png" width="640" /></a><br />
<br />
Esto hará que se muestre el codigo de la pagina, el cual incluye el texto que estoy tratando de copiar:<br />
<br />
Paso 3: Copiar lo que necesito:<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqk0J_WnCqMRS35vmwGBQ2x6usC_Ch4FycNSCY2sIE3epe1ZbP8eCaWJO6WiwZ7IG5WqCCkvhtaTae8RNYQfbjyLwRrS5KTSTgfpikiTU5rnT6rmXcDpCE2hEqDCxPZzK1t09DJ6uFg3YR/s1600/Si+permite+copiar.png" imageanchor="1"><img border="0" data-original-height="407" data-original-width="1018" height="252" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqk0J_WnCqMRS35vmwGBQ2x6usC_Ch4FycNSCY2sIE3epe1ZbP8eCaWJO6WiwZ7IG5WqCCkvhtaTae8RNYQfbjyLwRrS5KTSTgfpikiTU5rnT6rmXcDpCE2hEqDCxPZzK1t09DJ6uFg3YR/s640/Si+permite+copiar.png" width="640" /></a><br />
<br />
<b>¿Pero que pasa si el sitio tiene bloqueado el clic derecho o no me deja seleccionar nada de texto?</b><br />
<br />
Hay sitios web que han ido mucho mas lejos en su deseo de impedir que su contenido sea copiado. Para casos extremos, soluciones extremas. Será necesario deshabilitar el Javascript para el sitio en cuestión.<br />
<br />
Los pasos siguientes aplican para Google Chrome:<br />
<br />
1. En la esquina superior derecha, haz clic en "⋮" y selecciona "Configuración > Configiración acanzada > Congiguración del sitio > Javascript" No te recomiendo deshabilitar Javascript, es mejor agregar únicamente el sitio que te esta dando problemas.<br />
<br />
<br />
JUAN GABRIEL CASTILLOhttp://www.blogger.com/profile/16893991344593161749noreply@blogger.com0tag:blogger.com,1999:blog-397557585908148327.post-18360784859520735172019-11-26T10:47:00.000-08:002019-11-26T10:47:22.449-08:00Codificar y Decodificar String en Base64 sin rutinas JavascriptHola tyros!!<br />
<br />
Desde siempre he sido de la idea de crear mis propias rutinas de código o utilizar existentes de código abierto. Una necesidad básica de cualquier desarrollador web es convertir cadenas de texto en formato Base64. La necesidad se va a presentar, las razones de la necesidad pueden variar, pero tarde o temprano siempre nos vemos orillados a ello.<br />
<br />
Algunas de las razones que se me ocurren, pueden detonar la necesidad son las siguientes:<br />
<br />
<ul><li>Ocultar parámetros GET o POST a la vista haciéndolos ilegibles.</li>
<li>Poder enviar algunos caracteres especiales que podrían afectar envíos via GET</li>
<li>Se ve cool</li>
</ul><br />
Pues bien, sucede que en internet hay muchas rutinas Javascript que prometen Codificar y decodificar cadenas de texto en Base64. No pretendo desacreditar a nadie, simplemente que hoy siendo 26 de Noviembre del 2019 y desde hace ya algo de tiempo, tenemos una forma corta de hacer este trabajo.<br />
<br />
No quiero robarme los créditos originales de este tema, así que solo voy a mencionarlo y les dejo el enlace para que puedan ver la documentación original.<br />
<br />
Sin mas...<br />
<br />
Codificar:<br />
<br />
<pre><code class="php">
window.btoa("texto a codificar");
</code>
</pre><br />
Decodificar:<br />
<br />
<pre><code class="php">
window.btoa("dGV4dG8gYSBjb2RpZmljYXI=");
</code>
</pre><br />
Para mas detalles, visita el siguiente enlace:<br />
<h4><a href="https://developer.mozilla.org/es/docs/Web/API/WindowBase64/Base64_codificando_y_decodificando" target="_blank">Base64 codificando y decodificando</a></h4>JUAN GABRIEL CASTILLOhttp://www.blogger.com/profile/16893991344593161749noreply@blogger.com0tag:blogger.com,1999:blog-397557585908148327.post-39511757132266982512019-11-11T07:00:00.000-08:002019-11-11T07:00:01.677-08:00Leer nodos XML Factura ElectronicaHola tyros!, hoy quiero compartirles la forma que utilizo para leer los nodos de un XML; específicamente el XML de la factura electrónica 3.3 del SAT México. <br />
<br />
Para este ejemplo vamos a leer varios datos del XML, como son <br />
<br />
<br />
<ul><li>Folio</li>
<li>Serie</li>
<li>Sub Total</li>
<li>Total</li>
</ul><br />
Luego leeremos, también, el nodo "Impuestos" con todo su contenido.<br />
<br />
En este ejemplo asumiremos que el XML contiene todos los elementos que estamos buscando, en caso de que tu XML no los contenga, haz las adaptaciones necesarias para evitar errores relacionados con datos nulos.<br />
<br />
Comencemos cargando el XML:<br />
<pre><code class="cs">
XmlDocument doc = new XmlDocument();
doc.Load(xml);//Leer el XML
</code>
</pre><br />
Luego, requerimos agregar un manejador de "namespaces", esto nos permitirá acceder a los nodos con el prefijo "cfdi"<br />
<pre><code class="cs">
//agregamos un Namespace, que usaremos para buscar que el nodo no exista:
XmlNamespaceManager nsm = new XmlNamespaceManager(doc.NameTable);
nsm.AddNamespace("cfdi", "http://www.sat.gob.mx/cfd/3");
</code>
</pre><br />
El siguiente paso es acceder al nodo "Comprobante", para poder obtener los valores de sus atributos<br />
<br />
<pre><code class="cs">
//Accedemos a nodo "Comprobante"
XmlNode nodeComprobante = doc.SelectSingleNode("//cfdi:Comprobante", nsm);
</code>
</pre><br />
A continuacion, obtenemos los valores que necesitamos:<br />
<pre><code class="cs">
//Obtener Folio, Serie, SubTotal y Total
string varFolio = nodeComprobante.Attributes["Folio"].Value;
string varSerie = nodeComprobante.Attributes["Serie"].Value;
string varSubTotal = nodeComprobante.Attributes["SubTotal"].Value;
string varTotal = nodeComprobante.Attributes["Total"].Value;
Response.Write(String.Format("Serie: {0}, Folio: {1}, SubTotal: {2}, Total: {3}", varSerie, varFolio, varSubTotal, varTotal));
</code>
</pre><br />
Ahora vamos a obtener el nodo "Impuestos" con todo su contenido incluido. Para hacemos lo siguiente:<br />
<br />
<pre><code class="cs">
//Obtener impuestos
XmlNode nodeImpuestos = nodeComprobante.SelectSingleNode("cfdi:Impuestos", nsm);
</code>
</pre><br />
Ahora obtenemos los totales de los impuestos:<br />
<pre><code class="cs">
//Obtenemos TotalImpuestosRetenidos y TotalImpuestosTrasladados
string varTotalImpuestosRetenidos = nodeImpuestos.Attributes["TotalImpuestosRetenidos"].Value;
string varTotalImpuestosTrasladados = nodeImpuestos.Attributes["TotalImpuestosTrasladados"].Value;
</code>
</pre><br />
Para la siguiente parte utilizaremos bucles/ciclos para leer la información. <br />
<br />
Veamos la parte de las retenciones y los traslados:<br />
<pre><code class="cs">
//Obtener impuestos retenidos
Response.Write("Retenciones: <br />");
XmlNode nodeImpuestosRetenciones = nodeImpuestos.SelectSingleNode("cfdi:Retenciones", nsm);
foreach (XmlNode node in nodeImpuestosRetenciones.SelectNodes("cfdi:Retencion", nsm)) {
Response.Write(String.Format("Impuesto: {0}, Importe: {1} <br />",
node.Attributes["Impuesto"].Value,
node.Attributes["Importe"].Value));
}
//Obtener impuestos trasladados
Response.Write("Traslados: <br />");
XmlNode nodeImpuestosTraslados = nodeImpuestos.SelectSingleNode("cfdi:Traslados", nsm);
foreach (XmlNode node in nodeImpuestosTraslados.SelectNodes("cfdi:Traslado", nsm))
{
Response.Write(String.Format("Impuesto: {0}, Importe: {1} <br />",
node.Attributes["Impuesto"].Value,
node.Attributes["Importe"].Value));
}
</code>
</pre><br />
Esto seria todo, por si las dudas, aquí les dejo el código completo:<br />
<pre><code class="cs">
//Factura
XmlDocument doc = new XmlDocument();
doc.Load(xml);//Leer el XML
//agregamos un Namespace, que usaremos para buscar que el nodo no exista:
XmlNamespaceManager nsm = new XmlNamespaceManager(doc.NameTable);
nsm.AddNamespace("cfdi", "http://www.sat.gob.mx/cfd/3");
//Accedemos a nodo "Comprobante"
XmlNode nodeComprobante = doc.SelectSingleNode("//cfdi:Comprobante", nsm);
//Obtener Folio, Serie, SubTotal y Total
string varFolio = nodeComprobante.Attributes["Folio"].Value;
string varSerie = nodeComprobante.Attributes["Serie"].Value;
string varSubTotal = nodeComprobante.Attributes["SubTotal"].Value;
string varTotal = nodeComprobante.Attributes["Total"].Value;
Response.Write(String.Format("Serie: {0}, Folio: {1}, SubTotal: {2}, Total: {3}", varSerie, varFolio, varSubTotal, varTotal));
//Obtener impuestos
XmlNode nodeImpuestos = nodeComprobante.SelectSingleNode("cfdi:Impuestos", nsm);
//Obtenemos TotalImpuestosRetenidos y TotalImpuestosTrasladados
string varTotalImpuestosRetenidos = nodeImpuestos.Attributes["TotalImpuestosRetenidos"].Value;
string varTotalImpuestosTrasladados = nodeImpuestos.Attributes["TotalImpuestosTrasladados"].Value;
//Obtener impuestos retenidos
Response.Write("Retenciones: <br />");
XmlNode nodeImpuestosRetenciones = nodeImpuestos.SelectSingleNode("cfdi:Retenciones", nsm);
foreach (XmlNode node in nodeImpuestosRetenciones.SelectNodes("cfdi:Retencion", nsm)) {
Response.Write(String.Format("Impuesto: {0}, Importe: {1} <br />",
node.Attributes["Impuesto"].Value,
node.Attributes["Importe"].Value));
}
//Obtener impuestos trasladados
Response.Write("Traslados: <br />");
XmlNode nodeImpuestosTraslados = nodeImpuestos.SelectSingleNode("cfdi:Traslados", nsm);
foreach (XmlNode node in nodeImpuestosTraslados.SelectNodes("cfdi:Traslado", nsm))
{
Response.Write(String.Format("Impuesto: {0}, Importe: {1} <br />",
node.Attributes["Impuesto"].Value,
node.Attributes["Importe"].Value));
}
</code>
</pre><br />
Espero que les sea de utilidad. Saludos!<br />
<br />
JUAN GABRIEL CASTILLOhttp://www.blogger.com/profile/16893991344593161749noreply@blogger.com10tag:blogger.com,1999:blog-397557585908148327.post-62559250540809302012019-10-23T15:59:00.000-07:002019-10-23T15:59:24.190-07:00Configurar correo electrónico en Android 9.0Hola tyros!, yo de nuevo.<br />
<br />
Justo hoy, por la mañana me vi en la necesidad de configurar el correo electrónico en un dispositivo Android 9.0, luego de hacer un tutorial paso a paso, me di cuenta que sería muy útil para muchos. Así que aquí se los dejo, tal cual:<br />
<br />
Nota importante: Este tutorial es utilizando el coreo electronico de GoDaddy con el servidor "secureserver.net"<br />
<br />
1. Abre GMAIL:<br />
<a href="https://2.bp.blogspot.com/-rzU0mLwiUtg/XbDU66bcPCI/AAAAAAAAGk0/waGeObmLCCcXCrsodUGa8CkxC3jo6Yr1QCLcBGAsYHQ/s1600/Screenshot_1571847988.png" imageanchor="1" ><img border="0" src="https://2.bp.blogspot.com/-rzU0mLwiUtg/XbDU66bcPCI/AAAAAAAAGk0/waGeObmLCCcXCrsodUGa8CkxC3jo6Yr1QCLcBGAsYHQ/s320/Screenshot_1571847988.png" width="180" height="320" data-original-width="900" data-original-height="1600" /></a><br />
<br />
1<sup>a</sup>. OPCIONAL, Presiona ENTENDIDO (Si es la primera ves que abres GMAIL)<br />
<a href="https://2.bp.blogspot.com/-UQpPFQ58BkA/XbDVP7-JSoI/AAAAAAAAGk8/QqwCMoVx0ksb0a2qUwttTuB-mGixPRu8gCLcBGAsYHQ/s1600/Screenshot_1571848173.png" imageanchor="1" ><img border="0" src="https://2.bp.blogspot.com/-UQpPFQ58BkA/XbDVP7-JSoI/AAAAAAAAGk8/QqwCMoVx0ksb0a2qUwttTuB-mGixPRu8gCLcBGAsYHQ/s320/Screenshot_1571848173.png" width="180" height="320" data-original-width="900" data-original-height="1600" /></a><br />
<br />
1<sup>b</sup>. OPCIONAL, Presiona IR A GMAIL(Si es la primera ves que abres GMAIL)<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbx9yMRnEuKjMsMhOn34LxyDRAfCMjMlJSRwbsOqKmBmzFyqg2wbZhBQ4qK-sycJKOjrqRUTBLdF87quOfrlRDzUrn-Y1Rr7Kl9Pbs23ul7smxhv9qCgqkP0ASF2Rrvk-5BYGBfdUTD44W/s1600/Screenshot_1571848316.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbx9yMRnEuKjMsMhOn34LxyDRAfCMjMlJSRwbsOqKmBmzFyqg2wbZhBQ4qK-sycJKOjrqRUTBLdF87quOfrlRDzUrn-Y1Rr7Kl9Pbs23ul7smxhv9qCgqkP0ASF2Rrvk-5BYGBfdUTD44W/s320/Screenshot_1571848316.png" width="180" height="320" data-original-width="900" data-original-height="1600" /></a><br />
<br />
2. Abre el menu Opciones (Arriba izquierda):<br />
<a href="https://2.bp.blogspot.com/-hwORYX872FI/XbDVt1eKDuI/AAAAAAAAGlI/Yl4Mj8FDxHk5l_C0w3djaZ1R5SShN0yawCLcBGAsYHQ/s1600/Screenshot_1571848432.png" imageanchor="1" ><img border="0" src="https://2.bp.blogspot.com/-hwORYX872FI/XbDVt1eKDuI/AAAAAAAAGlI/Yl4Mj8FDxHk5l_C0w3djaZ1R5SShN0yawCLcBGAsYHQ/s320/Screenshot_1571848432.png" width="180" height="320" data-original-width="900" data-original-height="1600" /></a><br />
<br />
3. Tap/Clic/Toca en la flecha abajo, para expandir:<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8QRzMhX9MSQ1Nz1uulG1X1eUuZywlcR0sIRjYypreE8u3mMlb_yKYaBSaBATM5eE9fbeS0KETLqMdAO5cumec4W4T1SUghJAPm0aJEpsBYAcqi15VAuVbcNStbspJyINQ-liHHiJEOFZ9/s1600/Screenshot_1571848550.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8QRzMhX9MSQ1Nz1uulG1X1eUuZywlcR0sIRjYypreE8u3mMlb_yKYaBSaBATM5eE9fbeS0KETLqMdAO5cumec4W4T1SUghJAPm0aJEpsBYAcqi15VAuVbcNStbspJyINQ-liHHiJEOFZ9/s320/Screenshot_1571848550.png" width="180" height="320" data-original-width="900" data-original-height="1600" /></a><br />
<br />
4. Selecciona “Agregar Cuenta”<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJy7mKsbnbYKsEIgg4S1O4A-HgSO6Z7ITZ1uz5TCgS32prUWSq8-TLIK9oIQHW9pkyv6oAMuabfNBp7ln2Xhcamr1ZhPqz147L1xpcewpLD_zlESh72y2ojaRnhHI4EToDi-4kvvuQEbuC/s1600/Screenshot_1571848661.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJy7mKsbnbYKsEIgg4S1O4A-HgSO6Z7ITZ1uz5TCgS32prUWSq8-TLIK9oIQHW9pkyv6oAMuabfNBp7ln2Xhcamr1ZhPqz147L1xpcewpLD_zlESh72y2ojaRnhHI4EToDi-4kvvuQEbuC/s320/Screenshot_1571848661.png" width="180" height="320" data-original-width="900" data-original-height="1600" /></a> <br />
<br />
5. Selecciona “Otra”:<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiu43Fd6IOLmrewifyzecPbPTfUvuNo11fBSzEckzQSlp9Sj7uDrZD0ZerBri7iKqvMc8-6D5O-Yhw3RSsgToh9lp17EYwylvwtRKYd5S54QMJTUezpDSclKbNQKqhixhvBFAwO6qi6gjHY/s1600/Screenshot_1571848887.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiu43Fd6IOLmrewifyzecPbPTfUvuNo11fBSzEckzQSlp9Sj7uDrZD0ZerBri7iKqvMc8-6D5O-Yhw3RSsgToh9lp17EYwylvwtRKYd5S54QMJTUezpDSclKbNQKqhixhvBFAwO6qi6gjHY/s320/Screenshot_1571848887.png" width="180" height="320" data-original-width="900" data-original-height="1600" /></a><br />
<br />
6. Escribe tu correo COMPLETO y pulsa SIGUIENTE:<br />
<a href="https://4.bp.blogspot.com/-lVuyaeIrMzE/XbDXw5Kk8oI/AAAAAAAAGlw/RpsEQHuSIG01u_u_GGFz2aRdZqBwdkL8ACLcBGAsYHQ/s1600/Screenshot_1571849321.png" imageanchor="1" ><img border="0" src="https://4.bp.blogspot.com/-lVuyaeIrMzE/XbDXw5Kk8oI/AAAAAAAAGlw/RpsEQHuSIG01u_u_GGFz2aRdZqBwdkL8ACLcBGAsYHQ/s320/Screenshot_1571849321.png" width="180" height="320" data-original-width="900" data-original-height="1600" /></a><br />
<br />
7. Selecciona IMAP:<br />
<a href="https://1.bp.blogspot.com/-YFpYOsdeFP8/XbDYBa-RREI/AAAAAAAAGl4/n2cNAKogaCU_-4f6wvkCzotRq9eTO3hKACLcBGAsYHQ/s1600/Screenshot_1571849436.png" imageanchor="1" ><img border="0" src="https://1.bp.blogspot.com/-YFpYOsdeFP8/XbDYBa-RREI/AAAAAAAAGl4/n2cNAKogaCU_-4f6wvkCzotRq9eTO3hKACLcBGAsYHQ/s320/Screenshot_1571849436.png" width="180" height="320" data-original-width="900" data-original-height="1600" /></a><br />
<br />
8. Escribe tu contraseña y pulsa SIGUIENTE:<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfksa9i0IX59sX3jAwPyaY8y2iNk7T67g-lOdnbdusGPsSrHzGFUdCeywiSdu6GdY6_qj2IKMsnY9eUY21r1Xu6nanSbyCLtgRZienZidHFcYp5oqV6beA4lGSPQY53VfzcSupNT1ESupC/s1600/Screenshot_1571849627.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfksa9i0IX59sX3jAwPyaY8y2iNk7T67g-lOdnbdusGPsSrHzGFUdCeywiSdu6GdY6_qj2IKMsnY9eUY21r1Xu6nanSbyCLtgRZienZidHFcYp5oqV6beA4lGSPQY53VfzcSupNT1ESupC/s320/Screenshot_1571849627.png" width="180" height="320" data-original-width="900" data-original-height="1600" /></a><br />
<br />
9. Establece el nombre del servidor de entrada:<br />
En este ejemplo: <br />
<pre>imap.secureserver.net</pre><br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8Nl8RsrnVzblsBNkszdAAsMN0CeTC0Qbo6YMNvneihpyYhE_3FH5JwLXEj7wz4tgtulHkZrqx6aqk7NS61StTzrL2gvalL-kUDlrK_NeayEuw02C6Ma6_Km3-GIx2RWmBn3MI1gSZXH2X/s1600/Screenshot_1571849835.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8Nl8RsrnVzblsBNkszdAAsMN0CeTC0Qbo6YMNvneihpyYhE_3FH5JwLXEj7wz4tgtulHkZrqx6aqk7NS61StTzrL2gvalL-kUDlrK_NeayEuw02C6Ma6_Km3-GIx2RWmBn3MI1gSZXH2X/s320/Screenshot_1571849835.png" width="180" height="320" data-original-width="900" data-original-height="1600" /></a><br />
<br />
Va a salirte una pantalla de advertencia...<br />
<br />
9<sup>a</sup>. Seleccionar Info detallada:<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhq-MzUSuJAcHdlVsEZd6T2heb92RTItPITJclj96v_K_ynQoRbhCjqDWp2vtl52-RZmWiJbGCF6u2_opQ4fuvHGsBaTkMuJ4yHeHNL1loSLoAV7bme1MKijyViJ3C2A6vkIMlfSdRj5fZs/s1600/Screenshot_1571850050.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhq-MzUSuJAcHdlVsEZd6T2heb92RTItPITJclj96v_K_ynQoRbhCjqDWp2vtl52-RZmWiJbGCF6u2_opQ4fuvHGsBaTkMuJ4yHeHNL1loSLoAV7bme1MKijyViJ3C2A6vkIMlfSdRj5fZs/s320/Screenshot_1571850050.png" width="180" height="320" data-original-width="900" data-original-height="1600" /></a><br />
<br />
9<sup>b</sup>. Ir hasta el fin del texto:<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjErK3OdiOkd8eT0uZvx6wnVc60idd9Qr1TAhpQJMXz7a484ciBe2JmJTwvUDKFgFz18vY1Vc8GRAX3om9D33ay-6_gxeRMZThRkJ3xKadT4H6dLZJV_CGy-l0-zFKIDBV9XRuLV9EekAJJ/s1600/Screenshot_1571850072.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjErK3OdiOkd8eT0uZvx6wnVc60idd9Qr1TAhpQJMXz7a484ciBe2JmJTwvUDKFgFz18vY1Vc8GRAX3om9D33ay-6_gxeRMZThRkJ3xKadT4H6dLZJV_CGy-l0-zFKIDBV9XRuLV9EekAJJ/s320/Screenshot_1571850072.png" width="180" height="320" data-original-width="900" data-original-height="1600" /></a><br />
<br />
9<sup>c</sup>. Selecciona CONTINUAR DE TODOS MODOS:<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjO3Gi3puyW-HcE-jJq7I1MjJcPmx07cdAeCMT2FlhV_PQouIak4vSWN5-CDYuDPuq2HbMe8kbWMPNO1ihLwq5jNtSHL_bBYADvN0B3QFC6EB6_0KeUtyW9ooqulLiFG5vsQ58N49pP99aE/s1600/Screenshot_1571850084.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjO3Gi3puyW-HcE-jJq7I1MjJcPmx07cdAeCMT2FlhV_PQouIak4vSWN5-CDYuDPuq2HbMe8kbWMPNO1ihLwq5jNtSHL_bBYADvN0B3QFC6EB6_0KeUtyW9ooqulLiFG5vsQ58N49pP99aE/s320/Screenshot_1571850084.png" width="180" height="320" data-original-width="900" data-original-height="1600" /></a><br />
<br />
10. Establece el nombre del servidor de salida y selecciona SIGUIENTE:<br />
<br />
En este ejemplo: <br />
<pre>smtpout.secureserver.net</pre><br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh40BStI-iedg6cFKzbFLemdx_GymZW89LsbjMBwo9SChcj19rzmGHgWzF57S3z_kt43L5BeRp3mTQx6pM13lKjLlnN_a6O1X9e6Xw2TWgSRzZDNpdMBzjqHO-uyz_zXwPQgum0av-K1hwt/s1600/Screenshot_1571850192.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh40BStI-iedg6cFKzbFLemdx_GymZW89LsbjMBwo9SChcj19rzmGHgWzF57S3z_kt43L5BeRp3mTQx6pM13lKjLlnN_a6O1X9e6Xw2TWgSRzZDNpdMBzjqHO-uyz_zXwPQgum0av-K1hwt/s320/Screenshot_1571850192.png" width="180" height="320" data-original-width="900" data-original-height="1600" /></a><br />
<br />
11. Pulsa SIGUIENTE:<br />
<a href="https://3.bp.blogspot.com/-Cah211dmkbI/XbDZ8jONJNI/AAAAAAAAGm0/hKm6TzMvji4K0KuYc5gkoOlK4Fn5_3TrACLcBGAsYHQ/s1600/Screenshot_1571850577.png" imageanchor="1" ><img border="0" src="https://3.bp.blogspot.com/-Cah211dmkbI/XbDZ8jONJNI/AAAAAAAAGm0/hKm6TzMvji4K0KuYc5gkoOlK4Fn5_3TrACLcBGAsYHQ/s320/Screenshot_1571850577.png" width="180" height="320" data-original-width="900" data-original-height="1600" /></a><br />
<br />
12. Establece el nombre a mostrar:<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieeL3wSvF_JZpuQck2qfun4t8n8aSTNwZuIXgax_yjm_DMK-L4iCbcF9HZVIjbtBHX4Fy_2-Tgxc6Fcu2xyJVhBYJvw-SrLqr8SXX3tOLyBDWjebmQ1DmX_Ky6dF88CrOBmJ41EGbYNZiR/s1600/Screenshot_1571850700.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieeL3wSvF_JZpuQck2qfun4t8n8aSTNwZuIXgax_yjm_DMK-L4iCbcF9HZVIjbtBHX4Fy_2-Tgxc6Fcu2xyJVhBYJvw-SrLqr8SXX3tOLyBDWjebmQ1DmX_Ky6dF88CrOBmJ41EGbYNZiR/s320/Screenshot_1571850700.png" width="180" height="320" data-original-width="900" data-original-height="1600" /></a><br />
<br />
LISTO!<br />
<br />
FELICIDADES, TU CORREO ELECTRÓNICO HA SIDO CONFIGURADO<br />
<br />
JUAN GABRIEL CASTILLOhttp://www.blogger.com/profile/16893991344593161749noreply@blogger.com0tag:blogger.com,1999:blog-397557585908148327.post-46491158177254592312019-08-26T06:16:00.001-07:002019-08-26T06:16:37.552-07:00Crear - Create PFX/PKCS12 In PHPHola tyros, yo de nuevo, esta vez para mostrarles como crear el PFX/PKCS12 en PHP.<br />
<br />
Antes un poco de teoría: Un PFX/PKCS12 es un tipo de archivo que sirve para almacenar uno o varios cettificados. En mi caso, se trata de los archivos .cer y .key.<br />
<br />
Sin mas, aqui les dejo el código PHP:<br />
<pre><code class="php">
<?php
error_reporting(E_ALL & ~E_DEPRECATED);
ini_set("display_errors", 1);
/*
* Un PFX/PKCS12 es un tipo de archivo que sirve para almacenar uno o varios cettificados.
* En este caso, se trata de los archivos .cer y .key.
*/
/**
* Description of CertificadoPFX
*
* @author gabriel.castillo
*/
class CertificadoPFX {
//put your code here
function __construct($cerPEM, $keyPEM) {
$this->cer_pem = $cerPEM;
$this->key_pem = $keyPEM;
}
private $cer_pem = "";
private $key_pem = "";
public function Generar($password){
//REVISAR!!!
$result = null;
openssl_pkcs12_export($this->cer_pem, $result, $this->key_pem, $password);
return $result;
}
}
</code>
</pre><br />
Como usar este codigo:<br />
<br />
<pre><code class="php">
<?php
error_reporting(E_ALL & ~E_DEPRECATED);
date_default_timezone_set("America/Mexico_City");
ini_set("display_errors", 1);
include_once("app-code/CertificadoPFX.php");
$certPFX = new CertificadoPFX("asdassd3234dsd45... (Archivo CER en formato PEM)","dsfs3dssd23wd3...(Archivo KEY en Formato PEM)");
</code>
</pre>JUAN GABRIEL CASTILLOhttp://www.blogger.com/profile/16893991344593161749noreply@blogger.com1tag:blogger.com,1999:blog-397557585908148327.post-48559450502814487292019-02-27T08:05:00.000-08:002019-02-27T08:05:22.787-08:00La pantalla gris de Mac OSDurante muchos años vivimos sufriendo la espantosa pantalla azul del windows. Cualquiera que fuese la versión, nadie se escapa de vivir la experiencia al menos una vez en la vida de uso de un computador con el sistema operativo de Microsoft.<br />
Incluso, tuve una computadora a la que le sucedía tan seguido que llegué a acostumbrarme.<br />
Por cuestiones laborales empecé a utilizar una MacBook Pro. Sinceramente me resultó una maravilla; mas allá de su diseño, por su rendimiento.<br />
PERO resulta que no todo es miel sobre hojuelas. Van varias veces que me sucede algo extraño: La misteriosa pantalla Gris.<br />
Lamentablemente no he logrado tomarle una buena fotografía, y es que dura tan solo apenas unos segundos. <br />
Aquí les dejo la mejor foto que he logrado tomar:<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0cfJE7cKNihW0CtA5Sc1XrIkwyAWYFUfcDAS-fGl4F3wjCtmnmHFfGVM9IAJXw7hrVukes30t8k9N90Tj9DkEr71HOtGqN67FsRRZqSfG_IqQc1OwQOfo0yiLbIf4__QEfpQ1bcdJgb1T/s1600/Pantalla+Gris+MAC+OS.jpeg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0cfJE7cKNihW0CtA5Sc1XrIkwyAWYFUfcDAS-fGl4F3wjCtmnmHFfGVM9IAJXw7hrVukes30t8k9N90Tj9DkEr71HOtGqN67FsRRZqSfG_IqQc1OwQOfo0yiLbIf4__QEfpQ1bcdJgb1T/s320/Pantalla+Gris+MAC+OS.jpeg" width="320" height="240" data-original-width="1600" data-original-height="1200" /></a><br />
<br />
Esta situación me hace reflexionar acerca de poner a Apple por encima de Microsoft. Ambas son empresas que tienen que sortear diversas situaciones que van desde contratar al mejor personal posible, cumplir tiempos de entrega, balance entre calidad y precio, etc.<br />
En lo que a mi respecta, utilizo equipos de diferentes marcas. Siempre adquiriendo lo mejor, de acuerdo a mis posibilidades. Utilizo al máximo mis computadoras, pues obtengo mis ingresos haciendo trabajos con ellas.<br />
Acostumbro a tener muchas aplicaciones abiertas, por ejemplo en windows: Visual Studio, Android Studio, emuladores, Gestores de Bases de datos, exploradores web, etc; todo al mismo tiempo. En Mac, Net Beans, Outlookm Word, Excel, Skype, MySQLWoekbench, GIMP, iMovie, etc. Todo al mismo tiempo en ambas plataformas. Es de esperarse que fallen.<br />
Creo, en mi experiencia que Microsoft ha mejorado bastante con Windows 10, y que, por lo visto con la misteriosa pantalla gris de MacOS, ya no es posible decir cuál es mejor. Recomendaría, a quienes me preguntasen sobre el asunto, elegir según el tipo de trabajo que requieran hacer, ya que llegamos a un punto en el que tachar de malo o bueno sin considerar un contexto estaría basado en prejuicios, mas que en realidades objetivas.<br />
<br />
Es de esperarse que Apple corregirá el error, también es de esperarse que yo seguiré exigiéndole mucho a la MacBook, pues para eso la he adquirido.JUAN GABRIEL CASTILLOhttp://www.blogger.com/profile/16893991344593161749noreply@blogger.com0tag:blogger.com,1999:blog-397557585908148327.post-85366395384696848382018-12-31T09:45:00.000-08:002017-06-03T16:46:12.305-07:00Bienvenido<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="https://2.bp.blogspot.com/-px-9nPQQXpM/WSRN9LfygmI/AAAAAAAACmY/Rnc5J24YZcIb_hiuNvrjJUTqcXjuAfuPACPcB/s1600/tyrodeveloper_icono.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img alt="tyrodeveloper" border="0" data-original-height="400" data-original-width="400" height="200" src="https://2.bp.blogspot.com/-px-9nPQQXpM/WSRN9LfygmI/AAAAAAAACmY/Rnc5J24YZcIb_hiuNvrjJUTqcXjuAfuPACPcB/s200/tyrodeveloper_icono.png" title="" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">tyrodeveloper</td></tr>
</tbody></table>Hola tyrodeveloper, bienvenido a tu sitio de programación. Apenas vamos comenzando y espero que, con tu apoyo, este pueda ser el blog mas popular de desarrollo de aplicaciones .net, Java y PHP.<br />
<br />
La intención de este blog es publicar soluciones a problemas muy frecuentes de desarrolladores novatos (tyros), proporcionando una base sobre la cual construir aplicaciones escalables y fáciles de entender.<br />
<br />
En la medida de mis posibilidades, trataré de publicar proyectos desarrollados en diferentes lenguajes de programación. Esto para satisfacer las mentes mas exigentes, a aquellos que no se conforman con hacer las cosas, sino, que van en la búsqueda de la perfección de sus capacidades.<br />
Trato al máximo de evitarme demasiada explicación, que si bien es importante, es mejor para sus propias mentes encontrar las respuestas por si mismos.<br />
<br />
<b>¿Quieres apoyarme a seguir subiendo publicaciones?</b><br />
<br />
Hay varias formas de hacerlo, ¡y sin pagar un centavo! Puedes hacer +1, compartir mis publicaciones o regresar de vez en cuando para ver si hay algo nuevo que pueda ser interesante para ti. Tu visita me ayuda y me alienta. Si tienes un blog o página, puedes poner enlaces a mis publicaciones.<br />
<br />
<b>¿Quieres que publique algo en particular?</b><br />
<br />
Tengo años y años como programador. Me he enfrentado a infinidad de retos y tengo tanto código que no se que hacer con él. El problema para mi siempre está en decidir que si y que no publicar. Si tienes alguna inquietud, puedes mandarme un correo electrónico a <b>tyrodeveloper@gmail.com</b>, si tengo código relacionado con tu inquietud, trataré de hacer una publicación al respecto.<br />
<br />
Sobre este punto tengo que aclarar que <b>NUNCA REGALO CÓDIGO FUENTE DE NADA</b>. Mi intención al subir publicaciones es la de servir de guía inicial para que desarrolles <b>POR TI MISMO</b> el proyecto y aprendas de tus errores, y si es posible, encuentres una forma mejor de hacer lo mismo.<br />
<br />
Gracias por tu visita, espero que encuentres lo que estás buscando... <br />
<br />
<b><br />
</b> <b>Temas de Interés</b> <br />
<ul><li><a href="http://tyrodeveloper.blogspot.com/2009/08/crear-un-punto-de-venta-1-de-10.html">Punto de Venta C#</a></li>
<li><a href="http://www.tyrodeveloper.com/2012/03/punto-de-venta-visual-basic-parte-1.html">Punto de Venta VB - Español</a> / <a href="http://www.tyrodeveloper.com/2012/03/point-of-sale-in-visual-basic-part-1.html">Point Of Sale VB - English</a></li>
<li><a href="http://www.tyrodeveloper.com/2011/07/creacion-de-un-sistema-de-almacen-con-c.html">Sistema de Almacén con C#</a> / <a href="http://www.tyrodeveloper.com/2012/03/sistema-de-almacen-visual-basic-parte-1.html">Visual Basic</a></li>
<li><a href="http://www.tyrodeveloper.com/2011/09/crear-un-punto-de-venta-con-aspnet-y.html">Punto de Venta C# ASP.Net</a></li>
<li><a href="http://developerscripts.blogspot.mx/">Developer Scripts</a></li>
<li><a href="http://www.tyrodeveloper.com/2012/09/gantt-chart-control.html">Gantt Chart Control</a></li>
</ul><h1><br />
Descarga los cursos:<br />
<br />
<a href="http://adf.ly/1IRRZB">Visual Basic</a><br />
<br />
<a href="http://adf.ly/1IRRgy">Visual C#</a><br />
<br />
Sígueme: <a href="http://www.twitter.com/tyrodeveloper" target="_blank">@tyrodeveloper</a></h1><br />
<b>¡Hacer clic en +1 No te Cuesta Nada!</b>Anonymoushttp://www.blogger.com/profile/03067267817882414787noreply@blogger.com0tag:blogger.com,1999:blog-397557585908148327.post-43939363531818072932018-11-15T10:36:00.000-08:002018-11-15T10:36:37.221-08:00macOS Mojave Gasta Mucha batería en modo reposoHola tyros!<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-tCFnoQS83Ls/W-28d3ssMjI/AAAAAAAAEuc/HyUV-BNdjQ80XMZdW6sQ6vYYJScnopqVgCLcBGAs/s1600/macos-mojave-features-610x403.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://2.bp.blogspot.com/-tCFnoQS83Ls/W-28d3ssMjI/AAAAAAAAEuc/HyUV-BNdjQ80XMZdW6sQ6vYYJScnopqVgCLcBGAs/s400/macos-mojave-features-610x403.jpg" width="400" height="264" data-original-width="610" data-original-height="403" /></a></div>Tengo tres laptops. Una HP Con windows 10 pro y dos Apple con macOS Mojave.<br />
<br />
Desde siempre, en el caso de Windows, ha sido mi costumbre apagarla cuando no voy a utilizarla. Por costumbre nunca la pongo en modo reposo, ni siquiera he tenido la experiencia de su funcionamiento.<br />
<br />
No es así el caso con Apple. Mi primera laptop apple, fué una Macbook Air 2011. Me acostumbré a no apagarla ni reiniciarla en semanas. De hecho, las veces que la reiniciaba era principalmente por que así me lo exigiera una actualización.<br />
<br />
Hace unas dos semanas decidí instalar Mojave en mis dos laptops Apple. Creo que me dejé llevar por la novedad y el deseo de tener lo mas nuevo. <br />
<br />
Cual fué mi sorpresa cuando al siguiente dia, luego de un uso normal y ponerla en modo reposo con el 100% de la carga de batería, me doy cuenta que tiene un 80% de carga. Estaba acostumbrado a que a lo mucho, la encontraba con un 95%, luego de no usarla por varios días. Sin embargo, estoy hablando de apenas 20 horas de no usarla.<br />
<br />
La solución hasta este momento, un tanto incómoda, ha sido apagar la computadora luego de usarla. Ni modo, haré esta, al menos hasta que Apple corrija el problema.JUAN GABRIEL CASTILLOhttp://www.blogger.com/profile/16893991344593161749noreply@blogger.com0tag:blogger.com,1999:blog-397557585908148327.post-44372389579453666182018-09-19T07:00:00.000-07:002018-09-19T07:00:10.011-07:00Eliminar tablas base de datos SQL ServerHola tyros!<br />
<br />
Yo de nuevo, Hoy voy a mostrarles como eliminar todas las tablas de una base de datos SQL Server.<br />
<br />
NOTA IMPORTANTE: Probado con SQL Server 2014, Para versiones anteriores, requerirá cambios mínimos.<br />
<br />
Este es el código:<br />
<pre><code class="sql">
use tu_base_de_datos
go
declare @schemaName nvarchar(100), @tableName varchar(500), @sql nvarchar(max), @schemaToDrop nvarchar(100)
set @schemaToDrop = 'dbo'
--Tablas a omitir
create table ##tmp_tables(
id int not null identity(1,1),
n_schema nvarchar(100) default(N'dbo'),
n_table nvarchar(100)
)
insert into ##tmp_tables(n_table) values('table1')
insert into ##tmp_tables(n_table) values('table2')
insert into ##tmp_tables(n_table) values('table13')
declare cur cursor
for select s.[name] as n_schema , p.[name] as n_table from sys.objects p join sys.schemas s on p.schema_id=s.schema_id where p.type_desc='USER_TABLE' and s.name=@schemaToDrop and p.name collate Latin1_General_CI_AI not in(select n_table collate Latin1_General_CI_AI from ##tmp_tables)
open cur
fetch next from cur into @schemaName, @tableName
while @@fetch_status = 0
begin
set @sql = concat('drop table [',@schemaName,'].[',@tableName,']')
exec(@sql)
fetch next from cur into @schemaName, @tableName
end
close cur
deallocate cur
drop table ##tmp_tables
</code>
</pre>JUAN GABRIEL CASTILLOhttp://www.blogger.com/profile/16893991344593161749noreply@blogger.com0tag:blogger.com,1999:blog-397557585908148327.post-65816400844754063312018-09-18T07:00:00.000-07:002018-09-18T07:00:02.784-07:00Eliminar todos los procedimientos almacenados SQL ServerHola tyros!<br />
<br />
Yo de nuevo, Hoy voy a mostrarles como eliminar todos los prcedimientos almacenados de una base de datos SQL Server.<br />
<br />
NOTA IMPORTANTE: Probado con SQL Server 2014, Para versiones anteriores, requerirá cambios mínimos.<br />
<br />
Este es el código:<br />
<pre><code class="sql">
use tu_base_de_datos
go
declare @procName varchar(500), @schemaName nvarchar(100), @sql nvarchar(max)
declare cur cursor
for select p.[name] as n_proc, s.[name] as n_schema from sys.procedures p join sys.schemas s on p.schema_id=s.schema_id
open cur
fetch next from cur into @procName, @schemaName
while @@fetch_status = 0
begin
set @sql = concat('drop procedure [',@schemaName,'].[',@procName,']')
exec(@sql)
fetch next from cur into @procName, @schemaName
end
close cur
deallocate cur
</code>
</pre>JUAN GABRIEL CASTILLOhttp://www.blogger.com/profile/16893991344593161749noreply@blogger.com0tag:blogger.com,1999:blog-397557585908148327.post-20526300786072018752018-09-17T07:00:00.000-07:002018-09-17T07:00:01.640-07:00Eliminar todos los constraints SQL ServerHola tyros!<br />
<br />
Yo de nuevo, Hoy voy a mostrarles como eliminar todos los constraints de una base de datos SQL Server.<br />
<br />
NOTA IMPORTANTE: Probado con SQL Server 2014, Para versiones anteriores, requerirá cambios mínimos.<br />
<br />
Este es el código:<br />
<pre><code class="sql">
use tu_base_de_datos
go
declare @schemaName varchar(100), @tableName nvarchar(100), @constraintName nvarchar(100), @sql nvarchar(max)
declare cur cursor
for select s.name, o.name, fk.name from sys.foreign_keys fk join sys.objects o on o.object_id=fk.parent_object_id join sys.schemas s on s.schema_id = o.schema_id
open cur
fetch next from cur into @schemaName, @tableName, @constraintName
while @@fetch_status = 0
begin
set @sql = concat('alter table [',@schemaName,'].[',@tableName,'] drop constraint ', @constraintName)
exec(@sql)
fetch next from cur into @schemaName, @tableName, @constraintName
end
close cur
deallocate cur
</code>
</pre>JUAN GABRIEL CASTILLOhttp://www.blogger.com/profile/16893991344593161749noreply@blogger.com0tag:blogger.com,1999:blog-397557585908148327.post-75280187391581441702018-09-14T10:19:00.001-07:002018-09-14T10:41:13.040-07:00Convertir clase en XML con PHPHola tyros!, yo de nuevo.<br />
<br />
Hoy voy a compartirles mi código PHP para convertir una clase en XML. Es muy fácil de usar y de extender. Aquí les dejo el código:<br />
<pre><code class="php">
<?php
/*
* Class to convert Class to XML
*/
/**
* Description of ClassToXML
*
* @author tyrodeveloper
*/
class ClassToXML {
private $xml = null;
function Convert($object) {
//Create DOMDocument
$this->xml = new DOMDocument('1.0', "UTF-8");
//Add the Class Element
$xmlElement = $this->xml->createElement(get_class($object));
//Add XSI
$domAttribute = $this->xml->createAttribute('xmlns:xsi');
$domAttribute->value = 'http://www.w3.org/2001/XMLSchema-instance';
$xmlElement->appendChild($domAttribute);
//Add the root Element
$this->xml->appendChild($xmlElement);
//Start Add elements
$this->ReadProperty($xmlElement, $object);
//Create the XML
return $this->xml->saveXML();
}
private function ReadProperty($xmlElement, $object) {
foreach ($object as $key => $value) {
if ($value != null) {
if (is_object($value)) {
$element = $this->xml->createElement($key);
$this->ReadProperty($element, $value);
$xmlElement->AppendChild($element);
} elseif (is_array($value)) {
$this->ReadProperty($xmlElement, $value);
} else {
$this->AddAttribute($xmlElement, $key, $value);
}
}
}
}
private function AddAttribute($xmlElement, $key, $value) {
$domAttribute = $this->xml->createAttribute($key);
$domAttribute->value = $value;
$xmlElement->appendChild($domAttribute);
}
}
</code>
</pre><br />
Ahora, veamos como usarla. <br />
<br />
Primero, una clase PHP:<br />
<pre><code class="php">
<?php
/*
* Permisos a la carpeta donde se van a grabar los archivos
* Paso 1:
* sudo chown -R _www:staff /Users/gabriel.castillo/Sites/ejemplos/archivos
* Paso 2:
* sudo chmod -R 755 /Users/gabriel.castillo/Sites/ejemplos/archivos
*/
/**
* Description of Persona
*
* @author tyrodeveloper
*/
class Persona {
public function __construct() {
$this->Domicilio = new Domicilio();
}
public $nombre = null;
public $apellidos = null;
public $telefono = null;
public $Domicilio = null;
}
/**
* Description of Persona
*
* @author tyrodeveloper
*/
class Domicilio {
public $calle = null;
public $numero = null;
}
</code>
</pre><br />
Ahora, una página PHP:<br />
<pre><code class="php">
<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<?php
error_reporting(E_ALL & ~E_DEPRECATED);
ini_set("display_errors", 1);
include_once("app-code/Persona.php");
include_once("app-code/ClassToXML.php");
?>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h1>Convertir clase en XML</h1>
<form action="clase-a-xml.php?convertir=1" method="post">
Nombre:<br />
<input type="text" name="txtNombre" required="true" />
<br />
Apellidos:<br />
<input type="text" name="txtApellidos" />
<br />
Telefono:<br />
<input type="text" name="txtTelefono" />
<br />
Calle:<br />
<input type="text" name="txtCalle" />
<br />
Numero:<br />
<input type="text" name="txtNumero" />
<br /><br />
<input type="submit" value="Convertir" />
</form>
<hr />
<?php
$convertir = null;
if ($_GET) {
$convertir = $_GET["convertir"];
}
if ($convertir == 1) {
if ($_POST) {
$persona = new Persona();
$persona->nombre = $_POST["txtNombre"];
$persona->apellidos = $_POST["txtApellidos"];
$persona->telefono = $_POST["txtTelefono"];
//Domicilio
$domicilio = new Domicilio();
$domicilio->calle = $_POST["txtCalle"];
$domicilio->numero = $_POST["txtNumero"];
$persona->Domicilio = $domicilio;
//Generar xml
$fileName = "./archivos/xml.xml"; //Nombre del archivo XML
$convertidor = new ClassToXML();
file_put_contents($fileName, $convertidor->Convert($persona));
echo "<a href='clase-a-xml.php'>Volver a Generar XML</a>";
echo "<br />";
echo "<a href='$fileName' target='_blank'>Abrir XML</a>";
}
}
?>
</body>
</html>
</code>
</pre>Video de Ejemplo:<br />
<div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/pd-gEznLD-E/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/pd-gEznLD-E?feature=player_embedded" width="320"></iframe></div><br />
JUAN GABRIEL CASTILLOhttp://www.blogger.com/profile/16893991344593161749noreply@blogger.com0tag:blogger.com,1999:blog-397557585908148327.post-29479026312191769402018-07-18T08:46:00.000-07:002018-07-18T08:46:00.694-07:00Lo que hay detrás del código QR de WhatsAppHola tyros!, yo de nuevo.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgF9mm2u8tubBbTbbouRV2I7ih_X2J-rT-x-v1maRqvD-QsaUp32fIG1qdCPOt098SfQwgPCM3hNl7MrgbbLAWfETjWkLBhAFJ1HMs4Mm-s_e7EkOUp3r9h0OusoNSmTtO6utIWvqZsZSDJ/s1600/codigo+QR+WhatsApp+1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="274" data-original-width="277" height="197" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgF9mm2u8tubBbTbbouRV2I7ih_X2J-rT-x-v1maRqvD-QsaUp32fIG1qdCPOt098SfQwgPCM3hNl7MrgbbLAWfETjWkLBhAFJ1HMs4Mm-s_e7EkOUp3r9h0OusoNSmTtO6utIWvqZsZSDJ/s200/codigo+QR+WhatsApp+1.png" width="200" /></a></div>Hace apenas unos minutos intenté ingresar a <a href="https://web.whatsapp.com/">WhatsApp Web</a>. Estaba tan ocupado que me tardé un poco, y en ese lapso, justo antes de entrar a la aplicación, me pregunté a mi mismo: ¿Mi mismo, que esconde ese código?<br />
Y es que la mayoría de las veces, solamente ingresamos. De hecho, considerando que tengo varios años usando Whats App, es la primera vez que me hago esa pregunta. Y, como mi otro yo, es super curioso; decidimos, invertir unos cuantos minutos para investigar.<br />
<br />
Buscando en internet, di con un sitio llamado <a href="https://zxing.org/w/decode.jspx">ZXing Decoder Online </a> en donde se puede subir la imagen que contenga el código QR; y luego de unos segundos, muestra el resultado de la decodificación.<br />
Así que me lancé a la eventura. Primero ingresé a Whats App Web, para tomar una captura de pantalla. Luego, subí la imagen a la página que ya les mencioné. Y este fué el resultado:<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6Ut3svDHmKv5OALg0O35RZN9LA1eEwlVElJL6uyTKc-xyq7ASaTF6oEFTWTnRtvb5GxIrYJtWznoyvs83-eITfUNLuRafXG7Qlqa8EeDVo_wC4uca_Jqv7O0sZstM2wyfQPI46swNz6Mb/s1600/codigo+QR+WhatsApp+decoded.png" imageanchor="1"><img border="0" data-original-height="449" data-original-width="1136" height="252" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6Ut3svDHmKv5OALg0O35RZN9LA1eEwlVElJL6uyTKc-xyq7ASaTF6oEFTWTnRtvb5GxIrYJtWznoyvs83-eITfUNLuRafXG7Qlqa8EeDVo_wC4uca_Jqv7O0sZstM2wyfQPI46swNz6Mb/s640/codigo+QR+WhatsApp+decoded.png" width="640" /></a><br />
<br />
<pre><code class="xml">
1@N+SCjLjXNJqJLcc5QfepM//ajVF1Ijp+5bpQ/H8VpOdFdZi9KdJTckkm,z5WlG1KL3kMhgfS/pRaXBpWChySsz6Yo26w10KZjeCM=,j/hviG2p6d/vH2+Z3zY8kA==
</code>
</pre><br />
Después, traté de descifrarlo con un decodificador <a href="https://www.base64decode.org/">Base64</a>, sin éxito. Lo cuál significa que se trata de un código encriptado que solo puede descifrar Whats App.<br />
<br />
Quizá alguien mas pueda ir mas lejos. Por ahora sigo muy ocupado.JUAN GABRIEL CASTILLOhttp://www.blogger.com/profile/16893991344593161749noreply@blogger.com4tag:blogger.com,1999:blog-397557585908148327.post-55930811272591426352018-06-15T07:29:00.000-07:002018-06-15T07:29:34.294-07:00Agregar Addenda a archivo XML con C# y VBHola tyros!, yo de nuevo.<br />
<br />
En esta ocasión voy a mostrarles como agregar una addenda sencilla a nuestro archivo XML. Comencemos...<br />
<br />
Tengo el siguiente archivo XML:<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQpCiv7y1lKAvNIiBrGk7pLhRry0XNZ0OmTzaHRzfYpCuq19-WbWFqg2zzm-epV2VzqAdtkwNEwvC9S82_qcW1Eiiw4s_yuVwPiyl-pB1Ccp_bH-mGG0AXhUemR1M8B4DPXtvUOQb1pQVM/s1600/xml-sin-addenda.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" data-original-height="321" data-original-width="532" height="385" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQpCiv7y1lKAvNIiBrGk7pLhRry0XNZ0OmTzaHRzfYpCuq19-WbWFqg2zzm-epV2VzqAdtkwNEwvC9S82_qcW1Eiiw4s_yuVwPiyl-pB1Ccp_bH-mGG0AXhUemR1M8B4DPXtvUOQb1pQVM/s640/xml-sin-addenda.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">XML Con Addenda</td></tr>
</tbody></table><br />
<br />
Lo quiero así:<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCF852uJtxS_ts2BP6CIzxOeK0uperlrXFqUdym0NCYaox-nkubnvXPbfYAgwC7_KKY5hoHNsBmdk7ZbtEL6ousiLeXWbKzrrl_J4yE_kkWWBlpAwJbVfcAUfLtRIPubjJZyfMG0hEQvou/s1600/xml-con-addenda.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="320" data-original-width="606" height="337" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCF852uJtxS_ts2BP6CIzxOeK0uperlrXFqUdym0NCYaox-nkubnvXPbfYAgwC7_KKY5hoHNsBmdk7ZbtEL6ousiLeXWbKzrrl_J4yE_kkWWBlpAwJbVfcAUfLtRIPubjJZyfMG0hEQvou/s640/xml-con-addenda.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">XML Con Addenda</td></tr>
</tbody></table><br />
<br />
Código C#<br />
<pre><code class="cs">
string xml = "ruta_archivo.xml";
XmlDocument doc = new XmlDocument();
doc.Load(xml);//Leer el XML
XmlElement addenda = doc.CreateElement("cfdi:Addenda", "http://www.sat.gob.mx/cfd/3");
XmlElement infoAdicional = doc.CreateElement("cfdi:InfoAdicional", "http://www.sat.gob.mx/cfd/3");
infoAdicional.SetAttribute("OrdenCompra", "1234");
addenda.AppendChild(infoAdicional);
doc.DocumentElement.AppendChild(addenda);
doc.Save(xml);//Guardar XML
</code>
</pre><br />
Código VB<br />
<pre><code class="vb">
Dim xml As String = "ruta_archivo.xml"
Dim doc As New XmlDocument()
doc.Load(xml) ''Leer el XML
Dim addenda As XmlElement = doc.CreateElement("cfdi:Addenda", "http://www.sat.gob.mx/cfd/3")
Dim infoAdicional As XmlElement = doc.CreateElement("cfdi:InfoAdicional", "http://www.sat.gob.mx/cfd/3")
infoAdicional.SetAttribute("OrdenCompra", "1234")
addenda.AppendChild(infoAdicional)
doc.DocumentElement.AppendChild(addenda)
doc.Save(xml) ''Guardar XML
</code>
</pre><br />
No olvides agregar la referencia a "System.Xml"<br />
<br />
Hasta pronto!!JUAN GABRIEL CASTILLOhttp://www.blogger.com/profile/16893991344593161749noreply@blogger.com5tag:blogger.com,1999:blog-397557585908148327.post-38134867715841647562018-05-21T05:00:00.000-07:002018-05-21T05:00:05.741-07:00Mi teoría sobre el Hackeo al SPEIHola tyros!<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhf1jryOAv5pnGcv4bBG66gxPrKuK3YjSxpmaF9WTXydk6fMFXiJVzwompVmIDUKQKiI7dNLvM8jVAdAdIIlSCw-w39t0ODoIbqJvPK_yvvBBEWU3ZZUb2sb1Sca1-HWtzLgnVL8ZIKIvV3/s1600/hacker.jpeg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhf1jryOAv5pnGcv4bBG66gxPrKuK3YjSxpmaF9WTXydk6fMFXiJVzwompVmIDUKQKiI7dNLvM8jVAdAdIIlSCw-w39t0ODoIbqJvPK_yvvBBEWU3ZZUb2sb1Sca1-HWtzLgnVL8ZIKIvV3/s320/hacker.jpeg" width="320" height="213" data-original-width="640" data-original-height="426" /></a></div>Ya son varios los días en que el Hackeo al Sistema de Pagos Electrónicos Interbancarios (SPEI) se encuentra entre las noticias mas polulares de los principales medios electrónicos. Y no es para menos. <br />
La mayoría mencionan entre líneas "el dinero de los clientes está seguro"; y yo pienso para mi mismo "eso espero". Pues en estas circunstancias, no se que es mas seguro entre tener mi dinero en el colchón o en un banco. <br />
La noticia se ha vuelto tema de conversación entre mis compañeros de trabajo, quienes comenzaron a hacerme preguntas al respecto. A continuación, una lista de preguntas que me hicieron y, a modo resumen, las respuestas que di:<br />
<br />
<b>¿Quien pudo hacer eso?</b><br />
<br />
Alguien (uno o varios) que conoce el sistema SPEI.<br />
<br />
<b>¿Como cuantas personas?</b><br />
<br />
Tecnicamente solo se necesita una, pero se necesitan varios actores materiales haciendo varias funciones.<br />
<br />
<b>¿Que funciones?</b><br />
<br />
Se requiere una persona que oprima un botón, para ejecutar el programa o script, alguien dentro de los bancos afectados que distraiga al personal de sistemas, o mejor aún, alguien de entre el personal de sistemas. <br />
<br />
<b>¿Cómo lo hicieron?</b><br />
<br />
Realmente no se como lo hicieron. Se me ocurre que se aprovecharon alguna vulnerabilidad del sistema. Esta vulnerabilidad puede consistir en errores de confirmación. Por ejemplo: banco origen envia dinero, intermediario (Banco de México) lo recibe y le informa a banco origen que el dinero fue recibido, banco destino no recibe dinero; pero banco origen asume que el dinero ya fué depositado a la cuenta del destinatario.<br />
<br />
<b>¿Eso significa que el problema es del Banco de México?</b><br />
<br />
Si yo fuera el Banco de México, lo negaría.<br />
<br />
<b>¿Hackearon al Banco de México?</b><br />
<br />
Hackearon todo el sistema. Como rector, el Banco de México es el responsable. Simplemente no puede lavarse las manos y apuntar a ciertos bancos.<br />
<br />
<b>¿Cómo lo hicieron?</b><br />
<br />
Ya les dije que no se como lo hicieron, pero tengo esta teoría:<br />
<br />
Imagínense a dos personas y sus respectivos bancos, teniendo al Banco de México como intermediario: Alba y Pedro. <br />
Alba hace un pago a Pedro. El banco de Alba deposita el dinero en el Banco de México, informándole que es para Pedro. El Banco de México le informa al banco de Alba que tiene el dinero, así que el banco de Alba le hace el cargo a su cuenta. Alba piensa que Pedro ya tiene el dinero, o que lo recibirá a mas tardar el siguiente dia hábil, luego de las 12pm.<br />
Mientras tanto, el Banco de México envía el dinero al banco de Pedro, pero el dinero no llega a la cuenta de Pedro, sinó a una cuenta fantasma que está en control del Hacker, quien ha creado, en diferentes bancos, muchas cuentas fantasma que puede controlar.<br />
Cuando la cuenta fantasma recibe el depósito, inmediatamente hace otra transferencia a otra cuenta fantasma, en otro banco. El proceso se repite desde el comienzo, pero ahora con cuentas fantasma. De tal manera que se hacen transacciones que se desvian en algun punto intermedio.<br />
Imaginense una cuenta fantasma enviando dinero a otro banco, que termina depositando el dinero a otra cuenta fantasma, distimta a la que originalmente estaba dirigida la transacción. Este proceso puede repetirse cientos de veces, hasta que se pierda el rastro del dinero.<br />
<br />
<b>¿Que hacer ahora?</b><br />
<br />
Dejar de usar SPEI inmediatamente, y usar el sistema anterior. Estar al pendiente, pues el sistema anterior es antiguo. Por alguna razón migraron a SPEI, los problemas que quisieron evitar están latentesl junto con los actuales.<br />
<br />
<br />
<br />
<br />
JUAN GABRIEL CASTILLOhttp://www.blogger.com/profile/16893991344593161749noreply@blogger.com0tag:blogger.com,1999:blog-397557585908148327.post-14015980373920029192018-05-18T05:00:00.000-07:002018-05-18T05:00:03.255-07:00Calculadora de Honorarios 2018 (México)Hola tyros!<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8zS7KAkLxCVEjzYfnaYuQnSDiSa66aosdvfKfhL9fiUlpIgz9E1c7ZWA5i4QfDR7aqxoYnHh9iK8b8LYu3BRC4vTnPftdBbXkuvj1sAb5UWReK3fMpQ2TgQQjYo2gSJWP309yRzrdffOl/s1600/calculator-385506_640.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8zS7KAkLxCVEjzYfnaYuQnSDiSa66aosdvfKfhL9fiUlpIgz9E1c7ZWA5i4QfDR7aqxoYnHh9iK8b8LYu3BRC4vTnPftdBbXkuvj1sAb5UWReK3fMpQ2TgQQjYo2gSJWP309yRzrdffOl/s320/calculator-385506_640.jpg" width="320" height="189" data-original-width="640" data-original-height="377" /></a></div>Si cobras por honorarios y, como yo, sufres por que no sabes como hacer tu recibo, no te vayas, tengo una posible solución a tus problemas.<br />
Hay ocasiones en las que nos ponemos de acuerdo con nuestro cliente, de tal manera que el absorba los impuestos correspondientes. <br />
Hacer un recibo de este tipo es un verdadero problema. Pues, en mi caso, hice muchisimos intentos a prueba y error sin lograr nada. Quedé con mi cliente que le iba a cobrar $4,000 (cuatro mil pesos) libres para mi. Pero no sabía como hacer el recibo, pues siempre me tocaba pagar IVA. Es decir, que sin importar lo que hiciera, cuando generaba la factura, no lograba sacar $4,000 pesos libres.<br />
Sufrí, me las ingenié, y lo logré. <br />
Primero lo hice en excel, luego decidí migrarlo a PHP y subirlo a internet.<br />
Y es que en Internet hay muy buenos ejemplos; pero ninguno de esos ejemplos me sirvió para lograr mi cometido de librar integramente mis $4,000.<br />
<br />
Sin mas, aquí les dejo el enlace, para que puedan probarla.<br />
<br />
<a href="https://tyropos.com/calculadora-honorarios.php">https://tyropos.com/calculadora-honorarios.php</a><br />
<br />
<br />
<b>Video de Ejemplo</b><br />
<div style="position:relative;height:0;padding-bottom:75.0%"><iframe src="https://www.youtube.com/embed/yVpoK-zX1RA?ecver=2" width="480" height="360" frameborder="0" allow="autoplay; encrypted-media" style="position:absolute;width:100%;height:100%;left:0" allowfullscreen></iframe></div><br />
Cualquier problema, favor de reportar.<br />
<br />
GraciasJUAN GABRIEL CASTILLOhttp://www.blogger.com/profile/16893991344593161749noreply@blogger.com0tag:blogger.com,1999:blog-397557585908148327.post-53759461478025389772018-05-17T05:00:00.000-07:002018-05-17T05:00:09.508-07:00Facebook suspende 200 aplicacionesHola tyros!<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNYtjyKflql1pUBsrIFwENw0SzhUhPwwI-X5CJ2WyWFxGbrg3U5zqyXH_8JRS8XQjcFeZbkeHcacAClk9X1TTl5z6z2T3fO39KcW32Ow2os3VsdMn0lHpv4d2GbunnNpiugjx96uvEO9P8/s1600/data.jpeg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNYtjyKflql1pUBsrIFwENw0SzhUhPwwI-X5CJ2WyWFxGbrg3U5zqyXH_8JRS8XQjcFeZbkeHcacAClk9X1TTl5z6z2T3fO39KcW32Ow2os3VsdMn0lHpv4d2GbunnNpiugjx96uvEO9P8/s320/data.jpeg" width="320" height="213" data-original-width="640" data-original-height="426" /></a></div>Pues resulta que facebook comienza a dar resultados. Luego del ta sonado caso Cambridge Analytica. Y es que, segun un informe publicado en su <a href="https://ltam.newsroom.fb.com/news/2018/05/una-actualizacion-sobre-la-investigacion-y-la-auditoria-de-nuestras-aplicaciones/">blog</a>, han sido "suspendidas", cerca de 200 aplicaciones. <br />
Facebook promete realizar una revisión exhaustiva de cada una de ellas, prometiendo prohibir aquellas que se compruebe hayan dado mal uso a la información que recopilaron.<br />
A raiz de esta investigación realizada por facebook, me vienen varias interrogantes a mi paranoica imaginación. Sucede, pues, que el problema de la recopilación de datos ya ha sido ventilado. Vimos como es que se utilizó esa información de manera politica, para manipular tanto a políticos como a votantes.<br />
Independientemente de si tengan éxito o no, habrá otros que intentarán hacer lo mismo; quizá con la idea "podemos mejorarlo". En este estira y afloja entre redes sociales, "aplicaciones" y usuarios, es muy probable que haya daños colaterales, que tendrán que pagar alguien, seguramente serán los usuarios.<br />
Y es que es muy poco lo que sabemos acerca de lo que sucede detrás de una aplicación. Por ejemplo, aunque una aplicación "solicite" permiso para accesar a nuestra información, es obvio que la red social, cualquiera que sea (facebook, G+, Linked In, etc) ya tiene la información. <br />
<br />
¿Que tal si desviamos la atención a unos cuantos chivos expiatorios de los cuales podemos prescindir?, ¿Que tal si lanzamos unas docientas balas para matar a unas cien hienas que tenemos en la sabana? Hablo alegóricamente, pero... ¿Y si no estoy tan equivocado?JUAN GABRIEL CASTILLOhttp://www.blogger.com/profile/16893991344593161749noreply@blogger.com0tag:blogger.com,1999:blog-397557585908148327.post-47817370351743906752018-05-16T05:00:00.000-07:002018-05-16T05:00:06.186-07:00Correo electrónico inseguroHola tyros!<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBTXg1-slGcDfc1JESy328CqPSXup9CRyjnhJ-guUWrQbEBLJqOGzJGHun-Y3oVg3tLH7kdsxOXwCnFcFORkzCWEq4kz3u6t5RbJlhQbXz_D9nd4qgmqKRP1t3uf9Zrruizh4DPxI3nsGu/s1600/email.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBTXg1-slGcDfc1JESy328CqPSXup9CRyjnhJ-guUWrQbEBLJqOGzJGHun-Y3oVg3tLH7kdsxOXwCnFcFORkzCWEq4kz3u6t5RbJlhQbXz_D9nd4qgmqKRP1t3uf9Zrruizh4DPxI3nsGu/s320/email.png" width="320" height="179" data-original-width="640" data-original-height="358" /></a></div>Si eres de aquellos que gustan de la privacidad y dedicas tiempo para asegurarte de que tus comunicaciones via correo electrónico estén debidamente cifradas. Mas aún si utilizas cifrado PGP o S/MIME, debes saber que tu información ya no es segura.<br />
Con la finalidad de respetar las fuentes originales de información, decidí publicar con varios días de retraso. Te sugiero que busques en internet toda la información al respecto. La fuente principal es una publicación llamada <a href="https://efail.de/">"EFAIL"</a>, te sufiero que leas la información detenidamente, pues esta falla de seguridad puede ser explotada, incluso con correos electrónicos antiguos. Es decir, si alguien ha estado interceptando tus comunicaciones de correo electrónico cifrados, con la esperanza de un día poder descifrarlos, hoy tiene la capacidad de saber lo que estabas ocultando.<br />
<br />
<b>Recomendaciones:</b> <br />
<br />
Nada se puede hacer respecto del pasado. Al menos que hayas tenido tus precauciones, por ejemplo, de distribuir información "señuelo", con intenciones de despistar, en caso de ser descubierto, estás en problemas.<br />
Entonces, mi mejor recomendación es confundir. No soy especialista en seguridad cibernética. Soy mas bien un estudioso del comportamiento humano. El espionaje se da por varias razones. Las mismas razones por las cuales te espían, pueden ser utilizadas para confundir.<br />
<br />
Investiga todo lo que puedas acerca de esta vulnerabilidad del email, revisa esos correos electrónicos comprometedores que enviaste y haz las correcciones que creas pertinentes.<br />
<br />
Suerte!JUAN GABRIEL CASTILLOhttp://www.blogger.com/profile/16893991344593161749noreply@blogger.com0tag:blogger.com,1999:blog-397557585908148327.post-77435019593151773462018-05-15T05:00:00.000-07:002018-05-15T05:00:04.143-07:00Creando apps segurasHola tyros!<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-ujlPGLl325g/WvXJifYBS2I/AAAAAAAADY4/WWy4J3Qbf307-8RJNttRmQOzC_nd5JEQACLcBGAs/s1600/security-apps.jpeg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://4.bp.blogspot.com/-ujlPGLl325g/WvXJifYBS2I/AAAAAAAADY4/WWy4J3Qbf307-8RJNttRmQOzC_nd5JEQACLcBGAs/s320/security-apps.jpeg" width="320" height="213" data-original-width="640" data-original-height="426" /></a></div>Crear aplicaciones seguras es un reto que debe convertirse en hábito. Lo que vimos hace unas pocas semanas con el "caso facebook", en donde se vió comprometida la información de millones de personas es solo la punta del iceberg.<br />
Justo en este momento me estoy haciendo la pregunta de cuánta de la información que tengo en esta laptop (con la que escribo) se encuentra comprometida. Pues tengo desde fotos de mi familia, hasta código fuente de mis desarrollos.<br />
Justo hace días me llegó una notificación a otra de mis computadoras, indicándome que era necesario actualizar el firmware del módulo TPM. Para los que no saben que es, en resúmen, TPM es un chip que porporciona un nivel de seguridad basado en hardware-software; de tal manera que pueda servir de protección adicional para nuestros dispositivos. Resulta que el firmware de mi Módulo TPM era del 2015, y apenas este año salió una actualización. Luego de varios intentos y, bloquearlo varias veces, logré instalar el firmware actualizado.<br />
<br />
Esta situación me llevó a una interrogante. Y es que para poder actualizarlo, las instrucciones implicaban bajar el nivel de seguridad, limpiarlo, volver a ponerle el nivel de seguridad anterior, volver a limpiarlo, entre varias reiniciadas del sistema operativo. Ahora, mi interrogante es: ¿Que tan segura estuvo mi computadora durante ese periodo de tiempo en el que tuve que "hackearme" a mi mismo?<br />
<br />
He leído que en tiempos de guerra se vale de todo. Un ejército enemigo es capaz de envenenar el agua de un rio que pasa por la ciudad que desean atacar. Mientras que los residentes son capaces de hacer lo mismo a las cisternas, justo cuando se dan cuenta que la victoria del enemigo es inminente.<br />
<br />
Yo, como programador, ¿Que garantías le doy a mis clientes?. Siempre es buena idea tomar precauciones. No digas que nunca te va a pasar. Un día puedes recibir esa llamada de auxilio de tus clientes avisándote que al ingresar a la aplicación ya no tiene su información, que ayer era rico y hoy tiene que declararse en banca rota. Todo por que no tubiste suficientes y paranóicas precauciones de seguridad.<br />
<br />
Antes de comenzar, debo decirles que estos tips son para principiantes. Realmente no espero que mis lectores sean expertos desarrolladores. Así que, si eres miembro de Anonymous, un hacker experto o agente del nuevo orden mundial, quizá quieras regresarte a la dark web, ya que aqui todos somos tyros.<br />
<br />
<b>Tips para crear apps seguras:</b><br />
<br />
<b>1. No copies código.</b> Todos hemos copiado unas cuantas líneas de aquí, otras de allá. El problema, cuando se trata de información clasificada, es que alguien mas lo copió también. Siempre que se trate de información protegida por alguna de esas miles de leyes, crea tu propia versión de ese código que copiaste. Si te quisiste evitar la fatiga, al menos estudialo para que veas si entre esas líneas, el "generoso" que lo publicó en internet no puso un agujerito que pueda meterte en problemas mas adelante.<br />
<br />
<b>2. Encripta.</b> No necesitas ser un genio de la programación, hay muchos algoritmos que puedes utilizar, pregúntale a Google. Hazle difícil el trabajo a los hackers. Si es inevitable que pasen tus barreras de seguridad, al menos asegúrate de que cuando logren entrar a tu información, sea como para un mexicano en china. <br />
<br />
<b>Conoce tu lenguaje.</b> Todos los lenguajes que conozco tienen varias formas para hacer lo mismo. Antes de buscar en internet "como hacer esto en C#/Java/Cobol/NodeJs/etc", investiga si nativamente el lenguaje es capaz de hacer lo que necesitas hacer. Varias veces he buscado rutinas en internet para hacer algo que el mismo lenguaje era capaz de hacer con menos líneas.<br />
<br />
<b>3. Depura tu código.</b> Conforme vayas creciendo como programador, te vas a dar cuenta que lo que hacías con 100 líneas, es posible con 30 o 40. no dejes ese código viejo, mejóralo. Quizá aumentes el rendimiento de tu aplicación y elimines alguno que otro agujero de seguridad.<br />
<br />
<b>4. Pon trampas.</b> Si sabes que sabes que tu aplicación será atacada, debes engañar a los atacantes. No se me ocurre un ejemplo práctico, sin embargo, si sabes el tipo de información que vas a manejar, seguro sabes como distraerlos. Haz que busquen donde no hay. Haz que piensen ya tienen lo que buscaban cuando tengan basura.<br />
<br />
<b>5. Lleva un registro.</b> Habilita registros por todos lados. Si te es posible, envíalos a otro lugar que tenga un sistema de seguridad distinto. Por ejemplo, si tu app es Android, envia registros a un servidor Windows o Linux; de igual manera, si es posible habilitar los registros del dispositivo.<br />
<br />
<b>6. Combina lenguajes.</b> Igual no tienes que ser experto. Pero si te es posible, hazlo.<br />
<br />
<b>7. Hackeate a ti mismo.</b> Cuando estaba tratando de actualizar el módulo TPM de mi laptop, se me bloqueó varias veces, como medida de seguridad. ¿Cuantos intentos fallidos vas a permitir en tu aplicación?<br />
<br />
<b>8. Pide a otros que te hackeen.</b> Antes de que tu aplicación tenga información real, vale la pena pedirle a otros programadores que le hagan unas cuantas pruebas. Sospecha si no encuentran ninguna vulnerabilidad. Revisa si sus intentos fueron a los registros.<br />
<br />
<b>9. No publiques código crítico en internet.</b> A mi me gusta publicar código en internet. Temo haber subido algo que comprometa a alguna de mis aplicaciones. Espero no haberlo hecho nunca.<br />
<br />
<b>10. Encuentra el equilibrio.</b> Que tu aplicación segura no sea una carga para la experiencia del usuario. Sin vas a construir un tanque de guerra, asegúrate que haya cabida para el piloto. Si tu aplicación no se puede usar, entonces no sirve.<br />
<br />
Hasta la próxima!<br />
JUAN GABRIEL CASTILLOhttp://www.blogger.com/profile/16893991344593161749noreply@blogger.com0tag:blogger.com,1999:blog-397557585908148327.post-36215508750539352262018-05-14T13:39:00.001-07:002018-05-14T13:39:08.747-07:00Apps que no debes tener en AndroidHola tyros!<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-mEMxUas2zEw/Wvnt-gdZPDI/AAAAAAAADZo/7tdFIDNcnjU9uDAudRmsD0cQEADfEf24ACLcBGAs/s1600/malware.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://2.bp.blogspot.com/-mEMxUas2zEw/Wvnt-gdZPDI/AAAAAAAADZo/7tdFIDNcnjU9uDAudRmsD0cQEADfEf24ACLcBGAs/s320/malware.png" width="320" height="245" data-original-width="640" data-original-height="489" /></a></div><a href="https://twitter.com/LukasStefanko">@Lukas Stefanko</a> experto en ciberseguridad ha publicado una lista de Apps que no deberías tener instaladas en tu dispositivo Android. Y es que estas aplicaciones pueden descargar contenido adicional que puede ser dañino para tu equipo. Publicidad no deseada, incluso engañarte para que hagas clic en anuncios invisibles.<br />
Lukas menciona que ya ha pasado su reporte a Google, sin embargo, algunas de estas aplicaciones siguen disponibles. Date una vuelta por <a href="https://twitter.com/LukasStefanko">@Lukas Stefanko</a> si quieres saber mas al respecto. <br />
Igual, si eres de esos valientes que les gusta experimentar, quizá quieras usar tu dispositivo Android a modo de conejillo de indias y encontrar mas de lo que Lukas nos ha mostrado. Esto lo digo solo por aquellos que pueden y tienen los medios para hacerlo. Si eres de aquellos como yo, que solo tenemos uno, mejor prevenir que lamentar. Evita esas aplicaciones al menos hasta que Google nos garantice que son seguras. Así que estate al pendiente de lo que pueda decir Google al respecto, de mi parte, publicaré cualquier información que llegue a mis manos.<br />
<br />
<b>Apps involucradas:</b><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://pbs.twimg.com/media/Dc0nNqbWsAAOf-6.jpg:large" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://pbs.twimg.com/media/Dc0nNqbWsAAOf-6.jpg:large" width="320" height="289" data-original-width="800" data-original-height="723" /></a></div>El consejo de Lukas es que primero canceles cualquier subscripción que tengas con estas apps, luego las desinstales. De mi parte, si notas que tu dispositivo se comporta extraño, te aconsejo que lo lleves al centro de atención a clientes de tu compañía telefónica o con un experto calificado para que lo reinicien a sus ajustes de fábrica, no vaya a ser la de malas y termines con algo peor que <a href="https://es.wikipedia.org/wiki/WannaCry">WannaCry</a> versión Android.<br />
<br />
<br />
<br />
JUAN GABRIEL CASTILLOhttp://www.blogger.com/profile/16893991344593161749noreply@blogger.com0