AltME groups: search
Help · search scripts · search articles · search mailing listresults summary
world | hits |
r4wp | 158 |
r3wp | 1415 |
total: | 1573 |
results window for this page: [start: 201 end: 300]
world-name: r3wp
Group: !AltME ... Discussion about AltME [web-public] | ||
[unknown: 9]: 18-Feb-2005 | Actually quite the opposite. AltME is being rebuilt form the ground up (which is why we don't try to fix every little thing on the current version). We are building it to allow for the integration of applets, and a core messaging system to make it more compatible with external applications (for example). | |
Sunanda: 11-Jul-2005 | Security-wise: removing teh guest account is a great idea Marketing-wise: not so sure....adds another barrier to joining the REBOl community. How do people find out how to request to be pre-approved? (One possible way is for rebol.net mirror t have a form that sends an email [if I can use the E word] to the adminstrator) | |
Group: RAMBO ... The REBOL bug and enhancement database [web-public] | ||
Anton: 18-Mar-2005 | Here's a more difficult one - FORM. I always guessed that PRINT uses FORM internally: | |
Anton: 18-Mar-2005 | print ["" "hello"] ;hello print [" " "hello"] ; hello ; <--- 2 leading spaces form ["" "hello"] ;== "hello" form [" " "hello"] ;== " hello" ; <--- 2 leading spaces | |
Anton: 18-Mar-2005 | prin ["" "hello" ""] print "." ;hello . ; <---- 1 traling space form ["" "hello" ""] ;== "hello " ; <--- 1 trailing space | |
Izkata: 18-Mar-2005 | No real argument from me, though, since I don't know and have never used 'form or simply printed blocks | |
Anton: 18-Mar-2005 | So, I would like: print ["" "hello"] ; hello ; <---- 1 leading space form ["" "hello"] ;== " hello" ; <--- 1 leading space form ["" "hello" ""] ;== " hello " ; <--- 1 leading and 1 trailing space And similar results for PRINT. Anyone have any objections ? | |
Pekr: 18-Mar-2005 | Anton - how can you produce space without actually providing a space? ;-) "" is empty string. Even 'empty? tells you so ... it can't add space by some magis, just only because it is used in a block or form ... | |
Anton: 18-Mar-2005 | FORM puts a space between all items in the block when it is joining them together, even items which are empty strings - *except* if it is the first item. | |
Anton: 18-Mar-2005 | Well now, that is not always true either ! form [{} {} {} {} {}] ; a whole bunch of empty strings ;== "" ; <--- empty string form [{} {a} {} {} {}] ; one character added ;== "a " ; <--- three trailing spaces | |
Izkata: 18-Mar-2005 | Perhaps form is just waiting until there's a value before it adds stuff? >> form [{} {} {} {Hi} {} {}] == "Hi " ;2 spaces, and only after string w/value found >> form [{} {} {} {Hi} {} {} {Hi} {}] == "Hi Hi " ;2 spaces and 1 space.. But yes, there probably ought to be a space in fron like you said before. If the behavoir I think is happening, then 'trim should just be used, not letting it be automatic | |
Anton: 18-Mar-2005 | I am guessing the logic behind FORM is that it changes mode at the first non-empty string. | |
Pekr: 18-Mar-2005 | Anton - it does not matter imo. It is design of 'form or 'print, that those add spaces between chars, but once you put empty string into block, it is value, and the value is empty string, so it is imo incorrect to want it represent space | |
Anton: 18-Mar-2005 | Pekr, look at this example. There are five items in the block (some are empty strings). So I expect five items to be separated by four spaces. form ["" 1 "" 2 ""] ;== "1 2 " ; <<<< but I count only three spaces in the result | |
Anton: 21-Mar-2005 | Undecided about FORM.... | |
Gabriele: 21-Mar-2005 | Anton: I have no idea if the FORM behavior is intentional or a bug. about detect: maybe the difference is due to copy&paste? | |
Group: Core ... Discuss core issues [web-public] | ||
Sunanda: 30-Dec-2004 | Best way? I don't know. Assuming only a single letter followed by an integer, I'd do this: print mold sort/compare [ A14 A2 B300] func [a b][ return (to-integer next form a) < to-integer next form b] | |
Volker: 30-Dec-2004 | blk: head reverse [ A14 A2 B300] out: copy[] foreach w blk[repend out [to-integer next form w w]] probe extract next sort/skip out 2 2 | |
Cyphre: 14-Jan-2005 | shadwolf: I think you only need to write one global function which will convert you rebol block of chosen datatype into binary! form...this way you can pass any content to C side... | |
Group: Script Library ... REBOL.org: Script library and Mailing list archive [web-public] | ||
btiffin: 30-Apr-2007 | %datascreen.r %screening.r? Naming is fun. %filtered-import.r is nice too. Note to everybody: If you haven't, check out Chris's %form-date.r, newly in the library... Chris's func'ies are funky, and a nice learn. | |
btiffin: 19-Jul-2007 | For everybody...no more mucking with date formatting... Use Chris' %form-date.r from the library. form-date now/precise "%c" full REBOL timestamps nicely formatted. "%s" added for seconds with nanosecond precision. (Precision...not accuracy) All your dates and times can line up now. :) | |
Sunanda: 13-Mar-2009 | Results of a tiny bit of debugging on the ascii chars problem: -- problem seems to be at the input stage: -- if you have exended ascii characters (top bit set, like the 1/4 used in the script) what we get from the webserver is bad (extra, unexpected extended ascii chars) -- only download is (visibly) affected, although the extra extended ascii chars are present in the text streams -- though there is some REBOL mezz code (decode-cgi) that may be doing something I do not understand -- I can replicate the problem with both Apache and Xitami which suggests the problem may be in REBOL rather than a given server. -- the quick fix would be to add accept-charset="ISO-8859-1" to the <form ....> or <textarea ....> -- but that stops all extended ascii, including the ones we want. So we won't do that. -- the slower fix has yet to emerge from the available options. | |
sqlab: 14-Apr-2009 | Mike I checked your library example from the I'm new group producing errors. There is probably a weakness, as the script does not regard comment lines. A short enhancement would be parse-ini-file: func [ file-name [file!] /local ini-block current-section parsed-line section-name ][ ini-block: copy [] current-section: copy [] foreach ini-line read/lines file-name [ if #";" <> first ini-line [ ; do not process comment lines section-name: ini-line error? try [section-name: first load/all ini-line] either any [ error? try [block? section-name] not block? section-name ][ parsed-line: parse/all ini-line "=" append last current-section parsed-line/1 append last current-section parsed-line/2 ][ append ini-block current-section current-section: copy [] append current-section form section-name append/only current-section copy [] ] ;; either ] ] ;; for append ini-block current-section return to-hash ini-block ] | |
shadwolf: 16-Jan-2011 | I just submitted to rebol.org a 4 line script and it took me 1 hour is it normal to spend 1 hours on the header formating for just a copy past ? Can't we in 2011 get ride of it and have a form that you fill and generate the header for your script ? This is the numberone pain in the ass thing that makes me vomit each time i use rebol.org .... | |
Group: I'm new ... Ask any question, and a helpful person will try to answer. [web-public] | ||
Anton: 14-Apr-2006 | page: read http://www.rebol.com images: copy [] use [whsp ws non-end-tag strd p1 p2 delim non-delim][ whsp: charset " ^-^/" ; whitespace ws: [any whsp] ; a rule for any number of whitespace characters non-end-tag: complement charset ">" ; all characters except ">" strd: charset {"'} ; string delimiters, double and single quote parse/all page [ any [ thru "<img" whsp [ any [ ws "src" ws "=" ws p1: [strd (delim: form p1/1) | (delim: ">")] (non-delim: complement union whsp charset delim) p1: any non-delim p2: (append images copy/part p1 p2) ; keep the url | non-end-tag ] ] | skip ] ] ] new-line/all images on ; add hidden newlines to the images block so it molds nicely print mold images | |
Anton: 14-Apr-2006 | page: read http://www.rebol.com ; special test cases from Alek_K ;page: {<img src="one two.jpg">} ; OK ;page: {<img alt="picture" src=one.jpg />} ; OK images: copy [] use [whsp ws non-end-tag strd wh- non-str-delim p1 p2 delim non-delim][ whsp: charset " ^-^/" ; whitespace ws: [any whsp] ; a rule for any number of whitespace characters non-end-tag: complement charset ">" ; all characters except ">" strd: charset {"'} ; string delimiters, double and single quote wh-: charset "^-^/" ; whitespace minus the space character (space is allowed inside a quoted string) non-str-delim: complement union whsp charset ">" parse/all page [ any [ thru "<img" whsp [ any [ ws "src" ws "=" ws ;p1: [strd (delim: form p1/1) | (delim: ">")] (non-delim: complement union whsp charset delim) p1: [strd (non-delim: complement union wh- charset form p1/1) | (non-delim: non-str-delim)] p1: any non-delim p2: (append images copy/part p1 p2) ; keep the url | non-end-tag ] ] | skip ] ] ] new-line/all images on ; add hidden newlines to the images block so it molds nicely print mold images | |
Group: Make-doc ... moving forward [web-public] | ||
Chris: 10-Jan-2005 | As I see it, I don't think you can apply the same rigour of a structured format to that of a free-form text format -- there simply has to be some level of user forgiveness, otherwise we need to create an even higher level format... | |
Group: MySQL ... [web-public] | ||
DideC: 25-Feb-2005 | Actually, I : - select the lines form Products table - Loop on the result to INSERT each line in the Commands table, with IGNORE option to not replacing already there line. - Loop again on the Commands line to UPDATE the quantity | |
Group: Syllable ... The free desktop and server operating system family [web-public] | ||
Kaj: 14-Nov-2005 | I know how you feel, though. I also have the tendency to feel my way through the installation and did it several times in the beginning to form a mental picture of it | |
Kaj: 28-Dec-2005 | Oh yes, I gave some overview that isn't readily available in such a compact form | |
Group: Linux ... [web-public] group for linux REBOL users | ||
Kaj: 2-Jun-2006 | Unfortunately, the shebang is the wrong way around in the REBOL manual. The best form to use is | |
Group: !Readmail ... a Rebol mail client [web-public] | ||
PhilB: 21-Apr-2005 | Hi Fabrice .... the format of the locale.r has changed in release 4.7.12 (for securty purposes) It should now be of the form ... REBOL [ Title: "Test Locale" Date: 31-Dec-2004/18:00:00 ] gm_about: "About" gm_Accounts: "Accounts" gm_Contacts: "Contacts" So you just need to remove the gv_locale/ from your code | |
Group: SDK ... [web-public] | ||
Volker: 11-Apr-2005 | view lay: layout[ button "title-time" 300[ lay/text: form now lay/changes: 'text show lay ] ] | |
Group: !RebGUI ... A lightweight alternative to VID [web-public] | ||
Gregg: 5-Mar-2005 | As long as there is a glossary that let's you translate from familiar terms, I think you're OK using REBOL's native terms, though they were foreign to me when I started. Window or dialog? Or Screen or Form or Layout. A Dialog is usually something other than the main screen in an app. You sometimes need to use all those terms if you're speaking in the domain of an application, so use wha'ts appropriate in each context. Face or graphical object? Or Control or Widget. Tough call on this one. I was used to Control from VB, and Face confused me as it could be a layout as well. I like distringuishing between layouts and controls. Hmmm Maybe a hierarchical tree. Facet, attribute, property or descriptor? I like either Attribute or Property. I can live with Facet in REBOL, it's shorter, and it makes sennse if you think in terms like "let's discuss this facet of the business". Style, widget or template? Style, definitely. | |
Ashley: 10-Mar-2005 | Vincent: rate suggestion ... done (overlooked in 0.1.3) Robert: Will the splitter be integrated into the next release? ... Yes Pekr: "I want full OS compliancy in behavior" ... which OS and what skin? Ammon: "RebGUI is ..." ... spot on, and I like that sentence so much I'll add it in some shape or form to the main page ;) | |
Robert: 25-Mar-2005 | list (single or multi column): I once have hired Cyphre to create a style for me. Very useful and powerful. If someone is interested I can provide the code as a starting point (or at least as idea pool). You can find some documentation for it on my homepage under project data-form dialect. | |
Pekr: 31-Mar-2005 | Rebol is so much free-form, that with something like VID, componentised (shared) feels, etc., you can get yourself into trouble and VID starts to look like a bit bloated, although it is really to say such thing about anything rebol related ... | |
Pekr: 31-Mar-2005 | What I am really pedant upon is proper system-like "behavior". I mean mainly keyboard .... I would like RebGUI having good tabbing functionality, even nested one (although now I don't know if other IDEs you program your apps in allow it, but imo yes) - imagine having table/grid on your screen, but also few fields and buttons. I want to shift focus to grid, and then I want arrow keys, insert, delete key to work in terms of grid, not whole form. Then there should be kind of "escape key", which will jump-off the grid and focus will be on whole form ... | |
Brock: 9-Apr-2005 | Since you are also responsible for RebForms maybe this can be a feature request. In .Net, you can have a form Validation Control, that confirms all of the validation checks on the fields of the form. You are also allowed to indicate for each form element, whether it is to be included in the form-level validation or not (ie, free form text fields typically don't need validation). | |
Group: !Uniserve ... Creating Uniserve processes [web-public] | ||
Graham: 5-Mar-2005 | REBOL [ Title: "SMTP daemon" Author: "Graham Chiu" Version: 0.0.1 Date: 5/3/2005 ] install-service [ name: 'smtp port-id: 25 multi-line-end: rejoin [crlf #"." crlf] stop-at: crlf server: make object! [ user-data: none ] maildir: %mail/ ; store mail here save-mail: func [ data /local mailbox ][ if not dir? mailbox: rejoin [ maildir server/user-data/email "/" ] [ if not exists? join maildir %misc/ [ mailbox: make-dir join maildir %misc/ ] ] if not exists? join mailbox "mail.txt" [ write join mailbox "mail.txt" "" ] write/append join mailbox "mail.txt" join crlf to-string data print dehex data ] on-new-client: has [su] [ su: server/user-data: context [ state: copy "command" email: none ] stop-at: crlf write-client join "220 mail.compkarori.co.nz SMTP" crlf ] smtp-rule: [ "HELO" thru newline ( write-client join "250 mail.compkarori.co.nz SMTP" crlf ) | "EHLO" thru newline ( write-client join "500 not implemented" crlf ) | "MAIL" thru newline ( write-client join "250 OK MAIL FROM" crlf) | "QUIT" thru newline ( write-client join "221 Good Bye" crlf close-client) | "RSET" thru newline ( write-client join "250 OK RESET" crlf server/user-data/state: copy "command" ) | "NOOP" thru newline ( write-client join "250 OK NOOP" crlf ) | "VRFY" thru newline ( write-client join "252 send some mail, i'll try my best" crlf ) | "EXPN" thru newline ( write-client join "500 not implemented" crlf ) | "RCPT" [ thru "<" | thru ": " ] copy name to "@" thru newline ( server/user-data/email: form name write-client join "250 OK RCPT TO" crlf ) | "DATA" thru newline ( stop-at: multi-line-end server/user-data/state: copy "body" ) ] on-received: func [data /local su] [ su: server/user-data print join "Data: " data switch su/state [ "command" [ if not parse data smtp-rule [ write-client join "500 command not understood" crlf ] ] "body" [ ; reject if we don't have a RCPT command first if none? su/email [ write-client join "500 no email address received" crlf stop-at: crlf su/state: copy "command" return ] ; write the body of the message somewhere save-mail rejoin [ "Received: from somewhere at " to-idate now newline dehex data newline newline ] stop-at: crlf write-client join "250 OK MAIL received" crlf su/state: "command" su/email: none ] ] ] ] | |
Graham: 5-Mar-2005 | REBOL [ Title: "SMTP daemon" Author: "Graham Chiu" Version: 0.0.2 Date: 5/3/2005 ] install-service [ name: 'smtp port-id: 25 multi-line-end: rejoin [crlf #"." crlf] stop-at: crlf server: make object! [ user-data: none ] clear-server: server/user-data [ state: "command" email: computer: none ] maildir: %mail/ ; store mail here domains: [ "@compkarori.co.nz" ] ; list of accepted domains save-mail: func [ data /local mailbox ][ if not dir? mailbox: rejoin [ maildir server/user-data/email "/" ] [ if not exists? mailbox: join maildir %misc/ [ mailbox: make-dir join maildir %misc/ ] ] if not exists? join mailbox "mail.txt" [ write join mailbox "mail.txt" "" ] write/append join mailbox "mail.txt" join crlf to-string data ; print dehex data ] on-new-client: has [su] [ su: server/user-data: context [ state: copy "command" email: computer: none ] stop-at: crlf write-client join "220 mail.compkarori.co.nz SMTP" crlf ] smtp-rule: [ "HELO" copy name thru newline ( write-client join "250 mail.compkarori.co.nz SMTP" crlf if not none? name [ trim/head/tail name ] server/user-data/computer: form name ) | "EHLO" thru newline ( write-client join "500 not implemented" crlf ) | "MAIL" thru newline ( write-client join "250 OK MAIL FROM" crlf) | "QUIT" thru newline ( write-client join "221 Good Bye" crlf close-client) | "RSET" thru newline ( write-client join "250 OK RESET" crlf clear-server ) | "NOOP" thru newline ( write-client join "250 OK NOOP" crlf ) | "VRFY" thru newline ( write-client join "252 send some mail, i'll try my best" crlf ) | "EXPN" thru newline ( write-client join "500 not implemented" crlf ) | "RCPT" [ thru "<" | thru ": " ] copy name to "@" copy domain to ">" thru newline ( either find domains domain [ server/user-data/email: form name write-client join "250 OK RCPT TO" crlf ][ write-client join "553 sorry, that domain is not in my list of allowed rcpthosts" crlf server/user-data/email: none ] ) | "DATA" thru newline ( stop-at: multi-line-end server/user-data/state: copy "body" write-client join "354 start mail input" crlf ) ] on-received: func [data /local su] [ su: server/user-data ; print join "Data: " data switch su/state [ "command" [ if not parse data smtp-rule [ write-client join "500 command not understood" crlf ] ] "body" [ ; reject if we don't have a RCPT command first if none? su/email [ write-client join "500 no email address received" crlf stop-at: crlf su/state: copy "command" return ] ; write the body of the message somewhere save-mail rejoin [ "Received: from " su/computer " ( " su/computer " [ " client/remote-ip " ]) " to-idate now newline dehex data newline newline ] stop-at: crlf write-client join "250 OK MAIL received" crlf su/state: "command" su/email: none ] ] ] ] | |
Graham: 5-Mar-2005 | After repeated testing, I have bumped up the version to 0.1.0 at http://www.compkarori.com/vanilla/display/Smtpd.r As explained in the URI, a form of teergrubbing ( anti-spam ) is implemented. | |
Dockimbel: 17-Mar-2005 | This might be useful to a lot of non-techie users. (Just a single exe file with a minimal form for login/pass). | |
Terry: 7-Oct-2005 | I have another question though.. with the httpd service, where is the actual data? I get the headers, and i get the length of the data, but not the actual binary.. im submitting a form using POST... GET is fine. | |
Terry: 7-Oct-2005 | when i submit a basic form.. the only binary i receive is "POST / HTTP/1.1".. none of the other values? | |
MikeL: 31-Aug-2006 | Thanks Will. I would like to see how to put together a simple web form application that posts to a Uniserve script and provides an acceptance message. When I looked at Uniserve I couldn't see how this simple thing could be done and how / which services to use. Do you have a "Hello World" level example that follows that post/reply approach? | |
Will: 1-Sep-2006 | Hello Name example: <% validate [name -]%> <html> <body> <% either request/var/name [ print [{Hello} request/var/name] ][ print {<form method="POST" action="test.rsp"> <input type="text" name="name"> </form>}] %> </body> </html> | |
Group: XML ... xml related conversations [web-public] | ||
Maxim: 22-Mar-2006 | 693 kb in xml form ==> 90 kb in nested rebol blocks | |
Allen: 12-Apr-2006 | I think that might be why the microformats are taking off. They use XML in its simplest, intended form. | |
Chris: 9-Nov-2008 | The web and soap/http are in a sense REST applications (REST is just WS over HTTP) though both use a limited subset of REST arguments and have to work around as such. The web is limited (by the HTML spec) to the verbs 'get and 'post, and post content types of 'application/x-www-form-urlencoded (default) or 'multipart/form-data (used to upload files). For the most part, the web is RESTful as we usually only want to 'get resources. However, other operations typically violate REST principles, as all other resource actions (create, update, delete) have to squeeze through the get/post/url-encode/multipart pipe. The Rebol HTTP protocol as standard is designed to mimic this and requires patching to move beyond get/post/url-endode (even for multipart) SOAP as I understand it, when using HTTP only uses 'post - the post content contains the actual request. Where it varies from the web (and Rebol HTTP) is the need for the 'text/xml content type. REST itself is limited only by HTTP. It uses theoretically limitless HTTP (v1.1) verbs (though most common patterns use 'get, 'put, 'post and 'delete). It uses any encoding. It uses HTTP headers as parameters (eg. the 'Accept header specifies the desired return type). Therefore, any HTTP protocol designed for REST will accomodate SOAP requests. | |
Gabriele: 10-Nov-2008 | ashley, look at the source for the page, and search for the <form> tag. if method="GET", as Tom said, look at the url after pressing the submit button and just do a read on a similarly composed url. if method="POST", you need to look at all the <input> tags, figure out what the query string would be, and send it via POST using read/custom. (you could also use wireshark or similar to look at the query string the browser is sending if you don't want to look for the <input> tags) | |
Maxim: 23-Jun-2009 | yes, the best method is to have some form of dtd or schema, and use class-based objects. | |
Graham: 24-Jun-2009 | ie. I load a serialized form of the object | |
Graham: 28-Jun-2009 | fix-object: func [ obj [object!] /local prev ][ foreach element next first obj [ if object? o: get in obj element [ ; is object, so check to see if has value? either "value?" = form next first o [ set in obj element trim/head/tail get in o 'value? ][ fix-object o ] ] ] ] this fixes up the object created by xml-to-object | |
Gregg: 2-Jan-2010 | I believe Maarten has done a SAX style parser. I've used parse-xml in the past, sometimes post-processing the output to a different REBOL form, but my needs were simple. Janko, have you tested any of the existing soluitions, with test input on target hardware, and found them to be too slow? If so, what were the results, and how fast do you need it to be? | |
Maxim: 2-May-2011 | anyone here had issues with receiving Form feed characters in XML (which are illegal in XML 1.0) ? | |
Group: DevCon2005 ... DevCon 2005 [web-public] | ||
MichaelB: 15-Jun-2005 | How does the sending of the DevCon form work. There's written it will be send via e-mail. When I use Opera (my mailer) it just opens the empty mailer and the IE wants to use Outlook what's not configured. Is there another way to send the Survey without making it too hard for you Gabriele ? (copy the information in the mail ....) | |
Gabriele: 16-Jun-2005 | Michael: form result should go to email automatically. you can send me a mail manually if you want. if there's a problem for enough people with the email form, i'll look into setting up a cgi. | |
Gabriele: 16-Jun-2005 | btw, everyone feel free to submit the form even if you are not sure about your answers. it's just getting a mail to me so if you change idea you can just send me another one or send me a note manually. | |
Graham: 16-Jun-2005 | You don't need cgi either, you can use set-net [ "form" 216.40.214.39 ] in your script, and then 'send the results to you. | |
Graham: 16-Jun-2005 | I guess it should be set-net [ "form" "motoko.rebol.it" ] | |
Group: SVG Renderer ... SVG rendering in Draw AGG [web-public] | ||
shadwolf: 23-Jun-2005 | REBOL [ Title: "SVG Demo" Owner: "Ashley G. Trüter" Version: 0.0.1 Date: 21-Jun-2005 Purpose: "Loads and displays a resizeable SVG file." History: { 0.0.1 Initial release } Notes: { Tested on very simple SVG icons Only a few basic styles / attributes / commands supported Does not handle sizes in units other than pixels (e.g. pt, in, cm, mm, etc) SVG path has an optional close command, "z" ... AGG shape equivalent auto-closes load-svg function needs to be totally refactored / optimized ... *sample only* } ] ; The following commands are available for path data: ; ; M = moveto ; L = lineto ; H = horizontal lineto ; V = vertical lineto ; C = curveto ; S = smooth curveto ; Q = quadratic Belzier curve ; T = smooth quadratic Belzier curveto ; A = elliptical Arc ; Z = closepath ;print: none ; comment out this line to enable debug messages load-svg: function [svg-file [file! string!] size [pair!]] [ id defs x y to-color to-byte draw-blk append-style svg-size scale-x scale-y ][ xml: either string? svg-file [parse-xml svg-file] [ unless %.svg = suffix? svg-file [to error! "File has an invalid suffix!"] parse-xml read svg-file ] unless xml/3/1/1 = "svg" [to error! "Could not find SVG header!"] ;unless find ["id" "xmlns"] xml/3/1/2/1 [to error! "Could not find ID header!"] ;unless xml/3/1/3/1/1 = "defs" [to error! "Could not find DEFS header!"] id: xml/3/1/2 defs: xml/3/1/3 ; ; --- Parse SVG id ; svg-size: either find ["32pt" "48pt" "72pt"] select id "width" [ switch select id "width" [ "72pt" [120x120] "48pt" [80x80] "32pt" [60x60] ] ][ as-pair to integer! any [select id "width" "100"] to integer! any [select id "height" "100"] ] x: to integer! any [select id "x" "0"] y: to integer! any [select id "y" "0"] scale-x: size/x / svg-size/x scale-y: size/y / svg-size/y ; ; --- Helper functions ; to-color: func [s [string!]] [ ; converts a string in the form "#FFFFFF" to a 4-byte tuple to tuple! load rejoin ["#{" next s "00}"] ] to-byte: func [s [string!]] [ ; converts a string with a value 0-1 to an inverted byte 255 - to integer! 255 * to decimal! s ] ; ; --- Parse SVG defs ; draw-blk: copy [] append-style: function [ command [string!] blk [block!] ][ x xy pen-color fill-color line-width mode size radius shape closed? matrix transf-command ][ xy: 0x0 size: 0x0 line-width: 1 matrice: make block! [] radius: none transf-command: none foreach [attr val] blk [ switch attr [ "transform" [print "tranform have been found" ;probe val halt val: parse val "()," transf-command: first val probe transf-command switch transf-command [ "matrix" [ foreach word val [ if not find word "matrix" [ insert tail matrice to-decimal word ] ] ] ] ] "style" [ foreach [attr val] parse val ":;" [ switch/default attr [ "font-size" [ ] "stroke" [ switch/default first val [ #"#" [pen-color: to-color val] #"n" [pen-color: none] ][ print ["Unknown stroke:" val] ] ] "stroke-width" [line-width: to decimal! val] "fill" [ fill-color: switch/default first val [ #"#" [to-color val] #"n" [none] ][ print ["Unknown fill value:" val] none ] ] "fill-rule" [ mode: switch/default val [ "evenodd" ['even-odd] ][ print ["Unknown fill-rule value:" val] none ] ] "stroke-opacity" [pen-color: any [pen-color 0.0.0.0] pen-color/4: to-byte val] "fill-opacity" [fill-color: any [fill-color 0.0.0.0] fill-color/4: to-byte val] "stroke-linejoin" [ insert tail draw-blk switch/default val [ "miter" [compose [line-join miter]] "round" [compose [line-join round]] "bevel" [compose [line-join bevel]] ][ print ["Unknown stroke-linejoin value:" val] none ] ] "stroke-linecap" [ insert tail draw-blk 'line-cap insert tail draw-blk to word! val ] ][ print ["Unknown style:" attr] ] ] ] "x" [xy/x: scale-x * val] "y" [xy/y: scale-y * val] "width" [size/x: scale-x * val] "height" [size/y: scale-y * val] "rx" [print "rx"] "ry" [radius: to decimal! val] "d" [ shape: copy [] x: none closed?: false foreach token load val [ switch/default token [ M [insert tail shape 'move] C [insert tail shape 'curve] L [insert tail shape 'line] z [closed?: true] ][ unless number? token [print ["Unknown path command:" token]] either x [insert tail shape as-pair x scale-y * token x: none] [x: scale-x * token] ] ] ] ] ] insert tail draw-blk compose [ pen (pen-color) fill-pen (fill-color) fill-rule (mode) line-width (line-width * min scale-x scale-y) ] switch command [ "rect" [ insert tail draw-blk compose [box (xy) (xy + size)] if radius [insert tail draw-blk radius] ] "path" [ unless closed? [print "Path closed"] either transf-command <> none [ switch transf-command [ "matrix" [insert tail draw-blk compose/only [ (to-word transf-command) (matrice) shape (shape) reset-matrix]] ] ][ insert tail draw-blk compose/only [shape (shape)] ] ] "g" [ print "Write here how to handle G insertion to Draw block" insert tail draw-blk probe compose/only [reset-matrix (to-word transf-command) (matrice)] ] ] ] probe defs foreach blk defs [ switch first blk [ "rect" [append-style first blk second blk] "path" [append-style first blk second blk] "g" [ print "key word" probe first blk print "matrix and style in G" probe second blk append-style first blk second blk ;print "what to draw in G" probe third blk foreach blk2 third blk [ probe blk2 switch first blk2[ "path" [append-style first blk2 second blk2] ] ] ] ] ] probe draw-blk draw-blk ] view make face [ offset: 100x100 size: 200x200 action: request-file/filter/only "*.svg" text: rejoin ["SVG Demo [" last split-path action "]"] data: read action color: white effect: compose/only [draw (load-svg data size)] edge: font: para: none feel: make feel [ detect: func [face event] [ if event/type = 'resize [ insert clear face/effect/draw load-svg face/data face/size show face ] if event/type = 'close [quit] ] ] options: [resize] ] | |
shadwolf: 23-Jun-2005 | REBOL [ Title: "SVG Demo" Owner: "Ashley G. Trüter" Version: 0.0.1 Date: 21-Jun-2005 Purpose: "Loads and displays a resizeable SVG file." History: { 0.0.1 Initial release } Notes: { Tested on very simple SVG icons Only a few basic styles / attributes / commands supported Does not handle sizes in units other than pixels (e.g. pt, in, cm, mm, etc) SVG path has an optional close command, "z" ... AGG shape equivalent auto-closes load-svg function needs to be totally refactored / optimized ... *sample only* } ] ; The following commands are available for path data: ; ; M = moveto ; L = lineto ; H = horizontal lineto ; V = vertical lineto ; C = curveto ; S = smooth curveto ; Q = quadratic Belzier curve ; T = smooth quadratic Belzier curveto ; A = elliptical Arc ; Z = closepath ;print: none ; comment out this line to enable debug messages load-svg: function [svg-file [file! string!] size [pair!]] [ id defs x y to-color to-byte draw-blk append-style svg-size scale-x scale-y ][ xml: either string? svg-file [parse-xml svg-file] [ unless %.svg = suffix? svg-file [to error! "File has an invalid suffix!"] parse-xml read svg-file ] unless xml/3/1/1 = "svg" [to error! "Could not find SVG header!"] ;unless find ["id" "xmlns"] xml/3/1/2/1 [to error! "Could not find ID header!"] ;unless xml/3/1/3/1/1 = "defs" [to error! "Could not find DEFS header!"] id: xml/3/1/2 defs: xml/3/1/3 ; ; --- Parse SVG id ; svg-size: either find ["32pt" "48pt" "72pt"] select id "width" [ switch select id "width" [ "72pt" [120x120] "48pt" [80x80] "32pt" [60x60] ] ][ as-pair to integer! any [select id "width" "100"] to integer! any [select id "height" "100"] ] x: to integer! any [select id "x" "0"] y: to integer! any [select id "y" "0"] scale-x: size/x / svg-size/x scale-y: size/y / svg-size/y ; ; --- Helper functions ; to-color: func [s [string!]] [ ; converts a string in the form "#FFFFFF" to a 4-byte tuple to tuple! load rejoin ["#{" next s "00}"] ] to-byte: func [s [string!]] [ ; converts a string with a value 0-1 to an inverted byte 255 - to integer! 255 * to decimal! s ] ; ; --- Parse SVG defs ; draw-blk: copy [] append-style: function [ command [string!] blk [block!] ][ x xy pen-color fill-color line-width mode size radius shape closed? matrix transf-command ][ xy: 0x0 size: 0x0 line-width: 1 matrice: make block! [] radius: none transf-command: none foreach [attr val] blk [ switch attr [ "transform" [print "tranform have been found" ;probe val halt val: parse val "()," transf-command: first val probe transf-command switch transf-command [ "matrix" [ foreach word val [ if not find word "matrix" [ insert tail matrice to-decimal word ] ] ] ] ] "style" [ foreach [attr val] parse val ":;" [ switch/default attr [ "font-size" [ ] "stroke" [ switch/default first val [ #"#" [pen-color: to-color val] #"n" [pen-color: none] ][ print ["Unknown stroke:" val] ] ] "stroke-width" [line-width: to decimal! val] "fill" [ fill-color: switch/default first val [ #"#" [to-color val] #"n" [none] ][ print ["Unknown fill value:" val] none ] ] "fill-rule" [ mode: switch/default val [ "evenodd" ['even-odd] ][ print ["Unknown fill-rule value:" val] none ] ] "stroke-opacity" [pen-color: any [pen-color 0.0.0.0] pen-color/4: to-byte val] "fill-opacity" [fill-color: any [fill-color 0.0.0.0] fill-color/4: to-byte val] "stroke-linejoin" [ insert tail draw-blk switch/default val [ "miter" [compose [line-join miter]] "round" [compose [line-join round]] "bevel" [compose [line-join bevel]] ][ print ["Unknown stroke-linejoin value:" val] none ] ] "stroke-linecap" [ insert tail draw-blk 'line-cap insert tail draw-blk to word! val ] ][ print ["Unknown style:" attr] ] ] ] "x" [xy/x: scale-x * val] "y" [xy/y: scale-y * val] "width" [size/x: scale-x * val] "height" [size/y: scale-y * val] "rx" [print "rx"] "ry" [radius: to decimal! val] "d" [ shape: copy [] x: none closed?: false foreach token load val [ switch/default token [ M [insert tail shape 'move] C [insert tail shape 'curve] S [insert tail shape 'curv] L [insert tail shape 'line] Q [insert tail shape 'qcurve] T [insert tail shape 'qcurv] z [closed?: true] H [insert tail shape 'hline] V [insert tail shape 'vline] A [insert tail shape 'arc] ][ unless number? token [print ["Unknown path command:" token]] either x [insert tail shape as-pair x scale-y * token x: none] [x: scale-x * token] ] ] ] ] ] insert tail draw-blk compose [ pen (pen-color) fill-pen (fill-color) fill-rule (mode) line-width (line-width * min scale-x scale-y) ] switch command [ "rect" [ insert tail draw-blk compose [box (xy) (xy + size)] if radius [insert tail draw-blk radius] ] "path" [ unless closed? [print "Path closed"] either transf-command <> none [ switch transf-command [ "matrix" [insert tail draw-blk compose/only [ (to-word transf-command) (matrice) shape (shape) reset-matrix]] ] ][ insert tail draw-blk compose/only [shape (shape)] ] ] "g" [ print "Write here how to handle G insertion to Draw block" insert tail draw-blk probe compose/only [reset-matrix (to-word transf-command) (matrice)] ] ] ] probe defs foreach blk defs [ switch first blk [ "rect" [append-style first blk second blk] "path" [append-style first blk second blk] "g" [ print "key word" probe first blk print "matrix and style in G" probe second blk append-style first blk second blk ;print "what to draw in G" probe third blk foreach blk2 third blk [ probe blk2 switch first blk2[ "path" [append-style first blk2 second blk2] ] ] ] ] ] probe draw-blk draw-blk ] view make face [ offset: 100x100 size: 200x200 action: request-file/filter/only "*.svg" text: rejoin ["SVG Demo [" last split-path action "]"] data: read action color: white effect: compose/only [draw (load-svg data size)] edge: font: para: none feel: make feel [ detect: func [face event] [ if event/type = 'resize [ insert clear face/effect/draw load-svg face/data face/size show face ] if event/type = 'close [quit] ] ] options: [resize] ] | |
shadwolf: 23-Jun-2005 | REBOL [ Title: "SVG Demo" Owner: "Ashley G. Trüter" Version: 0.0.1 Date: 21-Jun-2005 Purpose: "Loads and displays a resizeable SVG file." History: { 0.0.1 Initial release } Notes: { Tested on very simple SVG icons Only a few basic styles / attributes / commands supported Does not handle sizes in units other than pixels (e.g. pt, in, cm, mm, etc) SVG path has an optional close command, "z" ... AGG shape equivalent auto-closes load-svg function needs to be totally refactored / optimized ... *sample only* } ] ; The following commands are available for path data: ; ; M = moveto ; L = lineto ; H = horizontal lineto ; V = vertical lineto ; C = curveto ; S = smooth curveto ; Q = quadratic Belzier curve ; T = smooth quadratic Belzier curveto ; A = elliptical Arc ; Z = closepath ;print: none ; comment out this line to enable debug messages load-svg: function [svg-file [file! string!] size [pair!]] [ id defs x y to-color to-byte draw-blk append-style svg-size scale-x scale-y ][ xml: either string? svg-file [parse-xml svg-file] [ unless %.svg = suffix? svg-file [to error! "File has an invalid suffix!"] parse-xml read svg-file ] unless xml/3/1/1 = "svg" [to error! "Could not find SVG header!"] ;unless find ["id" "xmlns"] xml/3/1/2/1 [to error! "Could not find ID header!"] ;unless xml/3/1/3/1/1 = "defs" [to error! "Could not find DEFS header!"] id: xml/3/1/2 defs: xml/3/1/3 ; ; --- Parse SVG id ; svg-size: either find ["32pt" "48pt" "72pt"] select id "width" [ switch select id "width" [ "72pt" [120x120] "48pt" [80x80] "32pt" [60x60] ] ][ as-pair to integer! any [select id "width" "100"] to integer! any [select id "height" "100"] ] x: to integer! any [select id "x" "0"] y: to integer! any [select id "y" "0"] scale-x: size/x / svg-size/x scale-y: size/y / svg-size/y ; ; --- Helper functions ; to-color: func [s [string!]] [ ; converts a string in the form "#FFFFFF" to a 4-byte tuple to tuple! load rejoin ["#{" next s "00}"] ] to-byte: func [s [string!]] [ ; converts a string with a value 0-1 to an inverted byte 255 - to integer! 255 * to decimal! s ] ; ; --- Parse SVG defs ; draw-blk: copy [] append-style: function [ command [string!] blk [block!] ][ x xy pen-color fill-color line-width mode size radius shape closed? matrix transf-command ][ xy: 0x0 size: 0x0 line-width: 1 matrice: make block! [] radius: none transf-command: none foreach [attr val] blk [ switch attr [ "transform" [print "tranform have been found" ;probe val halt val: parse val "()," transf-command: first val probe transf-command switch transf-command [ "matrix" [ foreach word val [ if not find word "matrix" [ insert tail matrice to-decimal word ] ] ] ] ] "style" [ foreach [attr val] parse val ":;" [ switch/default attr [ "font-size" [ ] "stroke" [ switch/default first val [ #"#" [pen-color: to-color val] #"n" [pen-color: none] ][ print ["Unknown stroke:" val] ] ] "stroke-width" [line-width: to decimal! val] "fill" [ fill-color: switch/default first val [ #"#" [to-color val] #"n" [none] ][ print ["Unknown fill value:" val] none ] ] "fill-rule" [ mode: switch/default val [ "evenodd" ['even-odd] ][ print ["Unknown fill-rule value:" val] none ] ] "stroke-opacity" [pen-color: any [pen-color 0.0.0.0] pen-color/4: to-byte val] "fill-opacity" [fill-color: any [fill-color 0.0.0.0] fill-color/4: to-byte val] "stroke-linejoin" [ insert tail draw-blk switch/default val [ "miter" [compose [line-join miter]] "round" [compose [line-join round]] "bevel" [compose [line-join bevel]] ][ print ["Unknown stroke-linejoin value:" val] none ] ] "stroke-linecap" [ insert tail draw-blk 'line-cap insert tail draw-blk to word! val ] ][ print ["Unknown style:" attr] ] ] ] "x" [xy/x: scale-x * val] "y" [xy/y: scale-y * val] "width" [size/x: scale-x * val] "height" [size/y: scale-y * val] "rx" [print "rx"] "ry" [radius: to decimal! val] "d" [ shape: copy [] x: none closed?: false if all [x not number? token] [ insert tail shape x * either token = 'V [scale-y][scale-x] x: none ] foreach token load val [ switch/default token [ M [insert tail shape 'move] C [insert tail shape 'curve] S [insert tail shape 'curv] L [insert tail shape 'line] Q [insert tail shape 'qcurve] T [insert tail shape 'qcurv] z [closed?: true] H [insert tail shape 'hline] V [insert tail shape 'vline] A [insert tail shape 'arc] ][ unless number? token [print ["Unknown path command:" token]] either x [insert tail shape as-pair x scale-y * token x: none] [x: scale-x * token] ] ] ] ] ] insert tail draw-blk compose [ pen (pen-color) fill-pen (fill-color) fill-rule (mode) line-width (line-width * min scale-x scale-y) ] switch command [ "rect" [ insert tail draw-blk compose [box (xy) (xy + size)] if radius [insert tail draw-blk radius] ] "path" [ unless closed? [print "Path closed"] either transf-command <> none [ switch transf-command [ "matrix" [insert tail draw-blk compose/only [ (to-word transf-command) (matrice) shape (shape) reset-matrix]] ] ][ insert tail draw-blk compose/only [shape (shape)] ] ] "g" [ print "Write here how to handle G insertion to Draw block" insert tail draw-blk probe compose/only [reset-matrix (to-word transf-command) (matrice)] ] ] ] probe defs foreach blk defs [ switch first blk [ "rect" [append-style first blk second blk] "path" [append-style first blk second blk] "g" [ print "key word" probe first blk print "matrix and style in G" probe second blk append-style first blk second blk ;print "what to draw in G" probe third blk foreach blk2 third blk [ probe blk2 switch first blk2[ "path" [append-style first blk2 second blk2] ] ] ] ] ] probe draw-blk draw-blk ] view make face [ offset: 100x100 size: 200x200 action: request-file/filter/only "*.svg" text: rejoin ["SVG Demo [" last split-path action "]"] data: read action color: white effect: compose/only [draw (load-svg data size)] edge: font: para: none feel: make feel [ detect: func [face event] [ if event/type = 'resize [ insert clear face/effect/draw load-svg face/data face/size show face ] if event/type = 'close [quit] ] ] options: [resize] ] | |
Group: Sound ... discussion about sound and audio implementation in REBOL [web-public] | ||
Sunanda: 17-Jun-2008 | Can any one help me reply to this question (received via REBOL.org's feedback form)? Thanks! << Where can I find more Hex Code like in psg-ay-3-8910-study.r Please point me to a tool that I can use for development of Sound Code for the AY-3-8910 where I end up with Hex Code that I can then load into EPROMs which would drive the AY-3-8910. Thanks for any help. http://www.rebol.org/cgi-bin/cgiwrap/rebol/view-script.r?script=psg-ay-3-8910-study.r >> | |
Group: Rebol School ... Rebol School [web-public] | ||
JaimeVargas: 4-Apr-2006 | BTW, The interpreter transform the infix form into a prefix form: 1 + 1 is really + 1 1 | |
JaimeVargas: 4-Apr-2006 | On last form is 'MY-WORD (Notice the single quote) it is a way to way to 'quote' a symbol this is useful when doing DATA as CODE. Another major concept in rebol. | |
Anton: 22-Apr-2006 | Ok, so here's my frequency table: 6 compose 5 as-pair 5 func 4 do 3 show 2 all 2 copy 2 find 2 form 2 get 2 in 2 pick 2 print 2 to-image 2 use 1 * 1 + 1 - 1 <> 1 = 1 append 1 bind 1 center-face 1 change 1 clear 1 context 1 do-events 1 either 1 first 1 foreach 1 if 1 join 1 layout 1 load-thru 1 make 1 mold 1 object? 1 reduce 1 remold 1 remove-each 1 repeat 1 second 1 select 1 to-pair 1 to-path 1 view | |
Anton: 22-Apr-2006 | 47 if 35 all 17 func 14 find 13 in 13 not 13 print 12 do 12 either 12 get 10 = 10 next 9 clear 9 exit 9 insert 9 pick 8 compose 7 any 6 foreach 6 mold 6 tail? 5 - 5 as-pair 5 last 5 none? 5 object? 5 paren? 4 head 4 reduce 4 show 4 while 3 break 3 copy 3 remold 3 remove 3 same? 3 tail 3 use 2 * 2 + 2 <> 2 context 2 forall 2 form 2 make 2 prin 2 return 2 set 2 to-image 2 to-time 2 view | |
denismx: 5-May-2006 | I have the feeling that would be a very good starting point. I'm a little hazy on what is offered for parsing in Rebol at the moment. I'll look into that next. I think that once you have read a file into memory, it is in block form and you can use natives like "first", "next", "find" and so on on it. If so, then I would be going that way for sure. | |
Group: Tech News ... Interesting technology [web-public] | ||
Allen: 22-Mar-2006 | http://www.podiobooks.com/Serialised Audio Books. Interesting to see serialised form revisited, Much of Dickens and H.G Wells work was originally serialized in magazines & newspapers long before they became popular Novels. | |
Group: !RebDB ... REBOL Pseudo-Relational Database [web-public] | ||
Ashley: 8-Feb-2006 | Data structure makes sense, what's the problematic SQL statement? (in its simplest form) | |
Ashley: 8-Feb-2006 | Stick to basic JOIN syntax in the form: select b.name, b.address from a, b where a.id = b.id and ... those INNER JOIN and LEFT OUTER JOIN statements are unfamiliar to me and I get a headache just looking at them. ;) | |
Ashley: 11-Feb-2006 | Thanks guys, I've had a good look at both implementations and I've got ideas from both for a future full JOIN implementation; but at the moment my master/detail code has come along nicely. I've now enhanced the db-select function to accept statements in these additional forms: select * from master joins [select * from details where &id] on id select * from master joins [select * from details where [all [master-id = &id master-date = &date]] on [id date] which works exactly like a normal join with the following differences: a) It can only join one table to another b) Detail columns are always joined to the right of master columns c) Table.column prefixes are not supported so all columns in the join must be uniquely named Apart from that you get all the benefits of db-select (can replace * with specific column combinations, order and group by on the final result set, etc) *and* it's significantly faster than even the raw REBOL code example I gave before (as the SQL is parsed once within db-select and all loop sub-selects are done in-line). I've also implemented “lookups” with the following form: select * from table replaces id with name select * from table replaces [id-1 id-2] with [table-1 table-2] which performs a highly optimized db-lookup for each replaced value, but has the following restrictions: a) The lookup expects lookup tables in the form [id label other-column(s)] b) Only single-key lookups are supported c) A lookup that fails will replace the column value with none! I'm now in the process of benchmarking these changes against sqlite to see where the bottlenecks (if any) are. Feedback on the design decisions is welcome. While I was doing this, I was once again reminded how cumbersome it is to construct SQL statements (not just for RebDB, same goes for the other SQL protocols), as the heavy use of 'compose, 'rejoin, etc adds noise that reduces legibility. The design goal is to provide alternatives to: sql compose/deep [select * from table where [all [col1 = (val1) col2 = (val2)]]] so for a start the 'sql function should probably accept a string, to allow: sql join “select * from “ table type constructs; but this doesn't make the first example easier. So how about the 'sql function accept a block containing a string statement followed by a number of substitution variables, as in: sql reduce [“select * from table where [all [col1 = &1 col2 = &2]]” val1 val2] which makes things a bit more readable (and shortens the expression if longer word names are used multiple times). So the two questions here are: a) Is this a good idea? b) If so, what substitution character (& % $ @ other) will cause the least conflict with REBOL and/or SQL? | |
Ashley: 9-Mar-2006 | See my post from 12-Feb. The answer to "noise" is substitution variables (as it's a form of expression more familiar to long time SQLers). Also, I've never liked the idea of performing an operation (be it 'compose, 'reduce, 'copy, etc) that takes away that choice from the coder ... someone may use statements that *never* need to be composed and they shouldn't have to carry that cost just because some else needs it. | |
Ashley: 18-Jun-2006 | Almost there, needs to be in the form: db-select/where * my-table [find string-column "string"] | |
Group: SQLite ... C library embeddable DB [web-public]. | ||
Ashley: 13-Feb-2006 | sqlite3-protocol.r has a minor bug whereby locals/cols are not cleared. Fix is to add a "clear cols" at the beginning of the ' sqlite-exec func. Two other changes I made to this function were: 1) Changing “SQLITE_TEXT [any [attempt [load val: sqlite3/column_text stmt j] val]]” so as REBOL values are returned, and 2) Removing the /only clause from "system/words/insert/only tail result col" for those that prefer flat data structures (i.e. non-blocked records) Finally, a simple wrapper makes the whole thing more usable: context [ db: none set 'open-db func [name [file!]] [ db: open join sqlite://localhost/ name ] set 'close-db does [ close db ] set 'describe func ['table [word!]] [ insert db rejoin ["select type, name, sql from sqlite_master where upper(tbl_name) = '" uppercase form table "' order by rootpage"] db/locals/sqlresult ] set 'sql function [arg [string! block!]] [statement] [ case [ string? arg [insert db arg] string? first arg [ statement: copy first arg repeat i -1 + length? arg [ replace/all statement join ":" i pick arg i + 1 ] insert db statement ] ] db/locals/sqlresult ] ] which lets you do stuff like: >> open-db %test.db >> sql "create table t1 (col1 INTEGER, col2 TEXT)" == [] >> describe t1 == [table t1 "CREATE TABLE t1 (col1 INTEGER, col2 TEXT)"] >> sql reduce ["insert into t1 values (1,':1')" now/date] == [] >> sql "select * from t1" == [1 13-Feb-2006] >> close-db | |
Pekr: 13-Feb-2006 | I also hope sqlite will allow "free form" data storage, so I don't need to define length of text fields etc :-) That is the feature I like about rebdb .... | |
Ashley: 1-Mar-2006 | REBOL supports a maximum of 16 callbacks; so to avoid this error don't do %sqlite.r more than once within a script (and there is no sensible reason to do so anyway). As for strings, remember that the driver mold's them; so they are actually stored as "string" (inclusive of quotes). You can reference them in one of two ways: sql {select * from table where col = '"string"'} or sql ["select * from table where col = ?" "string"] The second form is preferred as the binding is handled for you by the driver. I'm in the process of writing a SQLite Driver Guide (that covers this and other tricks) but it's a week or two away at the moment. | |
Ashley: 16-Mar-2006 | Pekr, for an explanation of string vs block see the "Using the Driver" section of: http://www.dobeash.com/SQLite/DriverGuide/ The various refinements (including /direct) are covered earlier in the document under "Database access functions". Jaime: the type? change relates to a problem with "type? ... switch ... #[datatype ..." vs "type?/word ... switch ... integer! ..." as the first form is not compatible with encap. | |
Ashley: 16-Mar-2006 | Hmm, adding /direct to the example posted previously and changing the last part of the INSERT to "... form $1 1 form $1 * 1" seems to work properly (100 error-free runs so far). The *only* difference then is in this line of the value binding logic: unless direct [val: mold/all val] which if you change it to something like: unless direct [p: mold/all val] *bind-text sid i p length? p 0 seems to handle more runs before a failure. Thinking that mold/all might be the problem I then reran my /direct test with the following SQL statement: SQL reduce ["insert into t values (?,?,?,?,?)" 1 mold/all reform ["A" 1] mold/all $1 1 mold/all $1 * 1] which is functionally equivalent to the failing statement ... but no failures (after 100 runs). So, the conditions needed to reproduce this error [so far] are: SQLite library INSERT statement using a particular sequence of bind variables MOLD/ALL coded / used in a particular manner High volume of INSERTs Now is that an obscure error or what? ;) | |
Ashley: 17-Mar-2006 | But they are not the same way ... SQL "insert into t values ('text') SQL {insert into t values ('"text"')} map to: SQL ["insert into t values (?)" "text"] ; with /direct refinement SQL ["insert into t values (?)" "text"] ; without /direct refinement The first approach in each case is saying, "I want this value to be stored as a SQLite TEXT value which will not be LOADed upon retrieval"; while the second is saying, "I want this value to be stored as a MOLDed SQLite TEXT value which will be LOADed upon retrieval back into a REBOL string value (as opposed to the word 'text)". A string! statement is strictly literal, it is passed onto SQLite with no parsing or conversion. If you want to bind values, use the block form ... that's what it's there for! | |
Ashley: 18-Mar-2006 | It's simply about choice. By default the driver assumes you want to be dealing with the full range of REBOL datatypes. If all you need are the five datatypes that SQLite supports (Integer, Decimal, Binary, Text and Null) then use the /direct refinement. How is this "confusing" or "clumsy"? If you don't like the fact that the string! form differs from the block form then choose the one you are most comfortable with and stick with that. | |
Pekr: 18-Mar-2006 | ok, not sure now and I will retest, but the problem also is, that the string form allows you to use "text here" in quotes instead of 'text here' ...but - once you query your db, driver returns it as two separate words because of space - it simply ruins the block, because you get two elements instead of one. Bobik told me, that sqlite3 does not do that, so I assume it is a difference of how returned data is being processed. But I will do some tests using both drivers, because he defined his dbs using some external tool (sqlite admin or so ...) | |
sqlab: 21-Mar-2006 | YYYYMMDD is the short form of the iso date, otherwise it should be YYYY-MM-DD, if I remember. | |
sqlab: 21-Mar-2006 | it's also covered by ISO 8601 YYYY-MM-DD hh:mm:ss or compact YYYYMMDDhhmmss I use mostly the compact form in my scripts. | |
Ashley: 7-Apr-2006 | If it's only TEXT types you need to encrypt then we could always add a /secure refinement to CONNECT that would force encrypt / decrypt on all TEXT bind variables. Performance wouldn't be too bad as values would only be encrypted [once] on INSERT and SELECT, the actual query (which could potentially hit millions of rows) would be comparing encrypted strings and would only need to decrypt strings that form part of the result set. Very similiar to the overhead that MOLD/LOAD currently incur when not using the /direct refinement. | |
Group: !Liquid ... any questions about liquid dataflow core. [web-public] | ||
Anton: 5-Feb-2007 | No, I mean the diagrams form part of the GUI (when a "show GUI" option is selected). | |
Steeve: 16-Feb-2007 | all the strings form a rebol script | |
Pekr: 7-May-2007 | the trouble with toolkits like wxWidgets imo is, that those allow mostly traditional widgets, kind of RebGUI ones. Not free form faces with draw facitilies etc. | |
Maxim: 7-May-2007 | same kind of list-based, free-form datatype and intutive. | |
Mario: 18-May-2007 | The gui has the rooms names as buttons. When you press the room name its layout (made of buttons) is shown along with a standard feedback layout (a form to send requests via CGI POST) | |
Maxim: 22-May-2007 | the system in its current form is not meant to be easy to code (for maintenance reasons). I know many ways to change this, but before going to far, I had to have as stable an architecture as possible. | |
Maxim: 24-May-2007 | I think the best, simple illustration of liquid will be in making an unbreakable form example. | |
Maxim: 13-Mar-2009 | the pipe server can be used to normalise the data into its purest form, and allows many things in your application to interact with it as peers. one can be a string another an int. but for each pipe client, they could care less about who and what the others are. they just need to know that, in this case, they are always receiving an int, and can convert it back to the format they need. | |
Group: DevCon2007 ... DevCon 2007 [web-public] | ||
Pekr: 29-Jan-2007 | excellent - most sites are just reference to hotel search portals. It would be really nice guys, if you would manage some eventual hotel discounts for conference participants. Well, maybe a good idea would be to advertise DevCon a bit, to know how many ppl would attend. Or you can do it other way - reserve e.g. 30 rooms, and use FIFO (first in first out) - even email would work to book room, no form needed ... | |
Group: DevCon2008 (post-chatter) ... DevCon2008 [web-public] | ||
Reichart: 9-Dec-2008 | Hmmm, it would be interesting to have a DevCon at this time, since many people are at home. May I suggest, that we do this another way, we create a list and let everyone post when is best, and when is worst, then we cull this to set a date. this is SO easy to do in Qtask (we just create a form for this). In AltME we could create a do list, and let each person just add their preference and follow a format. | |
NickA: 12-Dec-2008 | To prepare for Devcon, I made a sign up form for 3 dates/times that I'm available to do group demo/prep work. Please add your name if you'd like to meet at any of those times. http://rockfactory.us/events/devcon.html . The meeting room will be http://rockfactory.us/rooms/room20. I'll confirm the times/dates at the above page, once a few people have signed up. | |
Reichart: 17-Dec-2008 | We are jumping form room 20 to room 21 | |
Group: reblets ... working reblets (50-100 lines or less) [web-public] | ||
Ammon: 1-Apr-2009 | REBOL [ File: %scramble.r Author: "Ammon Johnson" Email: [ammon-:-johnson-:-gmail-:-com] Version: 0.0.1 History: [ 0.0.1 31-Mar-2009 "scrambles and descrambles code" ] ] scramble: context [ words: [] load-words: does [ foreach word first system/words [ add-word mold word ] ] add-word: func [ word /local chars length ][ chars: charset word unless found? find words chars [repend words [chars copy []]] unless found? find words/:chars length: length? word [repend words/:chars [length copy []]] length: select words/:chars length unless found? find length word [insert tail length word] word ] get-word: func [ word /local chars length ][ chars: charset word unless chars: select words chars [return "UNKNOWN"] unless length: select chars length? word [return "UNKNOWN"] random/only length ] scramble: func [ txt /local result ][ result: parse/all txt " " forall result [ unless empty? trim copy result/1 [change result random add-word result/1] ] form result ] descramble: func [ txt /local result ][ result: parse/all txt " " forall result [ unless empty? trim copy result/1 [change result get-word result/1] ] form result ] ] |
201 / 1573 | 1 | 2 | [3] | 4 | 5 | ... | 12 | 13 | 14 | 15 | 16 |