<?xml
version="1.0" encoding="utf-8"?>
<rss version="2.0" 
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:atom="http://www.w3.org/2005/Atom"
>

<channel xml:lang="fr">
	<title>Guillaume Orsal</title>
	<link>https://www.orsal.fr/</link>
	<description>Ing&#233;nieur informatique, d&#233;veloppeur Web Freelance, cr&#233;ation site Internet, conseil en r&#233;f&#233;rencement, expert Laravel, SEO, Intelligence Artificielle</description>
	<language>fr</language>
	<generator>SPIP - www.spip.net</generator>
	<atom:link href="https://www.orsal.fr/spip.php?id_rubrique=21&amp;page=backend" rel="self" type="application/rss+xml" />




<item xml:lang="fr">
		<title>Installer et utiliser Ollama : l'intelligence artificielle locale sous Linux</title>
		<link>https://www.orsal.fr/Installer-et-utiliser-Ollama-l</link>
		<guid isPermaLink="true">https://www.orsal.fr/Installer-et-utiliser-Ollama-l</guid>
		<dc:date>2025-11-02T20:21:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Guillaume Orsal</dc:creator>



		<description>
&lt;p&gt;Dans cet article, je vous guide pas &#224; pas : installation d'Ollama sous Linux, choix et t&#233;l&#233;chargement de mod&#232;les open source comme Mistral ou Phi-3, tests de l'API REST et int&#233;gration dans Laravel pour b&#233;n&#233;ficier d'une IA locale rapide, &#233;conomique et respectueuse de vos donn&#233;es.&lt;/p&gt;


-
&lt;a href="https://www.orsal.fr/Data-Mining-IA-Decisionnel" rel="directory"&gt;Data Mining, IA, D&#233;cisionnel&lt;/a&gt;


		</description>


 <content:encoded>&lt;img class='spip_logos' alt=&quot;&quot; align=&quot;right&quot; src='https://www.orsal.fr/local/cache-vignettes/L150xH150/arton70-c33a4.png' width='150' height='150' onmouseover=&quot;this.src='local/cache-vignettes/L150xH150/artoff70-25ae0.png'&quot; onmouseout=&quot;this.src='local/cache-vignettes/L150xH150/arton70-c33a4.png'&quot; style='height:150px;width:150px;' /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Dipl&#244;m&#233; d'un &lt;a href='https://www.orsal.fr/Ingenieur-Informatique-Freelance' class='spip_in'&gt;master en Intelligence Artificielle&lt;/a&gt;, je suis aujourd'hui &lt;strong&gt;d&#233;veloppeur web fullstack&lt;/strong&gt; sp&#233;cialis&#233; en &lt;strong&gt;Laravel, Livewire, React&lt;/strong&gt;. J'int&#232;gre l'&lt;strong&gt;IA g&#233;n&#233;rative&lt;/strong&gt; dans les projets web modernes pour cr&#233;er des solutions intelligentes, sans d&#233;pendance aux API propri&#233;taires.&lt;/p&gt; &lt;p&gt;Dans cet article, je vous guide pas &#224; pas : &lt;strong&gt;installation d'Ollama sous Linux&lt;/strong&gt;, choix et t&#233;l&#233;chargement de &lt;strong&gt;mod&#232;les open source&lt;/strong&gt; comme Mistral ou Phi-3, tests de l'API REST et int&#233;gration dans &lt;strong&gt;Laravel&lt;/strong&gt; pour b&#233;n&#233;ficier d'une &lt;strong&gt;IA locale&lt;/strong&gt; rapide, &#233;conomique et respectueuse de vos donn&#233;es.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class='h3 spip'&gt;Installation d'Ollama sous Linux&lt;/h2&gt;
&lt;p&gt;L'installation d'Ollama sous Linux (Debian/Ubuntu) est tr&#232;s simple gr&#226;ce au script officiel fourni par l'&#233;quipe Ollama :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;curl -fsSL https://ollama.com/install.sh | sh&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Une fois install&#233;, la commande &lt;strong&gt;ollama&lt;/strong&gt; devient disponible et le service syst&#232;me d&#233;marre automatiquement. Par d&#233;faut, &lt;strong&gt;Ollama &#233;coute uniquement en local&lt;/strong&gt; sur 127.0.0.1:11434, ce qui garantit qu'aucune requ&#234;te externe ne peut atteindre votre instance tant que vous ne modifiez pas la config r&#233;seau.&lt;/p&gt; &lt;p&gt;Pour v&#233;rifier le statut du service :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;systemctl status ollama&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Le service doit afficher &lt;strong&gt;active (running)&lt;/strong&gt;.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;V&#233;rifier l'&#233;coute du service&lt;/h2&gt;
&lt;p&gt;V&#233;rifier que le serveur Ollama &#233;coute bien sur son port par d&#233;faut avec :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;ss -tulpen | grep 11434&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Vous devez obtenir une ligne similaire :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;tcp LISTEN 0 4096 127.0.0.1:11434 ...&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Cette configuration emp&#234;che toute exposition r&#233;seau accidentelle.&lt;/p&gt; &lt;p&gt;Si le port n'est pas visible, le service n'est probablement pas d&#233;marr&#233; ou le firewall local bloque l'acc&#232;s.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;T&#233;l&#233;charger les mod&#232;les d'IA&lt;/h2&gt;
&lt;p&gt;Voici une &lt;a href=&quot;https://skywork.ai/blog/llm/ollama-models-list-2025-100-models-compared/&quot; class='spip_out' rel='external'&gt;s&#233;lection de mod&#232;les open-source adapt&#233;s &#224; diff&#233;rents usages&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Ces mod&#232;les sont quantifi&#233;s (Q4/Q8), c'est-&#224;-dire que leur pr&#233;cision num&#233;rique interne est r&#233;duite pour occuper moins de VRAM et calculer plus vite, tout en gardant une qualit&#233; de g&#233;n&#233;ration tr&#232;s proche du mod&#232;le d'origine.&lt;/p&gt; &lt;p&gt;Ollama n'embarque aucun mod&#232;le par d&#233;faut : vous devrez donc t&#233;l&#233;charger ceux dont vous avez besoin via &lt;code class='spip_code' dir='ltr'&gt;{{ollama pull}}&lt;/code&gt;.&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;ollama pull mistral&lt;br /&gt; ollama pull phi3&lt;br /&gt; ollama pull neural-chat&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &lt;strong&gt;Mistral&lt;/strong&gt; : excellentes performances en g&#233;n&#233;ration de texte
&lt;br /&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &lt;strong&gt;Phi 3&lt;/strong&gt; : l&#233;ger et performant
&lt;br /&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &lt;strong&gt;NeuralChat&lt;/strong&gt; : ton conversationnel naturel&lt;/p&gt; &lt;p&gt;Pour lister les mod&#232;les install&#233;s :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;ollama list&lt;/code&gt;&lt;/div&gt;
&lt;h2 class='h3 spip'&gt;Premier test de g&#233;n&#233;ration&lt;/h2&gt;
&lt;p&gt;Vous pouvez interroger Ollama directement via son &lt;strong&gt;API REST locale&lt;/strong&gt;. Par exemple, pour tester la g&#233;n&#233;ration avec Mistral :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;curl http://127.0.0.1:11434/api/generate -d '{&quot;model&quot;:&quot;mistral&quot;,&quot;prompt&quot;:&quot;Dis bonjour&quot;}'&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Ollama renvoie la r&#233;ponse sous forme de tokens JSON en streaming, comme une API OpenAI.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Obtenir uniquement le texte final&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;jq&lt;/strong&gt; est indispensable si vous souhaitez parser proprement les r&#233;ponses JSON en ligne de commande ou dans vos scripts Bash.&lt;/p&gt; &lt;p&gt;L'outil s'installe avec la commande :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo apt-get install jq -y&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Puis, un nouvel appel &#224; l'API d'Ollama, cha&#238;n&#233; &#224; jq :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;curl -sN http://127.0.0.1:11434/api/generate -d '{&quot;model&quot;:&quot;mistral&quot;,&quot;prompt&quot;:&quot;Dis bonjour&quot;}' | jq -rj --unbuffered 'select(.response) | .response';echo&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Le texte s'affiche sans formatage JSON.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Une fonction Bash pour simplifier l'usage&lt;/h2&gt;
&lt;p&gt;Pour simplifier vos tests sans r&#233;&#233;crire la commande curl, voici une fonction shell utilitaire &#224; ajouter &#224; vos alias dans &lt;strong&gt;.bash_aliases&lt;/strong&gt; :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;ollama-say() {&lt;br /&gt; if [ -z &quot;$1&quot; ]; then&lt;br /&gt; echo &quot;Usage: ollama-say \&quot;prompt\&quot; [model]&quot;&lt;br /&gt; return 1&lt;br /&gt; fi&lt;br /&gt; local PROMPT=&quot;$1&quot;&lt;br /&gt; local MODEL=&quot;${2:-mistral}&quot;&lt;br /&gt; curl -sN http://127.0.0.1:11434/api/generate \&lt;br /&gt; -d &quot;{\&quot;model\&quot;:\&quot;$MODEL\&quot;,\&quot;prompt\&quot;:\&quot;$PROMPT\&quot;}&quot; \&lt;br /&gt; | jq -rj --unbuffered 'select(.response) | .response'&lt;br /&gt; echo&lt;br /&gt; }&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Recharger les alias :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;source ~/.bash_aliases&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Vous pouvez maintenant appeler Ollama comme une mini-API locale directement depuis le terminal, en pr&#233;cisant dans la ligne de commande le prompt suivi du mod&#232;le :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;ollama-say &quot;Dis bonjour!&quot; mistral&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Apr&#232;s quelques secondes, vous obtiendrez la r&#233;ponse sans formatage.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Acc&#232;s distant via tunnel SSH&lt;/h2&gt;
&lt;p&gt;Ollama n'&#233;coute par d&#233;faut que l'IP &lt;strong&gt;127.0.0.1&lt;/strong&gt; pour des raisons de s&#233;curit&#233;. &lt;strong&gt;Evitez absolument d'exposer le port 11434 directement sur Internet.&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Si le service tourne sur une autre machine, par exemple un serveur disposant de meilleures capacit&#233;s de calcul, vous pourrez cr&#233;er un tunnel SSH.&lt;/p&gt; &lt;p&gt;Remplacez &lt;i&gt;user&lt;/i&gt; par le login et &lt;i&gt;serveur&lt;/i&gt; par l'IP ou le nom du serveur.&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;ssh -L 11434:localhost:11434 user@serveur&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Le mod&#232;le devient alors accessible sur votre poste via &lt;strong&gt;http://localhost:11434&lt;/strong&gt;. Le port local 11434 &#233;tant d&#233;sormais redirig&#233; vers le m&#234;me port sur le serveur.&lt;/p&gt; &lt;p&gt;Pour lancer le tunnel SSH en arri&#232;re-plan :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;ssh -N -f -L 11434:localhost:11434 user@serveur&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Pour fermer le tunnel, il faudra s'attaquer directement au processus :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;pkill -f &quot;ssh -L 11434&quot;&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Cette approche permet un acc&#232;s distant tout en conservant le niveau de s&#233;curit&#233; d'un service local.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Int&#233;gration d'Ollama dans Laravel : cas d'usage concrets&lt;/h2&gt;
&lt;p&gt;L'API d'Ollama est compatible avec n'importe quel framework backend.&lt;/p&gt; &lt;p&gt;Ollama devient puissant lorsqu'il est int&#233;gr&#233; dans une architecture web moderne. Quelques applications concr&#232;tes :&lt;/p&gt; &lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &lt;strong&gt;G&#233;n&#233;ration de contenu&lt;/strong&gt; : Articles, descriptions produit, r&#233;sum&#233;s
&lt;br /&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &lt;strong&gt;Analyse de texte&lt;/strong&gt; : Cat&#233;gorisation de commentaires, d&#233;tection de spam
&lt;br /&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &lt;strong&gt;Suggestions intelligentes&lt;/strong&gt; : Recommandations, auto-compl&#233;tion
&lt;br /&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &lt;strong&gt;Recherche s&#233;mantique&lt;/strong&gt; : Au-del&#224; des mots-cl&#233;s, recherche contextuelle via embeddings&lt;/p&gt; &lt;p&gt;Voici comment l'utiliser facilement dans Laravel via Http ::post() :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;php&lt;br /&gt; $response = Http::post('http://localhost:11434/api/generate', [&lt;br /&gt; 'model' =&gt; 'mistral',&lt;br /&gt; 'prompt' =&gt; 'G&#233;n&#232;re une description produit concise pour : ' . $product-&gt;name,&lt;br /&gt; 'stream' =&gt; false,&lt;br /&gt; ]);&lt;br /&gt; &lt;br /&gt; $description = $response-&gt;json()['response'];&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Cela r&#233;duit drastiquement vos co&#251;ts API (OpenAI, Gemini) en gardant le contr&#244;le total de vos donn&#233;es.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Performances et optimisation GPU&lt;/h2&gt;
&lt;p&gt;Bien que Ollama fonctionne sans GPU, les performances augmentent significativement avec une carte graphique support&#233;e.&lt;/p&gt; &lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &lt;strong&gt;Sans GPU&lt;/strong&gt; : 5-30 secondes par r&#233;ponse selon le mod&#232;le
&lt;br /&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &lt;strong&gt;Avec GPU NVIDIA&lt;/strong&gt; : Acc&#233;l&#233;ration de &lt;strong&gt;5 &#224; 20x&lt;/strong&gt;, r&#233;ponses en 1-5 secondes
&lt;br /&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &lt;strong&gt;VRAM n&#233;cessaire&lt;/strong&gt; : Mistral ( 4GB), Phi 3 ( 2GB), Llama 2 ( 7GB)&lt;/p&gt; &lt;p&gt;Benchmark simple :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;time ollama-say &quot;&#201;cris un email pour remercier un client&quot;&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;En production avec une application Laravel, placer Ollama sur un serveur distinct, id&#233;alement avec GPU, afin d'&#233;viter de saturer votre serveur web.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Alternatives : Ollama vs llama.cpp vs LocalAI&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Ollama&lt;/strong&gt; : Installation simple, gestion facile des mod&#232;les, API REST standard. Meilleur pour d&#233;buter.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;llama.cpp&lt;/strong&gt; : Plus l&#233;ger, excellente performance CPU. Id&#233;al pour machines peu puissantes, mais installation plus complexe.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;LocalAI&lt;/strong&gt; : Interface web compl&#232;te, compatible avec OpenAI API. Meilleur si vous migrez depuis OpenAI.&lt;/p&gt; &lt;p&gt;Pour un d&#233;veloppeur fullstack Laravel cherchant du &lt;strong&gt;plug &amp; play&lt;/strong&gt; sans complexit&#233;, Ollama me semble le meilleur choix.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Erreurs courantes et d&#233;pannage&lt;/h2&gt;
&lt;p&gt;Ces erreurs sont les plus fr&#233;quentes lors d'un premier d&#233;ploiement d'Ollama sur un serveur Linux.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Erreur &#171; connection refused &#187;&lt;/strong&gt; : Ollama &#233;coute uniquement sur localhost par d&#233;faut. V&#233;rifier : `systemctl status ollama`. Pour l'acc&#232;s distant, utiliser obligatoirement un tunnel SSH.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Mod&#232;le qui ne r&#233;pond pas&lt;/strong&gt; : Il calcule toujours. Attendre plus longtemps la premi&#232;re fois. Pour des timeouts, augmenter : `curl &#8212;max-time 300`.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;VRAM satur&#233;e&lt;/strong&gt; : Un mod&#232;le trop gros pour votre GPU. V&#233;rifier : `nvidia-smi`. R&#233;duire la taille du prompt ou utiliser un mod&#232;le plus l&#233;ger.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Quantization confusion&lt;/strong&gt; : Ollama g&#232;re automatiquement. Q4 = rapide mais moins pr&#233;cis, Q8 = plus lent mais meilleur. Aucune action requise sauf pour tirage manuel.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Ollama permet d'ex&#233;cuter des mod&#232;les d'IA directement sur un serveur Linux, &lt;strong&gt;sans GPU obligatoire&lt;/strong&gt;, sans d&#233;pendance tierce ni co&#251;ts r&#233;currents.&lt;/p&gt; &lt;p&gt;L'installation est rapide, la configuration s&#251;re, et la flexibilit&#233; excellente pour le d&#233;veloppement, les tests et et la g&#233;n&#233;ration de contenu automatis&#233;e.&lt;/p&gt; &lt;p&gt;Une solution robuste et respectueuse des donn&#233;es, id&#233;ale pour d&#233;veloppeurs et passionn&#233;s d'IA locale.&lt;/p&gt; &lt;p&gt;Ollama s'int&#232;gre parfaitement dans un workflow moderne Laravel/Livewire/React, que ce soit pour prototyper en local, automatiser des t&#226;ches &#233;ditoriales ou alimenter une plateforme SaaS interne.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Int&#233;grer Ollama &#224; votre stack full-stack : expertise et services&lt;/h2&gt;
&lt;p&gt;Int&#233;grer Ollama dans une architecture web (Laravel, React, Livewire, Tailwind) demande une bonne compr&#233;hension du code m&#233;tier, du traitement de texte g&#233;n&#233;ratif et des flux applicatifs.&lt;/p&gt; &lt;p&gt;Si vous envisagez d'&lt;strong&gt;ajouter de l'IA g&#233;n&#233;rative locale&lt;/strong&gt; &#224; votre application, je peux vous accompagner sur :&lt;/p&gt; &lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &lt;strong&gt;Int&#233;gration Laravel / API&lt;/strong&gt; : prompts, streaming, validation, performances
&lt;br /&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &lt;strong&gt;Automatisation &amp; file de jobs&lt;/strong&gt; : t&#226;ches lourdes, ex&#233;cution asynchrone
&lt;br /&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &lt;strong&gt;Choix et gestion des mod&#232;les&lt;/strong&gt; : Mistral, Phi-3, formats d'entr&#233;e/sortie
&lt;br /&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &lt;strong&gt;D&#233;ploiement sur serveur Linux&lt;/strong&gt; : installation, configuration et supervision de base&lt;/p&gt; &lt;p&gt;Je suis &lt;strong&gt;d&#233;veloppeur web fullstack sp&#233;cialis&#233; Laravel et IA g&#233;n&#233;rative locale&lt;/strong&gt;, avec une solide pratique Linux. Mon objectif : livrer des solutions &lt;strong&gt;fonctionnelles, maintenables et utilement assist&#233;es par l'IA&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;a href='https://www.orsal.fr/Ingenieur-Informatique-Freelance' class='spip_in'&gt;Parlons de votre projet&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>SAS : Ex&#233;cution automatique d'un script</title>
		<link>https://www.orsal.fr/SAS-Execution-automatique-d-un</link>
		<guid isPermaLink="true">https://www.orsal.fr/SAS-Execution-automatique-d-un</guid>
		<dc:date>2011-01-28T16:59:51Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Guillaume Orsal</dc:creator>



		<description>
&lt;p&gt;Lorsque vous faites du d&#233;veloppement sous SAS, et que votre programme est enfin rod&#233;, vous allez vouloir faire en sorte qu'il s'ex&#233;cute automatiquement, d'un simple clic. Voici une petite solution, via un batch windows, et quelques adaptations &#224; vos scripts.&lt;/p&gt;


-
&lt;a href="https://www.orsal.fr/Data-Mining-IA-Decisionnel" rel="directory"&gt;Data Mining, IA, D&#233;cisionnel&lt;/a&gt;


		</description>


 <content:encoded>&lt;img class='spip_logos' alt=&quot;&quot; align=&quot;right&quot; src='https://www.orsal.fr/local/cache-vignettes/L71xH71/arton9-a8a27.png' width='71' height='71' onmouseover=&quot;this.src='local/cache-vignettes/L71xH71/artoff9-6919a.png'&quot; onmouseout=&quot;this.src='local/cache-vignettes/L71xH71/arton9-a8a27.png'&quot; style='height:71px;width:71px;' /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Lorsque vous faites du d&#233;veloppement sous SAS, et que votre programme est enfin rod&#233;, vous allez vouloir faire en sorte qu'il s'ex&#233;cute automatiquement, d'un simple clic. Voici une petite solution, via un batch windows, et quelques adaptations &#224; vos scripts.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class='h3 spip'&gt;Le batch&lt;/h2&gt;
&lt;p&gt;Le programme complet est en pi&#232;ce jointe. Nous allons voir &#233;tape par &#233;tape son fonctionnement. Pour le cr&#233;er, le bloc-notes de windows est suffisant et il suffit de modifier l'extension du fichier une fois enregistrer en &lt;strong&gt;.bat&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;On commence par changer de r&#233;pertoire pour se placer dans le r&#233;pertoire de travail de SAS.&lt;/p&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;echo Changement de repertoire vers SAS&lt;br /&gt; pushd &quot;C:\Document\My SAS Files\9.1&quot;&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;On lance l'&#233;x&#233;cution de SAS avec les bons param&#232;tres :&lt;/p&gt; &lt;ul class=&quot;spip&quot;&gt;&lt;li&gt; Adapter l'emplacement du programme sas.exe &#224; votre configuration en fonction de l&#224; o&#249; vous l'avez install&#233;.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;CONFIG &lt;/strong&gt; permet de sp&#233;cifier l'emplacement du fichier de configuration de votre environnement. Pour le trouver, regarder les propri&#233;t&#233;s de l'icone qui vous permet de lancer SAS habituellement, dans le champ cible, le fichier CFG doit &#234;tre indiqu&#233;.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;SYSIN &lt;/strong&gt; permet d'indiquer le nom et l'emplacement du programme SAS &#224; ex&#233;cuter.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;ICON &lt;/strong&gt; permet d'ex&#233;cuter SAS dans une fen&#234;tre r&#233;duite.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;LOG &lt;/strong&gt; permet de sp&#233;cifier le fichier de log, il recueillera ce qui apparait en temps normal dans la fen&#234;tre journal.&lt;/li&gt;&lt;/ul&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;echo Lancement de SAS&lt;br /&gt; &quot;C:\Program Files\SAS\SAS 9.1\sas.exe&quot; -CONFIG &quot;C:\Program Files\SAS\SAS 9.1\nls\fr\SASV9.CFG&quot; -sysin &quot;C:\MonEtude\MonProg.sas&quot; -icon -log &quot;C:\MonEtude\MonProg.log&quot;&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Si vous avez suivi mon article sur la d&#233;tection de la &lt;a href='https://www.orsal.fr/SAS-Detection-de-connexion-serveur' class='spip_in'&gt;bonne connexion au serveur SAS&lt;/a&gt;, vous pouvez int&#233;grer ici la d&#233;tection dans le log du r&#233;sultat du Test. Cela permet de savoir si le programme SAS a pu s'ex&#233;cuter normalement.&lt;/p&gt; &lt;p&gt;Pour cela, j'utilise grep. Pour ceux qui ne connaitrait pas, c'est un petit utilitaire qui provient du monde unix de recherche dans des fichiers. Et heureusement cela a &#233;t&#233; port&#233; sous windows, ici : &lt;a href=&quot;http://gnuwin32.sourceforge.net/&quot; class='spip_out' rel='external'&gt;gnuwin32.sourceforge.net&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Vous pourrez rafiner la d&#233;tection en fonction de vos besoins, par exemple en recherchant la pr&#233;sence de warning dans le log. Ici, je recherche donc la ligne qui porte le r&#233;sultat de mon test de connexion serveur. En fonction du r&#233;sultat, il faudra peut-&#234;tre que j'ex&#233;cute &#224; nouveau ma proc&#233;dure.&lt;/p&gt; &lt;p&gt;Le fait d'ex&#233;cuter tout le programme d'une seule traite, vous oblige, lors de la conception et de l'ordonnancement des &#233;tapes, &#224; faire un d&#233;veloppement plut&#244;t s&#233;curis&#233;, qui valide bien chaque &#233;tape, s'auto-v&#233;rifie, et pr&#233;f&#232;re ne rien faire plut&#244;t que de faire une mauvaise &#233;tape. Car bien &#233;videmment vous n'avez plus la s&#233;curit&#233; propos&#233; par l'ex&#233;cution &#233;tape par &#233;tape que vous pouvez pratiquer lorsque vous &#234;tes en mode interactif. Car rappelez-vous, en cas d'erreur, SAS a tendance &#224; continuer son traitement, m&#234;me avec des donn&#233;es incompl&#232;tes.&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;echo Recherche etat du serveur&lt;br /&gt; grep &quot;Connexion au serveur SAS&quot; &quot;C:\MonEtude\MonProg.log&quot;&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Il ne reste plus qu'&#224; terminer le batch, retour &#224; l'emplacement de d&#233;part via &lt;strong&gt;popd&lt;/strong&gt;, et une pause afin que la fen&#234;tre ne se ferme pas imm&#233;diatement &#224; la fin de l'ex&#233;cution, que l'on puisse surveiller le r&#233;sultat.&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;echo Retour au repertoire de lancement&lt;br /&gt; echo Fin du traitement : %DATE% %TIME%&lt;br /&gt; popd&lt;br /&gt; pause&lt;br /&gt; exit /B&lt;/code&gt;&lt;/div&gt;
&lt;h2 class='h3 spip'&gt;Le script&lt;/h2&gt;
&lt;p&gt;Comme je l'ai &#233;voqu&#233; un peu plus t&#244;t il y a quelques &#233;l&#233;ments &#224; apporter &#224; votre script SAS pour que tout fonctionne correctement.&lt;/p&gt; &lt;p&gt;Je passe les d&#233;tails sur l'export des r&#233;sultats : pr&#233;voyez des d&#233;poses sur serveur ou des envois par mail.&lt;/p&gt; &lt;p&gt;Par contre une premi&#232;re &#233;tape importante, lorsque vous ouvrez une session normale c'est l'identification aupr&#232;s du serveur SAS, dans le cas ou vous n'avez pas une installation mono-poste. Il faudra adapter votre &lt;strong&gt;autoexec.sas&lt;/strong&gt; pour qu'il vous identifie automatiquement. Plus pr&#233;cis&#233;ment d'ailleurs, cela se passe dans le script d'ouverture de session.&lt;/p&gt; &lt;p&gt;Derni&#232;re petite recommandation : n'oubliez pas d'inclure un &lt;strong&gt;&#171; signoff ;signoff; &#187;&lt;/strong&gt; &#224; la fin de votre programme SAS s'il utilise une connexion serveur. Sinon le programme ne terminera pas, ou ne le fera pas &#171; proprement &#187;. De plus, je vous conseille de doubler la commande, cela fonctionne mieux, mais ne me demander pas pourquoi.&lt;/p&gt; &lt;p&gt;Voil&#224;. En adaptant les emplacements, et en pla&#231;ant ce fichier dans le r&#233;pertoire de votre programme SAS cela devrait fonctionner sans probl&#232;me.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		
		<enclosure url="https://www.orsal.fr/IMG/zip/lanceur.bat.zip" length="387" type="application/zip" />
		

	</item>
<item xml:lang="fr">
		<title>SAS : D&#233;tection de connexion serveur</title>
		<link>https://www.orsal.fr/SAS-Detection-de-connexion-serveur</link>
		<guid isPermaLink="true">https://www.orsal.fr/SAS-Detection-de-connexion-serveur</guid>
		<dc:date>2010-01-04T17:16:34Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Guillaume Orsal</dc:creator>



		<description>
&lt;p&gt;Pour des raisons professionnelles, j'utilise r&#233;guli&#232;rement l'outil de statistiques SAS, en mode client-serveur. Mais trop souvent la connexion au serveur, automatis&#233;e &#224; l'ouverture de l'application ne fonctionne pas. Je souhaitais donc avoir un moyen de d&#233;terminer automatiquement si la connexion &#233;tait &#233;tablie, pour s&#233;curiser la suite des traitements.&lt;/p&gt;


-
&lt;a href="https://www.orsal.fr/Data-Mining-IA-Decisionnel" rel="directory"&gt;Data Mining, IA, D&#233;cisionnel&lt;/a&gt;


		</description>


 <content:encoded>&lt;img class='spip_logos' alt=&quot;&quot; align=&quot;right&quot; src='https://www.orsal.fr/local/cache-vignettes/L71xH71/arton8-0f3c6.png' width='71' height='71' onmouseover=&quot;this.src='local/cache-vignettes/L71xH71/artoff8-3ff53.png'&quot; onmouseout=&quot;this.src='local/cache-vignettes/L71xH71/arton8-0f3c6.png'&quot; style='height:71px;width:71px;' /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Pour des raisons professionnelles, j'utilise r&#233;guli&#232;rement l'&lt;strong&gt;outil de statistiques SAS&lt;/strong&gt;, en mode client-serveur. Mais trop souvent la connexion au serveur, automatis&#233;e &#224; l'ouverture de l'application ne fonctionne pas. Je souhaitais donc avoir un moyen de &lt;strong&gt;d&#233;terminer automatiquement si la connexion &#233;tait &#233;tablie&lt;/strong&gt;, pour s&#233;curiser la suite des traitements.&lt;/p&gt; &lt;p&gt;Je m'en suis ouvert au sp&#233;cialiste SAS de la soci&#233;t&#233; qui m'a dit que ce n'&#233;tait pas possible de d&#233;tecter la connexion, m&#234;me avec le &lt;strong&gt;langage macro&lt;/strong&gt;. Je ne me suis pas laiss&#233; abattre, et j'ai cherch&#233; une solution. Apr&#232;s quelques recherches dans l'aide mal con&#231;ue de l'application, j'ai enfin trouv&#233;.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;J'ai eu l'id&#233;e toute simple que &lt;strong&gt;tester la connexion au serveur, revenait &#224; v&#233;rifier l'existence de tables des librairies distantes&lt;/strong&gt; (une base de donn&#233;e SAS). Il n'y avait qu'&#224; trouver la &lt;strong&gt;macro fonction %exists&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;En toute fin de mon autoexec.sas (le programme ex&#233;cut&#233; &#224; l'ouverture d'une session SAS), donc apr&#232;s que les associations aux librairies aient &#233;t&#233; effectu&#233;es, j'ai ajout&#233; le bout de code suivant.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Test global&lt;/h2&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;%macro Test_Connexion_Serveur();&lt;br /&gt; &lt;br /&gt; /* D&#233;claration de la variable r&#233;sultat comme globale */&lt;br /&gt; /* pour faciliter sa r&#233;utilisation ult&#233;rieure */&lt;br /&gt; %global Connexion_Serveur ;&lt;br /&gt; &lt;br /&gt; /* Initialisation de la variable r&#233;sultat */&lt;br /&gt; %let Connexion_Serveur = OK ;&lt;br /&gt; &lt;br /&gt; /* Test de la non existence d'une table de ma 1&#232;re librairie */&lt;br /&gt; %if not( %sysfunc( exist( Librairie1.MaTable ) ) )&lt;br /&gt; %then %let Connexion_Serveur = KO ;&lt;br /&gt; &lt;br /&gt; /* Test de la non existence d'une table de ma 2&#232;me librairie */&lt;br /&gt; %if not( %sysfunc( exist( Librairie2.UneAutreTable ) ) )&lt;br /&gt; %then %let Connexion_Serveur = KO ;&lt;br /&gt; &lt;br /&gt; /* Affichage du r&#233;sultat du test */&lt;br /&gt; %put Connexion au serveur SAS : &amp;Connexion_Serveur ;&lt;br /&gt; &lt;br /&gt; %mend Test_Connexion_Serveur;&lt;br /&gt; &lt;br /&gt; /* Appel de ma fonction */&lt;br /&gt; %Test_Connexion_Serveur;&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;J'ai affect&#233; le r&#233;sultat &#224; une variable globale afin de pouvoir l'utiliser dans un script si n&#233;cessaire.&lt;/p&gt; &lt;p&gt;Dans mon cas, seul m'int&#233;ressait d'afficher le r&#233;sultat global dans la fen&#234;tre journal. Mais on pourrait sans probl&#232;me ajouter une fonction pour avoir un r&#233;sultat plus d&#233;taill&#233;, qui indiquerait quelles sont les librairies en erreur. Ce qui donnerait quelque chose comme suit.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Test d&#233;taill&#233;&lt;/h2&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;%macro Test_Connexion_Serveur();&lt;br /&gt; &lt;br /&gt; %global Connexion_Serveur ;&lt;br /&gt; %let Connexion_Serveur = OK ;&lt;br /&gt; &lt;br /&gt; /* Test de la non existence d'une table de ma premi&#232;re librairie */&lt;br /&gt; %if not( %sysfunc( exist( Librairie1.MaTable ) ) ) %then %do ;&lt;br /&gt; &lt;br /&gt; /* Si non trouv&#233;e, alors modification de la variable r&#233;sultat */&lt;br /&gt; %let Connexion_Serveur = KO ;&lt;br /&gt; &lt;br /&gt; /* Affichage de la librairie en anomalie */&lt;br /&gt; %put Pb acc&#232;s librairie : Librairie 1;&lt;br /&gt; &lt;br /&gt; %end ;&lt;br /&gt; &lt;br /&gt; /* Test de la non existence d'une table de ma seconde librairie */&lt;br /&gt; %if not( %sysfunc( exist( Librairie2.UneAutreTable ) ) ) %then %do ;&lt;br /&gt; %let Connexion_Serveur = KO ;&lt;br /&gt; %put Pb acc&#232;s librairie : Librairie 2;&lt;br /&gt; %end ;&lt;br /&gt; &lt;br /&gt; %put Connexion au serveur SAS : &amp;Connexion_Serveur ;&lt;br /&gt; &lt;br /&gt; %mend Test_Connexion_Serveur;&lt;br /&gt; &lt;br /&gt; %Test_Connexion_Serveur;&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Enfin, on pourrait imaginer que ce soit le script SAS qui va s'ex&#233;cuter ensuite qui fasse tout seul appel &#224; la fonction, pour ne tester que les librairies dont il a besoin. Dans mon cas, j'utilise trop souvent les m&#234;mes librairies pour que cela pr&#233;sente un int&#233;r&#234;t, mais cela pourrait servir &#224; quelqu'un. Cela donnerait quelque chose comme cela.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Test &#224; la demande&lt;/h2&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;/* D&#233;claration de la variable r&#233;sultat comme */&lt;br /&gt; /* globale pour faciliter sa r&#233;utilisation ult&#233;rieure */&lt;br /&gt; %global Connexion_Serveur ;&lt;br /&gt; &lt;br /&gt; /* Initialisation de la variable r&#233;sultat */&lt;br /&gt; %let Connexion_Serveur = OK ;&lt;br /&gt; &lt;br /&gt; %macro Test_Connexion_Serveur( LibrairireATester );&lt;br /&gt; /* En fonction de la librairie &#224; tester */&lt;br /&gt; %if ( &amp;LibrairieATester=Librairie1 ) %then %do ;&lt;br /&gt; %if not( %sysfunc( exist( Librairie1.MaTable ) ) ) %then %do ;&lt;br /&gt; %let Connexion_Serveur = KO ;&lt;br /&gt; %put Pb acc&#232;s librairie : &amp;LibrairieATester;&lt;br /&gt; %end ; %else %do ;&lt;br /&gt; %put Connexion &#224; la librairie &amp;LibrairieATester : OK; &lt;br /&gt; %end ;&lt;br /&gt; %end ;&lt;br /&gt; &lt;br /&gt; %if ( &amp;LibrairieATester=Librairie2 ) %then %do ;&lt;br /&gt; %if not( %sysfunc( exist( Librairie2.MaTable ) ) ) %then %do ;&lt;br /&gt; %let Connexion_Serveur = KO ;&lt;br /&gt; %put Pb acc&#232;s librairie : &amp;LibrairieATester;&lt;br /&gt; %end ; %else %do ;&lt;br /&gt; %put Connexion &#224; la librairie &amp;LibrairieATester : OK; &lt;br /&gt; %end ;&lt;br /&gt; %end ;&lt;br /&gt; &lt;br /&gt; /* Si aucun param&#232;tre on affiche un peu d'aide */&lt;br /&gt; %if ( %length(&amp;LibrairieATester) = 0 ) %then %do;&lt;br /&gt; %put Liste des param&#232;tres : Librairie1, Librairie2 ;&lt;br /&gt; %end;&lt;br /&gt; &lt;br /&gt; %mend Test_Connexion_Serveur;&lt;br /&gt; &lt;br /&gt; /* Appel de ma fonction */&lt;br /&gt; %Test_Connexion_Serveur() ;&lt;br /&gt; %Test_Connexion_Serveur( Librairie1 ) ;&lt;br /&gt; %Test_Connexion_Serveur( Librairie2 ) ;&lt;br /&gt; %Put Connexion au serveur : &amp;Connexion_Serveur;&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Le dernier exemple est parfaitement simplifiable, car la structure de test se r&#233;p&#232;te autant de fois qu'on a de librairies. Vous ferez &#233;galement attention dans le chemin des librairies &#224; utiliser. En effet, ces macros doivent s'ex&#233;cuter en local puisque c'est pour tester la connexion serveur et donc on n'est pas sur d'&#234;tre connect&#233;. Par contre, il faut &lt;strong&gt;utiliser le chemin d'acc&#232;s local aux librairies distantes&lt;/strong&gt;, sinon la macro ne trouvera jamais rien. Dans l'exemple ci-dessous, cela correspond au Lib1_dst, le nom de la librairie d&#233;fini en local.&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;RSubmit ;&lt;br /&gt; LibName Lib1 &quot;/Monchemin/SurMaLibrairie&quot;;&lt;br /&gt; EndRSbumit ;&lt;br /&gt; LibName Lib1_Dst SLibRef=Lib1 Server=MonServeur;&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Evidemment tout ceci ne fonctionne qu'avec des tables dont on est s&#251;r de l'existence.&lt;/p&gt; &lt;p&gt;Voil&#224;. Je vous explique bient&#244;t, comme j'ai ensuite r&#233;ussi &#224; &lt;a href='https://www.orsal.fr/SAS-Execution-automatique-d-un' class='spip_in'&gt;automatiser l'ex&#233;cution des scripts&lt;/a&gt;, tout en s&#233;curisant mon traitement, puisque je peux d&#233;sormais m'assurer que les acc&#232;s fonctionnent, ce qui limite fortement le risque d'anomalie en sortie.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>



</channel>

</rss>
