Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2023-08-01T02:11:39+02:00Les derniers messages parus sur le forum de Zeste de Savoir.Problème d'installation Webpack Encore dans Symfony en mode production, message #2515812023-08-01T02:11:39+02:0021t0r01/@21t0r01https://zestedesavoir.com/forums/sujet/17075/probleme-dinstallation-webpack-encore-dans-symfony-en-mode-production/?page=1#p251581<p>echo $NODE_ENV ne renvoie rien.</p>
<p>Problème résolu, mon site fonctionne (sauf les pages d’erreur perso, j’avais déjà le problème avant).</p>
<p>De fil en aiguille je suis tombé <a href="https://symfony.com/doc/current/frontend/encore/faq.html#how-do-i-deploy-my-encore-assets">là</a>, il est dit qu’on peut juste exécuter en local <code>./node_modules/.bin/encore production</code> pour construire le dossier build, puis le transférer vers le serveur de prod, et même qu’il est préférable de faire comme ça.
Ainsi, pas besoin d’installer Encore sur la prod, pas besoin de NodeJs, même pas besoin du dossier "assets", on transfère les fichiers (sauf dépendances vendor/var/node_module/assets) et puis un petit composer install, et ça roule comme ça <img src="/static/smileys/svg/popcorn.svg" alt=":popcorn:" class="smiley">
La méthode de déploiement que j’utilisais jusque là venait de la doc de l’hébergeur, elle disait simplement de créer le build à partir des fichiers envoyés en prod. </p>
<p>Merci pour ton aide Viki53 ! Je crois que je vais récrire bientôt à propos du mystère des pages d’erreur … A bintôt <img src="/static/smileys/svg/rire.svg" alt=":lol:" class="smiley"> </p>Problème d'installation Webpack Encore dans Symfony en mode production, message #2515762023-07-31T21:48:54+02:00viki53/@viki53https://zestedesavoir.com/forums/sujet/17075/probleme-dinstallation-webpack-encore-dans-symfony-en-mode-production/?page=1#p251576<p>Ce sont donc bien uniquement les dépendances de prod qui sont installées.</p>
<p>Tu n’aurais pas une variable d’environnement sur ton serveur qui forcerait l’installation des dépendances de prod uniquement ?</p>
<p>Si tu exécutes <code>echo $NODE_ENV</code> sur le serveur ça donne quoi ?</p>Problème d'installation Webpack Encore dans Symfony en mode production, message #2515742023-07-31T19:53:58+02:0021t0r01/@21t0r01https://zestedesavoir.com/forums/sujet/17075/probleme-dinstallation-webpack-encore-dans-symfony-en-mode-production/?page=1#p251574<p>oui, une belle différence : </p>
<ul>
<li>en dev : <code> @babel/core@7.20.7 ├── @babel/preset-env@7.20.2 ├── @hotwired/stimulus@3.2.1 ├── @swup/debug-plugin@1.0.3 ├── @swup/fade-theme@1.0.5 ├── @swup/forms-plugin@1.2.1 ├── @swup/js-plugin@1.0.5 ├── @swup/slide-theme@1.0.5 ├── @symfony/stimulus-bridge@3.2.1 ├── @symfony/ux-swup@1.1.0 -> .\vendor\symfony\ux-swup\assets ├── @symfony/webpack-encore@4.4.0 ├── core-js@3.27.1 ├── file-loader@6.0.0 ├── jquery@3.6.3 ├── regenerator-runtime@0.13.11 ├── sass-loader@13.0.0 ├── sass@1.57.1 ├── swup@2.0.19 ├── webpack-cli@4.10.0 ├── webpack-notifier@1.15.0 └── webpack@5.75.0</code></li>
</ul>
<p>en prod : <code>@swup/js-plugin@1.0.5</code></p>
<p>el famoso GPT m’apprend que la commande liste les paquets installés et non pas leurs dépendances, mais je ne sais pas trop quoi faire de cette info <img src="/static/smileys/svg/triste.svg" alt=":(" class="smiley"></p>Problème d'installation Webpack Encore dans Symfony en mode production, message #2515652023-07-31T13:39:11+02:00viki53/@viki53https://zestedesavoir.com/forums/sujet/17075/probleme-dinstallation-webpack-encore-dans-symfony-en-mode-production/?page=1#p251565<p><code>npm ci</code> va installer exactement les dépendances listées dans <code>package-lock.json</code>, sans chercher d’upgrade potentielles (par exemple si tu as des versions du type <code>^2.3.0</code> qui permet d’upgrade si possible). Ça permet de maîtriser les versions installées/utilisées dans les processus automatiques.</p>
<p>Si tu compares <code>npm ls --depth=0</code> entre ton local et la prod, tu as une différence ?</p>
<hr>
<p>Pense à utiliser la syntaxe MarkDown pour formater tes messages et les rendre plus lisibles, notamment pour le code et les logs. <img src="/static/smileys/svg/clin.svg" alt=";)" class="smiley"> </p>Problème d'installation Webpack Encore dans Symfony en mode production, message #2515612023-07-31T12:32:34+02:0021t0r01/@21t0r01https://zestedesavoir.com/forums/sujet/17075/probleme-dinstallation-webpack-encore-dans-symfony-en-mode-production/?page=1#p251561<p>Non, pas d’erreur lors de npm install . J’ai remplacé par npm ci, pas d’erreur non plus mais ça n’a rien changé au problème.</p>
<p>Voici les indications que j’ai quand j’execute des commandes :
composer install :
Package sensio/framework-extra-bundle is abandoned, you should avoid using it. Use Symfony instead.</p>
<p>webpack : Updating dependencies
Lock file operations: 0 installs, 1 update, 0 removals</p>
<ul>
<li>Upgrading symfony/webpack-encore-bundle (v1.17.1 => v2.0.1)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 0 installs, 1 update, 0 removals</li>
<li>Upgrading symfony/webpack-encore-bundle (v1.17.1 => v2.0.1): Extracting archive</li>
</ul>
<p>et c’est tout.</p>
<p>Tout ce qui apparait dans le node_modules en dev (les @ + les autres) est bien listé en devDependencies. Les @ qui apparaissent dans le node_modules en prod sont donc également devDependencies.</p>
<p>En dependencies j’ai seulement : <a href="/@swup" rel="nofollow" class="ping ping-link">@<span class="ping-username">swup</span></a>/js-plugin</p>Problème d'installation Webpack Encore dans Symfony en mode production, message #2515492023-07-31T09:24:20+02:00viki53/@viki53https://zestedesavoir.com/forums/sujet/17075/probleme-dinstallation-webpack-encore-dans-symfony-en-mode-production/?page=1#p251549<p>Salut,</p>
<p>Les dépendances listées dans <code>package.json</code> (notamment celles manquantes sur le serveur de prod) sont-elles en <code>devDependencies</code> ou <code>dependencies</code> tout court ?</p>
<p>Tu n’as aucune erreur lors du <code>npm install</code> ?</p>
<hr>
<p>Note en passant : Généralement on préfère utiliser <code>npm ci</code> en production pour ne pas installer les dépendances de dev (ou on fait le build en amont, pour ne déployer que les fichiers réellement à servir aux clients).</p>Problème d'installation Webpack Encore dans Symfony en mode production, message #2515422023-07-30T22:30:13+02:0021t0r01/@21t0r01https://zestedesavoir.com/forums/sujet/17075/probleme-dinstallation-webpack-encore-dans-symfony-en-mode-production/?page=1#p251542<p>Bonjour à tous,</p>
<p>J’ai un problème avec l’installation de webpack Encore dans mon projet, en production seulement.</p>
<p>C’est un projet Symfony qui présente des mix de musique. Il y a une page par genre, et sur chaque page les mix sont appelés dynamiquement, on clic sur la vignette dans un carousel et il s’affiche la pochette du mix et un lecteur audio personnalisé.
Les transitions entre les pages et entre les mix sont gérés par Swup de la suite UX. Ce projet inclut donc Webpack Encore. Il a été initialement conçu en PHP 7.4.26. Une fois déployé, les scripts Encore ne fonctionnaient pas (dev server, dev, watch, build), en revanche le site fonctionnait normalement.</p>
<p>Pour résoudre ce problème de scripts qui semblait lié à Encore, j’ai passé le projet de PHP 7.4.26 à PHP 8.1.0 de manière à utiliser la dernière version de Encore. A présent tout fonctionne bien en développement, mais plus en production. Ma procèdure de déploiement n’a pas changé : </p>
<p>1/ Préparation du code en local : ./node_modules/.bin/encore production
2/ Création de l’environnement virtuel NodeJs dans le serveur de prod (CPanel)
3/ Transfert des fichiers du projet vers le serveur (sauf les .env, le vendor, le var et le node_modules)
4/ Dans l’appli, à la racine, en SSH : composer install pour les dépendances PHP, composer require symfony/webpack-encore-bundle pour le webpack
5/ Toujours dans l’appli mais dans l’environnement virtuel NodeJs (pour accès aux controles NPM) : npm install
6/ Puis npm run build . Là j’ai la même erreur qu’avant. </p>
<p>La différence avec avant (en 7.4.26) c’est que maintenant le site ne fonctionne plus. Au moment d’aborder les pages gérées par Swup, j’ai une vilaine erreur 500 : Unknown "stimulus_controller" function. </p>
<p>Je fais bien l’installation du webpack à la racine de mon projet, là ou se trouve le package.json.
Le voici :
`text/x-generic package.json ( ASCII text, with CRLF line terminators )</p>
<p>{
"devDependencies": {
"<a href="/@babel" rel="nofollow" class="ping ping-link">@<span class="ping-username">babel</span></a>/core": "<sup>7.17.0",
"<a href="/@babel" rel="nofollow" class="ping ping-link">@<span class="ping-username">babel</span></a>/preset-env": "</sup>7.16.0",
"<a href="/@hotwired" rel="nofollow" class="ping ping-link">@<span class="ping-username">hotwired</span></a>/stimulus": "<sup>3.0.0",
"<a href="/@swup" rel="nofollow" class="ping ping-link">@<span class="ping-username">swup</span></a>/debug-plugin": "</sup>1.0",
"<a href="/@swup" rel="nofollow" class="ping ping-link">@<span class="ping-username">swup</span></a>/fade-theme": "<sup>1.0",
"<a href="/@swup" rel="nofollow" class="ping ping-link">@<span class="ping-username">swup</span></a>/forms-plugin": "</sup>1.0",
"<a href="/@swup" rel="nofollow" class="ping ping-link">@<span class="ping-username">swup</span></a>/slide-theme": "<sup>1.0",
"<a href="/@symfony" rel="nofollow" class="ping ping-link">@<span class="ping-username">symfony</span></a>/stimulus-bridge": "</sup>3.2.0",
"<a href="/@symfony" rel="nofollow" class="ping ping-link">@<span class="ping-username">symfony</span></a>/ux-swup": "file:vendor/symfony/ux-swup/assets",
"<a href="/@symfony" rel="nofollow" class="ping ping-link">@<span class="ping-username">symfony</span></a>/webpack-encore": "<sup>4.0.0",
"core-js": "</sup>3.23.0",
"file-loader": "<sup>6.0.0",
"jquery": "</sup>3.6.3",
"regenerator-runtime": "<sup>0.13.9",
"sass": "</sup>1.57.1",
"sass-loader": "<sup>13.0.0",
"swup": "</sup>2.0",
"webpack": "<sup>5.74.0",
"webpack-cli": "</sup>4.10.0",
"webpack-notifier": "<sup>1.15.0"
},
"license": "UNLICENSED",
"private": true,
"scripts": {
"dev-server": "encore dev-server",
"dev": "encore dev",
"watch": "encore dev —watch",
"build": "encore production —progress"
},
"dependencies": {
"<a href="/@swup" rel="nofollow" class="ping ping-link">@<span class="ping-username">swup</span></a>/js-plugin": "</sup>1.0.5"
}
}`</p>
<p>le webpack semble bien installé, j’ai bien le webpack.config.js, il semble configuré normalement. </p>
<p>La différence entre ma version en dev et ma version en prod, est que dans le "node_modules", j’ai :</p>
<ul>
<li>en dev une longue série de fichiers incluant .bin, .cache, <a href="/@babel" rel="nofollow" class="ping ping-link">@<span class="ping-username">babel</span></a>, <a href="/@hotwire" rel="nofollow" class="ping ping-link">@<span class="ping-username">hotwire</span></a> et plein d’autres;</li>
<li>en prod, j’ai uniquement les dossiers commencant par @, ainsi que "path-to-regxp" et "package-lock.json".</li>
</ul>
<p>Pas de .bin, donc la commande ./node_modules/.bin/encore production ne fonctionne pas, ni aucun script Encore.</p>
<p>Précédemment, l’échec de compilation finale des assets (npm run build) ne gênait pas le fonctionnement du site, mais maintenant ca ne fonctionne plus.</p>
<p>Je ne comprends pas pourquoi ; à l’exécution des commandes composer et npm je n’ai pas de message d’erreur à part une dépréciation ; j’installe Encore au bon endroit (racine du site, ou se trouve le pakcage.json).
Mais le node_modules ne reçoit pas les éléments nécessaires au fonctionnement.</p>
<p>Je ne peux pas compiler et le site ne fonctionne plus.</p>
<p>J’ai tenté plusieurs choses : MAj de NPM et Node dans le serveur, nettoyage des cache, dépoloiement en mode dev sur le serveur de prod, rien n’y fait.</p>
<p>Pourquoi la version dev est elle nickel alors que dans la version prod les elements necessaires à Encore ne s’installent pas dans le node_modules, alors qu’il est bien visible dans le package.json ? </p>
<p>Merci pour votre attention </p> Conversion d'un flux audio twilio mu-law 8Hz pour une lecture en temps réel avec Discord.js, message #2502652023-05-01T23:44:43+02:00axiocontactezmoi/@axiocontactezmoihttps://zestedesavoir.com/forums/sujet/16942/conversion-dun-flux-audio-twilio-mu-law-8hz-pour-une-lecture-en-temps-reel-avec-discordjs/?page=1#p250265<p>Merci de ta réponse,</p>
<p>Je comprends l’idée, mais je suis bien incapable de la mettre en oeuvre en code, je ne sais pas comment m’y prendre.</p> Conversion d'un flux audio twilio mu-law 8Hz pour une lecture en temps réel avec Discord.js, message #2502622023-05-01T22:31:16+02:00ache/@achehttps://zestedesavoir.com/forums/sujet/16942/conversion-dun-flux-audio-twilio-mu-law-8hz-pour-une-lecture-en-temps-reel-avec-discordjs/?page=1#p250262<p>Au sujet de l’erreur:
<code>Error: Cannot create a Buffer larger than 0x100000000 bytes</code></p>
<p>La réponse a été donnée.</p>
<blockquote>
<p>You need to make sure that the length of the argument to encoder.encode() is a multiple of 2.5ms.</p>
</blockquote>
<p>L’équation est mal passé au markdown mais <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>16</mn><mo>∗</mo><mn>2</mn><mo>∗</mo><mn>2.5</mn><mo>=</mo><mn>80</mn></mrow><annotation encoding="application/x-tex">16*2*2.5 = 80</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">6</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">2</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">2</span><span class="mord">.</span><span class="mord">5</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">8</span><span class="mord">0</span></span></span></span></span>, je te laisse calculer avec ton cas.</p>
<p>Sinon, il n’est pas ce que tu souhaites faire. Tu parles d’encoder en PCM mais c’est déjà ce que te fourni Twilo (même si encodé par la loi µ).</p> Conversion d'un flux audio twilio mu-law 8Hz pour une lecture en temps réel avec Discord.js, message #2502522023-05-01T02:50:34+02:00axiocontactezmoi/@axiocontactezmoihttps://zestedesavoir.com/forums/sujet/16942/conversion-dun-flux-audio-twilio-mu-law-8hz-pour-une-lecture-en-temps-reel-avec-discordjs/?page=1#p250252<p>Pouvez-vous m’aider à convertir le format audio Twilio mu-law 8Hz en un format lisible en temps réel dans Discord.js? J’essaie de créer un bot Discord qui peut diffuser l’audio reçu d’un appel Twilio, mais j’ai des problèmes avec la conversion de format. Avez-vous des suggestions sur la façon dont je peux y parvenir?</p>
<p>Je sais qu’ici il y a des cracks.</p>
<p>Voilà ce que j’ai essayé. Je reçois un payload mulaw, 8khz, 1 canal encodé en base64, que je décode, puis tente de convertir en PCM pour qu’il soit lu par discord.js, mais ça ne marche pas. J’ai également essayé de le convertir en opus avec la librairie <a href="/@discord" rel="nofollow" class="ping ping-link">@<span class="ping-username">discord</span></a>.js/opus, mais la conversion de marche pas je tombe sur message d’erreur (Error: Cannot create a Buffer larger than 0x100000000 bytes, cf <a href="https://github.com/discordjs/opus/issues/51">https://github.com/discordjs/opus/issues/51</a>).</p>
<div class="hljs-code-div hljs-code-js"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span><span data-count="8"></span><span data-count="9"></span><span data-count="10"></span><span data-count="11"></span><span data-count="12"></span><span data-count="13"></span><span data-count="14"></span><span data-count="15"></span><span data-count="16"></span><span data-count="17"></span><span data-count="18"></span><span data-count="19"></span><span data-count="20"></span><span data-count="21"></span><span data-count="22"></span></div><pre><code class="hljs language-js"><span class="hljs-built_in">console</span>.log(<span class="hljs-string">"Receiving audio..."</span>);
<span class="hljs-comment">// ici, je voudrais essayer de convertir le payload dans un format qui puisse être lu par discord.js</span>
<span class="hljs-comment">// J'essaye de le convertir en PCM, mais sans succès.</span>
<span class="hljs-keyword">const</span> payload = msg.media.payload;
<span class="hljs-keyword">const</span> wav = <span class="hljs-keyword">new</span> WaveFile();
wav.fromScratch(<span class="hljs-number">1</span>, <span class="hljs-number">8000</span>, <span class="hljs-string">"8m"</span>, Buffer.from(payload, <span class="hljs-string">"base64"</span>));
wav.fromMuLaw();
<span class="hljs-comment">// You can resample.</span>
wav.toSampleRate(<span class="hljs-number">16000</span>);
<span class="hljs-comment">// You can write this straight to a file (will have the headers)</span>
<span class="hljs-keyword">const</span> results = wav.toBuffer();
<span class="hljs-comment">// Or you can access the samples without the WAV header</span>
<span class="hljs-keyword">const</span> samples = wav.data.samples;
fs.writeFileSync(<span class="hljs-string">'./stream.wav'</span>, results);
<span class="hljs-keyword">try</span> {
<span class="hljs-keyword">const</span> resource = createAudioResource(<span class="hljs-string">'./stream.wav'</span>);
player.play(resource);
} <span class="hljs-keyword">catch</span> (ex) {
<span class="hljs-built_in">console</span>.log(ex);
}
</code></pre></div>
<p><strong>Code complet:</strong></p>
<details class="custom-block custom-block-spoiler"><div class="custom-block-body"><div class="hljs-code-div hljs-code-js"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span><span data-count="8"></span><span data-count="9"></span><span data-count="10"></span><span data-count="11"></span><span data-count="12"></span><span data-count="13"></span><span data-count="14"></span><span data-count="15"></span><span data-count="16"></span><span data-count="17"></span><span data-count="18"></span><span data-count="19"></span><span data-count="20"></span><span data-count="21"></span><span data-count="22"></span><span data-count="23"></span><span data-count="24"></span><span data-count="25"></span><span data-count="26"></span><span data-count="27"></span><span data-count="28"></span><span data-count="29"></span><span data-count="30"></span><span data-count="31"></span><span data-count="32"></span><span data-count="33"></span><span data-count="34"></span><span data-count="35"></span><span data-count="36"></span><span data-count="37"></span><span data-count="38"></span><span data-count="39"></span><span data-count="40"></span><span data-count="41"></span><span data-count="42"></span><span data-count="43"></span><span data-count="44"></span><span data-count="45"></span><span data-count="46"></span><span data-count="47"></span><span data-count="48"></span><span data-count="49"></span><span data-count="50"></span><span data-count="51"></span><span data-count="52"></span><span data-count="53"></span><span data-count="54"></span><span data-count="55"></span><span data-count="56"></span><span data-count="57"></span><span data-count="58"></span><span data-count="59"></span><span data-count="60"></span><span data-count="61"></span><span data-count="62"></span><span data-count="63"></span><span data-count="64"></span><span data-count="65"></span><span data-count="66"></span><span data-count="67"></span><span data-count="68"></span><span data-count="69"></span><span data-count="70"></span><span data-count="71"></span><span data-count="72"></span><span data-count="73"></span><span data-count="74"></span><span data-count="75"></span><span data-count="76"></span><span data-count="77"></span><span data-count="78"></span><span data-count="79"></span><span data-count="80"></span><span data-count="81"></span><span data-count="82"></span><span data-count="83"></span><span data-count="84"></span><span data-count="85"></span><span data-count="86"></span><span data-count="87"></span><span data-count="88"></span><span data-count="89"></span><span data-count="90"></span><span data-count="91"></span><span data-count="92"></span><span data-count="93"></span><span data-count="94"></span><span data-count="95"></span><span data-count="96"></span><span data-count="97"></span><span data-count="98"></span><span data-count="99"></span><span data-count="100"></span><span data-count="101"></span><span data-count="102"></span><span data-count="103"></span><span data-count="104"></span><span data-count="105"></span><span data-count="106"></span><span data-count="107"></span><span data-count="108"></span><span data-count="109"></span><span data-count="110"></span><span data-count="111"></span><span data-count="112"></span><span data-count="113"></span><span data-count="114"></span><span data-count="115"></span><span data-count="116"></span><span data-count="117"></span><span data-count="118"></span><span data-count="119"></span><span data-count="120"></span><span data-count="121"></span><span data-count="122"></span><span data-count="123"></span><span data-count="124"></span></div><pre><code class="hljs language-js"><span class="hljs-keyword">const</span> { WebSocketServer } = <span class="hljs-built_in">require</span>(<span class="hljs-string">"ws"</span>);
<span class="hljs-keyword">const</span> base64 = <span class="hljs-built_in">require</span>(<span class="hljs-string">"base64-js"</span>);
<span class="hljs-keyword">const</span> Discord = <span class="hljs-built_in">require</span>(<span class="hljs-string">"discord.js"</span>);
<span class="hljs-keyword">const</span> client = <span class="hljs-keyword">new</span> Discord.Client();
<span class="hljs-keyword">const</span> { VoiceConnectionStatus, Events } = <span class="hljs-built_in">require</span>(<span class="hljs-string">"@discordjs/voice"</span>);
<span class="hljs-keyword">const</span> {
getVoiceConnection,
createAudioResource,
createAudioPlayer,
NoSubscriberBehavior,
joinVoiceChannel,
StreamType,
createDefaultAudioReceiveStreamOptions,
} = <span class="hljs-built_in">require</span>(<span class="hljs-string">"@discordjs/voice"</span>);
<span class="hljs-keyword">const</span> RADIO_VOICE_CHANNEL = <span class="hljs-string">"1000397725231235205"</span>;
<span class="hljs-keyword">const</span> RADIO_TEXT_CHANNEL = <span class="hljs-string">"1000397055442817096"</span>;
<span class="hljs-keyword">const</span> { createReadStream } = <span class="hljs-built_in">require</span>(<span class="hljs-string">"node:fs"</span>);
<span class="hljs-keyword">const</span> { Readable } = <span class="hljs-built_in">require</span>(<span class="hljs-string">"stream"</span>);
<span class="hljs-keyword">const</span> WaveFile = <span class="hljs-built_in">require</span>(<span class="hljs-string">"wavefile"</span>).WaveFile;
<span class="hljs-keyword">const</span> fs = <span class="hljs-built_in">require</span>(<span class="hljs-string">"fs"</span>);
<span class="hljs-keyword">const</span> { OpusEncoder } = <span class="hljs-built_in">require</span>(<span class="hljs-string">"@discordjs/opus"</span>);
<span class="hljs-keyword">const</span> pcmUtil = <span class="hljs-built_in">require</span>(<span class="hljs-string">"pcm-util"</span>);
<span class="hljs-keyword">const</span> wav = <span class="hljs-built_in">require</span>(<span class="hljs-string">"wav"</span>);
<span class="hljs-keyword">const</span> convert = <span class="hljs-built_in">require</span>(<span class="hljs-string">"pcm-convert"</span>);
client.login(<span class="hljs-string">`TOKEN`</span>);
client.on(<span class="hljs-string">"ready"</span>, <span class="hljs-function">() =></span> {
<span class="hljs-built_in">console</span>.log(<span class="hljs-string">`Logged in as <span class="hljs-subst">${client.user.tag}</span>!`</span>);
<span class="hljs-keyword">const</span> channel = client.channels.cache.get(RADIO_VOICE_CHANNEL);
<span class="hljs-keyword">if</span> (!channel) {
<span class="hljs-keyword">return</span> <span class="hljs-built_in">console</span>.error(<span class="hljs-string">"The channel does not exist!"</span>);
}
connection = joinVoiceChannel({
<span class="hljs-attr">channelId</span>: channel.id,
<span class="hljs-attr">guildId</span>: channel.guild.id,
<span class="hljs-attr">adapterCreator</span>: channel.guild.voiceAdapterCreator,
<span class="hljs-attr">selfDeaf</span>: <span class="hljs-literal">false</span>,
<span class="hljs-attr">selfMute</span>: <span class="hljs-literal">false</span>,
});
connection.on(VoiceConnectionStatus.Ready, <span class="hljs-function">() =></span> {
<span class="hljs-built_in">console</span>.log(<span class="hljs-string">"Connection ready"</span>);
});
});
<span class="hljs-keyword">let</span> resource = <span class="hljs-literal">null</span>;
<span class="hljs-keyword">let</span> player = createAudioPlayer({
<span class="hljs-attr">behaviors</span>: {
<span class="hljs-attr">noSubscriber</span>: NoSubscriberBehavior.Pause,
},
});
<span class="hljs-keyword">const</span> wss = <span class="hljs-keyword">new</span> WebSocketServer({ <span class="hljs-attr">port</span>: <span class="hljs-number">5000</span> });
wss.on(<span class="hljs-string">"connection"</span>, <span class="hljs-function">(<span class="hljs-params">ws</span>) =></span> {
<span class="hljs-built_in">console</span>.log(<span class="hljs-string">"Connection accepted"</span>);
connection.subscribe(player);
ws.on(<span class="hljs-string">"message"</span>, <span class="hljs-keyword">async</span> (message) => {
<span class="hljs-keyword">const</span> msg = <span class="hljs-built_in">JSON</span>.parse(message);
<span class="hljs-keyword">switch</span> (msg.event) {
<span class="hljs-keyword">case</span> <span class="hljs-string">"connected"</span>:
<span class="hljs-built_in">console</span>.log(<span class="hljs-string">"A new call has connected"</span>);
<span class="hljs-keyword">break</span>;
<span class="hljs-keyword">case</span> <span class="hljs-string">"start"</span>:
<span class="hljs-built_in">console</span>.log(<span class="hljs-string">`Starting media stream...`</span>, msg);
<span class="hljs-keyword">break</span>;
<span class="hljs-keyword">case</span> <span class="hljs-string">"media"</span>:
<span class="hljs-built_in">console</span>.log(<span class="hljs-string">"Receiving audio..."</span>);
<span class="hljs-comment">// ici, je voudrais essayer de convertir le payload dans un format qui puisse être lu par discord.js</span>
<span class="hljs-comment">// J'essaye de le convertir en PCM, mais sans succès.</span>
<span class="hljs-keyword">const</span> payload = msg.media.payload;
<span class="hljs-keyword">const</span> wav = <span class="hljs-keyword">new</span> WaveFile();
wav.fromScratch(<span class="hljs-number">1</span>, <span class="hljs-number">8000</span>, <span class="hljs-string">"8m"</span>, Buffer.from(payload, <span class="hljs-string">"base64"</span>));
wav.fromMuLaw();
<span class="hljs-comment">// You can resample.</span>
wav.toSampleRate(<span class="hljs-number">16000</span>);
<span class="hljs-comment">// You can write this straight to a file (will have the headers)</span>
<span class="hljs-keyword">const</span> results = wav.toBuffer();
<span class="hljs-comment">// Or you can access the samples without the WAV header</span>
<span class="hljs-keyword">const</span> samples = wav.data.samples;
fs.writeFileSync(<span class="hljs-string">'./stream.wav'</span>, results);
<span class="hljs-keyword">try</span> {
<span class="hljs-keyword">const</span> resource = createAudioResource(<span class="hljs-string">'./stream.wav'</span>);
player.play(resource);
} <span class="hljs-keyword">catch</span> (ex) {
<span class="hljs-built_in">console</span>.log(ex);
}
<span class="hljs-keyword">break</span>;
<span class="hljs-keyword">case</span> <span class="hljs-string">"stop"</span>:
<span class="hljs-built_in">console</span>.log(<span class="hljs-string">"Call has ended"</span>);
<span class="hljs-keyword">break</span>;
<span class="hljs-keyword">default</span>:
<span class="hljs-keyword">break</span>;
}
});
ws.on(<span class="hljs-string">"close"</span>, <span class="hljs-function">() =></span> {
<span class="hljs-built_in">console</span>.log(<span class="hljs-string">`Connection closed.`</span>);
});
});
</code></pre></div></div></details>Champs personnalisés dans une base SQL, message #2495182023-03-11T07:47:33+01:00lavender0/@lavender0https://zestedesavoir.com/forums/sujet/16860/champs-personnalises-dans-une-base-sql/?page=1#p249518<p>Spend some time playing <a href="https://food-le.io">foodle</a>. I’m interested in finding out more because I have strong views about it. Would you please provide more details to your blog post? We will all actually gain from it.</p>Champs personnalisés dans une base SQL, message #2495012023-03-08T10:18:53+01:00viki53/@viki53https://zestedesavoir.com/forums/sujet/16860/champs-personnalises-dans-une-base-sql/?page=1#p249501<p>Merci pour les réponses !</p>
<p>On fait effectivement du multi-tenant, mais on compartimente rien depuis le début donc un peu trop tard pour changer (j’ai pris le projet en marche, compliqué de tout refaire dans l’immédiat, mais ce sera peut-être un chantier pour quand on grossira).</p>
<p>Je note par contre je bien faire attention au type <code>JSONB</code> ! Les autres champs JSON qu’on utilise déjà sont déjà au bon format, je pense que Typeorm fait le choix pour nous (les migrations sont générées automatiquement depuis nos déclarations d’entités).</p>
<p>J’essayais de chercher des cas où la notation "longue" poserait problème aussi, mais à part la lecture de prime abord qui est pas très explicite je vois pas non plus.</p>Champs personnalisés dans une base SQL, message #2494972023-03-07T16:30:58+01:00sgble/@sgblehttps://zestedesavoir.com/forums/sujet/16860/champs-personnalises-dans-une-base-sql/?page=1#p249497<p>Tu parles du type <code>JSON</code> ou bien du type (recommandé) <code>JSONB</code> ? En principe le type JSONB supporte bien l’indexation (sur l’accès à une clé particulière ou un index inversé général) et ses performances devraient être correctes. Je suspecte que l’ancien type <code>JSON</code> ne soit pas si optimisé quand je lis la doc :</p>
<blockquote>
<p>The json and jsonb data types accept almost identical sets of values as input. The major practical difference is one of efficiency. The json data type stores an exact copy of the input text, which processing functions must reparse on each execution; while jsonb data is stored in a decomposed binary format that makes it slightly slower to input due to added conversion overhead, but significantly faster to process, since no reparsing is needed. jsonb also supports indexing, which can be a significant advantage.</p>
</blockquote>Champs personnalisés dans une base SQL, message #2494962023-03-07T15:32:42+01:00SpaceFox/@SpaceFoxhttps://zestedesavoir.com/forums/sujet/16860/champs-personnalises-dans-une-base-sql/?page=1#p249496<p>À moins que les versions récentes de PostgreSQL n’aient sérieusement amélioré les choses, les fonctions avancées (recherche, indexation…) sur les champs JSON existent mais sont pénibles d’utilisation et pas très performantes. En tous cas c’était comme ça y’a 3 ans. Conséquence : ça dépanne bien et c’est très pratique pour les cas d’usages que tu décris, tant que tu n’as pas besoin de hautes performances (hors lecture/écriture du champ JSON en entier) ni que tu as besoin de requêtes sur le contenu des JSON.</p>
<p>En tout état de cause, je partirais directement sur <code>[ { "<foreign_key>": "<la_valeur_du_champ>" } ]</code>, ça me parait beaucoup plus logique que de rajouter un niveau d’indirection comme dans <code>[ { customFieldId: "<foreign_key>", "value": "<la_valeur_du_champ>"} ]</code> – à moins que tu aies une raison majeure d’utiliser cette forme, mais là comme ça je ne vois pas.</p>
<p>Enfin et surtout, ce qui me fait tiquer, c’est ça :</p>
<blockquote>
<p>Sachant que chaque organisation (groupe d’utilisateurs) partagera ces définitions, mais que plusieurs organisations sont sur la même base de données.</p>
</blockquote>
<p>Ça m’a l’air d’être un système multi-tenants. Si c’est le cas, autant que possible on essaie de séparer les tentants au maximum, par exemple en isolant chacun d’entre eux dans un schéma séparé. C’est un peu plus compliqué en général (et ça demande de maintenir un pool de connexions à N schémas, avec possibilité de taper dynamiquement dans un schéma), mais ça a plein d’avantages ensuite : isolation des données (évite les risques de fuite entre tenants), facilité de traiter les données d’un tenant en particulier (export, migration sur une autre instance…). Et, dans le cas qui nous intéresse, possibilité de créer des structures dédiées pour chaque tenant (par exemple pour contenir leurs champs personnalisés) sans impacter les autres tenants.</p>
<p>Bien sûr c’est à étudier selon tes besoins en particuliers. De même que la question des performances des champs JSON : peut-être qu’elles seront largement suffisantes pour ton application dans tout futur crédible.</p>Champs personnalisés dans une base SQL, message #2494922023-03-07T09:24:30+01:00viki53/@viki53https://zestedesavoir.com/forums/sujet/16860/champs-personnalises-dans-une-base-sql/?page=1#p249492<p>On utilise typeorm oui, mais c’est pas trop la question vu qu’on peut toujours gérer les requêtes nous-mêmes s’il le faut.</p>
<p>On utilise effectivement Postgre donc le JSON devrait fonctionner mais je me demande ce qui est plus efficace entre avec les id dans une propriété "statique" du JSON, ou l’utiliser directement comme clé de la valeur qu’on veut stocker (qui peut avoir différents types suivant la définition du champ custom associé).</p>Champs personnalisés dans une base SQL, message #2494902023-03-07T08:50:19+01:00Moté/@Mot%C3%A9https://zestedesavoir.com/forums/sujet/16860/champs-personnalises-dans-une-base-sql/?page=1#p249490<p>Salut,</p>
<p>Je me suis beaucoup posé cette question, moi aussi, dernièrement. Est-ce que tu vas utiliser un ORM, et si oui, est-ce qu’il gère cette possibilité ?</p>
<p>Je m’étais posé la question avec Django, mais il ne permet pas du tout d’utiliser de système dynamique. Même avec un champ json, il faut hardcoder à un moment les noms de champ dans les requêtes.</p>
<p>Par contre, j’ai appris que PostgreSQL propose un champ json et supporte les index sur ce champ (mais je n’en sais pas plus), C’est assez intéressant à savoir.</p>Champs personnalisés dans une base SQL, message #2494892023-03-07T07:29:44+01:00viki53/@viki53https://zestedesavoir.com/forums/sujet/16860/champs-personnalises-dans-une-base-sql/?page=1#p249489<p>Hello,</p>
<p>Je me pose une question quant à l’organisation d’une fonctionnalité du produit sur lequel je bosse.</p>
<p>J’aimerai trouver un compromis correct pour les performances en priorité, mais aussi faire en sorte que ce soit assez simple d’usage/compréhension.</p>
<p>Globalement on veut permettre la définition de champs personnalisés (sur des contacts par exemple, mais on va appliquer le même principe sur d’autres entités) via une interface d’administration. Sachant que chaque organisation (groupe d’utilisateurs) partagera ces définitions, mais que plusieurs organisations sont sur la même base de données.</p>
<p>Pour l’instant on est parti sur l’idée de gérer les définitions de façon plutôt classique : une table à part (pour chaque entité avec des champs custom) avec <code>(id, orgId, label, description, type…)</code> pour faire simple.</p>
<p>On se dit par contre que pour stocker les valeurs (validées à chaque mise à jour de l’entité) on va stocker ça dans un champ JSON de l’entité concernée par ces champs.</p>
<p>J’ai donc deux questions principales :</p>
<ol>
<li>Est-ce pour vous une implémentation raisonnable (sachant qu’on pas forcément prévu de faire de recherche hyper poussée sur ces champs pour le moment, mais que c’est pas exclu à l’avenir non plus)</li>
<li>Est-ce qu’il vaut mieux stocker sous la forme <code>[ { customFieldId: "<foreign_key>", "value": "<la_valeur_du_champ>"} ]</code> ou plutôt directement <code>[ { "<foreign_key>": "<la_valeur_du_champ>" } ]</code> selon vous ?</li>
</ol>
<p>Pour info, à l’affichage on part surtout sur du formulaire, avec l’ensemble des champs custom affichés à la fois, qu’ils aient une valeur définie pour l’entité cible ou non.</p>Aide discord.js, message #2439472022-06-30T19:31:27+02:00timdu6602/@timdu6602https://zestedesavoir.com/forums/sujet/13974/aide-discordjs/?page=1#p243947<p>Salut Leslie je ne sais pas si ton problème est résolu mais sinon ton guildMemberAdd au tu as mis member.roles.add tu peut le mettre dans ton tout premier juste au dessus de ton member.send ainsi que ton message : guild.channels.get(’id’).send(’Bienvenue sur le seruveur ${member.user.username}!’)</p>
<p>PS : si tu as besoin d’aide voici mon tag Discord : 𝗧𝗶𝗺#3810</p>Fuite de mémoire avec un module GRPC pour Node-red (application Node.js) en Javascript, message #2405572022-01-26T14:04:03+01:00Renault/@Renaulthttps://zestedesavoir.com/forums/sujet/16021/fuite-de-memoire-avec-un-module-grpc-pour-node-red-application-nodejs-en-javascript/?page=1#p240557<p>Après quelques heures le verdict semble clair, écart non mesurable entre code d’origine et code avec juste les instructions <code>delete</code> quand celui qui ferme la connexion seulement a une consommation mémoire stable.</p>Fuite de mémoire avec un module GRPC pour Node-red (application Node.js) en Javascript, message #2405442022-01-25T21:00:26+01:00Renault/@Renaulthttps://zestedesavoir.com/forums/sujet/16021/fuite-de-memoire-avec-un-module-grpc-pour-node-red-application-nodejs-en-javascript/?page=1#p240544<blockquote>
<p>Par contre j’aurais pensé intuitivement que le remplacement de valeur (lignes 14 et 25) aurait permis d’éliminer l’ancienne de la mémoire, effectivement… <img src="/static/smileys/svg/1f914.svg" alt="🤔" class="smiley"></p>
</blockquote>
<p>À la lecture des documents de Mozilla, c’est ce que j’aurais pensé aussi.</p>
<blockquote>
<p>Je serais curieux de savoir si la fuite est présente avec seulement les modifications des lignes 9, 10 et 12. Et si oui, est-ce que la fuite est présente sans la modification de la ligne 10 (la fermeture).</p>
</blockquote>
<p>Je vais tester ce scénario aussi, j’ai pensé comme toi que la fermeture explicite est nécessaire pour libérer des ressources internes. En lisant rapidement le code de grpc-js je pensais trouver quelque chose en ce sens mais pour l’instant rien.</p>
<p>Merci pour les indications, je teste ça demain. <img src="/static/smileys/svg/smile.svg" alt=":)" class="smiley"></p>Fuite de mémoire avec un module GRPC pour Node-red (application Node.js) en Javascript, message #2405422022-01-25T19:35:57+01:00SpaceFox/@SpaceFoxhttps://zestedesavoir.com/forums/sujet/16021/fuite-de-memoire-avec-un-module-grpc-pour-node-red-application-nodejs-en-javascript/?page=1#p240542<p>Je soupçonne que le client non fermé explicitement a encore une référence interne quelque part donc ne peut pas être libéré, même s’il n’est plus référencé. </p>
<p>Je serais curieux de savoir si la fuite est présente avec seulement les modifications des lignes 9, 10 et 12. Et si oui, est-ce que la fuite est présente sans la modification de la ligne 10 (la fermeture).</p>
<p>PS : sans fermeture "explicite" (ou via try-with-resource) en Java, tu vas avoir surtout des problèmes de fuite de descripteurs et de verrous sur les ressources non fermées, avec des connexions tuées par la BDD ou coincées en attente… Je ne connais pas bien JS mais on peut très bien imaginer qu’à chaque seconde, le "un peu trop" de données non libérées à chaque connexion soient suffisantes pour provoquer une fuite mémoire visible. </p>