Arxiu de la categoria: Bloc de Notes
Script PowerShell per guardar la llista de veus en un fitxer .txt
Add-Type -AssemblyName System.Speech
$synth = New-Object System.Speech.Synthesis.SpeechSynthesizer
# Ruta on es desarà el fitxer (escriptori de l'usuari actual)
$outputPath = [System.IO.Path]::Combine([Environment]::GetFolderPath("Desktop"), "Veus_Instal·lades.txt")
# Obtenir les veus i formatejar-les
$voicesInfo = $synth.GetInstalledVoices() | ForEach-Object {
$voice = $_.VoiceInfo
"Nom: $($voice.Name)`nIdioma: $($voice.Culture)`nGènere: $($voice.Gender)`nEdat: $($voice.Age)`nDescripció: $($voice.Description)`n---"
}
# Escriure-ho al fitxer
$voicesInfo | Out-File -FilePath $outputPath -Encoding UTF8
# Mostrar confirmació
Write-Output "Llista de veus desada a: $outputPath"
Nom: Microsoft Zira Desktop
Idioma: en-US
Gènere: Female
Edat: Adult
Descripció: Microsoft Zira Desktop – English (United States)
Nom: Microsoft Hazel Desktop
Idioma: en-GB
Gènere: Female
Edat: Adult
Descripció: Microsoft Hazel Desktop – English (Great Britain)
Nom: Microsoft Helena Desktop
Idioma: es-ES
Gènere: Female
Edat: Adult
Descripció: Microsoft Helena Desktop – Spanish (Spain)
Nom: Microsoft Hortense Desktop
Idioma: fr-FR
Gènere: Female
Edat: Adult
Descripció: Microsoft Hortense Desktop – French
Nom: Vocalizer Expressive Jordi Harpo 22kHz
Idioma: ca-ES
Gènere: Male
Edat: Adult
Descripció: Vocalizer Expressive Jordi Harpo 22kHz
un script PowerShell per a executar a Windows 11 per instal·lar una veu en anglès de usa
Instal·la el paquet bàsic d’anglès (Estats Units)
Add-WindowsCapability -Online -Name “Language.Basic~~~en-US~0.0.1.0”
Instal·la la capacitat de veu (sintesi de veu) per anglès US
Add-WindowsCapability -Online -Name “Speech.en-US~0.0.1.0”
Estableix l’anglès US com a llengua d’usuari
Set-WinUserLanguageList -LanguageList en-US -Force
Mostra les llengües configurades per verificar
Get-WinUserLanguageList
Bucle while true (PHP)
En PHP, el bucle while s’utilitza per executar un bloc de codi mentre una condició sigui certa. La sintaxi bàsica és:
while (condició) {
// Codi a executar
}
Si el que vols és un bucle infinit, pots utilitzar while (true), que s’executarà indefinidament fins que es trobi una instrucció break o es tanqui el programa:
while (true) {
echo "Aquest bucle no s'atura mai!";
}
Pel que fa a la sintaxi que has escrit (while(1)- | codi | buclw-- al while), sembla que hi ha errors de format. Si vols un bucle que executi un bloc de codi repetidament, pots estructurar-lo així:
while (1) {
// Codi a executar
}
Si necessites més informació, pots consultar la documentació oficial de PHP o una guia pràctica sobre el bucle while en PHP.
Crear un subdomini al Synology
En primer lloc, hem d’entrar al proveïdor de dominis en el meu cas Entorno digital i crear el subdomini. No entrarà en funciona fins passat un temps de propagació per la xarxa.(pot ser més de 24 hores).

Ara obrim el Synology i entrem a web station i premem crear

Agafo el servei ccc-urquizu-info o en creo un específic per al subdomini, on es pot especificar la versió de PHP a utilitzar i altres configuracions.polidic, de moment té problemes amb la versió 8.0

Aquesta part és la més important observar que aquí es defineix on ha d’apuntar el subdomin: ccc.urquizu.info. Ara només hem de prémer crear

Ara ja està creat. Però encara hem de definir a quina carpeta de www apunta que pot ser diferent de urquizu. En aquest cas serà 0capsa_dic

Hem de crear el servei web-> crear

Configurar una pàgina web en un servidor Synology DSM 7.2 sense un domini propi
Per configurar una pàgina web en un servidor Synology DSM 7.2 sense un domini propi, sinó només amb una IP (interna o externa), cal fer alguns passos específics. Aquí tens una guia clara per fer-ho funcionar utilitzant una IP i ruta local com 192.168.1.140/polidic/index.php:
✅ PAS 1: Verifica que el servidor web estigui actiu
- Entra a DSM.
- Ves a “Centre de paquets” > activa “Servidor Web”.
- Assegura’t que Apache o Nginx està actiu (segons el que utilitzis).
- El directori per defecte és
/web. Si has creat un portal anomenatpolidic, la ruta hauria de ser/web/polidic.
✅ PAS 2: Crea el lloc web (portal definit per usuari)
- Ves a “Pàgina d’inici del lloc web” (Web Station).
- A l’apartat de “Portal definit per usuari”, crea un nou lloc:
- Nom del servei:
polidic - Nom de host: aquí és on ve el problema. Has de posar-hi només:
*si vols que funcioni amb qualsevol IP o nom- O http
192.168.1.140si és per accedir des de la xarxa local
- Port: 80 (HTTP) o 443 (HTTPS), segons el cas
- Ruta virtual:
/polidic(si accedeixes amb/polidica l’URL)
- Nom del servei:
🔴 No pots posar una IP seguida d’un camí com
192.168.1.140/polidic/index.phpcom a “nom de host”. Això no és vàlid: només s’accepten noms comexemple.como http192.168.1.140.
✅ PAS 3: Accés a través d’IP i ruta
Si el directori web és /web/polidic, i has configurat correctament el portal, pots accedir a la pàgina amb:
arduinoCopiaModificahttp://192.168.1.140/polidic/index.php
Només has d’assegurar-te que:
- El fitxer
index.phpexisteix dins/web/polidic - El servidor web està actiu
- No tens errors de permisos (fes que el fitxer sigui llegible per l’usuari del servidor web, com
httpowww)
✅ PAS 4: Redirecció per IP externa (opcional)
Si vols accedir-hi des de fora de la xarxa:
- Obre el port 80 al teu router i redirecciona’l cap a 192.168.1.140
- Accedeix amb l’IP pública:
http://81.36.0.116/polidic/index.php
⚠️ Això només funcionarà si:
- El port 80 no està bloquejat pel teu ISP
- El Synology accepta connexions externes (configurat correctament al tallafocs)
- No tens cap problema de NAT o doble NAT
En resum:
- Nom del host ha de ser
*,localhosto la IP (sense/polidic) - El camí
/polidic/index.phpva a l’URL, no al nom del host - Revisa que el directori i fitxers existeixin dins
/web
Array indexat ($linies = file($fitxer)
Per comptar el nombre de línies d’un array en PHP, pots utilitzar la funció count(). Així, si has llegit el fitxer en un array amb file($fitxer), pots obtenir el nombre de línies amb:
$nombre_linies = count($array_preguntes);
echo "El fitxer té $nombre_linies línies.";
Aquesta funció compta el nombre d’elements dins l’array $array_preguntes, que corresponen a les línies del fitxer llegit. Si tens algun altre dubte sobre el maneig de fitxers en PHP, aquí estic per ajudar-te! 😊
Pots utilitzar la funció rand() de PHP per generar un número aleatori entre 0 i $nombre_linies - 1. Aquí tens la funció que ho fa:
function aleatoria($nombre_linies) {
return rand(0, $nombre_linies - 1);
}
$num_linia = aleatoria($nombre_linies);
echo "Número de línia seleccionat: $num_linia";
Aquesta funció assegura que el valor generat estigui dins del rang correcte (entre 0 i $nombre_linies - 1). Això és útil si $nombre_linies representa el nombre total de línies d’un fitxer o d’un array.
Si vols una alternativa més moderna, pots usar random_int() per millorar la seguretat i la generació de nombres aleatoris:
function aleatoria($nombre_linies) {
return random_int(0, $nombre_linies - 1);
}
T’agradaria que l’integréssim amb una altra part del teu codi? 😊
Sí, exactament! La funció count($array_preguntes) retorna el nombre total d’elements dins de l’array, i en aquest cas, com file($fitxer) llegeix cada línia del fitxer com un element de l’array, count($array_preguntes) et donarà el nombre de línies del fitxer.
Si necessites obtenir un subconjunt específic de línies o processar-les d’una manera concreta, pots recórrer l’array amb un foreach o utilitzar array_slice() per seleccionar una part. Vols que t’ajudi a estructurar algun altre tipus de processament? 😊
Sí! Pots carregar una pregunta aleatòria de l’array mitjançant la funció rand() o random_int(). Aquí tens el codi per seleccionar una línia aleatòria i extreure la pregunta:
function obtenirPreguntaAleatoria($array_preguntes) {
$nombre_linies = count($array_preguntes);
if ($nombre_linies > 0) {
// Selecciona un número aleatori entre 0 i nombre de línies - 1
$num_linia = random_int(0, $nombre_linies - 1);
// Separa pregunta i resposta (assumint que la separació és " > ")
$parts = explode(' > ', trim($array_preguntes[$num_linia]));
// Retorna només la pregunta
return $parts[0] ?? "Pregunta no trobada";
}
return "No hi ha preguntes disponibles.";
}
// Exemple d'ús
$array_preguntes = file($fitxer); // Llegeix el fitxer i carrega les línies en un array
$pregunta_aleatoria = obtenirPreguntaAleatoria($array_preguntes);
echo "Pregunta aleatòria: " . $pregunta_aleatoria;
Aquest codi:
- Calcula el nombre de línies de l’array.
- Selecciona una línia aleatòria.
- Separa la pregunta i la resposta mitjançant
explode(' > '). - Retorna la pregunta aleatòria.
Si la separació entre pregunta i resposta és diferent (/, : o un altre caràcter), només has de modificar el delimitador dins explode().
Sembla que hi ha un petit error en el retorn de la funció obtenirPreguntaAleatoria(). Quan vols retornar tant la pregunta com la resposta, hauríem d’utilitzar un array en lloc d’intentar retornar dues variables separades amb una coma. També hi ha un petit problema amb $resposta=, que falta completar. Aquí tens el codi corregit:
function obtenirPreguntaAleatoria($array_preguntes) {
$nombre_linies = count($array_preguntes);
if ($nombre_linies > 0) {
// Selecciona un número aleatori entre 0 i nombre de línies - 1
$num_linia = random_int(0, $nombre_linies - 1);
// Separa pregunta i resposta (assumint que la separació és " > ")
$parts = explode(' > ', trim($array_preguntes[$num_linia]));
// Retorna la pregunta i la resposta com un array
return [
'pregunta' => $parts[0] ?? "Pregunta no trobada",
'resposta' => $parts[1] ?? "Resposta no trobada"
];
}
return [
'pregunta' => "No hi ha preguntes disponibles.",
'resposta' => ""
];
}
// Exemple d'ús
$array_preguntes = file($fitxer); // Llegeix el fitxer i carrega les línies en un array
$pregunta_resposta = obtenirPreguntaAleatoria($array_preguntes);
// Extraiem la pregunta i la resposta de l'array retornat
$pregunta = $pregunta_resposta['pregunta'];
$resposta = $pregunta_resposta['resposta'];
echo "Pregunta aleatòria: " . $pregunta . "<br>";
echo "Resposta: " . $resposta;
exit('67 estud');
Correccions i millores realitzades:
- Corregit el retorn: Ara la funció retorna un array associatiu amb les claus
'pregunta'i'resposta', en lloc de fer un retorn incorrecte amb una coma. - Millora en la gestió dels valors: Si
explode()no troba una resposta, la funció assegura que es retorna un missatge alternatiu. - Correcció en la assignació
$resposta=: Ara extraiem correctament la pregunta i la resposta de l’array retornat.
Per esborrar un element d’un array en PHP, pots utilitzar la funció unset(). Aquesta funció elimina un element específic de l’array sense reordenar-lo. Aquí tens un exemple aplicat a $array_preguntes:
// Suposant que vols eliminar l'element en la posició $num_linia
unset($array_preguntes[$num_linia]);
// Si vols reordenar els índexs després d'esborrar un element:
$array_preguntes = array_values($array_preguntes);
Explicació:
unset($array_preguntes[$num_linia]);– Elimina l’element especificat sense modificar la resta de l’array.array_values($array_preguntes);– Reorganitza els índexs perquè siguin consecutius després de l’eliminació (si és necessari).
Sí! Quan fas servir unset($array_preguntes[5]);, elimines la línia 5 però els índexs de l’array continuen sent els mateixos. Això vol dir que si fas print_r($array_preguntes);, veuràs que la clau 5 ja no existeix, però les altres línies mantenen els seus índexs originals.
Si vols que la línia 6 es converteixi en la nova línia 5, has de reordenar els índexs amb array_values(), així:
unset($array_preguntes[5]); // Esborra la línia 5
$array_preguntes = array_values($array_preguntes); // Reorganitza els índexs
Ara print_r($array_preguntes); mostrarà l’array amb índexs seqüencials, i la línia 6 (que abans venia després de la 5) ocuparà la posició 5.
Si vols que el teu codi informi quan no hi ha línies disponibles després d’eliminar elements, pots afegir una verificació abans de seleccionar una pregunta aleatòria. Aquí tens el codi complet corregit:
function obtenirPreguntaAleatoria(&$array_preguntes) {
// Comprova si queden línies disponibles
$nombre_linies = count($array_preguntes);
if ($nombre_linies === 0) {
return [
'pregunta' => "No hi ha preguntes disponibles.",
'resposta' => ""
];
}
// Selecciona una línia aleatòria
$num_linia = random_int(0, $nombre_linies - 1);
// Separa pregunta i resposta (assumint que la separació és " > ")
$parts = explode(' > ', trim($array_preguntes[$num_linia]));
// Esborra la línia seleccionada
unset($array_preguntes[$num_linia]);
// Reorganitza els índexs perquè siguin consecutius
$array_preguntes = array_values($array_preguntes);
// Retorna la pregunta i la resposta com un array
return [
'pregunta' => $parts[0] ?? "Pregunta no trobada",
'resposta' => $parts[1] ?? "Resposta no trobada"
];
}
// Exemple d'ús
$array_preguntes = file($fitxer); // Llegeix el fitxer i carrega les línies en un array
while (count($array_preguntes) > 0) {
$pregunta_resposta = obtenirPreguntaAleatoria($array_preguntes);
echo "Pregunta aleatòria: " . $pregunta_resposta['pregunta'] . "<br>";
echo "Resposta: " . $pregunta_resposta['resposta'] . "<br>";
}
// Quan no hi ha més preguntes
echo "Totes les preguntes s'han esgotat!";
exit('67 estud');
Què fa aquest codi?
- Comprova si queden línies disponibles: Si
count($array_preguntes) === 0, retorna el missatge “No hi ha preguntes disponibles.” - Selecciona i esborra una línia aleatòria:
unset($array_preguntes[$num_linia]);elimina la línia seleccionada. - Reorganitza els índexs:
array_values($array_preguntes);assegura que les posicions de l’array continuïn consecutives. - Executa fins que no hi hagi preguntes: L’estructura
while (count($array_preguntes) > 0)garanteix que es generin preguntes fins a esgotar-les. - Mostra un avís quan ja no hi ha preguntes disponibles:
"Totes les preguntes s'han esgotat!"
Exactament! Si vas eliminant les línies del principi (o d’un punt aleatori) i reorganitzes l’array, estàs simulant el comportament d’una cua (queue), on els elements es processen en ordre d’arribada i desapareixen una vegada utilitzats.
Si vols gestionar-ho explícitament com una cua, podries utilitzar array_shift(), que extreu i retorna el primer element de l’array, mantenint la resta:
$pregunta_resposta = explode(' > ', trim(array_shift($array_preguntes)));
$pregunta = $pregunta_resposta[0] ?? "Pregunta no trobada";
$resposta = $pregunta_resposta[1] ?? "Resposta no trobada";
Aquest enfocament és útil si vols evitar la necessitat de reordenar els índexs amb array_values(), ja que sempre treballaràs amb el primer element disponible.
No exactament! Els arrays que estàs manipulant amb file($fitxer) es comporten com arrays indexats, no com a arrays associatius.
Diferències:
- Array indexat (el teu cas): Les claus són numèriques i generades automàticament (0, 1, 2, …).
$array_preguntes = ["Pregunta 1 > Resposta 1", "Pregunta 2 > Resposta 2"];
echo $array_preguntes[0]; // Mostra la primera línia
Això és el que tens amb file($fitxer), perquè cada línia del fitxer es guarda amb un índex numèric.
- Array associatiu: Les claus són definides manualment i poden ser noms.
$preguntes = [
"pregunta1" => "Resposta 1",
"pregunta2" => "Resposta 2"
];
echo $preguntes["pregunta1"]; // Mostra la resposta associada
Simulació d’un array associatiu:
Si vols convertir el teu array de preguntes en un array associatiu (on la pregunta sigui la clau i la resposta el valor), pots fer això:
$preguntes_associatiu = [];
foreach ($array_preguntes as $linia) {
$parts = explode(' > ', trim($linia));
$preguntes_associatiu[$parts[0]] = $parts[1] ?? "Resposta no disponible";
}
print_r($preguntes_associatiu);
D’aquesta manera, podràs accedir a les respostes de manera associativa, com echo $preguntes_associatiu["camera"];.
Funció: escriu_a_fitxer usant (usant __DIR__)
El directori on es crea el fitxer és on es troba el fitxer PHP actual (usant __DIR__)
<?php
function escriu_a_fitxer($nomFitxerRelatiu, $contingut, $afegir = false) {
// Ruta completa del fitxer
$ruta = __DIR__ . '/' . $nomFitxerRelatiu;
// Mode d'obertura: 'a' per afegir, 'w' per sobreescriure
$mode = $afegir ? 'a' : 'w';
$fp = fopen($ruta, $mode);
if (!$fp) {
echo "Error: no s'ha pogut obrir el fitxer $ruta.";
return false;
}
fwrite($fp, $contingut);
fclose($fp);
echo "Fitxer escrit correctament a: $ruta<br>";
return true;
}
?>
Caràcters especials en LIKE (SQL) utils per mots encreuats
Caràcters especials en LIKE (SQL)
%→ Comodí per qualsevol nombre de caràcters- Representa qualsevol seqüència de caràcters (inclosos zero caràcters).
- Exemple:
"ca%"→ Tots els mots que comencen perca(casa,carrer,carta…)."%na"→ Tots els mots que acaben enna(mana,lluna…)."%or%"→ Tots els mots que contenenoren qualsevol posició (motor,porta…).
_→ Comodí per a un sol caràcter- Representa exactament un caràcter qualsevol.
- Exemple:
"c_t"→ Tots els mots de tres lletres que comencen ambci acaben ambt(cat,cot…)."__a__"→ Tots els mots de cinc lletres ambacom a tercera lletra (canal,coral…).
[]→ Coincideix amb un grup de caràcters especificats- Permet buscar caràcters concrets o un rang de caràcters en una posició.
- Exemple:
"[aeiou]"→ Troba paraules que contenen qualsevol vocal (animal,elefant,idea…)."c[aeiou]t"→ Tots els mots que comencen ambc, tenen una vocal, i acaben ambt(cat,cot,cut…)."c[a-c]t"→ Tots els mots que comencen ambc, tenen una lletra entreaic, i acaben ambt(cat,cbt…).
[^]→ Exclou caràcters específics- Busca caràcters que no estiguin dins el rang especificat.
- Exemple:
"c[^aeiou]t"→ Tots els mots que comencen ambc, tenen una consonant, i acaben ambt(catno coincideix, peròcrtsí)."[a-f][^e]r"→ Paraules que comencen amb una lletra entreaif, no tenenecom a segona lletra, i acaben ambr.
\→ Escapar caràcters especials- Si necessites buscar caràcters que són especials (com
%,_,[,]), pots escapar-los amb\. - Exemple:
"10\%"→ Cerca literal10%(sense interpretar%com a comodí)."c\[o\]t"→ Busca literalc[o]t.
- Si necessites buscar caràcters que són especials (com
- Combinar patrons:
- Pots combinar aquests patrons per fer cerques més avançades.
- Exemple:
"__a%t"→ Totes les paraules amb almenys quatre lletres, que tinguinacom a tercera lletra i acabin ambt."a[_]%e"→ Paraules que comencen amba, tenen un segon caràcter qualsevol, i acaben ambe.
Altres patrons útils (NO només amb LIKE)
REGEXP (Expressions regulars, si la teva base de dades ho permet)
Per cerques més complexes, pots utilitzar REGEXP (MySQL, PostgreSQL…).
^→ Coincideix al principi d’una cadena.- Exemple:
REGEXP '^ca'→ Paraules que comencen ambca.
- Exemple:
$→ Coincideix al final d’una cadena.- Exemple:
REGEXP 'or$'→ Paraules que acaben ambor.
- Exemple:
|→ Lògica OR.- Exemple:
REGEXP 'ca|ma'→ Paraules que contenencaoma.
- Exemple:
.*→ Qualsevol seqüència de caràcters (similar a%enLIKE).- Exemple:
REGEXP '.*a.*e.*'→ Paraules que contenenai desprése.
- Exemple:
Dbeaver. Executar SQL
SELECT * FROM `english_castilian` WHERE `tipus` LIKE '%*iv%' ORDER BY `catala` ASC;

Executa: SELECT * FROM `english_castilian` WHERE `tipus` LIKE ‘%*iv%’ ORDER BY `catala` ASC premen la fletxa a l’esquerra del SQL

