Como Facebook optimiza su código PHP
Como Facebook optimiza su código PHP
En el podemos ver como la elección de un lenguaje o framework condiciona el futuro de una empresa. Y como ésta se enfrenta a esta problemática para encontrar el equilibrio entre rendimiento / facilidad de desarrollo (lenguajes dinámicos) / código heredado.
Evitar el adtracking
A través de este interesante artículo descubro una nueva herramienta: Disconnect para evitar el adtracking, que ya podíamos ver a través de Collusion de Mozilla. Yo hasta ahora usaba el plugin DoNotTrackMe. Sin embargo he descubierto que puedo tenerlo todo con añadir la lista EasyPrivacy a AdBlockPlus.
El futuro con Firefox y Opera es mejor
El MWC nos esta trayendo una buena cantidad de noticias, para mi una de las más importantes es la evolución de FirefoxOS y su repercusión en la mobile web. Parece que por fin vamos a disponer de las deseadas WebAPIs.
Y mi deseo es que con Opera adoptando WebKit se acelere la inclusión de estas funcionalidades en los navegadores mayoritarios: Android e iOs.
En definitiva esperemos que el futuro sea aún mejor 🙂
Exportar a csv desde c#
Una pequeña utilidad para exportar listas genéricas a csv, usando expresiones lambda.
public class ExportExcel<T> where T : class
{
private StringBuilder sb;
public ExportExcel()
{
sb = new StringBuilder();
if (HttpContext.Current != null)
Context = HttpContext.Current;
}
public string Filename { get; set; }
public HttpContext Context { get; set; }
public void Export(List<T> l, Expression<Func<T, object>> expression)
{
if (string.IsNullOrEmpty(Filename))
return;
build(l, expression);
Context.Response.AddHeader("content-disposition", "attachment;filename=" + Filename);
Context.Response.Charset = string.Empty;
Context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
Context.Response.ContentType = "application/CSV";
Context.Response.Write(sb.ToString());
Context.Response.End();
}
public string ToString(List<T> l, Expression<Func<T, object>> expression)
{
build(l, expression);
return sb.ToString();
}
private void build(List<T> l, Expression<Func<T, object>> expression)
{
sb = new StringBuilder();
List<string> propertiesName = new List<string>();
NewArrayExpression array = expression.Body as NewArrayExpression;
foreach (object obj in (IEnumerable<object>)(array.Expressions))
{
string propertyName = obj.ToString().Remove(0, obj.ToString().IndexOf(".") + 1);
propertyName = propertyName.Replace(")", "");
sb.Append(propertyName + ";");
propertiesName.Add(propertyName);
}
sb.AppendLine();
foreach (var i in l)
{
foreach (var propertyName in propertiesName)
{
sb.Append(getPropertyValue(i, propertyName).ToString() + ";");
}
sb.AppendLine();
}
}
internal static object getPropertyValue(object obj, string propertyName)
{
const System.Reflection.BindingFlags bindingFlags = System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance;
var pi = typeof(T).GetProperties(bindingFlags).Where(prop => prop.Name == propertyName).SingleOrDefault();
return pi.GetValue(obj, null);
}
}
Recomendación para nueva app web
One of my favorite business model suggestions for [web] entrepreneurs is to find an old UNIX command that hasn’t yet been implemented on the web, and fix that.
via.
QueryString Helper
Muy a menudo tengo que consultar los valores de las QueryStrings, y la verdad es que es horrible el montón de comprobaciones que hay que hacer. Además muchas veces, wap proxies o adsevers incluyen caracteres en la querystring, haciendo que los parsers lancen excepciones.
public static class Extensions
{
private static readonly Regex LeadingInteger = new Regex(@"^(-?\d+)");
public static T Get<T>(this System.Collections.Specialized.NameValueCollection nvc, string key)
where T : IConvertible
{
T obj = default(T);
if (nvc == null || string.IsNullOrEmpty(nvc[key]))
return default(T);
string v = nvc[key];
if (typeof(T) == typeof(Guid))
v = v.Substring(0, 36);
if (typeof(T) == typeof(int))
{ //http://stackoverflow.com/a/975512/22055
Match match = LeadingInteger.Match(v);
if (!match.Success)
v = match.Value;
else
return default(T);
}
try
{
obj = (T)Convert.ChangeType(v, typeof(T));
}
catch { }
return obj;
}
}
A veces, echo de menos las facilidades de lenguajes dinámicos como JS, por ejemplo, en el parseInt
Problemas para acceder a bbva.es desde Firefox
Si al acceder a bbva.es desde Firefox tienes un problema en el que se te informa que tu sesión ha expirado, prueba a desactivar algunos de los complementos que uses, en mi caso fue Do Not Track Plus (DNT+).
Nuevas interfaces móviles
La interfaz de Clear (video) es un ejemplo de todo lo que nos queda por innovar en intefaces, sobre todo en las móviles.
Estas interacciones me han recordado a un par de juegos, este primero que sólo conozco por el video: Echochrome.
Y este otro juego: NOM, al que sí le dediqué algunas partidas, aunque tengo que lamentar que las versiones posteriores pierden la originalidad y ambiente de la primera; y que se controlaba con un sólo botón.
via.
