El Noguer

Joaquim Perez i Noguer

projectlombok.org

Filed under: Ciència i tecnologia — Joaquim Perez Noguer at 4:46 pm on Dilluns, Agost 5, 2019

El llenguatge Java no té Properties com el .Net, ni té paràmetres opcionals. En Java ofereix alternatives menys netes. Quantes vegades cal escriure el codi del getter, setter de la propietat, definir el Logger a partir del nom de la classe, picar el codi de l’equals o el hashCode(). Tot això es pot simplificar si es fa servir https://projectlombok.org/features/all

val

Finally! Hassle-free final local variables.

var

Mutably! Hassle-free local variables.

@NonNull

or: How I learned to stop worrying and love the NullPointerException.

@Cleanup

Automatic resource management: Call your close() methods safely with no hassle.

@Getter/@Setter

Never write public int getFoo() {return foo;} again.

@ToString

No need to start a debugger to see your fields: Just let lombok generate a toString for you!

@EqualsAndHashCode

Equality made easy: Generates hashCode and equals implementations from the fields of your object..

@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor

Constructors made to order: Generates constructors that take no arguments, one argument per final / non-nullfield, or one argument for every field.

@Data

All together now: A shortcut for @ToString, @EqualsAndHashCode, @Getter on all fields, and @Setter on all non-final fields, and @RequiredArgsConstructor!

@Value

Immutable classes made very easy.

@Builder

… and Bob’s your uncle: No-hassle fancy-pants APIs for object creation!

@SneakyThrows

To boldly throw checked exceptions where no one has thrown them before!

@Synchronized

synchronized done right: Don’t expose your locks.

@Getter(lazy=true)

Laziness is a virtue!

@Log

Captain’s Log, stardate 24435.7: “What was that line again?”

Websocket

Filed under: Ciència i tecnologia — Joaquim Perez Noguer at 5:24 pm on Dijous, Agost 1, 2019

Exemple de crear un servidor Websocket en Java7 i el client amb Javascript

http://www.mastertheboss.com/javaee/websockets/websocket-helloworld-example

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
 
  
@ServerEndpoint(value="/hello")
       
public class HelloWorldEndpoint {
    @OnMessage
    public String hello(String message) {
        System.out.println("Received : "+ message);
        return "Hello form the Server!";
    }
    @OnOpen
    public void myOnOpen(Session session) {
        System.out.println("WebSocket opened: " + session.getId());
    }
    @OnClose
    public void myOnClose(CloseReason reason) {
        System.out.println("Closing a due to " + reason.getReasonPhrase());
    }
    @OnError
    public void error(Throwable t) {      
         
    }
}
<html>
    <head>
        <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
    </head>
    <body>
        <meta charset="utf-8">
        <title>Your First WebSocket!</title>
        <script language="javascript" type="text/javascript">
             
            var wsUri = "ws://localhost:8080/javaee7-websocket-basic/hello";
             
            function init() {
                output = document.getElementById("output");
            }
            function send_message() {
                websocket = new WebSocket(wsUri);
                websocket.onopen = function(evt) {
                    onOpen(evt)
                };
                websocket.onmessage = function(evt) {
                    onMessage(evt)
                };
                websocket.onerror = function(evt) {
                    onError(evt)
                };
            }
            function onOpen(evt) {
                writeToScreen("Connected to Endpoint!");
                doSend(textID.value);
            }
            function onMessage(evt) {
                writeToScreen("Message Received: " + evt.data);
            }
            function onError(evt) {
                writeToScreen('<span style="color: red;">ERROR:</span> ' + evt.data);
            }
            function doSend(message) {
                writeToScreen("Message Sent: " + message);
                websocket.send(message);
                // You can close communication at any time
                //websocket.close();
            }
            function writeToScreen(message) {
                var pre = document.createElement("p");
                pre.style.wordWrap = "break-word";
                pre.innerHTML = message;
                  
                output.appendChild(pre);
            }
            window.addEventListener("load", init, false);
        </script>
        <h1 style="text-align: center;">Hello World WebSocket Client</h2>
        <br>
        <div style="text-align: center;">
            <form action="">
                <input onclick="send_message()" value="Send Message" type="button">
                <input id="textID" name="message" value="Hello WebSocket!" type="text"><br>
            </form>
        </div>
        <div id="output"></div>
</body>
</html>

Spring boot

Filed under: Ciència i tecnologia — Joaquim Perez Noguer at 10:37 am on Dijous, Agost 1, 2019

Guia d’iniciació al SpringBoot

https://www.baeldung.com/spring-boot

hashCode()

Filed under: Ciència i tecnologia — Joaquim Perez Noguer at 12:53 pm on Dimecres, Juliol 31, 2019

En Java si es vol utilitzar una classe i Collections (Map, Set, …) cal definir els mètodes equals() i hashCode().

class Node<K, V> {

        private K key;
        private V value;
        private Node<K, V> next;

@Override
public int hashCode() {
      int result = key != null ? key.hashCode() : 0;
      result = 31 * result + (value != null ? value.hashCode() : 0);
      result = 31 * result + (next != null ? next.hashCode() : 0);
      return result;
}
@Override
public boolean equals(Object x) {
    if (x==null) return false;
    if (x.getClass() != this.getClass()) return false;
    Node<K,V> other= (Node<K,V>)x;
    if (other.key!=null && this.key==null) return false;
    if (other.value!=null && this.value==null) return false;
    return this.key.equals(other.key) && this.value.equals(other.value);
}
}

Sempre s’ha de complir que

  • si A.equals(B) => B.equals(A)
  • si A.equals(B) => A.hashCode() == B.hashCode()

Però en canvi no cal que

  • A.hashCode() == B.hashCode() => A.equals(B)

Per tant public int hashCode() { return 1; } també seria correcte tot i que molt ineficient !

Una altra solució és utilitzar les eines que proporcionen els IDE.

I encara una altra solució és utilitzar les biblioteques d’Apache o Lombock:

http://commons.apache.org/proper/commons-lang/javadocs/api-3.9/org/apache/commons/lang3/builder/HashCodeBuilder.html

https://projectlombok.org/features/Data

import lombok.AccessLevel;
import lombok.Setter;
import lombok.Data;
import lombok.ToString;

@Data 
public class DataExample {
  private final String name;
  @Setter(AccessLevel.PACKAGE) private int age;
  private double score;
  private String[] tags;
  
}

Consideracions sobre model Relacional Objecte

Filed under: Ciència i tecnologia — Joaquim Perez Noguer at 9:18 am on Dimecres, Juliol 31, 2019

Un problema que no se’n parla gaire és el problema derivat de desar les dades en un model relacional però treballar-les amb un model objecte, tot i que moltes vegades el model objecte acaba sent un model orientat a serveis.

La solució més estesa és utilitzar Hibernate o un altre ORM (Object/Relational Mapping ). El problema ve quan l’aplicació evoluciona, el model de dades canvia i cal propagar els canvis al codi del programa.

Una alternativa a utilitzar ORM és utilitzar una classe DAO genèrica per a totes les taules de la base de dades. Aquesta solució permet reduir molt el codi. És molt més eficient, perquè no cal mapar les dades cada vegada que es llegeix de la bbdd. Però per contra complica com la comprensió i manteniment del codi allà on hi ha la lògica de negoci. Per exemple

taules.getTaula("Factura").get(codiFactura).getColumna("Total")= ...
taules.persisteixCanvis("Factura");

Una solució que es podria explorar seria utilitzar objectes POJO buits, sense codi com a facade de la classe DAO genèrica. Aleshores es podria utilitzar AOP per connectar els POJO a la classe DAO genèrica.

Quedaria alguna cosa així:

public class TaulaFactura {
   double total;
   id     idFactura;
   List<TaulaLiniesFactura>   liniesFactura; 
   // getters and setters publics ...
}

class DAO {
   Map< String, TaulaGenerica >  taules;
   public void putTaula(String nom, Schema schema) { ... };
   public TaulaGenerica getTaula(String nom) { ... };
   public void peristeixCanvis(String nom) { ... };
}

public class AOP {
// intercepta els getters i setters de TaulaFactura  i els connecta amb el DAO
}

  

Windows 10 virtualitzat amb Virtualbox

Filed under: Linux — Joaquim Perez Noguer at 8:14 pm on Dilluns, Març 18, 2019

Si voleu utilitzar Windows i Linux en el mateix ordinador teniu dues opcions:

  • Instal·lar primer Windows i després instal·lar Linux dient-li que no vols esborrar el Windows del disc dur (Solució Dual boot). Així cada vegada que vulgueu utilitzar un o altre sistema haureu de reiniciar l’ordinador.
  • Instal·lar només Linux. Instal·lar una aplicació de virtualització com Virtualbox. Instal·lar una imatge de Windows virtualitzada. Amb aquesta solució podreu utilitzar els dos sistemes sense haver de reiniciar l’ordinador. Només haureu d’arrencar el Virtualbox com una aplicació més del Linux i des d’allà la imatge de Windows.

Podeu seguir la guia següent per instal·lar Windows 10 utilitzant virtualbox:

https://itsfoss.com/install-windows-10-virtualbox-linux/

  1. Necessitareu 4Gb de disc per a la imatge ISO del Windows + 20Gb de disc on s’executarà el Windows dins de Linux. Penseu que també necessitareu memòria RAM (uns 4Gb per anar bé).
  2. Baixeu (des d’un Linux) la imatge ISO de Windows de https://www.microsoft.com/en-in/software-download/windows10ISO
  3. Instal·leu el virtualbox: sudo apt-get install virtualbox
  4. Un cop instal·lat arranqueu el virtualbox i configureu la imatge
    • Cliqueu Nou
    • Poseu un nom a la imatge: “Windows 10”
    • RAM: 2Gb
    • Disc dur: Crea un disc dur virtual
    • Tipus de fitxer: VDI
    • Emmagatzematge: Dinàmic
    • Màx disc: 32Gb
  5. Un cop tingueu la imatge configurada afegiu-li la imatge ISO
    • Configureu la imatge
    • Aneu a la secció Emmagatzematge
    • Afegiu un disc i seleccioneu on teniu la imatge ISO del Windows
  6. Executeu la imatge i instal·leu el Windows

SQLplus prettyprint

Filed under: Ciència i tecnologia — Joaquim Perez Noguer at 3:15 pm on Dilluns, Febrer 11, 2019

Si aneu al SQLplus i feu una query com

select * from all_tables;

Us acaba sortint una cosa illegible. Per solucionar-ho proveu

set pagesize 0
set wrap off
set linesize 60

Una altra solució molt interessant és exportar-ho a un fitxer html extern (out.html per exemple)

set pagesize 1000
set wrap off
SET MARKUP HTML ON
spool  out.html

Hi ha moltes opcions per fer-ho més llegible:

https://docs.oracle.com/cd/A87860_01/doc/server.817/a82950/ch4.htm

Comparativa de llenguatges

Filed under: Ciència i tecnologia — Joaquim Perez Noguer at 12:03 am on Diumenge, Febrer 10, 2019

Vist a http://rosettacode.org/wiki/Category:Programming_Tasks


main
    Java:   public MyClass {  public static void main(String[] args) {  System.out.println("hola"); } }
    C#:     using System;  class MyClass { public static void Main() {  Console.WriteLine("hola"); } }
    JS:     function f() { print("hola"); }    f()
    Python: def f():   print("hola")    if __name__ == "__main__":   f()
    Kotlin: fun main(args: Array<String>) { println("hola"); } 
    Scala:  object MyObj extends App { def foo { println("hola"); }  foo }

Biblioteques
   Java:   package a.b.c;   import a.b.c;
   C#:     using a.b.c;     namespace a.b.c { ... }
   JS:     const pali = require('../lib/palindrome');
   Kotlin: 
   Python: import doctest
   Scala:  import org.scalacheck._


Strings
    Java:    String doubleQuotes = "\"\"";  
    C#:      string doubleQuotes = "\"\"";
    JS:      var doubleQuotes = "\"\"";  var doubleQuotes = '""';
    Python:  doubleQuotes = "\"\"";   doubleQuotes = '""';
    Kotlin:  val doubleQuotes = "\"\"";
    Scala:   val doubleQuotes = "\"\"";  

Strings multiline
    Java:     String multiline = " ... \n ...";  
    C#:       string doubleQuotes = @" ... ";
    JS:       var multiline = """ ... """;
    Python:   multiline = """ ... """;  multiline =''' ... '''
    Kotlin:   val multiline = """ ... """;
    Scala:    val multiline = """ ... """;

Boolean
    Java:     (a && b) || (!c ^ d)
    C#:       (a && b) || (!c ^ d)
    JS:       (a && b) || (!c)
    Python:   (a and b) or (not c)
    Kotlin:   (a and b) or (!c xor d)   però també  (a && b) || (!c ^d)
    Scala:    (a && b) || (!c)

Foreach
    Java:     for (String thing : things) { ... }
    C#:       foreach (string thing in things) { ... }
    JS:       for (var thing in things) { ... }
    Python:   for thing in things: 
    Kotlin:   for (thing : things) { ... }
    Scala:    for (thing <- things) { ... }

For
    Java:     for (int i=0; i< 4; i++) { ... }
    C#:       for (int i = 0; i < 5; i++) { ... }
    JS:       for (var i=0; i< 4; i++) { ... }    o  range(5).forEach( func )
    Python:   for i in range(1,6): 
    Kotlin:    for (i in 1..4) { ... }   o  (1..4).forEach { ... }
    Scala:    for (i <- 1 to 4) { ... }


While
    Tots:    while ( condicio ) { ... }
    Python:  while n > 0 :


Try/catch
    Java:  try { throw new Exception(); } catch (Exception e) { ... } finally { ... }
    C#:    try { throw new Exception(); } catch (Exception e) { ... } finally { ... }
    JS:    try { throw(new Exception()); } catch (e if e instanceof Exception) { ... } finally { ... }
    Python: try: ... raise Exception ... except Exception: ...
    Kotlin: try { throw Exception(); } catch (e : Exception) { ... } finally { ... }
    Scala:  try { new Exception } catch { case e: Exception => ... }


String compare
   Java:  str1.equals(str2)
   C#:    string.Compare( str1, str2 )
   JS:    str1 === str2
   Python: str1 == str2
   Kotlin: str1 == str2
   Scala:  str1 == str2
   

Object ref compare
   Java:  str1 == str2
   C#:    
   JS:
   Python:
   Kotlin: str1 === str2
   Scala:  str1 eq str2

Arrays
    Java:   String[][] funny_matrix = new string[][]{ {"clowns", "are"} , {"not", "funny"} };
    C#:     string[,] funny_matrix = new string[2,2]{ {"clowns", "are"} , {"not", "funny"} };
    JS      var  matrix =  [["clowns", "are"] , ["not", "funny"]]
    Kotlin: var  matrix = arrayOf( 1,2,3,4 );
    Python: matrix =  [["clowns", "are"] , ["not", "funny"]]
    Scala:  val b = Array("foo", "bar", "baz")    

Lists
   Java:
   C#:     List<int> list = new List<int>();  list.Add(10);   print(list[0]) ;
   JS:       
   Kotlin:
   Python: list = []   list.append(10)     list[0]



Function
   Java:  static double mult( double x, double y ) { return x*y; }
   C#:    static double mult( double x, double y ) { return x*y; }
   JS:    function mult(a, b) { return a*b; }
   Kotlin: fun mult(a: Int, b: Int): Int { return a * b }
   Python: def multiply(a, b): return a * b 
   Scala:  def multiply(a: Int, b: Int) = a * b

Lambda Function
   Java:  
   C#:    Func<double, double, double> multiply = ((a,b) => a*b);
   JS:    var multiply = (a, b) => { return a * b };
   Kotlin:
   Python: multiply = lambda a, b: a * b
   Scala:
 
Paràmetres opcionals
   Java:   addWidget(AddWidgetParams.Builder("root").x(100).y(35).build());
   C#:     void AddWidget(string parent, float x = 0, float y = 0, string text = "Default"); 
             AddWidget("root", 320, 240, "First"); 
             AddWidget("root", text: "Footer", y: 400);
   JS:     function addWidget(parent, options) { opts = {}; opts.x = options.x || 0;  opts.y = options.y || 1; opts.text = options.text || 'pork chops'}
             addWidget("root", {text: "lamb kebab", x: 3.14});
   Kotlin: fun someFunction(first: String, second: Int = 2, third: Double);
             someFunction("positional", 1, 2.0);  
             someFunction(first = "named", second = 1, third = 2.0)
   Python: def show_args(parent, text = 'default value', *posparam, **keyparam): ...
             show_args('POSITIONAL', 'OPTIONAL')
             show_args(text='OPTIONAL', parent='KEYWORD')
             show_args('POSITIONAL', 'OPTIOMAL', 'EXTRA1', 'EXTRA2', 'EXTRA3',  kwa1='EXTRA', kwa2='KEYWORD', kwa3='ARGUMENTS')
   Scala:  def add(x: Int, y: Int = 1) = x + y
             add(5)
             add(y=10, x=4)


Function in/out parameters
    C#:    void Foo(ref int Value) { Value += 1 }  ;  int p=1;  Foo(ref p);




Classes

Java:
------------

  public class Being implements Serializable {
    public boolean isAlive() { return alive; } 
    public void setAlive(boolean alive) { alive= alive; } 
    private boolean alive;
  }
 
  public class Animal extends Being implements Serializable {
    public Animal() { }
 
    public Animal(long id, String name, boolean alive ) {
      Id = id;
      Name = name;
      Alive = alive;
    }
 
    public long getId() { retrun id; }
    public void setId(long id) { id= id; }

    public String getName() { return name; }
    public void setName(String name) { name=name; }

    long id;
    String name;
 
    public void print() { System.out.println( String.format("{0}, id={1} is {2}",
      Name, Id, Alive ? "alive" : "dead")); }
  }

  Animal animal= new Anima( 1, "starky", true );







C#:
--------------


namespace Object_serialization
{
  [Serializable] public class Being
  {
    public bool Alive { get; set; }
  }
 
  [Serializable] public class Animal: Being
  {
    public Animal() { }
 
    public Animal(long id, string name, bool alive = true)
    {
      Id = id;
      Name = name;
      Alive = alive;
    }
 
    public long Id { get; set; }
    public string Name { get; set; }
 
    public void Print() { Console.WriteLine("{0}, id={1} is {2}",
      Name, Id, Alive ? "alive" : "dead"); }
  }
} 
 

Animal animal= new Animal( 1, "starky" )




Python:
------------------

class Entity:
	def __init__(self):
		self.name = "Entity"
	def printName(self):
		print self.name
 
class Person(Entity): #OldMan inherits from Entity
	def __init__(self): #override constructor
		self.name = "Cletus" 


instance1 = Person()
 
instance2 = Entity()



Comparativa de llenguatges de programació

Filed under: Ciència i tecnologia — Joaquim Perez Noguer at 6:38 pm on Dissabte, Febrer 9, 2019

M’agradaria comparar els següents llenguatges

  • Java
  • Javascript
  • .Net
  • Python
  • Scala

M’agradaria fer una taula comparant coses bàsiques com

  • Assignació strings
  • Assignació númerica
  • Com es treballa amb taules
  • Com es treballa amb llistes
  • Bucles
  • Condicions
  • Com es treballa amb diccionaris
  • Com es fa el main()
  • Com es treballa amb classes

I amb coses més complexes com

  • Com es treballa amb Annotations / Decorations
  • Com se treballa amb SQL
  • Com es treballa amb aplicacions visuals
  • Com es treballa amb aplicacions web HTML
  • Com es treballa MVC
  • Expressions Lambda

Catalan numbers en Scala

Filed under: General — Joaquim Perez Noguer at 6:14 pm on Dissabte, Febrer 9, 2019

Demostració de com implementar la seqüència de números Catalans amb Scala. Vist a Rosetta code.


object Catalan {
  def factorial(n: BigInt) = BigInt(1).to(n).foldLeft(BigInt(1))(_ * _)
  def catalan(n: BigInt) = factorial(2 * n) / (factorial(n + 1) * factorial(n))
 
  def main(args: Array[String]) {
    for (n <- 0 to 15) {
      println("catalan(" + n + ") = " + catalan(n))
    }
  }
}

Next Page »