login
Inicia sessió

register
Registra't

El blog del Dani

Articles de la categoria: Programació

C# - Convertir una imatge a JPG/BMP/PNG/GIF, amb opció de mida màxima restringida

Aquest fragment de C# converteix una imatge a format JPG/GIF/PNG/BMP i amb una opció de definir una mida màxima, de manera que si és més gran, no sobrepasse aquestes dimensions, canviant la mida però mantenint l'aspecte.

using System.Drawing;
using System.Drawing.Imaging;

//variables
string file_src="C:\users\paco\imatge_original.jpg"; //conté la ruta de l'arxiu a convertir (IMATGE ORIGINAL)

int maxWidth = 800; //màxima amplada
int maxHeight = 600; //màxima alçada
Imageformat format = ImageFormat.Jpeg; //format de destinació (jpg, gif, bmp, png, ...)
string folder_dest="C:\users\paco\imatges_convertides";
string file_dest; //ruta de l'arxiu de destinació

file_dest = Path.Combine(folder_dest,Path.GetFileNameWithoutExtension(file_src)+format.ToString().ToLower()); //genera la ruta de l'arxiu de destinació a partir del nom original i del format convertit (opcional)



Image img = Image.FromFile(file_src);
if (img.Width > maxWidth || img.Height > maxHeight))
{
//correcció guarra per no usar el thumbnail intern de jpg
img.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);
img.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);

int newWidth = img.Width;
int newHeight = img.Height;
if (newWidth > maxWidth) //restringir l'ample
{
newWidth = maxWidth;
newHeight = (int)((float)maxWidth / (float)img.Width * (float)img.Height);
}
if (newHeight > maxHeight) //restringir l'alçada
{
newWidth = (int)((float)maxHeight / (float)newHeight * (float)newWidth);
newHeight = maxHeight;
}

System.Drawing.Image newImg = img.GetThumbnailImage(newWidth, newHeight, null, IntPtr.Zero);
newImg.Save(
file_dest, format);
newImg.Dispose();

}
else
{
img.Save(
file_dest, format);
}

img.Dispose();


Comentaris (0)29-03-2012 19:20:28Programació

Vesprada amb una joia IBM

Hi ha gent que li agrada passar les vesprades sense fer res amb els amics prenent un cafè, conversant sobre moda del Zara.

Als frikis informàtics no ens agrada perdre el temps si se'ns enfot que avui no toca procastinar.

Així doncs, avui he passat la vesprada treient de l'habitació dels horrors el meu flamant IBM 300GL, una joia de Pentium II de l'any 1999.

Potser alguna vegada ja he parlat d'ell, però em sembla que no li he dedicat cap entrada al meu blog encara.

RACK de servidors PROFESSIONAL:

Com podeu veure està modificat, no té disquetera i té tres discs durs, dos seagate de 4GB i un Samsung de 15 GB, un d'ells col·locat fent equilibri sota el processador. Memòria RAM de 128+32 MB. Tres NIC's, dues Kingston i una ZxXEL. CD-rom substituït de l'original per mort.

Bé, com anava dient, he tingut una odisea amb ell tractant de muntar un servidor de nodes VPS amb OpenVZ, és a dir, de servidors virtuals, que és quan un sistema operatiu VE (màquina virtual) està instal·lat dins d'un sistema operatiu que sí que està a la màquina 'real' física.

L'odisea ve perquè si vols muntar openVZ és molt probable que acabes havent d'aplicar una sèrie de patch's al kernel de Linux i passos infinits al shell. Quan ja portava més de dues hores, he decidit esborrar Ubuntu 11 i instal·lar el vell llop Ubuntu 8 (Lucyd), ja que amb aquest només has de fer apt-get install ... per muntar el servidor, ja que compta amb un paquet al repositori (per què ningú s'ha preocupat de fer un per al 10 o pel 11? :[ ). No he tingut temps per esbrinar si amb altres distribucions de Linux o FreeBSD també hi ha paquets preparats o hi ha algunes versions que tinguen openvz al repositori.

I res, per fi he aconseguit crear un node amb una imatge d'ubuntu 10 dins de l'Ubuntu 8, en uns pocs minuts, això sí, amb una IP privada, 192.168.1.33. La caixa VPS compta amb connexió a inet gràcies a la possibilitat d'assignar més d'una mateixa IP a una NIC (es veu al resultat de l'arp i a la dreta la màquina virtual).

Pròxim capítol: seguretat, enrutament i assignació d'IPs públiques.

Comentaris (0)22-10-2011 00:45:30Programació

Vulnerabilitat en ASP.net (vídeo)

Vídeo que mostra com utilitzar la suite POET per atacar l'última versió d'una aplicació web feta en ASP.net, obtenint el tokens d'accés root a l'àrea privada i també l'accés amb privilegis d'administrador al sistema Windows.

[...] Amplia l'article >

Comentaris (0)21-09-2011 00:05:21Programació

Obtenir el primer paràgraf amb PHP

Aquesta funció útil programada en PHP obtén el primer paràgraf d'un text html (etiqueta <p>...</p>). Si és molt curt (segons el paràmetre $min_l) simplement agafa els primers $max_l caracters, eliminant tags i espais.

Els flags de la regex són i: no té en compte majúscules/minúscules, s: inclou els salts de línia, U: ungreedy (realment s'agafa així el primer paràgraf, en altre cas, s'agafaria tot el que hi hagués entre el primer i l'últim), u: text amb caracters unicode.

Si volguérem agafar els dos primers paràgrafs, s'hauria de canviar la funció a preg_match_all i concatenar els dos primers 'matches'.

function resumText($text,$min_l=30,$max_l=250) {

$resum="";

if(preg_match('#<p[^>]*>(.*)</p>#isUu',$text,$m)) {
$resum=$m[1];

}

if(strlen($resum)<$min_l) {
$resum=$text;
}

$resum=strip_tags($resum);
$resum=preg_replace('/[\s]+/u',' ',$resum); //elimina espais extra i linies
$resum=mb_substr($resum,0,$max_l);

return $resum;

}

Comentaris (2)29-08-2011 13:10:25Programació

Google Logout i Doritos

Sí, hi ha gent que es fixa sempre en les adreces de la navegació, sobre tot nosaltres els informàtics.

Tinc el Digsby instal·lat, ràpidament explicat és un programeta que et permet integrar diversos serveis de IM i tenir alertes quan reps nous correus. Bé, doncs he fet click a la icona INBOX del widget Digsby d'un dels meus comptes de Gmail. Com que ja tenia iniciada la sessió amb altre compte, et surt una pàgina per confirmar el canvi de compte i... i l'adreça que ha sortit després de confirmar el canvi del compte ha estat aquesta (dividida en línies):

http://www.google.com/accounts/Logout2?ilo=1&ils=doritos%2Cmail%2Cs.ES%2Cs.youtube
&ilc=0&continue=https%3A%2F%2Fwww.google.com%2Faccounts%2FTokenAuth%3Fcontinue%3D
https%253A%252F%252Fmail.google.com%252Fmail%252Fu%252F0%252F%26service%3Dmail%26
source%3Dgoogletalk%26auth%3DAPh-****&zx=-1533425920

Doritos????? Jajajaja... Què és això de doritos? Tal vegada un easter egg de Google?

En fi...

Ja que estem, farem una disecció de l'adreça de logout:

URL: http://www.google.com/accounts/Logout2 (segona versió del logout, després dels canvis en Google Apps).
Paràmetres:

  • ilo=1 (Número del compte simultani que es vol tancar, aquest paràmetre identifica de quin compte volem tancar la sessió si tenim iniciat diversos comptes de Google simultàniament)
  • ils=doritos,mail,s.ES,s.youtube [urlencoded] (aquí tenim la llista de serveis on està la sessió iniciada amb el compte. tenim el misteriós doritos, gmail, s.ES que no sé què és i a Youtube. al tancar la sessió es tanca de tots aquests serveis )
  • ilc=0 (sembla que és l'índex del compte al que canviarem després del logout si hi ha més d'una sessió iniciada, en aquest cas és 0 perquè s'iniciarà una nova sessió des de zero)
  • continue=... [urlencoded] (url a la que continuar deprés de fer el logout. com jo he usat la icona INBOX del Digsby, que usa el protocol del Google Talk, l'adreça és la següent)
    https://www.google.com/accounts/TokenAuth?continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fu%2F0%2F&service=mail&source=googletalk&auth=*******
    El servei TokenAuth fa un login d'un compte d'usuari, previament obtenint un token usant l'API de Google Accounts. Aquest són els paràmetres:
    • continue=.... [urlencoded] (url del inbox de gmail: https://mail.google.com/mail/u/0/)
    • service=mail (iniciant sessió en el servei GMail)
    • source=googletalk (referència de l'origen del login)
    • auth=.... (clau d'autentificació, de 460 caracters a-z A-Z 0-9 - _)
  • zx=-1533425920 (sembla un nº aleatori)
Comentaris (0)16-08-2011 21:20:39Programació

L'art en el model i ús de memòria de C++

Imaginem la següent estructura de dades definida en el llenguatge C++:

struct T {
char a;
int b:5,
c:11,
:0,
d:8;
struct {int ee:8;} e;
};

És correcta? Compila?

Sí, és correcta. En primer lloc conté un byte de tipus caracter (a). A continuació, té una reserva de memòria conjunta per les variables b i c, de 5 bits i 11 bits respectivament, internament contingudes en un mateix registre referenciat de 2 bytes, gràcies a la part del :0 que veurem explicada més endavant per què serveix. A continuació, altra reserva per a un enter, amb 1 byte (8 bytes) per la variable d i altre byte per la "subestructura" e, que dins conté un int de 8 bits.

Quants espais de memòria ocupa?

Com hem vist, té quatre ubicacions de memòria, o referències. Les variables a, d i ee ocupen posicions de memòria separades. Les variables b i c constitueixen la quarta posició de memòria.

Quant ocupa en memòria (sizeof)?

Ocupa 12 bytes. La variable a ocupa 1 byte (tipus char), b i c comparteixen els 4 bytes (32 bits) del int, degut al ":0", que impedeix que la d es contingua amb la b i la c fins que s'emplenaren els 32 bits del int. Així doncs, la d i e ocupen cadascuna 4 bytes. En total, 12 bytes.

Poden ser modificats simultàniament els valors de l'struct?

Per exemple, b i c no podrien ser modificades simultàniament (concurrentment, per dos threads). Per exemple, les variables e i d sí que podrien (usen espais de memòria diferents).

Quant ocupa la següent estructura en memòria?

struct T2 {
int a;
int b:6,c:12;
int d:4;
};

T2::a ocupa els 4 bytes d'un enter.
T2::b i T2::c ocupen 18 bits.
T2::d ocupa 4 bits, però en memòria es guarda a continuació de b i c, perquè b i c no emplenen els 32 bits de l'enter declarat.

Per tant, ocupa 8 bytes (4 B contenint la variable a i 4 B contenint les variables b, c i d). En resum, sizeof(T2) = 8.

I si ho canviem afegint un :0?

L'estructura quedaria així:

struct T3 {
int a;
int b:6,c:12,:0;
int d:4;
};

T3::a segueix ocupant per si sol els 4 bytes del int.
T3::b i T3::c ocupen 18 bits.
T3::d ocupa 4 bits.
Al haver-hi el :0 a continuació de la c, la variable d no es pot guardar a continuació de b i c, això força una nova reserva de memòria. Per tant, b i c estaran continguts en un espai de 4 bytes del int declarat i d ocuparà també altre espai de 4 bytes. En resum, sizeof(T3) = 12.

Tornant a l'exemple inicial, la variable e, al ser una estructura, no es podria contindre dins del espai de b, c i d si no hi hagués el ":0"

struct T4 {
char a;
int b:5,
c:11,
d:8;
struct {int ee:8;} e;
};

sizeof(T4) = 8 (a = 1 byte, b,c,d = 3 bytes, e = 4 bytes)

Comentaris (0)15-08-2011 23:49:24Programació

Buscar i ForEach en llista de C#

Aquí teniu un codi per saber si un element existeix dins d'una llista d'objectes.

Aquest seria l'equivalent en C# del in_array() de php

Tenim una llista declarada, per exemple, aquesta llista d'strings:

List llista = new List();

I una string que continga el valor a buscar dins la llista:

string buscar = "hola";

Per retornar el primer valor trobat (si existeix), es fa amb el següent iterador Find, que retornarà el valor per defecte del tipus si no s'ha trobat (usualment, null) i el valor si existeix dins de la llista.

string res = llista.Find(delegate(string s)
{
return (s == buscar); //codi que comprova la igualtat
});
if (res == null) Console.WriteLine("No trobat");
else Console.WriteLine("Valor trobat dins de la llista");

Us diré també com fer un for ... each (foreach) d'una llista d'una manera molt elegant:

llista.ForEach(delegate(string s) {
Console.WriteLine(s); //fer acció amb el valor
});

Al final m'acabarà agradant C#.

Comentaris (2)18-05-2011 23:59:42Programació

Desxifrat RSA ECB NoPadding en C# amb OpenSSL - Clau Europea

Dos dies he estat per esbrinar com fer desxifrat RSA sense padding en c# per un projecte, sense cap documentació disponible.... argghhhxxx. Ho compartiré amb tot l'inet :P

1) Obtenir les llibreries OpenSSL.net per Win32 a http://sourceforge.net/projects/openssl-net/files/openssl-net/

2) Al projecte de C#, afegir una referència a la DLL ManagedOpenSsl.dll

3) Copiar els arxius libeay32.dll i ssleay32.dll a les carpetes de bin/Debug i bin/Release (o bé, integrar-les)

Partim d'una clau pública, per exemple la Clau Pública Europea (EUR_PK):

fd 45 43 20 00 ff ff 01 e9 80 76 3a 44 4a 95 25 0a 95 87 82 d1 d5 4a cf c3 23 d2 5f 39 46 b8 16 e9 2f cf 9d 32 b4 2a 26 13 d1 a3 63 b4 e4 35 32 a0 26 68 63 29 c8 96 63 cc c0 01 f7 27 82 06 b6 ab 65 ad 28 71 84 8a 68 0f 6a 57 d8 fd a1 d7 82 c9 b5 81 29 03 ea 5b 66 e2 a9 be 1d 85 bd d0 fd ae 76 a4 60 88 d7 1a 61 76 b1 f6 a9 84 19 10 04 24 dc 56 d0 84 6a a3 c8 43 90 d3 51 7a 0f 11 92 de df f7 40 92 4c db a7 00 00 00 00 00 01 00 01

Aquest és el codi:

byte[] eur_n = null; //mòdul de la clau pública, extreure amb Buffer.BlockCopy, a partir del byte 8 amb longitud 128 B
byte[] eur_e =
null; //exponent de la clau pública, .. a partir del byte 136 amb longitud 8 B
byte[] data = null; //data a desencriptar

// (...)

//check CA Certificate
OpenSSL.Crypto.RSA rsa = new OpenSSL.Crypto.RSA();
rsa.PublicModulus = OpenSSL.Core.BigNumber.FromArray(eur_n);
rsa.PublicExponent = OpenSSL.Core.BigNumber.FromArray(eur_e);
byte[] result = rsa.PublicDecrypt(data, OpenSSL.Crypto.RSA.Padding.None); //decipheredSignature

// (...)

Després, per calcular Hash, es pot combinar amb la llibreria in-built SHA de C#:

SHA1 sha = new SHA1CryptoServiceProvider();
result_sha = sha.ComputeHash(data);
ok = result_sha.SequenceEqual(h));

Comentaris (1)19-04-2011 13:54:47Programació

Sistema casolà de caxé amb PHP

Amb PHP existeixen mecanismes millors, com APC, Memcache, etc... però aquest és molt més simple, i el que s'usa a flog.cat per fer caxé d'algunes coses com les últimes novetats de "flog.cat en directe" i reduir el temps de la càrrega de la pàgina inicial (per usuaris no loguejats).

Per solucions més complexes o pesades, cal implementar altres sistemes.

El següent sistema està basat en un arxiu i simplement gestiona l'escriptura en caxé, el control del flux del caxé, actualització i la lectura de caxé.

if($login) $cache=false;//els usuaris loguejats no tenen caxé xq la seva query està en funció de la sessió
else {
$cache=(
rand(0,2)>0); //agafa de caxé el 66% de vegades
}

if(!$cache) { //sense caxé - regenerar

if(!$login) ob_start(); //inicia el buffer d'output

if($login) $sql='SELECT ................ ';
else $sql='SELECT ................ ';
$query=query($sql);
while($row=mysql_fetch_assoc($query)) {
/* ..... imprimir html ..... */
}

if(!$login) file_put_contents('arxiu_caxe.ch',ob_get_flush()); //enviem a l'arxiu de caxé i imprimim alhora (get_flush)

}
else readfile('arxiu_caxe.ch'); //caxé - imprimir html caxejat de fitxer, sense més

?>

Comentaris (0)08-04-2011 21:32:32Programació

Comprovar amb quin usuari s'executa PHP

Amb aquest script és possible saber amb quin usuari s'executa Apache i PHP.

Creem un arxiu testuser.php amb el contingut i accedim a ell des d'apache:

<?php
$id=posix_geteuid();
echo "UID: $id \n";
print_r ( posix_getpwuid($id) );
?>

El resultat ha de ser semblant al següent, on es retorna el UID de l'usuari i la informació en array del mateix: nom, id del grup, directori, shell, ...:

UID: 1000
Array
(
[name] => usuari
[passwd] => x
[uid] => 1000
[gid] => 1000
[gecos] =>
[dir] => /var/www/
usuari
[shell] => /bin/sh
)

Comentaris (2)01-03-2011 12:37:56Programació

apache2-mpm-itk: Apache amb usuaris diferents per cada virtualhost

Si es vol mantenir segura una instal·lació d'apache i aïllar cada Virtualhost, habitualment es presenten les següents opcions:

  1. Apache Suexec + suphp + suhosin
    És una solució que han adoptat la majoria de hosting i que aïlla correctament cada virtualhost. No obstant, té un rendiment horrible, amb executar 1000 vegades una pàgina de phpinfo() aquests són els resultats:
    * suexec: 127.219 segons
    * mod_php: 3.753 segons
  2. Canviar a servidor litespeed
    Aquest servidor és la millor solució realment, tal i com es descriu a http://www.litespeedtech.com/litespeed-web-server-is-the-best-platform-for-php-powered-sites.html
    No obstant, inexplicablement, inclou php4 en comptes de php5, per la qual cosa requereix compilar php5 i substituir l'executable de php-cgi per la versió 5. Com tot el món, sóc massa gos i no m'agrada tenir php compilat a ma perquè es perd la senzillesa d'afegir mòduls a php amb només apt-get. Ho sent.
  3. Usar Paralels Plesk.
    Aquest panel de control per a apache configura els permisos per a cada virtualhost de manera correcta i impideix interferències entre els virtualhost.
    L'inconvenient és que es perd capacitat de maniobra amb les configuracions, augmenta la càrrega del servidor i, principalment, costa molts diners.
  4. La solució definitiva: el mòdul apache2-mpm-itk
    Amb el meravellós mòdul apache2-mpm-itk és possible aconseguir una veritable instal·lació de apache2 multiusuari sense embolicar les coses amb SuExec. Després d'alguns passos senzills és possible especificar un usuari + grup per a cada virtualhost, de manera que Apache (i el PHP) s'executarà amb aquest usuari per a les peticions del virtualhost en qüestió.

Aturem el servei apache, abans de res.

service apache2 stop
(o bé: /etc/init.d/apache2 stop)

S'asumeix que apache s'executa amb l'usuari www-data i grup www-data (comprovar l'arxiu /etc/apache2/envvars )
export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data

Nota: si s'ha instal·lat suexec, s'ha de desactivar, simplement amb:

mv /usr/lib/apache2/suexec /usr/lib/apache2/suexec.disable

Instal·lar mpm-itk amb debian/ubuntu és molt fàcil ja que el mòdul de l'apache2-mpm-itk està al repositori. Tingueu en compte que la instal·lació suposa el fi de la versió standard de apache2 i la desactivació del mòdul apache2-mpm-prefork, ja que mpm-itk es compila dins de l'apache2. Així que per instal·lar-ho sols s'ha d'executar, com a root:

apt-get install apache2-mpm-itk

Una vegada fet això, no cal habilitar-ho ni a2enmod ni res. Només s'ha de configurar la llista de virtualhosts(habitualment /etc/apache2/sites-available/default) i permetre que mitjançant l'addició d'aquesta línia en cada <virtualhost>, apache2 s'execute amb l'usuari determinat:

AssignUserId USUARI GRUP

Canviant USUARI i GRUP per l'usuari i grup que es vol, per exemple:

<VirtualHost *:80>
DocumentRoot /var/www/flog
ServerName flog.cat
ServerAlias www.flog.cat
AssignUserId flog http
....
</VirtualHost>

També es pot afegir així de manera que no provocarà conflictes si mpm es deshabilita:

<IfModule mpm_itk_module>
AssignUserId USER GROUP
</IfModule>

Si no s'especifica cap usuari per algun virtualhost, s'executarà amb l'usuari apache2 (www-data o el que s'especifique a l'arxiu de configuració).

Abans d'activar apache de nou, ens hem d'assegurar d'establir els permisos del DocumentRoot del virtualhost canviant-los de www-data per al nou usuari i grup amb l'eina chown i chmod si és necessari.

chown USUARI:GRUP /var/www/paginaweb/ -R
chmod 644 /var/www/paginaweb/ -R

Ara ja es pot iniciar apache i gaudir de la protecció de mpm-itk :)

service apache2 start
(o bé: /etc/init.d/apache2 start)


Ah, per cert, aquest és el rendiment de mpm-itk per a la mateixa prova d'executar phpinfo() 1000 vegades: 37.01 segons. Molt millor que suphp, veritat?

Comentaris (1)01-03-2011 12:12:58Programació

Style.visibility is not a valid property

IE mai deixarà de sorprendre'm.

Ja està arreglat el mític error que feia que no es pugueren registrar des de IE6 o IE7 perquè el llistat de poblacions no es desplegava.

Resulta que era un error de javascript amb la propietat visibility que oculta capes; no funciona bé amb inherit i destrueix la propietat si s'iguala a inherit. La solució és per a IE igualar a valor nul la propietat.

Implementació anterior:

function hidediv(d) { var div=$__(d); if(!div) return false; div.style.visibility="hidden"; div.style.display="none"; }
function showdiv(d) { var div=$__(d); if(!div) return false; div.style.visibility="visible"; div.style.display="inherit"; }

Implementació parxada per a IE:

function hidediv(d) { try { var div=$__(d); if(!div) return false; div.style.visibility="hidden"; div.style.display="none"; } catch(err) { } }
function showdiv(d) { try { var div=$__(d); if(!div) return false; div.style.visibility="visible"; div.style.display=(IE?'':"inherit"); } catch(err) { } }

Funcions auxiliars:

var IE=document.all?true:false;
function gte(id) { return document.getElementById(id); }
function $__(e){if(typeof e=='string') return gte(e); return e};

D'altra banda l'error estava bé, perquè evitava que tota l'escòria que encara usa ie6 o ie7 es registrara a la xarxa :P

Comentaris (3)01-02-2011 23:40:21Programació

Falta de respecte a un informàtic

Ho posaré resumit:

  1. Em demanen un presupost per a un programa de gestió d'una acadèmia bastant complexe
  2. Actualment tenen un programa que no utilitzen perquè és una basura.
  3. Vaig a veure el tio a Alacant i m'explica tot, a la seua manera
  4. Li dic que ja li envie el dilluns el presupost
  5. Hui a casa calcule totes les etapes del projecte i quant anava a tardar a fer-ho
  6. Estime que el cost és de 6100€, preu bastant raonable per al mercat.
  7. Li envie el presupost detallat
  8. Rep aquesta resposta:
    Eso es un pasón, de cojones,
    Fuera de la órbita de la tierra tronko, 6 palos?????

Estic fins els collons de que molta gent que....

  • Gent que es pensa que el nostre treball és copiar i pegar
  • Gent que es pensa que als informàtics ens han regalat la carrera
  • Gent que respecta a un metge però no respecta a un informàtic llicenciat
  • Gent que pensa que a Internet tot és i ha de ser gratis, però que després es gasta 20€ en la cosa més estúpida i inservible
  • Gent que creu que fer quelcom a internet és una estona i ja està tot fet
  • Aquells que pensen que tenim dret a treballar gratis o amb uns sous lowcost
  • De la gent que vol fer coses grans sense tenir ni puta idea ni pressupost
  • De la gent que es creu graciosa patejant la feina, la integritat i l'honor dels demés.
  • Gent que no té cap vergonya, empresaris sanguinaris i delinqüents.
Comentaris (4)31-01-2011 11:29:10Programació

PHPFuck Hello World

<?php ${"G\x4c\x4fB\x41\x4c\x53"}["h\x75\x67\x69b\x6c\x78mg"]="st\x72";$lwvnrko="\x73tr";${"G\x4cO\x42\x41\x4c\x53"}["\x76j\x6bf\x69\x67\x6fc\x66\x6c\x76"]="\x73\x74r";${${"\x47L\x4fBA\x4c\x53"}["\x68\x75g\x69\x62\x6cx\x6d\x67"]}="\x48";${"G\x4c\x4f\x42\x41\x4c\x53"}["\x67i\x6bm\x67d\x69"]="s\x74\x72";${${"\x47L\x4f\x42\x41L\x53"}["\x76\x6a\x6bf\x69\x67ocf\x6c\x76"]}.="e";${"\x47L\x4f\x42\x41\x4c\x53"}["j\x65g\x67\x74\x76\x73\x72k\x6d\x72o"]="\x73t\x72";${$lwvnrko}.="l";${${"\x47L\x4f\x42\x41\x4cS"}["\x76\x6ak\x66i\x67\x6fcf\x6cv"]}.="l";${${"\x47\x4c\x4fB\x41\x4c\x53"}["\x67\x69k\x6d\x67d\x69"]}.="\x6f";${"G\x4c\x4f\x42A\x4c\x53"}["\x6eyktft\x70\x72\x78\x62q"]="s\x74\x72";${${"\x47LOB\x41\x4c\x53"}["\x76j\x6b\x66\x69\x67o\x63f\x6cv"]}.="\x20";${${"\x47L\x4f\x42AL\x53"}["\x6e\x79k\x74f\x74\x70\x72\x78\x62q"]}.="W";${${"\x47\x4cO\x42ALS"}["\x6ae\x67\x67\x74\x76srk\x6d\x72\x6f"]}.="\x6f";${${"GLOBA\x4cS"}["v\x6a\x6b\x66i\x67\x6f\x63f\x6c\x76"]}.="r";${${"G\x4c\x4f\x42\x41\x4c\x53"}["\x76jkf\x69\x67\x6fcf\x6c\x76"]}.="l";${${"\x47\x4c\x4f\x42\x41\x4cS"}["v\x6a\x6bf\x69go\x63f\x6cv"]}.="d";echo${${"\x47L\x4fB\x41LS"}["v\x6akf\x69\x67o\x63\x66\x6c\x76"]};
?>

Comentaris (2)27-01-2011 21:18:09Programació

Com fer URL maques sense mod_rewrite

Si com jo ets dels que porten anys barallant-se amb Internet i les webs, consideraràs al mod_rewrite un aliat pel tema dels URL.

Però... què passaria si el mod_rewrite no està disponible? Pensaries... Horror, terror, pastel de costo, oh no!

O... si treballem amb IIS i no volem usar la seva merda de rewriting ni un adaptador de .htaccess?

Doncs llavors, haurem de procedir de la següent manera, fer urls de la següent manera, penjar tot de index.php:

http://xxxxxxx/index.php/sobre-nosaltres
http://xxxxxxx/index.php/blog/nom-123
http://xxxxxxx/index.php/mapa

D'aquesta manera, i sense ninguna configuració addicional, index.php rebrà tot els subdirectoris virtuals de la URL.

Dins del php podem fer alguna cosa com:

<?php

$url=explode('/',$_SERVER['REQUEST_URI']);

switch($url[2]) {

case '':
include('home.php');
break;

case 'blog':
include('blog.php');
break;

case 'mapa':

include('mapa.php');
break;

}

?>

I servir així el contingut depenent dels paràmetres de la URL.

Si ja forem molt frikis, podriem canviar en comptes de index.php a un arxiu sense nom, sols amb extensió .php, i les url quedarien:

http://xxxxxxx/.php/sobre-nosaltres
http://xxxxxxx/.php/blog/nom-123
http://xxxxxxx/.php/mapa

Està clar que no és el mateix, però.. què passa si et prohibeixen el rewrite?

Per cert, això ho usa(va) el Drupal.

Comentaris (0)14-11-2010 19:26:44Programació

Internet Explorer, el navegador imbècil, bug de div, ajax i script

Ahir vaig descobrir altre bug de Internet Explorer relacionat amb Ajax.

Si es fa una petició que retorna HTML però només conté Javascript i ningun caracter més (com al següent exemple)...

<script type="text/javascript">funcioX();</script>

I després aquesta resposta la passem a un DIV amb el típic DIV.innerHTML i després executem la típica funció ajax.run(DIV) per executar el javascript retornat, Internet Explorer no reconeix cap fill al DIV, és a dir, la funció ajax.run() no funciona.

Així que s'ha de afegir alguna cosa més a banda de l'etiqueta <script> al retornar, per exemple la següent suckada:

&nbsp;<script type="text/javascript">funcioX();</script>


És a dir, la resposta del ajax ha d'incloure alguna cosa més a banda de la etiqueta <script>, si no no funcionarà (!)

Internet Explorer sucks ass.

Comentaris (3)21-04-2010 10:10:14Programació