lunes, 10 de octubre de 2011

Setting file name in dynamically generated files wiht HTTP headers

Content-Disposition

The Content-Disposition response-header field has been proposed as a means for the origin server to suggest a default filename if the user requests that the content is saved to a file. This usage is derived from the definition of Content-Disposition in RFC 1806 [35].
content-disposition = "Content-Disposition" ":"
                              disposition-type *( ";" disposition-parm )
        disposition-type = "attachment" | disp-extension-token
        disposition-parm = filename-parm | disp-extension-parm
        filename-parm = "filename" "=" quoted-string
        disp-extension-token = token
        disp-extension-parm = token "=" ( token | quoted-string )
An example is
Content-Disposition: attachment; filename="fname.ext"
The receiving user agent SHOULD NOT respect any directory path information present in the filename-parm parameter, which is the only parameter believed to apply to HTTP implementations at this time. The filename SHOULD be treated as a terminal component only.
If this header is used in a response with the application/octet- stream content-type, the implied suggestion is that the user agent should not display the response, but directly enter a `save response as...' dialog.
See section 15.5 for Content-Disposition security issues.


Content-Disposition

The original MIME specifications only described the structure of mail messages. They did not address the issue of presentation styles. The content-disposition header field was added in RFC 2183 to specify the presentation style. A MIME part can have:
  • an inline content-disposition, which means that it should be automatically displayed when the message is displayed, or
  • an attachment content-disposition, in which case it is not displayed automatically and requires some form of action from the user to open it.
In addition to the presentation style, the content-disposition header also provides fields for specifying the name of the file, the creation date and modification date, which can be used by the reader's mail user agent to store the attachment.
The following example is taken from RFC 2183, where the header is defined
Content-Disposition: attachment; filename=genome.jpeg;
         modification-date="Wed, 12 February 1997 16:29:51 -0500";
The filename may be encoded as defined by RFC 2231.
As of 2010, a good majority of mail user agents do not follow this prescription fully. The widely used Mozilla Thunderbird mail client makes its own decisions about which MIME parts should be automatically displayed, ignoring the content-disposition headers in the messages. It also sends out newly composed messages with inline content-disposition for all MIME parts. Most users are unaware of how to set the content-disposition to attachment.[4] Many mail user agents also send messages with the file name in the name parameter of the content-type header instead of the filename parameter of the content-disposition header. This practice is discouraged.[5]

lunes, 29 de agosto de 2011

301 redirection with wikidot pages

Visto en http://doc.wikidot.com/module:redirect

Redirect
Short Description
Performs a "301" redirect from a page with optional URL mapping

Description

The Redirect module performs a "301 Permanently Moved" redirection, i.e. it tells a web browser to request another web page.

Attributes

attribute required allowed values default description
destination yes page-name or URL none where to redirect?
When the destination attribute is just an alphanumeric string, e.g. "start", the page which contains the Redirect module will automatically forward the browser to the wiki page called "start". If destination is the whole URL address (e.g. "http://slashdot.org"), the browser will be redirected to this external address.

Mapping

If the destination attribute ends with a slash, e.g. destination="start/" or destination="http://www.example.com/", the current URL will be mapped to the destination in the following way. The code for the module would be:
[[module Redirect destination="http://www.example.com/base/"]]
Now if the Redirect module is placed on page http://your-wiki.wikidot.com/redir the following mapping will be performed:
from to
http://your-wiki.wikidot.com/redir http://www.example.com/base/
http://your-wiki.wikidot.com/redir/mapped-path http://www.example.com/base/mapped-path
http://your-wiki.wikidot.com/redir/mapped-path/file1.html http://www.example.com/base/mapped-path/file1.html

Preventing the redirect

If the Redirect module redirected the browser always there would be no way to edit the actual page. The solution is to pass an extra parameter to the module in the URL as follows:
http://your-wiki.wikidot.com/page-with-redirect/noredirect/true
There should be an information box where the module is placed.
Working with the Redirect module might not be very convenient but even of you have to do this you will not configure it every day ;-)



domingo, 28 de agosto de 2011

Use '=' or LIKE to compare strings in SQL?


LIKE and the equality operator have different purposes, they don't do the same thing: = is much faster, whereas LIKE can interpret wildcards. Use = wherever you can and LIKE wherever you must.

SELECT * FROM user WHERE login LIKE 'Test%';
-- Matches
-- TestUser1
-- TestUser2
-- TestU
-- Test
-- etc.

Registros duplicados con SQL

Here's a handy query for finding duplicates in a table. Suppose you want to find all email addresses in a table that exist more than once:

SELECT email,
COUNT(email) AS NumOccurrences
FROM users
GROUP BY email
HAVING ( COUNT(email) > 1 )

You could also use this technique to find rows that occur exactly once:
SELECT email
FROM users
GROUP BY email
HAVING ( COUNT(email) = 1 )

domingo, 19 de junio de 2011

Expandir textos con JQuery y su plugin Expander

Estoy en pleno desarrollo de una web relacionada con el mundo de los mapas y la cartografía. El tema está es que, dentro de una sola página tienen que convivir textos descriptivos, que en algunos casos pueden ser muy grandes, con mapas interactivos, y siempre es deseable que el mapa ocupe un lugar predominante en el diseño final.

Buscando alguna solución para que de los textos descriptivos solo se muestre una parte, pudiéndose leer el resto al pulsar sobre éstos, me he encontrado un magnífico plugin de la librería javascript JQuery: JQueryExpander.

La verdad es que es muy simple de utilizar:

En primer lugar se "importan" las librerías javascript JQuery, y su plugin JQueryExpander (en el ejemplo uso una librería local, también se puede referenciar la librería publicada por los desarrolladores):






Seguidamente, el texto que se quiera hacer "expandible" hay que marcarlo con etiquetas CSS (div, p, etc:


Finalmente, añadimos un script a la cabecera de la página html (header) que ejecute un código de inicialización al cargarse la página, código que manipula los elementos que hemos marcado como expandibles.



sábado, 23 de abril de 2011

Replace All en Javascript

En ocasiones cuando trabajamos con Javascript, es necesario buscar una cadena de texto y sustituirla por otra.

El API de javascript tiene una función, para los objetos de tipo cadena de texto (String) replace, pero ésta solo sustituye la primera ocurrencia que encuentra.

Así, si tenemos el texto "primero;segundo;tercero" (campos separados por ;, típico cuando trabajamos con ficheros en formato CSV), y con javascript queremos sustituir el separador ; por el separador ',', el siguiente código no funcionará:

"primero;segundo;tercero".replace(";",",")

Pues devolverá el siguiente resultado:
"primero,segundo;tercero" (es decir, solo sustituirá la primera ocurrencia).

Podemos conseguir sustituir todas las ocurrencias del texto a cambiar haciendo uso de expresiones regulares, en concreto de la expresión /textoAcambiar/g (el /g le indica al motor de sustitución basado en expresiones regulares que busque todas las ocurrencias).

Si el texto a sustituir está en una variable javascript, el código a emplear sería el siguiente:


var separator = ";";
var re = new RegExp(separator, "g");
var textoNuevo = "primero;segundo;tercero".replace(re, ",");

domingo, 17 de octubre de 2010

Añadir más widgets a la cabecera de la plantilla de Blogger (y II)

En una entrada anterior veíamos cómo podíamos desbloquear la cabecera de la plantilla de Blogger, para poder añadir más widgets aparte de la propia cabecera, con una técnica que no solo vale para la cabecera de la plantilla sino también para cualquier sección.

Decíamos que solo había que localizar la etiqueta que sirve para representar una sección de la plantilla (<section>),y dentro de ésta el atributo maxWidgets, que índica el número máximo de widgets que puede tener esta sección.



No obstante, hay un paso más que no comenté en esa entrada, paso sin el cual desde el menú de Diseño de Blogger (en concreto desde la pestaña elementos de página) no nos aparecerá la opción "Añadir un Gadget" en la sección que habíamos desbloqueado con los pasos mencionados en la entrada anterior.

dev4bloggers_showaddelement

Este paso consiste en modificar el atributo showaddelement de la etiqueta <section> para que tome el valor 'yes', en lugar del valor 'no', como podemos ver en la figura anterior.

English.

In a previous post we saw how we could unlock the head of the Blogger template to add more widgets than their own head , with a technique that not only applies to the head of the staff but also to any section.

We said we only had to locate the label used to represent a section of the template (<section>
), And within this maxwidgets attribute that indicates the maximum number of widgets that can be found.



However, there is one more step that did not mention in that entry, step, without which the menu Blogger Design (specifically from the page elements tab) does not see the option "Add a Gadget" in the section had unlocked with the steps mentioned in the previous entry.

dev4bloggers_showaddelement

This step is to modify the attribute label showaddelement
to take the value 'yes' instead of the value 'no', as seen in the previous figure.

Limpiar un Wordpress hackeado

 Check list para limpiar instancias de Wordpress que han sido hackeadas, y para prevenir hackeos. Para técnicos de sistemas con acceso SSH a...