martes, 16 de enero de 2018

Las consolas se mueren

 Pues si. Lamento ser tan dramático con el titular pero hace meses que le doy vueltas a este asunto tan preocupante porque esas cajas de diversión que comenzaron hace tantísimos años tienen el tiempo contado.

¿Pero cómo cojones hemos llegado a ésto?

 Son varios factores en mi opinión y aquí los enumero, aunque es posible que falten algunos porque ya digo esta es mi opinión que nace de la experiencia, muchos años de vicio:
  • Desarrollos cada vez más caros. Si, el caso es que GNU está presente en el PC pero en las multiples plataformas de videojuegos no. Eso y que cada vez las consolas son más complejas hacen que invertir tiempo para crear tú propia librería por medio de la ingeniería inversa sea casi una pérdida de tiempo y que cueste más que comprar una licencia para publicar juegos para determinada consola usando cualquiera de los montones de motores disponibles, tipo Unity o Unreal por mencionar los más populares.
  • Público más exigente, que se puede traducir en que cada vez un listón más alto, porque no es lo mismo sacar el tetris para PS4 que aparte haría desmerecer la potencia del cacharro. Lo que está claro es que queremos juegos cada vez con más filigranas y a la vez muy adictivo, y eso se traduce en un equipo de desarrollo relativamente grande y de ahí se podría pasar al primer punto, un mayor gasto. Tiempo atrás quedó cuando un programador podía hacer la música, los gráficos y el juego mismo!!
  • La estafa de los DLC, ampliaciones, expansión, extensiones o como coño quieran llamarlo. Si, ahora lo que da dinero no es crear un juego sino crear el juego en cachitos, y por supuesto, vendiendo cada cachito de tal forma que la suma de todos los cachos valgan el doble de lo que originalmente se vendería el juego completo solo.
  • Un mercado cada vez más errático debido a los factores citados, que dicho de forma llana, sino hay juegos o pocos en una plataforma los jugadores tarde o temprano la abandonan.
  • Actualizaciones infinitas y juego online por cojones, y de esto experimentando hace unos días y que fue la gota que culminó el vaso que me ha llevado a escribir esta entrada. Os lo cuento para queden flipando. Adquirí hace tiempo un juego de Ubi soft, el For honor, tuve un problema con la cuenta de Ubi soft (el primer día) y nunca más volví a poder jugarlo pues me quedé a la espera de que ese soporte tan gentil (malditos hijoputas prepotentes) me solucionaran el problema. Es un juego por cojones ya no es suficiente que estés conectado con tú cuenta de PS4 sino va más lejos aun y solo funciona conectado y con cuenta de usuario Ubi Soft, a joderse se ha dicho porque yo lo valgo, más o menos así habrán dicho el máximo representante de Ubi Soft con esta absurda política. EEeeeh y que no he mencionado que aunque juegues online hay que hacer por cojones la instalación de tropecientos gigas en la memoria de la consola ¿Qué no tienes espacio? Pues no juegas o eliminas lo que tengas, o en el mejor de los casos para las tiendas te compras otro y no pasa nada (total unos pocos euros €€€). Pues esto dije, nunca más compro un juego de Ubi Soft, pues el For Honor a la semana lo descambié, y terminé comprando otra perla, el Destinity 2 de Bungie Studios. Emocionado llegué a casa y metí el juego, entonces la PS4 me indica que tiene que actualizarse, 3 gigas, bueno no pasa nada me dije. Una vez acabó de actualizar el juego pidió actualizarse porque sino no se ejecutaba, bueno no pasa nada me dije. YA cuando acabo, al cabo de unas horas, me dije por fin... y el juego nuevamente me indicó que tenía que volver a actualizarse, y todo esto para luego jugar a un juego con problemas en el servidor, pues hay que jugarlo conectado por cojones y con algunos bugs... en fin, alado sea el equipo Steam y el PC, saben a lo que me refiero?  

Alternativas al hambre de los jugadores


 La alternativa pasa bien o pasarte a la plataforma rival o competencia, la cual no es nada barata, pues las consolas han llegado a una política de precios casi absurda. O volver al PC, esa máquina que en lo que se refería a jugabilidad siempre había sido pobre pero que ahora con el abaratamientos de componentes y un mercado glorioso de portabilidades, únicos y de bajo presupuesto (indies), hacen que la máquina con más juegos y más entretenida sea el Personal Computer, elegido por la mayoría de jugadores o gamers. Porque ¿dónde verás emuladores de PS, Nintendo, Super Nintendo, Sega Megadrive y sin fin de máquinas de entretenimiento? pues en el PC sino.

Cambiar colores de los mensajes en consola, Laravel 5.1

 Bueno, al final averigüe como cambiarlo sin hacer tanto trasteo con js, que aparte de conseguirlo hice petar todo el Cloud9 en el intento y menos mal que usando ?reset=user pude dejarlo todo por default.
Lo primero, es que no es una solución que haya encontrado por ahí ni nada de eso, todo es investigación propia.
Lo segundo, que tanto para cambiar el esquema de colores del artisan como del tinker hay que toquetear en distintos sitios. Porque el artisan en verdad lo que hace cuando invocas al tinker es ejecutar una aplicación php denominada PsySh. Ambas, PsySh y Artisan usan algunos componentes de Symphony, por ejemplo el Console (Seguro que con el nombre os da una pista).

Cambiar esquemas de color del artisan

 Simplemente hay que irse al fichero en la raíz de nuestro proyecto Web, por ejemplo Laravel. Y editar el fichero artisan (un fichero de texto plano sin extensión), y colocar en la cabecera :

use Symfony\Component\Console\Formatter\OutputFormatterStyle;
use Symfony\Component\Console\Formatter\OutputFormatter;
use Symfony\Component\Console\Output\ConsoleOutput;
...
 Luego en el mismo fichero localizamos la línea :
$status=$kernel->handle(
    $input=new Symfony\Component\Console\Input\ArgvInput,
    new Symfony\Component\Console\Output\ConsoleOutput
);
 Y antes de esta línea definimos nuestra propia salida personalizada que denominaremos como no $output , de esta forma :
$outputFormatter=new OutputFormatter(false,[
    // En este array vamos agregando los estilos para cada caso (solo me se algunos)
    'error'=>new OutputFormatterStyle('yellow','blue'),// fondo azul y letras amarillas, por ejemplo
]);

$output=new ConsoleOutput(ConsoleOutput::VERBOSITY_NORMAL,null,$outputFormatter);
 Una vez tenemos nuestra salida personalizada lista simplemente reemplazamos el new Symfony\Component\Console\Output\ConsoleOutput de la función handle que mostré anteriormente por nuestro objeto ConsoleOutput denominado $output. Y listo.

Cambiar esquemas de color del tinker (PsySh)

Para éste es un poco más sencillo, simplemente nos vamos a la carpeta vendor, donde el composer aloja todas las librerías php, y buscamos la carpeta psy. Y dentro de ella buscamos el fichero /psysh/src/psy/output/ShellOutPut.php y lo editamos. Dentro del fichero nos vamos abajo del todo en la función initFormatters() y veremos como define los estilos. Simplemente lo que haremos es reasignar los colores con la combinación que nos guste y en caso por ejemplo de cambiar el estilo de los mensajes de error, al no existir dentro de las definiciones la crearemos de la misma forma que el resto de estilos definidos pero con el nombre de error:
...
...
     * Initialize output formatter styles.
     */
    private function initFormatters()
    {
        $formatter=$this->getFormatter();

        // usamos la palabra 'error'
        $formatter->setStyle('error',new OutputFormatterStyle('black','yellow'));// ejemplo (un copy/paste del de abajo)
        
        $formatter->setStyle('warning',new OutputFormatterStyle('black','yellow'));
...
...
 Y listo calisto.

La sexy de enero


pequeña pero matona


Laravel 5.1 usando policies

 Buenas, en esta publicación indicaré como implementar sencillamente las policies en Laravel 5.1


¿Qué son las policies en Laravel?


 Las policies como indica su nombre son las políticas relacionadas con los permisos y/o autorizaciones. Van encaminadas a ofrecer una alternativa al midleware de Laravel, pues se puede hacer casi lo mismo con estas, pero con la diferencia de la actuación, pues mientras que con el midleware uno puede tratar la excepción dentro de la clase casi de forma opaca para el que la usa, en el Policy se maneja en el lugar, o función, donde queremos que actúe. Realmente al final se resume en devolver verdadero o falso según las condiciones de la operación.

 Bueno, conformes o no con mi definición de las policies siempre podrán consultarla directamente desde la documentación oficial de Laravel e interpretarla al gusto o literal.

https://laravel.com/docs/5.1/authorization#policies

Implementación y explicación



 Como habrán visto en la documentación el procedimiento es simple. Se crea una clase por medio de artisan, luego se añade (registro) a la clase AuthServiceProvider y luego la usamos en el lugar o función que queremos que actúe.



 Uno de los principales problemas que se nos puede presentar es la ausencia de esta clase, AuthServiceProvider, al recién instalar Laravel 5.1. Para ello podemos solucionar esto de forma sencilla. Nos vamos a la carpeta donde Composer aloja las librerías Php, la vendor de nuestro directorio de trabajo. Luego desde la ruta laravel/framework/src/Illuminate/Auth/ copiamos la clase citada a la ruta app/providers, cambiamos su espacio de trabajo por el de App\Providers y por último registramos esta clase en la configuración del laravel, config\app.php , en la clave 'providers' añadimos al array App\Providers\AuthServiceProvider::class . Podemos luego limpiar la clase y solamente dejarla así de momento para este propósito :



namespace App\Providers;
        
use Illuminate\Contracts\Auth\Access\Gate as GateContract;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * Register any application authentication / authorization services.
     *
     * @param  \Illuminate\Contracts\Auth\Access\Gate  $gate
     * @return void
     */
    public function boot(GateContract $gate)
    {
        $this->registerPolicies($gate);
    }
}

 Una vez hecho esto ya simplemente es ejecutar el comando artisan, php artisan make:policy y el nombre de la política que queremos aplicar. 


 Como esto era para clase he usado un proyecto que ya tenía hecho que trata de un portal de anuncios. En el proyecto originalmente el problema de impedir que editaran anuncios de los que los usuarios no fueran propietarios lo resolvía con un midleware. Pero como el profe nos pidió implementarlo para experimentar con este pues aplicaré el Policy para resolver el problema antes indicado.



 Creo entonces el Policy denominado PoliticaDePublicacion, el cual una vez ejecutado el comando artisan me aloja la clase en la ruta app\policies.



 Dentro de esta clase ya creada, como la idea es que en el momento después de la edición y al actualizar el anuncio se evalúe si el usuario puede o no modificar, pues creo un método denominado actualizar y le indico los dos parámetros que participan en esta evaluación o comprobación que no son otros que el usuario registrado y el anuncio a editar. Y al final queda una cosa así :



namespace App\Policies;

use Illuminate\Auth\Access\HandlesAuthorization;

use App\User;
use App\Anuncio;

class PoliticaDePublicacion
{
    
    public function actualiza(User $usuario,Anuncio $anuncio){
        return $usuario->id == $anuncio->id_usuario;
    }
}


 En el método o función se observa que simplemente se compara el id del usuario con el id del anunciante. Que en caso de corresponder devolverá verdadero y en caso contrario falso.



 Hecho esto ahora agregamos nuestra Policy al AuthServiceProvider. Para ello usaremos la propiedad protegida policies que toma una array asociativo. Donde en la parte de la clave usamos la ruta y el nombre de "una" clase entre comillas (o comilla simple), vinculante a nuestra Policy que será el valor que también se asignará por medio de la ruta completa con el nombre de la clase. Yo como clave escogí el controlador pero puedes usar también un modelo como se aprecia en la documentación pues eso depende de su uso.




namespace App\Providers;

use App\Anuncio;
use App\Policies\PoliticaDePublicacion;
        
use Illuminate\Contracts\Auth\Access\Gate as GateContract;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    protected $policies = [
        'App\Http\Controllers\AnuncioController' => 'App\Policies\PoliticaDePublicacion',
    ];

    /**
     * Register any application authentication / authorization services.
     *
     * @param  \Illuminate\Contracts\Auth\Access\Gate  $gate
     * @return void
     */
    public function boot(GateContract $gate)
    {
        $this->registerPolicies($gate);
    }
}

 Ya hecho esto simplemente queda usarla dentro de la función donde vaya actualizar por medio del helper o función policy(), a la cual indicamos nuestra clase, en este caso el controlador, y ésta nos devolverá nuestra Policy vinculada pudiendo así usar los métodos definidos, en este caso actualiza().



namespace App\Http\Controllers;

...
use App\Http\Requests\ValidaAnuncio;

class AnuncioController extends Controller
{
...
    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(ValidaAnuncio $request, $id)
    {
        $anuncio = Anuncio::find($id);
        if (policy('App\Http\Controllers\AnuncioController')->actualiza($request->user(),$anuncio)){ 
            $anuncio->update(["titulo"=>$request->titulo, "cuerpo"=>$request->mensaje, "categoria"=>$request->categoria]);
            return "";
        }
        
        return redirect('/'); // en caso de no poderse modficar saltamos al inicio de la pa�gina   
    }
...
 
 También como alternativa podremos usar el $this en el argumento de la función policy() para indicar la clase en vez de escribir el nombre completo de esta(tal como muestro arriba en el código), pues estamos además dentro del controlador para cual se definió la política.


 Y ya por último, también indicar que podríamos usar otra forma que indica la documentación y que engaña mucho con el ejemplo que nos muestra, aunque en una notita lo deja bien claro. Se trata del método authorize(). Dicho método funciona de la siguiente forma; cuando devuelve true el flujo del programa continúa con normalidad y en caso contrario genera una excepción que responde con un código 403 (No autorizado), que en Laravel podremos definir con una vista personalizada. Para usar el authorize() hay que incluir la clase AuthorizesRequests dentro de nuestro controlador o clase pues sino el servidor nos lanza el mensaje de método no encontrado.


By default, the base App\Http\Controllers\Controller class included with Laravel uses the AuthorizesRequests trait. This trait provides the authorize method, which may be used to quickly authorize a given action and throw a HttpException if the action is not authorized.

 Además también habrá que definir los métodos a usar en el método boot() de la clase AuthServiceProvider. Usando a su vez el método define() del objeto GateContract de la citada función. Todo para que el authorize() pueda encontrar los métodos pues de lo contrario siempre generará la excepción 403.


Conclusión


En mi humilde opinión esto puede ser prescindible en el desarrollo de una aplicación con un framework en el que abundan todo tipo de funcionalidades.

miércoles, 27 de septiembre de 2017

Sobre nacionalismo y secesionistas

 En esta publicación solamente quiero dar mi opinión sobre algo que ahora está de moda, pero siempre estuvo y estará ahí.

 ¿Por qué nacionalismos? Los nacionalismos son la reivindicación cultural de un pueblo. Suelen aparecer cuando las gentes de un territorio sufren algún tipo de opresión cultural o política, como la pérdida de la soberanía por ejemplo. 

Secesionismos everywhere

 La emancipación surge de la madurez, de una necesidad. Los conflictos en la convivencia social siempre están servidos, ya que es difícil adaptarse a otros y uno prefiere más que fuera al revés. Primero uno intenta sobrellevar la pluralidad pero los roces son habituales y tarde o temprano llega la crispación, y después de ésto normalmente o hay un acuerdo, o uno o el resto marchan y se distancian. El distanciamiento es un elemento que ayuda a resolver el conflicto de la convivencia, si no están juntos los que se llevan mal no se llegará posiblemente a las manos, violencia, y cada uno irá por su lado.

Los naciones siempre han estado cambiando, pasando de manos, uniéndose o formando alianzas para ser más fuertes contra un enemigo común, independizándose o desvaneciéndose. Donde se levantaba una civilización, venía otra y la conquistaba, y luego venía otra civilización y la destruía... y así será siempre.

Conclusión

En mi opinión, dividir un problema es la mejor forma de resolverlo. Los recursos se gestionan mejor cuanto menor es la magnitud, ya que no es lo mismo vigilar cuatro cabras que un rebaño. Muchos sueñan con un gobierno global, pero globalizar el mundo significa globalizar los problemas del mundo, no es algo tan bonito como nos quieren vender la Unión Europea o el mercado internacional. En resumen, la decisión de un pueblo debe ser respetada y los que no pertenecemos a ese pueblo aunque políticamente estemos en el mismo territorio no nos da derecho a interponernos en sus decisiones. Si imponemos a un pueblo unas reglas que no comparten, lo que se conseguirá es violencia... y luego vendrán las lamentaciones, las acusaciones, el odio y el rencor.

jueves, 21 de septiembre de 2017

La sexy de septiembre


Reflexiones sobre la democracia



 Es una forma extraña de empezar una publicación, bueno no extraña pero no frecuente... pero ¿debería haber empezado de una forma normal?¿lo más habitual? posiblemente da lo mismo, pero es una forma de introducir al tema que hoy empezaré, el poder del pueblo en un gobierno democrático. O quizás mejor dicho, una república representativa.

 Desde que era joven siempre he tenido bastante pasión por la gestión, el orden, el diseño, las responsabilidades. Recuerdo como algo que no consigo olvidar de niño, un día en el campo junto al corral, estar excavando el suelo con algún tipo de herramienta o juguete lo que sino recuerdo bien una red de canales que protegía un pequeño poblado levantado en barro, de una posible inundación que podría sobrevenir en algún momento dado, pues recuerdo vagamente el disfrutar de cuando jugaba bajo la lluvia en parvulario y creo que la idea empezó por ahí. El diseño era bueno, se trataba de una red cuadricular, no había pendientes ni desniveles, tenía que probarlo, así que fui a buscar agua y creo que cogí la del bebedero del perro de mi abuelo, era lo más cercano. Lo llevé y funcionó, el agua fluyó y se repartió por toda la canalización.

 A medida que crecía había un extraño sentido sobre la gobernabilidad de una nación que me embargaba, creía en una especie de utopía, un gobierno perfecto donde todo se hacía bien y lo poco o nada que era consciente de la situación política de donde vivía me parecía que podía mejorar. Sin quererlo en conversaciones largas y tendidas junto con familiares, me salía una vena con tintes de la política izquierdista, socialista y totalitarista. Era bastante radical, aunque he sido muy radical desde mucho tiempo hasta no hace poco. Al final con el tiempo, me he dado cuenta que no me veo representado con la política, ni con la derecha, ni con la de la izquierda, ni con la del centro. Los partidos políticos tal como se conocen, son solamente una cuadra de inútiles a mi parecer y a la de muchos. En ellos hay personas que buscan acaparar públicamente todas las miradas, porque en el fondo lo necesitan, de esa forma pueden influir y eso beneficia al partido. Los partidos políticos son como negocios y así mirando son un negocio, sin hablar de prebendas. Gobierno tras gobierno, en mis muchos años de vida, no he visto otra cosa que la práctica de la desacreditación, corrupción, hipocresía, demagogia de las personas que trabajan en esos partidos y encima lo televisan, como para dar a entender de que trabajan muy duro. Lo más extraño, es que los más mediocres o que peor trabajan son los que ganan las elecciones y ahí me está costando mucho pensar que el ser humano sea tan estúpido y sinceramente, me niego a reconocerlo pues reconocerlo es reconocer que grandes ilustres artistas, intelectuales, pensadores, filósofos, científicos y una serie de personas con buena reputación lo sean y no estoy dispuesto... lo que me lleva a pensar que los gobiernos hacen trampa.

 La perpetuación de la especie es algo muy fuerte que el ser humano no puede controlar, de ahí el ansia de extenderse, de crecer, perpetuarse él y sus descendientes. La inteligencia se convierte en astucia, no es sabiduría. Crea cosas para dominar y en el afán de dominar crea sistemas de gobierno que le permitan gestionar los recursos, que a su vez le ayudarán a perpetuarse.

 Quizás a todo esto después de ver el vídeo en la entrada de esta publicación, la esperanza se encuentre en resucitar las asambleas ciudadanas... pero y espero que me perdonen los patriotas y románticos imperialistas, dividir la nación en muchísimas asambleas para una gestión eficaz, pues es sabido que un problema puede tener distinta valoración en distintas partes de una nación. A una región le puede preocupar el desempleo y a otra con menos desempleo la vivienda, por ejemplo. Si, se pueden hacer las cosas de distinta forma, pero el modelo de asamblea o de democracia a la griega, no permite erigir una casta y ese es el problema, pues después de muchos años de república representativa resulta que la casta nacida de ella nunca lo permitiría, ni los fanáticos imperialistas. Sigamos entonces pues soñando que alguna vez nuestro voto valdrá para algo... los que crean en una democracia, yo por mi parte, dejaré de votar a partir de hoy... sinceramente prefiero perder el tiempo jugando o viviendo con los ojos vendados.