Es triste ver que un navegador tan bueno (por la forma en la que interpreta los javascript, css, etc.) me este presentando muchas fallas últimamente. Me refiero a Firefox, el cual actualicé a la versión 8 la semana pasada y todo parecía ir de maravilla hasta hace 2 días. Al parecer Firefox arrastra una serie de fallas desde versiones anteriores (3.6) que no han podido corregir al 100%. Hablo/escribo acerca de la falla en que el navegador deja de mostrar las páginas y sólo se ve el estado de carga en "Conectando", posteriormente el usuario cierra el navegador pero al tratar de reiniciarlo aparece un cuadro de dialogo indicando que no es posible porque aún no se cierra el anterior proceso. Sólo cerrando el navegador desde al administrador de tareas es posible terminar el proceso (además de tener que cerrar los múltiples "plugin container.exe" que se iniciaron.
Todo pareciera ir bien al tratar de navegar pero luego de un rato vuelven los síntomas y hay que reiniciar el navegador nuevamente. Muchos recomiendan crear un nuevo perfil de Firefox pero no ha resultado aún. Lo único que note es que también actualicé el iTunes a la versión 10 (coincide con el inicio de los síntomas) y al querer desinstalarlo mientras navegaba con Firefox no pude porque requería que el navegador estuviera cerrado (WTF?!).
Todo lo anterior me orilló a instalar el Google Chrome (aún no me acostumbro) y la primera impresión iba bien hasta que decidí visitar un sitio que creé y ¡Sorpresa! Un poco de javascript (a través de jQuery) que escribí no funcionaba, específicamente la función click de un input de tipo file. El evento si es procesado por Chrome pero no abre el cuadro de dialogo para selección de archivo sí el input tiene un estilo display:none; Anteriormente tuve que adaptar el script porque Firefox si abre el dialogo de selección de archivo aunque el input=file tenga un estilo display:none pero IE no. Así que tanto en IE como en Chrome el tipo de "display" no puede ser "none" (algo que no me gusta pero tendré que lidiar con ello hasta la próxima actualización de Firefox) en los input:file en los que queremos ejecutar el evento click. Pero cuidado, el Chrome si lanza el evento y ejecuta el código que escribas en él, más nunca abrirá el dialogo de selección de archivos.
Para finalizar sólo quiero aclarar que la consola, y herramientas para desarrolladores, del Chrome es más completa que la de Firefox pero me gusta la simpleza del último.
jueves, 1 de diciembre de 2011
lunes, 28 de noviembre de 2011
Lua tags en HTML
Bueno, este es un pequeño script medio extraño (no pregunten como funciona) que permitirá ejecutar código lua (con sus respectivos tags <%lua //codigo %> al estilo php) dentro de los html. Ello significa que no requieren de un servidor con soporte php para crear páginas dinámicas que su propio servidor programado en lua puede generar.
Un ejemplo del código es el siguiente:
<%lua usuario='pepe' %>
Hola <%lua echo(usuario) %>
<%lua for x=1, 10 do
echo("lo:"..x.."\n")
end %>
<%lua for x=1, 10 do %>
this is loop: <%lua echo(x); %>;
<%lua end %>
Como verán este código HTML con lua tags usa tanto los tags normales como los que el php nos permite usar en loops y declaraciones condicionales combinando todo.
Un ejemplo de cómo utilizar este script con el anterior código es este:
local s = [[<%lua usuario='pepe' %>
Hola <%lua echo(usuario) %>
como estas
<%lua for x=1, 10 do
echo("lo:"..x.."
")
end %>
<%lua for x=1, 10 do %>
this is loop: <%lua echo(x); %>
<%lua end %>]];
print(ExecuteLuaTags(s,"html.html"));
- El código lo he puesto en una variable de tipo string llamada s
- Enviamos dicha variable a la función ExecuteLuaTags junto con una ruta al archivo final que se generará
- El resultado lo imprimimos y como verán es sólo un valor true en caso satisfactorio o nil + errormsg en caso contrario
- Utilice pcall para evitar broncas con el código mal hecho
Aca una imagen del resultado visto en el navegador web (html resultante) del anterior script:
Y sin mayor preámbulo aca les dejo el link al script en pastebin: http://pastebin.com/VGyjSBV4
Un ejemplo del código es el siguiente:
<%lua usuario='pepe' %>
Hola <%lua echo(usuario) %>
<%lua for x=1, 10 do
echo("lo:"..x.."\n")
end %>
<%lua for x=1, 10 do %>
this is loop: <%lua echo(x); %>;
<%lua end %>
Como verán este código HTML con lua tags usa tanto los tags normales como los que el php nos permite usar en loops y declaraciones condicionales combinando todo.
Un ejemplo de cómo utilizar este script con el anterior código es este:
local s = [[<%lua usuario='pepe' %>
Hola <%lua echo(usuario) %>
como estas
<%lua for x=1, 10 do
echo("lo:"..x.."
")
end %>
<%lua for x=1, 10 do %>
this is loop: <%lua echo(x); %>
<%lua end %>]];
print(ExecuteLuaTags(s,"html.html"));
- El código lo he puesto en una variable de tipo string llamada s
- Enviamos dicha variable a la función ExecuteLuaTags junto con una ruta al archivo final que se generará
- El resultado lo imprimimos y como verán es sólo un valor true en caso satisfactorio o nil + errormsg en caso contrario
- Utilice pcall para evitar broncas con el código mal hecho
Aca una imagen del resultado visto en el navegador web (html resultante) del anterior script:
Y sin mayor preámbulo aca les dejo el link al script en pastebin: http://pastebin.com/VGyjSBV4
jueves, 17 de noviembre de 2011
Redimensionar manteniendo proporción
Este tema es básico en extremo pero he decidido publicarlo porque he notado que siguen existiendo errores al realizar esta operación de redimensión.
Es común ver bastantes fórmulas para redimensionar imágenes (por ejemplo cuando se quiere crear una imagen miniatura/thumbnail), o cualquier otro plano 2d, pero muchas de ellas no calculan la redimensión para mantener la proporción. He visto que los autores de otras fórmulas que sí mantienen la proporción son un tanto complejas y no muy claras (con código innecesario) e incluso llegan a fallar o recortar la imagen/plano resultando en algo no deseado. Así que les dejo la fórmula en Lua (pero fácilmente puede ser traducida a otros lenguajes como php, etc) para obtener los el nuevo tamaño de imagen/plano manteniendo el aspecto:
Como podrán ver la fórmula es simple porque primero debemos determinar cual de las 2 dimensiones (altura ó ancho) del plano es la mayor y de ahi crear un divisor de proporción.
Posteriormente dicho divisor de proporción es utilizado para obtener el nuevo alto y ancho del plano, apoyándonos de un redondeo al entero próximo mayor del resultado.
Con ésta fórmula no tendrán inconveniente alguno que incluso funcionará con dimensiones menores a las del thumbnail/miniatura creciendo el plano. Pero si quieren evitar que en dicho caso se agrande el plano entonces sólo deben editar la formula/código anterior quedando de la siguiente forma:
Es común ver bastantes fórmulas para redimensionar imágenes (por ejemplo cuando se quiere crear una imagen miniatura/thumbnail), o cualquier otro plano 2d, pero muchas de ellas no calculan la redimensión para mantener la proporción. He visto que los autores de otras fórmulas que sí mantienen la proporción son un tanto complejas y no muy claras (con código innecesario) e incluso llegan a fallar o recortar la imagen/plano resultando en algo no deseado. Así que les dejo la fórmula en Lua (pero fácilmente puede ser traducida a otros lenguajes como php, etc) para obtener los el nuevo tamaño de imagen/plano manteniendo el aspecto:
function resize(w,h,t_w,t_h) local divisor_proporcion = (w>h) and w/t_w or h/t_h; local new_width = math.ceil(w/divisor_proporcion); local new_height = math.ceil(h/divisor_proporcion); return new_width, new_height; end
local thumb_width = 100; local thumb_height = 100; local image_width = 350; local image_height = 491;
local new_w,new_h = resize(image_width, image_height, thumb_width, thumb_height); print(new_w,new_h);--imprimirá 72,100
Como podrán ver la fórmula es simple porque primero debemos determinar cual de las 2 dimensiones (altura ó ancho) del plano es la mayor y de ahi crear un divisor de proporción.
Posteriormente dicho divisor de proporción es utilizado para obtener el nuevo alto y ancho del plano, apoyándonos de un redondeo al entero próximo mayor del resultado.
Con ésta fórmula no tendrán inconveniente alguno que incluso funcionará con dimensiones menores a las del thumbnail/miniatura creciendo el plano. Pero si quieren evitar que en dicho caso se agrande el plano entonces sólo deben editar la formula/código anterior quedando de la siguiente forma:
function resize(w,h,t_w,t_h) if w > t_w or h > t_h then local divisor_proporcion = (w>h) and w/t_w or h/t_h; local new_width = math.ceil(w/divisor_proporcion); local new_height = math.ceil(h/divisor_proporcion); return new_width, new_height; else return w,h; end end
lunes, 14 de noviembre de 2011
Ejecutar Javascript desde un iFrame
He visto bastantes scripts donde se complican mucho para ejecutar una función desde un documento desde un iframe. Lo más fácil es:
window.parent.nombredelafuncion();
Pero también funciona con sólo parent.nombredelafuncion();
Hay que recordar probar cada script en los distintos navegadores ó por lo menos en los navegadores más frecuentes como IE, Firefox, Chrome y Safari.
window.parent.nombredelafuncion();
Pero también funciona con sólo parent.nombredelafuncion();
Hay que recordar probar cada script en los distintos navegadores ó por lo menos en los navegadores más frecuentes como IE, Firefox, Chrome y Safari.
sábado, 5 de noviembre de 2011
lua id3 v2.3 tag reader / APIC Extractor & Changer
Bueno, el título esta bastante largo pero ahí vamos. Una parte de este script es una adaptación de otro que hay para linux pero sólo en las funciones que leen los id3tag y extraen la imagen del APIC tag. El resto sno funciones hechas por mí como la que es para calcular el SafeSynch Integer en base a un integer normal y viceversa.
Agradezco a Diaelectronics por su script para convertir de hexadecimal a binario (y viceversa) ya que sin ese script no hubiera podido hacer el resto de las funciones.
El script se puede adaptar para leer y editar el resto de los tags v2.3 ó incluso añadirlos, leer los flag bytes, etc. y es por ello que dejo siempre el código fuente.
Aca el script completo con algunas modificaciones como la de insertar el APIC en caso de no encontrarlo, ó cambiar el APIC en caso de contrario.
http://pastebin.com/TTEaCGME
Adjunto una imagen donde se aprecia un mp3 cualquiera con un nuevo APIC que es un sí una captura de pantalla de un script lua.
Agradezco a Diaelectronics por su script para convertir de hexadecimal a binario (y viceversa) ya que sin ese script no hubiera podido hacer el resto de las funciones.
El script se puede adaptar para leer y editar el resto de los tags v2.3 ó incluso añadirlos, leer los flag bytes, etc. y es por ello que dejo siempre el código fuente.
Aca el script completo con algunas modificaciones como la de insertar el APIC en caso de no encontrarlo, ó cambiar el APIC en caso de contrario.
http://pastebin.com/TTEaCGME
Adjunto una imagen donde se aprecia un mp3 cualquiera con un nuevo APIC que es un sí una captura de pantalla de un script lua.
viernes, 28 de octubre de 2011
lua2html script
Este es un pequeño script para pasar código de un archivo lua a html. El resultado puede ser retornado a un string, escrito en un file handler o en un archivo nuevo.
La marcación funciones son las que esten disponibles en el actual lua state desde donde se ejecuta así que es compatible con cualquier sdk.
Al dar el código fuente pueden modificarlo como quieran (como que sólo retorne cierto html, etc.) pero eso ya va de ustedes.
Link to pastebin: http://pastebin.com/73Hc2PHF
Aca el mismo script analizado por si mismo:
La marcación funciones son las que esten disponibles en el actual lua state desde donde se ejecuta así que es compatible con cualquier sdk.
Al dar el código fuente pueden modificarlo como quieran (como que sólo retorne cierto html, etc.) pero eso ya va de ustedes.
Link to pastebin: http://pastebin.com/73Hc2PHF
Aca el mismo script analizado por si mismo:
1 --[[lua2html by WeBuLtRa v0.9]]-- 2 function lua2html(sFile, sFileOut) 3 local keywords = { "while", "function", "for", "require", "elseif", "if", "then", "else", "do", "repeat", "until", "end", "return", "true", "false", "and", "not", "or", "local", "nil", "break", "in"}; 4 local functions = {":write", ":read", ":close", ":seek", ":gsub", ":find", ":gmatch", ":format", ":lower", ":upper", ":sub", ":byte", ":reverse", ":rep", ":len", ":dump", ":char"}; 5 local operators = {"%+", "%#", "%-", "%*", "%=", "~", "%."}; 6 local t = {}; 7 local sF = io.open(sFile, "rb"); 8 if sF then 9 local function print_r(a,b) 10 if b ~= _G then 11 if type(b) == "function" then 12 table.insert(t,a); 13 print(a); 14 elseif type(b) == "table" then 15 for x, y in pairs(b) do 16 if type(y) == "function" then 17 table.insert(t,a.."%."..x) 18 print(a.."."..x); 19 end 20 end 21 end 22 end 23 end 24 table.foreach(_G, print_r); 25 local function ParseScript(s) 26 local tFs, tVars = {}, {}; 27 for key in string.gmatch(s, "function ([%w%._%:]+)") do 28 table.insert(tFs, #tFs+1, key) 29 end 30 for key in string.gmatch(s, "(%w+%.%w+) = function") do 31 table.insert(tFs, #tFs+1, key) 32 end 33 return tFs; 34 end 35 local function CheckKeywords(line, multi) 36 if not multi then 37 for x,y in pairs(keywords) do 38 line = line:gsub("([%W]+)("..y..")([%c%s%;%,%(%)]+)", 39 function(a,b,c) 40 return a.."<span style='color:blue;'>"..b.."</span>"..c 41 end 42 ); 43 line = line:gsub("^"..y.."%s", 44 function(b) 45 return "<span style='color:blue;'>"..b.."</span>"; 46 end 47 ); 48 end 49 end 50 return line; 51 end 52 local function CheckOperators(line, operators, multi) 53 if not multi then 54 for x,y in pairs(operators) do 55 line = line:gsub(y, function(a) return "<span style='color:red;'>"..a.."</span>" end); 56 end 57 end 58 return line; 59 end 60 local function CheckFunctions(line, t, multi, color) 61 if not multi then 62 for x,y in pairs(t) do 63 line = line:gsub("("..y..")%(", function(a) return "<span style='color:"..color..";'>"..a.."</span>(" end); 64 end 65 end 66 return line; 67 end 68 local function CheckALL(line, multi,t, tFs, functions) 69 line = CheckKeywords(line, multi); 70 line = CheckFunctions(line, t, multi, "darkorange"); 71 line = CheckFunctions(line, functions, multi, "darkorange"); 72 line = CheckFunctions(line, tFs, multi, "red"); 73 line = CheckOperators(line, operators, multi); 74 line = line:gsub("('[%w%d%s]-')", function(a) return "<span style='color:darkmagenta;'>"..a.."</span>" end); 75 return line; 76 end 77 local function CheckStrings(line,t,tFs,functions) 78 line = line:gsub("(.-)([\"].-[\"])", function(b,a) return CheckALL(b, multi,t, tFs, functions).."<span style='color:darkmagenta;'>"..a.."</span>" end); 79 line = line:gsub('(".+")(.+)', function(a,b) return a..CheckALL(b, multi,t, tFs, functions) end); 80 line = line:gsub("('[.]+')", function(a) return "<span style='color:darkmagenta;'>"..a.."</span>" end); 81 return line; 82 end 83 local sText = ""; 84 local sRaw = sF:read("*a"); 85 local tFs = ParseScript(sRaw); 86 sF:seek("set"); 87 local comment, multi, d = false, false, 0; 88 for line in sF:lines() do 89 d = d + 1; 90 local g = "<span style='background-color:yellow;' name='linea' >"..d.."</span><span name='linea' > </span> "; 91 line = line:gsub("[^%w]", { ["<"] = "<", [">"] = ">", ["&"] = "&", ["'"] = "'", ["="] = "=" }) or ""; 92 if not comment then 93 if line:find("%-%-%[%[") then 94 line = line:gsub("%-%-%[%[", function(s) return "<span style='color:green;'>"..s; end); 95 if line:find("%]%]") then 96 line = line:gsub("%]%]", function(s) return s.."</span>"; end); 97 else 98 comment = true; 99 end 100 sText = sText..g..line; 101 else 102 local waka = false; 103 if line:find("%-%-") then 104 local a,b,c,e,f = line:find("(.-)(%-%-)(.+)"); 105 if a then 106 if c:find("[\"].-[\"]") then 107 c = CheckStrings(c,t,tFs,functions); 108 waka = true; 109 else 110 waka = false; 111 end 112 if c:find("%[%[") and not c:find("%]%]") then 113 c = c:gsub("(.+)(%[%[.+)", function(a,s) return CheckALL(a, multi, t, tFs, functions).."<span style='color:darkmagenta;'>"..s; end); 114 multi = true; 115 end 116 if not waka then 117 c = CheckALL(c, multi, t, tFs, functions); 118 end 119 if not c:find("%[%[") and c:find("%]%]") then 120 c = c.."</span>"; 121 multi = false; 122 elseif c:find("%[%[.+%]%]") then 123 c = c:gsub("%[%[.+%]%]", function(s) return "<span style='color:darkmagenta;'>"..s.."</span>"; end); 124 end 125 end 126 line = c.."<span style='color:green;'>"..e..f.."</span>"; 127 else 128 if line:find("[\"].-[\"]") then 129 waka = true; 130 line = CheckStrings(line,t,tFs,functions,d); 131 else 132 waka = false; 133 end 134 if line:find("%[%[") and not line:find("%]%]") then 135 line = line:gsub("(.+)(%[%[.+)", function(a,s) return CheckALL(a, multi, t, tFs, functions).."<span style='color:darkmagenta;'>"..s; end); 136 multi = true; 137 end 138 if not waka then 139 line = CheckALL(line, multi, t, tFs, functions, d); 140 end 141 if not line:find("%[%[") and line:find("%]%]") then 142 line = line.."</span>"; 143 multi = false; 144 elseif line:find("%[%[.+%]%]") then 145 line = line:gsub("%[%[.+%]%]", function(s) return "<span style='color:darkmagenta;'>"..s.."</span>"; end); 146 end 147 end 148 sText = sText..g..line; 149 end 150 else 151 if line:find("%]%]") then 152 sText = sText..g..line.."</span>"; 153 comment = false; 154 else 155 sText = sText..g..line; 156 end 157 end 158 end 159 sF:close(); 160 local sStart = [[<p>Archivo: %s<br/> 161 Total de lineas: %d<br/> 162 Total de funciones propias: %d ( 163 <span style='color:gray;'>%s</span> )<br/> 164 <input type='button' id='b' onclick='expand();' value='Expandir/Contraer codigo'/> 165 <input type='button' onclick='hideLinea();' value='Esconder numero de linea'/> 166 <input type='button' onclick='ShowLinea();' value='Mostrar numero de linea'/></p>]]; 167 sStart = sStart:format(sFile, d,#tFs, table.concat(tFs,', ')); 168 local sFinish = [[<script> 169 var e = document.getElementById('formated'); 170 var b = document.getElementById('b'); 171 function expand(){ 172 e.style.width = 'auto'; 173 e.style.height = 'auto'; 174 b.onclick = contraer; 175 } 176 function contraer(){ 177 e.style.width = '800px'; 178 e.style.height = '300px'; 179 b.onclick = expand 180 } 181 function hideLinea(){ 182 aL = document.getElementsByName('linea'); 183 for(var i=0;i<aL.length;i++){ 184 aL[i].style.display = 'none'; 185 } 186 } 187 function ShowLinea(){ 188 aL = document.getElementsByName('linea'); 189 for(var i=0;i<aL.length;i++){ 190 aL[i].style.display = 'inline'; 191 } 192 } 193 </script>]]; 194 local sRet = sStart.."<pre id='formated' style='text-align:left;width:800px;height:300px; overflow:scroll;'>"..sText.."</pre><h3>Raw code</h3><pre style='text-align:left;width:800px;height:120px; overflow:scroll;'><code>"..sRaw.."</code></pre>"..sFinish; 195 if not sFileOut then 196 return sRet; 197 elseif type(sFileOut) == 'userdata' and string.find(tostring(sFileOut), "file") then 198 sFileOut:write(sRet); 199 elseif type(sFileOut) == 'string' then 200 local sO = io.open(sFileOut, "wb"); 201 if sO then 202 sO:write(sRet); 203 sO:close(); 204 return true; 205 else 206 return nil, "Couldn't open destination file"; 207 end 208 else 209 return nil, 'jeje'; 210 end 211 else 212 return nil, "Couldn't open file"; 213 end 214 end
martes, 25 de octubre de 2011
Direct Download link emuparadise.me
Parece que el día de hoy los sitios se empeñan en ponerme trabas y ahora fue el caso de emuparadise.me (sitio lleno de roms). Según tienes que resolver el captcha para obtener los direct download link pero a juzgar por el código sólo plantan una cookie en tu navegador. Nuevamente usando la consola web del firefox podemos brincarnos esa tediosa cosa del captcha. Sólo escriban esto en la consola y la página se recargará mostrando el link:
document.cookie = "downloadcaptcha=1"; window.location.reload();
Imagen de prueba:
Pueden haber más métodos para esto pero este es el más sencillo.
document.cookie = "downloadcaptcha=1"; window.location.reload();
Imagen de prueba:
Pueden haber más métodos para esto pero este es el más sencillo.
Suscribirse a:
Entradas (Atom)




