27 iunie 2023

Xor Linked List

O listă simplu-înlănțuită cu proprietăți de dublu-înlănțuită, care are nevoie de un singur pointer în loc de doi. 

Sună frumos în teorie, dar este inaplicabil în Java. De fapt, este o aplicație pur teoretică întrucât memoria nu mai este o problemă acum, fiind foarte ieftină. De asemenea, nu te scutește de parcurgerea întregii liste, la fel ca listele simplu-înlănțuite. Pe scurt, brain fuck for no reason, mai jos este o tentativă de implementare (netestată, pentru că... Java):

Notă: getPrev și getNext au nevoie de nodul următor respectiv anterior pentru a-și îndeplini funcția, ceea ce presupune că ai parcurs lista înainte. Doar oleacă mai flexibil, merită oare? Sau îmi scapă ceva?


public class MemEffLinkdListTest {
Node head;

/* Xor Linked List */

private void initList(int length) {
if (length < 1) {
throw new MyBusinessException("Invalid length!");
}

head = new Node("A0");
Node prev = null;
Node current = head;

for (int i = 1; i < length; i++) {
Node next = new Node("A" + i);
Node ptr = prev ^ next; // not possible in Java, we don't have access to memory addresses
current.setPtr(ptr);

prev = current;
current = next;
}
}

private Node getNext(Node current, Node prev) {
return current ^ prev; // not possible in Java
}

private Node getPrev(Node current, Node next) {
return current ^ next; // not possible in Java
}

private class Node {
private String data;
private Node ptr;

public Node(String data) {
this.data = data;
this.ptr = null;
}

public void setPtr(Node ptr) {
this.ptr = ptr;
}

public Node getPtr() {
return ptr;
}

public String getData() {
return data;
}
}
}

24 mai 2023

Angular: trimitere parametri pe route

 Fisierul de routing.ts contine calea de baza extinsa cu 2 parametri (policeReportId si source): 

{
path: Path.POLICE_REPORT_DETAILS + '/:policeReportId',
component: PoliceReportDetailsPage,
canActivate: [Guard]
},
{
path: Path.POLICE_REPORT_DETAILS + '/:policeReportId/:source',
component: PoliceReportDetailsPage,
canActivate: [Guard]
},

In componenta corespunzatoare caii se cauta de parametri:

constructor(private route: ActivatedRoute) {
}
ngOnInit(): void {
if (isNotNullOrUndefined(this.route.snapshot.paramMap?.get('source'))) {
switch (this.route.snapshot.paramMap.get('source')) {
case RedirectSource.DECISIONS:
// do something
}
}
}


In componenta care face redirectarea se specifica parametrul suplimentar:

refreshPage(path: string): void {
path = path + '/' + RedirectSource.DECISIONS;
this.router.navigateByUrl('/', {skipLocationChange: true}).then(() =>
this.router.navigate([path]));
}

P.S. a nu se uita:
<router-outlet></router-outlet>

03 aprilie 2023

Angular form validations triggered at field change

this.form.controls[this.FIELDS.field1].markAsTouched(); // if not touched, it won't validate although it has a value

this.form.controls[this.FIELDS.field].valueChanges.subscribe(() => {

            this.form.controls[this.field1].updateValueAndValidity();

            this.form.controls[this.field2].updateValueAndValidity();

});

23 decembrie 2022

What’s New in Java 11 - partea 2

Ce e nou introdus

java.net.HttpURLConnection -> HttpClient, HttpRequest, HttpResponse

Exemplu #1:











Exemplu #2:















- CompletableFuture a fost introdus în Java8, pentru apeluri asincrone

- join este necesar pentru a aștepta unirea thread-ului curent (main) cu cel care face apelul Http; pentru ca programul să nu se termine înainte de primirea răspunsului


Ce e nou în librării

String:

> "he".repeat(3); // "hehehe"

> "".isBlank(); // true

> "\n\t    text     \u2005".strip();  // "text"

> "1 \n 2 \n 3 \n 4".lines().forEach(System.out::println);   // scrie pe linii noi 1 2  3  4

   

Files:

String readString (Path path);

Path writeString(Path path, CharSequence cs, OpenOptions options);


Optional:  Optional.ofNullable(null).isEmpty();  // true

Predicate::not


Unicode 10

  • update de la Unicode 8 (Java 10)
  • sunt adăugate mai mult de 16.000 caractere noi
  • caracterele aparțin la 10 sisteme de scriere noi, printre care și cel nepalez


Inferența tipului de variabilă locală cu var:

> var name = "Ana";

> (@Nonnull var a, @Nullable var b) -> a.concat(b)










Performanță și securitate

Garbage collector: G1 GC (încă din Java 9)

Noutate: Epsilon GC = rulare fără GC până când crapă aplicația = No GC paradigm

- pt aplicații predictibile în ce privește consumul de memorie, eventual cu o durată de viață mică

- util pt testarea performanței unei aplicații

- este o opțiune experimentală: -XX:+UnlockExperimentalVMOptions, -XX:+UseEpsilonGC

Noutate: Z Garbage Collector

- ia pauză sub 10 secunde

- durata pauzei e constantă (nu crește odată cu heap size)

- disponibil doar în Linux x64: -XX:+UnlockExperimentalVMOptions, -XX:+UseZGC


TLS 1.3 = transport layer security (asemănător https)

11 decembrie 2022

What’s New in Java 11 - partea 1

Java - acum este lansată o dată la 6 luni

Java 11 - marcat pentru suport pe termen lung (LTS)

LTS este doar pentru Oracle JDK (cu subscripție); pentru OpenJDK suportul este de 6 luni, până la următorul release


Java 9: module system

Java 10: local variable type inference

Java 11

  • convergența Oracle JDK cu OpenJDK (singura diferență rămâne LTS)
  • lansat în 2018, în același an cu Java 10; noul plan este de 2 release-uri pe an, cu un LTS o dată la 3 ani („garanția” este minim 3 ani pt produs)
  • poți compila direct java Hello.java (în loc să treci prin pasul intermediar de creare class file) - este limitat la un singur fișier sursă; nu se creează un fișier .class
  • fișier care poate fi rulat ca script (dacă este prefixat cu #! ./bin/java --source 11) - fișierul poate să aibă orice extensie (dacă nu era script se primea eroare)


Deprecări

API-uri scoase din JDK: 

  • java.xml.bind (JAXB) -> jaxb-api & jaxb-impl din javax.xml.bind respectiv com.sun.xml.bind
  • java.xml.ws, java.xml.ws.annotation
  • java.corba
  • java.transaction 
  • java.activation

Metode scoase:

  • destroy & stop(Throwable) din Thread
  • runFinalizersOnExit din java.lang.System & java.lang.Runtime
  • 4 metode din SecurityManager (la functionalitati awt care nu mai sunt suportate)

JavaFX

  • a făcut parte din Oracle JDK 8, 9, 10
  • nu mai face parte din Oracle JDK 11 -> mutat în OpenJFX
  • Javapackager scos -> este propus jpackager

Tehnologii scoase:

  • applet 
  • Java Web Start -> jlink, jpackager?
  • Nashorn (marcat ca deprecated)