jeudi, septembre 01, 2022

ES6 exemple simple: Async, Await, Fetch, Then

const loadData = async(n) => {
  try {
    const url = 'https://jsonplaceholder.typicode.com/todos/' + n;
    // fetch retourne une "promise", et comme c'est une fonction 
    // asynchrone async function il faut l'attendre avec "await"
    const res = await fetch(url); 
    if (res.ok) {
      // retourne une "promise", attendons avec "await"
      const data = await res.json(); 
      return data;
    } 
  }
  catch(err) {
    console.error(err);
  }
}

// loadData retourne aussi une "promise"
loadData(2).then((data) => { console.log(data); });

jeudi, août 30, 2012

Fonction de hachage MD5 dans DB2

La fonction de hachage fournie  par défaut dans DB2DBMS_UTILITY.GET_HASH_VALUE, peut rapidement présenter ses limites lorsqu'il s'agit de minimiser les collisions.

Attention aux collisions
Les deux instructions suivantes nous retourne la même et unique valeur de hachage 1007044402

1 SELECT DBMS_UTILITY.GET_HASH_VALUE(
'370583815295F84346683861EUR55BE',
0,
2147483647) FROM sysibm.sysdummy1;
2 SELECT DBMS_UTILITY.GET_HASH_VALUE(
'52963397472P567015371118EUR87AT',
0,
2147483647) FROM sysibm.sysdummy1;
Un résultat qui rend cette fonction peu utile pour ne pas dire inutilisable dans plusieurs cas où la résistance aux collisions est vraiment un critère nécessaire.  Avant de juger si  GET_HASH_VALUE  peut nous être utile il faut se faire une idée sur sa résistance aux collisions, or un rapide test sur  2 millions de lignes de chaines de caractères générées aléatoirement et de longueur variable nous donne un pourcentage de collision qui se rapproche de 1%.  Ce qui peut être acceptable pour certains, mais qui ne l'est pas pour beaucoup d'autres.

MD5 mise en place
La solution évidente à ce problème et qui sans doute nous vient tout de suite à l'esprit est la fonction MD5 mais le soucis c'est que cette fonction est totalement absente de DB2, du moins elle absente à l'heure de la rédaction de cette note sur la version DB2 9.7.x.x.  Pour pouvoir utiliser MD5, il faudra donc passer par une fonction (UDF) externe qui pourrait être écrite en C ou en Java.

Voici comment faire:

  1. Télécharger une bibliothèque C prévue à cet effet qui s'appelle db2-auth-routines, ici.
  2. Afin de pouvoir compiler cette bibliothèque vous aurez besoin des bibliothèques de Apache Runtime Project, notamment: apr et apr-util, téléchargeables ici.
  3. Extraire les archives pour compiler dans l'ordre apr, apr-util et db2-auth-routines.
  4. apr ne nécessite aucune configuration préalable et n'est nécessaire que pour le besoin de compilation, donc vous pourrez paramétrer la variable prefix lorsque vous lancez le ./configure.

    ./configure --prefix=mon_chemin_pour_apr  
    make
    make install
  5. apr-util dépend de apr, donc il faudra spécifier le chemin de apr

    ./configure --with-apr=mon_chemin_pour_apr  
    make
    make install
  6. Avant de compiler db2-auth-routines, éditer le fichier de compilation makertn pour configurer le chemin vers apr, apr-util et aussi la bibliothèque de DB2 
  7. Lancer la compilation et l'enregistrement des nouvelles fonctions dans DB2
    ./makertn
    db2 connect to basededonnees user utilisateur using motdepasse;
    db2 -tvf register.ddl
  8. Connectez vous a la base et tester

    1 SELECT md5('370583815295F84346683861EUR55BE'), md5('52963397472P567015371118EUR87AT')
    2 FROM sysibm.sysdummy1;

mercredi, juillet 18, 2012

Conversion de devise

Dernièrement j'ai été surpris de voir comment certains programmeurs procédaient pour convertir une valeur monétaire d'une devise à une autre afin d'obtenir un tableau d'équivalence de devises.

Leur principe repose sur un nombre conséquent d'appel à une méthode d'un Web service quelconque ayant une signature de la forme suivante:

double GetCurrencyRate(fromCurrency, toCurrency)
Le Web service aurait pour fonction de retourner une valeur décimale représentant la conversion, comme pour reprendre l'exemple dans la capture d'écran ci-dessus:
GetCurrencyRate("EUR", "USD") = 1.2284


Inefficace vers efficace
Faire appel a une méthode distante à plusieurs reprises est loin d'être efficace et pourtant il existe un moyen simple, fiable et gratuit d'obtenir le résultat pour construire ce fameux tableau d'équivalence.

La réponse se trouve ici: http://openexchangerates.org/latest.json


Il s'agit d'un tableau complet d'échange ou la monnaie de base est le dollar américain (USD).  Le principe est simple, récupérer avec un seul appel distant ces données et utiliser les valeurs du tableau récupéré pour calculer la correspondance de n'importe quel devise.

Par exemple pour obtenir la valeur correspondante de EUR à MUR on fera:
MUR ÷ EUR = 31.038697  ÷ 0.817044 = 37.98901527947087
Exemple qui ne manque pas de nous rappeler à quel point l'Euro face à la roupie Mauricienne est faible ces derniers temps.

samedi, janvier 28, 2012

Transformer une guitare HSH en SSS

Une guitare électrique ayant une configuration de micros Humbucker Single Humbucker (HSH) peut être aisément modifiée pour fonctionner en Single Single Single (SSS), tout comme une Fender stratocaster à configuration classique. Ce branchement qu'on appelle le «coil-split» est surtout intéressant dans la mesure où il permet d'obtenir une guitare avec une palette de tonalités plus variées.

Ibanez RG370DX - Configuration HSH


Principe du «coil-split».
Le principe est de pouvoir activer et désactiver l'un des micros du humbucker à l'aide d'un interrupteur. Pour réaliser cette modification, il nous faudra bien entendu avoir une guitare à configuration HSH.
Pour cet essai j'ai utilisé comme cobaye une Ibanez RG370DX que j'ai équipé d'un humbucker GFS Fat PAT en position manche et un GFS Crunchy PAT en position chevalet (voir la photo du dessus). Les micros humbuckers utilisés doivent forcément avoir un minimum de 3 câbles, car l'un des câbles est utilisé pour couper le circuit entre les deux bobines du micro.

Ci-dessous le code couleur des micros GFS.  Dans mon cas j'ai gardé le micro simple d'origine sur la guitare et pour préserver la phase entre les nouveaux micros GFS et celui-ci, j'ai inversé le câble vert (positif) et noir (terre).  Les deux câbles indiqués split sont utilisés pour couper l'un des micros du humbucker.

Câble d'un micro humbucker GFS

Fonctionnement du potentiomètre à interrupteur.
Pour activer et désactiver une bobine, il nous faudra un potentiomètre avec interrupteur de type DPDT.  J'utilise dans mon exemple un potentiomètre linéaire car j'ai décidé de remplacer seulement celui de la tonalité, l'interrupteur embarqué servira à basculer via un poussé-tiré (push-pull)  les deux micros double en simple et vice-versa.  Ainsi, lorsqu'on tire sur l'axe (PULL) les broches encerclées de jaune sont connectées et lorsqu'on pousse (PUSH) sur l'axe les broches encerclées de bleu sont connectées.

Potentiomètre linéaire à interrupteur


Schéma et branchement
Pour réaliser la connectique, je me suis inspiré du schéma ci-dessous que j'ai trouvé sur le site de Seymour Duncan, mais je n'ai pas remplacé le potentiomètre de volume par un autre avec interrupteur.  Attention le code couleur des micros Seymour Duncan utilise le câble vert comme terre et le noir comme positif.  Dans mon cas, pour rester en phase avec le micro du centre, j'ai utilisé ce même code couleur.

Comme montré dans le diagramme, les câbles rouge et blanc (SPLIT) vont sur les broches au centre de l'interrupteur et les broches du haut vont sur terre.  Donc, j'envoie les câbles split de mes deux humbuckers sur les broches du centre.
Avec ce branchement, lorsqu'on tire sur l'axe du potentiomètre, les câbles splits sont envoyés vers la terre (comme le montre l'encadré jaune de l'image précédente) et donc l'une des bobines des humbucker est désactivée, lorsque l'on pousse sur l'axe les deux bobines sont actives.

samedi, janvier 14, 2012

Quand Python parle avec Reaper

Comme station audio numérique (DAW) j'utilise le logiciel Reaper car pour une licence de 60$, on obtient un logiciel ayant des capacités et une flexibilité inouïes et tout ça pour une utilisation modeste des ressources de l'ordinateur.

Reaper et ses différentes dispositions


Simulateurs d'amplis
Dernièrement je me suis mis à expérimenter un peu plus avec les simulateurs d'ampli guitares sous forme VST. J'ai donc rangé temporairement mon POD X3 et mon ampli Fender Mustang pour essayer les simulateurs gratuit de LePou et ceux de SimulAnalog Guitar Suite et j'ai été rapidement conquis par les sons et la possibilité de pouvoir jouer sur ces simulateurs sans latence dérangeante.

leCto, un simulateur hi-gain

Le résultat est tellement intéressant que je me suis sérieusement convaincu que je pouvais utiliser tout ça dans un contexte live.  Mais justement, comment faire pour changer mes patchs instantanément sans les mains?

POD X3 + Reaper + Python, la combinaison gagnante

C'est là où le POD X3 et sa capacité à sortir du signal MIDI entre en jeu.  Pour le changement de patch aucun problème, on assigne rapidement un raccourci MIDI à travers la fenêtre d'actions.  Mais lorsqu'on cherche à réaliser quelque chose de plus élaboré on rencontre vite les limites des actions permises dans Reaper.  C'est là où intervient ReaScript, le moteur Reaper permettant de charger des scripts Python qui ont eux accès à l'API du logiciel.

Faire du POD X3 un contrôleur MIDI

En fait je voulais pouvoir, sous un simple actionnement d'un bouton du POD, fermer le projet courant sous Reaper pour en ré-ouvrir un autre.  L'idée final étant d'avoir un projet Reaper pour chaque chanson, chaque projet alors contiendrait des pistes avec chacune leurs simulateurs d'amplis.  Pour une autre chanson, il y aurait un autre projet Reaper avec une configuration de pistes et simulateurs d'amplis différents.
Ca donnerait un projet Reaper par chansons, du style:

  1. Song-1.RPP
  2. Song-2.RPP
  3. etc...

Sortie MIDI sur le POD X3 Live

Pour pouvoir réaliser ceci, ou encore bien d'autres choses, il est possible de coder un script Python qui peut être rattaché a une action sous Reaper, le tout via ReaScript.  Il faudra activer ReaScript à travers les préférences, écrire le script Python et rajouter une action custom de type ReaScript qui pointe vers le script donné ci-dessous.  Par la suite il suffit d'y assigner le raccourci MIDI que vous souhaitez et le tour est joué.

from reaper_python import * (prj,_,prjName,_) = RPR_EnumProjects(-1, "", 100) prjNumber = int(prjName[-5:-4]) + 1 nextProjectName = prjName[0:-5] + str(prjNumber) + ".RPP" if (RPR_file_exists(nextProjectName)): retVal = 1 while retVal != 0: retVal = RPR_Undo_DoUndo2(prj) RPR_Main_OnCommand(40026, 0) RPR_Main_openProject(nextProjectName) else: retVal = 1 while retVal != 0: retVal = RPR_Undo_DoUndo2(prj) nextProjectName = prjName[0:-5] + "1.RPP" RPR_Main_OnCommand(40026, 0) RPR_Main_openProject(nextProjectName)

mardi, décembre 27, 2011

Changer ses micros de guitare

Changer les micros d'une guitare soi-même n'est pas vraiment compliqué.  L'idée c'est de bien se repérer avant même de commencer pour identifier les câbles et les couleurs.



Ci-dessus le câblage existant d'une Ibanez RG370DX équipée de INF3, INFS3 et INF4.  Voici les codes couleurs du INF4:
Blanc - positif (hot)
Rouge- coil-split - on peut l'utiliser si l'on veut monter un schéma permettant d'utiliser qu'une bobine.
Noir - (Black) - terre (ground)

Le INF4 a été remplacé par un GFS Fat PAT et pour le montage de ce dernier, il suffit de suivre le schéma qui vient avec, cependant faites attention d'inverser le câble terre (noir) et le positif (vert) pour mettre le micro en phase avec celui d'origine (ici un INFS3)


lundi, décembre 19, 2011

Excel & VBA pour l'extraction de données.

Petit «hack» fait rapidement ce matin me permettant de récupérer le tableau du taux de change en première page depuis le site de la MCB LTD. Le code étant un peu bourrin, ça m'a fait tout de suite pensé au blog.



 1 Sub FetchForex()
 2
 3     Dim i As Integer
 4     Dim sURL As String, sHTML As String, sAllPosts As String
 5     Dim oHttp As Object
 6     Dim lTopicstart As Long, lTopicend As Long
 7     Dim blWSExists As Boolean
 8     
 9     sURL = "http://www.mcb.mu/"
10     On Error Resume Next
11     Set oHttp = CreateObject("MSXML2.XMLHTTP")
12     If Err.Number <> 0 Then
13         Set oHttp = CreateObject("MSXML.XMLHTTPRequest")
14         MsgBox "Error 0 has occured while creating a MSXML.XMLHTTPRequest object"
15     End If
16     
17     On Error GoTo 0
18     If oHttp Is Nothing Then
19         MsgBox "For some reason I wasn't able to make a MSXML2.XMLHTTP object"
20         Exit Sub
21     End If
22         
23     'Open the URL in browser object
24     oHttp.Open "GET", sURL, False
25     oHttp.Send
26     sHTML = oHttp.responseText
27     
28     lTopicstart = InStr(1, sHTML, "<div class=""table_forex_rates"">", vbTextCompare)
29     lTopicend = InStr(1, sHTML, "<div class=""border_forex"">", vbTextCompare)
30     sHTML = Mid(sHTML, lTopicstart, lTopicend - lTopicstart)
31     
32     Dim lCurrLabelStart As Long
33     Dim lCurrValueStart As Long
34     Dim lStartPos As Long
35     Dim continue As Boolean
36     Dim iCurrValueFieldLength As Long
37     Dim sPreCurrLabelStart As String
38     Dim sPreCurrValStart As String
39     
40     i = 1
41     lStartPos = 1
42     iCurrValueFieldLength = 46
43     continue = True
44     sPreCurrLabelStart = "_Range1Label"">"
45     sPreCurrValStart = "_RangeLabel"">"
46     Set RE = CreateObject("vbscript.regexp")
47     With RE
48         .MultiLine = False
49         .Global = False
50         .IgnoreCase = True
51         .Pattern = "[0-9]+.[0-9][0-9]"
52     End With
53     
54     ' parse the HTML to extract the values
55     Do While continue
56         lCurrLabelStart = InStr(lStartPos, sHTML, sPreCurrLabelStart, vbTextCompare) + Len(sPreCurrLabelStart)
57         lCurrValueStart = InStr(lStartPos, sHTML, sPreCurrValStart, vbTextCompare) + Len(sPreCurrValStart)
58         Worksheets(1).Range("A" + CStr(i)).Value = Mid(sHTML, lCurrLabelStart, 3)
59         Worksheets(1).Range("B" + CStr(i)).Value = RE.Execute(Mid(sHTML, lCurrValueStart, iCurrValueFieldLength))(0)
60         Worksheets(1).Range("C" + CStr(i)).Value = RE.Execute(Mid(Mid(sHTML, lCurrValueStart, iCurrValueFieldLength), 6, 41))(0)
61         
62         lStartPos = lCurrValueStart
63         i = i + 1
64         If i > 6 Then
65             continue = False
66         End If
67     Loop
68
69     Set oHttp = Nothing
70 End Sub
71