El monitor #2 d'aquesta casa és algo vell, no falla, però ja li toca un canvi. El seu germà, amb moltes més hores de vol, però comprat al mateix lloc i dia, ja va morir fa un parell d'anys.
Per aquest motiu i la disponibilitat d'uns recursos inesperats ha arribat un nou ésser, substituirà al monitor #1 i el ex#1 passarà a ser el #2, i al ex#2 li buscarem una nova llar.
El nou monitor és un Samsung LS27B970DS, toma nom! El departament de marqueting deu estar plorant en un racó. Jo almenys no recordaré aquest nom mai de la vida, per això confio en el blog. Em sembla que jo li diré Samsung BéstiaParda de 27 polzades i resolució de 2560x1440, més que fullHD. Ara les pel·licules les veig en finestreta... Les línies de codi són llaaargues...
Porto uns dies fent-lo servir, i francament estic molt content. Només trobo que li sobren els altaveus que porta i que el HUB USB integrat hauria de ser USB 3.0 i no 2.0. Aquests dos detalls no tenen res a veure amb la imatge. Respecte als colors també he trobat que estan molt bé, les fotos es veuen estupendament. El que s'ha d'anar amb compte és amb el brillo, per que per defecte va al 100% i si estas aprop i trobes un fons blanc et pot bronzejar. Ara el tinc al 50% i molt millor. Respecte als jocs, de moment he provat el Borderlands 2 i fantàstic, gairebé estic allí. Amb l'augment de resolució la VGA ha de treballar una mica més. Pel que fa a connexions té DVI, HDMI i DisplayPort, jo faig servir DisplayPort i cap problema. El OSD és usable un cop llegeixes el manual, però un cop ajustat poca cosa s'ha de modificar, com a molt seleccionar l'entrada de vídeo i això es fa directament amb un botó.
Estic veient jo sol aquesta serie mentre dino. I el cert és que no està gens malament. Les primeres temporades són més fluixes que aquesta tercera. [Spoilers] Les primeres temporades eren els inicis d'un home honest en la delinqüència (amb menys encert que cap altra cosa i sempre es salva pels pèls), en canvi en aquesta tercera temporada el tema ja es centra en una delinqüència més professional, més mafiosa. En Walter ja té el seu super-laboratori i en Pickman no deixa de cagar-la. Sempre m'he preguntat quan el liquidaran de la sèrie. Curiosament el capo del Walter és el mateix actor que fa de dolent a Revolution, quina por que fa quan es queda tot serio. La temporada acaba en un moment crucial, no us recomano veure l'ultim episodi si no teniu el següent preparat.
Hi ha gent que opina que en aquesta serie passen poques coses, potser en temporades anteriors sí hi ha part d'això, i hi ha episodis que es poden esborrar i no es notaria en la trama, però en aquesta tercera el ritme augmenta i està força bé. Recomanada!
En tota aplicació web, normalment el seu conjunt de dades creix amb el temps i és necessari buscar la informació sobre la que volem treballar. Per fer-ho es restringeixen les dades aplicant un criteri. Un criteri pot ser peticions d'un municipi, factures d'un client, en un interval de temps, un número d'expedient...
Per aquesta raó a la part superior del grid que mostra tots els registres acostumo a posar un filtre, que permet introduir els valors del criteri que es vol fer servir per restringir els registres del grid. El HTML corresponent a aquest formulari de filtrat és molt senzill. Aleshores l'única part que revesteix alguna dificultat és recollir els paràmetres i enviar-los al ASHX corresponent. El ASHX invocarà al LoadGrid, clsDades QUERY i finalment a la stored procedure QUERY.
Per recollir els paràmetres faig servir una funció Javascript Filtrar (nom molt original). Aquesta funció un cop té els valors dels criteris els posa a la URL que carrega el grid i invoca al mètode del grid trigger reloadGrid. Això últim fa que el grid actualitzi els seus valors amb els nous criteris aplicats. Com sempre el codi:
function Filtrar() {
var FK_Arxiu = $("#frmFiltre #FK_Arxiu").val();
var FK_LlocDiposit = $("#frmFiltre #FK_LlocDiposit").val();
var SigTop = $("#frmFiltre #SigTop").val();
var Capsa = $("#frmFiltre #Capsa").val();
var Inutilitzada = $("input[name=lInutilitzada]:checked").val();
var FK_CapsaNULL = $("input[name=lFK_CapsaNULL]:checked").val();
var URL = 'sigtop.ashx?action=loadgrid&FK_Arxiu=' + FK_Arxiu + '&Capsa=' + Capsa;
URL += '&FK_LlocDiposit=' + FK_LlocDiposit + '&SigTop=' + SigTop;
URL += '&lInutilitzada=' + Inutilitzada + '&lFK_CapsaNULL=' + FK_CapsaNULL;
jQuery("#grdSigTop").jqGrid('setGridParam', { url: URL, page: 1 }).trigger("reloadGrid");
}
L'únic a destacar d'aquest exemple és com recuperar el valor de checkboxes amb jQuery.
#07/02/2014 13:20 Programació Javascript Autor: Alex Canalda
Hem estat veient aquesta serie a casa, no veiem gaire la TV per que anem a dormir d'hora però poc a poc anem veient algun que altra episodi d'alguna serie. Ara hem acabat amb aquesta.
La serie tracta d'un policia que fuig d'un problema laboral i demana un trasllat. Va a parar a Florida. Allí li assignen de company al forense de la comissaria... I també els ajuda un becari que és un friki tecnològic que ho arregla tot. També coneix a un infermera que estudia per ser metge i s'enamoren, però ella està casada amb un lladre que està a presó. I ella també té un fill d'aquesta relació.
Spoilers: cada episodi és un cas, i la relació entre ell i ella (allò per mantenir una tensió sexual) va evolucionant, i que si sí, que si no, que si estic casada, que el nen que pensarà... També és poc creïble que ell vagi acompanyat del forense als casos i que els resolgui tots amb poders deductius, el friki del becari sembla una enciclopèdia i sap de tot, totes les proves forenses van super ràpid... Però bé donat l'estat catatònic en que estem aquelles hores distreu que és el que ha de fer i llestos, i l'assassí és el majordom.
Un punt que no m'agrada de la sèrie és que està cancel·lada a la 4 temporada, i l'han cancel·lat sense posar-li un final digne, segons he llegit deixen el tema en un moment decisiu i s'acaba bruscament.
La majoria de formularis tenen "desplegables" en el desenvolupament web, o "combos" o "select", depenent del programador es dóna un nom o un altra, jo els dic de qualsevol de les opcions, segons el dia. Però tots volen dir el mateix. Ja he explicat que en la part client que els "select" no tenen els valors carregats en el HTML (a menys que siguin un Sí/No, o Blanc/Negre...), que és posteriorment que es carreguen les dades. És durant la creació dels controls que es posen els valors. Quan hi ha "selects" dels que s'anomenen en cascada (el valor d'un primer "select" determina les opcions d'un segon) també hi ha crides a aquesta funció. En la part servidora hi ha un ASHX que es dedica només a carregar els "selects", el comboloader.ashx. És lògic doncs que a la part client, al Javascript hi hagi una funció homònima que s'encarregui d'enviar peticions i rebre les respostes posant als "select" les seves opcions corresponents. La funció es diu LoadCombos, i té un munt de paràmetres, va començar amb pocs i a mesura que ha passat per projectes s'han anat afegint.
pFrm: Identificador del formulari on estan els combos.
pCombos: Identificadors dels "select" que s'han de carregar. Aquests noms han de coincidir amb els que tingui el comboloader.ashx. Si hi ha més d'un van separats per guions.
pURLExtra: Alguns combos han de tenir els seus valors restringits per algun valor, es posa aquí en el format "&nom=valor" (pot ser més llarga "&nom1=valor1&nom2=valor2..., important el detall del "&" inicial).
pAsync: indica si es poden carregar els combos de forma asíncrona. Això passa en la funció CrearteNNNNEvents, que a vegades s'han de carregar els combos per diferents formularis, aleshores si no es vol que les crides es solapin (lleig) s'ha de posar a false.
pValorDefecte: Es un JSON que indica els valors per defecte de diferents combos, té un aspecte com {"filtre_Comunitat":"3"} i es poden posar els diferents valors per defecte dels diferents combos.
pPostLoadFunction: funció que s'executa després de carregar els combos. Posar "undefined" si no es vol.
pOptionBuit: booleà que indica si als combos s'ha de posar una primera opció que estigui buida.
pValorOptionBuit: valor que té l'opció buida, normalment ''
Com sempre el codi:
var lastFrm = "";
var lastCombos = "";
var lastValorsDefecte = null;
function LoadCombos(pFrm, pCombos, pURLExtra, pAsync, pValorDefecte, pPostLoadFunction, pOptionBuit, pValorOptionBuit) {
if (pURLExtra === undefined) pURLExtra = "";
if (pAsync === undefined) pAsync = true;
if (pOptionBuit === undefined) pOptionBuit = false;
lastFrm = pFrm;
lastCombos = pCombos;
if (pValorDefecte !== undefined) lastValorsDefecte = eval('(' + pValorDefecte + ')');
else lastValorsDefecte = null;
$.ajax({
type: "GET",
async: pAsync,
dataType: 'json',
url: "comboloader.ashx?combos=" + pCombos + pURLExtra,
success: function(data, textStatus) {
if (!data.ERROR) {
var ComboID = '';
var options = '';
var ComboOBJ = null;
jQuery.each(data, function(i, val) {
ComboID = val.ComboID;
options = '';
if (val.Items) {
if (pOptionBuit) options = '<option value="' + pValorOptionBuit + '"></option>';
jQuery.each(val.Items, function(j, ItemVal) {
options += '<option value="' + ItemVal.Val + '">' + ItemVal.Disp + '</option>';
});
//Es més eficient fer-ho així però en IE7 no funciona bé.//$("#" + lastFrm + " #" + ComboID).html(options);
$("#" + lastFrm).find("#" + ComboID).html(options);
if (lastValorsDefecte != null) {
for (var member in lastValorsDefecte) {
if (member == ComboID) $("#" + lastFrm).find("#" + ComboID).val(lastValorsDefecte[member]);
}
}
}
else {
$("#" + lastFrm).find("#" + ComboID).html('');
}
});
if (pPostLoadFunction !== undefined) pPostLoadFunction(data);
}
else {
$("#ui-dialog-title-dialogErr").html("Error carregant combos");
$("#errmsg").html(data.ERROR);
$("#dialogErr").dialog("open");
}
}
});
}
Unes invocacions d'exemple podrien ser, aquesta primera és complicada, carrega un munt de combos al formulari filtre, i el combo de les comarques es filtra per la comunitat 3, i clar el combo comunitats ha de tenir aquest valor per defecte:
Un exemple de combos encadenats pot ser com la següent, s'assigna a l'event "canvi" del combo origen i estaria a la funció "createNNNNNEvents" corresponent:
Al llarg dels últims posts de desenvolupament web, de la part client, m'he anat referint a l'estat del formulari. És hora d'aclarir que és. El formulari, tal com està plantejat pot estar en dos estats. El primer és l'estat "actualitzar" ("update"), on el formulari té carregades dades, s'editen i un cop s'acaba amb el botó "Guardar" s'envien a la part servidora (al ASHX corresponent) per guardar-les. Al guardar les dades seguim en aquest estat.
L'altra estat és el "insertar" on el formulari està buit (sense dades), s'omple i s'envien al ASHX per guardar-les. En aquesta operació es recupera del ASHX la clau primària generada per en futures edicions fer actualitzacions ja que el formulari passa a l'estat "actualitzar".
Quan des de l'estat "actualitzar" es fa una eliminació, el formulari es neteja i passa a l'estat "insertar".
El botó "Nou" (per crear un nou registre) també posa al formulari en l'estat "insertar".
Cada un d'aquests estats té una funció Javascript que posa els controls del formulari com els correspon. Veiem uns exemples, mode insert:
function ClassificacioInsert() {
//Neteja del formulari
$('#frmDetall').validate().resetForm();
$('#frmDetall :input')
.not(':button, :submit, :reset, :checkbox')
.val('')
.removeAttr('selected');
$("#frmDetall :checkbox").removeAttr('checked');
//Reasignació del boto Guardar, amb action INSERT
$("#frmDetall #btnSave").unbind('click');
$("#frmDetall #btnSave").click(function ()
{ SubmitFrm('#frmDetall', 'classificacions.ashx?action=insert', true, ClassificacioPostInsert);
});
//El boto Eliminar desapareix en un alta nova
$("#frmDetall #btnDelete").hide();
//Exemple de valor per defecte d'un controlvar Avui = new Date();
$("#frmDetall #DataAlta").val(Avui.getDate() + "/" + (Avui.getMonth() + 1) + "/" + Avui.getFullYear());
//Altres botons es deshabiliten
$("#frmDetall #btnDeleteEspecifica").attr('disabled', '');
$("#frmDetall #btnAfegirEspecifica").attr('disabled', '');
$("#frmDetall #autoEspecifica").attr('disabled', '');
$("#frmDetall #autoEspecifica_TC").attr('disabled', '');
$("#frmDetall #btnDeleteTAAD").attr('disabled', '');
$("#frmDetall #btnAfegirTAAD").attr('disabled', '');
$("#frmDetall #afegirTAAD").attr('disabled', '');
$('#PK_TAAD').val('');
$('#afegirTAAD').html('');
//Es neteja la clau primària, quan es guardi el registre//ja es posara el valor correcte
$('#PK_Classificacio').val('');
evPK_Classificacio = "";
}
Posar en mode "actualitzar" pot tenir una funció com aquesta:
function ClassificacioUpdate(pID) {
//Es netegen validacions pendents
$('#frmDetall').validate().resetForm();
//Si arriba la PK informada es posa a la variableif (pID !== undefined) $("#frmDetall #PK_Classificacio").val(pID);
//S'activen alguns controls (això depen de la lògica de negoci)
$("#frmDetall #btnDeleteEspecifica").removeAttr('disabled');
$("#frmDetall #btnAfegirEspecifica").removeAttr('disabled');
$("#frmDetall #autoEspecifica").removeAttr('disabled');
$("#frmDetall #autoEspecifica_TC").removeAttr('disabled');
//Es mostra el botó d'Eliminar
$("#frmDetall #btnDelete").show();
//Es posa el guardar en "update"
$("#frmDetall #btnSave").unbind('click');
$("#frmDetall #btnSave").click(function() {
SubmitFrm('#frmDetall', 'classificacions.ashx?action=update', true, ClassificacioPostUpdate);
});
}
#06/02/2014 11:40 Programació Javascript Autor: Alex Canalda
Dins les aplicacions web, ha d'haver-hi alguna forma d'enviar les peticions d'eliminació de registre de la part client a la part servidora (als ASHX). En Javascript faig servir una crida Ajax de jQuery per fer aquesta tasca. De fet crec que és la part més senzilla de tot plegat.
En el post de la creació de controls ja hi ha el codi que assigna al botó "Eliminar" la funció que s'encarrega de fer la eliminació (valgui la redundància). Aquí es tracta d'explicar en detall la funció DeleteElem.
DeleteElem rep varis paràmetres:
pForm: El identificador del formulari on està el registre que es vol eliminar
pURL: la URL que ha d'invocar en la part servidora, normalment conté el paràmetre action amb el valor "delete"
pID: la clau primària que serveix per invocar l'eliminació. Si està composta per diferents camps cal posar-los separats per un guió "-" i s'han de correspondre al camps del formulari amb el mateix nom.
pPostDelete: un booleà que indica si ha de cridar a una funció posterior a l'eliminació.
pFunctionPostDelete: la funció posterior a la eliminació.
pMissatge: un missatge que surt per pantalla un cop s'ha eliminat (per defecte surt un lacònic "Element eliminat correctament").
Com sempre el codi:
function DeleteElem(pForm, pURL, pID, pPostDelete, pFunctionPostDelete, pMissatge) {
var Missatge = "Element eliminat correctament";
if (pPostDelete === undefined) pPostDelete = false;
if (pMissatge !== undefined) Missatge = pMissatge;
var PK = pID.split("-");
var PKURL = "";
jQuery.each(PK, function(i, val) {
PKURL += "&" + val + "=" + $("#" + val).val();
});
$.ajax({
type: "GET",
url: pURL + PKURL,
success: function (data, textStatus) {
if (data.indexOf("ERROR:") != -1) {
$("#ui-dialog-title-dialogErr").html("Error eliminant dades");
$("#errmsg").html(data);
$("#dialogErr").dialog("open");
}
else {
$("#ui-dialog-title-dialogOK").html("Element eliminat");
$("#okmsg").html(Missatge);
$("#dialogOK").dialog("open");
if (pPostDelete) {
if (pFunctionPostDelete !== undefined) pFunctionPostDelete(data);
}
}
}
});
}
Normalment la funció postDelete el que fa és netejar el formulari i posar-lo en mode inserció. Seria algo així:
function BlogPostDelete(pData) {
jQuery("#grdPosts").jqGrid().trigger("reloadGrid");
PostsInsert();
}
#05/02/2014 17:45 Programació Javascript Autor: Alex Canalda
Els ordinadors depenen en gran part de la caixa on es munten per ser bonics. Les caixes més barates pocs cops ho són de maques, això sí, són barates.
La que em vaig comprar fa temps realment m'agrada molt, però no està malament veure la resta del mercat. En aquest cas són caixes InWin, no és que tingui tan renom com LianLi, però ara s'ha ficat a les caixes de gama alta. Són els models 904 i 901, un per plaques mini-ATX i l'altra ATX normal. Tenen el quadrat d'alumini gruixut i els laterals de vidre temperat, yummi!. No és que tingui moltes baies internes on posar discs de 3.5 però això li puc perdonar.