Regresa en el tiempo con Git

¿Te encuentras ya en desarrollo de código? ¿Eres ingeniero de software?

Imagínate que por alguna razón alguien entra a tu servidor y se infectan tus archivos y no tienes forma de comparar un histórico, de cuál fue la versión anterior que tenias, con respecto a la que está ya modificada, no te será tan fácil recuperar todo lo que ya tenías.

Una de las grandes ventajas de Git es que te va a permitir  “Regresar en el tiempo”

Continúa leyendo Regresa en el tiempo con Git

El origen de Bootstrap, el framework CSS líder

Hace unos días me daba vueltas en la cabeza quiénes eran las personas que desarrollaron Bootstrap, este framework tan amigable (que a muchos nos ha aliviado en más de un par de ocasiones), me hacía preguntas como ¿son personas normales? ¿dónde viven? y ¿qué otras cosas hacen? por este y otros cuestionamientos más, hoy me dí a la tarea de investigar y este fue el resultado de mi investigación.

Bootstrap fue desarrollado por Mark Otto (@mdo) y Jacob Thornton (@fat) desarrolladores del famosísimo Twitter, proveedor de servicios de microblogueo.

¿Pero quiénes son Mark Otto y Jacob Thornton?

Mark Otto es un diseñador viviendo y trabajando en San Francisco, trabajó como freelance durante la secundaria y la universidad, antes de mudarse a California para trabajar en la empresa de diseño ZURB, en 2007.

Durante su estancia en ZURB diseñó y desarrolló docenas de proyectos con grandes y pequeños clientes, incluido un sitio web para Britney Spears -¡Cool! – .

Después de un periodo de dos años y medio en ZURB, renunció para comenzar a trabajar en Twitter como diseñador de productos.

En Twitter trabajó en numerosos proyectos y varias herramientas internas, ahí fue donde creó el popular kit de herramientas para front-end de código abierto Bootstrap con ayuda del buen Jacob Thornton.

Bootstrap nació en Twitter como un medio para crear mejores herramientas internas, comenzó como algo simple de HTML/CSS, luego Jacob construyó complementos encima y así es como comenzó “Bootstrap de Twitter” llamado así originalmente.

Bootstrap es un framework de código abierto para diseño de sitios y aplicaciones web. Entre sus herramientas contiene una gran variedad de plantillas de diseño con tipografía, botones, menús de navegación, tarjetas y otros elementos de diseño basado en HTML y CSS, así como también extensiones de JavaScript.

Hasta la fecha Otto y Jacob han puesto más de 1000 horas en Bootstrap, sino es que más. Semanalmente trabajan de tiempo completo en sus respectivos empleos, pero suelen realizar esfuerzos durante algunas horas por la noche y más los fines de semana, esto quiere decir que ellos no trabajan de tiempo completo en Bootstrap.

Actualmente Otto se desempeña como Director Principal de Diseño en GitHub, administra un equipo de aproximadamente 25 diseñadores web, ingenieros y artistas.

Por su parte Jacob Thornton es cofundador de Bumpers (aplicación de podcasting). Trabajó en Medium y Twitter, dondé junto a Otto creó Bootstrap.

Jacob hace un tiempo solía mantener un blog, donde escribía una serie de artículos de filosofía, sociología, teoría crítica y tecnología, donde abordó diferentes temas “con los que estaba luchando en ese momento”.

Jacob en particular tiene ideas que dan vueltas en su cabeza como ¿los robots o la inteligencia artificial se volverán demasiado inteligentes y tomarán el control? ¿ya vivimos en una realidad virtual? y cuestiones como “necesitamos colonizar Marte, o de lo contrario nos vamos a extinguir” y temas por las que la gente como él está obsesionada.

Jacob dice que no se deprime demasiado por este tipo de aspectos humanistas, pero sí es juicioso al respecto y tiene la tendencia a enloquecer al respecto.

Él es una persona muy filosófica y de ideas futuristas, sufre de alergias y le encantaría tener un ‘gato robótico’, y que no estaría nada preocupado si su gato intentara atacarlo.

Soy alguien que realmente quiere que haya destinos y experiencias radicales, únicas y diferentes, especialmente en Internet.

Bootstrap 4

Finalmente, Bootstrap es un proyecto que recientemente se ha actualizado a su versión 4, añadiendo diversas funcionalidades y mejoras, las cuales les invito a conocer en un muy entretenido y amigable curso impartido por nuestro amigo Alex Arriaga donde serás testigo de la genialidad de estos dos personajes.

https://webtraining.zone/cursos/curso-profesional-de-bootstrap-4

Conclusión general

Creo que Otto y Jacob son personas como tu y como yo, que con el esfuerzo y dedicación de su día a día han logrado proyectos muy interesantes e innovadores.

Así que sigamos trabajando todos los días “pasito a pasito” y así poco a poquito alcanzaremos y construiremos cosas más grandes y mejores para bien de todos.

Corre tras tus sueños…

Integración de Paypal a Laravel 5.2

Paypal es una forma muy popular de pago. La mayoría de las personas la seleccionan porque esta es segura y simple de usar. Si deseas integrar Paypal express checkout a tu aplicación de Laravel 5.2, solamente tienes que seguir los siguientes pasos.

1.- Instalación. En este paso necesitas instalar nestshell/paypal, solo ejecuta el siguiente comando en tu terminal

composer require netshell/paypal dev-master

2.- Añadir las siguientes rutas al archivo de config/app.php.

return [
	......
	$provides => [
		......
		......,
		'Netshell\Paypal\PaypalServiceProvider'
	],
	$aliases => [
		.....
		.....,
		'Paypal' => 'Netshell\Paypal\Facades\Paypal'
	]
]

3.- Credenciales para modo Sandbox y Live de Paypal

En este paso ya debes tener tu client_id y tu código secreto proporcionados por la herramienta sandbox de paypal .  Para ello ya debes contar con una tipo empresarial en Paypal.

Te explico de manera rápida en que parte de Paypal adquieres estos códigos. Si ya hiciste login en tu cuenta tipo developer (sandbox), ve a los siguientes menús del lado izquierdo: My Apps & Credentials , dirígete hacia la opción REST API apps y da clic en el botón Create App.

Aquí están las famosas credenciales 

Ahora que ya tienes creadas tus credenciales, necesitas añadirlas en el archivo de config\services

return [
'paypal' => [
        'client_id' => 'xxx',
        'secret' => 'xxx',
    ],
];

4.- Añadir rutas al archivo de route.php

En este paso vamos a añadir las rutas necesarias para la comunicación en app/http/routes.php

Route::group(['middleware' => ['web']], function () {
 Route::get('payPremium', ['as'=>'payPremium','uses'=>'PaypalController@payPremium']);    
Route::post('getCheckout', ['as'=>'getCheckout','uses'=>'PaypalController@getCheckout']);
    Route::get('getDone', ['as'=>'getDone','uses'=>'PaypalController@getDone']);
    Route::get('getCancel', ['as'=>'getCancel','uses'=>'PaypalController@getCancel']);
});

5.- Ahora que ya creaste las rutas, es necesario generar nuestro Controller

php artisan make:controller PaypalController

Vamos al código fuente de nuestro PaypalController app/http/Controllers/PaypalController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use Paypal;
use App\User;
use Illuminate\Support\Facades\Auth;

class PaypalController extends Controller
{
    private $_apiContext;

    public function __construct()
    {
    	 $this->_apiContext = PayPal::ApiContext(
            config('services.paypal.client_id'),
            config('services.paypal.secret'));

    	//Aquí guarde una configuración para mis credenciales de Sandbox
        /*$this->_apiContext->setConfig(array(
            'mode' => 'sandbox',
            'service.EndPoint' => 'https://api.sandbox.paypal.com',
            'http.ConnectionTimeOut' => 30,
            'log.LogEnabled' => true,
            'log.FileName' => storage_path('logs/paypal.log'),
            'log.LogLevel' => 'FINE'
        ));*/

        //Config live
        $this->_apiContext->setConfig(array(
            'mode' => 'live',
            'service.EndPoint' => 'https://api.paypal.com',
            'http.ConnectionTimeOut' => 30,
            'log.LogEnabled' => true,
            'log.FileName' => storage_path('logs/paypal.log'),
            'log.LogLevel' => 'FINE'
        ));
    }

    public function getCheckout(Request $request)
	{
        $user         = Auth::user(); 
        $id_user      = $user->id;
        $id_purchased_item    = $request->input('id_purchased_item'); //producto que me estan comprando
        $invoice      = $id_user.'-'.$id_purchased_item.'-'.$this->random(5);//generación de invoice aleatorio
        $descripcion  = $request->input('description');
        $quantity     = $request->input('quantity');//cantidad de productos adquiridos
        $total_amount = $request->input('amount');
        $currency     = $request->input('currency_code');//tipo de moneda

	    $payer = PayPal::Payer();
	    $payer->setPaymentMethod('paypal');

	    $item1 = PayPal::item();
        $item1->setName($descripcion)
                ->setDescription($descripcion)
                ->setCurrency($currency)
                ->setQuantity(1)
                ->setPrice($total_amount);

        $itemList = PayPal::itemList();
        $itemList->setItems(array($item1));


        // ### Cantidad
        // Especificando la cantidad del pago
        // Se pueden añadir detalles adicionales como 
        // shipping, tax.
        // Todo estó para que en paypal aparezca desglosado
        // como si de un carrito de compra se tratará
        $amount = PayPal::amount();
        $amount->setCurrency($currency)
            ->setTotal($total_amount);

        // ### Transacción
        // Para quién es el pago y quién lo está pagando. 
        $transaction = PayPal::transaction();
        $transaction->setAmount($amount)
            ->setItemList($itemList)
            ->setDescription("Descripción")
            ->setInvoiceNumber($invoice);

        // ### urls de redirección
        // Rutas a las que será redirigido el comprador después de un pago 
        // aprobado / cancelación

        $redirectUrls = PayPal:: RedirectUrls();
	    $redirectUrls->setReturnUrl(route('getDone'));
	    $redirectUrls->setCancelUrl(route('getCancel'));

        // ### Pago
        // Creamos el pago, para establecer la venta

        $payment = PayPal::Payment();
	    $payment->setIntent('sale');
	    $payment->setPayer($payer);
	    $payment->setRedirectUrls($redirectUrls);
	    $payment->setTransactions(array($transaction));

	    $response = $payment->create($this->_apiContext);
	    $redirectUrl = $response->links[1]->href;
	    
	    return redirect()->to( $redirectUrl );

	}

	public function getDone(Request $request)
	{
        $id               = $request->get('paymentId');
        $token            = $request->get('token');
        $payer_id         = $request->get('PayerID');
        $payment          = PayPal::getById($id, $this->_apiContext);
        $paymentExecution = PayPal::PaymentExecution();

        $paymentExecution->setPayerId($payer_id);
        $executePayment = $payment->execute($paymentExecution, $this->_apiContext);

	    return view("payments.payment-done");
	}


	public function getCancel()
	{
	   return view("payment-cancel", compact("executePayment"));
	}

      /*generación del invoice para paypal */
      public function random($qtd){
 
       $caracteres = 'ABCDEFGHIJKLMOPQRSTUVXWYZ0123456789'; 
       $cantidad_de_caracteres = strlen($caracteres); 
       $cantidad_de_caracteres--; 

       $num_random = NULL; 
       for($x=1;$x<=$qtd;$x++){ 
        $posicion = rand(0,$cantidad_de_caracteres); 
        $num_random .= substr($caracteres,$posicion,1); 
       } 

      return $num_random; 
     } 
}