Faits:
Faits:
A. Par jugement du 21 novembre 2002, le Tribunal pénal de l'arrondissement de la Broye a reconnu A._ coupable d'avoir commis diverses infractions, en particulier d'avoir vendu deux fois 500 grammes d'héroïne et une fois 500 grammes d'un produit de coupage. Il l'a condamné à six ans de réclusion et il a attribué à l'Etat, contre lui, une créance compensatrice de 22'000 fr.
Statuant le 30 janvier 2004 sur l'appel du condamné, la Cour d'appel pénal du Tribunal cantonal a réformé ce prononcé. Elle a acquitté l'appelant de l'une des préventions retenues contre lui mais elle a confirmé toutes les autres, en particulier celle concernant le trafic des stupéfiants. Elle a fixé la peine à quatre ans de réclusion et a confirmé la créance compensatrice.
Statuant le 30 janvier 2004 sur l'appel du condamné, la Cour d'appel pénal du Tribunal cantonal a réformé ce prononcé. Elle a acquitté l'appelant de l'une des préventions retenues contre lui mais elle a confirmé toutes les autres, en particulier celle concernant le trafic des stupéfiants. Elle a fixé la peine à quatre ans de réclusion et a confirmé la créance compensatrice.
B. Agissant par la voie du recours de droit public, A._ requiert le Tribunal fédéral d'annuler l'arrêt du Tribunal cantonal. Il conteste le verdict de culpabilité concernant le trafic des stupéfiants, qu'il tient pour arbitraire et contraire à la présomption d'innocence. Sans reconnaître les autres infractions en cause, il renonce expressément à mettre en doute la validité des constatations correspondantes.
Une demande d'assistance judiciaire est jointe au recours.
Invités à répondre, le Ministère public cantonal propose le rejet du recours; la juridiction intimée a renoncé à déposer des observations.

Le Tribunal fédéral considère en droit:
Le Tribunal fédéral considère en droit:
1. Consacrée par les art. 32 al. 1 Cst. et 6 par. 2 CEDH, selon l'adage in dubio pro reo, la présomption d'innocence interdit au juge de prononcer une condamnation alors qu'il éprouve des doutes sur la culpabilité de l'accusé. Des doutes abstraits ou théoriques, qui sont toujours possibles, ne suffisent cependant pas à exclure une condamnation. Pour invoquer utilement la présomption d'innocence, le condamné doit donc démontrer que le juge de la cause pénale, au regard de l'ensemble des preuves à sa disposition, aurait dû éprouver des doutes sérieux et irréductibles au sujet de la culpabilité (<ref-ruling> consid. 2 p. 40; <ref-ruling> consid. 2a p. 87/88; <ref-ruling> consid. 2e p. 38, consid. 4b p. 40).
L'appréciation des preuves est arbitraire, donc contraire à l'art. 9 Cst., lorsqu'elle contredit d'une manière choquante le sentiment de la justice et de l'équité. Le Tribunal fédéral n'invalide l'appréciation retenue par le juge de la cause que si elle apparaît insoutenable, en contradiction manifeste avec la situation effective ou adoptée sans motifs objectifs. Il ne suffit pas que les motifs du verdict soient insoutenables; il faut en outre que l'appréciation soit arbitraire dans son résultat. Il ne suffit pas non plus qu'une solution différente puisse être tenue pour également concevable, ou apparaisse même préférable (<ref-ruling> consid. 4 p. 58; <ref-ruling> consid. 2 p. 40, 126 I 168 consid. 3a p. 170; voir aussi <ref-ruling> consid. 2.1 in fine p. 9).
L'art. 90 al. 1 let. b OJ exige que l'acte de recours contienne un exposé des faits essentiels et un exposé succinct des droits constitutionnels ou des principes juridiques tenus pour violés, précisant en quoi consiste la violation. Lorsqu'il se plaint d'arbitraire, le recourant doit donc préciser de façon détaillée en quoi la juridiction ou l'autorité intimée s'est gravement trompée et est parvenue à une décision manifestement erronée ou injuste; une argumentation qui ne satisfait pas à cette exigence est irrecevable (<ref-ruling> consid. 1b p. 495, 117 Ia 10 consid. 4b p. 11/12, 110 Ia 1 consid. 2a p. 3).
L'art. 90 al. 1 let. b OJ exige que l'acte de recours contienne un exposé des faits essentiels et un exposé succinct des droits constitutionnels ou des principes juridiques tenus pour violés, précisant en quoi consiste la violation. Lorsqu'il se plaint d'arbitraire, le recourant doit donc préciser de façon détaillée en quoi la juridiction ou l'autorité intimée s'est gravement trompée et est parvenue à une décision manifestement erronée ou injuste; une argumentation qui ne satisfait pas à cette exigence est irrecevable (<ref-ruling> consid. 1b p. 495, 117 Ia 10 consid. 4b p. 11/12, 110 Ia 1 consid. 2a p. 3).
2. Le verdict litigieux est surtout fondé sur les déclarations de la personne qui a acheté au recourant l'héroïne et le produit de coupage, déclarations rapportées dans le jugement du Tribunal pénal. Les précédents juges ont notamment retenu, à titre d'indices propres à confirmer ces déclarations, les communications téléphoniques du recourant avec cette personne, ses contacts avec d'autres trafiquants et les traces d'héroïne et de cocaïne découvertes dans le véhicule qu'il utilisait pour ses déplacements. A tout cela, le recourant oppose de simples dénégations. Au sujet de ses rencontres avec l'acheteur, pour lesquelles il se rendait chaque fois d'Estavayer-le-lac à Genève, il persiste dans des explications que les premiers juges ont écartées mais il ne précise pas en quoi les motifs de leur appréciation, consignés dans le jugement, seraient dépourvus de pertinence. Parmi de nombreux arguments qui ont été, eux aussi, déjà réfutés, il fait valoir que d'autres personnes ont pu utiliser le véhicule en cause et, peut-être, s'en servir pour transporter des stupéfiants. Or, aucun de tous ces moyens n'est apte à révéler une violation des garanties invoquées; à l'appui du grief d'arbitraire, ils sont irrecevables au regard des exigences précitées concernant l'art. 90 al. 1 let. b OJ.
Le recourant critique très sommairement la traduction des conversations téléphoniques en langue albanaise, apparemment dépourvues de sens, que la police a écoutées et enregistrées. Il n'a cependant pas expliqué l'objet de ces conversations; il s'est borné à contester l'usage d'un langage codé relatif à un trafic de stupéfiants. Invoquant de la présomption d'innocence, il tient pour inadmissible de retenir à sa charge le fait qu'il n'a pas expliqué ces mystérieuses communications. Sur ce point, l'argumentation présentée méconnaît que dans des situations appelant assurément une explication de la part du prévenu, son silence peut être pris en considération pour apprécier la force de persuasion des éléments à charge, sans que cela ne constitue une atteinte à son droit de se taire et de ne pas témoigner contre soi-même, ni une atteinte à la présomption d'innocence (arrêt 1P.641/ 2000 du 24 avril 2001, consid. 3, RUDH 2001 p. 115). Une situation de ce genre était réalisée en l'espèce. Pour le surplus, il n'apparaît pas que le recourant soit condamné parce qu'il n'est pas parvenu à prouver son innocence; les affirmations qu'il développe dans ce sens sont purement gratuites.
Le recours se révèle donc mal fondé, dans la mesure où il est recevable.
Le recours se révèle donc mal fondé, dans la mesure où il est recevable.
3. Selon l'art. 152 OJ, le Tribunal fédéral peut accorder l'assistance judiciaire à une partie à condition que celle-ci soit dans le besoin et que ses conclusions ne paraissent pas d'emblée vouées à l'échec. Il est constant que le recourant est dépourvu de ressources; en revanche, la procédure entreprise devant le Tribunal fédéral n'avait manifestement aucune chance de succès. La demande d'assistance judiciaire doit, par conséquent, être rejetée.
A titre de partie qui succombe, le recourant doit acquitter l'émolument judiciaire (art. 156 al. 1 OJ).

Par ces motifs, le Tribunal fédéral prononce:
Par ces motifs, le Tribunal fédéral prononce:
1. Le recours est rejeté, dans la mesure où il est recevable.
1. Le recours est rejeté, dans la mesure où il est recevable.
2. La demande d'assistance judiciaire est rejetée.
2. La demande d'assistance judiciaire est rejetée.
3. Le recourant acquittera un émolument judiciaire de 2'000 fr.
3. Le recourant acquittera un émolument judiciaire de 2'000 fr.
4. Le présent arrêt est communiqué en copie au mandataire du recourant, au Ministère public et au Tribunal cantonal du canton de Fribourg.
Lausanne, le 22 juillet 2004
Au nom de la Ire Cour de droit public
du Tribunal fédéral suisse
Le président: Le greffier: