AltME groups: search
Help · search scripts · search articles · search mailing listresults summary
world | hits |
r4wp | 4382 |
r3wp | 44224 |
total: | 48606 |
results window for this page: [start: 29401 end: 29500]
world-name: r3wp
Group: Core ... Discuss core issues [web-public] | ||
[unknown: 5]: 18-Dec-2008 | and 16 picks | |
BrianH: 18-Dec-2008 | How often do you need to do these reads, and can they be sorted in batches? | |
[unknown: 5]: 18-Dec-2008 | They do get sorted but they are done often and the batch sort is random sized depending on the request | |
[unknown: 5]: 18-Dec-2008 | What if declared a field varchar[2000] and you only populate it with 50? | |
[unknown: 5]: 20-Dec-2008 | I tried that after I posted Sunanda but even though I could get to them I was still able to out put a value of the local before setting them to none that way so what that meant was that even though I attempted to set them to none! that way that it didn't take (and didn't give me an error either). | |
[unknown: 5]: 20-Dec-2008 | Gregg, to reduce memory overhead and allow the garbage collector to give back some memory. | |
Geomol: 20-Dec-2008 | I found a way to set all locals to none, while just specifying one of the locals, and it isn't beautiful, I'm afraid: f: func [/local a b c][ a: 1 b: 2 c: 3 print [a b c] ; This next line set all locals to none: set next bind first :f 'a none print [a b c] ] Running the function in the console: >> f 1 2 3 none none none >> | |
Geomol: 20-Dec-2008 | Hard to read that setting-to-none line, and I haven't found a way to do it by a function call (like a clear-locals function). | |
[unknown: 5]: 20-Dec-2008 | Yeah I love Also Brian and glad you implemented that. But this is really related to all the other non returned values. | |
Geomol: 20-Dec-2008 | :-) It has to find the /local and remove it. | |
BrianH: 20-Dec-2008 | John, you can't just access the context of a calling function or even the current function, even from a native. The code block your code is in can be assigned to many functions, and isn't bound to any context. Words are direct bound individually. If you want to clear a context, yo have to specify which one in a parameter. | |
BrianH: 20-Dec-2008 | You can't get access to a function's context without having a known word that is already bouund to that context. When you do first :f, the words retrn are not bound to the function's context. In R2, when you do third :f you get words that are bound, but you can only guess to what., since words are bound individually. The only safe way to do clear-words is to pass both the function and a known word bound to the function's context, and even then you have to copy the fuunction's argument block and convert any refinements to words before you bind the copy. | |
[unknown: 5]: 20-Dec-2008 | that is why I'm attempting this with third and using clear-locals :func :arg | |
BrianH: 20-Dec-2008 | Sorry, I meant second. Second returns the code block. The first and third blocks are definitely *not* bound to the function's context. | |
BrianH: 20-Dec-2008 | Getting a the argument list, which you would have to copy, convert refinements to words, then bind. The copy and conversion would be slower than necessary. | |
BrianH: 20-Dec-2008 | Developer releases at least, and maybe before then. | |
[unknown: 5]: 20-Dec-2008 | Everyone would ask "What is R3?" and then we could tell them about REBOL. | |
Steeve: 20-Dec-2008 | clearly guys, a function should never be so huge and obscufated so that it will not be any more interesting to use a clear-locals func. | |
[unknown: 5]: 20-Dec-2008 | I have 22 locals in one function alone already and even though I plan on reducing some of those in reducing some code, I have a feeling that I will regain them as I add more code in the function. | |
[unknown: 5]: 20-Dec-2008 | What is happening with respect to memory and lower level activity when using the 'bind function? | |
Sunanda: 21-Dec-2008 | Answers (which was intended for responses to challenges in the Puzzles group) is not [web-public], so half this discussion is hidden from anyone reading just the web archive. It seems an important technique is under discussion. Could some one summarise the state of the art, and continue the discussion here? Thanks! | |
Steeve: 21-Dec-2008 | seems there is more indirect links between an object and his properties | |
Gabriele: 22-Dec-2008 | Steeve, o and the result of bind? are the same context but not the same object. this is an implementation detail of R2. | |
Gabriele: 22-Dec-2008 | I do not think this is a bug, and it may not be trivial to fix it if it was (which means, it'll never get fixed as Carl is not going to spend that much time on R2 for something not important) | |
Gabriele: 23-Dec-2008 | Anton, it's not that it has any use, it's that there is no "object" internally, just a "context", and the bind? function creates an "object" for the "context" so that it can return it (there is no way to access a context directly). bind? does not know whether the context is already referenced by an existing object or not, nor has any way to get to any such existing objects, so it just always creates a new one. | |
[unknown: 5]: 25-Dec-2008 | However, it allows you to be more flexible and possibly save some evaluation depending on how you implement it. | |
[unknown: 5]: 25-Dec-2008 | Notice that example1 is more efficient than example 2. However, Example 3 takes the flexibility of setting my-block to a cleared block and actually is more efficient than example 1. | |
PeterWood: 26-Dec-2008 | I'm running a CGI script from which I want to 'launch another script to do some housekeeping. The output from the launched script (including the Rebol banners) is returned to the browser. Is there a way to redirect the output from the launched Rebol session? (I am getting this behaviour on both Mac OS X and Linux). | |
[unknown: 5]: 26-Dec-2008 | I spent a couple hours checking my code and yet it seems LOOP is the culprit. | |
[unknown: 5]: 26-Dec-2008 | I added copies and it didn't change anything so I removed them again. | |
[unknown: 5]: 26-Dec-2008 | tried copy on that part also and it didnt' make a difference. | |
[unknown: 5]: 26-Dec-2008 | Steeve, I see what you were saying. I went ahead and fixed that by changing a piece of code so that the d block wasn't modified also. | |
Davide: 29-Dec-2008 | Is there a way to modify an object (adding and removing components) at runtime without rebuild it from scratch ? I remember an old thread in the mailing list abut this argument, but I cannot find it.. | |
Steeve: 29-Dec-2008 | and ??? it's not related with your previous request | |
Davide: 29-Dec-2008 | Now I can ask a more precise question: here is my problem: I have an application object app that "serve" two client c1, c2 app: make object! [ hset: func [c] [k: c/name] hget: func [c] [print ["k=" k]] ] c1: make object! [ name: "pippo" ] c2: make object! [ name: "pluto" ] The handlers of app, use k as internal container, but of course it's shared between clients: >> app/hset c1 == "pippo" >> app/hset c2 == "pluto" >> app/hget c1 k= pluto I would bind k (and every set-word in the handler) to the object passed as parameter so the last line would produce: >> app/hget c1 k= pippo Now I come to this solution, using blocks instead of funcs in app app: make object! [ hset: [k: name] hget: [print ["k=" k]] ] c1: make object! [ name: "pippo" vars: make object! [ k: none ] ] c2: make object! [ name: "pluto" vars: make object! [ k: none ] ] This produce: >> do bind bind app/hset c1/vars c1 == "pippo" >> do bind bind app/hset c2/vars c2 == "pluto" >> do bind bind app/hget c1/vars c1 k= pippo This works, but I have to collect every set-words used in the handler, into the clients (using Ladislav set-words http://www.fm.tul.cz/~ladislav/rebol/set-words.r ) sw: copy [] repeat h next first app [sw: union sw set-words app/:h] b: copy [] repeat w sw [insert tail b reduce [to set-word! w none]] vars: make object! head b c1/vars: vars c2/vars: vars Now, my questions are: 1) Is this approch "rebolish" ? There's a smarter way to do it ? 2) If I need a function in my app like: app: make object! [ hset: [k: avg a b] hget: [print ["k=" k]] avg: func [x y] [aux: x + y aux: aux / 2] ] How can I collect the aux: word in avg function, and bind this function to c1/vars ? | |
Davide: 30-Dec-2008 | k: c/name and print ["k=" k] are only one (stupid) example that use a word k that I want to keep distinct between client.. Every client need its instances of words. | |
Steeve: 30-Dec-2008 | again, why don't you define K and aux localy to your object ? app: make object! [ k: aux: none hset: does [k: avg a b] hget: does [print ["k=" k]] avg: func [x y] [aux: x + y aux: aux / 2] ] | |
[unknown: 5]: 3-Jan-2009 | That is somewhat simliar but that sounds like you were interested in executing any script code in a sandbox. What I'm doing is allowing all other values to be reduced except allowed functions and natives. | |
btiffin: 3-Jan-2009 | I think Maxim mentioned that he had done a lot of work when he sandboxed Elixir. I didn't study enough of the magic Elixir to know how he pulled it off, but if it's Max, it's good and ahead of it's time. | |
[unknown: 5]: 3-Jan-2009 | For example, my function will take a series and if anything in it is a function or native then it will change that word to a literal so that it is then seen as a value. | |
BrianH: 3-Jan-2009 | Chris, you missed that being able to screen for "bad" functions is what Paul is trying to do. It is much easier to maintain a whitelist than a blacklist, and easier to implement in R2 as well. | |
Gregg: 4-Jan-2009 | I've done the mold+load trick as well Henrik. I've also taken the block from THIRD and changed each word type to lit-word. change-each w third things [either word? w [to-lit-word w] [w]] | |
Pekr: 5-Jan-2009 | IIRC r3 architecture counts on it, and there should be ipc:// scheme, or I think I saw something like that proposed :-) | |
Sunanda: 7-Jan-2009 | /secure provides its own seed. Theoretically, that seed is less guessable than the sort of things we are likely to think of in mezzanine code -- like time/precise. But we don't know for sure. All we do know is that with /seed we can provide the same seed and get the same series of random values; while with /secure if is not so easy. | |
Sunanda: 7-Jan-2009 | That's what I use it for, anyway. Try this and see the effect: loop 5 [random/seed 100 print "start of new series" loop 5 [print random 100]] | |
Sunanda: 7-Jan-2009 | I think that may be so he can later _remove_ the /seed and have secure numbers once testing is complete. Look at the *bad* effect of starting with a seed in my example: loop 5 [random/seed 100 print "start of new series" loop 5 [print random/secure 100]] | |
Sunanda: 7-Jan-2009 | Or do not have one when using /secure, and expecting /secure to work! | |
Henrik: 7-Jan-2009 | sunanda and when there is a million values? | |
Gregg: 7-Jan-2009 | There are a lot of ways to do it. Some people use the GUID API on Windows. Some use a high-low model, kind of like you are by including the PID. Combining clock (with setback checking), counter, machine info, and a key (like PID), is plenty good. | |
btiffin: 7-Jan-2009 | Historical? start (set) and then end (report). R3 has a dt (delta-time) function built in and some other nice profiling words. | |
Henrik: 8-Jan-2009 | really? perhaps there's no correlation between randomness and risk of collision. | |
Gabriele: 8-Jan-2009 | and indeed, for UUIDs, it may be ok to be predictable as long as you can reduce collisions. | |
Gabriele: 8-Jan-2009 | for example, if you had a clock with a precision of 10^-5 seconds, and you knew it was impossible to have more than 10000 requests per seconds, then you would be fine to just use your clock as your UUID. | |
Henrik: 8-Jan-2009 | so there is a sequential part and a random part. | |
Pekr: 8-Jan-2009 | yes, I am just looking at it and wondering, why import-email does not have such refinement :-) | |
Geomol: 8-Jan-2009 | Henrik, Rebolek posted this code in the "View" group last year to illustrate the difference between random and random/secure: img: make image! 512x512 repeat i 512 [ repeat j 512 [ either i < 256 [ if 2 = random 2 [ img/(as-pair i - 1 j - 1): 255.255.255 ] ][ if 2 = random/secure 2 [ img/(as-pair i - 1 j - 1): 255.255.255 ] ] ] ] view layout [image img across text "RANDOM" tab tab tab text "RANDOM/SECURE"] | |
Steeve: 8-Jan-2009 | i noticed that op! functions can't be reduced, is it a bug ? (in R2 and even in the R3). >> do reduce [:add 1 1] ==2 >> do reduce [1 :+ 1] ** Script error: cannot use add on none! value ** Where: applier do ** Near: op! 1 | |
BenBran: 16-Jan-2009 | The past few weeks I've had more time to devote to Rebol. I'm working on some typical examples and routines to get aquainted with it. So I appreciate all the help I'm getting from this forum. Currently just playing with the delete-dir function. I'm not able to get this to work....is this even possible..... in the environment: myPath = C:\myTemp myPath: probe get-env "myTemp" ....(tried several iterations of code here to fix the path perfectly) delete-dir myTemp also tried reduce the path has been refomed to //%/myTemp/, %C/myTemp/, and several others forms. it says that it expects a dir argument of type: file url | |
Janko: 19-Jan-2009 | btiffin: I am newbie at linux... you mean I can make a named pipe in command line with mkfifo and then rebol uses that as a normal filename to write/read from it? Similarly the other language has Unix package and can make named pipes by it's own... can rebol create pipe too? (sorry if I got it all wrong) | |
Janko: 19-Jan-2009 | about hanging, yes I read that write does not happen untill there is a read at the other side and vice versa so I was thinking if there is some king of timeout possible.. | |
btiffin: 19-Jan-2009 | Well normally fifo files are created in blocking mode, so yeah a write won't complete until a read occurs and a read will wait for a writer (by default). I'll be honest, I've not done this from REBOL, but with 2.7.6 and LOAD/LIBRARY freed, we can do any libc6 calls that we want, so you should be able to set a non blocking mode and get true multiple writes and reads that will return empty if no data is queued. For OpenCOBOL I implemented POSIX Message Queues; as MQ_NOTIFY will make a callback when the queue goes from empty to non-empty and you don't have to worry about spinning on a read. If you don't mind playing with make routine! take a look at mq_open and friends (man mq_overview) it might offer more control for IPC. | |
Janko: 20-Jan-2009 | thanks btiffin for such great explanation, yes I was looking at message queues too at first but then someone proposed pipes and they do seem more accessible/simple to start in a way. | |
Janko: 20-Jan-2009 | Is there any article or blog post about 2.7.6 being able to load native libraries? I searched and couldn't find any info on this.. I found docs for REBOL/Command/SDK version so this would be a place to start experimenting probably | |
Janko: 20-Jan-2009 | so I can compare a little , and I will probably need it also | |
Pekr: 21-Jan-2009 | And - imo if RT would post some formal specification to the language, we could fix some gotchas and surprises, not trying to find academic theories, why it work certain way ... | |
[unknown: 5]: 21-Jan-2009 | But to me Henrik the append or insert should be able to look at the argument and see it is already a lit-word and append it as such. | |
[unknown: 5]: 21-Jan-2009 | But couldn't insert be modified to see that it is appending a lit word to a block and make the appropriate modification? | |
[unknown: 5]: 21-Jan-2009 | But I already get the idea. That the idea is that it it is now a word and not a lit-word! | |
BrianH: 21-Jan-2009 | No, it was an expression of the words append and a and a lit-word 'b. DO evaluated the expression, and while doing so evaluated the 'b to create b. Then it passed the b to the function referenced by the word append. | |
[unknown: 5]: 21-Jan-2009 | Back to this issue, I checked replace and it doesn't support replacing word! in a block with lit-words. | |
[unknown: 5]: 21-Jan-2009 | I'm moving on from that issue. I'll wait and consider R3. But these pitfalls have already got me into other languages. | |
BrianH: 21-Jan-2009 | This is true for R3 and 2.7.6+ at least. | |
[unknown: 5]: 21-Jan-2009 | I just noticed this group is web-public. Shouldn't this be a bit more closed as often bugs and such are discussed here. | |
BrianH: 21-Jan-2009 | BACKPORTS! Hot off the presses! Get your new R3 functions, now here for R2! Available now, before the next release! funct: make function! [ [catch] "Defines a user function assuming all set-words are locals." spec [block!] "Help string (opt) followed by arg words (and opt type and string)" body [block!] "The body block of the function" /local r ws wb a ][ spec: copy/deep spec body: copy/deep body ws: make block! length? spec parse spec [any [ set a [word! | refinement!] (insert tail ws to-word a) | skip ]] wb: copy ws parse body r: [any [ set a set-word! ( unless find wb a: to-word a [insert tail wb a] ) | hash! | into r | skip ]] unless empty? wb: difference ws wb [ remove find wb 'local unless find spec /local [insert tail spec /local] insert tail spec wb ] throw-on-error [make function! spec body] ] functor: make function! [ [catch] "Defines a user function with all set-words collected into a persistent object (self)." spec [block!] "Help string (opt) followed by arg words (and opt type and string)" body [block!] "The body block of the function" /local r wb a ][ ; Note: Words in the spec override the bindings of the object words. wb: copy [] parse body r: [any [ set a set-word! (unless find wb a [insert tail wb a]) | hash! | into r | skip ]] remove find wb [self:] throw-on-error [make function! copy/deep spec bind/copy body construct wb] ] | |
BrianH: 21-Jan-2009 | Obviously the R3 versions are faster, smaller and more efficient, but the meaning is the same. And you can use them now in R2. | |
BrianH: 21-Jan-2009 | They are declared as code blocks in R3, not functions, and then turned into functions using a fixed spec and FUNCT. Safer that way. | |
BrianH: 21-Jan-2009 | R3 has changed SET to allow [set-word:] arguments so that they can be used with functions like FUNCT and FUNCTOR. R2 not (yet?). | |
Janko: 22-Jan-2009 | >> b: 'test ;; line gets evaluated , b already holds a word! == test >> append a :b ;; word get's added to serries == [test] >> type? first a == word! >> find a 'test ;; 'test get's evaluated into a word again so find finds it in block == [test] >> c: ['test] ;; 'test is in a block and of course doesn't get evaluated as any other thing in a block wouldn't so it stays lit-word! == ['test] | |
Janko: 22-Jan-2009 | BrianH and others : you made such great word (and ported it to mezzaine - I still have no idea what that is :) ) of the word map (as in functional programming ) ... did you maybe or is there any chance that its sister function reduce or fold or fold-left could be made in such a way.. I use your map a lot now but I have to use my poor fold word for folds :) | |
Will: 24-Jan-2009 | on OS X and Linux, for every instance of rebol , 2 processes are launched, the second for dns, right? is there any known bug? I have an difficult to debug situation , when quitting cheyenne after some load, some handler process goes 100% cpu, but the dns process is no more there, this make me think it may be a problem with rebol, otherwise also if one process would go 100% CPU, the dns one would still be present, help!! 8) | |
Oldes: 25-Jan-2009 | When you did call, the black cmd window was always visible. Now you must do call/show to see the window (which you mostly don't want to see) And I think this was just Windows change. I'm not sure how it worls on Linux or in other OSes. | |
Will: 25-Jan-2009 | I'm on 2.7.6 os x , symtom is rebol just goes mad using up 100% CPU and never quits , using "ktrace -p processid" generate an empty ktrace.out | |
Oldes: 25-Jan-2009 | And how do you start the script? Do you use -cs switch? | |
Oldes: 25-Jan-2009 | I'm testing it now with cheyenne and it seems not to be working... even if I do: print "Content-type: text/html^/" tmp: copy "" call/output/wait "dir" tmp probe tmp | |
Oldes: 25-Jan-2009 | CPU is fine here.. just the output is missing and there is error: Error Code : 300 Description : script error ! tmpnone has no value Near : [probe tmpnone] Where : protect-code | |
Will: 25-Jan-2009 | sorry I may have been more clear, the code is in uni-engine.r, this line: call/show join form to-local-file system/options/boot [" -qs " cmd] not in a RSP, and not sure at all the problem is with call... 8/ | |
BrianH: 25-Jan-2009 | More backports: AJOIN ajoin: func [ "Joins a block of values into a new string." block [block!] ] [ head insert copy "" reduce block ] AJOIN is native in R3 and doesn't generate an intermediate block (it reduces in place), but even in R2 it has advantages: - It always returns a string, no matter what the type of the first value in the block is. - It is faster than REJOIN. | |
[unknown: 5]: 25-Jan-2009 | Might change the description a bit to say that is reduces the block. "Reduces a block of values and joins them into a new string." Reducing is a security concern so we might want to ensure whoever uses the function is aware of this. | |
BrianH: 25-Jan-2009 | COPY "" is faster than MAKE STRING! 0 (amazingly enough), and you don't have to allocate a literal "" every time, just once at LOAD time | |
BrianH: 25-Jan-2009 | Speed is a bigger concern for mezzanines, but there has to be a balance. We are doing more advanced tricks in R3 to increase speed and reduce memory overhead, but R2 is in bugfix and backport only mode right now. | |
Dockimbel: 26-Jan-2009 | Side effect of slow interpreter loop and fast natives. | |
Gabriele: 27-Jan-2009 | BTW DideC, if you use now/precise instead of now/time/precise and use difference instead of - then you don't have a problem around midnight. | |
kcollins: 31-Jan-2009 | Here's another way which is arguable cleaner, but more verbose and less efficient: p: "3" (index? find "0123456789" p) - 1 | |
Tomc: 1-Feb-2009 | and it isarbitrry precision as well | |
Dockimbel: 1-Feb-2009 | I've just hit a serious issue in 2.7.6 on UNIX platforms today. Briefly: CLOSE on TCP ports doesn't work anymore if CALL is used before CLOSE, in a AWAKE handler. To reproduce this bug, get the tests scripts here : write %server.r read http://softinnov.org/tmp/server.r write %client.r read http://softinnov.org/tmp/client.r write %foo.r read http://softinnov.org/tmp/foo.r Then, read the comment section in %server.r and launch it to see by yourself : do %server.r Notes: o Windows is not affected by this issue. o I consider this a major issue for all REBOL server applications working in async mode and spawning processes. o I'm posting first here before RAMBO, so that people can test and point out any possible bad interpretation from me. | |
Dockimbel: 1-Feb-2009 | If a few ppl can confirm this rapidly, I'll post a ticket in RAMBO and will knock on Carl's door to fix that asap. | |
Maarten: 1-Feb-2009 | Doc, iirc there was a same sort of isseu with system ports in pre-2.7.6 and TCP and Gabriele got around it in the Detetcive project. He also wrapped up the async-call and made it available for linux then. I have it, he has it, but I suspect Gabriele can fill you in on the details. Let me know if (and how) you want it. | |
Will: 1-Feb-2009 | anyone else on non window os can test and confirm please? | |
btiffin: 1-Feb-2009 | I made a post about 2.7.6 being near the end of life of the REBOL 2 line. I was told by Carl that I was mistaken ... completely. That was oh, 8 months ago or so. At that time; REBOL 2 is still very much an RT supported product line and there are no plans to change that stance. | |
Anton: 2-Feb-2009 | After 5 seconds, client.r and foo.r are present: $ ps aux | grep reb[v]iew anton 9006 0.0 0.4 13268 9656 pts/1 SNs+ 00:33 0:00 /rebol/rebview2.7.006.4.2 -s -- do-anton-user?: true anton 9007 0.0 0.0 6084 536 pts/1 SN+ 00:33 0:00 /rebol/rebview2.7.006.4.2 -s -- do-anton-user?: true anton 9008 0.0 0.0 6084 464 pts/1 SN+ 00:33 0:00 /rebol/rebview2.7.006.4.2 -s -- do-anton-user?: true anton 9072 0.3 0.3 11952 8228 pts/1 SN+ 00:35 0:00 /rebol/rebview2.7.006.4.2 -qws client.r anton 9073 0.0 0.0 6128 1084 pts/1 SN+ 00:35 0:00 /rebol/rebview2.7.006.4.2 -qws client.r anton 9074 0.0 0.0 6084 468 pts/1 SN+ 00:35 0:00 /rebol/rebview2.7.006.4.2 -qws client.r anton 9079 0.5 0.3 11828 8068 pts/1 SN+ 00:35 0:00 /rebol/rebview2.7.006.4.2 -qws foo.r anton 9080 0.0 0.0 6084 536 pts/1 SN+ 00:35 0:00 /rebol/rebview2.7.006.4.2 -qws foo.r anton 9081 0.0 0.0 6084 464 pts/1 SN+ 00:35 0:00 /rebol/rebview2.7.006.4.2 -qws foo.r After foo.r finishes waiting: $ ps aux | grep reb[v]iew anton 9006 0.0 0.4 13268 9656 pts/1 SNs+ 00:33 0:00 /rebol/rebview2.7.006.4.2 -s -- do-anton-user?: true anton 9007 0.0 0.0 6084 536 pts/1 SN+ 00:33 0:00 /rebol/rebview2.7.006.4.2 -s -- do-anton-user?: true anton 9008 0.0 0.0 6084 464 pts/1 SN+ 00:33 0:00 /rebol/rebview2.7.006.4.2 -s -- do-anton-user?: true anton 9072 0.4 0.0 0 0 pts/1 ZN+ 00:35 0:00 [rebview2.7.006.] <defunct> anton 9079 0.4 0.0 0 0 pts/1 ZN+ 00:35 0:00 [rebview2.7.006.] <defunct> And when close port is done before call in the awake function, then client.r becomes defunct while foo is still waiting. |
29401 / 48606 | 1 | 2 | 3 | 4 | 5 | ... | 293 | 294 | [295] | 296 | 297 | ... | 483 | 484 | 485 | 486 | 487 |