Fent proves i més proves he trobat que el resaltador de sintaxis en el seu estat original no troba correctament algunes paraules. Per exemple les paraules reservades "get" o "set", o String i StringBuilder.
Estic muntant aquesta pàgina, poc a poc vaig afegint coses que em semblen interessants.
Tinc pensat afegir codi que trobi interessant al blog, com eina de consulta, per aquelles vegades que passa allò de: "això ho tenia fet en algun lloc". I clar si afegeixo codi queda una mica lleig que estigui com text pla. I és aquí on entra el resaltador de sintaxis, per donar-li un xic de color.
Això mateix passa en la demo de jquery que tinc muntada, que en la documentació vaig afegir trossos de codi. Aleshores vaig posar una llibreria javascript que fa aquesta tasca, i funciona prou bé. Com a avantatge té que no es modifica el codi original (es a dir que a la BBDD on està el text del post, el codi està sense modificacions, tal com estava a l'editor), i aleshores desde el manteniment per moltes vegades que s'editi el contingut no es fa cap embolic al guardar (es a dir, quan es guarda des de el manteniment no torna a recalcular la coloració del codi). Com inconvenient té que és javascript, no tots els navegadors van igual, no tothom té el javascript en marxa, començant per un servidor.
Per això m'he decidit a fer un resaltador de sintaxis, però l'he fet en Winforms (sí, sí, la tecnologia en teoria morta), té un "textbox" i un botó. El resultat va a a parar al clipboard i després ho puc engaxar aquí. El blog l'únic que ha de tenir en compte és afegir uns estils al CSS i llestos. Haig de conservar el codi original en fitxers de text per si haig de retocar el codi colorejat.
I que millor que fer servir d'exemple que el propi codi del colorejador...
//////////////////////////////////////////////////////////////////////////////// This source code and all associated files and resources are copyrighted by// the author(s). This source code and all associated files and resources may// be used as long as they are used according to the terms and conditions set// forth in The Code Project Open License (CPOL).//// Copyright (c) 2013 Jonathan Wood// http://www.blackbeltcoder.com//using System;
using System.Collections.Generic;
using System.Net;
using System.Text;
namespace Colorizer
{
/// <summary>/// Class to colorize source code by inserting HTML markup around language tokens./// </summary>publicclass clsColorizer
{
// Language rules collectionpublic LanguageRulesCollection Languages { get; set; }
// Token class namespublicstring CssClassKeyword { get; set; }
publicstring CssClassSymbol { get; set; }
publicstring CssClassString { get; set; }
publicstring CssClassOperator { get; set; }
publicstring CssClassComment { get; set; }
/// <summary>/// Colorizer construction/// </summary>/// <param name="languageRulesFile">Name of XML file that contains all language rules</param>public clsColorizer(string languageRulesFile)
{
// Load language rules
Languages = new LanguageRulesCollection(languageRulesFile);
}
/// <summary>/// Color codes a block of source code using the specified language/// </summary>/// <param name="code">Source code to format</param>/// <param name="language">Language to use for formatting</param>/// <returns></returns>publicstring ColorizeCode(string code, string language)
{
// Load rules for the specified language
LanguageRules rules = Languages.GetLanguageRules(language);
if (rules == null)
thrownewException(String.Format("Undefined language \"{0}\" was specified", language));
// CSS class lookup tableDictionary<TokenClass, string> cssClasses = newDictionary<TokenClass, string>()
{
{ TokenClass.Keyword, CssClassKeyword },
{ TokenClass.Symbol, CssClassSymbol },
{ TokenClass.String, CssClassString },
{ TokenClass.Operator, CssClassOperator },
{ TokenClass.Comment, CssClassComment },
};
// Tokenize source code according to specified language rulesStringBuilder builder = newStringBuilder();
LanguageTokenizer tokenizer = new LanguageTokenizer(rules, code);
for (Token token = tokenizer.ParseNext(); token.Class != TokenClass.Null; token = tokenizer.ParseNext())
{
token.Value = WebUtility.HtmlEncode(token.Value);
string style;
if (cssClasses.TryGetValue(token.Class, out style) && !String.IsNullOrWhiteSpace(style))
builder.AppendFormat("<span class=\"{0}\">{1}</span>", style, token.Value);
else
builder.Append(token.Value);
}
return builder.ToString();
}
}
}
El més difícil alhora de fer un resaltat de sintaxis és trobar els identificadors de tipus, no he trobat cap resaltador que ho faci bé. Bé això no és del tot cert, hi ha un que sí ho fa però gairebé et compila l'aplicació (per saber quins tipus hi ha, i no és capaç de trobar-los en trossos de codi petits o aillats). També hi ha unes "productivity tools" del VisualStudio que et permeten guardar el codi com HTML, però al final m'he decidit per una cosa senzilleta i que no tingui que afegir res al VisualStudio, encara que no troba gaire bé els identificadors de tipus, he afegit els més comuns StringBuilder, DataTable etc...
#30/10/2013 23:05 Programació C# HTML/CSS Autor: Alex Canalda
Al fer una actualització de LaButaca, secció de DVDs, he vist que ha sortit Gru 2. Així que ha aparegut per casa aquesta pel·licula i ahir la vam veure. La primera està força bé ja que inclou el concepte de dolent-es-torna-bo, la segona això ja es sap, cal donar-li una mica d'empenta i per això el millor és buscar-li dóna.
Aquest concepte de buscar-li parella al Gru ja no és tan fàcil d'entendre per nens/es petits, per això penso que aquesta peli està destinada a nens de 6 (o millor 7) en endevant. Per no deixar als més petits fora de lloc i que realment no entenguin res estan els "minions" que són els ninotets grocs que es van pegant l'un a l'altra, traient-se la llengua etc... Al final no es sap qui és més protagonista si els minions o en Gru. Parlant de finals, com tota bona peli infantil molt previsible i esperat.
Fa un parell de setmanes que hem comprat una tablet, una Samsung Tab 3, amb 3G i WiFi. Preguntant-me que podia fer amb ella (alguna utilitat cal trobar-li) vaig recordar que les tablets poden actuar per controlar un PC de forma remota, vull dir actuant com un teclat/ratolí.
Fent una cerca al Google Play he trobat un programa anomenat Unified remote i he estat provant-lo. Està composat d'una part servidora, un programa que s'ha d'instal·lar al PC que es vol controlar i una App client que es conecta per TCP/IP al servidor.
Té força opcions de configuració i permet crear "mandos a distància" customitzats a base de XML. Jo només vaig modificar un que ja té per executar aplicacions i treure l'IExplorer i posar el Firefox, també vaig posar el Foobar.
Es curiós trobar una explicació a algo que m'estranyava. Ho vaig veure al móvil, 3 reproductors de video diferents, 3 reproductors d'audio diferents... Mmmmm... Que estrany. Després quan fa poc vam comprar la tablet altra cop, el triplet de cada allà present. I fa uns dies he trobat un article que explica aquesta triplicitat. Resulta que són de 3 origens diferents. El primer i més sencill és "open source", com Android ho és doncs s'ha de mantenir. El segon és de Google, més guay però "closed source", per controlar el desenvolupament, això ja com opinió personal però penso que si al Google Play surten ofertes de coses que escoltes, o similars no serà casualitat (potser per Gmail han vist que comentes algo a algu, però...). Finalment com Samsung no es vol quedar enrera doncs hi ha el seu, també amb el seu grup "Samsung Apps". Link a l'article
Les dues versions de les mateixes Apps, faltarien les de codi lliure
En el servidor on està el blog hi ha un RAID 1 gestionat per una controladora 6405 (germana petita de la 6805). Llegint el manual tècnic comenta que la temperatura de funcionament ha d'estar entre 0ºC i 55ºC. Amb el programa de gestió de la controladora es pot veure aquesta temperatura i estava a 65ºC, es a dir fora de rang, encara que la controladora funcionava correctament.
Disposava d'un ventilador de 40mm Noctua, i tenint-lo em va saber greu no fer-lo servir, el problema són el cargols que s'han de fer servir. Consultant-ho amb el servei tècnic d'Adaptec vaig trobar que són M2,6 x 12L, que es poden comprar a qualsevol botiga d'electrònica per uns mòdics 1,38EUR 30 cargols. El resultat és el que es veu a la foto i la temperatura ja no passa de 45ºC.
Controladora Adaptec 6405 amb el ventilador de 40mm posat