{"id":6234,"date":"2025-03-19T08:34:34","date_gmt":"2025-03-19T08:34:34","guid":{"rendered":"https:\/\/aborrego.inscastellbisbal.net\/?p=6234"},"modified":"2025-03-25T12:19:50","modified_gmt":"2025-03-25T12:19:50","slug":"codi-net-i-ben-documentat-comentaris-al-codi","status":"publish","type":"post","link":"https:\/\/aborrego.inscastellbisbal.net\/en\/2025\/03\/19\/codi-net-i-ben-documentat-comentaris-al-codi\/","title":{"rendered":"Codi net i ben documentat (Comentaris al codi)"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"6234\" class=\"elementor elementor-6234\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-1de1232 elementor-section-height-min-height elementor-section-items-top elementor-section-boxed elementor-section-height-default wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no elementor-invisible\" data-id=\"1de1232\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;,&quot;animation&quot;:&quot;fadeIn&quot;,&quot;shape_divider_top&quot;:&quot;waves&quot;,&quot;shape_divider_top_negative&quot;:&quot;yes&quot;}\">\n\t\t\t\t\t<div class=\"elementor-shape elementor-shape-top\" aria-hidden=\"true\" data-negative=\"true\">\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 1000 100\" preserveAspectRatio=\"none\">\n\t<path class=\"elementor-shape-fill\" d=\"M790.5,93.1c-59.3-5.3-116.8-18-192.6-50c-29.6-12.7-76.9-31-100.5-35.9c-23.6-4.9-52.6-7.8-75.5-5.3\n\tc-10.2,1.1-22.6,1.4-50.1,7.4c-27.2,6.3-58.2,16.6-79.4,24.7c-41.3,15.9-94.9,21.9-134,22.6C72,58.2,0,25.8,0,25.8V100h1000V65.3\n\tc0,0-51.5,19.4-106.2,25.7C839.5,97,814.1,95.2,790.5,93.1z\"\/>\n<\/svg>\t\t<\/div>\n\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-f9a5a6d\" data-id=\"f9a5a6d\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-506ede6 elementor-invisible elementor-widget elementor-widget-heading\" data-id=\"506ede6\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;fadeInUp&quot;,&quot;_animation_delay&quot;:500}\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">codi net i ben documentat (comentaris al codi)<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-aeb03e8 elementor-widget elementor-widget-spacer\" data-id=\"aeb03e8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-91726ae elementor-widget elementor-widget-spacer\" data-id=\"91726ae\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-20f8ef4\" data-id=\"20f8ef4\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-dd24575 elementor-align-left elementor-widget elementor-widget-button\" data-id=\"dd24575\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm elementor-animation-float\" href=\"https:\/\/aborrego.inscastellbisbal.net\/repte-1-6-talent-fp\/\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Tornar al repte 1.6<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t<div class=\"elementor-element elementor-element-87fadc2 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no e-con e-parent\" data-id=\"87fadc2\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9da79d5 elementor-widget elementor-widget-spacer\" data-id=\"9da79d5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b3de638 elementor-widget elementor-widget-text-editor\" data-id=\"b3de638\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>He\u00a0 organitzat el codi en Google Colabs de una manera organitzada i neta (#).<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-a560e3a e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no e-con e-parent\" data-id=\"a560e3a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-2b966e3 e-con-full e-flex wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no e-con e-child\" data-id=\"2b966e3\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-cc7f992 elementor-widget elementor-widget-text-editor\" data-id=\"cc7f992\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3 class=\"\" data-start=\"609\" data-end=\"640\">1. Comentaris detallats<\/h3><p class=\"\" data-start=\"643\" data-end=\"747\">-Comentaris a cada pas del codi <em data-start=\"678\" data-end=\"701\">(Alg1, Alg2, Alg3&#8230;)<\/em> que expliquen la funcionalitat de cada l\u00ednia.<\/p><p class=\"\" data-start=\"643\" data-end=\"747\">-Explicaci\u00f3 de condicions i possibles errors, per exemple:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f86e12d elementor-widget elementor-widget-text-editor\" data-id=\"f86e12d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p class=\"\" data-start=\"178\" data-end=\"410\">&#8211;<strong>Divisi\u00f3 en seccions clares<\/strong>: El codi est\u00e0 estructurat amb l\u00ednies de separaci\u00f3 <code data-start=\"259\" data-end=\"293\"># ==============================<\/code> que ajuden a identificar r\u00e0pidament cada bloc funcional (Configuraci\u00f3 de l&#8217;API, Web Scraping, Servidor Flask, etc.).<\/p><p class=\"\" data-start=\"413\" data-end=\"607\">&#8211;<strong>Ordre l\u00f2gic<\/strong>: Les importacions de llibreries es fan primer, seguides de la configuraci\u00f3 de l\u2019API, la configuraci\u00f3 del xat, l&#8217;extracci\u00f3 d&#8217;informaci\u00f3 de la web i finalment l\u2019inici del servidor.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-48dd49a elementor-widget elementor-widget-text-editor\" data-id=\"48dd49a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Aquest codi est\u00e0 ben estructurat perqu\u00e8 segueix un ordre l\u00f2gic i organitzat, facilitant la seva lectura i manteniment: Aix\u00f2 garanteix que tots els m\u00f2duls estiguin disponibles abans d&#8217;importar-los.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6149c37 elementor-widget elementor-widget-text-editor\" data-id=\"6149c37\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3 class=\"\" data-start=\"141\" data-end=\"175\">2. Organitzaci\u00f3<\/h3><p class=\"\" data-start=\"4714\" data-end=\"4775\">Aquest codi est\u00e0 ordenat en un flux l\u00f2gic de dalt a baix:<\/p><ol data-start=\"4776\" data-end=\"5393\"><li class=\"\" data-start=\"4776\" data-end=\"4843\"><p class=\"\" data-start=\"4779\" data-end=\"4843\">Instal\u00b7laci\u00f3 de llibreries (per evitar errors d&#8217;importaci\u00f3).<\/p><\/li><li class=\"\" data-start=\"4844\" data-end=\"4913\"><p class=\"\" data-start=\"4847\" data-end=\"4913\">Importaci\u00f3 de llibreries (seguint una l\u00f2gica de depend\u00e8ncies).<\/p><\/li><li class=\"\" data-start=\"4914\" data-end=\"4987\"><p class=\"\" data-start=\"4917\" data-end=\"4987\">Configuraci\u00f3 de l&#8217;API (comprova si la clau d&#8217;API est\u00e0 disponible).<\/p><\/li><li class=\"\" data-start=\"4988\" data-end=\"5067\"><p class=\"\" data-start=\"4991\" data-end=\"5067\">Instruccions del sistema (estableix normes i estil de resposta de l\u2019IA).<\/p><\/li><li class=\"\" data-start=\"5068\" data-end=\"5136\"><p class=\"\" data-start=\"5071\" data-end=\"5136\">Configuraci\u00f3 del model d&#8217;IA (defineix el model i par\u00e0metres).<\/p><\/li><li class=\"\" data-start=\"5137\" data-end=\"5182\"><p class=\"\" data-start=\"5140\" data-end=\"5182\">Extracci\u00f3 de dades web (web scraping).<\/p><\/li><li class=\"\" data-start=\"5183\" data-end=\"5265\"><p class=\"\" data-start=\"5186\" data-end=\"5265\">Configuraci\u00f3 del servidor Flask (per permetre comunicaci\u00f3 amb el frontend).<\/p><\/li><li class=\"\" data-start=\"5266\" data-end=\"5331\"><p class=\"\" data-start=\"5269\" data-end=\"5331\">Definici\u00f3 de la ruta de xat (per gestionar les converses).<\/p><\/li><li class=\"\" data-start=\"5332\" data-end=\"5393\"><p class=\"\" data-start=\"5335\" data-end=\"5393\">Execuci\u00f3 del servidor (per posar en marxa el sistema).<\/p><\/li><\/ol>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5f59826 elementor-widget elementor-widget-text-editor\" data-id=\"5f59826\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h5 data-start=\"160\" data-end=\"197\">2.1 Instal\u00b7laci\u00f3 de llibreries<\/h5><p class=\"\" data-start=\"198\" data-end=\"376\">Primer, el codi assegura que totes les llibreries necess\u00e0ries estiguin instal\u00b7lades abans de continuar. Aix\u00f2 evita errors si alguna no est\u00e0 disponible en l&#8217;entorn on s&#8217;executa.<\/p><p data-start=\"198\" data-end=\"376\">Despr\u00e9s de la instal\u00b7laci\u00f3, el codi importa totes les llibreries necess\u00e0ries per funcionar: L&#8217;ordre d&#8217;importaci\u00f3 segueix una l\u00f2gica: primer les eines per web scraping (<code data-start=\"1108\" data-end=\"1123\">BeautifulSoup<\/code>, <code data-start=\"1125\" data-end=\"1135\">requests<\/code>), despr\u00e9s la IA (<code data-start=\"1153\" data-end=\"1160\">genai<\/code>), i finalment el servidor (<code data-start=\"1188\" data-end=\"1195\">Flask<\/code>, <code data-start=\"1197\" data-end=\"1204\">ngrok<\/code>).<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-faa5f87 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no e-con e-parent\" data-id=\"faa5f87\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-03616d5 elementor-widget elementor-widget-code-block-for-elementor\" data-id=\"03616d5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-block-for-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-javascript'># La primera vegada, desmarca la l&iacute;nia de sota per a instal&middot;lar la biblioteca\n# Nom&eacute;s desmarcar si no tens les llibreries instal&middot;lades pr&egrave;viament\n!pip install google-genai # Alg1: Instal&middot;la la llibreria google-genai per interactuar amb el model GenAI\n!pip install beautifulsoup4 requests # Alg2: Instal&middot;la BeautifulSoup per web scraping i requests per fer peticions HTTP\n!pip install flask flask-ngrok # Alg3: Instal&middot;la Flask per crear el servidor web i Flask-ngrok per exposar el servidor\n!pip install flask pyngrok # Alg4: Instal&middot;la Flask per crear el servidor i pyngrok per crear t&uacute;nels amb Ngrok\n!pip install flask-cors # Alg5: Instal&middot;la Flask-CORS per gestionar CORS (peticions des de diferents or&iacute;gens)\n\n\n\nimport bs4 # Alg6: Importa BeautifulSoup per analitzar el contingut HTML de les p&agrave;gines web\nimport requests  # Alg7: Importa requests per fer peticions HTTP\nfrom flask_cors import CORS # Alg8: Importa CORS per activar la compartici&oacute; de recursos entre diferents or&iacute;gens\nfrom google import genai # Alg9: Importa la llibreria de GenAI per generar respostes amb el model de Google\nfrom google.colab import userdata # Alg10: Importa userdata per obtenir dades d&#039;usuari a Google Colab\nfrom bs4 import BeautifulSoup  # Alg11: Torna a importar BeautifulSoup per a l&#039;an&agrave;lisi HTML\nfrom flask import Flask, request, jsonify # Alg12: Importa Flask per gestionar el servidor web i les peticions HTT\nfrom pyngrok import ngrok # Alg13: Importa ngrok per crear un t&uacute;nel per a l&#039;aplicaci&oacute; web local\n\n# ==============================\n# CONFIGURACI&Oacute; DE L&#039;API\n# ==============================\n\nGOOGLE_API_KEY = userdata.get(&quot;GOOGLE_API_KEY&quot;)  # Alg14: Obt&eacute; la clau API de Google des de userdata a Google Colab\n\nif not GOOGLE_API_KEY: # Alg15: Comprova si la clau API s&#039;ha configurat correctament\n    print(&quot;\u26a0\ufe0f No s&#039;ha trobat la clau API. Configura-la a Colab abans d&#039;executar el programa.&quot;) # Alg16: Missatge d&#039;error si la clau no es troba\n    exit()  # Alg17: Termina l&#039;execuci&oacute; del programa si la clau API no es troba\n\nclient = genai.Client(api_key=GOOGLE_API_KEY) # Alg18: Crea una inst&agrave;ncia del client de GenAI amb la clau API\n\n# ==============================\n# INSTRUCCIONS DEL SISTEMA\n# ==============================\n\nsystem_instruction =&quot;&quot;&quot;\nEts un alumne del cicle de sistemes microinform&agrave;tics i xarxes a l&rsquo;Institut Castellbisbal.\nEt dius Ana Borrego Toledo i est&aacute;s cursant un grau mitj&agrave; de Sistemes microinform&agrave;tics i xarxes.\nRespon amb un to divertit i enginy&oacute;s.\nestil desenfadat, per&ograve; sense faltar al respecte.\n\ud83d\udccc **Normes de comportament**:\n- **Respon nom&eacute;s a preguntes relacionades amb el cicle, la teva web i el teu perfil acad&egrave;mic.**\n- **Ignora** qualsevol comentari fora de lloc, incloent temes personals, pol&iacute;tics o no relacionats amb l&#039;&agrave;mbit acad&egrave;mic.\n- **No responguis** a comentaris ofensius, grollers o innecessaris.\n- Si alg&uacute; fa una pregunta fora de context, com per exemple:\n    &quot;Ai ai... crec que el meu cable de xarxa s&#039;ha desconnectat! No puc respondre aix&ograve;!&quot;\n    &quot;Aix&ograve; no est&agrave; dins del meu contracte de chatbot! Pregunta&rsquo;m sobre inform&agrave;tica!&quot;\n\nEn el cicle de sistemes microinform&agrave;tics i xarxes que curses es treballa a partir de REPTES. En cada REPTE, primer realitzes una s&egrave;rie de tasques que et permeten tocar diferents temes o conceptes del m&ograve;dul. Quan acabes el repte, passes a la fase de manaments, on demostres que has adquirit nous coneixements a trav&eacute;s de les tasques realitzades. Aquesta fase &eacute;s l&rsquo;encarregada de valorar si has ent&egrave;s correctament el contingut i, en base a aix&ograve;, es decideix si aproves o no el m&ograve;dul i els coneixements.\nEls REPTES es fan en grup o individualment.\nIgnora els comentaris fora de lloc, ax&iacute; com comentaris sexuals, personals...&quot;&quot;&quot;\n\nchat = client.chats.create( # Alg20: Crea una sessi&oacute; de xat amb historial autom&agrave;tic i instruccions personalitzades\n    model=&quot;gemini-2.0-flash&quot;,  # Alg21: Configura el model de llenguatge (verifica que sigui compatible amb la versi&oacute; de GenAI)\n    config=genai.types.GenerateContentConfig( # Alg22: Configura les opcions del model de llenguatge\n        system_instruction=system_instruction,  # Alg23: Inclou les instruccions per personalitzar el comportament\n        temperature=0.7, # Alg24: Configura el nivell de creativitat del model (0 a 1, on 0 &eacute;s m&eacute;s determinista)\n        max_output_tokens=200 # Alg25: Configura la longitud m&agrave;xima de la resposta generada\n    )\n)\n\n# ==============================\n# EXTRAURE INFORMACI&Oacute; DE LA P&Agrave;GINA WEB (web scrapping)\n# ==============================\n\nurl = &quot;https:\/\/aborrego.inscastellbisbal.net\/ipop\/&quot; # Alg26: URL de la p&agrave;gina web de la qual es vol extreure informaci&oacute;\n\nresponse = requests.get(url) # Alg27: Realitza una petici&oacute; GET per obtenir el contingut HTML de la p&agrave;gina\n\nif response.status_code == 200: # Alg28: Comprova si la petici&oacute; HTTP ha estat exitosa (codi 200)\n    soup = BeautifulSoup(response.text, &quot;html.parser&quot;)  # Alg29: Analitza el contingut HTML amb BeautifulSoup\n\n\n    text_complet = soup.get_text(separator=&quot;\\n&quot;, strip=True) # Alg30: Extreu tot el text visible de la p&agrave;gina\n\n    print(&quot;\ud83d\udccc TEXT COMPLET DE LA P&Agrave;GINA:\\n&quot;)\n    print(text_complet) # Alg31: Mostra el text complet extret de la p&agrave;gina\n    print(&quot;\\n&quot; + &quot;=&quot;*80 + &quot;\\n&quot;)\n\n    print(&quot;\ud83d\udd17 ENLLA&Ccedil;OS TROBATS A LA P&Agrave;GINA:\\n&quot;)\n    for link in soup.find_all(&quot;a&quot;, href=True): # Alg32: Busca tots els enlla&ccedil;os de la p&agrave;gina\n        print(link[&quot;href&quot;])\n\n    print(&quot;\\n&quot; + &quot;=&quot;*80 + &quot;\\n&quot;)\n\n    print(&quot;\ud83d\udcdd ENCAP&Ccedil;ALAMENTS TROBATS:\\n&quot;)\n    for header in soup.find_all([&quot;h1&quot;, &quot;h2&quot;, &quot;h3&quot;, &quot;h4&quot;, &quot;h5&quot;, &quot;h6&quot;]): # Alg34: Extreu tots els encap&ccedil;alaments (h1-h6)\n        print(f&quot;{header.name.upper()}: {header.text}&quot;) # Alg35: Mostra el tipus d&#039;encap&ccedil;alament i el seu text\nelse:  # Alg36: Gesti&oacute; d&#039;error si la petici&oacute; no ha estat exitosa\n    print(f&quot;\u26a0\ufe0f Error carregant la p&agrave;gina (Codi {response.status_code})&quot;) # Alg37: Mostra el codi d&#039;error de la petici&oacute;\n\n# ==============================\n# BUCLE DEL XAT\n# ==============================\n\nfrom flask import Flask, request, jsonify\nfrom flask_cors import CORS  # Importa Flask-CORS\nfrom pyngrok import ngrok\n\napp = Flask(__name__) # Alg38: Crea una inst&agrave;ncia de l&#039;aplicaci&oacute; Flask\nCORS(app)  # Alg39: Activa CORS per permetre peticions des de diferents or&iacute;gens\n\nngrok.set_auth_token(&quot;2uTpEJU6jYqOIOXrL4NDYFpSu8R_4stuSzXJ3Bv64N5rr5auN&quot;) # Alg40: Configura el token d&#039;autenticaci&oacute; per a Ngrok\n\n\n# Iniciar Ngrok i exposar el servidor\npublic_url = ngrok.connect(5000) # Alg41: Exposa l&#039;aplicaci&oacute; Flask a trav&eacute;s d&#039;Ngrok a la porta 5000\nprint(&quot;\ud83c\udf0d URL p&uacute;blica del backend:&quot;, public_url) # Alg42: Mostra la URL p&uacute;blica per accedir al servidor\n\n@app.route(&quot;\/chat&quot;, methods=[&quot;POST&quot;]) # Alg43: Defineix la ruta &#039;\/chat&#039; per a les peticions POST\ndef chat_route():# Alg44: Funci&oacute; que gestiona la petici&oacute; del xat\n    data = request.get_json() # Alg45: Obt&eacute; les dades JSON enviades pel frontend\n    message = data.get(&quot;message&quot;, &quot;&quot;) # Alg46: Extreu el missatge del JSON\n\n    try:\n        response = chat.send_message(message) # Alg47: Envia el missatge al model GenAI\n        return jsonify({&quot;response&quot;: response.text.strip()}) # Alg48: Retorna la resposta generada pel model\n    except Exception as e: # Alg49: Captura errors durant la comunicaci&oacute; amb GenAI\n        print(f&quot;\u26a0\ufe0f Error en la comunicaci&oacute; amb Gemini: {e}&quot;)  # Alg50: Mostra el missatge d&#039;error\n        return jsonify({&quot;response&quot;: &quot;S&#039;ha produ&iuml;t un error. Torna-ho a intentar m&eacute;s tard.&quot;}) # Alg51: Resposta d&#039;error al frontend\n\nif __name__ == &quot;__main__&quot;: # Alg52: Condici&oacute; per a executar el servidor si el script es llanci directament\n    print(&quot;\ud83d\udd25 Servidor en funcionament! Usa aquesta URL en el teu frontend:&quot;) # Alg53: Mostra un missatge indicant que el servidor est&agrave; actiu\n    app.run(port=5000) # Alg54: Inicia el servidor Flask a la porta 5000<\/code><\/pre>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>codi net i ben documentat (comentaris al codi) Tornar al repte 1.6 He\u00a0 organitzat el codi en Google Colabs de una manera organitzada i neta (#). 1. Comentaris detallats -Comentaris a cada pas del codi (Alg1, Alg2, Alg3&#8230;) que expliquen la funcionalitat de cada l\u00ednia. -Explicaci\u00f3 de condicions i possibles errors, per exemple: &#8211;Divisi\u00f3 en seccions clares: El codi est\u00e0 estructurat amb l\u00ednies de separaci\u00f3 # ============================== que ajuden a identificar r\u00e0pidament cada bloc funcional (Configuraci\u00f3 de l&#8217;API, Web Scraping, Servidor Flask, etc.). &#8211;Ordre l\u00f2gic: Les importacions de llibreries es fan primer, seguides de la configuraci\u00f3 de l\u2019API, la configuraci\u00f3 del xat, l&#8217;extracci\u00f3 d&#8217;informaci\u00f3 de la web i finalment l\u2019inici del servidor. Aquest codi est\u00e0 ben estructurat perqu\u00e8 segueix un ordre l\u00f2gic i organitzat, facilitant la seva lectura i manteniment: Aix\u00f2 garanteix que tots els m\u00f2duls estiguin disponibles abans d&#8217;importar-los. 2. Organitzaci\u00f3 Aquest codi est\u00e0 ordenat en un flux l\u00f2gic de dalt a baix: Instal\u00b7laci\u00f3 de llibreries (per evitar errors d&#8217;importaci\u00f3). Importaci\u00f3 de llibreries (seguint una l\u00f2gica de depend\u00e8ncies). Configuraci\u00f3 de l&#8217;API (comprova si la clau d&#8217;API est\u00e0 disponible). Instruccions del sistema (estableix normes i estil de resposta de l\u2019IA). Configuraci\u00f3 del model d&#8217;IA (defineix el model i par\u00e0metres). Extracci\u00f3 de dades web (web scraping). Configuraci\u00f3 del servidor Flask (per permetre comunicaci\u00f3 amb el frontend). Definici\u00f3 de la ruta de xat (per gestionar les converses). Execuci\u00f3 del servidor (per posar en marxa el sistema). 2.1 Instal\u00b7laci\u00f3 de llibreries Primer, el codi assegura que totes les llibreries necess\u00e0ries estiguin instal\u00b7lades abans de continuar. Aix\u00f2 evita errors si alguna no est\u00e0 disponible en l&#8217;entorn on s&#8217;executa. Despr\u00e9s de la instal\u00b7laci\u00f3, el codi importa totes les llibreries necess\u00e0ries per funcionar: L&#8217;ordre d&#8217;importaci\u00f3 segueix una l\u00f2gica: primer les eines per web scraping (BeautifulSoup, requests), despr\u00e9s la IA (genai), i finalment el servidor (Flask, ngrok). # La primera vegada, desmarca la l&iacute;nia de sota per a instal&middot;lar la biblioteca # Nom&eacute;s desmarcar si no tens les llibreries instal&middot;lades pr&egrave;viament !pip install google-genai # Alg1: Instal&middot;la la llibreria google-genai per interactuar amb el model GenAI !pip install beautifulsoup4 requests # Alg2: Instal&middot;la BeautifulSoup per web scraping i requests per fer peticions HTTP !pip install flask flask-ngrok # Alg3: Instal&middot;la Flask per crear el servidor web i Flask-ngrok per exposar el servidor !pip install flask pyngrok # Alg4: Instal&middot;la Flask per crear el servidor i pyngrok per crear t&uacute;nels amb Ngrok !pip install flask-cors # Alg5: Instal&middot;la Flask-CORS per gestionar CORS (peticions des de diferents or&iacute;gens) import bs4 # Alg6: Importa BeautifulSoup per analitzar el contingut HTML de les p&agrave;gines web import requests # Alg7: Importa requests per fer peticions HTTP from flask_cors import CORS # Alg8: Importa CORS per activar la compartici&oacute; de recursos entre diferents or&iacute;gens from google import genai # Alg9: Importa la llibreria de GenAI per generar respostes amb el model de Google from google.colab import userdata # Alg10: Importa userdata per obtenir dades d&#039;usuari a Google Colab from bs4 import BeautifulSoup # Alg11: Torna a importar BeautifulSoup per a l&#039;an&agrave;lisi HTML from flask import Flask, request, jsonify # Alg12: Importa Flask per gestionar el servidor web i les peticions HTT from pyngrok import ngrok # Alg13: Importa ngrok per crear un t&uacute;nel per a l&#039;aplicaci&oacute; web local # ============================== # CONFIGURACI&Oacute; DE L&#039;API # ============================== GOOGLE_API_KEY = userdata.get(&quot;GOOGLE_API_KEY&quot;) # Alg14: Obt&eacute; la clau API de Google des de userdata a Google Colab if not GOOGLE_API_KEY: # Alg15: Comprova si la clau API s&#039;ha configurat correctament print(&quot;\u26a0\ufe0f No s&#039;ha trobat la clau API. Configura-la a Colab abans d&#039;executar el programa.&quot;) # Alg16: Missatge d&#039;error si la clau no es troba exit() # Alg17: Termina l&#039;execuci&oacute; del programa si la clau API no es troba client = genai.Client(api_key=GOOGLE_API_KEY) # Alg18: Crea una inst&agrave;ncia del client de GenAI amb la clau API # ============================== # INSTRUCCIONS DEL SISTEMA # ============================== system_instruction =&quot;&quot;&quot; Ets un alumne del cicle de sistemes microinform&agrave;tics i xarxes a l&rsquo;Institut Castellbisbal. Et dius Ana Borrego Toledo i est&aacute;s cursant un grau mitj&agrave; de Sistemes microinform&agrave;tics i xarxes. Respon amb un to divertit i enginy&oacute;s. estil desenfadat, per&ograve; sense faltar al respecte. \ud83d\udccc **Normes de comportament**: &#8211; **Respon nom&eacute;s a preguntes relacionades amb el cicle, la teva web i el teu perfil acad&egrave;mic.** &#8211; **Ignora** qualsevol comentari fora de lloc, incloent temes personals, pol&iacute;tics o no relacionats amb l&#039;&agrave;mbit acad&egrave;mic. &#8211; **No responguis** a comentaris ofensius, grollers o innecessaris. &#8211; Si alg&uacute; fa una pregunta fora de context, com per exemple: &quot;Ai ai&#8230; crec que el meu cable de xarxa s&#039;ha desconnectat! No puc respondre aix&ograve;!&quot; &quot;Aix&ograve; no est&agrave; dins del meu contracte de chatbot! Pregunta&rsquo;m sobre inform&agrave;tica!&quot; En el cicle de sistemes microinform&agrave;tics i xarxes que curses es treballa a partir de REPTES. En cada REPTE, primer realitzes una s&egrave;rie de tasques que et permeten tocar diferents temes o conceptes del m&ograve;dul. Quan acabes el repte, passes a la fase de manaments, on demostres que has adquirit nous coneixements a trav&eacute;s de les tasques realitzades. Aquesta fase &eacute;s l&rsquo;encarregada de valorar si has ent&egrave;s correctament el contingut i, en base a aix&ograve;, es decideix si aproves o no el m&ograve;dul i els coneixements. Els REPTES es fan en grup o individualment. Ignora els comentaris fora de lloc, ax&iacute; com comentaris sexuals, personals&#8230;&quot;&quot;&quot; chat = client.chats.create( # Alg20: Crea una sessi&oacute; de xat amb historial autom&agrave;tic i instruccions personalitzades model=&quot;gemini-2.0-flash&quot;, # Alg21: Configura el model de llenguatge (verifica que sigui compatible amb la versi&oacute; de GenAI) config=genai.types.GenerateContentConfig( # Alg22: Configura les opcions del model de llenguatge system_instruction=system_instruction, # Alg23: Inclou les instruccions per personalitzar el comportament temperature=0.7, # Alg24: Configura el nivell de creativitat del model (0 a 1, on 0 &eacute;s m&eacute;s determinista) max_output_tokens=200 # Alg25: Configura la longitud m&agrave;xima de la resposta generada ) ) # ============================== # EXTRAURE INFORMACI&Oacute; DE LA P&Agrave;GINA WEB (web scrapping) # ============================== url = &quot;https:\/\/aborrego.inscastellbisbal.net\/ipop\/&quot; # Alg26: URL de la p&agrave;gina web de la qual es vol extreure informaci&oacute; response = requests.get(url) # Alg27: Realitza una petici&oacute; GET per obtenir el contingut HTML &#8230; <a title=\"Codi net i ben documentat (Comentaris al codi)\" class=\"read-more\" href=\"https:\/\/aborrego.inscastellbisbal.net\/en\/2025\/03\/19\/codi-net-i-ben-documentat-comentaris-al-codi\/\" aria-label=\"Read more about Codi net i ben documentat (Comentaris al codi)\">Read more<\/a><\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[95,84],"tags":[],"class_list":["post-6234","post","type-post","status-publish","format-standard","hentry","category-repte-1-6","category-disseny-i-aplicacio-de-la-ia"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Codi net i ben documentat (Comentaris al codi) - Ana Borrego Toledo<\/title>\n<meta name=\"robots\" content=\"noindex, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Codi net i ben documentat (Comentaris al codi) - Ana Borrego Toledo\" \/>\n<meta property=\"og:description\" content=\"codi net i ben documentat (comentaris al codi) Tornar al repte 1.6 He\u00a0 organitzat el codi en Google Colabs de una manera organitzada i neta (#). 1. Comentaris detallats -Comentaris a cada pas del codi (Alg1, Alg2, Alg3&#8230;) que expliquen la funcionalitat de cada l\u00ednia. -Explicaci\u00f3 de condicions i possibles errors, per exemple: &#8211;Divisi\u00f3 en seccions clares: El codi est\u00e0 estructurat amb l\u00ednies de separaci\u00f3 # ============================== que ajuden a identificar r\u00e0pidament cada bloc funcional (Configuraci\u00f3 de l&#8217;API, Web Scraping, Servidor Flask, etc.). &#8211;Ordre l\u00f2gic: Les importacions de llibreries es fan primer, seguides de la configuraci\u00f3 de l\u2019API, la configuraci\u00f3 del xat, l&#8217;extracci\u00f3 d&#8217;informaci\u00f3 de la web i finalment l\u2019inici del servidor. Aquest codi est\u00e0 ben estructurat perqu\u00e8 segueix un ordre l\u00f2gic i organitzat, facilitant la seva lectura i manteniment: Aix\u00f2 garanteix que tots els m\u00f2duls estiguin disponibles abans d&#8217;importar-los. 2. Organitzaci\u00f3 Aquest codi est\u00e0 ordenat en un flux l\u00f2gic de dalt a baix: Instal\u00b7laci\u00f3 de llibreries (per evitar errors d&#8217;importaci\u00f3). Importaci\u00f3 de llibreries (seguint una l\u00f2gica de depend\u00e8ncies). Configuraci\u00f3 de l&#8217;API (comprova si la clau d&#8217;API est\u00e0 disponible). Instruccions del sistema (estableix normes i estil de resposta de l\u2019IA). Configuraci\u00f3 del model d&#8217;IA (defineix el model i par\u00e0metres). Extracci\u00f3 de dades web (web scraping). Configuraci\u00f3 del servidor Flask (per permetre comunicaci\u00f3 amb el frontend). Definici\u00f3 de la ruta de xat (per gestionar les converses). Execuci\u00f3 del servidor (per posar en marxa el sistema). 2.1 Instal\u00b7laci\u00f3 de llibreries Primer, el codi assegura que totes les llibreries necess\u00e0ries estiguin instal\u00b7lades abans de continuar. Aix\u00f2 evita errors si alguna no est\u00e0 disponible en l&#8217;entorn on s&#8217;executa. Despr\u00e9s de la instal\u00b7laci\u00f3, el codi importa totes les llibreries necess\u00e0ries per funcionar: L&#8217;ordre d&#8217;importaci\u00f3 segueix una l\u00f2gica: primer les eines per web scraping (BeautifulSoup, requests), despr\u00e9s la IA (genai), i finalment el servidor (Flask, ngrok). # La primera vegada, desmarca la l&iacute;nia de sota per a instal&middot;lar la biblioteca # Nom&eacute;s desmarcar si no tens les llibreries instal&middot;lades pr&egrave;viament !pip install google-genai # Alg1: Instal&middot;la la llibreria google-genai per interactuar amb el model GenAI !pip install beautifulsoup4 requests # Alg2: Instal&middot;la BeautifulSoup per web scraping i requests per fer peticions HTTP !pip install flask flask-ngrok # Alg3: Instal&middot;la Flask per crear el servidor web i Flask-ngrok per exposar el servidor !pip install flask pyngrok # Alg4: Instal&middot;la Flask per crear el servidor i pyngrok per crear t&uacute;nels amb Ngrok !pip install flask-cors # Alg5: Instal&middot;la Flask-CORS per gestionar CORS (peticions des de diferents or&iacute;gens) import bs4 # Alg6: Importa BeautifulSoup per analitzar el contingut HTML de les p&agrave;gines web import requests # Alg7: Importa requests per fer peticions HTTP from flask_cors import CORS # Alg8: Importa CORS per activar la compartici&oacute; de recursos entre diferents or&iacute;gens from google import genai # Alg9: Importa la llibreria de GenAI per generar respostes amb el model de Google from google.colab import userdata # Alg10: Importa userdata per obtenir dades d&#039;usuari a Google Colab from bs4 import BeautifulSoup # Alg11: Torna a importar BeautifulSoup per a l&#039;an&agrave;lisi HTML from flask import Flask, request, jsonify # Alg12: Importa Flask per gestionar el servidor web i les peticions HTT from pyngrok import ngrok # Alg13: Importa ngrok per crear un t&uacute;nel per a l&#039;aplicaci&oacute; web local # ============================== # CONFIGURACI&Oacute; DE L&#039;API # ============================== GOOGLE_API_KEY = userdata.get(&quot;GOOGLE_API_KEY&quot;) # Alg14: Obt&eacute; la clau API de Google des de userdata a Google Colab if not GOOGLE_API_KEY: # Alg15: Comprova si la clau API s&#039;ha configurat correctament print(&quot;\u26a0\ufe0f No s&#039;ha trobat la clau API. Configura-la a Colab abans d&#039;executar el programa.&quot;) # Alg16: Missatge d&#039;error si la clau no es troba exit() # Alg17: Termina l&#039;execuci&oacute; del programa si la clau API no es troba client = genai.Client(api_key=GOOGLE_API_KEY) # Alg18: Crea una inst&agrave;ncia del client de GenAI amb la clau API # ============================== # INSTRUCCIONS DEL SISTEMA # ============================== system_instruction =&quot;&quot;&quot; Ets un alumne del cicle de sistemes microinform&agrave;tics i xarxes a l&rsquo;Institut Castellbisbal. Et dius Ana Borrego Toledo i est&aacute;s cursant un grau mitj&agrave; de Sistemes microinform&agrave;tics i xarxes. Respon amb un to divertit i enginy&oacute;s. estil desenfadat, per&ograve; sense faltar al respecte. \ud83d\udccc **Normes de comportament**: - **Respon nom&eacute;s a preguntes relacionades amb el cicle, la teva web i el teu perfil acad&egrave;mic.** - **Ignora** qualsevol comentari fora de lloc, incloent temes personals, pol&iacute;tics o no relacionats amb l&#039;&agrave;mbit acad&egrave;mic. - **No responguis** a comentaris ofensius, grollers o innecessaris. - Si alg&uacute; fa una pregunta fora de context, com per exemple: &quot;Ai ai... crec que el meu cable de xarxa s&#039;ha desconnectat! No puc respondre aix&ograve;!&quot; &quot;Aix&ograve; no est&agrave; dins del meu contracte de chatbot! Pregunta&rsquo;m sobre inform&agrave;tica!&quot; En el cicle de sistemes microinform&agrave;tics i xarxes que curses es treballa a partir de REPTES. En cada REPTE, primer realitzes una s&egrave;rie de tasques que et permeten tocar diferents temes o conceptes del m&ograve;dul. Quan acabes el repte, passes a la fase de manaments, on demostres que has adquirit nous coneixements a trav&eacute;s de les tasques realitzades. Aquesta fase &eacute;s l&rsquo;encarregada de valorar si has ent&egrave;s correctament el contingut i, en base a aix&ograve;, es decideix si aproves o no el m&ograve;dul i els coneixements. Els REPTES es fan en grup o individualment. Ignora els comentaris fora de lloc, ax&iacute; com comentaris sexuals, personals...&quot;&quot;&quot; chat = client.chats.create( # Alg20: Crea una sessi&oacute; de xat amb historial autom&agrave;tic i instruccions personalitzades model=&quot;gemini-2.0-flash&quot;, # Alg21: Configura el model de llenguatge (verifica que sigui compatible amb la versi&oacute; de GenAI) config=genai.types.GenerateContentConfig( # Alg22: Configura les opcions del model de llenguatge system_instruction=system_instruction, # Alg23: Inclou les instruccions per personalitzar el comportament temperature=0.7, # Alg24: Configura el nivell de creativitat del model (0 a 1, on 0 &eacute;s m&eacute;s determinista) max_output_tokens=200 # Alg25: Configura la longitud m&agrave;xima de la resposta generada ) ) # ============================== # EXTRAURE INFORMACI&Oacute; DE LA P&Agrave;GINA WEB (web scrapping) # ============================== url = &quot;https:\/\/aborrego.inscastellbisbal.net\/ipop\/&quot; # Alg26: URL de la p&agrave;gina web de la qual es vol extreure informaci&oacute; response = requests.get(url) # Alg27: Realitza una petici&oacute; GET per obtenir el contingut HTML ... Read more\" \/>\n<meta property=\"og:url\" content=\"https:\/\/aborrego.inscastellbisbal.net\/en\/2025\/03\/19\/codi-net-i-ben-documentat-comentaris-al-codi\/\" \/>\n<meta property=\"og:site_name\" content=\"Ana Borrego Toledo\" \/>\n<meta property=\"article:published_time\" content=\"2025-03-19T08:34:34+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-03-25T12:19:50+00:00\" \/>\n<meta name=\"author\" content=\"aborrego\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"aborrego\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/aborrego.inscastellbisbal.net\\\/2025\\\/03\\\/19\\\/codi-net-i-ben-documentat-comentaris-al-codi\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/aborrego.inscastellbisbal.net\\\/2025\\\/03\\\/19\\\/codi-net-i-ben-documentat-comentaris-al-codi\\\/\"},\"author\":{\"name\":\"aborrego\",\"@id\":\"https:\\\/\\\/aborrego.inscastellbisbal.net\\\/#\\\/schema\\\/person\\\/596b5d3dc4735c43cfaafed47741b9d1\"},\"headline\":\"Codi net i ben documentat (Comentaris al codi)\",\"datePublished\":\"2025-03-19T08:34:34+00:00\",\"dateModified\":\"2025-03-25T12:19:50+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/aborrego.inscastellbisbal.net\\\/2025\\\/03\\\/19\\\/codi-net-i-ben-documentat-comentaris-al-codi\\\/\"},\"wordCount\":330,\"publisher\":{\"@id\":\"https:\\\/\\\/aborrego.inscastellbisbal.net\\\/#organization\"},\"articleSection\":[\"Repte 1.6\",\"\ud83e\udd16- Disseny i aplicaci\u00f3 de la IA\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/aborrego.inscastellbisbal.net\\\/2025\\\/03\\\/19\\\/codi-net-i-ben-documentat-comentaris-al-codi\\\/\",\"url\":\"https:\\\/\\\/aborrego.inscastellbisbal.net\\\/2025\\\/03\\\/19\\\/codi-net-i-ben-documentat-comentaris-al-codi\\\/\",\"name\":\"Codi net i ben documentat (Comentaris al codi) - Ana Borrego Toledo\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/aborrego.inscastellbisbal.net\\\/#website\"},\"datePublished\":\"2025-03-19T08:34:34+00:00\",\"dateModified\":\"2025-03-25T12:19:50+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/aborrego.inscastellbisbal.net\\\/2025\\\/03\\\/19\\\/codi-net-i-ben-documentat-comentaris-al-codi\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/aborrego.inscastellbisbal.net\\\/2025\\\/03\\\/19\\\/codi-net-i-ben-documentat-comentaris-al-codi\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/aborrego.inscastellbisbal.net\\\/2025\\\/03\\\/19\\\/codi-net-i-ben-documentat-comentaris-al-codi\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/aborrego.inscastellbisbal.net\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Codi net i ben documentat (Comentaris al codi)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/aborrego.inscastellbisbal.net\\\/#website\",\"url\":\"https:\\\/\\\/aborrego.inscastellbisbal.net\\\/\",\"name\":\"Ana Borrego Toledo\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/aborrego.inscastellbisbal.net\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/aborrego.inscastellbisbal.net\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/aborrego.inscastellbisbal.net\\\/#organization\",\"name\":\"Ana Borrego Toledo\",\"url\":\"https:\\\/\\\/aborrego.inscastellbisbal.net\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/aborrego.inscastellbisbal.net\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/aborrego.inscastellbisbal.net\\\/wp-content\\\/uploads\\\/2025\\\/03\\\/cropped-Selection_255.png\",\"contentUrl\":\"https:\\\/\\\/aborrego.inscastellbisbal.net\\\/wp-content\\\/uploads\\\/2025\\\/03\\\/cropped-Selection_255.png\",\"width\":549,\"height\":328,\"caption\":\"Ana Borrego Toledo\"},\"image\":{\"@id\":\"https:\\\/\\\/aborrego.inscastellbisbal.net\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/aborrego.inscastellbisbal.net\\\/#\\\/schema\\\/person\\\/596b5d3dc4735c43cfaafed47741b9d1\",\"name\":\"aborrego\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e158785622f9364a28d322a7a8711e2ea34ebb67263b57ff915d7b49cb3cf0d1?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e158785622f9364a28d322a7a8711e2ea34ebb67263b57ff915d7b49cb3cf0d1?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e158785622f9364a28d322a7a8711e2ea34ebb67263b57ff915d7b49cb3cf0d1?s=96&d=mm&r=g\",\"caption\":\"aborrego\"},\"sameAs\":[\"https:\\\/\\\/aborrego.inscastellbisbal.net\",\"https:\\\/\\\/www.instagram.com\\\/anaaaa.aaaaaaaaaaaaaaaaaaaaa?igsh=MWVqcmx5MXl5eGdxaw==\"],\"url\":\"https:\\\/\\\/aborrego.inscastellbisbal.net\\\/en\\\/author\\\/aborrego\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Codi net i ben documentat (Comentaris al codi) - Ana Borrego Toledo","robots":{"index":"noindex","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"og_locale":"en_US","og_type":"article","og_title":"Codi net i ben documentat (Comentaris al codi) - Ana Borrego Toledo","og_description":"codi net i ben documentat (comentaris al codi) Tornar al repte 1.6 He\u00a0 organitzat el codi en Google Colabs de una manera organitzada i neta (#). 1. Comentaris detallats -Comentaris a cada pas del codi (Alg1, Alg2, Alg3&#8230;) que expliquen la funcionalitat de cada l\u00ednia. -Explicaci\u00f3 de condicions i possibles errors, per exemple: &#8211;Divisi\u00f3 en seccions clares: El codi est\u00e0 estructurat amb l\u00ednies de separaci\u00f3 # ============================== que ajuden a identificar r\u00e0pidament cada bloc funcional (Configuraci\u00f3 de l&#8217;API, Web Scraping, Servidor Flask, etc.). &#8211;Ordre l\u00f2gic: Les importacions de llibreries es fan primer, seguides de la configuraci\u00f3 de l\u2019API, la configuraci\u00f3 del xat, l&#8217;extracci\u00f3 d&#8217;informaci\u00f3 de la web i finalment l\u2019inici del servidor. Aquest codi est\u00e0 ben estructurat perqu\u00e8 segueix un ordre l\u00f2gic i organitzat, facilitant la seva lectura i manteniment: Aix\u00f2 garanteix que tots els m\u00f2duls estiguin disponibles abans d&#8217;importar-los. 2. Organitzaci\u00f3 Aquest codi est\u00e0 ordenat en un flux l\u00f2gic de dalt a baix: Instal\u00b7laci\u00f3 de llibreries (per evitar errors d&#8217;importaci\u00f3). Importaci\u00f3 de llibreries (seguint una l\u00f2gica de depend\u00e8ncies). Configuraci\u00f3 de l&#8217;API (comprova si la clau d&#8217;API est\u00e0 disponible). Instruccions del sistema (estableix normes i estil de resposta de l\u2019IA). Configuraci\u00f3 del model d&#8217;IA (defineix el model i par\u00e0metres). Extracci\u00f3 de dades web (web scraping). Configuraci\u00f3 del servidor Flask (per permetre comunicaci\u00f3 amb el frontend). Definici\u00f3 de la ruta de xat (per gestionar les converses). Execuci\u00f3 del servidor (per posar en marxa el sistema). 2.1 Instal\u00b7laci\u00f3 de llibreries Primer, el codi assegura que totes les llibreries necess\u00e0ries estiguin instal\u00b7lades abans de continuar. Aix\u00f2 evita errors si alguna no est\u00e0 disponible en l&#8217;entorn on s&#8217;executa. Despr\u00e9s de la instal\u00b7laci\u00f3, el codi importa totes les llibreries necess\u00e0ries per funcionar: L&#8217;ordre d&#8217;importaci\u00f3 segueix una l\u00f2gica: primer les eines per web scraping (BeautifulSoup, requests), despr\u00e9s la IA (genai), i finalment el servidor (Flask, ngrok). # La primera vegada, desmarca la l&iacute;nia de sota per a instal&middot;lar la biblioteca # Nom&eacute;s desmarcar si no tens les llibreries instal&middot;lades pr&egrave;viament !pip install google-genai # Alg1: Instal&middot;la la llibreria google-genai per interactuar amb el model GenAI !pip install beautifulsoup4 requests # Alg2: Instal&middot;la BeautifulSoup per web scraping i requests per fer peticions HTTP !pip install flask flask-ngrok # Alg3: Instal&middot;la Flask per crear el servidor web i Flask-ngrok per exposar el servidor !pip install flask pyngrok # Alg4: Instal&middot;la Flask per crear el servidor i pyngrok per crear t&uacute;nels amb Ngrok !pip install flask-cors # Alg5: Instal&middot;la Flask-CORS per gestionar CORS (peticions des de diferents or&iacute;gens) import bs4 # Alg6: Importa BeautifulSoup per analitzar el contingut HTML de les p&agrave;gines web import requests # Alg7: Importa requests per fer peticions HTTP from flask_cors import CORS # Alg8: Importa CORS per activar la compartici&oacute; de recursos entre diferents or&iacute;gens from google import genai # Alg9: Importa la llibreria de GenAI per generar respostes amb el model de Google from google.colab import userdata # Alg10: Importa userdata per obtenir dades d&#039;usuari a Google Colab from bs4 import BeautifulSoup # Alg11: Torna a importar BeautifulSoup per a l&#039;an&agrave;lisi HTML from flask import Flask, request, jsonify # Alg12: Importa Flask per gestionar el servidor web i les peticions HTT from pyngrok import ngrok # Alg13: Importa ngrok per crear un t&uacute;nel per a l&#039;aplicaci&oacute; web local # ============================== # CONFIGURACI&Oacute; DE L&#039;API # ============================== GOOGLE_API_KEY = userdata.get(&quot;GOOGLE_API_KEY&quot;) # Alg14: Obt&eacute; la clau API de Google des de userdata a Google Colab if not GOOGLE_API_KEY: # Alg15: Comprova si la clau API s&#039;ha configurat correctament print(&quot;\u26a0\ufe0f No s&#039;ha trobat la clau API. Configura-la a Colab abans d&#039;executar el programa.&quot;) # Alg16: Missatge d&#039;error si la clau no es troba exit() # Alg17: Termina l&#039;execuci&oacute; del programa si la clau API no es troba client = genai.Client(api_key=GOOGLE_API_KEY) # Alg18: Crea una inst&agrave;ncia del client de GenAI amb la clau API # ============================== # INSTRUCCIONS DEL SISTEMA # ============================== system_instruction =&quot;&quot;&quot; Ets un alumne del cicle de sistemes microinform&agrave;tics i xarxes a l&rsquo;Institut Castellbisbal. Et dius Ana Borrego Toledo i est&aacute;s cursant un grau mitj&agrave; de Sistemes microinform&agrave;tics i xarxes. Respon amb un to divertit i enginy&oacute;s. estil desenfadat, per&ograve; sense faltar al respecte. \ud83d\udccc **Normes de comportament**: - **Respon nom&eacute;s a preguntes relacionades amb el cicle, la teva web i el teu perfil acad&egrave;mic.** - **Ignora** qualsevol comentari fora de lloc, incloent temes personals, pol&iacute;tics o no relacionats amb l&#039;&agrave;mbit acad&egrave;mic. - **No responguis** a comentaris ofensius, grollers o innecessaris. - Si alg&uacute; fa una pregunta fora de context, com per exemple: &quot;Ai ai... crec que el meu cable de xarxa s&#039;ha desconnectat! No puc respondre aix&ograve;!&quot; &quot;Aix&ograve; no est&agrave; dins del meu contracte de chatbot! Pregunta&rsquo;m sobre inform&agrave;tica!&quot; En el cicle de sistemes microinform&agrave;tics i xarxes que curses es treballa a partir de REPTES. En cada REPTE, primer realitzes una s&egrave;rie de tasques que et permeten tocar diferents temes o conceptes del m&ograve;dul. Quan acabes el repte, passes a la fase de manaments, on demostres que has adquirit nous coneixements a trav&eacute;s de les tasques realitzades. Aquesta fase &eacute;s l&rsquo;encarregada de valorar si has ent&egrave;s correctament el contingut i, en base a aix&ograve;, es decideix si aproves o no el m&ograve;dul i els coneixements. Els REPTES es fan en grup o individualment. Ignora els comentaris fora de lloc, ax&iacute; com comentaris sexuals, personals...&quot;&quot;&quot; chat = client.chats.create( # Alg20: Crea una sessi&oacute; de xat amb historial autom&agrave;tic i instruccions personalitzades model=&quot;gemini-2.0-flash&quot;, # Alg21: Configura el model de llenguatge (verifica que sigui compatible amb la versi&oacute; de GenAI) config=genai.types.GenerateContentConfig( # Alg22: Configura les opcions del model de llenguatge system_instruction=system_instruction, # Alg23: Inclou les instruccions per personalitzar el comportament temperature=0.7, # Alg24: Configura el nivell de creativitat del model (0 a 1, on 0 &eacute;s m&eacute;s determinista) max_output_tokens=200 # Alg25: Configura la longitud m&agrave;xima de la resposta generada ) ) # ============================== # EXTRAURE INFORMACI&Oacute; DE LA P&Agrave;GINA WEB (web scrapping) # ============================== url = &quot;https:\/\/aborrego.inscastellbisbal.net\/ipop\/&quot; # Alg26: URL de la p&agrave;gina web de la qual es vol extreure informaci&oacute; response = requests.get(url) # Alg27: Realitza una petici&oacute; GET per obtenir el contingut HTML ... Read more","og_url":"https:\/\/aborrego.inscastellbisbal.net\/en\/2025\/03\/19\/codi-net-i-ben-documentat-comentaris-al-codi\/","og_site_name":"Ana Borrego Toledo","article_published_time":"2025-03-19T08:34:34+00:00","article_modified_time":"2025-03-25T12:19:50+00:00","author":"aborrego","twitter_card":"summary_large_image","twitter_misc":{"Written by":"aborrego","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/aborrego.inscastellbisbal.net\/2025\/03\/19\/codi-net-i-ben-documentat-comentaris-al-codi\/#article","isPartOf":{"@id":"https:\/\/aborrego.inscastellbisbal.net\/2025\/03\/19\/codi-net-i-ben-documentat-comentaris-al-codi\/"},"author":{"name":"aborrego","@id":"https:\/\/aborrego.inscastellbisbal.net\/#\/schema\/person\/596b5d3dc4735c43cfaafed47741b9d1"},"headline":"Codi net i ben documentat (Comentaris al codi)","datePublished":"2025-03-19T08:34:34+00:00","dateModified":"2025-03-25T12:19:50+00:00","mainEntityOfPage":{"@id":"https:\/\/aborrego.inscastellbisbal.net\/2025\/03\/19\/codi-net-i-ben-documentat-comentaris-al-codi\/"},"wordCount":330,"publisher":{"@id":"https:\/\/aborrego.inscastellbisbal.net\/#organization"},"articleSection":["Repte 1.6","\ud83e\udd16- Disseny i aplicaci\u00f3 de la IA"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/aborrego.inscastellbisbal.net\/2025\/03\/19\/codi-net-i-ben-documentat-comentaris-al-codi\/","url":"https:\/\/aborrego.inscastellbisbal.net\/2025\/03\/19\/codi-net-i-ben-documentat-comentaris-al-codi\/","name":"Codi net i ben documentat (Comentaris al codi) - Ana Borrego Toledo","isPartOf":{"@id":"https:\/\/aborrego.inscastellbisbal.net\/#website"},"datePublished":"2025-03-19T08:34:34+00:00","dateModified":"2025-03-25T12:19:50+00:00","breadcrumb":{"@id":"https:\/\/aborrego.inscastellbisbal.net\/2025\/03\/19\/codi-net-i-ben-documentat-comentaris-al-codi\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/aborrego.inscastellbisbal.net\/2025\/03\/19\/codi-net-i-ben-documentat-comentaris-al-codi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/aborrego.inscastellbisbal.net\/2025\/03\/19\/codi-net-i-ben-documentat-comentaris-al-codi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/aborrego.inscastellbisbal.net\/"},{"@type":"ListItem","position":2,"name":"Codi net i ben documentat (Comentaris al codi)"}]},{"@type":"WebSite","@id":"https:\/\/aborrego.inscastellbisbal.net\/#website","url":"https:\/\/aborrego.inscastellbisbal.net\/","name":"Ana Borrego Toledo","description":"","publisher":{"@id":"https:\/\/aborrego.inscastellbisbal.net\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/aborrego.inscastellbisbal.net\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/aborrego.inscastellbisbal.net\/#organization","name":"Ana Borrego Toledo","url":"https:\/\/aborrego.inscastellbisbal.net\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/aborrego.inscastellbisbal.net\/#\/schema\/logo\/image\/","url":"https:\/\/aborrego.inscastellbisbal.net\/wp-content\/uploads\/2025\/03\/cropped-Selection_255.png","contentUrl":"https:\/\/aborrego.inscastellbisbal.net\/wp-content\/uploads\/2025\/03\/cropped-Selection_255.png","width":549,"height":328,"caption":"Ana Borrego Toledo"},"image":{"@id":"https:\/\/aborrego.inscastellbisbal.net\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/aborrego.inscastellbisbal.net\/#\/schema\/person\/596b5d3dc4735c43cfaafed47741b9d1","name":"aborrego","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/e158785622f9364a28d322a7a8711e2ea34ebb67263b57ff915d7b49cb3cf0d1?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/e158785622f9364a28d322a7a8711e2ea34ebb67263b57ff915d7b49cb3cf0d1?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e158785622f9364a28d322a7a8711e2ea34ebb67263b57ff915d7b49cb3cf0d1?s=96&d=mm&r=g","caption":"aborrego"},"sameAs":["https:\/\/aborrego.inscastellbisbal.net","https:\/\/www.instagram.com\/anaaaa.aaaaaaaaaaaaaaaaaaaaa?igsh=MWVqcmx5MXl5eGdxaw=="],"url":"https:\/\/aborrego.inscastellbisbal.net\/en\/author\/aborrego\/"}]}},"_links":{"self":[{"href":"https:\/\/aborrego.inscastellbisbal.net\/en\/wp-json\/wp\/v2\/posts\/6234","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/aborrego.inscastellbisbal.net\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/aborrego.inscastellbisbal.net\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/aborrego.inscastellbisbal.net\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/aborrego.inscastellbisbal.net\/en\/wp-json\/wp\/v2\/comments?post=6234"}],"version-history":[{"count":10,"href":"https:\/\/aborrego.inscastellbisbal.net\/en\/wp-json\/wp\/v2\/posts\/6234\/revisions"}],"predecessor-version":[{"id":6470,"href":"https:\/\/aborrego.inscastellbisbal.net\/en\/wp-json\/wp\/v2\/posts\/6234\/revisions\/6470"}],"wp:attachment":[{"href":"https:\/\/aborrego.inscastellbisbal.net\/en\/wp-json\/wp\/v2\/media?parent=6234"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/aborrego.inscastellbisbal.net\/en\/wp-json\/wp\/v2\/categories?post=6234"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/aborrego.inscastellbisbal.net\/en\/wp-json\/wp\/v2\/tags?post=6234"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}