ibmi-brunch-learn

Announcement

Collapse
No announcement yet.

How to open a big link using STRPCCMD

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • How to open a big link using STRPCCMD

    Hi,

    I have a really very big link of 900 in length. I am writing this link in a .BAT (Batch) file using STRPCCMD command in RPG application.
    But while writing into batch file if link contains "%" character then it is not writing this character instead some different character is been written to .BAT file. Therefore my link is not opening when I run that .BAT file.

    Below is the example of my RPG.

    Eval Buffer = 'STRPCCMD PCCMD(CMD)'

    Here CMD contains that linke like = 'http://share.abc.com/Release%20Migration/Forms/AllItems.aspx?RootFolder=%2Fknowledge%2FITFORMS%2F Release%20Migration'

    While writing through my RPG application how do I take care that link should get written as it is if it contains "%" character as above link contains?
    Please suggest me the way while writing to .BAT file.
    Cheers...
    Nil

  • #2
    Re: How to open a big link using STRPCCMD

    Hi Nil:

    I haven't played with this myself but my understanding is that spaces may be translated into %20 and slashes may be translated into %2 when used as a URL.

    http://www.w3schools.com/tags/ref_urlencode.asp

    https://drupal.org/node/1461144


    Try to translate them back and see what happens.

    Best of Luck
    GLS
    The problem with quotes on the internet is that it is hard to verify their authenticity.....Abraham Lincoln

    Comment


    • #3
      Re: How to open a big link using STRPCCMD

      Thanks for your reply, I do not found much useful with the below mentioned links. How do I encode when I run or call this link via .BAT file?
      Here is my batch file example.

      SET "FIRST=http://abc.com/knowledge/_layouts/FormServer.aspx?XmlLocation=/k"
      SET "LAST=nowledge/Release%20Migration/FTP_log_T15_.xml"
      SET RESULT=%FIRST%%LAST%
      START=%RESULT%
      EXIT

      So here "Release%20" is not getting transferred properly in browser instead it is coming as "Release0". My batch contain "Release%20" while transferring to browser this problem is coming.

      Is there any .BAT file can do of encode or encryption as you mentioned.

      Originally posted by GLS400 View Post
      Hi Nil:

      I haven't played with this myself but my understanding is that spaces may be translated into %20 and slashes may be translated into %2 when used as a URL.

      http://www.w3schools.com/tags/ref_urlencode.asp

      https://drupal.org/node/1461144


      Try to translate them back and see what happens.

      Best of Luck
      GLS
      Cheers...
      Nil

      Comment


      • #4
        Re: How to open a big link using STRPCCMD

        I've had numerous problems with writing data to a batch file like you're trying to do. Off the top of my head:
        1. Because you are using DOS commands, it pops up the "Command Entry" screen, which is ugly.
        2. Some 5250 emulators run the commands asynchronously, so the .BAT file doesn't always get written in the right sequence.
        3. Because you are putting it in DOS mode, far more characters have to be escaped since there are so many more special characters in DOS vs. Windows.
        4. Although it's possible to escape characters, when you write to a batch file, you have to double-escape the characters since they will be interpreted twice, once when writing the batch file itself, and then a second time when running it.


        So I gave up on this method. Instead, I use a "redirector", which is a simple program that runs on the HTTP server on the same IBM i where the STRPCCMD is run. The browser is given a short/simple URL via STRPCCMD which references the local HTTP server. The server then redirects to the actual URL, allowing long URLs and special characters without problems.

        I wrote an article complete with example code here:
        Read through for news and resources on software development topics, including low-code-no-code, serverless computing and programming languages.

        Comment


        • #5
          Re: How to open a big link using STRPCCMD

          Thanks Scott...
          Can we use Java functions to open link from RPG like encodeURI() java function?
          Do you have any idea on this.

          Originally posted by Scott Klement View Post
          I've had numerous problems with writing data to a batch file like you're trying to do. Off the top of my head:
          1. Because you are using DOS commands, it pops up the "Command Entry" screen, which is ugly.
          2. Some 5250 emulators run the commands asynchronously, so the .BAT file doesn't always get written in the right sequence.
          3. Because you are putting it in DOS mode, far more characters have to be escaped since there are so many more special characters in DOS vs. Windows.
          4. Although it's possible to escape characters, when you write to a batch file, you have to double-escape the characters since they will be interpreted twice, once when writing the batch file itself, and then a second time when running it.


          So I gave up on this method. Instead, I use a "redirector", which is a simple program that runs on the HTTP server on the same IBM i where the STRPCCMD is run. The browser is given a short/simple URL via STRPCCMD which references the local HTTP server. The server then redirects to the actual URL, allowing long URLs and special characters without problems.

          I wrote an article complete with example code here:
          http://iprodeveloper.com/rpg-program...unch-long-urls
          Cheers...
          Nil

          Comment


          • #6
            Re: How to open a big link using STRPCCMD

            Hi Scott, Thanks for your code.
            I coded as per your zip file however I am getting following errors:
            1. REDIR - Binding directory QHTTPSVR not found, what I need to do here to add binding directory? Program REDIR compiled successfully but during binding it is giving me error.

            2. You mentioned following in README.TXT:
            Apache directives:

            Assuming that you already have a working Apache configuration, you should be able to install the REDIR program by adding the following directives to your httpd.conf file:

            ScriptAlias /redir /QSYS.LIB/xxx.LIB/REDIR.PGM

            order deny,allow


            How do I add this? Using Nevigator or AS400?
            Please help.
            Originally posted by Scott Klement View Post
            I've had numerous problems with writing data to a batch file like you're trying to do. Off the top of my head:
            1. Because you are using DOS commands, it pops up the "Command Entry" screen, which is ugly.
            2. Some 5250 emulators run the commands asynchronously, so the .BAT file doesn't always get written in the right sequence.
            3. Because you are putting it in DOS mode, far more characters have to be escaped since there are so many more special characters in DOS vs. Windows.
            4. Although it's possible to escape characters, when you write to a batch file, you have to double-escape the characters since they will be interpreted twice, once when writing the batch file itself, and then a second time when running it.


            So I gave up on this method. Instead, I use a "redirector", which is a simple program that runs on the HTTP server on the same IBM i where the STRPCCMD is run. The browser is given a short/simple URL via STRPCCMD which references the local HTTP server. The server then redirects to the actual URL, allowing long URLs and special characters without problems.

            I wrote an article complete with example code here:
            http://iprodeveloper.com/rpg-program...unch-long-urls
            Cheers...
            Nil

            Comment


            • #7
              Re: How to open a big link using STRPCCMD

              Originally posted by Nil View Post
              1. REDIR - Binding directory QHTTPSVR not found, what I need to do here to add binding directory? Program REDIR compiled successfully but during binding it is giving me error.
              Hmmm... strange that nobody has reported this before. The QHTTPSVR binding directory was just something I created as a shortcut so I didn't have to bind things manually. You can create one quite easily by doing this:
              Code:
              CRTBNDDIR BNDDIR(yourlib/QHTTPSVR)
              ADDBNDDIRE BNDDIR(yourlib/QHTTPSVR) OBJ((QHTTPSVR/QZHBCGI))
              Then try compiling REDIR again. Or, alternately, remove the reference to that BNDDIR and just list QHTTPSVR/QZHBCGI on the BNDSRVPGM parameter of the CRTPGM command.

              Originally posted by Nil View Post
              2. You mentioned following in README.TXT:
              Apache directives:
              (SNIP)
              How do I add this? Using Nevigator or AS400?
              Not sure what you mean by "Navigator or AS400". The best way to edit this file is using the IBM Web Administration tool -- the same way you'd set up or make any other changes to any HTTP server instance. This is done in a web browser by navigating to http://yoursystem:2001, choosing "IBM i Tasks", and "IBM Web Administration" and selecting your HTTP server instance, and then using the "edit configuration file" option. The advantage of using this interface is that there's a "display configuration file" that you can use when you're done and it'll make sure the syntax of the conf file is correct, etc, to help you catch mistakes.

              It's also possible to edit this file using the green-screen EDTF command (or WRKLNK option 2, which is the same thing). Or by accessing the httpd.conf file with RDi or even a PC text file editor. It really depends on what you are comfortable with or what is available to you.

              In any case, once you've made your changes, you'll need to restart the HTTP server to pick up the new directives.

              Comment


              • #8
                Re: How to open a big link using STRPCCMD

                Nil,

                It seems to me that you have several treads running about the same problem. Here is my suggestion to your problem.

                I think that it builds on the same method like Scotts code but dosn't include house keeping of files initial. However
                my Open Source powerEXT Core will under installation create a litlle web server under installation so if you install
                it (with the example library) you should be run the following code without any problems:


                RPGLE program REDIRECT

                Code:
                 /copy qsrc,pxapihdr      General H-Spec's                            
                                                                                      
                 * powerEXT Service Program Connector                                 
                 /copy qsrc,pxapicgicn    Basic HTTP connecter & Productivity Services
                                                                                      
                 * Declare Internal Variables                                         
                d longUrl         s          10000a   varying                         
                d handle          s             32a                                   
                d pcCmd           s            132a                                   
                                                                                      
                 * Exteral Program Call                                               
                d pcCall          pr                  extpgm('REDIRECTCL')            
                d  pcCmd                       132a                                   
                                                                                      
                                                                                      
                 /free                                                                
                  clearSrvPgm();                                                      
                                                                                      
                  // setup fields (NOTE that the url dosn't have to be encoded)       
                  longUrl = 'http://translate.google.com/?hl=en#en/de/this is a'       
                   + ' test of google translate';                                      
                                                                                       
                  handle = uniqueKey();  // create unique handle                       
                                                                                       
                  pcCmd = 'rundll32 url,FileProtocolHandler ' // starts default browser
                   + 'http://192.168.63.10:8080/redir' + handle + '.htm';              
                                                                                       
                  // generate a redirect html/javascript document and place it         
                  // in the Apache server domain /pextWebCD2/                          
                  setContent('*none');                                                 
                                                                                       
                  htmlnode('html');                                                    
                  htmlNode('head');                                                    
                                                                                       
                  htmlNode('script':'language="javascript"');                          
                                                                                       
                    echo('var uri = encodeURI("' + longUrl + '");');                   
                    // echo('alert(uri);');  // *** just for testing ***               
                    echo('parent.location.href = uri;');                               
                                                                          
                  htmlEndNode();                                          
                  htmlEndNode();                                          
                  htmlEndNode();                                          
                                                                          
                  echoToStmf('/pextWebCD2/redir' + handle + '.htm':1208); 
                                                                          
                  pcCall(pcCmd);                                          
                                                                          
                  *inlr = *on;                                            
                 /end-free
                CLLE PROGRAM REDIRECTCL

                Code:
                             PGM        PARM(&PCCMD)                       
                             DCL        VAR(&PCCMD) TYPE(*CHAR) LEN(132)   
                             STRPCO                                        
                             MONMSG     MSGID(IWS4010)                     
                             STRPCCMD   PCCMD(&PCCMD) PAUSE(*NO)           
                             ENDPGM
                HTML result (starting '<' is replaced with 'x'):

                Code:
                xhtml>                                                                                                 
                 xhead>                                                                                                
                  xscript language="javascript">                                                                       
                   var uri = encodeURI("http://translate.google.com/?hl=en#en/de/this is a test of google translate"); 
                   parent.location.href = uri;                                                                         
                  x/script>                                                                                            
                 x/head>                                                                                               
                x/html>
                Som remarks:

                1. The rundll32 url,FileProtocolHandler will start a session in the users selected default browser without the small blink of a DOS session

                2. I pass the url without any character encoding, the generated javascript (encodeURI) does the encoding

                3. The example generates public files that isn't automatically removed when used however this will just require that a little CGI program
                serves the generated redirection files instead of just serving them as static apache files. The url could be someting like



                4. powerEXT Core download can be found at http://powerEXT.com

                5. You only have to have library PEXTCD2 in your librarylist at compile time and the redirect program can be placed in any
                library you wish.
                Last edited by Henrik Rutzou; April 5, 2014, 05:32 AM.

                Comment


                • #9
                  Re: How to open a big link using STRPCCMD

                  here is a more andvanced version that store the redirect files in a local directory (/myRedirects) and where the files
                  are served by a simple CGI program and deleted when served ...


                  RPGLE Program REDIRECT

                  Code:
                   /copy qsrc,pxapihdr      General H-Spec's                             
                                                                                         
                   * powerEXT Service Program Connector                                  
                   /copy qsrc,pxapicgicn    Basic HTTP connecter & Productivity Services 
                                                                                         
                   * Declare Internal Variables                                          
                  d longUrl         s          10000a   varying                          
                  d handle          s             32a                                    
                  d pcCmd           s            123a                                    
                                                                                         
                   * Exteral Program Call                                                
                  d pcCall          pr                  extpgm('REDIRECTCL')             
                  d  pcCmd                       123a                                    
                                                                                         
                                                                                         
                   /free                                                                 
                    clearSrvPgm();                                                       
                                                                                         
                    // setup fields (NOTE that the url dosn't have to be encoded)        
                    longUrl = 'http://translate.google.com/?hl=en#en/de/this is a'        
                     + ' test of google translate';                                       
                                                                                          
                    handle = uniqueKey();  // create unique handle                        
                                                                                          
                    pcCmd = 'rundll32 url,FileProtocolHandler ' // starts default browser 
                     + 'http://192.168.63.10:8080/pextcd2lib/redirectsv.pgm?hdl='+handle; 
                                                                                          
                    // generate a redirect html/javascript document and place it          
                    // in the local directory /myRedirects                           
                    setContent('*none');                                                  
                                                                                          
                    htmlnode('html');                                                     
                    htmlNode('head');                                                     
                                                                                          
                    htmlNode('script':'language="javascript"');                           
                                                                                          
                      echo('var uri = encodeURI("' + longUrl + '");');                    
                      // echo('alert(uri);');  // *** just for testing ***                
                      echo('parent.location.href = uri;');                                
                                                                            
                    htmlEndNode();                                          
                    htmlEndNode();                                          
                    htmlEndNode();                                          
                                                                            
                    echoToStmf('/myRedirects/redir' + handle + '.htm':1208);
                                                                            
                    pcCall(pcCmd);                                          
                                                                            
                    *inlr = *on;                                            
                   /end-free

                  CLLE program REDIRECTCL

                  Code:
                               PGM        PARM(&PCCMD)                     
                               DCL        VAR(&PCCMD) TYPE(*CHAR) LEN(123) 
                               STRPCO                                      
                               MONMSG     MSGID(IWS4010)                   
                               STRPCCMD   PCCMD(&PCCMD) PAUSE(*NO)         
                               ENDPGM

                  RPGLE CGI program REDIRECTSV

                  Code:
                   /copy qsrc,pxapihdr      General H-Spec's                            
                                                                                        
                   * powerEXT Service Program Connector                                 
                   /copy qsrc,pxapicgicn    Basic HTTP connecter & Productivity Services
                                                                                        
                   * Declare Internal Variables                                         
                  d handle          s             32a                                   
                  d file            s            256a   varying                         
                  d rc              s             10i 0                                 
                                                                                        
                   /free                                                                
                    clearSrvPgm();                                                      
                                                                                        
                    getExtInput();                                                      
                    handle = getExtVar('hdl');                                          
                                                                                        
                    file = '/myRedirects/redir' + handle + '.htm';                      
                                                                                        
                    setContent('text/html');     
                                                                              
                    rc = storeFromStmf(0:file);                             
                                                                            
                    if rc = 0;                                              
                      Qcmd('DEL OBJLNK(''' + file + ''')');                 
                    else;                                                   
                      htmlNode('html');                                     
                      htmlNode('body');                                     
                        htmlNode('h1':'':'File ' + handle + ' not found!'); 
                      htmlEndNode();                                        
                      htmlEndNode();                                        
                    endif;                                                  
                                                                            
                    echoToClient();                                         
                                                                            
                    *inlr = *on;                                            
                   /end-free
                  Last edited by Henrik Rutzou; April 5, 2014, 06:24 AM.

                  Comment


                  • #10
                    Re: How to open a big link using STRPCCMD

                    Hello Henrik,
                    Thanks a lot for your help. I will try & get back to you.
                    This code seems to me that it will remove burden of my head.

                    Originally posted by Henrik Rutzou View Post
                    here is a more andvanced version that store the redirect files in a local directory (/myRedirects) and where the files
                    are served by a simple CGI program and deleted when served ...


                    RPGLE Program REDIRECT

                    Code:
                     /copy qsrc,pxapihdr      General H-Spec's                             
                                                                                           
                     * powerEXT Service Program Connector                                  
                     /copy qsrc,pxapicgicn    Basic HTTP connecter & Productivity Services 
                                                                                           
                     * Declare Internal Variables                                          
                    d longUrl         s          10000a   varying                          
                    d handle          s             32a                                    
                    d pcCmd           s            123a                                    
                                                                                           
                     * Exteral Program Call                                                
                    d pcCall          pr                  extpgm('REDIRECTCL')             
                    d  pcCmd                       123a                                    
                                                                                           
                                                                                           
                     /free                                                                 
                      clearSrvPgm();                                                       
                                                                                           
                      // setup fields (NOTE that the url dosn't have to be encoded)        
                      longUrl = 'http://translate.google.com/?hl=en#en/de/this is a'        
                       + ' test of google translate';                                       
                                                                                            
                      handle = uniqueKey();  // create unique handle                        
                                                                                            
                      pcCmd = 'rundll32 url,FileProtocolHandler ' // starts default browser 
                       + 'http://192.168.63.10:8080/pextcd2lib/redirectsv.pgm?hdl='+handle; 
                                                                                            
                      // generate a redirect html/javascript document and place it          
                      // in the local directory /myRedirects                           
                      setContent('*none');                                                  
                                                                                            
                      htmlnode('html');                                                     
                      htmlNode('head');                                                     
                                                                                            
                      htmlNode('script':'language="javascript"');                           
                                                                                            
                        echo('var uri = encodeURI("' + longUrl + '");');                    
                        // echo('alert(uri);');  // *** just for testing ***                
                        echo('parent.location.href = uri;');                                
                                                                              
                      htmlEndNode();                                          
                      htmlEndNode();                                          
                      htmlEndNode();                                          
                                                                              
                      echoToStmf('/myRedirects/redir' + handle + '.htm':1208);
                                                                              
                      pcCall(pcCmd);                                          
                                                                              
                      *inlr = *on;                                            
                     /end-free

                    CLLE program REDIRECTCL

                    Code:
                                 PGM        PARM(&PCCMD)                     
                                 DCL        VAR(&PCCMD) TYPE(*CHAR) LEN(123) 
                                 STRPCO                                      
                                 MONMSG     MSGID(IWS4010)                   
                                 STRPCCMD   PCCMD(&PCCMD) PAUSE(*NO)         
                                 ENDPGM

                    RPGLE CGI program REDIRECTSV

                    Code:
                     /copy qsrc,pxapihdr      General H-Spec's                            
                                                                                          
                     * powerEXT Service Program Connector                                 
                     /copy qsrc,pxapicgicn    Basic HTTP connecter & Productivity Services
                                                                                          
                     * Declare Internal Variables                                         
                    d handle          s             32a                                   
                    d file            s            256a   varying                         
                    d rc              s             10i 0                                 
                                                                                          
                     /free                                                                
                      clearSrvPgm();                                                      
                                                                                          
                      getExtInput();                                                      
                      handle = getExtVar('hdl');                                          
                                                                                          
                      file = '/myRedirects/redir' + handle + '.htm';                      
                                                                                          
                      setContent('text/html');     
                                                                                
                      rc = storeFromStmf(0:file);                             
                                                                              
                      if rc = 0;                                              
                        Qcmd('DEL OBJLNK(''' + file + ''')');                 
                      else;                                                   
                        htmlNode('html');                                     
                        htmlNode('body');                                     
                          htmlNode('h1':'':'File ' + handle + ' not found!'); 
                        htmlEndNode();                                        
                        htmlEndNode();                                        
                      endif;                                                  
                                                                              
                      echoToClient();                                         
                                                                              
                      *inlr = *on;                                            
                     /end-free
                    Cheers...
                    Nil

                    Comment


                    • #11
                      Digging up an old thread, I was able to get around the limitations to write a .bat file for different purposes. There's probably 100 things wrong with this, but this worked for me....to a point! I wanted to open .txt files from the /downloads folder with Excel. I wrote a .bat file in the IFS which I then executed with STRPCCMD. This .bat writes and calls another. That's where I left off. It's a little ugly, but it worked.
                      PHP Code:
                      echo echo start excel.exe "" "%userprofile%\downloads\qprt198.txt" ^> c:\Users\Public\Documents\OpenDocs.bat c:\Users\Public\Documents\CreateBat.bat
                      echo echo start excel.exe "" "%userprofile%\downloads\qprt199.txt" ^>^> c:\Users\Public\Documents\OpenDocs.bat >> c:\Users\Public\Documents\CreateBat.bat
                      echo echo start excel.exe "" "%userprofile%\downloads\qprt200.txt" ^>^> c:\Users\Public\Documents\OpenDocs.bat >> c:\Users\Public\Documents\CreateBat.bat
                      echo c:\Users\Public\Documents\OpenDocs.bat >> c:\Users\Public\Documents\CreateBat.bat
                      SLEEP 1
                      c
                      :\Users\Public\Documents\CreateBat.bat 
                      PHP Code:
                      PGM                                                        
                      STRPCO                                                     
                      MONMSG     MSGID
                      (IWS4010)                                  
                      STRPCCMD   PCCMD('del c:\Users\Public\Documents\CreateBat.bat'PAUSE(*NO)                                    
                      STRPCCMD   PCCMD('del c:\Users\Public\Documents\OpenDocs.bat'PAUSE(*NO)                                    
                      STRPCCMD   PCCMD('\\nnn.nnn.nnn.nnn\ifs\temp\OpenExcel.bat'PAUSE(*NO)                                
                      ENDPGM 
                      Your friends list is empty!

                      Comment


                      • #12
                        Hello Henrik

                        I try to apply your advanced version but it does not walk.for me.
                        I installed well both libraries PEXTCD2LIB and PEXTCD2 of powerEXT
                        I followed this procedure Download

                        Distribution of powerEXT for node.js is under reconstruction and is therefore not available

                        the latest versions of powerEXT Core and powerEXT for node.js.

                        powerEXT for node.js ? beta in the IBM i version includes both powerEXT for node.js and powerEXT Core that is discontinued as an independent project.





                        Installation of powerEXT Core:



                        ** the installation should be run under an **

                        ** user profile with *ALLOBJ authority **
                        1. Download the savf to your PC
                        2. FTP it to a savf on your iSeries
                        3. Restore the library PEXTCD2 from it
                        4. Run CALL PEXTCD2/PXCRTCD2 ? converts all source files to your CCSID and recompiles all programs to current IBM i OS version.
                        5. include PEXTCD2 in your library list



                        Installation of powerEXT Core Test Environment:



                        powerEXT Core comes with a little environment for test. The Installation will create an Apache Server named pextWebCD2 listening on port 8080 and it will create a CGI program library named PEXTCD2LIB that also includes misc. examples.

                        When running the installation program the web-server is started automatically If port 8080 is free, if not, the port in ?listen? in the file httpd.conf has to be changed using EDTF STMF(?/pextwebCD2/conf/httpd.conf?)

                        The web then has to be restarted with STRTCPSVR SERVER(*HTTP) HTTPSVR(PEXTWEBCD2) You can verify that the test environment is installed by entering the the following URL: http://10.10.10.10:8080/ using your servers IP address instead of 10.10.10.10 this should result in a powerEXT verification page.

                        The Test Environment is installed by calling the program CALL PEXTCD2/PXWEBCD2 that starts an Apache server (pextWebCD2) on port 8080

                        I left out the Distribution of powerEXT for node.js because is under reconstruction and is therefore not available In your source REDIRECT, i just replaced ip server adress and adress of folder echoToStmf('C:/myRedirects/redir' + handle + '.htm':1208);
                        In your source REDIRECTSV, i just replaced adress of folder file = 'C:/myRedirects/redir' + handle + '.htm';



                        When i Call REDIRECT , open Navigator but File 0658824576090092642017091655087 not found!

                        When I debug program , there isn't file in folder myredirects. Program don't generate a redirect html/javascript document and place it in the local directory /myRedirects

                        I try pathfolder like you /myRedirects/ but it's the same result.

                        What is that I forgot something in the installation ? Or in your source ?

                        Thank you in advance for your help and good weekend.

                        Ps : Sorry for my English because I am French

                        Comment


                        • #13
                          Since STRPCCMD nowadays only makes sense for network-connected Windows PCs, each PC can access server shares. And a program that runs STRPCCMD can create a file in a network-shared directory and give the file a name that is unique to the job, e.g., JOB+USER+JOBNUMBER. Any link or other string can be stored in the file, and the PC should be able to access it as PC data, even as a .BAT file.
                          Tom

                          There are only two hard things in Computer Science: cache invalidation, naming things and off-by-one errors.

                          Why is it that all of the instruments seeking intelligent life in the universe are pointed away from Earth?

                          Comment

                          Working...
                          X