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...
Affichage des messages 1 - 5 de 7
Afficher plus »
|
Documentation >
Articles
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 : 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..." : 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 :
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> </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> </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 |
| Pièces jointes:
cookie.rsp
test-cookie.rsp
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