Add M03, M06 and M09 UF1 (#4)

Co-authored-by: Guillem <guillem@lordwektabyte.cat>
Reviewed-on: guillem/ASIX#4
Co-Authored-By: Guillem <guillem@hidden.lordwektabyte.cat>
Co-Committed-By: Guillem <guillem@hidden.lordwektabyte.cat>
master
Guillem 2 years ago
parent d060e28d27
commit 65c3d0360c

@ -449,7 +449,7 @@ veuré com hi ha les taules creades
***********
Refèrencies
Refencies
***********
.. target-notes::

@ -7,6 +7,6 @@ M03. Programació bàsica
- No hi ha contingut de la *UF2. Disseny modular*.
.. toctree::
:maxdepth: 3
:maxdepth: 2
UF3

File diff suppressed because it is too large Load Diff

@ -0,0 +1,703 @@
######################################################
UF2. Automatització de tasques i llenguatges de guions
######################################################
************************
A01. Powershell
************************
1.1. Configurant la finestra de consola de PowerShell
=====================================================
1.1.1. Exercici 1
-----------------
**Personalitzar un accés directe que apunti a un directori específic.**
Exercici teòric
1.1.2. Exercici 2
-----------------
**Personalitzar el color i tamany del text.**
Des del menú Herramientas → opciones podem canviar aquests paràmetres. Jo deixaré per defecte els colors que ja hi van i la font i mida que ve predefinida.
.. figure:: /_static/images/M06UF2/Ps1.png
:alt: Finestra configuració consola Powershell
1.1.3. Exercici 3
-----------------
**Familiaritzant-nos amb les característiques d'edició de la consola de PowerShell**
Exercici teòric
1.2. Iniciació a les comandes en PowerShell
===========================================
1.2.1. Exercici 1
-----------------
**Llista tots els cmdlet que utilitzen els verbs "Add", "Clear", "New", and "Set" .**
.. code:: powershell
get-command -Verb Add
get-command -Verb Clear
get-command -Verb New
get-command -Verb Set
1.2.2. Exercici 2
-----------------
**Llista tots els cmdlet que utilitzen el substantiu "Service".**
.. code:: powershell
get-command -type Cmdlet -name *Service*
1.3. L'ajuda a PowerShell
=========================
Capítol teòric sense exercicis.
1.4. Utilitzant cmdlets
=======================
1.4.1. Exercici 1
-----------------
**Obre un terminal de PowerShell i realitza les següents tasques fent servir les Cmdlets corresponents.**
1. Mostra el llistat de totes les tasques o processos:
.. code:: powershell
Get-Process
2. Mostra el llistat de totes les tasques que comencin el seu nom per un caràcter que escullis:
Llisto tots els processos que el seu nom comenci per s.
.. code:: powershell
Get-Process -ProcessName s*
3. Inicialitza un procés nou sense gaire repercussió pel sistema i atura'l mitjançant el seu PID
He arrencat OneDrive i he llistat els processos amb:
.. code:: powershell
Get-Process -ProcessName OneDrive
i he descobert que el seu pid és el 5720. Per a matar-lo, ho faig amb
.. code:: powershell
Stop-Process -Id 5720
4. Mostra el temps de CPU que ha utilitzat un únic procés
Llisto el temps de CPU del procés explorer
.. code:: powershell
Get-Process explorer | Format-List TotalProcessorTime
5. Llista aquells serveis que no estiguin aturats
.. code:: powershell
get-service | where-object {$_.Status -ne 'Stopped'}
6. Llista aquells serveis indicant el nom del teu equip
El meu nom de host és DESKTOP-ET232A1. Per a buscar els serveis que sexecuten al meu equip faré
.. code:: powershell
get-service -ComputerName DESKTOP-ET232A1
7. Canvia el mode d'arrencada d'un servei d'automàtic a manual (després torna'l al seu valor original). Per poder-ho fer, primer hauràs llistar els serveis amb el mode d'arrencada automàtica
.. code:: powershell
get-wmiobject win32_service -Filter "startmode = 'auto'"
Set-Service -Name WSearch -StartupType Manual
Set-Service -Name WSearch -StartupType Automatic
8. Amb quins Cmdlets podem realitzar les tasques de canvi d'estat de serveis? Fes la prova amb el servei “Computer Browser” i amb diferents estats
.. code:: powershell
stop-service
start-service
restart-service
set-service
- Passos a seguir:
* Primer mostrar lestat actual del Servicio Browser
.. code:: powershell
Get-Service -Name Browser | Format-List "Status"
* Després sha daturar
.. code:: powershell
Stop-Service -Name Browser
* Tornem a mirar lestat
.. code:: powershell
Get-Service -Name Browser | Format-List "Status"
* Tornem a engegar el servei
.. code:: powershell
Start-Service -Name Browser
* Tornem a mirar lestat
.. code:: powershell
Get-Service -Name Browser | Format-List "Status"
1.5. Àlies predefinits
======================
1.5.1. Exercici 1
-----------------
**Proveu aquests àlies: dir, ls, gci i Get-ChildItem.**
Tots 4 àlies fan el mateix: llisten el contingut del directori on ens trobem.
1.5.2. Exercici 2
-----------------
**Proveu de fer el vostre propi àlies de qualsevol cmdlet de PowerShell.**
Puc fer un àlies per al cmdlet Set-Service utilitzant ss.
.. code :: powershell
Set-Alias ss Set-Service
1.5.3. Exercici 3
-----------------
**Proveu l'exportació i importació dàlies i comprova que el teu àlies personalitzat és pot fer servir. Primer haureu dexportar àlies, tancar la sessió de PS, tornar a obrir PS i importar els àlies.**
Creo làlies amb
.. code:: powershell
Set-Alias gs Get-Service
Exporto els meus àlies fent
.. code:: powershell
Export-Alias elsmeusalias.txt
Comprovo que gs fa el mateix que Get-Service:
.. figure:: /_static/images/M06UF2/Ps2.png
:alt: Configuro l'àlies i l'executo
Tanco la powershell i torno a iniciar. Comprovo que ara làlies gs no existeix, importo elsmeusalias.txt i es carrega (els errors són deguts als àlies predefinits que ja existeixen i no es poden “sobreescriure”).
.. figure:: /_static/images/M06UF2/Ps3.png
:alt: L'àlies no existeix, carrego la configuració
Després, comprovo que gs ja funciona com a Get-Service:
.. figure:: /_static/images/M06UF2/Ps4.png
:alt: L'àlies funciona de nou
1.6. Scripts en PowerShell
==========================
.. info::
Els exercicis 1, 2 i 3 no existeixen.
1.6.4. Exercici 4
-----------------
Per fer el nostre primer Script en PS obrirem un editor de texte, com per exemple el NOTEPAD i escriurem una línea amb la següent comanda Write-Host "Hello World” Guardarem aquest arxiu a la nostre carpeta ScriptsPS creada a linici amb el nom script1.ps1 i ja podrem executar-ho, simplement posant el nom script1.ps1 al terminal PS.
.. figure:: /_static/images/M06UF2/Ps6.png
:alt: Executar script simple
1.6.5. Exercici 5
-----------------
Una segona forma de fer-ho seria obrint lentorn POWERSHELL ISE, que ens proporciona una interfície gràfica amb diferents menús dajuda per poder crear el nostre Script. Aquestes ajudes ens permeten obtenir la sintaxi exacte de la comanda per a minimitzar errors. Feu el mateix script anterior amb lajuda de POWERSHELL ISE.
.. figure:: /_static/images/M06UF2/Ps7.png
:alt: Creo un nou arxiu de PowerShell i el deso com a helloworldise.ps1
Llavors des de la consola, puc executar-lo amb ./helloworldise.ps1.
.. figure:: /_static/images/M06UF2/Ps8.png
:alt: Executo l'script des de PowerShell ISE
1.7. Variables en PowerShell
============================
1.7.1. Exercici 1
-----------------
**Proveu de crear la vostra pròpia variable i després visualitzeu el valor amb Get-Variable**
.. code:: powershell
$Guillem = “PowerShell”
Get-Variable
.. figure:: /_static/images/M06UF2/Ps9.png
:alt: Setejo la variable i comprovo el valor
1.7.2. Exercici 2
-----------------
**Feu que us demani primer el vostre nom i després la vostra edat. Visualitzeu un missatge per pantalla com aquest: Hola <el vostre nom>, la teva edat és de <vostra_edat> anys**
.. code:: powershell
$nom = Read-Host "Com et dius? "
$edat = Read-Host "Quants anys tens? "
Write-Host "Hola $nom, la teva edat és $edat anys."
.. figure:: /_static/images/M06UF2/Ps10.png
:alt: Resultat execució
1.7.3. Exercici 3
-----------------
**Mostra per pantalla els tipus de les dues variables utilitzades a lexercici anterior.**
Afegirem aquestes línies al final de l'script de l'exercici anterior i l'executarem:
.. code:: powershell
$tipusnom=$nom.GetType()
$tipusedat=$edat.GetType()
Write-Host "La variable nom és del tipus $tipusnom i l'edat és del tipus $tipusedat"
.. figure:: /_static/images/M06UF2/Ps11.png
:alt: Veiem el tipus de les variables
1.8. Operacions amb variables en PowerShell
===========================================
1.8.1. Exercici 1
-----------------
Exercici teòric.
1.8.2. Exercici 2
-----------------
Exercici teòric.
1.8.3. Exercici 3
-----------------
**Experimenta amb PowerShell ISE les diferents opcions que podem fer amb un objecte. Utilitza la consola dajuda de ISE i fes proves amb 5 opcions diferents del que podem fer amb una variable de texte.**
.. code:: powershell
$string="guillem sola"
Write-Host $string.ToUpper() #Transformació a majúscules
Write-Host $string.Substring(0,7) #Tallar entre la posició 0 i la 7 de la cadena
Write-Host $string.Replace("sola","boeck") #Substitució de caràcters o substrings
Write-Host $string.Equals("guillem" + " " + "sola") #Comprovar igualtat entre strings
Write-Host $string.EndsWith("boeck") #Comprovar si la cadena acaba en una altra cadena definida
.. code:: default
GUILLEM SOLA
guillem
guillem boeck
True
False
1.9. Estructures en PowerShell
==============================
1.9.1. Exercici 1
-----------------
**Fes un script que et demani per pantalla dos números i que et digui després quin és el número més gran.**
.. code:: powershell
$num1 = Read-Host "Escriu un número: "
$num2 = Read-Host "Escriu un altre número: "
if ($num1 -gt $num2){
Write-Host "El número 1 és més gran"
}elseif ($num1 -eq $num2){
Write-Host "Són iguals"
}else{
Write-Host "El número 2 és més gran"
}
1.9.2. Exercici 2
-----------------
**Fes un script que et demani per pantalla TAGRADA PROGRAMAR? Si dius que SI en majúscules o minúscules tha de dir per pantalla MOLT BÉ Si dius que NO en majúscules o minúscules tha de dir per pantalla UFF!!! En altre cas tha de dir per pantalla NO TENTENC**
.. code:: powershell
$agrada=Read-Host "T'agrada programar?"
if ($agrada -ieq "si"){
Write-Host "MOLT BÉ"
}elseif($agrada -ieq "no"){
Write-Host "UFF!!!"
}else{
Write-Host "NO T'ENTENC"
}
1.9.3. Exercici 3
-----------------
**Fes un script que et demani per pantalla un número entre el 0 i el 10 i que et digui després per pantalla la teva nota**
.. code:: powershell
[float] $nota = Read-Host "Entra un número del 0 al 10"
switch ($nota) {
{$_ -lt 5} {
Write-Host "SUSPÈS"
}
{$_ -ge 5 -and $_ -lt 7} {
Write-Host "APROVAT"
}
{$_ -ge 7 -and $_ -lt 9} {
Write-Host "NOTABLE"
}
{$_ -ge 9 -and $_ -le 10} {
Write-Host "EXCEL·LENT"
}
default {
Write-Host "Nota invàlida"
}
}
1.9.4. Exercici 4
-----------------
**Amb una estructura repetitiva fes la suma dels 25 primers números naturals**
.. code:: powershell
[int] $suma=0
[int] $num=1
while ($num -le 25) {
$suma+=$num
$num++
}
Write-Host "La suma dels 25 primers números naturals és $suma."
1.9.5. Exercici 5
-----------------
**Amb una estructura repetitiva fes la taula de multiplicar dun número demanat per pantalla**
.. code:: powershell
[int] $numero = Read-Host "De quin número vols saber-ne la taula de multiplicar?"
for ($i=0; $i -le 10; $i++) {
$resultat=$numero*$i
Write-Host "$numero x $i = $resultat"
}
1.9.6. Exercici 6
-----------------
**Crea un cmdlet de powershell que mostri un menú a lusuari amb cuatre operacions disponibles: crear directori, eliminar directori, mostrar directori i sortir. Una vegada escollida una opció correcta el programa ha de sol·licitar un nom de directori i fer la operació sel·leccionada.**
.. code:: powershell
[int] $opcio=0
while ($opcio -ne 4) {
Write-Host "CMDLET Control de directoris"
Write-Host "############################"
Write-Host "1. Crear directori"
Write-Host "2. Eliminar directori"
Write-Host "3. Mostrar directori"
Write-Host "4. Sortir"
$opcio=Read-Host "Tria una opció:"
switch($opcio){
1 {
Clear-Host
$dir= Read-Host "Quin directori vols crear?"
New-Item -ItemType directory -Path $dir
}
2 {
Clear-Host
$dir= Read-Host "Quin directori vols eliminar?"
Remove-Item -Path $dir
}
3 {
Clear-Host
$dir= Read-Host "Quin directori vols veure?"
Get-ChildItem $dir
}
4 {
Clear-Host
Write-Host "Fins aviat!"
}
default {
Clear-Host
Write-Host "Opció incorrecta"
}
}
if ($opcio -ne 4){
Read-Host "Pressiona qualsevol tecla per a continuar"
Clear-Host
}
}
1.10. Variables amb múltiples valors
====================================
1.10.1 Exercici 1
-----------------
**Crea un script de PowerShell que defineixi un array relacional HASH amb usuaris. Els camp de cada usuari han de ser nom_compte, nom_usuari i password. El programa ha de mantenir aquest array amb un menú en el que es pugui:**
- Afegir usuari
- Eliminar usuari
- Buscar per nom dusuari
- Mostrar tots els usuaris
.. code:: powershell
[int] $opcio=0
$users = @{}
while ($opcio -ne 5) {
Write-Host "CMDLET Control d'usuaris"
Write-Host "############################"
Write-Host "1. Afegir usuari"
Write-Host "2. Eliminar usuari"
Write-Host "3. Buscar usuari per nom"
Write-Host "4. Mostrar tots els usuaris"
Write-Host "5. Sortir"
$opcio=Read-Host "Tria una opció:"
switch($opcio){
1 {
Clear-Host
Write-Host "AFEGIR USUARI"
$nom_compte= Read-Host "Nom del compte"
$nom_usuari= Read-Host "Nom de l'usuari"
$password= Read-Host -AsSecureString "Contrasenya"
#Fer hash de la contrasenya
$md5 = new-object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
$utf8 = new-object -TypeName System.Text.UTF8Encoding
$hash = [System.BitConverter]::ToString($md5.ComputeHash($utf8.GetBytes($password)))
#Afegir valors
$users.Add("$nom_compte", @("$nom_usuari", "$hash"))
}
2 {
Clear-Host
Write-Host "ELIMINAR USUARI"
$nom_compte= Read-Host "Quin usuari vols eliminar?"
$users.Remove("$nom_compte")
}
3 {
Clear-Host
Write-Host "CERCA USUARI"
$nom_compte = Read-Host "Quin nom d'usuari vols veure?"
Write-Host $users[$nom_compte]
}
4 {
Clear-Host
Write-Host "LLISTA TOTS ELS USUARIS"
$users
}
5 {
Clear-Host
Write-Host "Fins aviat!"
}
default {
Clear-Host
Write-Host "Opció incorrecta"
}
}
if ($opcio -ne 5){
Read-Host "Pressiona qualsevol tecla per a continuar"
Clear-Host
}
}
1.11. Funcions en PowerShell
============================
1.11.1. Exercici 1
------------------
**Feu un script PowerShell que demani un caracter por pantalla i us digui després si és un número o una lletra. Aquest exercici sha de realitzar obligatòriament utilitzant una funció.**
La manera de saber-ho és provar de fer un parsing del caràcter entrat cap a enter. Si la conversió és possible, serà un número; si no és possible fer el parsing, serà una lletra.
.. code:: powershell
function numeric_lletra($param){
if (([System.Int32]::TryParse($param, [ref] 0))){
Write-Host "És un número"
}else{
Write-Host "És una lletra"
}
}
$caracter=Read-Host "Escriu un caràcter"
numeric_lletra($caracter)
1.12. Exercicis diversos en PowerShell
======================================
1.12.1. Exercici 1
------------------
**Crear un arxiu de text anomenat exercici1.txt en el directori PRACTICA1 que hauràs creat prèviament.**
.. code:: powershell
New-Item -ItemType file exercici1.txt
1.12.2. Exercici 2
------------------
**Renombra larxiu creat anteriorment a exercici2.txt i mou-lo al directori POWERSHELL**
.. code:: powershell
Rename-Item exercici1.txt exercici2.txt
1.12.3. Exercici 3
------------------
**Crear un altre arxiu de text anomenat exercici3.txt que contingui el text "Hola, he creat un arxiu"**
.. code:: powershell
New-Item -ItemType file exercici3.txt
Set-Content -Path exercici3.txt -Value "Hola, he creat un arxiu"
1.12.4. Exercici 4
------------------
**Afegir el text "Hola, una altra línia" a larxiu exercici3.txt creat anteriorment**
.. code:: powershell
Add-Content -Path exercici3.txt -Value "'r'nHola, una altra línia" #Els valors <code>'r'n</code> són els que generen el retorn de carro i la línia nova respectivament
1.12.5. Exercici 5
------------------
**Esborrar larxiu exercici3.txt demanant confirmació**
.. code:: powershell
Remove-Item -Path exercici3.txt -Confirm:$true
1.12.6. Exercici 6
------------------
**Feu un script que creï un arxiu LLISTAT.TXT on hi haurà la llista de tots els arxius .EXE de la unitat C: del vostre sistema**
.. code:: powershell
Get-ChildItem -Path C:\ -Recurse -Depth 2 -Filter "*.exe" | Format-List Name | Out-File -FilePath LLISTAT.TXT
1.12.7. Exercici 7
------------------
**Presentar en 4 columnes el nom del arxius de C:\Windows que comencin per A o per E, inclosos els seus subdirectoris**
.. code:: powershell
Get-ChildItem -Path C:\Windows -File -Recurse -Depth 1 | Where {$_.Name -Like "a*" -or $_.Name -Like "a*"} | Format-Table -Wrap
1.12.8. Exercici 8
------------------
**Feu un script que faci les següents tasques seqüencialment:**
1. Mostri els serveis de Windows
2. Aturi el servei dAUDIO demanant confirmació
3. Mostrar els serveis de Windows en mode PowerShell
4. Mostri els serveis de Windows en mode gràfic
5. Arrenqui el servei dAUDIO en mode DEBUG
Entre cada punt hi haurà una pausa de 3 segons
.. code:: powershell
function retard($segons){
Start-Sleep -Seconds $segons
}
#Llistar serveis com en CMD, suposo.
net start
retard(3)
#Per defecte no demana confirmació a no ser que defineixi -Confirm com a true
Stop-Service AudioSrv -Confirm:$true
retard(3)
#Mostrar els serveis en "mode powershell"? Quina diferència hi ha entre el punt 1 i el punt 3? Bastanta ambigüitat.
Get-Service
retard(3)
Start-Process -FilePath "C:\Windows\System32\services.msc"
retard(3)
#Per defecte demana confirmació a no ser que defineixi -Confirm com a false
Start-Service AudioSrv -Debug -Confirm:$false

@ -0,0 +1,9 @@
########################################
M06. Administració de sistemes operatius
########################################
.. toctree::
:maxdepth: 2
UF1
UF2

@ -0,0 +1,896 @@
######################################
UF1. Llenguatges de guions de servidor
######################################
.. toctree::
:maxdepth: 2
UF1
********************************************************
A01. Instal·lació i configuració del nostre servidor web
********************************************************
1.1. Objectius
==============
L'objectiu serà aprendre a instal.lar i configurar el nostre web server, i començar a crear llocs virtuals. Concretament, crearàs el site que doni suport a l'assignatura daquest mòdul: `http://localhost/M9`.
1.2. Enunciat
=============
Les tasques a realitzar en aquesta pràctica són:
Instal·lar Apache en una màquina virtual de nova creació
--------------------------------------------------------
Em basaré en una màquina amb una instal·lació minimalista de **CentOS 7** amb adreça IP **192.168.56.200**.
Per a instal·lar Apache hem d'instal·lar el paquet `httpd`, disponible des dels repositoris base de CentOS:
.. code:: bash
yum install httpd -y
Per tal d'evitar problemes i simplificar la solució, desactivaré el SELinux i deshabilitaré el Firewall del sistema amb les comandes:
.. code:: bash
setenforce 0
systemctl disable firewalld
systemctl stop firewalld
Una vegada instal·lat el programa, el podem engegar i habilitar perquè arrenqui automàticament amb el sistema amb:
.. code:: bash
systemctl enable httpd
systemctl start httpd
Per a comprovar-ho, podem obrir el navegador des de l'ordinador client (la màquina física) i demanar per `http://192.168.56.200`. Si tot ha anat bé i Apache està funcionant, ens sortirà la pàgina principal que s'activa per defecte a l'instal·lar-lo:
.. figure:: /_static/images/M09UF1/M09UF1PT11.png
:alt: Pàgina per defecte d'Apache a CentOS
Crear el site http://localhost/M9
---------------------------------
Simplificaré la creació d'aquest directori posant l'arrel del site al directori `/var/www/html/M9` de manera que, la configuració per defecte d'Apache servirà el contingut d'aquest directori sense necessitat de fer-hi canvis.
Crearé el directori amb
.. code:: bash
mkdir /var/www/html/M9
i li donaré permisos al servidor web per tal que pugui llegir el contingut i servir-lo
.. code:: bash
chown apache.apache /var/www/html/M9
Una vegada creat el subdirectori, crearem un arxiu `index.html` que serà el que servirà el web server per defecte quan naveguem cap a `http://192.168.56.200/M9`.
.. code:: bash
nano /var/www/html/M9/index.html
i hi afegirem un contingut HTML bàsic com ara:
.. code:: html
<h1>Web Guillem</h1>
desarem l'arxiu i obrirem el navegador i demanarem per `http://192.168.56.200/M9`. Ens sortirà el contingut de l'arxiu HTML que hem creat abans:
.. figure:: /_static/images/M09UF1/M09UF1PT12.png
:alt: Pàgina de prova que hem configurat
Utilitza un port diferent del 80 per accedir a la web
-----------------------------------------------------
Per a poder canviar el port d'escolta del servidor web haurem de modificar l'arxiu de configuració del dimoni del servidor. En CentOS 7 (i versions equivalents de Fedora i Red Hat Enterprise Linux) es troba a ``/etc/httpd/conf/httpd.conf``. Editarem l'arxiu amb ``nano``, per exemple, i buscarem la línia on es defineix la directiva **Listen**:
.. code:: default
(...)
# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, instead of the default. See also the <VirtualHost>
# directive.
#
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
Listen 80
(...)
Una vegada haguem localitzat aquesta línia, podem canviar el valor per defecte pel nou port que volguem configurar. Podem fer que deixi d'escoltar pel ``80`` i escolti pel ``8080`` o bé podríem optar per afegir una nova directiva ``Listen`` i fer que el servidor web escoltés en múltiples ports; sempre i quan no estiguin en ús per a altres serveis.
Jo opto per a deixar d'escoltar pel **80** i escoltar només les peticions pel **1996**; de manera que la línia remarcada anteriorment es converteix en:
.. code:: default
(...)
# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, instead of the default. See also the <VirtualHost>
# directive.
#
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
Listen 1996
(...)
A continuació hem de parar i tornar a engegar el servidor web per tal que recarregui la configuració nova i passi a escoltar peticions pel port ``1996``:
..code :: bash
systemctl restart httpd
Una vegada aplicada la nova configuració, podem accedir a la web pel port triat, definint-lo a la URL tal que ``http://192.168.56.200:1996/M9`` i obtindrem el mateix resultat que abans:
.. figure:: /_static/images/M09UF1/M09UF1PT13.png
:alt: Pàgina de prova servida des d'un port diferent
.. note::
Es pot veure que la directiva Listen permet un número com a argument per a referir-se al port a través del que volem que escolti el servidor, però també podem definir una combinació adreça IP+port en el format ``x.y.z.t:pppp``. Això pot ser útil per a servidors on tenim més d'una targeta de xarxa i volem restringir l'accés a través de només una d'elles. Si el meu servidor estigués accessible en 2 xarxes diferents com ara ``192.168.56.0/24`` i ``172.20.20.0/24``, podria decidir que només els usuaris des de la xarxa ``192.168.56.0/24`` tinguessin accés si definís la directiva com:
``Listen 192.168.56.200:1996``
D'aquesta manera, li estic dient a Apache que només escolti les peticions HTTP que li provinguin per la targeta de xarxa que té IP=192.168.56.200 i que no escolti per la 172.20.20.X.
Protegir amb password i contrasenya el site http://localhost/M9
---------------------------------------------------------------
La directiva per a permetre que Apache llegeixi i tingui en compte arxius addicionals ``.htaccess`` l'afegirem al directori d'arxius de configuració creant un arxiu nou:
.. code:: bash
nano /etc/httpd/conf.d/m9.conf
I hi posarem el següent contingut:
.. code:: default
<Directory /var/www/html/M9>
AllowOverride all
Require all granted
</Directory>
De manera que estem definint directives per a un directori concret; en aquest cas, per al directori on hem posat la web de prova. La directiva ``AllowOverride all`` és la que permet que els arxius ``.htaccess`` de dins d'aquest directori, en cas d'existir, siguin parsejats per l'Apache i apliqui les directives que s'hi hagin descrit.
Per a protegir el directori de M9 d'usuaris no autoritzats afegirem doncs, un arxiu ``.htaccess`` al directori des d'on se serveix la web: ``/var/www/html/M9`` amb el nom amb el següent contingut:
.. code:: default
AuthType Basic
AuthName "Area restringida"
AuthUserFile /var/www/html/.htpasswd
Require valid-user
La línia important és la que defineix una ruta a un arxiu anomenat ``.htpasswd``. És important perquè en aquest arxiu és on definirem una relació entre usuaris i passwords de manera que Apache consulti aquest arxiu per a saber si un usuari pot accedir a aquell directori o no. Per a crear aquest arxiu de claus, usarem la comanda ``htpasswd``:
.. code:: bash
htpasswd -c /var/www/html/.htpasswd guillem
Aquesta comanda crea un arxiu ``.htpasswd`` a la ruta desitjada i ens demanarà la contrasenya que volem definir per a l'usuari que li passem com a últim paràmetre de manera que, una vegada "registrat" aquell usuari amb la seva contrasenya, podem veure que l'arxiu ``.htpasswd`` que s'ha creat té el següent contingut:
.. code:: default
guillem:$apr1$9CRXnHWv$s4M.oat2SCzHMdKfz4Mhp0
on s'hi relaciona un usuari ``guillem`` amb un `hash` de la contrasenya que li hem definit. Si volem afegir més usuaris podem repetir la mateixa ordre que abans i afegir, per exemple, l'usuari ``xavi``. Aleshores, el contingut serà:
.. code:: default
guillem:$apr1$9CRXnHWv$s4M.oat2SCzHMdKfz4Mhp0
xavi:$apr1$MsHBx2XT$zCA5wq378FS15DWOq4Bdz/
Segons la configuració actual, la directiva ``Require valid-user`` permetria l'accés a qualsevol dels usuaris definits en l'arxiu ``.htpasswd``:
.. figure:: /_static/images/M09UF1/M09UF1PT14.png
:alt: Accés mitjançant usuari guillem
Si accedim autenticant-nos com a "xavi":
.. figure:: /_static/images/M09UF1/M09UF1PT15.png
:alt: Accés mitjançant usuari xavi
Però podem modificar aquest comportament si en comptes de posar la directiva ``Require valid-user`` la modifiquem per ``Require user guillem``: ara estem restringint l'accés a només un usuari concret, encara que al fitxer ``.htpasswd`` també hi existeixi un tal "xavi", de manera que podem accedir si som "guillem" però no ens permet l'accés si som "xavi":
.. figure:: /_static/images/M09UF1/M09UF1PT16.png
:alt: Accés mitjançant usuari xavi
.. note::
Al fer modificacions a l'arxiu de configuració hem de fer un `restart` de l'Apache perquè recarregui la directiva nova que haguem modificat, per exemple quan limitem l'accés a un sol usuari o a qualsevol usuari present a l'arxiu de passwords.
Accedir al web d'un company
---------------------------
M'he connectat a la web de'n Joan López des del meu navegador escrivint la seva IP i definint el subdirectori M9 per tal de veure el contingut de la seva plana. Ell ha hagut de modificar la configuració de l'Apache per a aquest directori amb una directiva ``Allow 172.16.19.3`` per tal que la meva màquina pogués accedir, mantenint la resta de la xarxa sense accés a la seva web.
.. figure:: /_static/images/M09UF1/M09UF1PT17.png
:alt: Accés pàgina web company
Fes el teu site segur amb un certificat SSL
-------------------------------------------
Aquesta part l'haurem de fer amb un certificat autosignat. Això ens permetrà xifrar el trànsit HTTP entre el servidor i el client però no tindrem el candau verd de confiança perquè aquest certificat SSL l'hem firmat nosaltres mateixos i no hi ha cap entitat certificadora que pugui corroborar que el nostre site és nostre. Tot i això, per a realitzar la pràctica, no serà problema; tant sols haurem de saltar l'advertència de seguretat però podrem veure'n el funcionament.
El procediment per a crear aquest certificat és més o menys llarg però es pot documentar de manera simple. Els passos a seguir són els següents:
1. **Crearem una clau privada al servidor lligada al nom de domini del web**
És important que el nom de domini que escrivim coincideixi amb el nom de domini sota el qual tenim la web penjada; però com que aquesta pràctica la fem en local, no és crucial ja que no sortirà a Internet). Podem introduir una paraula de pas per a aquesta clau privada, que ens permetrà una capa de seguretat per a autenticar-nos a nosaltres mateixos com a propietaris d'aquesta clau; però tampoc és obligatòria.
.. code:: bash
openssl genrsa -des3 -out practicam09.local.key 2048
Generating RSA private key, 2048 bit long modulus
...............................+++
....................................................................................+++
e is 65537 (0x10001)
Enter pass phrase for practicam09.local.key:
Verifying - Enter pass phrase for practicam09.local.key:
2. **Crearem un Certificate Signing Request per a obtenir el certificat a partir de la clau privada generada al punt anterior**
.. code:: bash
openssl req -new -key practicam09.local.key -out practicam09.local.csr
Enter pass phrase for practicam09.local.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
Country Name (2 letter code) [XX]:.
State or Province Name (full name) []:.
Locality Name (eg, city) [Default City]:.
Organization Name (eg, company) [Default Company Ltd]:Guillem Sola Boeck
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:practicam09.local
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
El que ens demana primer és la paraula de pas de la clau privada per a poder-ne saber el contingut. Llavors ens va demanant diverses dades que s'inclouran en el certificat que podrem extreure a partir d'aquest CSR com ara el codi de país, l'estat, ciutat, nom d'organització, secció, nom comú (que hauria de coincidir amb el nom de domini que volem protegir), i una adreça de correu de contacte. Aquestes dades seran públiques per a tothom que pugui accedir al nostre certificat, per exemple, qualsevol client que accedís a la nostra web xifrada amb el certificat que extreiem amb aquest CSR de manera que podem evitar dades que no volguem publicar (adreça de correu personal, potser).
3. **Crear el certificat a partir del CSR i la clau privada**
.. code:: bash
openssl x509 -req -days 365 -in practicam09.local.csr -signkey practicam09.local.key -out practicam09.local.crt
Signature ok
subject=/O=Guillem Sola Boeck/CN=practicam09.local
Getting Private key
Enter pass phrase for practicam09.local.key:
En aquest pas hem de definir un temps de caducitat del certificat (expiració). En aquest cas, aquest certificat deixarà de ser vàlid d'aquí un any.
Una vegada generat el certificat, mourem els 2 arxius necessaris (Private Key i certificat) al directori per defecte on l'Apache els pot llegir: ``/etc/pki/tls/`` i els col·locarem al subdirectori on correspongui: ``certs`` o bé ``private`` per al certificat i la clau privada, respectivament.
.. code:: bash
mv practicam09.local.crt /etc/pki/tls/certs
mv practicam09.local.key /etc/pki/tls/private
4. **Instal·lar el mòdul SSL per a l'Apache**
Apache és un software molt modular que permet un funcionament bàsic amb la instal·lació de sèrie però es pot extendre amb mòduls addicionals. Per tal de poder oferir suport per a HTTPS amb el mòdul SSL corresponent que instal·larem
.. code:: bash
yum install mod_ssl
Amb la instal·lació d'aquest mòdul se'ns crearà un arxiu de configuració nou al directori de configuració de l'Apache que és el que s'encarrega de les directives per al default site que se servirà per HTTPS.
5. **Aplicar el certificat al servidor Apache**
L'últim pas és dir a Apache que pel port 443 (defecte per a HTTPS) xifri les comunicacions mitjançant aquest certificat que hem creat. Per no complicar-nos massa, modificaré l'arxiu de configuració per defecte que defineix les directives del meu web server pel que fa a HTTPS: ``/etc/httpd/conf.d/ssl.conf``.
Buscarem la secció corresponent al certificat i editarem per tal de definir-hi la ruta al certificat creat.
.. code:: default
(...)
# Server Certificate:
# Point SSLCertificateFile at a PEM encoded certificate. If
# the certificate is encrypted, then you will be prompted for a
# pass phrase. Note that a kill -HUP will prompt again. A new
# certificate can be generated using the genkey(1) command.
SSLCertificateFile /etc/pki/tls/certs/practicam09.local.crt
(...)
.. code:: default
(...)
# Server Private Key:
# If the key is not combined with the certificate, use this
# directive to point at the key file. Keep in mind that if
# you've both a RSA and a DSA private key you can configure
# both in parallel (to also allow the use of DSA ciphers, etc.)
SSLCertificateKeyFile /etc/pki/tls/private/practicam09.local.key
(...)
6. **Reiniciar servidor Apache per aplicar els canvis**
Farem un ``systemctl restart httpd`` de manera que Apache recarregui la nova configuració amb el certificat triat. Em demana la contrasenya de la clau privada.
.. code:: bash
systemctl restart httpd
Enter SSL pass phrase for fe80::1ffe:b3b3:fb1b:5476:443 (RSA) : *********
7. **Prova**
Entrarem amb el navegador a la URL https://192.168.56.5/M9 i veurem que ens surt un avís de seguretat perquè el certificat és autosignat:
.. figure:: /_static/images/M09UF1/M09UF1PT110.png
:alt: Accés pàgina a través d'HTTPS (advertència autosignat)
Fem un *by-pass* de l'advertència i mirem el contingut del certificat:
.. figure:: /_static/images/M09UF1/M09UF1PT111.png
:alt: Podem veure el detall del certificat on hi consten les dades que hem declarat al fer el CSR
Una vegada dins la pàgina, veiem que se serveix de la mateixa manera que per HTTP pla però tenim el candau que ens avisa que la connexió amb el servidor s'ha xifrat:
.. figure:: /_static/images/M09UF1/M09UF1PT112.png
:alt: Pàgina de prova amb HTTPS (autosignat)
8. **Instal·lar PHP**
Configura el teu web server per a que pugui processar PHP.
Necessitem instal·lar els paquets necessaris de MySQL i PHP.
.. code:: bash
yum install php
.. note::
En el cas de CentOS 7 s'instal·larà PHP 5 tot i que les últimes versions són les 7; però al nivell nostre serà pràcticament transparent. De totes maneres, podem activar els repositoris Remi per poder instal·lar PHP 7 en el nostre CentOS.
Un cop instal·lat PHP, instal·larem un servidor SQL de codi obert i compatible amb MySQL que s'anomena MariaDB:
.. code:: bash
yum install mariadb mariadb-server
.. note::
Tot i existir la versió 10.x com a més nova i estable d'aquest servei SQL, els repositoris oficials de CentOS instal·len la versió estable anterior (5.x). De la mateixa manera que PHP, podem utilitzar repositoris de tercers per a poder instal·lar MariaDB 10 si fos molt necessari. També hi ha una part de posada a punt del servidor MySQL que no contemplo en aquesta pràctica però que correspon a la configuració de la contrasenya de l'usuari *root* del servidor de MariaDB i l'habilitació (``enable``) i engegada (``start`) del servei en sí mitjançant ``systemctl``.
Podem comprovar la instal·lació correcta dels paquets des de la consola:
.. code:: bash
php --v
PHP 5.4.16 (cli) (built: Apr 12 2018 19:02:01)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
.. code:: bash
mysql --version
mysql Ver 15.1 Distrib 5.5.60-MariaDB, for Linux (x86_64) using readline 5.1
9. **Fes la teva primera pàgina PHP**
Crea una pàgina PHP que mostri el teu nom i cognoms en pantalla per comprovar que tota la instal·lació anterior ha estat correcta.
Crearé un fitxer nou dins de ``/var/www/html/M9`` que es digui ``index.php``. El contingut d'aquest fitxer serà un simple script PHP amb una comanda ``echo`` amb el meu nom i cognoms, com es demana:
.. code:: php
<?php
echo "<h1>Web Guillem</h1>";
echo "<h3>Encapçalament 3 mitjançant PHP</h3>";
?>
Si accedim des del navegador es mostrarà així:
.. figure:: /_static/images/M09UF1/M09UF1PT19.png
:alt: Pàgina exemple amb PHP
********************
A02. Formularis HTML
********************
2.1. Enunciat
=============
**Crea una pàgina web en HTML que contingui un formulari amb els següents camps d'informació:**
- Nom, amb un control de tipus text obligatori i amb autofocus
- Correu electrònic, amb un control de tipus correu electrònic obligatori
- URL, amb un control de tipus URL que mostri l'ajuda "Escriu la URL de la teva pàgina web personal"
- Data, amb un control de tipus date
- Temps, amb un control de tipus time
- Data i hora, amb un control de tipus datetime
- Mes, amb un control de tipus month
- Setmana, amb un control de tipus week
- Número, amb un control de tipus number que limiti l'entrada a un valor entre -10 i 10
- Telèfon, amb un control de tipus tel
- Paraula de recerca, amb un control de tipus search
- Color favorit, amb un control de tipus color
- Un botó d'enviament
A més, has de tenir en compte els següents requisits:
- El títol de la pàgina ha de ser Formulari de prova d'HTML5
- El mètode d'enviament del formulari ha de ser GET
- La destinació de l'enviament del formulari ha de ser el Punt 2
**Afegirem una destinació a lenviament del formulari a la pàgina "resultat.php"**
En aquesta pàgina mostrarem el nom i correu electrònic enviat des del formulari.
.. note::
Per recuperar valors enviats des daltres pàgines hem de fer servir el mètode PHP depenent de com senvien en orígen.
.. code:: html
$variable= $_GET["valor"];
o bé
.. code:: html
$variable= $_POST["valor"];
2.2. Solució
============
formulari.html
---------------
.. code:: html
<!DOCTYPE html>
<html>
<head>
<title>Formulari de prova de HTML5</title>
</head>
<body>
<form method="GET" action="resultat.php">
<p>Nom: <input type="text" name="nom" value="" autofocus="" required/></p>
<p>Correu electrònic: <input type="email" name="email" value="" required/></p>
<p>Web personal: <input type="url" name="web" value="" /></p>
<p>Data: <input type="date" name="data" value="" /></p>
<p>Hora: <input type="time" name="hora" value="" /></p>
<p>Data i hora: <input type="datetime" name="datahora" value="" /></p>
<p>Mes: <input type="month" name="mes" value="" /></p>
<p>Setmana: <input type="week" name="setmana" value="" /></p>
<p>Número entre -10 i 10: <input type="number" min="-10" max="10" name="numero" value="" /></p>
<p>Telèfon: <input type="tel" name="telefon" value="" /></p>
<p>Paraula clau: <input type="search" name="recerca" value="" /></p>
<p>Color preferit: <input type="color" name="color" value="" /></p>
<p><button type="submit">ENVIA</button></p>
</form>
</body>
</html>
resultat.php
------------
.. code:: php
<?php
$nom = $_GET["nom"];
$email = $_GET["email"];
echo "El teu nom és " . $nom . ", i el teu correu és " . $email;
?>
***********************************
A03. Exercicis d'introducció al PHP
***********************************
3.1. Escriu el programa que mostri en php el teu nom i cognoms, i el teu email en línies diferents
==================================================================================================
.. code:: php
<?php
$nom = "Guillem Solà i Boeck";
$mail = "guillem_solaboeck@iescarlesvallbona.cat";
echo "<p>El meu nom és " . $nom . "</p>";
echo "<p>El meu correu electrònic és " . $mail . "</p>";
?>
3.2. Escriu un programa que donades tres variables amb un valor diferent cadascuna les mostri per pantalla i digui el tipus
===========================================================================================================================
.. code:: php
<?php
$var1 = "Guillem Solà i Boeck";
$var2 = 50;
$var3 = 10.6;
$typ1 = gettype($var1);
$typ2 = gettype($var2);
$typ3 = gettype($var3);
echo "<p>La variable 1 (" . $var1 . ") és del tipus " . $typ1 . "</p>";
echo "<p>La variable 2 (" . $var2 . ") és del tipus " . $typ2 . "</p>";
echo "<p>La variable 3 (" . $var3 . ") és del tipus " . $typ3 . "</p>";
?>
3.3. Sabent que la funció RAND ens retorna un valor aleatori entre un rang de dos enters: Genera 3 números i mostra per pantalla el tres números i la frase "El més gran és " + número més gran
===============================================================================================================================================================================================
.. code:: php
<?php
$random1 = rand(3,729); #Random entre 3 i 729
$random2 = rand(7,987); #Random entre 7 i 987
$random3 = rand(0,1024); #Random entre 0 i 1024
echo "<p> El primer número aleatori és el " . $random1 . "</p>";
echo "<p> El segon número aleatori és el " . $random2 . "</p>";
echo "<p> El tercer número aleatori és el " . $random3 . "</p>";
$major = $random1;
if ($random2 > $major) {
$major = $random2;
}
if ( $random3 > $major ) {
$major = $random3;
}
echo "<p> El número més gran és el " . $major . "</p>";
?>
3.4. Obté quin dia és avui amb date("D") i mostra si és dilluns, dimarts, dimecres, dijous...
=============================================================================================
.. code:: php
<?php
$day = date("D");
switch ($day){
case "Mon":
$dia = "Dilluns";
break;
case "Tue":
$dia = "Dimarts";
break;
case "Wed":
$dia = "Dimecres";
break;
case "Thu":
$dia = "Dijous";
break;
case "Fri":
$dia = "Divendres";
break;
case "Sat":
$dia = "Dissabte";
break;
case "Sun":
$dia = "Diumenge";
break;
}
echo $dia;
?>
3.5. Suma els 10 primers números naturals
=========================================
.. code:: php
<?php
$total=0;
for( $i = 1; $i <= 10; $i++ ) {
$total += $i;
}
echo $total;
?>
3.6. Donada una base i un exponent, calcula la potència amb multiplicacions
===========================================================================
.. code:: php
<?php
$base = 11;
$exponent = 4;
$resultat = $base;
for ($i = 1; $i < $exponent; $i++) {
$resultat = $resultat * $base;
}
echo $resultat;
?>
3.7. Mostra una taula amb els números d'1 al 100 de 10 en 10
============================================================
.. code:: php
<?php
echo "<table border='1px'>";
for ($i=1;$i<101;$i++){
echo "<tr>";
while ($i%10!=0){
echo "<td>".$i."</td>";
$i++;
}
echo "<td>".$i."</td>";
echo "</tr>";
}
echo
"</table>";
?>
3.8. Donat una array mostra en una taula els índex i els valors
===============================================================
.. code:: php
<?php
// Array donada
$matriz[0] = "cougar";
$matriz[1] = "ford";
$matriz[2] = null;
$matriz[3] = "2.500";
$matriz[4] = "V6";
$matriz[5] = 182;
// Mostrar índexs i valors
echo "<table>";
echo "<th>Índex</th><th>Valor</th>";
for ($i=1;$i<sizeof($matriz);$i++){
echo "<tr><td>$i</td><td>$matriz[$i]</td></tr>";
}
echo "</table>";
?>
3.9. Donat una array mostra en una taula amb noms i edats i una frase indicant qui és el més gran i el més jove
===============================================================================================================
.. code:: php
<?php
$noms = array("Xavier" => "40", "Lluís" => "35", "Julian" => "45");
echo "<table>";
echo "<th>Nom</th><th>Edat</th>";
foreach ($noms as $nom => $edat){
echo "<tr><td>$nom</td><td>$edat</td></tr>";
}
echo "</table>";
$gran=array_search(max($noms),$noms);
$jove=array_search(min($noms),$noms);
echo "<p>El més gran és $gran</p>";
echo "<p>El més jove és $jove</p>";
?>
3.10. Crea un formulari amb dues entrades de text i un botó. Introdueix dos números i realitza la suma, resta, divisió i la multiplicació dels dos números
==========================================================================================================================================================
La sortida de pantalla ha de ser:
.. code:: default
10 + 2 = 12
10 - 2 = 8
10 * 2 = 20
10 / 2 = 5
.. code:: php
<!DOCTYPE html>
<html>
<body>
<form method="GET" action="exercici10.php">
<p>Número 1: <input type="text" name="num1" value="" required/></p>
<p>Número 2: <input type="text" name="num2" required/></p>
<p><button type="submit">Calcula</button></p>
</form>
<?php
$num1 = $_GET["num1"];
$num2 = $_GET["num2"];
if ( $num1 !== NULL && $num2 !== NULL ) {
$suma = $num1 + $num2;
$resta = $num1 - $num2;
$multiplicacio = $num1 * $num2;
$divisio = $num1 / $num2;
echo "<p>" . $num1 . " + " . $num2 . " = " . $suma . "</p>";
echo "<p>" . $num1 . " - " . $num2 . " = " . $resta . "</p>";
echo "<p>" . $num1 . " x " . $num2 . " = " . $multiplicacio . "</p>";
echo "<p>" . $num1 . " / " . $num2 . " = " . $divisio . "</p>";
}else{
echo "<p>Introdueix dos números per a operar.</p>";
}
?>
</body>
</html>
3.11. Amb el mateix formulari dabans fes que després de demanar els dos números tels mostri en pantalla concatenats
=====================================================================================================================
.. code:: php
<!DOCTYPE html>
<html>
<body>
<form method="GET" action="exercici11.php">
<p>Número 1: <input type="text" name="num1" value="" required/></p>
<p>Número 2: <input type="text" name="num2" required/></p>
<p><button type="submit">Concatena</button></p>
</form>
<?php
$num1 = $_GET["num1"];
$num2 = $_GET["num2"];
if ( $num1 !== NULL && $num2 !== NULL ) {
$suma = $num1 + $num2;
$resta = $num1 - $num2;
$multiplicacio = $num1 * $num2;
$divisio = $num1 / $num2;
echo "<p>" . $num1 . $num2 . "</p>";
}else{
echo "<p>Introdueix dos números per a concatenar.</p>";
}
?>
</body>
</html>
3.12. Escriu un programa PHP que mostri la següent figura
=========================================================
.. code:: default
*
* *
* * *
* * * *
* * * * *
* * * * * *
* * * * * * *
* * * * * * * *
* * * * * * * * *
.. code:: php
<?php
$espai = "&nbsp"; #Espai buit
$asterisc = $espai . "*"; #El caràcter que formarà la piràmide
$numFiles = 20; #Número de files que vull generar
#Executo el bucle tantes vegades com $numFiles, però invers
for ( $filaActual = $numFiles; $filaActual>0; $filaActual-- ) {
$caracterActual = 1; #Variable per saber la posició actual dins la fila
#Executo el bucle tantes vegades com caràcters calguin en aquella $filaActual
for ( $caracterActual; $caracterActual <= $numFiles; $caracterActual++ ) {
if ( $caracterActual >= $filaActual ){
#Si la posició actual és igual o major al número invers de la
#fila actual vol dir que estem en posició de posar asteriscos
echo $asterisc;
}else{
#Mentre la posició sigui anterior a la dels asteriscos posarem caràcters d'espai en blanc
echo $espai;
}
}
echo "<br>";
}
?>
******************
A04. Formulari PHP
******************
4.1. Objectius
==============
Aprendre a utilitzar llenguatges de guió de servidors. Programació dun formulari web en PHP i HTML.
.. figure:: /_static/images/M09UF1/M09UF1PT41.png
4.2. Desenvolupament
====================
Crearem un formulari per a realitzar lalta com a client a una empresa de serveis. Heu de fer un formulari d'alta dusuari amb aquest contingut:
1. Tipus de document (desplegable)
* NIF
* NIE
* Passaport
2. Número de document
3. Nom
4. Cognoms
5. Sexe (desplegable)
* Home
* Dona
6. Data de naixement
7. Correu electrònic
8. Confirmació correu electrònic
9. Telèfon mòbil
10. Població (desplegable amb 5 poblacions)
11. Codi Postal
12. Adreça
13. Periodicitat de cobrament (radiobutton) només es pot marcar un
* Anual 100 €
* Semestral 55 €
* Mensual 10 €
14. He llegit i accepto les condicions (checkbutton)
15. Accepto rebre comunicacions de las empreses del grup XXX (checkbutton)
16. Password
17. Confirmació Password
18. Observacions (camp de text de múltiples files)
19. Camp per pujar un arxiu
Hi haurà el botó d'esborrar que deixarà el formulari en blanc se tenim dades introduïdes i el botó d'enviar, on mostrareu a una altre pàgina “validat.php” un text conforme sha enviat correctament, sempe que no hi hagi errors de validació, les dades similar a:
.. code:: default
"Sr/a Noms i Cognoms, les seves dades shan enregistrat correctament a les XX hores del dd/mm/aaaa"
.. note::
En cas derrors de validació shauran de mantenir les dades introduïdes al formulari per a no tornar a introduir-les. Investigueu la forma de fer-ho.
**Restriccions/validacions**
* Totes les dades (camps) són obligatoris
* DNI: obligatori i sha de validar (buscar funció validació DNI + lletra)
* Data de naixement: posarem una data per defecte 01/01/2000. Sha de validar que sigui major dedat
* Correu electrònic: obligatoris i han de ser iguals amb el camp Correu electrònic
* Telèfon mòbil: sha de validar (9 dígits)
* Password i confirmació Password: els dos són obligatoris i han de ser iguals
* Larxiu que pujarem només podrà ser en format PDF
* Tots els camps de tipus INPUT han de tenir PLACEHOLDER
4.3. Solució
============
`Descarrega el ZIP <../_static/files/M09UF1A04.zip>`_ amb els arxius.

@ -0,0 +1,9 @@
##################################
M09. Implantació d'aplicacions web
##################################
.. toctree::
:maxdepth: 2
UF1
UF2

Binary file not shown.

@ -32,6 +32,11 @@ latex_elements = {
'preamble': r'''
\usepackage{titlesec}
\titleformat{\chapter}{\normalfont\huge\bf}{\thechapter.}{20pt}{\normalfont\huge\bf}
\usepackage{float}
\makeatletter
\def\fps@figure{H}
\makeatother
''',
# Set up page disposition for one side

@ -20,11 +20,13 @@ Contingut
*********
.. toctree::
:maxdepth: 2
:maxdepth: 3
:titlesonly:
M02/index
M03/index
M06/index
M09/index
****************

Loading…
Cancel
Save