Si llegaste hasta aquí, es porque nos interesa algo en común. El sitio está dedicado a cosas que me llaman la atención y que quiero compartir. Es personal, pero no privado. Tus comentarios, opiniones y enlaces son bienvenidos. ¡Que disfrutes tu estadía!
If you've made it here, we are interested in something in common. This site is dedicated to the things that call my attention and that I want to share. It's personal but not private so go ahead and post a comment in the blog. Opinions and links are very welcome. ¡Enjoy Your Stay!
En 1997 aproximadamente ignoraba muchas cosas sobre Internet y afortunadamente cada día sigo teniendo desafíos de nuevas cosas por conocer y aprender.
Entre las cosas con las que me topo hay casos de muchas personas talentosas que no tienen la menor idea de como funcionan (aunque sea superficialmente) ciertas tecnologías que ya deberían ser familiares. Lo que me sigue llamando la atención:
No me sorprende que aquellos que no nacieron con Internet les cueste entenderlo. Pero si de aquellos que lo usaron por lo menos desde sus 20 años y ya deberían estar acostumbrados. Mucho más ahora, que es la herramienta de los negocios y se requiere prácticamente en todos los empleos de oficina.
Si en algo sigues el mundo de la tecnología habrás estado expuesto a la canción "New Soul" de Yael Naim. El disco de esta jovencita sale a la venta el 18 de Marzo y tiene un sitio web muy sencillo y efectivo.
La razón de que le dedique esta entrada es que me hace añorar simplificar este sitio al máximo y además preguntarme si a algun programador de radio en Bolivia se le ocurrirá incluir en su lista de temas el tema que fue usado por Apple para su nueva MacBook Air, la más delgada de la historia.
Entre amenazas más agresivas y sistemas más avanzados, la defensa de una PC no suele ser completa a menos que exista una solución real que la proteja. Inclñuso en los sistemas mejor protegidos el último bastión es el más endeble: El usuario.
Un usuario educado puede evitar los más grandes problemas, aun así hay casos inevitables y cuando aparecen, una salida elegante a recuperar los datos del usuario SIN TOCAR EL HARDWARE. La mayor parte de la gente de soporte que conozco utiliza el recurso clasico de tomar el disco duro de un sistema que no arranca y copiar los datos a otro dispositivo de almacenamiento. Yo prefiero usar una técnica menos laboriosa pero igualmente efectiva, excepto si la cantidad de archivos es muy, muy grande. Claro que tener que realizar este trabajo de recuperación es un síntoma de que en la empresa no están realizando respaldos.
En fin, para nod esviarme del tema, aquí hay un enlace a instrucciones para crear un disco USB arrancable en DOS (NB: en inglés). Desde la línea de comando se puede acceder a los documentos del usuario. Luego se los copia al mismo USB y después de verificar los archivos sin olvidar pasar el antivirus, el camino está llano se inicia la reinstalación o reparación del Sistema Operativo.
Lo mejor obviamente es tener una imagen para restaurar al punto más cercano a la falla, pero eso es harina de otro costal.
En caso de que la página no esté disponible estos son los enlaces útiles:
¿Cuántos parámetros podemos adjuntar a un procedimiento almacenado?
Según MSDN: pueden ser hasta 2100!!!
No toda organización tiene el lujo de tener un equipo que incluya separadamente s administradores de Base de Datos (DBA's) desarrolladores y soporte TI.
Encontré este artículo en inglés (siempre son en inglés ¿no?) que presenta de manera sencilla lo que involucra enfrentarse al momento en que es inevitable restaurar una base de datos. Este es el enlace: http://www.builderau.com.au/program/sqlserver/soa/Restore-your-SQL-Server-database-using-transaction-logs/0,339028455,339282046,00.htm
Tal como los miembros de la Alianza Agil (Agile Alliance) previnieron, mucha gente piensa que las metodologías de desarrollo ágil equivalen a métodos livianos (en el sentido de light), provocando una falsa visión respecto a su seriedad o utilidad.
Jim Highsmith, uno de los fundadores resume en su sitio la esencia de la Agilidad, comprendida como aproximación al desarrollo:
"El futuro de la ecomomía de nuestra Era de la Información le pertenece a los Ágiles, aquellas organizaciones que tienen la capacidad de crear cambio, e incluso un poco de caos, para sus competidores. Si puedes innovar mejor y más rápido--puedes crear cambio para los competidores. Si puedes responder rápidamente a iniciativas competiticas, nueva tecnología, y requerimientos de clientes-- creas cambio para los competidores. Si eres más lento, menos innovador, tu respuesta es menor - entonces estás condenado a estrategias de sobrevivencia en un mar de caos impuesto por otros. Va a ser tu compañía la que imponga el ritmo de cambio, o serán los competidores quienes lo hagan? En un mundo de constante cambio, los rigorosos y tradicionales métodos de administración de proyectos y desarrollo de software son insuficientes para el éxito." (Jim Highsmith).
Dos de los preceptos del Manifiesto para el Desarrollo Ágil de Software afirman que son a) las herramientas y los procesos los que deben adecuarse a la gente y sus interacciones y b)que el principal énfasis está en la producción de software funcional antes que enfocarse en documentación exhaustiva.
Dentro de las tareas del día a día es fácil olvidar esta perspectiva, pero he encontrado que enfocarme en los dos primeros a toda costa me ha ayudado a cumplir con tiempos de entrega; enfrentando menos errores y logrando mayor satisfacción del cliente.
De manera obvia el resultado de alinear los objetivos del proveedor con los del cliente es una colaboración permanente que minimiza, como consecuencia, la discusión de términos contraactuales. El uso de metodologías Ágiles contribuye a que esto suceda de manera natural.
Finalmente la familiarización con un cambio constante, implica adaptarse al cambio y ser muy rápido para reaccionar. La programación que se basa en métodos ágiles implica ser capaces de abandonar planes para poder reaccionar a tiempo.
En siguientes entradas publicaré anotaciones de mi experiencia con aplicación de la Agilidad en proyectos del mundo real.
Son bienvenidas preguntas, comentarios y sugerencias, pero via el foro de discusión.
Al parecer por los datos de este mensaje, la respuesta es un rotundo SI. La nota fue publicada en eWeek, una de las revistas más respetadas de la industria. Está en inglés, pero básicamente dice que Microsoft está colocando actualizaciones sin el conocimiento ni permiso de los usuarios. La actividad fue reportada a eWeek por gente de Windows Secrets.
Esto fue el 12 de septiembre y no hay una respuesta oficial de Microsoft todavía.
Not every organization has the luxury of having a team that includes separate DBA's, developers and IT support. I just found an article that makes it easy for those that dread the moment when restoring a DB is inevitable. Check it out here: http://www.builderau.com.au/program/sqlserver/soa/Restore-your-SQL-Server-database-using-transaction-logs/0,339028455,339282046,00.htm
After releasing a module, sometimes a reorganization of files is performed in the development environment. Regardless of the method used to place the files in the corect locations, some locations will still contain the original files.
For some time DNN has been able to perform a clean up (deletion) of files. This is achieved by including a text file in the PA with the version number in the ##.##.##.txt format and it should list the paths and filenames that should be deleted.
For example to delete the MyFile.ascx file, just include its name in the .txt file. If the file is within a directory like /DesktopModules/MyModule/MySubDirectory/MyFile.ascx, remove the DesktopModules/MyModule path to obtain only a path relative to the module folder: MySubDirectory/MyFile.ascx.
After enabling AJAX, it's pretty easy to declaratively add an animated image using the UpdateProgress control from the Toolkit controls and an animated gif image. This post assumes you already know how to enable AJAX in your module, if not refere to this previous post. After enabling AJAX in DNN in any of the two ways detailed in the mentioned post, add an Update panel with a Label and a button control. <asp:UpdatePanel ID="UpdatePanel1" runat="server"><ContentTemplate> <asp:Label ID="Label1" runat="server" Text="Label">asp:Label><br /><asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />ContentTemplate>asp:UpdatePanel> Add the UpdateProgress control to your .ascx file and set the AssociatedUpdatePanel property value to the Update Panel ID of the UpdatePanel you want it to be associated to: <asp:UpdateProgress ID="UpdateProgress1" runat="server" AssociatedUpdatePanelID="UpdatePanel1">asp:UpdateProgress> In the Progress Template element add an Image control with its ImageUrl property value pointing to your animated image. <ProgressTemplate><asp:image id="updating1" Imageurl="~/DesktopModules/MyModule/Images/LoadingIcon.gif" runat="server"/>ProgressTemplate> The final markup should look like this: <asp:UpdateProgress ID="UpdateProgress1" runat="server" AssociatedUpdatePanelID="UpdatePanel1"><ProgressTemplate><asp:image id="updating1" Imageurl="~/DesktopModules/MyModule/Images/LoadingIcon.gif" runat="server"/>ProgressTemplate>asp:UpdateProgress> <asp:UpdatePanel ID="UpdatePanel1" runat="server"><ContentTemplate> <asp:Label ID="Label1" runat="server" Text="Label">asp:Label><br /><asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />ContentTemplate>asp:UpdatePanel> The best part about working with declarative programming is that you will not need to recompile your code.
After enabling AJAX, it's pretty easy to declaratively add an animated image using the UpdateProgress control from the Toolkit controls and an animated gif image. This post assumes you already know how to enable AJAX in your module, if not refere to this previous post.
After enabling AJAX in DNN in any of the two ways detailed in the mentioned post, add an Update panel with a Label and a button control.
<asp:UpdatePanel ID="UpdatePanel1" runat="server"><ContentTemplate>
<asp:Label ID="Label1" runat="server" Text="Label">asp:Label><br /><asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />ContentTemplate>asp:UpdatePanel>
Add the UpdateProgress control to your .ascx file and set the AssociatedUpdatePanel property value to the Update Panel ID of the UpdatePanel you want it to be associated to:
<asp:UpdateProgress ID="UpdateProgress1" runat="server" AssociatedUpdatePanelID="UpdatePanel1">asp:UpdateProgress>
In the Progress Template element add an Image control with its ImageUrl property value pointing to your animated image.
<ProgressTemplate><asp:image id="updating1" Imageurl="~/DesktopModules/MyModule/Images/LoadingIcon.gif" runat="server"/>ProgressTemplate>
The final markup should look like this:
<asp:UpdateProgress ID="UpdateProgress1" runat="server" AssociatedUpdatePanelID="UpdatePanel1"><ProgressTemplate><asp:image id="updating1" Imageurl="~/DesktopModules/MyModule/Images/LoadingIcon.gif" runat="server"/>ProgressTemplate>asp:UpdateProgress>
The best part about working with declarative programming is that you will not need to recompile your code.
I faced this error while updating a module I had recently moved from a DNN3 environment to a DNN4 WAP one. I received all sorts of advice including this post filled bits and pieces but nothing was a solution. After a few frustrating hours I decided to go back to basics and review what I had done to move the module. The module was working OK in my development but not in my test install.
After going through the web.config file, project configuration, dll naming setup, namespaces, references and everything inside the DNN VS Solution it was clear I was looking in the wrong place. Fianlly, I opened the nAnt build file and there it was. I had been compiling against a different dotnetnuke.dll. I was pointing to the wrong virtual directory, a previous DNN version install. The compiler never complained and I could get my module dlls. The module raised the error only at run-time in the test site. I just pointed the reference to the correct site and I was in the game again.
I hope this helps someone else not to lose so many hours with something so obvious.
It's incredibly easy to use AJAX in the DNN 4.5.X versions. In this post I describe the two ways in which you may use AJAX in a DNN module.
Use Control Definitions Assuming AJAX is already installed in the web server that runs DNN, a module will be dynamically wrapped in an Update Module by doing one of two things:
1) Adding the line below to the control node of a control in the .dnn manifest:
<supportspartialrendering>truesupportspartialrendering>
2) Select de checkbox for Supports Partial Rendering in the control definition for the control that will use AJAX. Control definitions are reached after selecting a control to edit in a specific Module Definition in Host>Module Definitions>.
When the Partial rendering is enabled, the Microsoft Ajax Library can be used as well as the popular Control Toolkit.
Try this simple example to test a module that has been AJAX-enabled through module definitions. Add a Label and an UpdatePanel to the view control of a module. The put a second Label and a Button inside the UpdatePanel.
Add an empty click event for the Button to create a postback. Then in the Page_Load event add a timer and assign the current datetime value to the labels.
System.Threading.Thread.Sleep(3000)
Label1.Text = DateTime.Now()
Label2.Text = DateTime.Now()
Clicking on the button shpould only update the datetime value of the label inside the update panel while the first one is unchanged.
Developer control Remember that there can exist one and only one ScriptManager object in a page and since Dotnetnuke uses a single page, it's only logical that the framework and not the modules should be responsible of adding it dynamically. That is exactly what the Dotnetnuke.Framework.Ajax class does. The class has 8 methods besides its constructor:
Taken from the class documentation:
AddScriptManager is used internally by the framework to add a ScriptManager control to the page
ContentTemplateContainerControl gets a reference to the ContentTemplateContainer control within an UpdatePanel
UpdatePanelControl dynamically creates an instance of an UpdatePanel control
IsInstalled can be used to determine if AJAX is installed on the server
RegisterScriptManager must be used by developers to instruct the framework that AJAX is required on the page
RemoveScriptManager will remove the ScriptManager control during Page Render if the RegisterScriptManager has not been called
ScriptManagerControl provides a reference to the ScriptManager control on the page
SetScriptManagerProperty uses reflection to set properties on the dynamically generated ScriptManager control
It is possible to use IsInstalled() to determine if AJAX is installed in the web server, and couple dwith RegisterScriptManager Dotnetnuke will add the ScriptManager control to the page so that the module can use Ajax. The result of the previous example will be the same, but without enabling partial rendering in the module.
If DotNetNuke.Framework.AJAX.IsInstalled() Then
DotNetNuke.Framework.AJAX.RegisterScriptManager()
'Do some stuff
End If
It is hard enough to keep up with all the stuff coming out of Microsoft for developers. Although I don't think there will be rush to upgrade to the newly released SQL 2008, the case for .Net 3.5 SP1 and Visual Studio 2008 SP1 is different. ASP.NET Dynamic Data, Script Combining and AJAX History alone are features that make it almost irrestible to upgrade the .Net Framework and the tool used to program against it.
I expect the second feature to be a strong one among DNN developers. Since scripts can be injected at many stages in DNN, there are performance challenges for modules that use multiple scripts and also a typical request can only do a couple of them in parallel. The problem is compound when you think about the sequential nature of javascript. The ability to use AJAX and combine script requests will help solve a bottleneck that affects performance in all ASP.NET applications, including DNN.
Another common problem for those already leveraging AJAX is the management of history points. With the promise of better interactivity and UI feedback with reduced flickering, AJAX raised a problem of its own: complexity to restore navigation history and viewstate with the use of the back and forward buttons in the browser without. The latest Service Pack for the framework introduces AJAX Browser History, a feature that will help the developer control navigation within an application that uses AJAX. DNN's modularity will certainly benefit, by enabling module developers to encapsulate the history points logic into their modules. Although it is too early to be certain about architectural impact on the DNN Core (keep in mind the DNN Core is still using .net 2.0 libraries), I suspect an implementation of a core service that unifies access to this feature to avoid code duplication might be a nice addition.
The best place to start learning about all the features available in these Service Packs is of course the Asp.net site. Videos, forums and other materials are already available so jump now to the downloads page to find more about the .Net 3.5 SP1 and Visual Studio 2008 SP1
Happy Coding!
The steady growth in registered users (600.000+ and counting) and downloads for the platform produces not only a growing installed base of users. Lately, the wealth of resources related to Dotnetnuke is evident as well. Almost everyday I come accross blog posts and articles about DotNetNuke. Although most are code related, desining and user oriented content is found throughout the web.
It is not news that DotNetNuke brought the web to novice coders, non-developers and hobbyist from the very start. The health of the project in its fifth year is a sign for late adopters, something that might prove to be the tipping point for DNN.
Philip Beadle, Joe Brinkman, Antonio Chagoury, Chris Hammond, Charles Nurse, Mitchel Sellers, from the DNN Team frequently provide rich tips and articles here at the dotnetnuke.com Blogs and at their personal blogs.
Mitchel was an already prolific poster, both at DNN forums and his own personal blog, before becoming a DNN team member (he's on his way to become a published DNN book author as well). Other users do not post as frequently, but many do share their experiences and tips about DNN. I have been following some of them and I want to share a few that picked my interest:
Chris Hammond has created a site that is a very useful service for the community. http://www.dotnetnukeblogs.com/ is a by request service that aggregates DNN exclusive content from Blogs. He's been sahring knowledge in his own site Chrishammond.com for a number of years already.
Charles Nurse also posts (a lot) about DotNetnuke at www.charlesnurse.com.
Mitchel Sellers prolific posts are available at www.mitchelsellers.com
I particularly enjoy former DNN team member Nina Meiers written trials and tribulations. She's candid as well as savvy and her insight is enriching for anyone.
Aussie and former DNN team member blog with useful content is Ventrian's Scott McCullough. You might recall his Friendly URLs contribution to the framework. He's not posting as often as in previous years, but his blog still has information.
DNN Friday was a popular blog that has not been publishing content as frequently, but still a great resource, specially for SEO content
DNNSecrets, woaychee, dnchannel, .NetAnswers, DotNetNuke Fun have miscelaneous DNN content and tips.
Rafe Kemmis is a very articulate poster that I found to have entertaining and useful monthly posts.
Cuong Dang, an Engage colleague of Chris Hammond has very interesting content about skinning.
That's it for now, there are of course many more and I might post about other bloggers in the future. If you want me to see yours, send me an email to nestor.sanchez@dotnetnuke.com with the address and a short description.
As much as everyone, I've been expecting Gallery to go into Beta, if only because it means we are close to a release after all this time. Well, it's time to say we finally have the 4.3.0 Beta package ready to be posted. It will take a little while before it's at www.dotnetnuke.com. So if you are as impatient as our Team, you can cruise to download your copy from: www.dnnmediagallery.com
WARNING: Do not use the Beta in Production sites. Upgrade from the Beta is not guaranteed
This Beta includes 59+ fixes and changes since the 3.0.12 version and it's been upgraded to work with .net 2.0.
Thanks to everyone who was involved with reaching this milestone!!!
Today Core Team member Vincenç Masanas gave a presentation about Localization in DotNetNuke. And it reminded me about the use of a Client API feature that has received little publicity.
Dotnetnuke is very lucky to have Jon Henning as part of the Core Team and the Client API is mainly a result of his work on the area. While my Gallery team mate Matthias Schlomann was doing work to make Gallery an XHTML compliant module, he also did extensive work to complete localization. One particular scenario where the usual method of localization requires an extra bit of work is related to string retrieval through Javascript.
Gallery has several places where JS is used to provided enhanced functionality for the module. For example inner navigation menus and popups that are particular to the Gallery can be found. In fact Forum and Gallery were the first modules where I found separate JS files were used. You will notice that most other Core Projects do not use JS as much as these two.
Of course, localizing texts in the browser using client side code has the potential of generating errors. Fortunately a ClientAPI method can be used to retrieve a localized string value that can be used with JS. The method is ClientAPI.GetSafeJSString() from the Dotnetnuke.UI.Utilities.ClientAPI namespace will escape a sequence of characters for safe javascript use. The method accepts a string and used in combination with the Localization GetString() method, you may grab a localized value from anywhere and inject it into your javascript.
Here's an example: var sNoneSpecified = '<%=ClientAPI.GetSafeJSString(Localization.GetString("myString", LocalResourceFile)) %>'
var sNoneSpecified = '<%=ClientAPI.GetSafeJSString(Localization.GetString("myString", LocalResourceFile)) %>'
After catching up slowly on the usual zillions of things that accumulate when you take a vacation, Gallery came into the picture once again. Previously, we had decided to open up spots for team members, so let me start this post by requesting a warm welcome to:
Andy Burguess Surjeet Gill Andrew Ryer Hans Zassenhaus Bill Severance
These developers should have by now full access to team resources and, as I write this, they should be thinking about how to fix the last 12 issues that remain open. Yes, you are reading right, we only have 12 bugs to go. Those are scheduled to be fixed in the first public Gallery beta ever. Sometime in the coming next 15 days you will see it posted for download and will be able to help iron out anything we may have missed.
As I've said numerous times before, this next release is focused on .net 2.0 porting and bug fixing. No new features will be added. However, at the time we post the beta, we will ask for suggestions for changes, new features and comments in general. This feedback will be incorporated in the Gallery Roadmap for the next versions.
Last, but not least, we have a new package in private beta testing (4.2.13) with several fixes. See the ChangeLog for more details. We are speeding up testing for this and the next packages because our efforts will be dedicated to create features needed for the new installer coming with DNN Cambrian.
Thanks to the team and congratulations guys on reaching this milestone, we are really close!