Feeds, issues, packages and code source about emulation and pograming, of VENENUX proyects, Debian related distros and massenkoh!

gambas/rapidsvn/subversion : avoit 413 entity too large, avoit 411 Length required

Subversion 1.8.0 has switched from neon to serf for HTTP access. The Serf-based HTTP access library would use chunked transfer encoding for most requests.

Here we cleared and made recomendations and solution on mixed environments, for those that using not well configured linuxes (such those using rolling releases as alpine, arch etc) and stupid winbuntu based:

BACKGUARDS PROBLEMS: using 1.8 agains 1.7/1.6 servers:

Many issue come with migrations, not all are good: as documented: http://subversion.apache.org/docs/release-notes/1.8.html#411-length-required
When the mod_dav_svn Subversion server is fronted by a proxy or are by passing using reverse proxy web server Subversion would sometimes either treat this as a fatal error, theres the two most comman cases:

CASE 1: 411 Length required:
..such as Nginx prior to 1.3.9 or hiawatta (if are acting as reverse proxy frontend) will responds with a 411 Length Required, Subversion would sometimes either treat this as a fatal error, such as:

% svn commit 
POST of '/svn/project1/!svn/me': 411 Length Required

CASE 2: 413 Request entity too large:
Also if u use mixed environment from venenux and newer stupid debians and alpine linux, could'n chekout newer clients agains well stable 1.5 or 1.6 older servers, so will raise fatal error such as:

% svn cchekout http://domain/svn/project1
svn: E175002: Unable to connect to a repository at URL
svn: E175002: Unexpected HTTP status 413 'Request Entity Too Large'

CLIENT SIDE SOLUTION that must be made:
A http-chunked-requests option has been added to the ~/.subversion/servers per user configuration file. Users who wish to avoid the additional request may set that option to yes or no in order to short-circuit the additional request and avoid making it. We recommend not to set that option (or to set it to its default value, auto) unless you have special circumstances which require it (such as an unusually high latency).

When using clients version 1.8/1.9, agains olders servers 1.7/1.6/1.5 versions, you must set this to "no" in order to avoid the described problems.

SEVER SIDE SOLUTIONS and recomendations:
There options must be set in server, specially if your server subversion software differts from subversion clients, to already go better the compatibility in high latency and high traffic sidtes

config optionapache2lighttpdValue must
maximum size of andXML-based request bodyLimitXMLRequestBodyserver.max_request-size0
Limit the size of data in body request clientLimitRequestBodyserver.max_request-size2097152
number of requests allowed per connection aliveMaxKeepAliveRequestsserver.max-keep-alive-requests7500

Of course, lasted option its only if u configured a Keep Alive to "on" that increase performace respect each client connection, but of course assumed u have already at least 1G to 2G of RAM memory on server hardware.


For those with multipurposes sites, the most realitable are using two servers, one with main entry point using lighttpd, and other with apache2 and subversion. The server with lighttpd will acts as proxy reverse, let the apache only for subversion or git. Apache could'n rely for high traffic performance, and lighty are made for that work!

The benefits of using KeepAlive, and Subversion newer options is an increase in the speed and reliability of svn while reducing cpu usage since it will not open and close as many connections when checking out code.

Those all are stupids, subversion team do not tell the complete history:

On middle sites with few repositoryes, these are good, but.. the downside is that memory usage will increase due to the fact that svn will be holding many connections at same time and waiting for requests and responses over those connections. So make sure to monitor memory usage and gauge what is right for you.

In conclusion, switch to Git and lighttpd! Default values of lighty are the recomended for git and high traffic sites.

gambas: como publicar web / how to deploy web

(UPDATED!!  construction) (ACTUUALIZADO construccion) Sea como sea, un programa gambas para web tiene gran futuro, porque sigue la sintaxis JSP/VB, pero usa la filosofia Java, lo mejor de los dos mundos actuales.. si el creador de gambas tuviera mas vision este seria el futuro de la tecnologia GNU!

0) Introduction
1) Software requirements
2) Webserver configurations combinations
3) Deployments and testing the web program

0) Introduction/Introduccion:

Please read before: http://qgqlochekone.blogspot.com/2017/03/gambas-web-la-filosofia-web-vs-la.html

El programa generado gambas (el ejecutable que por lo general tiene extesion gambas) es en si un "escupidor de html", este es el que se invoca en el request y este emitira el response.

The gambas program generated (that exec by general have gambas extension) its per se an "html ouput renderer", that its the file called in the request and that emit the response.

From the IDE vs from the webserver! CUIDADO/BEWARE!

No es el mismo, cuidado! el IDE gambas ejecuta el codigo embebido en su propio wervidor http usando puerto 8080, el path server sera el directorio del proyecto, el server web root sera la raiz del url ... es decir corre un servidor web como si fuera entero para el proyecto! Cuando ud despliegue el cgi esto cambia radicalmente confundiendolo!

Not the same, beware! The gambas IDE run the embedded code on its own http web server using port 8080, the server path will be the application path, the server web root will be root of the server runnign from the url  web browser as if the hole only for the project! When the CGI is deployed this radically changes confusing it the developer!


We need a webserver, a gambas ide compiler and gambas script interpreter, unless u only make cgi's the scripter are innecesary. The recomended install command must be done open a console and swichting to root:

RequerimentAvailablerecomended and install commandexplanation
apt-get install lighttpd apache2.2-utilsprovides the cgi andler and web interface to request to bypass to the cgi produced by gambas, webservers like nginx does not provide good cgi handler and its not supported, hiawatha its not recomended for production large deployments
apt-get instal gambas3-runtime gambas3-web gambas3-util-web gambas3-xml gambas3-xml-rcppermits compiling the program tht will be acts as cgi program and produces the html rendering. The ide component was given due install many of the necesary, but in server its not recomended.
Scriptergambas3-scripterapt-get install gambas3-scripterpermits interpret a source files and based on their content as script will render html or not using logic, its only recomended for static content that only need minimal logic, when fails show the source code in webserver


open console
gin root privilegies: su
run command: apt-get install

Requerimientospaquetevalor inicial y ruta ejecutoramodulo
apacheapache2.2-binScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
AddHandler cgi-script .cgi .sh .pl
a2enmod cgi
lighttpdlighttpd$HTTP["url"] =~ "^/cgi-bin/" {
cgi.assign = ( "" => "" ) }
lighty-enable-mod cgi

2.1) Default configurations parameters

configuration by default let only /usr/lib/cgi to permits and as place for cgi scripts...  keep reading to enalbe others or per user
Solo los ejecutablesOptions +ExecCGIcgi.execute-x-only = "enable"permite en donde lo coloques que cualquier cgi se ejecute, por defecto solo el directoro /cgi-bin/ los ejecuta y el htdocs /var/www/html
Solo algunas extensionesAddHandler cgi-script cgi gbacgi.assign = ("gba" => "gba")
Cgi.assign += ("cgi" => "cgi")
Si por alguna razon no funciona, cambia la extension a “cgi” o “gba” y con esta option los “separas” explicitamente a ejecutar

2.2) User server configure cgi:

Para el directorio web por usuarios
( ~user)
Options ExecCGI
    SetHandler cgi-scri
$HTTP["url"] =~ "^(/~[^/]+)?/cgi-bin/" {
    cgi.assign = ("" => "")

permite en donde lo coloques que cualquier cgi se ejecute, por defecto solo el directoro /cgi-bin/ los ejecuta
Solo interpretar scriptsAddHandler cgi-script gbacgi.assign = ("gba" => "gbs3")
Solo interpretar los script no compilados, y que los ejecute el compilador/interprete gambas con el http server embebido, esto solo se hace para los archivos no compilados.
NOTA: no es seguro, si el script falla, el codigo es escupido al navegador!


3.1) configuring CGI

On standars web server of providers webservers ther's only two paths where the "produced program" (the gambas compiled program u make) can be deployed, in the "/cgi-bin/" web path, and there's two only places for them, globally and per users, theres configurations for both cases:
WebserverInitial/global configsPer user configsScript aditionspackage relatedmodule related
apacheScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ AddHandler cgi-script .cgi .sh .plOptions ExecCGI SetHandler cgi-scriptAddHandler cgi-script .gbs ()apache2.2-bina2enmod cgi cgid alias userdir
lighttpd$HTTP =~ "^/cgi-bin/" { cgi.assign = ( "" => "" ) }$HTTP =~ "^(/~[^/]+)?/cgi-bin/" { cgi.assign = ("" => "") }cgi.assign = ("gbs" => "gbs3")lighttpdlighty-enable-mod cgi alias userdir
() in apache there's still no way to workaround the interpreting of the scrips at the momento of writing this how to

2) producing the program cgioose th
  • In the ide, go to menu->project
  • Create-> executable
  • If u use the "per user configuration" choose the directory output as "public_html" under your home
  • Choose the name of the output program, by default "programname.gambas"
  • If the webserver only permits cgi's porgrams with .cgi extension put in second input: mv $(FILE) $(FILE).cgi
  • The cgi program now can be invoked from url http://localhost/~username/cgi-bin/programname.gambas.cgi
All of this its taking in consideration that inside your home, there's a "public_html" directory, used and handled by the webserver as per user web content, and also under this there's a "cgi-bin" directory, that its for cgi programs, and the webservers software are only apache2 or lighttpd.


Gambas web: la filosofia web vs la filosofia desktop

En los inicios las aplicaciones de computadoras (seria de ignorantes decir "informaticas") se limitaban a aquellas instaladas en el computador "localmente", la internet si era algo relacionado con "informatica", puesto que solo "ofrecia informacion", hoy dia esto ha evolucionado, y Gambas ha incursionado en el ambito web 2.0 de hoy.

Introduccion a web

WEB 1.0 : es de sólo lectura, es decir en los inicios solo existia HTML estatico, el servidor web tenia un archivo de tags html y el usuario visualizaba el contenido. El usuario no puede interactuar con el contenido de la página (nada de comentarios, respuestas, citas, etc), estando totalmente limitado a lo que el servidor web ofrecia o mostraba desde los archivos html (lo que el servicio subia al servidor).

WEB2.0: esto es lo que hoy dia llaman incorrectamente aplicacion web, esto es posible con los sistemas de programacion web dinamica, o "paginas web dinamicas"; permite a sus usuarios interactuar con el contenido segun las acciones que este realize, haciendo ver que interactua con otros usuarios o cambiar contenido del sitio web, en contraste a sitios web no-interactivos donde los usuarios se limitan a la visualización pasiva de información que se les proporciona.

Como funciona la web 2.0

Usa los principio de peticion-respuesta (request-response), el lenguaje de programacion, toma el contenido del request y basado en la logia propia del sistema web emite un response. La dinamica aqui es que gracias a el lengaje de programacion se puede analizar el contenido y aplicar reglas de logica, cosa que en la web 1.0 no se podia, ya que el request estaba limitado a pedir un nombre de archivo (aparte de la informacion de protocolo).

Gambas y web: Interpretado y precompilado

Las tecnologias mas completas ofrecen dos maneras de manejar y ofrecer contenido dinamico: interpretado y precompilado. De las mas famosas esta Java y/o .Net brindan programacion de sistemas web 2.0 en las dos formas y las usaremos para ejemplificar e ilustrar esto.

Esta tabla es ilustrativa y vaga, solo como punto de partida a los menos conocidos.
Referencia RapidaGambasPythonJavaEE.Net

Esto porque ejecutar gambas no requiere de una extension, el programa precompilado puede tener extension o no tenerla, el servidor web segun como se prepare lo ejecutara sea precompilado o interpretado.

Diferencias entre las tecnologias

Gambas es RAD, asi como JAva lo es, son diseñados para rapidamente ser aprendidos y rapidamente ser desplegados, gambas para desplegarse al igual que Java solo necesita los componentes de su propia tecnologia, mientras que Python y .Net para cualquier funcionalidad especial, aun siendo programada en el mismo leguaje, requiere de software externo.
Para los ignorantes, Python, Java y .Net son populares porque tiene grandes empresas detras de ellos: Inte/Google, Oracle y Mocosoft respectivamente. Fuera de esto pytnon en sus inicios era una basura por hobbie y .Net solo un experimento para sacarle el cuerpo a Java y lograr entrar en el ambito web.
MadurezNoSiAltaSi* Gambas aun sin dinero, crece solido, robusto y compatble entre versiones de su api.
* Python y .Net le tuvieron que inyectar mucho dinero
* Java cuenta con dinero, y aun asi cambian demasiado su api
EnfoquePequeñoGenericoEmpresarialEmpresarial* python “pretende” convertirse de algo general en algo empresarial
* Java es empresarial, nacio empresarial y es las grandes ligas, el maestro.
* .Net pretende ser mejor que java, con tanto dinero le falta aun mucho mercado.
* Gambas parece no tener vision de futuro... duele pero es la verdad.
AprendizajeRapidoLentoLentoLentisimo* Gambas es BASIC, es lo mas facil en el mundo.. Para un programador no relacionado, es facil el lenguaje BASIC de gambas, las empresas privadas no quieren invertir recursos en programadores costosos (python, Java, .Net) o enseñar a los suyos.
RADSiNoSiNo* dado la facilidad y el diseño, solo Gambas y Java son RAD (Rapid Aplication Developent), para python es imposible ser algo para lo que no fue construido, para .Net no es su enfoque lo que evidencia su mal diseño.
ExcelenteNuncaExcelenteNo* Con gambas el programador no necesita volver aprender, vive una vida!
* Con Java hay compatibilidad pero las caracteristicas nuevas LAS IMPONEN como estandares!
* El mayor problema de python y .Net es que no funcionan entre distintos apis.
RequerimientosPocosMediosMuchosMuchos* Desplegar gambas web solo gambas y cgi
* Desplegar python solo requiere python y cgi
* Desplegar Java o .Net requiere una gran cantidad de potenca y recursos extra.
MultiplataformaSiSiSiNo* Sin comentarios para lo obvio, cualqeuir eleccion aquí es mejor que .Net.

Que necesito saber para desplegar web en gambas?

Lamentablemente aqui se requiere estar familiarizado, mientras que en python, java y php solo se necesita conocimeintos minimos, en Gambas y .Net se necesita comprender bien dos conceptos clave: el "request" y el "response".
HTTP se basa en un modelo solicitud / respuesta, de modo que hay dos tipos de mensajes HTTP: la solicitud y la respuesta. El navegador abre una conexión a un servidor y realiza una solicitud. El servidor procesa la solicitud del cliente y devuelve una respuesta. La figura siguiente ilustra este proceso.
Aunque hay varios métodos de HTTP para recuperar datos de un servidor, las dos más utilizados son GET y POST.
En gambas es importante comprender estos conceptos, en php y Java, no es tan importante la comprension porque el lenguaje como tal al no ser RAD provee en si suficiente herramientas para procesar las respuestas como si se tratara de un mismo sitio, en ves de una contesta lejana. Esto es porque los frameworks abstraen estos complejidades, mientras que en gambas se le ofrece al programador el total control de lo que fabrica (es RAD recuerde):

Que necesito tener y como despliego mi programa gambas?

Necesitas un servidor con capacidad CGI, tambien se puede con FastCGI pero es bastante complicado. Hay dos maneras de lanzar el codigo gambas:
Interpretado: se le indica al servidor web que el gambas interpreter es el CGI como tal y este interpretara indicandosele que provea de su servidor httpd embebido, y que procese el proyecto entero. A diferencia del servidor web, esta es la manera en que se ejecuta el proyecto cuando esta en el IDE RAD grafico solo que sin ejecutar un CGI que pase el control.
Precompilado: se fabrica un programa comun gambas, y se le dice al servidor web que lo procese como un programa CGI propio. Esta es la manera en que se debe de ejecutar en produccion.

Como comienzo a fabricar una pagina gambas web?

Cuando se arranca el ide se le indica es un proyecto web, sin embargo para el diseño de formularios graficos web es necesario manualmente indicar que se usar el modulo gb.web.forms el cual es relativamente nuevo y la ultima sensacion de la comunidad.

En el proximo articulo desplegare la receta para publicar web gambas

gambas3: collections of collections as php array of arrays

Those guys that code in php will find funny that making objects of data in tables are easy.. arrays, arrays.. that's why in php an array can handle any value, and the index can be any type, not only integer indexs. The article was inspired in a problem in gambas mail list:

But wait, in php, an array can handle multiple arrays, that its not the same of a multidimensional array! care! That its the better in this special case of this article!

I mean: an array inside an array! and the values and key of those arrays can be any type.. great!
In java, ther's some difficulty, a collection its the only way to do that and there's another, only one type of values can handle in a collection.

Unfortunatelly in Gambas its more harded yet: must be collections and must iterate twice to handle values in.

An Example:

..lets get simple: a registry "order" that have many "products" so :
In java, there's DAO objects, but with collections, and in php more easy, only an array in array! 

The Data example:

* Main object: object (1 element with many attrs) and one of those attrs, its the cod_contenido , of the products of the order 
* Second objects: attr:cod_contenido-> (object with many elements, and each element many atrrs) 

|   ORD101                    |
| cod_orde:101                |
| des_order:description bla bl|----------------------------|
| cod_contents:1011           |        CON1011             |
                              |    cod_product:101,        |
                              |    cod_order:101,          |
                              |    can_product:2           |
                              |    cod_product:102         |
                              |    cod_order:101           |
                              |    can_product:12          |

The make it on php:

In php only has to convert to array each recordset and then iterate each element,, the trick that makes php easy to use its that in the interesting key "cod_contenido" we can stop, iterate again and put inside the main array.. lets see:

$conn = mysqli_connect($servername, $username, $password, $dbname);
$orders = "SELECT * FROM almorder WHERE cod_order = '001'";
$ordersproducts = "SELECT * FROM alorderproducts WHERE cod_order = '001'";
$result = mysqli_query($conn, $orders);
foreach($result as $keyname => $valuename) 
    $orderarray[$keyname] = $valuename; 
    if ( $keyname == 'cod_contenido' )
        $resultdet = mysqli_query($conn, $ordersproducts);
        foreach($resultdet as $keynamedet => $valuenamedet)
            $orderdetail[$keynamedet] = $valuenamedet;
        $orderarray[$keyname] = $valuename;

The make it on Gambas:

In gambas there's quite more complicated due inside the key name, we will have and reference, an the real value will be another object, in php we can access directly no matter if are other king of data, in gambas we must iterate for each object that will put in collection:

orders = "SELECT * FROM almorder WHERE cod_order = '001'";
ordersproducts = "SELECT * FROM alorderproducts WHERE cod_order = '001'";
rset = $conexion.Exec(orders)
For Each rset
    columnas = New Collection(gb.IgnoreCase)
    For Each hField In rset.Fields
        columnas.Add(hField.Name), rset[hField.Name])
        if ( Comp(hField.Name, "cod_contenido") == 0 ) then
            rsetdet = $conexion.Exec(ordersproduts)
            filasdet = New Collection(gb.IgnoreCase)
            For Each rsetdet
                columnasdet = New Collection(gb.IgnoreCase)
                For Each hFieldet In rsetdet.Fields
                    columnasdet.Add(hFieldet.Name), rsetet[hFieldet.Name])
                filasdet.Add(columnaset, rset!cod_contenido)
            columnas.Add(filasdet, "cod_contenido")
    filas.Add(columnas, rset!cod_despacho)

In the mail list the error was stupid, a typo in the line that added the "cod_contenido" object to the main collection object.. was added the same eveer!

mysql to sqlite: COMMENTS error near - SOLUTION

When export or try to run a sql script into sqlite and have the "COMMENTS" keyword usage, sqlite arent able to procesed the script, due stupid developers does not handle support since many years:
LOOK HERE: http://sqlite.1065341.n5.nabble.com/Feature-request-add-support-for-COMMENT-statement-td69401.html

so the solution its to grep and replace (take easy, u can made it in geany of venenux) using a regular expresion:

1) open geany
2) load the script
3) menu->search->replace
4) marks use regular expr
5) the word to search will be COMMENT \'.*\'
6) the word to replace it will be empty
7) pull down avanced "Replace all" and select Document
8) that's all

now at least COMMENT keyword was eliminated from script and sqlite can procesed the sql.