📜 ⬆️ ⬇️

Random sample in SSI Apache

Often, the developer is faced with the task of establishing a specific element on a site that randomly displays information. Be it a collage in a cap, sayings of philosophers, etc. The task is trivial, but for ordinary programming languages, and if there is no possibility to use them? Java Script does not count, depending on the user's settings in such tasks is not kosher. SSI comes to the rescue, although, hand on heart, these are not the tasks that should be performed. So, what we have and what can be done:That's it. The limitation of elements according to the number of elements is not so scary, we are not making a spacecraft, but still a crutch. More additives, we must have a complete list of elements, i.e. without spaces. In the course of the algorithm appears:We will use it as an external component, i.e. we define the list, we cause a component, we receive a variable: Code (1)
     <! - Declare list variables ->
     <! - # set var = "RND_0" value = "Value 0" ->
     <! - # set var = "RND_1" value = "Value 1" ->
     <! - # set var = "RND_2" value = "Value 2" ->
    
     <! - Call the component ->
     <! - # include virtual = "/ rnd.shtml" ->
    
     <! - Here is our random value ->
     [<! - # echo var = "RND_X" ->]
    
I recommend doing the component on 10 elements, it is 14 KB in size, and 60 elements are already more than 500 KB, that's about it (although you need to think more about optimization). Component: Code (2)
     <! -
         We declare additional variables for pseudo lists of existing
         and used items
     ->
    
     <! - # set var = "RND_LIST_INDEX" value = "x" ->
     <! - # set var = "RND_LIST_INDEX_TMP" value = "x" ->
    
     <! -
         Fill in the variable of existing elements and declare additional
         variable "flags" of the existence of variables.  Since there are no cycles,
         You have to make such a long copy-paste.
     ->
    
     <! - # if expr = "$ RND_0" ->
         <! - # set var = "RND_LIST_INDEX" value = "$ {RND_LIST_INDEX} 0" ->
         <! - # set var = "RND_0_EX" value = "1" ->
     <! - # else ->
         <! - # set var = "RND_0_EX" value = "0" ->
     <! - # endif ->
     <! - # if expr = "$ RND_1" ->
         <! - # set var = "RND_LIST_INDEX" value = "$ {RND_LIST_INDEX} 1" ->
         <! - # set var = "RND_1_EX" value = "1" ->
     <! - # else ->
         <! - # set var = "RND_1_EX" value = "0" ->
     <! - # endif ->
     <! - # if expr = "$ RND_2" ->
         <! - # set var = "RND_LIST_INDEX" value = "$ {RND_LIST_INDEX} 2" ->
         <! - # set var = "RND_2_EX" value = "1" ->
     <! - # else ->
         <! - # set var = "RND_2_EX" value = "0" ->
     <! - # endif ->
     <! - # if expr = "$ RND_3" ->
         <! - # set var = "RND_LIST_INDEX" value = "$ {RND_LIST_INDEX} 3" ->
         <! - # set var = "RND_3_EX" value = "1" ->
     <! - # else ->
         <! - # set var = "RND_3_EX" value = "0" ->
     <! - # endif ->
     <! - # if expr = "$ RND_4" ->
         <! - # set var = "RND_LIST_INDEX" value = "$ {RND_LIST_INDEX} 4" ->
         <! - # set var = "RND_4_EX" value = "1" ->
     <! - # else ->
         <! - # set var = "RND_4_EX" value = "0" ->
     <! - # endif ->
     <! - # if expr = "$ RND_5" ->
         <! - # set var = "RND_LIST_INDEX" value = "$ {RND_LIST_INDEX} 5" ->
         <! - # set var = "RND_5_EX" value = "1" ->
     <! - # else ->
         <! - # set var = "RND_5_EX" value = "0" ->
     <! - # endif ->
     <! - # if expr = "$ RND_6" ->
         <! - # set var = "RND_LIST_INDEX" value = "$ {RND_LIST_INDEX} 6" ->
         <! - # set var = "RND_6_EX" value = "1" ->
     <! - # else ->
         <! - # set var = "RND_6_EX" value = "0" ->
     <! - # endif ->
     <! - # if expr = "$ RND_7" ->
         <! - # set var = "RND_LIST_INDEX" value = "$ {RND_LIST_INDEX} 7" ->
         <! - # set var = "RND_7_EX" value = "1" ->
     <! - # else ->
         <! - # set var = "RND_7_EX" value = "0" ->
     <! - # endif ->
     <! - # if expr = "$ RND_8" ->
         <! - # set var = "RND_LIST_INDEX" value = "$ {RND_LIST_INDEX} 8" ->
         <! - # set var = "RND_8_EX" value = "1" ->
     <! - # else ->
         <! - # set var = "RND_8_EX" value = "0" ->
     <! - # endif ->
     <! - # if expr = "$ RND_9" ->
         <! - # set var = "RND_LIST_INDEX" value = "$ {RND_LIST_INDEX} 9" ->
         <! - # set var = "RND_9_EX" value = "1" ->
     <! - # else ->
         <! - # set var = "RND_9_EX" value = "0" ->
     <! - # endif ->

     <! -
         Now, in order to set the value of the variables of the list, if the variable
         no value.  Set the value provided that we did not install
         it is up to this, due to the fact that we have a strictly defined sequence
         from 0 to 9.
     ->
    
     <! - # if expr = "$ RND_0_EX = 0 && $ RND_0_EX = 1 && $ RND_LIST_INDEX_TMP! = / 0 /" ->
         <! - # set var = "RND_0" value = "$ RND_0" ->
         <! - # set var = "RND_LIST_INDEX_TMP" value = "$ {RND_LIST_INDEX_TMP} 0" ->
     <! - # elif expr = "$ RND_0_EX = 0 && $ RND_1_EX = 1 && $ RND_LIST_INDEX_TMP! = / 1 /" ->
         <! - # set var = "RND_0" value = "$ RND_1" ->
         <! - # set var = "RND_LIST_INDEX_TMP" value = "$ {RND_LIST_INDEX_TMP} 1" ->
     <! - # elif expr = "$ RND_0_EX = 0 && $ RND_2_EX = 1 && $ RND_LIST_INDEX_TMP! = / 2 /" ->
         <! - # set var = "RND_0" value = "$ RND_2" ->
         <! - # set var = "RND_LIST_INDEX_TMP" value = "$ {RND_LIST_INDEX_TMP} 2" ->
     <! - # elif expr = "$ RND_0_EX = 0 && $ RND_3_EX = 1 && $ RND_LIST_INDEX_TMP! = / 3 /" ->
         <! - # set var = "RND_0" value = "$ RND_3" ->
         <! - # set var = "RND_LIST_INDEX_TMP" value = "$ {RND_LIST_INDEX_TMP} 3" ->
     <! - # elif expr = "$ RND_0_EX = 0 && $ RND_4_EX = 1 && $ RND_LIST_INDEX_TMP! = / 4 /" ->
         <! - # set var = "RND_0" value = "$ RND_4" ->
         <! - # set var = "RND_LIST_INDEX_TMP" value = "$ {RND_LIST_INDEX_TMP} 4" ->
     <! - # elif expr = "$ RND_0_EX = 0 && $ RND_5_EX = 1 && $ RND_LIST_INDEX_TMP! = / 5 /" ->
         <! - # set var = "RND_0" value = "$ RND_5" ->
         <! - # set var = "RND_LIST_INDEX_TMP" value = "$ {RND_LIST_INDEX_TMP} 5" ->
     <! - # elif expr = "$ RND_0_EX = 0 && $ RND_6_EX = 1 && $ RND_LIST_INDEX_TMP! = / 6 /" ->
         <! - # set var = "RND_0" value = "$ RND_6" ->
         <! - # set var = "RND_LIST_INDEX_TMP" value = "$ {RND_LIST_INDEX_TMP} 6" ->
     <! - # elif expr = "$ RND_0_EX = 0 && $ RND_7_EX = 1 && $ RND_LIST_INDEX_TMP! = / 7 /" ->
         <! - # set var = "RND_0" value = "$ RND_7" ->
         <! - # set var = "RND_LIST_INDEX_TMP" value = "$ {RND_LIST_INDEX_TMP} 7" ->
     <! - # elif expr = "$ RND_0_EX = 0 && $ RND_8_EX = 1 && $ RND_LIST_INDEX_TMP! = / 8 /" ->
         <! - # set var = "RND_0" value = "$ RND_8" ->
         <! - # set var = "RND_LIST_INDEX_TMP" value = "$ {RND_LIST_INDEX_TMP} 8" ->
     <! - # elif expr = "$ RND_0_EX = 0 && $ RND_9_EX = 1 && $ RND_LIST_INDEX_TMP! = / 9 /" ->
         <! - # set var = "RND_0" value = "$ RND_9" ->
         <! - # set var = "RND_LIST_INDEX_TMP" value = "$ {RND_LIST_INDEX_TMP} 9" ->
     <! - # endif ->

     <! -
         Now we check if the list is already full and if the sequence is not necessary.
         install first
     ->
    
     <! - # if expr = "$ RND_LIST_INDEX_TMP = $ RND_LIST_INDEX" ->
         <! - # set var = "RND_LIST_INDEX_TMP" value = "x" ->
     <! - # endif ->
    
     <! -
         Then exactly the same blocks for each of their variables in order for the whole
         range from 0 to 9. Do not forget to check the occupancy after each block
         sequences.
     ->    
    
     <! - # if expr = "$ RND_1_EX = 0 && $ RND_0_EX = 1 && $ RND_LIST_INDEX_TMP! = / 0 /" ->
         <! - # set var = "RND_1" value = "$ RND_0" ->
         <! - # set var = "RND_LIST_INDEX_TMP" value = "$ {RND_LIST_INDEX_TMP} 0" ->
     <! - # elif expr = "$ RND_1_EX = 0 && $ RND_1_EX = 1 && $ RND_LIST_INDEX_TMP! = / 1 /" ->
         <! - # set var = "RND_1" value = "$ RND_1" ->
         <! - # set var = "RND_LIST_INDEX_TMP" value = "$ {RND_LIST_INDEX_TMP} 1" ->
     <! - # elif expr = "$ RND_1_EX = 0 && $ RND_2_EX = 1 && $ RND_LIST_INDEX_TMP! = / 2 /" ->
     ...
    
     <! -
         The entire list of items is full, you can select the desired relative to seconds.
     ->    
    
     <! - # config timefmt = "% S" ->
     <! - # set var = "NUM_SEC" value = "$ DATE_LOCAL" ->
     <! - # if expr = "$ NUM_SEC = / 0 $ /" ->
         <! - # set var = "RND_X" value = "$ RND_0" ->
     <! - # elif expr = "$ NUM_SEC = / 1 $ /" ->
         <! - # set var = "RND_X" value = "$ RND_1" ->
     <! - # elif expr = "$ NUM_SEC = / 2 $ /" ->
         <! - # set var = "RND_X" value = "$ RND_2" ->
     <! - # elif expr = "$ NUM_SEC = / 3 $ /" ->
         <! - # set var = "RND_X" value = "$ RND_3" ->
     <! - # elif expr = "$ NUM_SEC = / 4 $ /" ->
         <! - # set var = "RND_X" value = "$ RND_4" ->
     <! - # elif expr = "$ NUM_SEC = / 5 $ /" ->
         <! - # set var = "RND_X" value = "$ RND_5" ->
     <! - # elif expr = "$ NUM_SEC = / 6 $ /" ->
         <! - # set var = "RND_X" value = "$ RND_6" ->
     <! - # elif expr = "$ NUM_SEC = / 7 $ /" ->
         <! - # set var = "RND_X" value = "$ RND_7" ->
     <! - # elif expr = "$ NUM_SEC = / 8 $ /" ->
         <! - # set var = "RND_X" value = "$ RND_8" ->
     <! - # elif expr = "$ NUM_SEC = / 9 $ /" ->
         <! - # set var = "RND_X" value = "$ RND_9" ->
     <! - # else ->
         <! - # set var = "RND_X" value = "$ RND_0" ->
     <! - # endif ->

     <! -
         IMPORTANT!!!
         Now it is desirable to reset the list, because  variables are all global and if
         we will use the component several times on the same page for different
         lists, there may be a mixture of lists.  Although we leave the opportunity not
         reset it.
     ->    

     <! - # if expr = "$ RND_DO_NOT_CLEAN_LIST" ->
         <! - # set var = "RND_DO_NOT_CLEAN_LIST" value = "" ->
     <! - # else ->
         <! - # set var = "RND_0" value = "" ->
         <! - # set var = "RND_1" value = "" ->
         <! - # set var = "RND_2" value = "" ->
         <! - # set var = "RND_3" value = "" ->
         <! - # set var = "RND_4" value = "" ->
         <! - # set var = "RND_5" value = "" ->
         <! - # set var = "RND_6" value = "" ->
         <! - # set var = "RND_7" value = "" ->
         <! - # set var = "RND_8" value = "" ->
         <! - # set var = "RND_9" value = "" ->
     <! - # endif ->

     <! -
         Actually everything, a random value is in the variable RND_X
     ->    

    
Of course, the probability of obtaining elements depends strongly on the total number of elements, so for a list of three 9 elements, we get the sequenceAs you can see, the probability of showing the variable RND_0 is 1/5, and all the others is 1/10. the component itself can be downloaded here . original

')

Source: https://habr.com/ru/post/67818/


All Articles