JavascriptProva

martedì 1 maggio 2018

Classi in php: modificatori di accesso ed ereditarietà

Ecco, anche in PHP ci sono i modificatori di accesso public, private e protected.
Ma forse mi conviene vederli in blocco con l'ereditarietà.
Questo è il link di riferimento.

Eseguo pedissequamente o quasi...

Molto semplice e banale: questo è l'esempio che ho trovato sul tutorial
<?php
class person{
    var $name;
    public $height;
    protected $social_insurance;
    private $pinn_number;
    
    function __construct($persons_name){
        $this->name=$persons_name;
    }
    
    function set_name($new_name){
        $this->name=$new_name;
    }
    
    function get_name(){
        return $this->name;
    }
}

$stefan=new person("Stefan Mischook");
echo "Stefan's full name ".$stefan->get_name();
echo "Tell me private stuff: ".$stefan->pinn_number;
?> 
La variabile private non può venir letta da fuori della classe.
Comportamento del tutto analogo a ciò che accade in altri linguaggi OOP.

Ora vediamo l'ereditarietà.
<?php
class person{
    var $name;
    public $height;
    protected $social_insurance;
    private $pinn_number;
    
    function __construct($persons_name){
        $this->name=$persons_name;
    }
    
    public function set_name($new_name){
        $this->name=$new_name;
    }
    
    public function get_name(){
        return $this->name;
    }
}

class employee extends person{
    function __construct($employees_name){
        $this->name=$employees_name;
    }
}

$stefan=new person("Stefan Mischook");
$james=new employee("Johnny Fingers");

echo "----->".$james->get_name();

?>
----->Johnny Fingers

Bene. Abbiamo visto l'ereditarietà e i modificatori di accesso.
L'ultima cosa che devo vedere è l'overriding dei metodi (che comunque è uguale a quello che conosco da altri linguaggi OOP).

Mi introduco alle classi in PHP

Facciamo un po' di prove con il tipo di variabile Object, vale a dire il corrispettivo delle classi in altri linguaggi...

Le classi possono contenere in esse delle funzioni.
Ecco, ho trovato il modo di creare una classe con getter e setter di una proprietà.
Ci riprovo.
<?php
class Persona {
    var $nome;
    function set_name($newName){
        $this->nome=$newName;
    }
    
    function get_name(){
        return $this->nome;
    }
}

$Uomo=new Persona();
$Uomo->set_name("Mario");
echo $Uomo->get_name();

?> 
E funziona:
Mario

Vediamo se è possibile usare pure un costruttore...

<?php
class Persona {
    var $nome;
    function Persona($myName){
        $this->nome=$myName;
    }
    
}

$Uomo=new Persona("Joe Fetecchia");

echo $Uomo->nome;

?> 
Joe Fetecchia

Sì, si può usare anche il costruttore come negli altri linguaggi.
Ma il costruttore si può usare anche con questo costrutto:
<?php
class Persona {
    var $nome;
    function __construct($newName){
    $this->nome=$newName;
    }
}

$Uomo=new Persona("Pippo");

echo $Uomo->nome;

?> 
Pippo

Scope delle variabili in php

Mi sono esercitato su altri blog con le variabili php, ma è meglio che lo faccia qui perché per me il php è una novità, più che una cosa su cui esercitarsi.
L'ho già toccato distrattamente in passato, ma adesso lo scopro come una necessità piuttosto impellente.

Ho visto i tipi di variabili, perlomeno alcuni tipi di variabili, ma adesso è il caso che faccia uno studio generale.

Lo Scope è fondamentale.
Anche qui, come in JavaScript, esistono le funzioni.
Scrivo una funzione la chiamo, banalmente.
<?php

function funzione(){
    echo "Questa è una funzione";
}

funzione();
?> 
Sì, funziona esattamente come il JavaScript.

Detto questo, analizziamo lo scope.
<?php
$variabile=123;
function funzione(){
    echo $variabile;
}

funzione();
?>

Notice: Undefined variable: variabile in /storage/ssd3/737/3147737/public_html/index.php on line 4

La variabile dichiarata fuori dalla funzione non viene letta nella funzione.

variabile letta al di fuori di una funzione:
<?php
$variabile=123;
function funzione(){
    echo "funzione";
}

funzione();
echo $variabile;
?> 
funzione123



Allo stesso modo, la variabile dichiarata nella funzione non dovrebbe poter essere letta al di fuori.
Proviamo:
<?php

function funzione(){
    $variabile=123;
}

funzione();
echo $variabile;
?> 

Notice: Undefined variable: variabile in /storage/ssd3/737/3147737/public_html/index.php on line 8


...e dovrebbe venir letta all'interno della funzione:
<?php

function funzione(){
    $variabile=123;
    echo $variabile;
}

funzione();

?> 
123



Come faccio a leggere una variabile globale all'interno di una funzione?
Credo di aver capito che ci sono due modi:
  • mediante la parola chiave global;
  • mediante l'array $GLOBALS[index] in cui sono immagazzinate le variabili globali (in index va il nome della variabile).
Proviamo...

<?php
$variabile=123;
function funzione(){
    global $variabile;
    echo $variabile;
}

funzione();

?> 
123



Proviamo l'altro metodo:
<?php
$variabile=123;
function funzione(){
    
    echo $GLOBALS['variabile'];
}

funzione();

?> 
123

Perfetto!

giovedì 15 marzo 2018

Primo approccio con php

Ripeschiamolo, questo php.
<?php

echo "vaffanculo Antonello"

?> 
Questo è un codice estremamente rudimentale.
Lo metto nel file studio.php e lo spedisco sul server.

Vediamo...

vaffanculo Antonello


Sì, funziona.

giovedì 8 febbraio 2018

Creare una libreria "interna" in Android

Spinoso problema delle librerie android.
Il punto chiave è generare un .aar.

Iniziamo con: Click File > New > New Module.
In the Create New Module window that appears, click Android Library, then click Next.

Give your library a name and select a minimum SDK version for the code in the library, then click Finish.

L'ho chiamata Mia Libreria e l'SDK minimo è 17.

E' stata fatta la sincronizzazione di Gradle.
Il cambiamento della voce apply plugin sul modulo Gradle della libreria è già stato cambiato da c.antonello.studiojar3 a com.android.library.
Ora dovrei salvare il file.
Come?
Boh... faccio "Save All"...

Ma il passo completo è Save the file and click Tools > Android > Sync Project with Gradle Files. Vado a cliccare quanto dovuto...

Bene.
Ora se io clicco "build APK" dovrebbe generarmi un AAR...
Lo deduco da questo: When you want to build the AAR file, select the library module in the Project window and then click Build > Build APK


Proviamo...

Fatto, e vediamo se si è generato un AAR...

Non funziona.
La procedura che funziona per creare l'aar è invece
View -> Tool Windows -> Gradle
Sulla finestra di gradle che si apre a destra si va su mialibreria -> Tasks -> assemble, e si generano due aar: una versione debug e una versione release.

Ora il problema è come usare queste librerie.
Ora, dato che la libreria fa parte di questo progetto, posso fare direttamente questo:
Make sure the library is listed at the top of your settings.gradle file, as shown here for a library named "my-library-module":
include ':app', ':my-library-module'
include ':app', ':mialibreria'
Confermato!
Open the app module's build.gradle file and add a new line to the dependencies block as shown in the following snippet:
dependencies {
    compile project(":my-library-module")
}
Vediamo:
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
    compile project(":mialibreria")
}
Vediamo se sincronizza...

Ha sincronizzato.

Ora, nella mia libreria ho messo un codice estremamente fesso per fare la prova:
public class Classe {
    public Classe(){}
    public void Scrivi(){
        System.out.println("Ciao");
    }
}
Vediamo se si riesce a inserire la funzione.
No.


Anziché modificare manualmente il file app Gradle (parte che ho scritto in rosso) si può procedere con File -> Project Structure
Quindi si seleziona la scheda Dependencies e si aggiunge con il + il riferimento alla libreria.
Il file Gradle app si modifica così:
dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
    implementation project(':mialibreria')
}
compile è deprecato, l'uso più moderno è di implementation.

sabato 13 gennaio 2018

IP statico? Come accidenti si fa?

Sulle reti non mi sono mai interessato, e comincio da sottozero.
DHCP = Dynamic Host Configuration Protocol.
Se ricordo bene, sarebbe quel giochino secondo il quale quando un computer si connette a una rete gli viene assegnato un IP diverso volta per volta.
Sperimentiamolo (GUH! GUH!) con questo computer. Qual è il mio IP attuale?

   Indirizzo IPv4. . . . . . . . . . . . : 192.168.113.2
   Subnet mask . . . . . . . . . . . . . : 255.255.255.0
   Gateway predefinito . . . . . . . . . :
Ora faccio la disconnessione e la riconnessione.
   Indirizzo IPv4. . . . . . . . . . . . : 192.168.200.1
   Subnet mask . . . . . . . . . . . . . : 255.255.255.0
   Gateway predefinito . . . . . . . . . :
Ecco, l'IP è cambiato.
Questa è la prova che l'IP è dinamico.


E questo è quello che si vede entrando nel router:
 PC-Antonello
192.168.1.109
Questo è l'IP assegnato in questo momento dal router al mio computer.
Come accidenti si fa a renderlo statico? Si può?

domenica 29 ottobre 2017

VB.NET: giocando con le matrici per scomporre un numero nelle sue cifre.

Rispolvero il VB.
L'idea è raccogliere i numeri derivati dalla scomposizione di un numero in unità, decine, centinaia eccetera, in una matrice, per poi scriverli comodamente ognuno in una label.
Vediamo...

Per ridimensionare le matrici dinamiche in VB ho costruito questo codice:
If (matrice(0) <> Nothing) Then ReDim Preserve matrice(UBound(matrice) + 1)
che dovrebbe funzionare.
Ora metto dei numeri consecutivi da 1 a 10 in una matrice dinamica che inizia con lunghezza 1 (uBound = 0) e si allunga progressivamente a seconda della quantità di elementi che possiederà alla fine.

Public Class Form1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Dim matrice(0) As Integer

        For n = 1 To 10
            If matrice(0) <> Nothing Then ReDim Preserve matrice(matrice.Length)
            matrice(UBound(matrice)) = n
        Next

        For n = 0 To UBound(matrice)
            Debug.Print(matrice(n))
        Next

    End Sub
End Class
1
2
3
4
5
6
7
8
9
10
Posso cambiare liberamente anche la quantità dei dati da immettere nella matrice:
Public Class Form1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Dim matrice(0) As Integer

        For n = 1 To 15
            If matrice(0) <> Nothing Then ReDim Preserve matrice(matrice.Length)
            matrice(UBound(matrice)) = n
        Next

        For n = 0 To UBound(matrice)
            Debug.Print(matrice(n))
        Next

    End Sub
End Class
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Il codice dice che se la voce 0 non è pari a nulla la matrice va ridimensionata a un indice superiore di 1 all'ultimo indice già presente (e quindi uguale alla lunghezza della matrice), quindi il numero va scritto all'ultimo indice presente.
Molto semplice.

Ora posso scomporre il mio numero.
Ecco il codice che ho elaborato, che mi mette in una matrice le cifre di un numero, dopo aver eliminato l'eventuale virgola:
Public Class Form1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load


        Dim numero As Double = 3453653
        Dim stringa As String = numero.ToString.Replace(",", "")
        numero = Convert.ToDouble(stringa)
        Debug.Print(numero)
        Dim quoziente As Integer
        Dim resto As Integer
        Dim matrice(0) As Double

        Do While numero > 0
            quoziente = numero \ 10
            resto = numero Mod 10
            If matrice(0) <> Nothing Then ReDim Preserve matrice(matrice.Length)
            matrice(UBound(matrice)) = resto
            numero = quoziente
        Loop

        For n = UBound(matrice) To 0 Step -1
            Debug.Print(matrice(n))
        Next
    End Sub
End Class
3453653
3
4
5
3
6
5
3
(la matrice va letta al contrario)