Documentation‎ > ‎

Articles


Cette section a pour objectif de vous proposer des articles (micro-article pour le moment ;)) autour de l'utilisation de REBOL au quotidien. 

Derniers articles...

  • Tweeter avec REBOL ! Chris Ross Gill est un contributeur actif autour de REBOL.Il est d'ailleurs en train de revoir complètement son site et bientôt un nouveau site dédié à REBOL verra ...
    Publié à 14 juil. 2011 à 13:06 par REBOL FRANCE
  • Gestion des Cookie sous Cheyenne Il existe dans la documentation de Cheyenne (RSP API) une fonction set-cookie mais qui n'est malheureusement pas encore implémentée (pour le moment ;)).Pour ce faire, voici comment gérer ...
    Publié à 28 déc. 2011 à 06:40 par REBOL FRANCE
  • Produire du XML, JSON avec Cheyenne Comment utiliser la force de Cheyenne pour produire des fichiers de type XML, JSON ?Cheyenne utilise du templating avec les RSP, alors pourquoi ne pas utiliser cette caractéristique principale ?Mais ...
    Publié à 13 juin 2011 à 03:33 par REBOL FRANCE
  • Utilisation de PostgreSQL sous Cheyenne Cheyenne propose une gestion native des bases de données (Cheyenne s'occupe de la gestion de l'ouverture/fermeture des sessions) MySQL, PostgreSQL, Oracle et ODBC.Pour la partie ODBC ...
    Publié à 7 juin 2011 à 14:31 par REBOL FRANCE
  • Gestion des erreurs REBOL offre une gestion des erreurs comme tout langage de programmation moderne, avec la possibilité via le mot clé try de trapper une erreur :if error? err: try [     value: 1 ...
    Publié à 4 juin 2011 à 14:30 par REBOL FRANCE
Affichage des messages 1 - 5 de 7 Afficher plus »


Tweeter avec REBOL !

publié le 14 juil. 2011 à 12:27 par REBOL FRANCE   [ mis à jour : 14 juil. 2011 à 13:06 ]


Chris Ross Gill est un contributeur actif autour de REBOL.
Il est d'ailleurs en train de revoir complètement son site et bientôt un nouveau site dédié à REBOL verra le jour !

Chris a développé une API REBOL pour Twitter complète, simple et totalement opérationnelle !

Tout d'abord, pour commencer, il vous faudra un compte Twitter valide et à partir de se compte enregistrer votre application REBOL pour Twitter que vous aller créer.
Rien de plus, il vous suffit de vous connecter à l'adresse suivante : https://dev.twitter.com/apps/new avec votre compte Twitter, suivez les instructions pour la création de la l'application. C'est extrêmement rapide.
Si vous souhaitez tweeter à partir de votre application REBOL, il faudra autoriser l'application en lecture et écriture.

Une fois que l'application est créé (il faut juste choisir un nom d'application, donner une description et indiquer un site Web de référence (normalement celui qui permet de télécharger votre application)), vous allez pouvoir récupérer 2 informations nécessaires au bon fonctionnement du script Twitter de Chris : le Consumer Key et le Consumer secret :

Clé pour le paramétrage REBOL

N'oubliez pas de changer les autorisations d'accès si vous souhaitez tweeter depuis votre application REBOL.


Il faudra aussi créé les "Tokens" en cliquant sur le bouton "Create..." :

Création des tokens pour votre application Twitter REBOL

Le script proposé par Chris RG est basé sur l'authentification OAuth.

Pour tweeter, rien de plus simple :

do/args http://reb4.me/r/twitter.r context [
    Consumer-Key: <your API key goes here>
    Consumer-Secret: <your API secret goes here>
    User-Store: <file-or-url to store users>
]

Il vous suffira de remplacer le Consumer-Key, Consumer-Secret par ceux qui vous avez obtenu en créant votre application sur Twitter.
Et le User-Store sera l'emplacement où seront stocker les comptes Twitter que vous utiliserez avec votre application Twitter REBOL.

Vous êtes prêt pour utiliser Twitter for REBOL by Chris !

Tout d'abord, il faut sélectionner le compte avec le compte vous allez utiliser Twitter. Un simple :

>> twitter/as "mon_compte"

Vous permettra de s'authentifier (la toute première fois) avec un compte Twitter.
La première fois que lancerait le twitter/as pour un compte donner, votre navigateur Web par défaut s'ouvrir sur une page Twitter vous demandant l'authentification au compte et une fois cette étape réalisée avec succès vous fournira un code PIN pour autoriser l'application (la votre en l’occurrence) a accéder à votre compte Twitter.
Rentrer le code PIN au niveau de la console REBOL.
Le script REBOL %twitter.r stockera les informations du compte à l'emplacement défini dans le User-Store. grâce à la fonction twitter/save-users.

>> twitter/save-users 

REBOL est désormais connecté à Twitter.

Pour afficher les tweets d'un compte, rien de plus simple, par exemple pour le compte rebolweek : 

foreach tweet twitter/timeline/for "rebolweek" [
    print ""
    print tweet/created_at
    print tweet/text
]

Remarquez que la fonction twitter/timeline renvoi un objet contenant toutes les informations fournis par Twitter.
Je vous laisse imaginer ce que vous pourrez faire en le combinant à la simplicité de REBOL.

Evidemment, il y a une fonction de recherche twitter/find :

>> twitter/find "REBOL"

Et pour tweeter, rien de plus grâce à la fonction twitter/update :

>> twitter/update "Mon premier tweet depuis REBOL !"

Il y a la possibilité de répondre à un tweet en ajoutant le rafinement /reply et en précisant l'id du tweet pour lequel on souhaite répondre.

C'est une très brève présentation de Twitter avec REBOL. Je vous renvoi vers la documentation de Chris RG pour plus d'information.
Et évidemment, la pratique est toujours plus efficace qu'un long discours !


Nicolas


Gestion des Cookie sous Cheyenne

publié le 8 juil. 2011 à 04:03 par REBOL FRANCE   [ mis à jour : 28 déc. 2011 à 06:40 ]


Il existe dans la documentation de Cheyenne (RSP API) une fonction set-cookie mais qui n'est malheureusement pas encore implémentée (pour le moment ;)).

Pour ce faire, voici comment gérer les cookies dans Cheyenne simplement : il suffit de créer un librairie externalisé du type %cookie.rsp et de l'inclure dans la page RSP où vous en aurez besoin :

<%
  set-cookie: func [
        name [string!]
        value [string! unset!]
        /expires expires-value [string! unset!]
        /max-age max-age-value [string! unset!]
        /domain domain-value [string! unset!]
        /path path-value [string! unset!]
        /secure
        /http-only
        /local cookie-value
    ] [
        cookie-value: rejoin [name "=" value]                     
        if expires [cookie-value: rejoin [cookie-value ";Expires=" expires-value " "]]
        if max-age [cookie-value: rejoin [cookie-value ";Max-Age=" max-age-value " "]]
        if domain [cookie-value: rejoin [cookie-value ";Domain=" domain-value " "]]
        if path [cookie-value: rejoin [cookie-value ";Path=" path-value " "]]
        if secure [cookie-value: rejoin [cookie-value ";Secure "]]
        if http-only [cookie-value: rejoin [cookie-value ";HttpOnly "]]
        response/set-header/add 'Set-Cookie cookie-value
    ]
 
    get-cookie: func [
        name [string!]
        /local pos cookie-value
    ] [
        if pos: select request/headers 'Cookie [
            parse/all pos [
                any [
                    thru name [any #" "] "=" copy cookie-value [to #";" | to end]       
                ]
            ]
        ]
        cookie-value
    ]

    remove-cookie: func [name [string!] /local cookie] [
        if cookie: get-cookie name [
            set-cookie/expires name "" "Mon, 1-Jan-1999 00:01:00 GMT"
        ]
    ]

%>

Vous aurez désormais à votre disposition 3 fonctions pour gérer les cookies :
  • set-cookie : qui vous permettra de stocker un cookie (attention cette fonction attend la chaîne de caractère complète de création du cookie et n'offre pas un micro DSL pour assister cette création)
  • get-cookie : qui renvoi la valeur du cookie stocké
  • remove-cookie : qui supprime le cookie spécifié par sa clé

Voici une page de test vous permettant de réaliser les 3 opérations avec en plus un exemple vous offrant la possibilité de lire un cookie à partir du JavaScript (à condition que ce dernier ne soit pas déclaré en HttpOnly, dans ce cas le cookie n'est pas accessible depuis JS).

<%
  include %cookie.rsp
%>
<html>
<head>
    <title>[SANDBOX] Cheyenne's Cookie</title>
    <style>
    body {font-family:verdana, arial, Helvetica, sans-serif;  font-size:11px; margin:25px; background:#fff repeat-x}
    </style>
    <script language="Javascript">
    function readCookie(name) {
      var nameEQ = name + "=";
      var ca = document.cookie.split(';');
      for(var i=0;i < ca.length;i++) {
          var c = ca[i];
          while (c.charAt(0)==' ') c = c.substring(1,c.length);
          if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
      }
      return null;
  }
  function readCookie2(name) {
      return document.cookie;
  }
    </script>
</head>
<body>
<b  style="font-family:verdana, arial, Helvetica, sans-serif; font-size:12px;">Unit Test Page for Cookie</b>
<br/>
<br/>
request/headers content :
<ul>
<%
    foreach [name value] request/headers [
        print [<LI><B> name ":"</B> mold value </LI>]
    ]   
%>
</ul>
<br/>
request/content content :
<ul>
<%
    foreach [name value] request/content [
        print [<LI><B> name ":"</B> mold value </LI>]
    ]   
%>
</ul>
<br/>
Result of Cheyenne :
<br/>
<%
  cookName: select request/content 'cookieName
  cookValue: select request/content 'cookieValue
  cookExpires: select request/content 'cookieExpires
  cookMaxAge: select request/content 'cookieMaxAge
  cookDomain: select request/content 'cookieDomain
  cookPath: select request/content 'cookiePath
  act: select request/content 'actionCookie
  switch act [
    "setCookie" [emit join "Setting cookie " cookName set-cookie/expires/max-age/domain/path cookName cookValue cookExpires cookMaxAge cookDomain cookPath]
    "getCookie" [coo: get-cookie cookName emit rejoin ["Getting cookie " cookName " = " coo]]
    "removeCookie" [emit join "Removing cookie " cookName remove-cookie cookName]
  ]
%>
<br/>
<br/>
Exemple of cookie: "TEST1=testCookie1; Expires=Wed, 13-Jan-2021 22:23:01 GMT"
<br/>
<br/>
<table border="0" style="font-family:verdana, arial, Helvetica, sans-serif; font-size:11px;">
<form method="POST" action="test-cookie.rsp">
<tr><td align="center">Cookie</td></tr>
<tr><td>Name</td><td><input type="TEXT" name="cookieName"></td></tr>
<tr><td>Value</td><td><input type="TEXT" name="cookieValue"></td></tr>
<tr><td>Expires</td><td><input type="TEXT" name="cookieExpires"></td></tr>
<tr><td>Max-Age</td><td><input type="TEXT" name="cookieMaxAge"></td></tr>
<tr><td>Domain</td><td><input type="TEXT" name="cookieDomain"></td></tr>
<tr><td>Path</td><td><input type="TEXT" name="cookiePath"></td></tr>
<tr><td>Action</td><td>
<select name="actionCookie">
    <option value="none"></option>
    <option value="setCookie">Set Cookie</option>
    <option value="getCookie">Get Cookie</option>
    <option value="removeCookie">Remove Cookie</option>
</select>   
<tr><td>&nbsp;</td><td><input type="SUBMIT" value="Validate"></td></tr>
</form>
</table>
<br/>
Cookie in JavaScript :
<br/>
<br/>
<table border="0" style="font-family:verdana, arial, Helvetica, sans-serif; font-size:11px;">
<tr><td>Cookie's name</td><td><input type="TEXT" name="cookieNameJS"></td></tr>
<tr><td>&nbsp;</td><td><button name="readCookie" onclick="javascript:alert(readCookie(document.getElementsByName('cookieNameJS')[0].value));">Read coookie in JS</button></td></tr>
</table>
</body>
</html>


En espérant ce petit palliatif vous sera utile pour vos développement avec Cheyenne.

Nicolas



Produire du XML, JSON avec Cheyenne

publié le 13 juin 2011 à 02:46 par REBOL FRANCE   [ mis à jour : 13 juin 2011 à 03:33 ]


Comment utiliser la force de Cheyenne pour produire des fichiers de type XML, JSON ?

Cheyenne utilise du templating avec les RSP, alors pourquoi ne pas utiliser cette caractéristique principale ?

Mais voyons d'abord, la première méthode qui s'offre à nous : binder le type XML, JSON vers le moteur RSP.
Pour ce faire, il faut rajouter le ou les types désirés (XML, JSON, CSS, ...) dans le fichier de configuration httpd.cfg de Cheyenne au niveau de la section globals dans le binding extern :

bind-extern RSP to [.j .rsp .r .xml .json]

Avec cette méthode, lorsque une ressource de type XML ou JSON sera sollicitée, elle passera par le moteur RSP.
Vous pourrez ainsi rajouter du code RSP dans votre fichier XML ou JSON.

La deuxième méthode utilise donc un fichier RSP et une "petite astuce" fournit par DocKimbel pour renvoyer le fichier XML, JSON en résultat.

Prenons un exemple, générer un fichier %contact.xml du type :

<?xml version="1.0" encoding="UTF-8"?>
<contact>
    <nom>Sassenrath</nom>
    <prenom>Carl</prenom>
</contact>

Pour cela, nous allons faire appel à une page %contact.rsp

<%
nom: "SASSENRATH"
prenom: "Carl"
response/set-header 'Content-Disposition {attachment; filename="contact.xml"}
%>
<?xml version="1.0" encoding="UTF-8"?>
<contact>
    <nom><%= nom %></nom>
    <prenom><%= prenom %></prenom>
</contact>

C'est donc grâce à la propriété "Content-Disposition" de l'entête HTTP que l'on pourra renvoyer le contenu produit par notre page %contact.rsp dans un fichier %contact.xml

Nicolas

Utilisation de PostgreSQL sous Cheyenne

publié le 7 juin 2011 à 14:11 par REBOL FRANCE


Cheyenne propose une gestion native des bases de données (Cheyenne s'occupe de la gestion de l'ouverture/fermeture des sessions) MySQL, PostgreSQL, Oracle et ODBC.

Pour la partie ODBC, il vous suffit de définir un bloc databases (soit dans la section globals, soit dans la section d'une webapp) :

databases [
    mabase odbc://utilisateur:motdepasse@server/basededonnées
]

Il faudra utiliser la version de Cheyenne utilisant REBOL/Command pour bénéficier de l'accès natif à ODBC et Oracle.

Pour PostgreSQL, on doit toujours définir un bloc databases, mais il faudra aussi télécharger le driver PostgreSQL de Softinnov (DocKimbel), le décompresser (depuis la console REBOL, car c'est un fichier archive REBOL .rip) et venir mettre le fichier %pgsql-protocol.r dans le dossier :

C:\Cheyenne\libs

(pour mon exemple, je suis sous Windows)

Ensuite, dans le fichier de configuration de Cheyenne, le fichier %httpd.cfg, il faudra rajouter dans la section globals :

worker-libs [
    %libs/pgsql-protocol.r
]

Et évidemment, n'oubliez de déclarer votre base de données :

databases [
    clients pgsql://postgres:rebol@localhost/postgres
]

Pour utiliser la base de données, rien de plus simple :

list: do-sql 'clients {SELECT client."Identifiant", client."Nom" FROM public.client}


Nicolas


Gestion des erreurs

publié le 3 juin 2011 à 20:13 par REBOL FRANCE   [ mis à jour : 4 juin 2011 à 14:30 ]


REBOL offre une gestion des erreurs comme tout langage de programmation moderne, avec la possibilité via le mot clé try de trapper une erreur :

if error? err: try [
    value: 1 / 0
][
    err: disarm err
    either err/id = 'zero-divide [value: 0] [probe err quit]
]
print value


Néanmoins, il pourra vous arriver d'expérimenter le message d'erreur suivant :

** Script Error: err needs a value
** Where: my-function
** Near: if error? err: try [
    do commands
]

Pourquoi ?

Et bien, cette erreur se produit lorsque try retourne aucune valeur (autrement dit unset!). 
C'est le cas avec print ou if (avec une condition fausse) en dernière instruction

Pour contourner le problème, voici une petite astuce (de coccinelle et RebKodeur du forum RebelBB) :

if error? set/any 'err try [
    ; code
][
    probe disarm err
]


Nicolas

Fonction avec paramètre optionnel

publié le 3 juin 2011 à 19:22 par REBOL FRANCE   [ mis à jour : 11 juin 2011 à 08:10 ]


Pour tous ceux qui ont cherché à créer une fonction avec un paramètre optionnel, voici la solution :

my_function: func [my_parameter [string! unset!]] [
    either not value? 'my_parameter [
        print "my_function without parameter"
    ][
        print my_parameter
    ]
]

Et voici le résultat depuis la console REBOL !

>> my_function
my_function without parameter
>> my_function "Hello World!"
Hello World!

Il faut ajouter le mot clé unset! pour indiquer que le paramètre peut être omis.
Ensuite, dans votre fonction avant d'utiliser le paramètre, il faudra au préalable vérifier si ce dernier a bien été affecté.

Attention ! Si vous omettez le type volontairement, alors le type attendu du paramètre sera unset!
Donc, il faudra utiliser le type any-type! pour accepter n'importe quel type de données et un paramètre non défini.
Il existe un mot clé unset? qui permet de tester si une valeur a été affectée ou non. En réalité, cette fonction regarde si le mot est affecté à unset! 
Il est donc fortement recommandé d'utiliser value?

Nicolas

Historique de la console

publié le 3 juin 2011 à 19:16 par REBOL FRANCE   [ mis à jour : 4 juin 2011 à 14:29 ]


Comment gérer l'historique de la console ?

Très simple (comme REBOL ;)) avec cette fonction :

hist: funct [/save /recall] [
if save [
write/lines %hist.r head reverse copy rebol/console/history
return
]
if recall [
d: copy system/console/history 
  forall d [print rejoin [index? d " : " first d]] 
  do pick head d to-integer ask "-> "
return
]
d: copy system/console/history 
 forall d [print rejoin [index? d " : " first d]] 
]

Cette fonction permet d'afficher l'historique de la console, de rappeler une ligne saisie dans la console et de sauvegarder dans un fichier %console-hist.r l'historique de la console.

Tout est basé sur l'accès à :

system/console/history

qui contient l'historique des chaînes de caractères saisie dans la console de l'interpréteur REBOL.

Voici l'objet system/console :

make object! [
    history: ["probe system/console"]
    keys: none
    prompt: ">> "
    result: "== "
    escape: "(escape)"
    busy: "|/-\"
    tab-size: 4
    break: true
    lookup: func [
        "Console filename completion lookup."
        file /value
    ][
        if #"/" <> last file [file: first split-path file]
        attempt [read file]
    ]
]

Dans les propriétés intéressantes, on peut noter prompt qui permet de redéfinir l'invite, tab-size qui permet de définir la tabulation. 

Nicolas


1-7 of 7