[{"content":"I just got this massage chair. There weren\u0026#8217;t too many reviews online, so I thought I\u0026#8217;d list my thoughts. I\u0026#8217;ll keep updating this as time goes on with my impressions.\nInitial Imperessions: Good: Chair is of really high quality. Good: The hardware of the chair is amazing with lots of possibilities. Bad: The software isn\u0026#8217;t very good. Although the hardware of the chair can do so much, the software is poorly designed. In the auto modes, its not possible to turn off individual features. In the manual mode, you cannot setup complex sequences that are available in the auto mode. I\u0026#8217;ll expand on this later. Other observations:\nThe chair actually comes with two remotes. One is a wired remote, while the other remote is wireless. The button layouts are different. I was able to pair the blutooth speakers in the chair with my echo dot. This way, I can tell Alexa to play some music on that specific dot, and the chair plays the music though its speakers. This works fantastic. This chair is huge. I was able to get it into the house (barely). However, the door to my basement was only 29.5\u0026#8243;. The base of the chair is about 30.5\u0026#8243; (as it ships, before assembly), so I needed to take out the door frame to my basement door in order to get it into the basement. 1 Week Later After having the chair for a week:\nThe air ionizer feature is neat, but not because it ionizes air (I\u0026#8217;m not even sure what that\u0026#8217;s supposed to do). It blows air on your face while you\u0026#8217;re getting a massage. Paired with some relaxing music, its a good feeling. Favorite mode: Neck \u0026#038; Shoulder Least favorite mode: Extension The \u0026#8220;auto sensing\u0026#8221; feature for the leg adjustment actually requires quite a bit of pressure. Basically, after the message chair starts and the legs are raised a little, the feet section will extend and then retract. I need to apply quite a bit of pressure when it starts to retract in order to prevent it from retracting too much. If it retracts too mucnh, I can use the remote to extend again, but that\u0026#8217;s an extra step that I\u0026#8217;d rather not do, especially after the massage has already started and the arm airbags might be going off. From my prior research, I had the impression that the zero gravity feature was supposed to raise your legs higher than this chair does. It just raises the legs a little, so that when I\u0026#8217;m laying down, the legs are about equal in height as my waist. If you need this chair to be backed up to a wall, the space saving feature will be great. However, I don\u0026#8217;t need that, and the space saving feature just adds extra time to when a massage is over, as I have to wait for the chair to retract before I get off. Make sure to raise the \u0026#8220;pillow\u0026#8221; on the massage chair so that it doesn\u0026#8217;t cover your shoulders, as that will limit the effectiveness of the rollers on the shoulders. I wrote to Infinity asking them if there was a way for me to write my own custom programs via an API, but they just ignored me. I\u0026#8217;ve been using this chair every day for the past 8 days. At the beginning, some of the massages felt too intense. However, I think my back has gotten used to it, as the intensity feels just right. There are 3 3D programs, so I thought I\u0026#8217;d describe them here since I haven\u0026#8217;t seen a good description online:\nDeep Shiatsu: My least favorite of the 3D programs. The rollers extend into your back, and then retract, move to a different location, and repeat. Shows off the 3D feature, but that\u0026#8217;s prob about it. Healthy Breath: The rollers extend into your back in the lower waist, and then move upwards in strokes of varying lengths before retracting. My favorite of the 3D programs. Massage Extend: The rollers extend into your back, and then go up and down your back without making other movements. When at the peak (or trough), they may adjust their width and then continue the up/down movements. ","permalink":"https://www.bloodforge.com/2020/08/infinity-imperial-massage-chair-review/","summary":"\u003cp\u003eI just got this massage chair. There weren\u0026#8217;t too many reviews online, so I thought I\u0026#8217;d list my thoughts. I\u0026#8217;ll keep updating this as time goes on with my impressions.\u003c/p\u003e\n\u003ch3\u003eInitial Imperessions:\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cspan style=\"color: green\"\u003eGood:\u003c/span\u003e Chair is of really high quality.\u003c/li\u003e\n\u003cli\u003e\u003cspan style=\"color: green\"\u003eGood:\u003c/span\u003e The hardware of the chair is amazing with lots of possibilities.\u003c/li\u003e\n\u003cli\u003e\u003cspan style=\"color: red\"\u003eBad:\u003c/span\u003e The software isn\u0026#8217;t very good. Although the hardware of the chair can do so much, the software is poorly designed. In the auto modes, its not possible to turn off individual features. In the manual mode, you cannot setup complex sequences that are available in the auto mode. I\u0026#8217;ll expand on this later.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eOther observations:\u003c/p\u003e","title":"Infinity Imperial Massage Chair Review"},{"content":"Bloodforge.com is now powered by\u0026nbsp;Blogifier.\nBlogifier is a .NET Core 2.0 project. Because my previous webhost didn\u0026#8217;t support .NET Core, I switched over to using\u0026nbsp;Digital Ocean. I wanted to move to Azure, but since I didn\u0026#8217;t way to pay more than $5 per month, that wasn\u0026#8217;t really an option.\nThis is also the first time in a very long time that my website is running on Linux. So far, so good.\nI\u0026#8217;m currently using the dev branch of Blogifier, so there may be some issues. Also, I\u0026#8217;m in the process of creating my theme for the blog (Blogifier uses bootstrap, and I wanted to use Angular). The theme isn\u0026#8217;t done yet, so I expect many bugs.\n","permalink":"https://www.bloodforge.com/2017/09/bloodforge-has-a-new-home/","summary":"\u003cp\u003eBloodforge.com is now powered by\u0026nbsp;\u003ca href=\"https://github.com/blogifierdotnet/Blogifier.Core\"\u003eBlogifier\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eBlogifier is a .NET Core 2.0 project. Because my previous webhost didn\u0026#8217;t support .NET Core, I switched over to using\u0026nbsp;\u003ca href=\"https://www.digitalocean.com/\"\u003eDigital Ocean\u003c/a\u003e. I wanted to move to Azure, but since I didn\u0026#8217;t way to pay more than $5 per month, that wasn\u0026#8217;t really an option.\u003c/p\u003e\n\u003cp\u003eThis is also the first time in a very long time that my website is running on Linux. So far, so good.\u003c/p\u003e","title":"Bloodforge has a new home"},{"content":"I needed to create a program which will run a web page from the local file system. Using the WebBrowser control wasn\u0026#8217;t really an option since that uses the Trident engine which didn\u0026#8217;t support many of the things we were trying to do in the web page. I went with the latest build of\u0026nbsp;CefSharp.Wpf, but that doesn\u0026#8217;t natively run local files, so it had to be modified. Fortunately, I found some posts on how to enable that feature (here\u0026nbsp;and\u0026nbsp;here) \u0026#8211; however, the first link was for an older version of CefSharp, and the second link only works with static resource files. I ended up merging both concepts to get it to work.\nThe code below works on version 53.0.1 of CefSharp.Wpf.\u0026nbsp;\nFirst, the following two classes needed to be created:\nLocalResourceHandlerFactory.cs:\nusing System; using CefSharp; namespace MyCustomNamespace { public class LocalResourceHandlerFactory : IResourceHandlerFactory { public bool HasHandlers { get { return true; } } public IResourceHandler GetResourceHandler(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request) { return new LocalResourceHandler(); } } } LocalResourceHandler.cs: using System; using System.IO; using CefSharp; using System.Collections.Generic; namespace MyCustomNamespace { class LocalResourceHandler : IResourceHandler { private string mimeType; private MemoryStream stream; public void Cancel() { } public bool CanGetCookie(Cookie cookie) { return true; } public bool CanSetCookie(Cookie cookie) { return true; } public void Dispose() { } public void GetResponseHeaders(IResponse response, out long responseLength, out string redirectUrl) { responseLength = stream == null ? 0 : stream.Length; redirectUrl = null; response.StatusCode = (int)System.Net.HttpStatusCode.OK; response.StatusText = \"OK\"; response.MimeType = mimeType; } public bool ProcessRequest(IRequest request, ICallback callback) { // The 'host' portion is entirely ignored by this scheme handler. var uri = new Uri(request.Url); var file = uri.AbsolutePath; if (File.Exists(file)) { Byte\u0026#91;] bytes = File.ReadAllBytes(file); stream = new MemoryStream(bytes); switch (Path.GetExtension(file)) { case \".html\": case \".htm\": mimeType = \"text/html\"; break; case \".css\": mimeType = \"text/css\"; break; case \".js\": mimeType = \"text/javascript\"; break; case \".png\": mimeType = \"image/png\"; break; case \".jpg\": case \".jpeg\": mimeType = \"image/jpeg\"; break; case \".gif\": mimeType = \"image/gif\"; break; case \".woff\": mimeType = \"application/font-woff\"; break; case \".eot\": mimeType = \"application/vnd.ms-fontobject\"; break; case \".ttf\": mimeType = \"application/font-ttf\"; break; case \".otf\": mimeType = \"application/font-otf\"; break; case \".svg\": mimeType = \"image/svg+xml\"; break; case \".appcache\": case \".manifest\": mimeType = \"text/cache-manifest\"; break; default: mimeType = \"application/octet-stream\"; break; } callback.Continue(); return true; } return false; } public bool ReadResponse(Stream dataOut, out int bytesRead, ICallback callback) { //Dispose the callback as it's an unmanaged resource, we don't need it in this case callback.Dispose(); if (stream == null) { bytesRead = 0; return false; } //Data out represents an underlying buffer (typically 32kb in size). var buffer = new byte\u0026#91;dataOut.Length]; bytesRead = stream.Read(buffer, 0, buffer.Length); dataOut.Write(buffer, 0, buffer.Length); return bytesRead \u0026amp;gt; 0; } } } With the above code in place, we can now load the web page from a local file. The code below assumes that the HTML files are located in a \u0026#8216;web\u0026#8217; subdirectory (for example, /bin/debug/web/) public MainWindow() { var settings = new CefSharp.CefSettings { RemoteDebuggingPort = 1234 }; // for some reason, performance sucks w/ the gpu enabled settings.CefCommandLineArgs.Add(\"disable-gpu\", \"1\"); settings.CefCommandLineArgs.Add(\"disable-gpu-vsync\", \"1\"); CefSharp.Cef.Initialize(settings); InitializeComponent(); browser.ResourceHandlerFactory = new LocalResourceHandlerFactory(); browser.BrowserSettings.FileAccessFromFileUrls = CefSharp.CefState.Enabled; browser.BrowserSettings.UniversalAccessFromFileUrls = CefSharp.CefState.Enabled; browser.BrowserSettings.WebSecurity = CefSharp.CefState.Disabled; //browser.BrowserSettings.WebGl = CefSharp.CefState.Disabled; string dir = System.IO.Directory.GetCurrentDirectory(); String page = string.Format(\"{0}/web/index.html\", dir); browser.Address = page; } ","permalink":"https://www.bloodforge.com/2017/01/running-local-web-pages-in-cefsharp-wpf/","summary":"\u003cp\u003eI needed to create a program which will run a web page from the local file system. Using the WebBrowser control wasn\u0026#8217;t really an option since that uses the Trident engine which didn\u0026#8217;t support many of the things we were trying to do in the web page. I went with the latest build of\u0026nbsp;\u003ca href=\"https://www.nuget.org/packages/CefSharp.Wpf/\"\u003eCefSharp.Wpf\u003c/a\u003e, but that doesn\u0026#8217;t natively run local files, so it had to be modified. Fortunately, I found some posts on how to enable that feature (\u003ca href=\"https://thechriskent.com/2014/04/21/use-local-files-in-cefsharp/\"\u003ehere\u003c/a\u003e\u0026nbsp;and\u0026nbsp;\u003ca href=\"https://github.com/cefsharp/CefSharp/blob/master/CefSharp.Example/CefSharpSchemeHandler.cs\"\u003ehere\u003c/a\u003e) \u0026#8211; however, the first link was for an older version of CefSharp, and the second link only works with static resource files. I ended up merging both concepts to get it to work.\u003c/p\u003e","title":"Running Local Web Pages in CefSharp.WPF"},{"content":" I love .NET, but this video is really funny and well done. ","permalink":"https://www.bloodforge.com/2016/04/awesome-java-vs-net-video/","summary":"\u003cp\u003e I love .NET, but this video is really funny and well done. \u003c/p\u003e\n\u003cfigure class=\"wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"\u003e\u003cdiv class=\"wp-block-embed__wrapper\"\u003e\n\u003ciframe title=\"Dot Net Vs JAVA   Funniest Video Ever Must Watch)\" width=\"500\" height=\"281\" src=\"https://www.youtube.com/embed/Mhllo1xQer8?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen\u003e\u003c/iframe\u003e\n\u003c/div\u003e\u003c/figure\u003e","title":"Awesome Java vs .NET video"},{"content":" Adjust the smoke in this post header Color Opacity Speed Particle Size Density The following code represents the current settings of the header of this post. As you change the values above, the code below will update. $('.post-header').SmokeEffect({ color: 'black', opacity: 0.2, maximumVelocity: 1, particleRadius: 128 density: 10 }); Source Code The code is located on Github at\u0026nbsp;https://github.com/murst/Bloodforge-Smoke-Effect﻿\n","permalink":"https://www.bloodforge.com/2015/06/the-jquery-bloodforge-smoke-effect/","summary":"\u003cscript src=\"https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js\"\u003e\u003c/script\u003e\n\u003cfieldset\u003e\u003clegend\u003eAdjust the smoke in this post header\u003c/legend\u003e\n\u003cdiv class=\"smoke-adjust\"\u003e\u003clabel for=\"smoke-color\"\u003eColor\u003c/label\u003e \u003cinput id=\"smoke-color\" type=\"color\" value=\"#000000\"\u003e\u003c/div\u003e\n\u003cdiv class=\"smoke-adjust\"\u003e\u003clabel for=\"smoke-opacity\"\u003eOpacity\u003c/label\u003e \u003cinput id=\"smoke-opacity\" max=\"1\" min=\"0\" step=\"0.01\" type=\"range\" value=\"0.2\"\u003e\u003c/div\u003e\n\u003cdiv class=\"smoke-adjust\"\u003e\u003clabel for=\"smoke-speed\"\u003eSpeed\u003c/label\u003e \u003cinput id=\"smoke-speed\" max=\"200\" min=\"1\" step=\"1\" type=\"range\" value=\"50\"\u003e\u003c/div\u003e\n\u003cdiv class=\"smoke-adjust\"\u003e\u003clabel for=\"smoke-size\"\u003eParticle Size\u003c/label\u003e \u003cinput id=\"smoke-size\" max=\"500\" min=\"10\" step=\"1\" type=\"range\" value=\"150\"\u003e\u003c/div\u003e\n\u003cdiv class=\"smoke-adjust\"\u003e\u003clabel for=\"smoke-density\"\u003eDensity\u003c/label\u003e \u003cinput id=\"smoke-density\" max=\"20\" min=\"1\" step=\"1\" type=\"range\" value=\"10\"\u003e\u003c/div\u003e\n\u003c/fieldset\u003e\n\u003cscript\u003e\n// \u003c![CDATA[\n/*\nBloodforge Smoke Effect v1.4\nCopyright (c) 2017 Filip Stanek (http://bloodforge.com)\nBased off code written by Johny Cornwell (http://www.blog.jonnycornwell.com/)\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n\u003cp\u003e// A function to create a particle object.\nfunction Particle(context, canvasWidth, canvasHeight) {\u003c/p\u003e","title":"The jQuery Bloodforge Smoke Effect"},{"content":" I created a log viewer for my Honeywell thermostat. In addition to providing a much more friendly way of viewing log files, it aggregates logs over time allowing for some pretty neat analysis.\nThe site is located at http://energy.bloodforge.com (sorry, but this site isn\u0026#8217;t active anymore)\n","permalink":"https://www.bloodforge.com/2014/11/thermostat-statistics-via-logs-for-honeywell-prestige-iaq-2/","summary":"\u003cdiv class=\"wp-block-image\"\u003e\u003cfigure class=\"aligncenter size-large\"\u003e\u003cimg loading=\"lazy\" width=\"500\" height=\"415\" src=\"/wp-content/uploads/2020/02/energypreview.png\" alt=\"\" class=\"wp-image-186\" srcset=\"/wp-content/uploads/2020/02/energypreview.png 500w, /wp-content/uploads/2020/02/energypreview-300x249.png 300w\" sizes=\"(max-width: 500px) 100vw, 500px\" /\u003e\u003c/figure\u003e\u003c/div\u003e\n\u003cp\u003eI created a log viewer for my Honeywell thermostat. In addition to providing a much more friendly way of viewing log files, it aggregates logs over time allowing for some pretty neat analysis.\u003c/p\u003e\n\u003cp\u003eThe site is located at \u003ca href=\"http://energy.bloodforge.com/\"\u003ehttp://energy.bloodforge.com\u003c/a\u003e (sorry, but this site isn\u0026#8217;t active anymore)\u003c/p\u003e","title":"Thermostat Statistics via Logs for Honeywell Prestige IAQ 2"},{"content":"I’m using this post to document how I upgraded my blog for HTTPS.\nThe first thing I needed to do was to get a SSL certificate. I really didn’t feel like paying for one, so I went with a free certificate from\u0026nbsp;StartSSL. Their free certificates expire after a year (I wish it was longer), so I’ll need to do this again next year.\u0026nbsp; But they work and… they’re free.\nAfter I got my p12 certificate above, I asked my web host (Arvixe) to set everything up. It took them about 2 days (it was the weekend though, so maybe it would have been faster if it was during the week). This was pretty much the easiest part since all I had to do was to provide them with the cert, and they got it installed and set up the correct ports for HTTPS.\nAt this point, I could browse my site using HTTPS. I did have some security warnings, and to fix those I had to update my stylesheets with secure paths to my images. Also, I needed to update some script paths, as they were not secure either.\nFinally, I added a rule into my web.config file so that all traffic always gets re-routed to HTTPS.\n","permalink":"https://www.bloodforge.com/2014/10/updating-my-blogengine-net-blog-to-use-ssl-https-from-http/","summary":"\u003cp\u003eI’m using this post to document how I upgraded my blog for HTTPS.\u003c/p\u003e\n\u003cp\u003eThe first thing I needed to do was to get a SSL certificate. I really didn’t feel like paying for one, so I went with a free certificate from\u0026nbsp;\u003ca href=\"http://www.startssl.com/\"\u003eStartSSL\u003c/a\u003e. Their free certificates expire after a year (I wish it was longer), so I’ll need to do this again next year.\u0026nbsp; But they work and… they’re free.\u003c/p\u003e\n\u003cp\u003eAfter I got my p12 certificate above, I asked my web host (Arvixe) to set everything up. It took them about 2 days (it was the weekend though, so maybe it would have been faster if it was during the week). This was pretty much the easiest part since all I had to do was to provide them with the cert, and they got it installed and set up the correct ports for HTTPS.\u003c/p\u003e","title":"Updating my BlogEngine.NET blog to use SSL (HTTPS) from HTTP"},{"content":"The following numbers are all in kWh, and for my single-family house that is about 2,000 square feet, plus basement. All heating is electric. My electric bills usually come in around the 17th to 20th of the month. In the data below, an October value is actually the usage from the second half of September to the first half of October.\u0026nbsp;\nThe data is current as of 5/24/2017. I\u0026#8217;ll try to update this monthly.\nkWh Usage Details, Monthly Below is a breakdown of my monthly electric usage since late 2007. The blue cells is my usage when using an inefficient air-source heat pump (probably 10 or 11 SEER). The green cells is my usage since\u0026nbsp;installing a geothermal heat pump.\n\u0026nbsp; Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 2007 \u0026nbsp; \u0026nbsp; \u0026nbsp; \u0026nbsp; \u0026nbsp; \u0026nbsp; \u0026nbsp; \u0026nbsp; \u0026nbsp; \u0026nbsp; 1,613 4,572 2008 5,053 5,676 4,644 2,815 1,404 1,325 1,235 863 1,358 962 1,517 3,764 2009 4,700 3,495 3,170 2,724 920 836 1,354 1,347 1,497 1,410 1,788 3,119 2010 5,836 5,462 3,127 1,625 1,032 1,390 1,197 1,651 1,445 1,315 1,517 4,697 2011 6,144 5,035 3,768 2,585 1,702 1,568 1,641 1,643 1,536 1,065 1,496 2,345 2012 3,028 3,663 2,922 1,637 1,422 1,358 1,800 1,485 1,523 1,317 1,683 2,695 2013 2,870 3,515 2,544 1,800 1,100 1,179 1,381 1,256 1,836 942 1,476 3,182 2014 4,416 5,750 3,226 1,488 1,193 1,331 1,408 1,294 1,467 1,088 1,441 2,427 2015 3,071 2,674 2,659 1,617 1,190 1,297 1,491 1,509 1,526 1,203 1,227 1,836 2016 2,825 2,610 1,538 1,598 972 1,191 1,494 1,775 1,369 1,220 1,151 2,755 2017 3,936 2,015 1,825 1,245 1,080 1,204 1,365 1,324 1,395 1,199 1,409 2,300 2018 3,696 2,510 2,031 1,845 1,062 1,339 1,733 1,374 1,843 1,324 1,492 2,562 2019 2,624 2,758 2,467 1,419 1,053 1,254 1,525 1,248 1,373 1,243 1,638 2,554 2020 2,654 2,575 \u0026nbsp; \u0026nbsp; \u0026nbsp; \u0026nbsp; \u0026nbsp; \u0026nbsp; \u0026nbsp; \u0026nbsp; \u0026nbsp; \u0026nbsp; kWh Usage, Monthly Average Here is a summary of the above table. The blue cells is the average, per month, of the blue cells from the table above, and the green cells are the average, per month, of the green cells above.\n\u0026nbsp; Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec Air 4,578 4,656 3,343 2,096 1,263 1,276 1,435 1,363 1,523 1,169 1,580 3,304 Geo 3,134 2,524 2,104 1,545 1,092 1,269 1,503 1,421 1,496 1,213 1,393 2,406 In the summer months I\u0026#8217;m obviously not really saving any\u0026nbsp;(significant)\u0026nbsp;money, even when compared to the 20-year old, inefficient air source heat pump. I never did use much electric (for cooling) in the summer months though.\nBased on the \u0026#8220;Monthly Average\u0026#8221; data above, I\u0026#8217;m saving about 6,094 kWh per year. At my current electric rate of about $0.10 per kWh (it varies slightly month-to-month), the yearly savings from upgrading to geothermal is $609.40. This translates to a 22.4% savings per year over my previous electric bills.\nWhen I purchased my geothermal unit, my existing heat pump was broken. I received various estimates for replacement \u0026#8211; the average of which was around $8,500. The final cost of the geothermal heat pump from Arronco came out to be around $13,500 after tax credits and rebates. If I assume that a new air source heat pump would have similar performance to my old air source heat pump (which probably is not a good assumption), the return on investment would be roughly 8 years. However, since a new air source heat pump should be more efficient than my old air source heat pump, I\u0026#8217;m guessing that a more realistic ROI would be closer to 10 years.\n","permalink":"https://www.bloodforge.com/2014/06/detailed-geothermal-analysis-in-cincinnati-ohio/","summary":"\u003cp\u003eThe following numbers are all in kWh, and for my single-family house that is about 2,000 square feet, plus basement. All heating is electric. My electric bills usually come in around the 17th to 20th of the month. In the data below, an October value is actually the usage from the second half of September to the first half of October.\u0026nbsp;\u003c/p\u003e\n\u003cp\u003eThe data is current as of 5/24/2017. I\u0026#8217;ll try to update this monthly.\u003c/p\u003e","title":"Detailed Geothermal Analysis in Cincinnati, Ohio"},{"content":"This is a follow-up article to my initial article about\u0026nbsp;my geothermal installation.\nFor the past couple days, Arronco was finishing up their geothermal installation in my house. The first day was spent on removing my existing unit as well as setting up the Byrant geothermal unit (GT-PB). The second day was spent on finishing up the GT-PB install, hooking up the tubes that run outside to the unit, attaching my water heater to the geothermal unit, and finally setting up my thermostat.\nThe first set of pictures is some of the work outside of the house.\nAnd here it is with all of the work complete: Too see how this has affected my electric usage\u0026nbsp;click here ","permalink":"https://www.bloodforge.com/2014/04/arronco-geothermal-installation-in-cincinnati-part-2/","summary":"\u003cp\u003eThis is a follow-up article to my initial article about\u0026nbsp;my \u003ca href=\"//bloodforge.com/index.php/2014/04/18/my-arronco-geothermal-installation-in-cincinnati/\"\u003egeothermal installation\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eFor the past couple days, Arronco was finishing up their geothermal installation in my house. The first day was spent on removing my existing unit as well as setting up the Byrant geothermal unit (GT-PB). The second day was spent on finishing up the GT-PB install, hooking up the tubes that run outside to the unit, attaching my water heater to the geothermal unit, and finally setting up my thermostat.\u003c/p\u003e","title":"Arronco Geothermal Installation in Cincinnati Part 2"},{"content":"It was time for me to replace my heat pump, and I got a few bids from local companies. I ended up setting on a geothermal system from\u0026nbsp;Arronco.\nThey came out yesterday to drill the wells where the tubes will go. The first thing to show up was the tubing, delivered by a local delivery company.\nAfter that the Arronco geothermal truck showed up. The guys put down some rubber mats on the lawn so that the tires don’t damage the yard too much. It still ended up tearing up my yard, but I don’t really see how they could do it any other way. They also had very little space to work with as it had to fit between the driveway and the electric box in front of the house. The weight of that truck would have probably cracked my driveway. Once everything was set up, they got the truck in. Once the truck was in place, they put the big digging arm up and started digging the first of two holes. Each hole was to be 225’ deep. The entire process is very loud, a kind of messy (although a lot less messy than I thought it would be). Here are some more photos of the entire process. The white stuff is ground up limestone that started coming up once they got like 30’ below ground. After they left, I was left with the following in my yard. They’ll be coming over on Monday to install the unit inside, and on Wednesday to dig the trench that will connect the tubing to the inside. See Part 2 of my geothermal system installation in Cincinnati.\n","permalink":"https://www.bloodforge.com/2014/04/my-arronco-geothermal-installation-in-cincinnati/","summary":"\u003cp\u003eIt was time for me to replace my heat pump, and I got a few bids from local companies. I ended up setting on a geothermal system from\u0026nbsp;\u003ca href=\"http://www.arronco.com/\"\u003eArronco\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThey came out yesterday to drill the wells where the tubes will go. The first thing to show up was the tubing, delivered by a local delivery company.\u003c/p\u003e\n\u003cfigure class=\"wp-block-image size-large\"\u003e\u003cimg loading=\"lazy\" width=\"1024\" height=\"575\" src=\"/wp-content/uploads/2020/02/WP_20140417_005.jpg\" alt=\"\" class=\"wp-image-143\" srcset=\"/wp-content/uploads/2020/02/WP_20140417_005.jpg 1024w, /wp-content/uploads/2020/02/WP_20140417_005-300x168.jpg 300w, /wp-content/uploads/2020/02/WP_20140417_005-768x431.jpg 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" /\u003e\u003c/figure\u003e\n\u003cp\u003e After that the Arronco geothermal truck showed up. \u003c/p\u003e","title":"My Arronco Geothermal Installation in Cincinnati"},{"content":"It could have been worse, in that my order could not have arrived. It did arrive, although almost 1 month late and after I spent hours of my time on the phone with Digital River customer support (and many email threads).\nFeb 10th, 2014 I pre-ordered Final Fantasy 13-3 Lightning Returns from the Square Enix online store, which is powered by Digital River. I had already heard of how bad Digital River can be due to their complete screw-up of the Ni No Kuni Collectors Edition. However, since that had happened about 1 year prior, I thought that they may have already fixed their problems.\nRight off the bat I should have known that something was not right. It took me about 30 minutes to register an account. I registered with my normal email, but some error occurred during registration. When I tried to re-register, it told me that the email was already in use. However, any attempt to log in (or do a password recovery) was not successful. I was asked security questions in the password recovery screen, however, I never answered these security questions when I created my account in the first place. I had to abandon that email, and try a different one. The process failed again, with the exact same password recovery problem. The third time worked.. I suppose it is a good thing that I can make unlimited aliases for my email address.\nFinal Fantasy 13-3 Lightning Returns CE was $90, which is $10 less than would qualify for free shipping from Digital River (they wanted about $10 for the shipping charge). Instead of paying for their overpriced shipping, I decided to add a Cactuar Plush to my order so that it would ship for free. I had wanted to add other items, but they were all out of stock, and the Cactuar was in stock.\nFeb 11th, 2014 The game was supposed to be shipped. Instead, I get an email that the Cactuar is back-ordered and my entire order will not ship because of it. I really don’t understand why they handle it like that. All of the other stores I’ve ordered from online will ship the items as soon as possible… except for Digital River.\nInstead of waiting for the Cactuar to come back in stock, I quickly called their customer support department (by the way, their web site is a complete disaster to navigate if you need to get some help). I found their phone number in a comments section on a blog, as their own website does not seem to make it available (FYI, it is (866) 585-3251). The CSR confirmed that the product was on back order, and she did not have an estimated shipping date. She suggested that I cancel the Cactuar Plush from my order and that will cause it to ship in the next 1-2 days. I instructed her to process the cancellation, and I could verify that the cancellation request appeared right away on my order on Digital River’s site.\nFeb 14th, 2014 Three days have passed and the item has not shipped. I called their customer service again. They tell me that the order has been sent to the fulfillment agency and that it should be shipping very soon. Also, they tell me that there isn’t anything else that they can do at this time.\nFeb 17th, 2014 Three more days, and no update on my order. At this point, I cannot even cancel it and order a new one since the game is sold out. Instead of calling, I use their email feature online to ask about my order, since the phone attempt was not very successful.\nFeb 19th, 2014 It takes them two days to answer my email. The tell me the exact same thing as the phone support 3 days earlier:\nThank you for contacting the Square Enix online store. We show that your order is complete, and it will be shipping soon. You will receive a separate shipping notification email when your order ships. We suggest to check your inbox, spam or junk mail folders.\nFeb 24th, 2014 Five more days pass, and the order has still not shipped. It is now 2 weeks after my order date. I send them another email asking them about the status of my order.\nFeb 25th, 2014 I get a response back from their customer support:\nThank you for contacting the Square Enix online store. A request has been submitted to cancel cactuar from your order so that the Final Fantasy XIII will be shipped.\u0026nbsp;\nHowever, the cactuar was not successfully cancelled. A follow-up ticket has been created for this issue and you should receive a response within 2-3 business days. If you do not receive any email in your inbox, please check your junk or spam mail filters. As soon as the backordered item is cancelled, your order will be promptly shipped.\u0026nbsp;\nWe apologize for any inconvenience this may have caused.\nNot cancelled? What does that mean? The cactuar has been in stock for probably a week now. So my order cannot ship with the cactuar, and it cannot ship without the cactuar?\nFeb 27th, 2014 Two more days pass and nothing. I send them another email.\nFeb 28th, 2014 I get an email that the Cactuar has now been cancelled. So it took them 17 days to cancel an item from my order…\nMar 2nd, 2014 I finally get a reply to my email from the 27th:\nThank you for contacting the Square Enix online store.\u0026nbsp;\nWe apologize for the inconvenience this may have caused you.\u0026nbsp;\nWe show that your preordered FINAL FANTASY Series Plush CACTUAR [2014 Ver.] was already cancelled. Your order will be shipping soon. You will receive a separate shipping notification email when your order ships.\nMar 3rd, 2014 Shipping confirmation! Its only 3 weeks late, but they’re actually shipping my order. The order is shipping from near Indianapolis, which is about 90 minutes away.\nMar 7th, 2014 I need to drive to the post office to pick up my order. The tracking says that the delivery was attempted yesterday but no one was available to accept the order. This is shipping to my place of work and there are about 20 people working at the time the delivery supposedly happened. We also have security cameras that show that no delivery was attempted. However, I’m able to retrieve the package from the post office.\nI still cannot understand why this process is so difficult. I would gladly pay $20 more for the game if it was to be delivered from somewhere like Amazon and I could be fairly certain that it will arrive on the day it is supposed to (I have yet to see Amazon mess up a pre-order, although I’m sure it has happened to others). At least Amazon’s customer service is great.\nI suppose I should be happy that I got the game. During the weeks it took to ship, I did lose hope. But this could have been so much easier had Square Enix not used Digital River and stuck with Amazon, Newegg, or even Gamestop.\nI would never recommend for anyone to use this store.\n","permalink":"https://www.bloodforge.com/2014/03/horrible-experience-with-square-enix-and-digital-river-review/","summary":"\u003cp\u003eIt could have been worse, in that my order could not have arrived. It did arrive, although almost 1 month late and after I spent hours of my time on the phone with Digital River customer support (and many email threads).\u003c/p\u003e\n\u003ch4\u003eFeb 10th, 2014\u003c/h4\u003e\n\u003cp\u003eI pre-ordered Final Fantasy 13-3 Lightning Returns from the Square Enix online store, which is powered by Digital River. I had already heard of how bad Digital River can be due to their complete screw-up of the Ni No Kuni Collectors Edition. However, since that had happened about 1 year prior, I thought that they may have already fixed their problems.\u003c/p\u003e","title":"Horrible Experience with Square Enix and Digital River – Review"},{"content":"Seems like jQuery UI got rid of maintaining state with the latest implementation.\nBefore, it pretty simple to keep state across page loads with jQuery tabs. This is one possible way to do it with the new code.\u0026nbsp; Its still pretty easy, just a little different.\n$(\"#tabs\").tabs({ activate: function (e, ui) { $.cookie('selected-tab', ui.newTab.index(), { path: '/' }); }, active: $.cookie('selected-tab') }); ","permalink":"https://www.bloodforge.com/2013/01/jquery-1-9-and-ui-1-10-tabs-with-cookies/","summary":"\u003cp\u003eSeems like jQuery UI got rid of maintaining state with the latest implementation.\u003c/p\u003e\n\u003cp\u003eBefore, it pretty simple to keep state across page loads with jQuery tabs. This is one possible way to do it with the new code.\u0026nbsp; Its still pretty easy, just a little different.\u003c/p\u003e\n\u003cpre class=\"wp-block-code\"\u003e\u003ccode\u003e$(\"#tabs\").tabs({ \n    activate: function (e, ui) { \n        $.cookie('selected-tab', ui.newTab.index(), { path: '/' }); \n    }, \n    active: $.cookie('selected-tab')             \n});\u003c/code\u003e\u003c/pre\u003e","title":"jQuery 1.9 and UI 1.10 tabs with cookies"},{"content":"Requires 20GB of free space to upgradeIf CScript was registered as the default script host in Windows 7, it will be replaced by WScript. To fix this, run CMD with administrative privileges, and execute the following command: cscript //h:cscript //sNetwork printer settings were lost. Had to reattach printer.IIS7 settings were lost. Virtual directories/applications were gone. Also, installed features were missing. I had to reinstall the server side includes feature using control panel, and I needed to redo the handler mappings in IIS so that they were processed by the module. ","permalink":"https://www.bloodforge.com/2012/10/windows-7-to-windows-8-upgrade-issues/","summary":"\u003cul\u003e\u003cli\u003eRequires 20GB of free space to upgrade\u003c/li\u003e\u003cli\u003eIf CScript was registered as the default script host in Windows 7, it will be replaced by WScript. To fix this, run CMD with administrative privileges, and execute the following command: \u003cbr\u003e\u003cstrong\u003e\u003ccode\u003ecscript //h:cscript //s\u003c/code\u003e\u003c/strong\u003e\u003c/li\u003e\u003cli\u003eNetwork printer settings were lost. Had to reattach printer.\u003c/li\u003e\u003cli\u003eIIS7 settings were lost. Virtual directories/applications were gone. Also, installed features were missing. I had to reinstall the server side includes feature using control panel, and I needed to redo the handler mappings in IIS so that they were processed by the module.\u003c/li\u003e\u003c/ul\u003e","title":"Windows 7 to Windows 8 Upgrade issues"},{"content":"For a while now, I had an issue with the ATEN KVM switch (dual-DVI) when switching between my Windows and Mac systems. One of the monitors would almost always not be detected after switching. Sometimes this also happened after restarting my computer. The solution would be to turn off the PC and restart, and I would keep my fingers crossed that the second monitor would now be detected.\nWhat I should have done is checked the ATEN website. They have a firmware upgrade for my particular switch. The only problem I had with the upgrade was finding a system with a serial port (I still don’t understand why ATEN would build a dual DVI KVM swicth with an upgrade cable that only connects to a serial port). After finding a Thinkpad notebook with a P3 inside and Windows 98 (it stil worked!), I did the upgrade.\u0026nbsp; Since the upgrade, I have not had the issue come up again.\n","permalink":"https://www.bloodforge.com/2012/08/aten-kvm-switch-cubiq-cs1642-monitor-switching-problem/","summary":"\u003cp\u003eFor a while now, I had an issue with the ATEN KVM switch (dual-DVI) when switching between my Windows and Mac systems. One of the monitors would almost always not be detected after switching. Sometimes this also happened after restarting my computer. The solution would be to turn off the PC and restart, and I would keep my fingers crossed that the second monitor would now be detected.\u003c/p\u003e\n\u003cp\u003eWhat I should have done is checked the ATEN website. They have a firmware upgrade for my particular switch. The only problem I had with the upgrade was finding a system with a serial port (I still don’t understand why ATEN would build a dual DVI KVM swicth with an upgrade cable that only connects to a serial port). After finding a Thinkpad notebook with a P3 inside and Windows 98 (it stil worked!), I did the upgrade.\u0026nbsp; Since the upgrade, I have not had the issue come up again.\u003c/p\u003e","title":"ATEN KVM Switch CubiQ CS1642 Monitor Switching Problem"},{"content":"I received the following error when trying to publish to Android and iOS from Flash CS6 (Air 3.2):\nApplication Descriptor File Cannot be Parsed\nSearching for a fix yielded that my file is probably invalid, but this is not the case as I can run this project just file from another computer.\nTurns out that this problem came up because I was running my FLA out of a network location (i.e,\u0026nbsp;\\\\Server\\path\\). Mapping the network drive to an actual drive letter fixed the problem.\n","permalink":"https://www.bloodforge.com/2012/08/my-fix-for-application-descriptor-file-cannot-be-parsed-in-cs6/","summary":"\u003cp\u003eI received the following error when trying to publish to Android and iOS from Flash CS6 (Air 3.2):\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eApplication Descriptor File Cannot be Parsed\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eSearching for a fix yielded that my file is probably invalid, but this is not the case as I can run this project just file from another computer.\u003c/p\u003e\n\u003cp\u003eTurns out that this problem came up because I was running my FLA out of a network location (i.e,\u0026nbsp;\u003cem\u003e\\\\Server\\path\\\u003c/em\u003e). Mapping the network drive to an actual drive letter fixed the problem.\u003c/p\u003e","title":"My fix for: Application Descriptor File Cannot be Parsed in CS6"},{"content":"I just got a Nexus 7 and it pretty much is inferior to an iPad in every sense expect for when watching TV. It would actually make a pretty good remote, assuming there was some decent software to use (I’m currently using TouchSquid, which is pretty crappy, imo).\nThis got me thinking… supposedly Apple is making a bunch of displays that are about 7”. All the rumors seem to point to a iPad-mini or iPod Touch-maxi, but it would be pretty neat if it was actually a iMote or IRemote or iControl. Supposedly Steve Jobs said he figured out a way to control TV…\nThere is some software now that runs on iOS and Andriod which functions as a universal remote, but it suffers from the same problems as regular remotes.\u0026nbsp; I don’t get why, when making an app for a touch-based device, a developer would try to mimic a remote control. There is no real reason for all of the buttons to be “tap” based. You should be able to navigate the television using gestures on the screen, no by typing into a virtual number pad.\u0026nbsp; You could even accept input by drawing the number on the touchpad of the desired channel (or the letters of the channel if the remote is smart enough).\nThe app-based remotes also should have a social aspect which attempts to have people interact with the content that is being displayed on both the television and the remote. Keeping people engaged, especially during advertisements, would provide a huge revenue stream for anyone who owned these remotes, as the ads on the remote (which would probably be interactive) would be much more efficient than static ads that run on the television (they could even be targeted). In addition to interacting with the content providers, people could interact with the owners of other remotes by surveys, polls, and other methods.\nCombined with Siri, a “social” gesture based remote should revolutionize the market.\u0026nbsp; It could not only help people manage the content that’s on the TV, but also become the content and make, for the first time, interactive TV.\n","permalink":"https://www.bloodforge.com/2012/07/remotes-suck-apple-to-the-rescue/","summary":"\u003cp\u003eI just got a Nexus 7 and it pretty much is inferior to an iPad in every sense expect for when watching TV. It would actually make a pretty good remote, assuming there was some decent software to use (I’m currently using TouchSquid, which is pretty crappy, imo).\u003c/p\u003e\n\u003cp\u003eThis got me thinking… supposedly Apple is making a bunch of displays that are about 7”. All the rumors seem to point to a iPad-mini or iPod Touch-maxi, but it would be pretty neat if it was actually a iMote or IRemote or iControl. Supposedly Steve Jobs said he figured out a way to control TV…\u003c/p\u003e","title":"Remotes suck–Apple to the rescue?"},{"content":"This is a note to self:\nFlash generates TCMText when a TLFTextField does not have an instance name.\nFlash Source:\u0026nbsp;http://opensource.adobe.com/svn/opensource/flex/sdk/trunk/frameworks/﻿\n","permalink":"https://www.bloodforge.com/2012/07/fl-text-tcmtext-and-tlftextfield-why-does-it-appear/","summary":"\u003cp\u003eThis is a note to self:\u003c/p\u003e\n\u003cp\u003eFlash generates TCMText when a TLFTextField does not have an instance name.\u003c/p\u003e\n\u003cp\u003eFlash Source:\u0026nbsp;\u003ca href=\"http://opensource.adobe.com/svn/opensource/flex/sdk/trunk/frameworks/\"\u003ehttp://opensource.adobe.com/svn/opensource/flex/sdk/trunk/frameworks/﻿\u003c/a\u003e\u003c/p\u003e","title":"fl.text.TCMText and TLFTextField: Why does it appear?"},{"content":"We recently got the Adobe Creative Cloud subscription at work, and I wanted to check out their web hosting plan – one of the features is hosting for up to five websites.\nStep 1: Creating a Website I’ve never hosted a website with Adobe (or, more specifically, Business Catalyst), so I wasn’t sure where to start.\u0026nbsp; I looked around the website, and eventually found that there are three ways to create a website:\nMuse:\u0026nbsp;an Adobe program for non-programmers to create websitesDreamweaver: an Adobe program for programmers to create websites (last time I used this was maybe 12 years ago)BusinessCatalyst.com: an online management tool for websites The documentation I read on Adobe.com indicated that even if I go the Muse or Dreamweaver route, I’ll eventually need to use BusinessCatalyst to manage my site for things such as DNS, so I went to BusinessCatalyst.com.\u0026nbsp; Also, I didn’t really feel like installing Muse or Dreamweaver, as I have no intention of using either of those programs (I like to use Visual Studio for those types of tasks).\nWell, turns out that\u0026nbsp;creating my website with BusinessCatalyst.com was a mistake. Creative Cloud subscriptions come with five\u0026nbsp;webBasic\u0026nbsp;websites. These types of websites can be created from Muse (or possibly Dreamweaver).\u0026nbsp; However, creating from BusinessCatalyst.com will create a\u0026nbsp;webCommerce\u0026nbsp;site. I noticed the problem when I tried to promote my site to live. When clicking the “Upgrade” button, it started asking for my credit card info. After a chat with their CSR, my site was “downgraded” to webBasic and I was able to push the site to live.\nStep 2: DNS – Creating a Subdomain I did not want to move my website to Business Catalyst. What I wanted was a place to store files on the Adobe Cloud, while keeping my website where it was.\u0026nbsp; To do that, I wanted a subdomain, images.bloodforge.com, to be hosted on Adobe’s cloud. Everything else with bloodforge.com would remain where it was.\nThe first step is to go to the administration section of the website created in Step 1 above, clicking on Manage Site-\u0026gt; Site Settings –\u0026gt; Site Domains. Click on “New Domain” button on the top of the page, and configure the domain. In the “Domain” field, enter the full domain name of your site. So, in my example, I entered “images.bloodforge.com”, without the quotes. Select “Use an external DNS server” radio button option, and copy the IP address listed. You will need this in the next step.\u0026nbsp; Click on the “Save” button.\nNow that you have the IP address of your site, log into the DNS manager of your current website (which in my case was Arvixe, but it could just as well have been GoDaddy or something similar.\u0026nbsp; You will need to create an “A” record for your domain, and point it to the IP address you just copied from BusinessCatalyst when creating your domain. So, in my example, I created an “A” record for \u0026#8220;bloodforge.com” with a name of “images”, and pointed it to the correct IP address.\nAt this point, you should be able to go to the domain you just created. Type the full domain (in my case, images.bloodforge.com) into your browser and you should now be at the BusinessCatalyst website.\nStep 3: FTP files to your Adobe/Business Catalyst website You’ll need to obtain the FTP settings for your website from BusinessCatalyst. Log into the admin section of the website created in Step 1, and go to “ManageSite” –\u0026gt; “Site Manager” –\u0026gt; “File Manager”, and click on the “Upload Files” button at the top of the page. There should be a Tip on this page, and if you click on the “See Details” button, it will show you the details for your FTP login info. In my case, it was:\nhost: images.bloodforge.comusername: images.bloodforge.com/{Business Catalyst username}password: {Business Catalyst password} I use FileZilla to FTP, and I entered in the information above. I was rather disappointed that BusinessCatalyst used standard FTP with plain text encryption. Doesn’t seem very secure, but it is what it is.\nI was able to upload “.aspx” pages to the site, however, it did not execute. Seems like the handler for the file types is disabled. However, other files, such as images, serve up just fine. One thing to keep in mind is that if you upload HTML files, they will not be exactly the same when you access them with a browser. BusinessCatalyst adds some of their own stuff into your files.\n","permalink":"https://www.bloodforge.com/2012/06/adobe-creative-cloud-subscription-for-business-catalyst-website/","summary":"\u003cp\u003eWe recently got the Adobe Creative Cloud subscription at work, and I wanted to check out their web hosting plan – one of the features is hosting for up to five websites.\u003c/p\u003e\n\u003ch4\u003eStep 1: Creating a Website\u003c/h4\u003e\n\u003cp\u003eI’ve never hosted a website with Adobe (or, more specifically, Business Catalyst), so I wasn’t sure where to start.\u0026nbsp; I looked around the website, and eventually found that there are three ways to create a website:\u003c/p\u003e","title":"Adobe Creative Cloud Subscription for Business Catalyst Website"},{"content":"The Samsung Focus appears to have a bug where if the battery is completely dead (as in, once its dead for a day, leave it in there for another week until it is completely discharged), the phone cannot charge the battery.\nI have been able to charge the battery by taking it out of the Focus and putting it in other Galaxy-class phones, which do not have this bug. Once the battery was charged up a bit, I was then able to power up the Focus and finish charging the battery.\nI’ve seen some posts where people would take out the battery for 30 seconds and then put it back in and the phone would charge, but it did not appear that taking out the battery out of my phone would fix the issue. I’ve taken it out for minutes at a time, and the battery would not charge.\n","permalink":"https://www.bloodforge.com/2012/05/samsung-focus-phone-battery-charging-bug-wp7/","summary":"\u003cp\u003eThe Samsung Focus appears to have a bug where if the battery is completely dead (as in, once its dead for a day, leave it in there for another week until it is completely discharged), the phone cannot charge the battery.\u003c/p\u003e\n\u003cp\u003eI have been able to charge the battery by taking it out of the Focus and putting it in other Galaxy-class phones, which do not have this bug. Once the battery was charged up a bit, I was then able to power up the Focus and finish charging the battery.\u003c/p\u003e","title":"Samsung Focus Phone Battery Charging Bug (WP7)"},{"content":"For the past few days, I haven\u0026#8217;t been able to use the voice to text feature when searching on my Samsung Focus. \u0026nbsp;It seems like Microsoft knows about the issue, but I hope this gets resolved soon. \u0026nbsp;\nThere is a thread about it already on\u0026nbsp;Microsoft Answers.\n","permalink":"https://www.bloodforge.com/2012/03/wp7-voice-to-text-seems-to-be-down/","summary":"\u003cp\u003eFor the past few days, I haven\u0026#8217;t been able to use the voice to text feature when searching on my Samsung Focus. \u0026nbsp;It seems like Microsoft knows about the issue, but I hope this gets resolved soon. \u0026nbsp;\u003c/p\u003e\n\u003cp\u003eThere is a thread about it already on\u0026nbsp;\u003ca href=\"http://answers.microsoft.com/en-us/winphone/forum/wp7-wpfeatures/voice-to-text-not-working/de8dc044-1ec6-4900-8832-7cb195dd722c?page=1\" target=\"_blank\" rel=\"noreferrer noopener\"\u003eMicrosoft Answers\u003c/a\u003e.\u003c/p\u003e","title":"WP7 voice to text seems to be down"},{"content":"I was getting a\u0026nbsp;72/100\u0026nbsp;score from Google Page Speed, so I attempted to improve that a bit.\nI added caching to static resources via the web config, which raised my score by about 10:\n\u0026lt;staticContent\u003e \u0026lt;clientCache cacheControlMode=\"UseMaxAge\" cacheControlMaxAge=\"365.00:00:00\" /\u003e \u0026lt;remove fileExtension=\".mp4\" /\u003e \u0026lt;remove fileExtension=\".gif\" /\u003e \u0026lt;remove fileExtension=\".htm\" /\u003e \u0026lt;remove fileExtension=\".html\" /\u003e \u0026lt;remove fileExtension=\".jpeg\" /\u003e \u0026lt;remove fileExtension=\".jpg\" /\u003e \u0026lt;remove fileExtension=\".js\" /\u003e \u0026lt;remove fileExtension=\".png\" /\u003e \u0026lt;remove fileExtension=\".txt\" /\u003e \u0026lt;mimeMap fileExtension=\".mp4\" mimeType=\"video/mp4\" /\u003e \u0026lt;mimeMap fileExtension=\".gif\" mimeType=\"image/gif\" /\u003e \u0026lt;mimeMap fileExtension=\".htm\" mimeType=\"text/html\" /\u003e \u0026lt;mimeMap fileExtension=\".html\" mimeType=\"text/html\" /\u003e \u0026lt;mimeMap fileExtension=\".jpeg\" mimeType=\"image/jpeg\" /\u003e \u0026lt;mimeMap fileExtension=\".jpg\" mimeType=\"image/jpeg\" /\u003e \u0026lt;mimeMap fileExtension=\".js\" mimeType=\"application/x-javascript\" /\u003e \u0026lt;mimeMap fileExtension=\".png\" mimeType=\"image/png\" /\u003e \u0026lt;mimeMap fileExtension=\".txt\" mimeType=\"text/plain\" /\u003e \u0026lt;/staticContent\u003e New page score:\u0026nbsp;82/100\nI then made sure that all of my custom javascript files went through the javascript handler in BlogEngine, which raised my score to by 3:\n\u0026lt;script language=\"javascript\" type=\"text/javascript\" src=\"/js.axd?path=%2fmyuploads%2fbf_script.js\u0026amp;minify=\"\u003e\u0026lt;/script\u003e New page score:\u0026nbsp;85/100\nI then uninstalled the syntax highlighter extension from BE. This upped my page rank by another 3.\nNew page score:\u0026nbsp;88/100\nThere\u0026#8217;s still some room for improvement, though\u0026#8230; I want to get as close as possible to 100 🙂\n","permalink":"https://www.bloodforge.com/2012/02/improving-google-page-speed-score-for-blogengine/","summary":"\u003cp\u003eI was getting a\u0026nbsp;72/100\u0026nbsp;score from Google Page Speed, so I attempted to improve that a bit.\u003c/p\u003e\n\u003cp\u003eI added caching to static resources via the web config, which raised my score by about 10:\u003c/p\u003e\n\u003cpre class=\"wp-block-code\"\u003e\u003ccode\u003e\u0026lt;staticContent\u003e\n  \u0026lt;clientCache cacheControlMode=\"UseMaxAge\" cacheControlMaxAge=\"365.00:00:00\" /\u003e\n  \u0026lt;remove fileExtension=\".mp4\" /\u003e\n  \u0026lt;remove fileExtension=\".gif\" /\u003e\n  \u0026lt;remove fileExtension=\".htm\" /\u003e\n  \u0026lt;remove fileExtension=\".html\" /\u003e\n  \u0026lt;remove fileExtension=\".jpeg\" /\u003e\n  \u0026lt;remove fileExtension=\".jpg\" /\u003e\n  \u0026lt;remove fileExtension=\".js\" /\u003e\n  \u0026lt;remove fileExtension=\".png\" /\u003e\n  \u0026lt;remove fileExtension=\".txt\" /\u003e\n  \u0026lt;mimeMap fileExtension=\".mp4\" mimeType=\"video/mp4\" /\u003e\n  \u0026lt;mimeMap fileExtension=\".gif\" mimeType=\"image/gif\" /\u003e\n  \u0026lt;mimeMap fileExtension=\".htm\" mimeType=\"text/html\" /\u003e\n  \u0026lt;mimeMap fileExtension=\".html\" mimeType=\"text/html\" /\u003e\n  \u0026lt;mimeMap fileExtension=\".jpeg\" mimeType=\"image/jpeg\" /\u003e\n  \u0026lt;mimeMap fileExtension=\".jpg\" mimeType=\"image/jpeg\" /\u003e\n  \u0026lt;mimeMap fileExtension=\".js\" mimeType=\"application/x-javascript\" /\u003e\n  \u0026lt;mimeMap fileExtension=\".png\" mimeType=\"image/png\" /\u003e\n  \u0026lt;mimeMap fileExtension=\".txt\" mimeType=\"text/plain\" /\u003e\n\u0026lt;/staticContent\u003e\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eNew page score:\u0026nbsp;82/100\u003c/p\u003e","title":"Improving Google Page Speed Score for BlogEngine"},{"content":"After I switched to Disqus comments, I noticed that my recent comments widget no longer worked.\u0026nbsp;So I wrote a new widget that adds some JavaScript to the web page which includes the recent comments (and a few other options, if desired) when using Disqus.\nThe widget is is available on the\u0026nbsp;blogengine.net gallery website.\nKnown issues\n-The character limit when using the combination look doesn\u0026#8217;t seem to be working.\u0026nbsp;I need to look into this more, but right now it seems Disqus is ignoring the character count.\n","permalink":"https://www.bloodforge.com/2012/02/disqus-recent-comments-top-commenters-and-most-discussed-widget-for-blogengine-net/","summary":"\u003cp\u003eAfter I switched to Disqus comments, I noticed that my recent comments widget no longer worked.\u0026nbsp;So I wrote a new widget that adds some JavaScript to the web page which includes the recent comments (and a few other options, if desired) when using Disqus.\u003c/p\u003e\n\u003cp\u003eThe widget is is available on the\u0026nbsp;\u003ca href=\"http://dnbegallery.org/cms/List/Widgets/DisqusCommentsSummary\" target=\"_blank\" rel=\"noreferrer noopener\"\u003eblogengine.net gallery website\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eKnown issues\u003cbr\u003e-The character limit when using the combination look doesn\u0026#8217;t seem to be working.\u0026nbsp;I need to look into this more, but right now it seems Disqus is ignoring the character count.\u003c/p\u003e","title":"Disqus Recent Comments, Top Commenters, and Most Discussed Widget for BlogEngine.NET"},{"content":"The blog now uses a new comment system \u0026#8211;\u0026nbsp;Disqus.\nI upgraded to BE v2.5, and found various instructions on how to move to Disqus\u0026#8230;\u0026nbsp;including these.\nThere was one problem, however. The instructions state that on post.aspx, JavaScript needs to change to the following:\n\u0026lt;script type=\"text/javascript\"\u003e var disqus_title = '\u0026lt;%=Post.Title %\u003e'; var disqus_identifier = '\u0026lt;%= Post.Id.ToString() %\u003e'; var disqus_url = '\u0026lt;%= Post.AbsoluteLink %\u003e'; var disqus_developer = '\u0026lt;%= BlogEngine.Core.BlogSettings.Instance.DisqusDevMode ? 1 : 0 %\u003e'; (function () { var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true; dsq.src = 'http://\u0026lt;%=BlogEngine.Core.BlogSettings.Instance.DisqusWebsiteName %\u003e.disqus.com/embed.js'; (document.getElementsByTagName('head')\u0026#91;0] || document.getElementsByTagName('body')\u0026#91;0]).appendChild(dsq); })(); \u0026lt;/script\u003e However, that is not accurate and will result in errors. The correct code needs to reference Page, and not Post. \u0026lt;script type=\"text/javascript\"\u003e var disqus_title = '\u0026lt;%=Page.Title %\u003e'; var disqus_identifier = '\u0026lt;%= Page.Id.ToString() %\u003e'; var disqus_url = '\u0026lt;%= Page.AbsoluteLink %\u003e'; var disqus_developer = '\u0026lt;%= BlogEngine.Core.BlogSettings.Instance.DisqusDevMode ? 1 : 0 %\u003e'; (function () { var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true; dsq.src = 'http://\u0026lt;%=BlogEngine.Core.BlogSettings.Instance.DisqusWebsiteName %\u003e.disqus.com/embed.js'; (document.getElementsByTagName('head')\u0026#91;0] || document.getElementsByTagName('body')\u0026#91;0]).appendChild(dsq); })(); \u0026lt;/script\u003e If the above is not changed, the blog will throw the following error: page.aspx(14): error CS0120: An object reference is required for the non-static field, method, or property 'BlogEngine.Core.Post.Title.get' One more change needs to be done if the above takes place. In archive.aspx.cs, the following line: comments.InnerHtml = string.Format(\"\u0026lt;span\u003e\u0026lt;a href=\\\"{0}#disqus_thread\\\"\u003e{1}\u0026lt;/a\u003e\u0026lt;/span\u003e\", post.PermaLink, Resources.labels.comments); needs to change to: comments.InnerHtml = string.Format(\"\u0026lt;span\u003e\u0026lt;a href=\\\"{0}#disqus_thread\\\"\u003e{1}\u0026lt;/a\u003e\u0026lt;/span\u003e\", post.AbsoluteLink, Resources.labels.comments); The change above will allow the Archive to correctly display the number of comments and reactions to each post. ","permalink":"https://www.bloodforge.com/2012/02/new-comment-system/","summary":"\u003cp\u003eThe blog now uses a new comment system \u0026#8211;\u0026nbsp;\u003ca href=\"http://www.disqus.com/\" target=\"_blank\" rel=\"noreferrer noopener\"\u003eDisqus\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eI upgraded to BE v2.5, and found various instructions on how to move to Disqus\u0026#8230;\u0026nbsp;\u003ca href=\"http://surinder.computing-studio.com/post/2011/07/27/BlogEngine-Disqus-Comment-Count-Fix.aspx\" target=\"_blank\" rel=\"noreferrer noopener\"\u003eincluding these\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThere was one problem, however. The instructions state that on post.aspx, JavaScript needs to change to the following:\u003c/p\u003e\n\u003cpre class=\"wp-block-code\"\u003e\u003ccode\u003e\u0026lt;script type=\"text/javascript\"\u003e\n    var disqus_title = '\u0026lt;%=Post.Title %\u003e';\n    var disqus_identifier = '\u0026lt;%= Post.Id.ToString() %\u003e';\n    var disqus_url = '\u0026lt;%= Post.AbsoluteLink %\u003e';\n    var disqus_developer = '\u0026lt;%= BlogEngine.Core.BlogSettings.Instance.DisqusDevMode ? 1 : 0 %\u003e';\n    (function () {\n        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;\n        dsq.src = 'http://\u0026lt;%=BlogEngine.Core.BlogSettings.Instance.DisqusWebsiteName %\u003e.disqus.com/embed.js';\n        (document.getElementsByTagName('head')\u0026#91;0] || document.getElementsByTagName('body')\u0026#91;0]).appendChild(dsq);\n    })();\n\u0026lt;/script\u003e\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e However, that is not accurate and will result in errors.  The correct code needs to reference Page, and not Post. \u003c/p\u003e","title":"New Comment System"},{"content":"I needed to change the background color of the text region of a flash combobox \u0026#8211; using AS3 at runtime.\nStyles for some reason were not working.\u0026nbsp; The solution was to directly address the textfield property and change its background color.\u0026nbsp; Here\u0026#8217;s an example:\ncbo.textField.textField.background = true; cbo.textField.textField.backgroundColor = 0xDEDE29; ","permalink":"https://www.bloodforge.com/2011/11/change-combobox-background-color-in-as3/","summary":"\u003cp\u003eI needed to change the background color of the text region of a flash combobox \u0026#8211; using AS3 at runtime.\u003c/p\u003e\n\u003cp\u003eStyles for some reason were not working.\u0026nbsp; The solution was to directly address the textfield property and change its background color.\u0026nbsp; Here\u0026#8217;s an example:\u003c/p\u003e\n\u003cpre class=\"wp-block-code\"\u003e\u003ccode\u003ecbo.textField.textField.background = true;\ncbo.textField.textField.backgroundColor = 0xDEDE29;\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003c/p\u003e","title":"Change combobox background color in AS3"},{"content":"Just created my new sig using Google\u0026#8217;s QR code API (\u0026nbsp;http://createqrcode.appspot.com/\u0026nbsp;). \u0026nbsp;It creates the codes with error correction (there are some settings that you can use to modify this), so its possible to actually delete a part of it and enter your own image/text in the middle of the QR code.\nI had to play around a little with my name in the middle. \u0026nbsp;If it is not aligned properly on the QR code or if it covers the wrong area, the code won\u0026#8217;t be recognized.\n","permalink":"https://www.bloodforge.com/2011/11/using-qr-codes-as-signatures-and-avatars/","summary":"\u003cp\u003eJust created my new sig using Google\u0026#8217;s QR code API (\u0026nbsp;\u003ca href=\"http://createqrcode.appspot.com/\"\u003ehttp://createqrcode.appspot.com/\u003c/a\u003e\u0026nbsp;). \u0026nbsp;It creates the codes with error correction (there are some settings that you can use to modify this), so its possible to actually delete a part of it and enter your own image/text in the middle of the QR code.\u003c/p\u003e\n\u003cp\u003eI had to play around a little with my name in the middle. \u0026nbsp;If it is not aligned properly on the QR code or if it covers the wrong area, the code won\u0026#8217;t be recognized.\u003c/p\u003e","title":"Using QR codes as signatures and avatars"},{"content":"Just ran into a strange issue after upgrading my home network. I got a switch that all devices in my home network are connected to (dumb switch \u0026#8211; it al hooks up to a Cisco E2000 for ips). \u0026nbsp;Anyways\u0026#8230; after switching everything over to this new setup, I ran into two issues.\nFirst, my gigabit network was no longer gigabit, even though all lights on the switch indicated that it was gigabit. \u0026nbsp;Network properties in connected computers also indicated gigabit speeds, \u0026nbsp;but actual file transfers were at fast ethernet speeds.\nSecond, I could no longer connect to my WHS via windows explorer from my Win 7 Pro machine, when typing in the computer name (eg: \\\\server). \u0026nbsp;It was like the computer didn\u0026#8217;t exist on the network. \u0026nbsp;However, the server would respond to pings. \u0026nbsp;I could do a nslookup, and everything worked correctly. \u0026nbsp;Also, I could type in my server ip in windows explorer, and it worked (eg: \\\\192.168.1.100).\nI then ran into this forum:\u0026nbsp;http://www.geekzone.co.nz/forums.asp?forumid=74\u0026amp;topicid=38789\nThe suggestion is to run the following command in the command prompt: netsh int ip reset c:\\resetlog.txt\nRunning the command on my Win 7 Pro box fixed the issue (after a restart). I could now transfer at gigabit speeds, and the name resolved properly in windows explorer.\nI guess something was wrong with my TCP/IP stack, and this fixed the issue. \u0026nbsp;I still have no clue how it got messed up in the first place, and exactly what was wrong.\n","permalink":"https://www.bloodforge.com/2011/10/network-issue-could-not-connect-to-whs-via-name-only-ip/","summary":"\u003cp\u003eJust ran into a strange issue after upgrading my home network. I got a switch that all devices in my home network are connected to (dumb switch \u0026#8211; it al hooks up to a Cisco E2000 for ips). \u0026nbsp;Anyways\u0026#8230; after switching everything over to this new setup, I ran into two issues.\u003c/p\u003e\n\u003cp\u003eFirst, my gigabit network was no longer gigabit, even though all lights on the switch indicated that it was gigabit. \u0026nbsp;Network properties in connected computers also indicated gigabit speeds, \u0026nbsp;but actual file transfers were at fast ethernet speeds.\u003c/p\u003e","title":"Network Issue – Could not connect to WHS via name, only IP"},{"content":"The first thing you\u0026#8217;ll need to create a custom ringtone in WP7 is an MP3 file. \u0026nbsp;This file must be 40 seconds or shorter (and 1MB or smaller in size). \u0026nbsp;If your MP3 is too large, you can use a program like\u0026nbsp;Audacity\u0026nbsp;to crop it.\nAfter you have your MP3 file the correct size, you\u0026#8217;ll need to open Zune and make sure that the MP3 is listed in your music collection. Find it in the collection, right click on the MP3, and click on \u0026#8220;Edit\u0026#8221;. \u0026nbsp;This should bring up a window with the MP3 properties. \u0026nbsp;The only real important thing here is that the genre of the song must be changed to\u0026nbsp;Ringtone. \u0026nbsp;See the image below.\u0026nbsp;\nAfter updating the genre to Ringtone, click the OK button, and then sync the MP3 to your phone.\nFinally, on the phone, go to Settings -\u0026gt; ringtones+sounds, and click on the Ringtone selector. \u0026nbsp;The ringtone you created should now be at the top of this list in the \u0026#8220;Custom\u0026#8221; section.\n","permalink":"https://www.bloodforge.com/2011/09/create-custom-ringtones-in-windows-phone-7/","summary":"\u003cp\u003eThe first thing you\u0026#8217;ll need to create a custom ringtone in WP7 is an MP3 file. \u0026nbsp;This file must be 40 seconds or shorter (and 1MB or smaller in size). \u0026nbsp;If your MP3 is too large, you can use a program like\u0026nbsp;\u003ca href=\"http://audacity.sourceforge.net/\"\u003eAudacity\u003c/a\u003e\u0026nbsp;to crop it.\u003c/p\u003e\n\u003cp\u003eAfter you have your MP3 file the correct size, you\u0026#8217;ll need to open Zune and make sure that the MP3 is listed in your music collection. Find it in the collection, right click on the MP3, and click on \u0026#8220;Edit\u0026#8221;. \u0026nbsp;This should bring up a window with the MP3 properties. \u0026nbsp;The only real important thing here is that the genre of the song must be changed to\u0026nbsp;\u003cstrong\u003eRingtone\u003c/strong\u003e. \u0026nbsp;See the image below.\u0026nbsp;\u003c/p\u003e","title":"Create Custom Ringtones in Windows Phone 7"},{"content":"Microsoft has setup a website where users can submit and vote on features they\u0026#8217;d like to see in Windows Phone 7.\nI\u0026#8217;ve submitted a couple features I\u0026#8217;d like to see:\nTreat the phone as a USB drive when plugged in to devices which do not have Zune installed.Integrate with Ford SYNC\u0026#8230;. I think its crazy that iPhones work with SYNC but WP7 devices do not. You can vote on them here:\u0026nbsp;http://windowsphone.uservoice.com/users/24151465-filip-stanek﻿\n","permalink":"https://www.bloodforge.com/2011/09/submit-and-vote-on-features-for-windows-phone-7/","summary":"\u003cp\u003eMicrosoft has setup a website where users can submit and vote on features they\u0026#8217;d like to see in Windows Phone 7.\u003c/p\u003e\n\u003cp\u003eI\u0026#8217;ve submitted a couple features I\u0026#8217;d like to see:\u003c/p\u003e\n\u003col\u003e\u003cli\u003eTreat the phone as a USB drive when plugged in to devices which do not have Zune installed.\u003c/li\u003e\u003cli\u003eIntegrate with Ford SYNC\u0026#8230;. I think its crazy that iPhones work with SYNC but WP7 devices do not.\u003c/li\u003e\u003c/ol\u003e\n\u003cp\u003eYou can vote on them here:\u0026nbsp;\u003ca href=\"http://windowsphone.uservoice.com/users/24151465-filip-stanek\"\u003ehttp://windowsphone.uservoice.com/users/24151465-filip-stanek﻿\u003c/a\u003e\u003c/p\u003e","title":"Submit and Vote on features for Windows Phone 7"},{"content":"I tried to customize the combobox ( AS3 ), and everything was working fine by using cbo.setStyle( \u0026#8220;embedFonts\u0026#8221; ) and cbo.setStyle( \u0026#8220;textFormat\u0026#8221; ) while testing the movie. \u0026nbsp;However, when I published the SWF, the styles were no longer working.\nIt seems like setStyle doesn\u0026#8217;t really work properly for comboboxes for some reason. \u0026nbsp;The solution was to apply the setStyle to the textField inside the combobox, and not to the combobox itself.\nFor example, this doesn\u0026#8217;t work:\u0026nbsp;\ncbo.setStyle( \"embedFonts\", true ); cbo.setStyle( \"textFormat\", tf ); but this works: cbo.textField.setStyle( \"embedFonts\", true ); cbo.textField.setStyle( \"textFormat\", tf ); ","permalink":"https://www.bloodforge.com/2011/08/flash-combobox-setstyle-works-in-test-debug-and-not-in-publish-swf/","summary":"\u003cp\u003eI tried to customize the combobox ( AS3 ), and everything was working fine by using cbo.setStyle( \u0026#8220;embedFonts\u0026#8221; ) and cbo.setStyle( \u0026#8220;textFormat\u0026#8221; ) while testing the movie. \u0026nbsp;However, when I published the SWF, the styles were no longer working.\u003c/p\u003e\n\u003cp\u003eIt seems like setStyle doesn\u0026#8217;t really work properly for comboboxes for some reason. \u0026nbsp;The solution was to apply the setStyle to the textField inside the combobox, and not to the combobox itself.\u003c/p\u003e","title":"Flash Combobox setStyle works in Test (debug) and not in Publish (swf)"},{"content":"There\u0026#8217;s some pretty cool new software for fantasy football this year.\u0026nbsp; It is designed for fantasy football draft parties (for up to 20 teams) to select their players via either a snake draft, or an auction draft.\nThe draft software is called Prime Time Draft, and it was developed by folks at where I work. It is designed for Windows, and it really shines when you hook it up to a big TV.\u0026nbsp;\nYou can find it by clicking the link below:\nFantasy Football Draft Software for 2011﻿\n","permalink":"https://www.bloodforge.com/2011/08/new-option-for-fantasy-football-draft-software/","summary":"\u003cp\u003eThere\u0026#8217;s some pretty cool new software for fantasy football this year.\u0026nbsp; It is designed for fantasy football draft parties (for up to 20 teams) to select their players via either a snake draft, or an auction draft.\u003c/p\u003e\n\u003cp\u003eThe draft software is called Prime Time Draft, and it was developed by folks at where I work. It is designed for Windows, and it really shines when you hook it up to a big TV.\u0026nbsp;\u003c/p\u003e","title":"New option for fantasy football draft software"},{"content":"I wanted to start using SQL Server. I was using\u0026nbsp;DiscoutASP.NET, and was paying $10/mo. If I wanted to add on SQL Server, it would have cost an additional $10 per month, brining the total to $240 per year, which was a bit more than I wanted to pay for hosting on a personal blog.\nI searched around and found a host named\u0026nbsp;Arvixe. \u0026nbsp;The price was absolutely excellent. \u0026nbsp;The basic hosting package costs $5/mo, and it comes with 6 websites and 6 SQL Server databases. They also claim unlimited bandwidth and storage, although I\u0026#8217;m not sure what it means. \u0026nbsp;I am pretty sure that its not really unlimited, although I doubt they\u0026#8217;ll complain about my little blog. \u0026nbsp;The final price for Arvixe (I also got a static IP) was $96 for 2 years (that\u0026#8217;s with a 20% off coupon, which can be found pretty easily using Google), with an additional $48 for a static IP for 2 years. Not bad, and way cheaper than what I was paying before.\nAlso, my pages seem to be loading very fast, so right now, I have 0 complaints. The control panel and webmail at Arvixe are way better than DiscountASP.NET, so that is also a nice bonus.\n","permalink":"https://www.bloodforge.com/2010/11/switched-hosting-providers-from-discountasp-net-to-arvixe/","summary":"\u003cp\u003eI wanted to start using SQL Server. I was using\u0026nbsp;\u003ca href=\"http://www.discountasp.net/\"\u003eDiscoutASP.NET\u003c/a\u003e, and was paying $10/mo. If I wanted to add on SQL Server, it would have cost an additional $10 per month, brining the total to $240 per year, which was a bit more than I wanted to pay for hosting on a personal blog.\u003c/p\u003e\n\u003cp\u003eI searched around and found a host named\u0026nbsp;\u003ca href=\"http://www.arvixe.com/\" target=\"_blank\" rel=\"noreferrer noopener\"\u003eArvixe\u003c/a\u003e. \u0026nbsp;The price was absolutely excellent. \u0026nbsp;The basic hosting package costs $5/mo, and it comes with 6 websites and 6 SQL Server databases. They also claim unlimited bandwidth and storage, although I\u0026#8217;m not sure what it means. \u0026nbsp;I am pretty sure that its not really unlimited, although I doubt they\u0026#8217;ll complain about my little blog. \u0026nbsp;The final price for Arvixe (I also got a static IP) was $96 for 2 years (that\u0026#8217;s with a 20% off coupon, which can be found pretty easily using Google), with an additional $48 for a static IP for 2 years. Not bad, and way cheaper than what I was paying before.\u003c/p\u003e","title":"Switched hosting providers from DiscountASP.net to Arvixe"},{"content":"It seems like FusionCharts does not support changing the color of a trendline via the TRENDVALUES style application.\u0026nbsp; The color always seems to default to the color of the trendline.\nThe fix to this issue involves modifying the source of the XYPlotChart.as file (you’ll need the source for fusioncharts to be able to do this).\nSearch the file for the following line (it should be line 1789):\ntrendFontObj.color = this.trendLines \u0026#91;i].color; Right afer this line, paste the following code: if ( this.styleM.getTextStyle (this.objects.TRENDVALUES).color != undefined ) { trendFontObj.color = this.styleM.getTextStyle (this.objects.TRENDVALUES).color; } There may be a more “elegant” way of doing this, but the code above will enable you to change the color of trend value lines by using styles in fusioncharts. ","permalink":"https://www.bloodforge.com/2010/10/change-the-color-of-the-trendline-value-in-fusioncharts-v3-for-flash/","summary":"\u003cp\u003eIt seems like FusionCharts does not support changing the color of a trendline via the TRENDVALUES style application.\u0026nbsp; The color always seems to default to the color of the trendline.\u003c/p\u003e\n\u003cp\u003eThe fix to this issue involves modifying the source of the XYPlotChart.as file (you’ll need the source for fusioncharts to be able to do this).\u003c/p\u003e\n\u003cp\u003eSearch the file for the following line (it should be line 1789):\u003c/p\u003e\n\u003cpre class=\"wp-block-code\"\u003e\u003ccode\u003etrendFontObj.color = this.trendLines \u0026#91;i].color;\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e Right afer this line, paste the following code: \u003c/p\u003e","title":"Change the color of the trendline value in FusionCharts v3 for Flash"},{"content":"Finally got Rank 1 in a diamond league (random 2v2)\u0026nbsp;in Starcraft II.\nI realize rankings don’t mean much, but its still cool to get there.\n","permalink":"https://www.bloodforge.com/2010/09/finallly/","summary":"\u003cp\u003eFinally got Rank 1 in a diamond league (random 2v2)\u0026nbsp;in Starcraft II.\u003c/p\u003e\n\u003cp\u003eI realize rankings don’t mean much, but its still cool to get there.\u003c/p\u003e\n\u003cdiv class=\"wp-block-image\"\u003e\u003cfigure class=\"aligncenter size-large\"\u003e\u003cimg loading=\"lazy\" width=\"425\" height=\"127\" src=\"/wp-content/uploads/2020/02/sc2_badge.png\" alt=\"\" class=\"wp-image-87\" srcset=\"/wp-content/uploads/2020/02/sc2_badge.png 425w, /wp-content/uploads/2020/02/sc2_badge-300x90.png 300w\" sizes=\"(max-width: 425px) 100vw, 425px\" /\u003e\u003c/figure\u003e\u003c/div\u003e\n\u003cp\u003e\u003c/p\u003e","title":"Finallly!"},{"content":"Here’s something I wasted like 45 minutes on, and it should be pretty trivial. I needed to make the TextArea component NOT selectable, yet still enabled (need the scrollbar to work).\nI started digging around the TextArea.as class, because no matter what I did in my code (such as myTextArea.textField.selectable = false; ), the TextArea was still selectable. It appears that when the TextArea calls the draw() or setSize() methods, it updates the text field in the TextArea to be selectable depending on whether the TextArea is enabled or not.\nClearly, whoever designed the TextArea component didn’t give this much thought. In any case, the way I got around the issue is to attach to the Event.Render event of the text area. Therefore, after the render method is called (and the TextArea is drawn), I can update the textfield to not be selectable.\u0026nbsp; Here is some sample code.You may need to attach to more events than just the render event, but the concept should work.\nvar DescriptionField:TextArea = getChildByName( \"description\" ) as TextArea; DescriptionField.addEventListener( Event.RENDER, onDescriptionRender ); public function onDescriptionRender( evt:Event ):void { var textArea:TextArea = evt.target as TextArea; textArea.textField.selectable = false; } ","permalink":"https://www.bloodforge.com/2010/09/how-to-make-the-actionscript-3-0-as3-textarea-not-selectable/","summary":"\u003cp\u003eHere’s something I wasted like 45 minutes on, and it should be pretty trivial. I needed to make the TextArea component NOT selectable, yet still enabled (need the scrollbar to work).\u003c/p\u003e\n\u003cp\u003eI started digging around the TextArea.as class, because no matter what I did in my code (such as myTextArea.textField.selectable = false; ), the TextArea was still selectable. It appears that when the TextArea calls the draw() or setSize() methods, it updates the text field in the TextArea to be selectable depending on whether the TextArea is enabled or not.\u003c/p\u003e","title":"How To Make the ActionScript 3.0 (AS3) TextArea Not Selectable"},{"content":"Logitech has started to send out the replacement remotes (890) as part of their settlement in the class action (Arthur Fulford v. Logitech Inc. Class Action Settlement).\nMine came in the mail yesterday on April 15th.\u0026nbsp; It was a refurbished model, but everything seems good. It has already replaced the H1000 in my living room.\n","permalink":"https://www.bloodforge.com/2010/04/logitech-harmony-1000-class-action-lawsuit-settlement-h1000/","summary":"\u003cp\u003eLogitech has started to send out the replacement remotes (890) as part of their settlement in the class action (Arthur Fulford v. Logitech Inc. Class Action Settlement).\u003c/p\u003e\n\u003cp\u003eMine came in the mail yesterday on April 15th.\u0026nbsp; It was a refurbished model, but everything seems good. It has already replaced the H1000 in my living room.\u003c/p\u003e","title":"Logitech Harmony 1000 Class Action Lawsuit Settlement – H1000"},{"content":"Intel has a new\u0026nbsp;Client IT TCO tool\u0026nbsp;available on their website, and according to the tool, new sizes of Intel drives are coming soon in capacities of 300GB and 600GB.\nI have an 80GB Intel SSD, and having something that’s 300GB in size would be sweet!\n","permalink":"https://www.bloodforge.com/2010/04/intel-300gb-and-600gb-ssd-coming-soon/","summary":"\u003cp\u003eIntel has a new\u0026nbsp;\u003ca href=\"http://www.intel.com/design/flash/NAND/tco_tool/demo.htm\"\u003eClient IT TCO tool\u003c/a\u003e\u0026nbsp;available on their website, and according to the tool, new sizes of Intel drives are coming soon in capacities of 300GB and 600GB.\u003c/p\u003e\n\u003cp\u003eI have an 80GB Intel SSD, and having something that’s 300GB in size would be sweet!\u003c/p\u003e","title":"Intel 300GB and 600GB SSD coming soon?"},{"content":" I downloaded the platform preview version of IE9 today to test out some CSS support. I ran a few tests through it, with the following results. The picture on the left was generated using Firefox 3.6 (keep in mind that I did have to use the “-moz” prefix in front of all but one style to make it work in FF). The IE content is on the right. It certainly is possible that IE requires some vendor-specific suffix like Firefox did. However, I did not use any prefix, so the style may actually be supported in some form.\nIn any case, the only supported feature out of the four I tested was border-radius (and that is actually the one I’m most excited about). The box-shadow would be next on my list. Hopefully that gets put in the next preview.\n","permalink":"https://www.bloodforge.com/2010/03/77/","summary":"\u003cp\u003e I downloaded the platform preview version of IE9 today to test out some CSS support. I ran a few tests through it, with the following results.  The picture on the left was generated using Firefox 3.6 (keep in mind that I did have to use the “-moz” prefix in front of all but one style to make it work in FF). The IE content is on the right. \u003c/p\u003e\n\u003cfigure class=\"wp-block-image size-large\"\u003e\u003cimg loading=\"lazy\" width=\"400\" height=\"220\" src=\"/wp-content/uploads/2020/02/ie9css1.gif\" alt=\"\" class=\"wp-image-78\"/\u003e\u003c/figure\u003e\n\u003cp\u003eIt certainly is possible that IE requires some vendor-specific suffix like Firefox did. However, I did not use any prefix, so the style may actually be supported in some form.\u003c/p\u003e","title":""},{"content":"Ok, I’ll get straight to the point: There is a lot to dislike about many websites right now when it comes to how these websites generate revenue. On many sites it is hard to actually find the content you were seeking due to the huge amount of ads that get displayed. I’ve had my browser crash countless times due to poorly designed ads (generally, it is due to Flash ads, but it certainly can happen with JavaScript as well).\nIs Flash a problem? With the way it is currently being used by advertisers, it would be hard to argue that it isn’t. However, HTML5 isn’t the solution. In fact, I think HTML5 will be a bigger problem than Flash ever was.\nFor a second, lets take a step back and think about the companies pushing for HTML5 adoption. The two that seem to stand out are Google (with YouTube and Chrome) and Apple with Safari and the iPhone. So why exactly are these companies pushing for HTML5? You can think that they just want to help the web move to a better future than the current HTML garbage, but, unfortunately, you can create as much garbage in HTML5 as you could with any previous specification. Also, these are companies that have a duty to their shareholders to maximize profits. Sure, in the short term it may not make much sense to push for HTML5, so the answer has to be something that these companies see down the road.\nWell,\u0026nbsp;the main reason why these companies are investing heavily in HTML5 is advertising.\u0026nbsp;Right now, it is pretty simple to block the most annoying ads online by using many of the browser add-ins designed for that purpose. By the most annoying ads, I mean the ones that automatically play sounds when the ad loads, they flash and jiggle all over the screen, they play some video, and they cover up the content you want to see. These ads are almost exclusively written in Flash. The problem is that advertisers want to use such ads, because they are almost guaranteed to get your attention.\nSo what exactly can an advertiser do to have you watch these ads? Well, in their eyes, Flash is no longer capable of this due to the ad blockers mentioned above. Their solution is HTML5. The concept is pretty simple: if you can’t rely on a plug-in to play your sounds, jiggle the screen, or play video, simply make sure that the page itself is capable of doing so.\u0026nbsp;By integrating the ads using the same HTML tags as the content of the site, it will be impossible for ad blockers to properly function on a web page.\nCurrently, certain sites set some rules for advertisers to follow, with the hope that users will whitelist their sites on their ad blocker, which in tu rn leads users to see ad impressions and click on the ads. But what happens when sites don’t need to worry about their users using ad blockers? Ads will get much, much more intrusive than they are today. Some sites might resist at first, but ultimately money wins the argument. Unfortunately, the future of the web isn’t looking too pretty, at least when it comes to “free” content online, unless, of course, you are an advertiser 🙂\n","permalink":"https://www.bloodforge.com/2010/03/html5-or-flash-be-careful-what-you-ask-for/","summary":"\u003cp\u003eOk, I’ll get straight to the point: There is a lot to dislike about many websites right now when it comes to how these websites generate revenue. On many sites it is hard to actually find the content you were seeking due to the huge amount of ads that get displayed. I’ve had my browser crash countless times due to poorly designed ads (generally, it is due to Flash ads, but it certainly can happen with JavaScript as well).\u003c/p\u003e","title":"HTML5 or Flash – Be careful what you ask for…"},{"content":"I updated the look of the site so it doesn’t look like the default BlogEngine.NET theme. I’m not a graphic designer, but I think it could have turned out worse. It does look best in the latest version of Opera/Firefox (and probably Chrome and Safari…).\nHopefully IE will have support for border-radius and box-shadow soon… I’m not holding my breath though.\n","permalink":"https://www.bloodforge.com/2010/03/new-theme-for-bloodforge/","summary":"\u003cp\u003eI updated the look of the site so it doesn’t look like the default BlogEngine.NET theme. I’m not a graphic designer, but I think it could have turned out worse. It does look best in the latest version of Opera/Firefox (and probably Chrome and Safari…).\u003c/p\u003e\n\u003cp\u003eHopefully IE will have support for border-radius and box-shadow soon… I’m not holding my breath though.\u003c/p\u003e","title":"New Theme for Bloodforge"},{"content":"This post is here for archival purposes only. The linked items are no longer available.\nI’ve added the reCaptcha to my contact page. If anyone who has installed the reCaptcha wants to add it to their contact page, the files are available here.\nThese are just the updated contact page files.\u0026nbsp; You must have the reCaptcha already installed for these to work.\n","permalink":"https://www.bloodforge.com/2010/03/updated-contact-page-now-with-a-recaptcha/","summary":"\u003cp\u003e\u003cem\u003eThis post is here for archival purposes only. The linked items are no longer available.\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eI’ve added the reCaptcha to my contact page.  If anyone who has installed the reCaptcha wants to add it to their contact page, the files are available here.\u003c/p\u003e\n\u003cp\u003eThese are just the updated contact page files.\u0026nbsp; You must have the reCaptcha already installed for these to work.\u003c/p\u003e","title":"Updated Contact Page – Now with a reCaptcha"},{"content":"Update: When I switched hosting providers and upgraded BE.NET, I didn\u0026#8217;t migrate the changes to the comment system to the newer version. \u0026nbsp;This post describes my updates to version 1.x, but is no longer being used on my website.\nBlogEngine.NET had a pretty decent commenting system, but it lacked some of the functionality I wanted in a comment system for my blog. So I decided to update it myself, which turned out to be a bigger deal than I thought it would be. Still, after a few evenings of work, I got my comment system. The following is a summary of the new additions.\nComment Listing By Type\u0026nbsp; The comments are now arranged in tabs, organized by type.\u0026nbsp; Although the image above shows three types, there are actually four:\nSpamUnapproved CommentsTrackbacks (and Pingbacks)Comments The ‘Spam’ and ‘Unapproved Comments’ tabs are only visible to authenticated users. ‘Trackbacks’ and ‘Comments’ are only visible if there’s something there. The number in parentheses next to each tab contains the number of comments of that type in the tab.\u0026nbsp; It is also possible to have a ‘Spam’ comment in the ‘Comments’ tab, if that ‘Spam’ comment has a reply which is not spam.\u0026nbsp; In such cases, the ‘Spam’ comment will be collapsed and users will not be able to see the contents, but they will be able to see the reply.\u0026nbsp; The inverse applies to the ‘Spam’ and ‘Unapproved Comments’ tabs.\nComment Rating System Visitors to this blog can now rate the comments, in similar fashion to how users can digg items on Digg ( I even hijacked their thumbs up and down images, I hope they don’t sue! ). Improved Comment Administration Interface In the current version of BlogEngine.NET, there are basically two comment states: Approved and Spam. I added a third comment state: ‘Unapproved Comments’. These are comments that have not yet been either approved or marked as Spam. In the current implementation on this blog, no comments ever\u0026nbsp;go to the Spam tab automatically – they have to be placed there by a moderator. However, if they fail a Spam check, they will be marked as ‘Unapproved Comments’ and not be visible to the public.\nThe Code If you’re even thinking about putting this in your blog, you should read these\u0026nbsp;release notes. I have uploaded a file that contains all changes\u0026nbsp;to this location. However, keep in mind that these are\u0026nbsp;NOT SIMPLE CHANGES. There was a lot of code modified, and\u0026nbsp; you should be fairly familiar with ASP.NET before attempting to put these in your blog. You will need to recompile the BlogEngine.Core project to make this work. Also, if you are using anything other than the XmlProvider that comes with the blog as your data provider, you will need to update that for the comment rating and spam properties, as these are new.\u0026nbsp; One other note about the zip containing the source: it assumes that you are also using the\u0026nbsp;reCaptcha control\u0026nbsp;I wrote not too long ago, although not all of the files necessary for the reCaptcha are in the zip.\n","permalink":"https://www.bloodforge.com/2010/03/new-and-improved-comment-system-for-blogengine-net/","summary":"\u003cp\u003e\u003cstrong\u003eUpdate: When I switched hosting providers and upgraded BE.NET, I didn\u0026#8217;t migrate the changes to the comment system to the newer version. \u0026nbsp;This post describes my updates to version 1.x, but is no longer being used on my website.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eBlogEngine.NET had a pretty decent commenting system, but it lacked some of the functionality I wanted in a comment system for my blog. So I decided to update it myself, which turned out to be a bigger deal than I thought it would be. Still, after a few evenings of work, I got my comment system. The following is a summary of the new additions.\u003c/p\u003e","title":"New and Improved Comment System for BlogEngine.NET"},{"content":"EDIT: These post exists for archival purposes only. The linked files are no longer available.\nThese installation instructions now apply to version 0.95\nFirst, the linked ZIP file contains the updated files for installing the Recaptcha control.\nUPDATES: Version 0.95 – Changed initial loading method to fix error that occurred in certain cases in IE. If upgrading from 0.94, you only need to replace the Recaptcha.cs file.Version 0.94 – Logging fixesVersion 0.93 – Added logging.Version 0.92 \u0026#8211; The recaptcha will no longer get focus after it has been loaded. Install procedure is unchanged from version 0.91.Version 0.91 \u0026#8211; Changed the way that Recaptcha is verified.\u0026nbsp; It should no longer be possible to bypass the recaptcha by manually executing JavaScript on the page.Version 0.9 \u0026#8211; Initial Version Quick Installation First, back up your files in case you need to revert for any reason. If you have not modified any of the BlogEngine files, you can extract the ZIP linked to above and place all of the files into their proper locations ( the unzipped files should contain a folder structure ). There is no need to recompile.\nYou may need to force a refresh of your browser on the site, since there is a JavaScript file updated, and most browsers like to cache these files.\nManual Installation Below is a complete summary of what needs to be altered to make the Recaptcha control work.\u0026nbsp; You’ll need to do this for any files manually modified in your BlogEngine.NET instance.\n/App_Code/Controls/Recaptcha.cs\u0026nbsp;\n/admin/Pages/RecaptchaLogViewer.aspx\u0026nbsp;\n/admin/Pages/RecaptchaLogViewer.aspx.cs These files were not included in the BlogEngine.NET installation, and should be placed in their respective folders.\n/blog.js There are three functions in this file that need to be updated to the following:\nonCommentError: function(error, context) { BlogEngine.toggleCommentSavingIndicators(false); error = error || \"Unknown error occurred.\"; var iDelimiterPos = error.indexOf(\"|\"); if (iDelimiterPos \u003e 0) { error = error.substr(0, iDelimiterPos); // Remove numbers from end of error message. while (error.length \u003e 0 \u0026amp;\u0026amp; error.substr(error.length - 1, 1).match(/\\d/)) { error = error.substr(0, error.length - 1); } } if( document.getElementById('recaptcha_response_field') ) { Recaptcha.reload(); } alert(\"Sorry, the following error occurred while processing your comment:\\n\\n\" + error); } addComment: function(preview) { var isPreview = preview == true; if (!isPreview) { BlogEngine.toggleCommentSavingIndicators(true); this.$(\"status\").innerHTML = BlogEngine.i18n.savingTheComment; } var author = BlogEngine.comments.nameBox.value; var email = BlogEngine.comments.emailBox.value; var website = BlogEngine.comments.websiteBox.value; var country = BlogEngine.comments.countryDropDown ? BlogEngine.comments.countryDropDown.value : \"\"; var content = BlogEngine.comments.contentBox.value; var notify = BlogEngine.$(\"cbNotify\").checked; var captcha = BlogEngine.comments.captchaField.value; var replyToId = BlogEngine.comments.replyToId ? BlogEngine.comments.replyToId.value : \"\"; var recaptchaResponseField = document.getElementById('recaptcha_response_field'); var recaptchaResponse = recaptchaResponseField ? recaptchaResponseField.value : \"\"; var recaptchaChallengeField = document.getElementById('recaptcha_challenge_field'); var recaptchaChallenge = recaptchaChallengeField ? recaptchaChallengeField.value : \"\"; var avatarInput = BlogEngine.$(\"avatarImgSrc\"); var avatar = (avatarInput \u0026amp;\u0026amp; avatarInput.value) ? avatarInput.value : \"\"; var callback = isPreview ? BlogEngine.endShowPreview : BlogEngine.appendComment; var argument = author + \"-|-\" + email + \"-|-\" + website + \"-|-\" + country + \"-|-\" + content + \"-|-\" + notify + \"-|-\" + isPreview + \"-|-\" + captcha + \"-|-\" + replyToId + \"-|-\" + avatar + \"-|-\" + recaptchaResponse + \"-|-\" + recaptchaChallenge; WebForm_DoCallback(BlogEngine.comments.controlId, argument, callback, 'comment', BlogEngine.onCommentError, false); if (!isPreview \u0026amp;\u0026amp; typeof (OnComment) != \"undefined\") OnComment(author, email, website, country, content); } appendComment: function(args, context) { if (context == \"comment\") { if( document.getElementById('recaptcha_response_field') ) { Recaptcha.reload(); } if( args == \"RecaptchaIncorrect\" ) { if( document.getElementById(\"spnCaptchaIncorrect\") ) document.getElementById(\"spnCaptchaIncorrect\").style.display = \"\"; BlogEngine.toggleCommentSavingIndicators(false); } else { if( document.getElementById(\"spnCaptchaIncorrect\") ) document.getElementById(\"spnCaptchaIncorrect\").style.display = \"none\"; var commentList = BlogEngine.$(\"commentlist\"); if (commentList.innerHTML.length \u0026lt; 10) commentList.innerHTML = \"\u0026lt;h1 id='comment'\u003e\" + BlogEngine.i18n.comments + \"\u0026lt;/h1\u003e\" // add comment html to the right place var id = BlogEngine.comments.replyToId ? BlogEngine.comments.replyToId.value : ''; if (id != '') { var replies = BlogEngine.$('replies_' + id); replies.innerHTML += args; } else { commentList.innerHTML += args; commentList.style.display = 'block'; } // reset form values BlogEngine.comments.contentBox.value = \"\"; BlogEngine.comments.contentBox = BlogEngine.$(BlogEngine.comments.contentBox.id); BlogEngine.toggleCommentSavingIndicators(false); BlogEngine.$(\"status\").className = \"success\"; if (!BlogEngine.comments.moderation) BlogEngine.$(\"status\").innerHTML = BlogEngine.i18n.commentWasSaved; else BlogEngine.$(\"status\").innerHTML = BlogEngine.i18n.commentWaitingModeration; // move form back to bottom var commentForm = BlogEngine.$('comment-form'); commentList.appendChild(commentForm); // reset reply to if (BlogEngine.comments.replyToId) BlogEngine.comments.replyToId.value = ''; if (BlogEngine.$('cancelReply')) BlogEngine.$('cancelReply').style.display = 'none'; } } BlogEngine.$(\"btnSaveAjax\").disabled = false; } /User controls/CommentView.ascx.cs One method in this file needs to be updated:\n/// \u0026lt;summary\u003e /// Processes a callback event that targets a control. /// \u0026lt;/summary\u003e /// \u0026lt;param name=\"eventArgument\"\u003eA string that represents an event argument to pass to the event handler.\u0026lt;/param\u003e public void RaiseCallbackEvent(string eventArgument) { if (!BlogSettings.Instance.IsCommentsEnabled) return; string\u0026#91;] args = eventArgument.Split(new string\u0026#91;] { \"-|-\" }, StringSplitOptions.None); string author = args\u0026#91;0]; string email = args\u0026#91;1]; string website = args\u0026#91;2]; string country = args\u0026#91;3]; string content = args\u0026#91;4]; bool notify = bool.Parse(args\u0026#91;5]); bool isPreview = bool.Parse(args\u0026#91;6]); string sentCaptcha = args\u0026#91;7]; //If there is no \"reply to\" comment, args\u0026#91;8] is empty Guid replyToCommentID = String.IsNullOrEmpty(args\u0026#91;8]) ? Guid.Empty : new Guid(args\u0026#91;8]); string avatar = args\u0026#91;9]; string recaptchaResponse = args\u0026#91;10]; string recaptchaChallenge = args\u0026#91;11]; recaptcha.UserUniqueIdentifier = hfCaptcha.Value; if (!isPreview \u0026amp;\u0026amp; recaptcha.RecaptchaEnabled \u0026amp;\u0026amp; recaptcha.RecaptchaNecessary) { if (!recaptcha.ValidateAsync(recaptchaResponse, recaptchaChallenge)) { _Callback = \"RecaptchaIncorrect\"; return; } } string storedCaptcha = hfCaptcha.Value; if (sentCaptcha != storedCaptcha) return; Comment comment = new Comment(); comment.Id = Guid.NewGuid(); comment.ParentId = replyToCommentID; comment.Author = Server.HtmlEncode(author); comment.Email = email; comment.Content = Server.HtmlEncode(content); comment.IP = Request.UserHostAddress; comment.Country = country; comment.DateCreated = DateTime.Now; comment.Parent = Post; comment.IsApproved = !BlogSettings.Instance.EnableCommentsModeration; comment.Avatar = avatar.Trim(); if (Page.User.Identity.IsAuthenticated) comment.IsApproved = true; if (website.Trim().Length \u003e 0) { if (!website.ToLowerInvariant().Contains(\"://\")) website = \"http://\" + website; Uri url; if (Uri.TryCreate(website, UriKind.Absolute, out url)) comment.Website = url; } if (!isPreview) { if (notify \u0026amp;\u0026amp; !Post.NotificationEmails.Contains(email)) Post.NotificationEmails.Add(email); else if (!notify \u0026amp;\u0026amp; Post.NotificationEmails.Contains(email)) Post.NotificationEmails.Remove(email); Post.AddComment(comment); SetCookie(author, email, website, country); recaptcha.UpdateLog(comment); } string path = Utils.RelativeWebRoot + \"themes/\" + BlogSettings.Instance.Theme + \"/CommentView.ascx\"; CommentViewBase control = (CommentViewBase)LoadControl(path); control.Comment = comment; control.Post = Post; using (StringWriter sw = new StringWriter()) { control.RenderControl(new HtmlTextWriter(sw)); _Callback = sw.ToString(); } } /User controls/CommentView.ascx Finally, the following line needs to be added to this file, at the location you would like the Recaptcha control to appear. Remember to update your TabIndexes for proper tab button navigation.\n\u0026lt;blog:RecaptchaControl ID=\u0026#8221;recaptcha\u0026#8221; runat=\u0026#8221;server\u0026#8221; TabIndex=\u0026#8221;8\u0026#8243; /\u003e\nRecaptcha Settings You can edit the Recaptcha settings via the Extension Manager. You probably should enter in your own Public and Private keys, as the provided keys are for this site ( they are global, so they will work on other sites ).\nRecaptcha Theming There are 4 built-in themes that you can change via the ExtensionManager. You can also create your own theme by adding it in the following way to the Recaptcha control:\n\u0026lt;blog:RecaptchaControl ID=\"recaptcha\" runat=\"server\" TabIndex=\"8\" Theme=\"MyCustomTheme\" /\u003e For detailed instructions on what your theme needs to look like, visit the\u0026nbsp;Recaptcha site.\nKnown Issues None ATM ","permalink":"https://www.bloodforge.com/2010/02/blogengine-net-recaptcha-0-93-installation-instructions/","summary":"\u003cp\u003e\u003cem\u003eEDIT: These post exists for archival purposes only. The linked files are no longer available.\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eThese installation instructions now apply to version 0.95\u003c/p\u003e\n\u003cp\u003eFirst, the linked ZIP file contains the updated files for installing the Recaptcha control.\u003c/p\u003e\n\u003ch4\u003eUPDATES:\u003c/h4\u003e\n\u003cul\u003e\u003cli\u003eVersion 0.95 – Changed initial loading method to fix error that occurred in certain cases in IE. If upgrading from 0.94, you only need to replace the Recaptcha.cs file.\u003c/li\u003e\u003cli\u003eVersion 0.94 – Logging fixes\u003c/li\u003e\u003cli\u003eVersion 0.93 – Added logging.\u003c/li\u003e\u003cli\u003eVersion 0.92 \u0026#8211; The recaptcha will no longer get focus after it has been loaded. Install procedure is unchanged from version 0.91.\u003c/li\u003e\u003cli\u003eVersion 0.91 \u0026#8211; Changed the way that Recaptcha is verified.\u0026nbsp; It should no longer be possible to bypass the recaptcha by manually executing JavaScript on the page.\u003c/li\u003e\u003cli\u003eVersion 0.9 \u0026#8211; Initial Version\u003c/li\u003e\u003c/ul\u003e\n\u003ch4\u003eQuick Installation\u003c/h4\u003e\n\u003cp\u003eFirst, back up your files in case you need to revert for any reason. If you have not modified any of the BlogEngine files, you can extract the ZIP linked to above and place all of the files into their proper locations ( the unzipped files should contain a folder structure ). There is no need to recompile.\u003c/p\u003e","title":"Blogengine.NET – reCaptcha 0.93 Installation Instructions"},{"content":"I’ve known about the Wayback Machine for a while, but for some reason, I never visited the site – until today. It was such a strange feeling seeing what Bloodforge looked like back in 2001, and being able to see how it progressed over the years (the site was up since 1999 actually, but there is no record of that in the archive).\nI’ve actually pulled up some items from the archive. One of those is the logo that you can see at the top-left of the page.\nI also can’t believe I forgot about… the splash page for Bloodforge in 2003! Click on the image below and experience the excitement! (edit: this was flash, and until I have converted it to MP4, you\u0026#8217;ll need to visit the wayback machine to view the animation).\ncreated by Kevin Fyr (By the way, I do realize that the skip and enter buttons don\u0026#8217;t work anymore \u0026#8211; maybe I\u0026#8217;ll fix it some day )\nI’m sure there’s plenty of other items that I completely forgot about. Some of the items I do remember, however, are a flash based menu that dynamically populated from an XML file on the server (my first Flash app). Also, there was a message board system that I wrote from scratch in ASP – it was all done in Notepad too. I still can’t believe that thing worked!\n","permalink":"https://www.bloodforge.com/2010/02/looking-back-bloodforge-several-years-ago/","summary":"\u003cp\u003eI’ve known about the \u003ca href=\"http://www.archive.org/\"\u003eWayback Machine\u003c/a\u003e for a while, but for some reason, I never visited the site – until today. It was such a strange feeling seeing what \u003ca href=\"http://web.archive.org/web/*/http://www.bloodforge.com\"\u003eBloodforge looked like\u003c/a\u003e back in 2001, and being able to see how it progressed over the years (the site was up since 1999 actually, but there is no record of that in the archive).\u003c/p\u003e\n\u003cp\u003eI’ve actually pulled up some items from the archive. One of those is the logo that you can see at the top-left of the page.\u003c/p\u003e","title":"Looking back… Bloodforge several years ago"},{"content":"NOTE: THESE INSTALLATION INSTRUCTIONS HAVE BEEN UPDATED: To get the latest version, follow the instructions located at: NO LONGER AVAILABLE\nFirst, the linked ZIP file contains the updated files for installing the Recaptcha control.\nUPDATES:\nVersion 0.92 \u0026#8211; The recaptcha will no longer get focus after it has been loaded. Install procedure is unchanged from version 0.91.Version 0.91 \u0026#8211; Changed the way that Recaptcha is verified.\u0026nbsp; It should no longer be possible to bypass the recaptcha by manually executing JavaScript on the page.Version 0.9 \u0026#8211; Initial Version Quick Installation\nFirst, back up your files in case you need to revert for any reason. If you have not modified any of the BlogEngine files, you can extract the ZIP linked to above and place all of the files into their proper locations ( the unzipped files should contain a folder structure ). There is no need to recompile.\nYou may need to force a refresh of your browser on the site, since there is a JavaScript file updated, and most browsers like to cache these files.\nManual Installation\nBelow is a complete summary of what needs to be altered to make the Recaptcha control work.\u0026nbsp; You’ll need to do this for any files manually modified in your BlogEngine.NET instance.\n/App_Code/Controls/Recaptcha.cs\nThis file was not included in the BlogEngine.NET installation, and should be placed in the ‘/App_Code/Controls/’ folder.\n/blog.js\nThere are three functions in this file that need to be updated to the following:\nonCommentError: function(error, context) { BlogEngine.toggleCommentSavingIndicators(false); error = error || \"Unknown error occurred.\"; var iDelimiterPos = error.indexOf(\"|\"); if (iDelimiterPos \u003e 0) { error = error.substr(0, iDelimiterPos); // Remove numbers from end of error message. while (error.length \u003e 0 \u0026amp;\u0026amp; error.substr(error.length - 1, 1).match(/\\d/)) { error = error.substr(0, error.length - 1); } } if( document.getElementById('recaptcha_response_field') ) { Recaptcha.reload(); } alert(\"Sorry, the following error occurred while processing your comment:\\n\\n\" + error); } addComment: function(preview) { var isPreview = preview == true; if (!isPreview) { BlogEngine.toggleCommentSavingIndicators(true); this.$(\"status\").innerHTML = BlogEngine.i18n.savingTheComment; } var author = BlogEngine.comments.nameBox.value; var email = BlogEngine.comments.emailBox.value; var website = BlogEngine.comments.websiteBox.value; var country = BlogEngine.comments.countryDropDown ? BlogEngine.comments.countryDropDown.value : \"\"; var content = BlogEngine.comments.contentBox.value; var notify = BlogEngine.$(\"cbNotify\").checked; var captcha = BlogEngine.comments.captchaField.value; var replyToId = BlogEngine.comments.replyToId ? BlogEngine.comments.replyToId.value : \"\"; var recaptchaResponseField = document.getElementById('recaptcha_response_field'); var recaptchaResponse = recaptchaResponseField ? recaptchaResponseField.value : \"\"; var recaptchaChallengeField = document.getElementById('recaptcha_challenge_field'); var recaptchaChallenge = recaptchaChallengeField ? recaptchaChallengeField.value : \"\"; var avatarInput = BlogEngine.$(\"avatarImgSrc\"); var avatar = (avatarInput \u0026amp;\u0026amp; avatarInput.value) ? avatarInput.value : \"\"; var callback = isPreview ? BlogEngine.endShowPreview : BlogEngine.appendComment; var argument = author + \"-|-\" + email + \"-|-\" + website + \"-|-\" + country + \"-|-\" + content + \"-|-\" + notify + \"-|-\" + isPreview + \"-|-\" + captcha + \"-|-\" + replyToId + \"-|-\" + avatar + \"-|-\" + recaptchaResponse + \"-|-\" + recaptchaChallenge; WebForm_DoCallback(BlogEngine.comments.controlId, argument, callback, 'comment', BlogEngine.onCommentError, false); if (!isPreview \u0026amp;\u0026amp; typeof (OnComment) != \"undefined\") OnComment(author, email, website, country, content); } appendComment: function(args, context) { if (context == \"comment\") { if( document.getElementById('recaptcha_response_field') ) { Recaptcha.reload(); } if( args == \"RecaptchaIncorrect\" ) { if( document.getElementById(\"spnCaptchaIncorrect\") ) document.getElementById(\"spnCaptchaIncorrect\").style.display = \"\"; BlogEngine.toggleCommentSavingIndicators(false); } else { if( document.getElementById(\"spnCaptchaIncorrect\") ) document.getElementById(\"spnCaptchaIncorrect\").style.display = \"none\"; var commentList = BlogEngine.$(\"commentlist\"); if (commentList.innerHTML.length \u0026lt; 10) commentList.innerHTML = \"\u0026lt;h1 id='comment'\u003e\" + BlogEngine.i18n.comments + \"\u0026lt;/h1\u003e\" // add comment html to the right place var id = BlogEngine.comments.replyToId ? BlogEngine.comments.replyToId.value : ''; if (id != '') { var replies = BlogEngine.$('replies_' + id); replies.innerHTML += args; } else { commentList.innerHTML += args; commentList.style.display = 'block'; } // reset form values BlogEngine.comments.contentBox.value = \"\"; BlogEngine.comments.contentBox = BlogEngine.$(BlogEngine.comments.contentBox.id); BlogEngine.toggleCommentSavingIndicators(false); BlogEngine.$(\"status\").className = \"success\"; if (!BlogEngine.comments.moderation) BlogEngine.$(\"status\").innerHTML = BlogEngine.i18n.commentWasSaved; else BlogEngine.$(\"status\").innerHTML = BlogEngine.i18n.commentWaitingModeration; // move form back to bottom var commentForm = BlogEngine.$('comment-form'); commentList.appendChild(commentForm); // reset reply to if (BlogEngine.comments.replyToId) BlogEngine.comments.replyToId.value = ''; if (BlogEngine.$('cancelReply')) BlogEngine.$('cancelReply').style.display = 'none'; } } BlogEngine.$(\"btnSaveAjax\").disabled = false; } /User controls/CommentView.ascx.cs\nOne method in this file needs to be updated:\n/// \u0026lt;summary\u003e /// Processes a callback event that targets a control. /// \u0026lt;/summary\u003e /// \u0026lt;param name=\"eventArgument\"\u003eA string that represents an event argument to pass to the event handler.\u0026lt;/param\u003e public void RaiseCallbackEvent(string eventArgument) { if (!BlogSettings.Instance.IsCommentsEnabled) return; string\u0026#91;] args = eventArgument.Split(new string\u0026#91;] { \"-|-\" }, StringSplitOptions.None); string author = args\u0026#91;0]; string email = args\u0026#91;1]; string website = args\u0026#91;2]; string country = args\u0026#91;3]; string content = args\u0026#91;4]; bool notify = bool.Parse(args\u0026#91;5]); bool isPreview = bool.Parse(args\u0026#91;6]); string sentCaptcha = args\u0026#91;7]; //If there is no \"reply to\" comment, args\u0026#91;8] is empty Guid replyToCommentID = String.IsNullOrEmpty(args\u0026#91;8]) ? Guid.Empty : new Guid(args\u0026#91;8]); string avatar = args\u0026#91;9]; string recaptchaResponse = args\u0026#91;10]; string recaptchaChallenge = args\u0026#91;11]; if (!isPreview \u0026amp;\u0026amp; recaptcha.RecaptchaEnabled \u0026amp;\u0026amp; recaptcha.RecaptchaNecessary) { if (!recaptcha.ValidateAsync(recaptchaResponse, recaptchaChallenge)) { _Callback = \"RecaptchaIncorrect\"; return; } } string storedCaptcha = hfCaptcha.Value; if (sentCaptcha != storedCaptcha) return; Comment comment = new Comment(); comment.Id = Guid.NewGuid(); comment.ParentId = replyToCommentID; comment.Author = Server.HtmlEncode(author); comment.Email = email; comment.Content = Server.HtmlEncode(content); comment.IP = Request.UserHostAddress; comment.Country = country; comment.DateCreated = DateTime.Now; comment.Parent = Post; comment.IsApproved = !BlogSettings.Instance.EnableCommentsModeration; comment.Avatar = avatar.Trim(); if (Page.User.Identity.IsAuthenticated) comment.IsApproved = true; if (website.Trim().Length \u003e 0) { if (!website.ToLowerInvariant().Contains(\"://\")) website = \"http://\" + website; Uri url; if (Uri.TryCreate(website, UriKind.Absolute, out url)) comment.Website = url; } if (!isPreview) { if (notify \u0026amp;\u0026amp; !Post.NotificationEmails.Contains(email)) Post.NotificationEmails.Add(email); else if (!notify \u0026amp;\u0026amp; Post.NotificationEmails.Contains(email)) Post.NotificationEmails.Remove(email); Post.AddComment(comment); SetCookie(author, email, website, country); } string path = Utils.RelativeWebRoot + \"themes/\" + BlogSettings.Instance.Theme + \"/CommentView.ascx\"; CommentViewBase control = (CommentViewBase)LoadControl(path); control.Comment = comment; control.Post = Post; using (StringWriter sw = new StringWriter()) { control.RenderControl(new HtmlTextWriter(sw)); _Callback = sw.ToString(); } } /User controls/CommentView.ascx\nFinally, the following line needs to be added to this file, at the location you would like the Recaptcha control to appear. Remember to update your TabIndexes for proper tab button navigation.\n\u0026lt;blog:RecaptchaControl ID=\"recaptcha\" runat=\"server\" TabIndex=\"8\" /\u003e Recaptcha Settings\nYou can edit the Recaptcha settings via the Extension Manager. You probably should enter in your own Public and Private keys, as the provided keys are for this site ( they are global, so they will work on other sites ).\nRecaptcha Theming\nThere are 4 built-in themes that you can change via the ExtensionManager. You can also create your own theme by adding it in the following way to the Recaptcha control:\n\u0026lt;blog:RecaptchaControl ID=\"recaptcha\" runat=\"server\" TabIndex=\"8\" Theme=\"MyCustomTheme\" /\u003e For detailed instructions on what your theme needs to look like, visit the Recaptcha site. ","permalink":"https://www.bloodforge.com/2010/02/blogengine-net-recaptcha-0-91-installation-instructions/","summary":"\u003cp\u003e\u003cstrong\u003eNOTE: THESE INSTALLATION INSTRUCTIONS HAVE BEEN UPDATED:\u003c/strong\u003e To get the latest version, follow the instructions located at: \u003cem\u003e\u003cstrong\u003eNO LONGER AVAILABLE\u003c/strong\u003e\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eFirst, the linked ZIP file contains the updated files for installing the Recaptcha control.\u003c/p\u003e\n\u003cp\u003eUPDATES:\u003c/p\u003e\n\u003cul\u003e\u003cli\u003eVersion 0.92 \u0026#8211; The recaptcha will no longer get focus after it has been loaded. Install procedure is unchanged from version 0.91.\u003c/li\u003e\u003cli\u003eVersion 0.91 \u0026#8211; Changed the way that Recaptcha is verified.\u0026nbsp; It should no longer be possible to bypass the recaptcha by manually executing JavaScript on the page.\u003c/li\u003e\u003cli\u003eVersion 0.9 \u0026#8211; Initial Version\u003c/li\u003e\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eQuick Installation\u003c/strong\u003e\u003c/p\u003e","title":"Blogengine.NET Recaptcha 0.91 Installation Instructions"},{"content":"The instructions on this page are no longer valid for the latest version.\nI really am getting sick of the spam that is appearing on this blog, so yesterday I decided to implement Recaptcha for BlogEngine.NET. I had three main goals:\nEasy to implement – as any control, it needs to be pretty trivial to add it to an existing blog instanceConfigurable via the Extensions panel – I really like what BlogEngine has done with their ability to edit extensions, so I wanted the control to be configurable in this wayIt had to be asynchronous – when a user posts a comment, I don’t want the whole page to refresh The final solution is pretty close to what I had in mind.\u0026nbsp; The extension is a single file that needs to be inserted into the ‘/App_Code/Controls’ folder.\u0026nbsp; In addition, two lines of code need to be added/modified in the ‘/User controls/CommentView.ascx’ file.\nJust a quick note to anyone who may want to implement this on your own.\u0026nbsp; I have noticed that once in a while, when using IE, I get an error that BlogEngine is not defined and the error points to the following file: ‘/js.axd?path=%2fadmin%2fwidget.js\u0026amp;v=1.6.0.1’. The changes involved shouldn’t have any effect on this, but I am not 100% sure if this is due to my code or not. If it is, hopefully I’ll figure it out in the next day or so, as I’m way to tired right now.\u0026nbsp;[ this should now be fixed in the 0.95 version ]\nTo implement the Recaptcha control, the following steps need to be taken:\nDownload Recaptcha.zip, extract the file in it, and place the file in the /App_Code/Controls folder.Open ‘/User controls/CommentView.ascx’ in the editor of your choice and put in the following line at the spot where you would like your control to appear. On this blog, the code is right above the submit button when posting comments. \u0026lt;blog:RecaptchaControl ID=\"recaptcha\" runat=\"server\" TabIndex=\"8\" /\u003e\u0026lt;br /\u003e In the example above, I also put in an extra line break for some extra white space. I have also put in a TabIndex ( and changed the TabIndex of the submit button ).The onClick event on the actual submit button needs to change. If you have not modified the code at all, the submit button should look like this: \u0026lt;input type=\"button\" id=\"btnSaveAjax\" value=\"\u0026lt;%=Resources.labels.saveComment %\u003e\" onclick=\"return BlogEngine.validateAndSubmitCommentForm()\" tabindex=\"7\" /\u003e For the recaptcha code to work, the submit button needs to change to the following: \u0026lt;input type=\"button\" id=\"btnSaveAjax\" value=\"\u0026lt;%=Resources.labels.saveComment %\u003e\" onclick=\"return validateWithRecaptcha()\" tabindex=\"9\" /\u003e That’s it. No recompile is needed, and the Recaptcha control should be functional. If you go to your extensions section, you’ll notice that the Recaptcha control is there and available for editing. You can ( and probably should ) create your own account on Recaptcha.net and put in a Public and Private key that corresponds to your site. The keys in there are for my site, but they are “global” keys which should work from any domain. You can also disable the control altogether, change it so it does not appear for logged in users, and change the theme.\nThe control also allows you to create a custom theme.\u0026nbsp; To do so, you need to specify the name of the theme directly in the tag in the CommentView.ascx file mentioned above. So, for example:\n\u0026lt;blog:RecaptchaControl ID=\"recaptcha\" runat=\"server\" TabIndex=\"8\" Theme=”MyCustomTheme” /\u003e\nYou’ll find the rest of the info about what you need to do to skin the Recaptcha on their\u0026nbsp;site.\nAs always, let me know if you’d like to see anything added to the control, or if you experience any bugs with it.\u0026nbsp; I’ll be looking into the bug mentioned above this weekend to determine if the control is actually causing this issue mentioned above.\u0026nbsp; I have a feeling I know how to fix it even if it isn’t, but I’ll just have to run some tests…\n","permalink":"https://www.bloodforge.com/2010/02/async-recaptcha-for-blogengine-net-1-6/","summary":"\u003cp\u003e\u003cstrong\u003eThe instructions on this page are no longer valid for the latest version.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eI really am getting sick of the spam that is appearing on this blog, so yesterday I decided to implement Recaptcha for BlogEngine.NET. I had three main goals:\u003c/p\u003e\n\u003col\u003e\u003cli\u003eEasy to implement – as any control, it needs to be pretty trivial to add it to an existing blog instance\u003c/li\u003e\u003cli\u003eConfigurable via the Extensions panel – I really like what BlogEngine has done with their ability to edit extensions, so I wanted the control to be configurable in this way\u003c/li\u003e\u003cli\u003eIt had to be asynchronous – when a user posts a comment, I don’t want the whole page to refresh\u003c/li\u003e\u003c/ol\u003e\n\u003cp\u003eThe final solution is pretty close to what I had in mind.\u0026nbsp; The extension is a single file that needs to be inserted into the ‘/App_Code/Controls’ folder.\u0026nbsp; In addition, two lines of code need to be added/modified in the ‘/User controls/CommentView.ascx’ file.\u003c/p\u003e","title":"Async Recaptcha for BlogEngine.NET 1.6"},{"content":"I was reading through the discussions on Codeplex for Blogengine.NET, and a user (ALBsharah) had an interesting idea for controlling spam: if we can already determine that a user is blacklisted based on the IP, do not even give them the ability to post new comments.\u0026nbsp; The thread is available\u0026nbsp;here.\nMaking this change to BE is relatively simple.\u0026nbsp; The first change was actually creating a function which would return whether the user is blacklisted.\u0026nbsp; Comment moderation methods seem to be located in the CommentHandlers.as file in the BlogEngine.Core project. All of this code was actually already written in another method ( ModeratedByRule ), I just needed to extract that code out of that method, and modify that method to use the new code – I hate having code that does the same thing in two different places.\u0026nbsp; So, where before the function looked like the following:\nstatic bool ModeratedByRule(Comment comment) { // trust authenticated users if (Thread.CurrentPrincipal.Identity.IsAuthenticated) { comment.IsApproved = true; comment.ModeratedBy = \"Rule:authenticated\"; return true; } int blackCnt = 0; int whiteCnt = 0; // check if this user already has approved or // rejected comments and belongs to white/black list foreach (Post p in Post.Posts) { foreach (Comment c in p.Comments) { if (c.Email.ToLowerInvariant() == comment.Email.ToLowerInvariant() || c.IP == comment.IP) { if (c.IsApproved) whiteCnt++; else blackCnt++; } } } // user is in the white list - approve comment if (whiteCnt \u003e= BlogSettings.Instance.CommentWhiteListCount) { comment.IsApproved = true; comment.ModeratedBy = \"Rule:white list\"; return true; } // user is in the black list - reject comment if (blackCnt \u003e= BlogSettings.Instance.CommentBlackListCount) { comment.IsApproved = false; comment.ModeratedBy = \"Rule:black list\"; return true; } return false; } It now looks like this: /// \u0026lt;summary\u003e /// Checks if the IP or email is blacklisted /// \u0026lt;/summary\u003e /// \u0026lt;param name=\"IP\"\u003eThe IP of the user\u0026lt;/param\u003e /// \u0026lt;param name=\"Email\"\u003eThe Email of the user\u0026lt;/param\u003e /// \u0026lt;returns\u003etrue if blacklisted, false if whitelisted, or null if undetermined\u0026lt;/returns\u003e public static Nullable\u0026lt;bool\u003e IsBlacklisted(string IP, string Email) { int blackCnt = 0; int whiteCnt = 0; // check if this user already has approved or // rejected comments and belongs to white/black list foreach (Post p in Post.Posts) { foreach (Comment c in p.Comments) { if ( ( Email != String.Empty \u0026amp;\u0026amp; c.Email.ToLowerInvariant() == Email.ToLowerInvariant()) || c.IP == IP ) { if (c.IsApproved) whiteCnt++; else blackCnt++; } } } // user is in the white list - approve comment if (whiteCnt \u003e= BlogSettings.Instance.CommentWhiteListCount) { return false; } // user is in the black list - reject comment if (blackCnt \u003e= BlogSettings.Instance.CommentBlackListCount) { return true; } return null; } static bool ModeratedByRule(Comment comment) { // trust authenticated users if (Thread.CurrentPrincipal.Identity.IsAuthenticated) { comment.IsApproved = true; comment.ModeratedBy = \"Rule:authenticated\"; return true; } Nullable\u0026lt;bool\u003e isBlacklisted = IsBlacklisted(comment.IP, comment.Email); // user is in the white list - approve comment if (isBlacklisted == false) { comment.IsApproved = true; comment.ModeratedBy = \"Rule:white list\"; return true; } // user is in the black list - reject comment if (isBlacklisted == true) { comment.IsApproved = false; comment.ModeratedBy = \"Rule:black list\"; return true; } return false; } Next, a very simple change needed to be made to the CommentView.ascx.cs file, which actually handles the viewing of the comment section.\nThe following line was modified ( in /User controls/CommentView.ascx.cs):\nif (BlogSettings.Instance.IsCommentsEnabled) To this: if ( BlogSettings.Instance.IsCommentsEnabled \u0026amp;\u0026amp; BlogEngine.Core.CommentHandlers.IsBlacklisted(Request.UserHostAddress, String.Empty) != true ) ","permalink":"https://www.bloodforge.com/2010/02/disabling-comments-for-blacklisted-ip-addresses/","summary":"\u003cp\u003eI was reading through the discussions on Codeplex for Blogengine.NET, and a user (ALBsharah) had an interesting idea for controlling spam: if we can already determine that a user is blacklisted based on the IP, do not even give them the ability to post new comments.\u0026nbsp; The thread is available\u0026nbsp;\u003ca href=\"http://blogengine.codeplex.com/Thread/View.aspx?ThreadId=85678\"\u003ehere\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eMaking this change to BE is relatively simple.\u0026nbsp; The first change was actually creating a function which would return whether the user is blacklisted.\u0026nbsp; Comment moderation methods seem to be located in the CommentHandlers.as file in the BlogEngine.Core project. All of this code was actually already written in another method ( ModeratedByRule ), I just needed to extract that code out of that method, and modify that method to use the new code – I hate having code that does the same thing in two different places.\u0026nbsp; So, where before the function looked like the following:\u003c/p\u003e","title":"Disabling Comments for Blacklisted IP addresses"},{"content":"I was writing an application that needed to convert text in a cell in an Excel workbook to HTML. It is fairly trivial to get formatting for the entire cell, but each individual character in the cell could have different formatting itself, so I needed something more specific than cell-level formatting info.\nAt first, I started using the\u0026nbsp;Excel.Range.get_Characters( pos, len )\u0026nbsp;method to get info out of the cell.\u0026nbsp; The code would loop through all characters, get them one by one, and check the formatting.\u0026nbsp; For example:\nMicrosoft.Office.Interop.Excel.Range Range = (Microsoft.Office.Interop.Excel.Range)Cell; int TextLength = Range.Text.ToString().Length; for (int CharCount = 1; CharCount \u0026lt;= TextLength; CharCount++) { Microsoft.Office.Interop.Excel.Characters charToTest = Range.get_Characters(CharCount, 1); bool IsBold = (bool)charToTest.Font.Bold; bool IsItalic = (bool)charToTest.Font.Italic; // other formatting tests here } However, that method proved to be incredibly slow for cells that have more than just a few characters.\u0026nbsp; For cells that have 1000+ characters, it would take several minutes to run the test across all characters. I kept playing around with different ways to speed up the whole process, but it just became apparent that making the call to Excel to get all of this information was not going to be acceptable.\nFinally, I think I’ve found the solution. It is possible to copy the text from a cell to the clipboard, and then use the Clipboard class to retrieve the formatted text, and parse it with C#. I ended up using the System.Windows.DataFormats.Rtf format to extract the data from the clipboard in the following way:\nstring rtf = (string)System.Windows.Clipboard.GetData(System.Windows.DataFormats.Rtf); Then, I create a System.Windows.Forms.RichTextBox, and use that to parse the data. The following is a sample of the solution, and it is reasonably quick. Microsoft.Office.Interop.Excel.Range Range = (Microsoft.Office.Interop.Excel.Range)Cell; Range.Copy(System.Reflection.Missing.Value); string rtf = (string)System.Windows.Clipboard.GetData(System.Windows.DataFormats.Rtf); System.Windows.Forms.RichTextBox rtb = new System.Windows.Forms.RichTextBox(); rtb.Rtf = rtf; int CharCount = rtb.Text.Length; for (int CharNum = 0; CharNum \u0026lt; CharCount; CharNum++) { rtb.Select(CharNum, 1); System.Drawing.Font Font = rtb.SelectionFont; bool IsCharBold = Font.Bold; bool IsCharUnderline = Font.Underline; bool IsCharItalic = Font.Italic; // other code here I was also asked about getting the color in the comments. To get the color, you can use: System.Drawing.Color color = rtb.SelectionColor; There are also other properties of rtb dealing with selection, such as SelectionAlignment, SelectionBackColor, etc. See the RichTextBox class for more info. ","permalink":"https://www.bloodforge.com/2009/09/extract-formatted-text-from-excel-cell-with-c-rich-text-format/","summary":"\u003cp\u003eI was writing an application that needed to convert text in a cell in an Excel workbook to HTML. It is fairly trivial to get formatting for the entire cell, but each individual character in the cell could have different formatting itself, so I needed something more specific than cell-level formatting info.\u003c/p\u003e\n\u003cp\u003eAt first, I started using the\u0026nbsp;\u003cstrong\u003eExcel.Range.get_Characters( pos, len )\u003c/strong\u003e\u0026nbsp;method to get info out of the cell.\u0026nbsp; The code would loop through all characters, get them one by one, and check the formatting.\u0026nbsp; For example:\u003c/p\u003e","title":"Extract Formatted Text From Excel Cell With C# (Rich Text Format)"},{"content":"Today I was reminded exactly of why I hate flying.\u0026nbsp; A couple months ago, I purchased a ticket to fly to Krakow, Poland.\u0026nbsp; I live in Cincinnati, and it is not possible to have a direct flight into Poland.\u0026nbsp; The best you can do from CVG is a one-stop flight.\u0026nbsp; I really wanted as few stops as possible, so I paid $1360 for a ticket with only one stop ( Chicago ). I could have saved myself $600 on the ticket and bought a multi-stop ticket for around $700, but I just wanted the trip to be as quick as possible.\nWell, about 8 hours ago I show up at the airport, do the check-in, go through security.\u0026nbsp; However, the departure time never really approaches, because every 20 minutes or so the flight gets more and more delayed.\u0026nbsp; I had about a 100 minute window to switch planes in Chicago, and pretty soon it becomes apparent that even if I get on the plane to Chicago, I will miss my flight to Poland.\nThe “manager” at the American Eagle ( the regional partner to the Polish airlines partner – American Airlines ) that is handling the flight to Chicago is not very helpful.\u0026nbsp; He keeps repeating that it is not their problem, since all these delays are due to weather and not some mechanical failure ( as I’m talking to the manager, I can see through the terminal window how Delta flights are departing and landing – something he claims is not possible to do right now ).\nAt this point, I’m told that I can either fly to Chicago and I’m “on my own” ( whatever that means ), or I can try to reschedule my flight tomorrow. Since the thought of sleeping in the airport terminal in O’hare is not very appealing, I decide to switch my flight to the next day – what else can I really do? I end up with a flight to Chicago, then a flight into Warsaw, and the ( 6 hours later! ) a flight to Krakow. I’m now arriving a day late, on a trip that will take 13 hours more than my planned trip.\nI realize that certain weather conditions can wreck havoc on flight schedules. But I’m not buying any of this BS that the airlines have absolutely no control over this aspect of flying. I’ve flown many times in the past, and it is standard practice to have a flight arrive, people leave the plane, then the new flyers board the plane, and have the plane take off in like 45 minutes. Basically, very little – if no time at all – is factored in for delays due to weather. The airlines could easily fix this problem by allowing more time in between arriving and departing flights. But that would hurt their bottom line, and they prefer to shift all the blame to the weather ( thus escaping any liability ) instead of actually admitting that their scheduling is messed up.\nI really think we need a new system that requires airlines to allow for more time between arrival and departure. Don’t make it mandatory, but if the airline decides that they want to continue their current practice, require them to compensate the passengers $20 per hour that their flight is delayed, and something like $100 per added stop to their travel plans. If airlines couldn’t simply blame everything on the weather, I’m sure they would very quickly arrive at some solution that would improve the status quo.\n","permalink":"https://www.bloodforge.com/2009/05/something-is-seriously-wrong-with-our-airlines/","summary":"\u003cp\u003eToday I was reminded exactly of why I hate flying.\u0026nbsp; A couple months ago, I purchased a ticket to fly to Krakow, Poland.\u0026nbsp; I live in Cincinnati, and it is not possible to have a direct flight into Poland.\u0026nbsp; The best you can do from CVG is a one-stop flight.\u0026nbsp; I really wanted as few stops as possible, so I paid $1360 for a ticket with only one stop ( Chicago ). I could have saved myself $600 on the ticket and bought a multi-stop ticket for around $700, but I just wanted the trip to be as quick as possible.\u003c/p\u003e","title":"Something is seriously wrong with our airlines"},{"content":" If you leave comments on my blog for the sole purpose of providing links to your own blog, those comments will be removed. I have no problems with people linking back to their own site in a comment, but if you do that, at least attempt to stay on topic. ","permalink":"https://www.bloodforge.com/2009/01/deleting-comments/","summary":"\u003cp\u003e If you leave comments on my blog for the sole purpose of providing links to your own blog, those comments will be removed.  I have no problems with people linking back to their own site in a comment, but if you do that, at least attempt to stay on topic. \u003c/p\u003e","title":"Deleting Comments…"},{"content":"This post was written a long time ago, and since then many other great solutions have come out to accomplish this task. I have kept my post for historical reasons, but the files are no longer available and the code on the page is no longer functional.\nAs I\u0026#8217;m sure you\u0026#8217;ve seen on many websites, displaying suggestions while a user types text into a text field has become quite popular. However, I was rather disappointed with the solutions I\u0026#8217;ve found out there. The solutions I\u0026#8217;ve found had any combination of the following problems:\nNo cross-browser support:\u0026nbsp;Obviously, any acceptable solution needs to work across the major browsers.Limited to a single text field per page:\u0026nbsp;The solution needs to be flexible enough to allow multiple text fields on a page to either display the same suggestions, or display a completely different set of suggestions.Ease of use:\u0026nbsp;The solution needs to be simple to use, yet powerful enough to allow the designer to fairly easily modify the way the code works and change the look of the suggestions. With that in mind, I attempted to improve on an existing library. I started working with\u0026nbsp;this one, but pretty soon I realized that I would need to rewrite basically all the code. Below is a description of the code. In order to make this work, you will need to add the following to the\u0026nbsp;\u0026lt;head\u0026gt;\u0026nbsp;of your HTML page:\n\u0026lt;script language=\"javascript\" type=\"text/javascript\" src=\"autocomplete.js\"\u0026gt;\u0026lt;/script\u0026gt; The file referenced above can be downloaded here.\nIt\u0026#8217;s probably best to see what we\u0026#8217;re doing, so below is an example of a text field that uses the autocomplete code. It only auto-completes some text that starts with the letter\u0026nbsp;t, so make sure you type that as the first letter.\n\u0026nbsp;\nSuggests words after the user types in a T (ex: two, three )\nAssuming you have the autocomple.js file correctly included in the page, the way to populate the autocomple drop down is with the collowing code:\n\u0026lt;input type=\"text\" size=\"40\" autoComplete=\"mygroup1\" /\u0026gt; \u0026lt;script language=\"javascript\" type=\"text/javascript\"\u0026gt; autoComplete.Set(\"mygroup1\", new Array(\"two\", \"three\", \"twenty\", \"tweak\", \"tool\", \"two hundred\", \"testing\", \"two-thirds\", \"terran\", \"tomato\", \"tower\", \"twin\", \"task\", \"toolbar\", \"test\")); \u0026lt;/script\u0026gt; In order to demonstrate that this is flexible enough to support multiple text fields on the same page, here is another example of a text field, along with the code necessary to display it. Also, notice that I\u0026#8217;m creating a new \u0026#8220;group\u0026#8221;, which allows me to display different suggestions in the text field. If I wanted to, I could simply assign the same \u0026#8220;group\u0026#8221;, and this second text field would have identical suggestions to the one above.\n\u0026nbsp;\nSuggests words after the user types in a F (ex: four, five )\n\u0026lt;input type=\"text\" size=\"30\" autoComplete=\"mygroup2\" /\u0026gt; \u0026lt;script language=\"javascript\" type=\"text/javascript\"\u0026gt; autoComplete.Set(\"mygroup2\", new Array(\"four\", \"five\", \"fifty\", \"fast\", \"filip\", \"fun\", \"feast\", \"farse\", \"football\", \"fantasy\", \"fork\", \"fanta\", \"festival\", \"fall\", \"foo\")); \u0026lt;/script\u0026gt; Obviously, people will want to style the drop downs differently. The\u0026nbsp;autocomplete.js\u0026nbsp;file contains script which registers a default style, but it also allows you to pass in a style using the\u0026nbsp;autoComplete.Set()\u0026nbsp;method. In the example below, I\u0026#8217;ve created a new style, and assigned it by passing the class name of the style as the third parameter into the\u0026nbsp;Set()\u0026nbsp;method.\n\u0026nbsp;\nSuggests words after the user types in a A (ex: apple, art )\n\u0026lt;style type=\"text/css\"\u0026gt; .newPopupStyle { font-family:Verdana; font-size: 9pt; color:aqua; width: 150px; margin: 3px; background-color: Red; font-weight: bold; } .newPopupStyle div { top: -3px; left: -3px; background: brown; border: solid 1px blue; position: relative; overflow: auto; max-height: 100px; } .newPopupStyle span { cursor: default; margin: 2px; display: block; } .newPopupStyle span.wordSelected { background: yellow; color: Fuchsia; } \u0026lt;/style\u0026gt; \u0026lt;input type=\"text\" size=\"30\" autoComplete=\"mygroup3\" /\u0026gt; \u0026lt;script language=\"javascript\" type=\"text/javascript\"\u0026gt; autoComplete.Set(\"mygroup3\", new Array(\"apple\", \"aspen\", \"art\", \"artistic\", \"abracadabra\"), \"newPopupStyle\"); \u0026lt;/script\u0026gt; There is more you can do with the code. The javascript file is farily well documented, so hopefully if you need to change anything, it will be pretty straightforward. You can actually greatly reduce the size of the file if you remove the comments.\nKNOWN ISSUES:\nIf the margin of the body tag is not 0, the drop down will not render in the appropriate spot in IE. Apply a margin (ex: \u0026lt;body style=\u0026#8221;margin: 0;\u0026#8221;\u0026gt; ) to fix the problem. UPDATES:\nFeb. 25, 2009 – Fixed a problem in autocomplete.js.\u0026nbsp; It should now also work on Safari 4.0 beta. LICENSE:\nI have received a few questions about the license for this code.\u0026nbsp; You can use this code for any purpose, including commercial.\u0026nbsp; If you do find issues or bugs with the code, I do ask that you let me know so that I can put in a fix. ","permalink":"https://www.bloodforge.com/2008/11/flexible-autocomplete-suggested-words-code-for-text-input-fields-using-javascript/","summary":"\u003cp\u003e\u003cem\u003eThis post was written a long time ago, and since then many other great solutions have come out to accomplish this task. I have kept my post for historical reasons, but the files are no longer available and the code on the page  is no longer functional.\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eAs I\u0026#8217;m sure you\u0026#8217;ve seen on many websites, displaying suggestions while a user types text into a text field has become quite popular. However, I was rather disappointed with the solutions I\u0026#8217;ve found out there. The solutions I\u0026#8217;ve found had any combination of the following problems:\u003c/p\u003e","title":"Flexible AutoComplete (Suggested Words) Code for Text Input Fields using JavaScript"},{"content":"While writing some code for Silverlight, I realized that Silverlight does not include a PriorityQueue implementation in their libraries.\u0026nbsp; I searched around, but I couldn\u0026#8217;t find any code that I thought was decent, so I wrote up something pretty quick.\u0026nbsp; I\u0026#8217;ll be testing this some more in the near future, but for now, I think it has the basics.\u0026nbsp; This should be fairly quick for large collections, as the enqueue is logarithmic, while the dequeue is pretty much as fast as it can be.\nThe queue uses generics for both the priority and the data that is being queued. The only thing to keep in mind is that if you\u0026#8217;re creating your own type for priority, it must implement IComparable.\nusing System; using System.Collections.Generic; namespace bloodforge { public class PriorityQueue\u0026lt;P, T\u003e where P : System.IComparable\u0026lt;P\u003e { protected List\u0026lt;Queue\u0026lt;PriorityItem\u0026lt;P, T\u003e\u003e\u003e _queues; protected int _count; public PriorityQueue() { _queues = new List\u0026lt;Queue\u0026lt;PriorityItem\u0026lt;P, T\u003e\u003e\u003e(); _count = 0; } /// \u0026lt;summary\u003e /// Add an item to the priority queue /// \u0026lt;/summary\u003e public void Enqueue(P priority, T data) { if (_count == 0) { Queue\u0026lt;PriorityItem\u0026lt;P, T\u003e\u003e NewQueue = new Queue\u0026lt;PriorityItem\u0026lt;P, T\u003e\u003e(); NewQueue.Enqueue(new PriorityItem\u0026lt;P, T\u003e(priority, data)); _queues.Add(NewQueue); } else { QueueInsert(priority, data, 0, _queues.Count - 1); } _count++; } /// \u0026lt;summary\u003e /// Helper method for Enqueue /// \u0026lt;/summary\u003e private void QueueInsert(P priority, T data, int qLo, int qHi) { if (qLo == qHi) { // There is only one item left to compare. // Need to decide where this item belongs in relation to the last item. if (_queues\u0026#91;qLo].Peek().Priority.CompareTo(priority) \u0026lt; 0) { Queue\u0026lt;PriorityItem\u0026lt;P, T\u003e\u003e NewQueue = new Queue\u0026lt;PriorityItem\u0026lt;P, T\u003e\u003e(); NewQueue.Enqueue(new PriorityItem\u0026lt;P, T\u003e(priority, data)); _queues.Insert(qLo, NewQueue); return; } else if (_queues\u0026#91;qLo].Peek().Priority.CompareTo(priority) \u003e 0) { Queue\u0026lt;PriorityItem\u0026lt;P, T\u003e\u003e NewQueue = new Queue\u0026lt;PriorityItem\u0026lt;P, T\u003e\u003e(); NewQueue.Enqueue(new PriorityItem\u0026lt;P, T\u003e(priority, data)); _queues.Insert(qLo + 1, NewQueue); return; } else { _queues\u0026#91;qLo].Enqueue(new PriorityItem\u0026lt;P, T\u003e(priority, data)); return; } } else { // Get the middle item from the queue and see if we // need to go to the first or second half of the queues list int qMid = Convert.ToInt32(Math.Floor((qLo + qHi) / 2)); if (_queues\u0026#91;qMid].Peek().Priority.CompareTo(priority) \u0026lt; 0) { // This item belongs in the upper half of the range QueueInsert(priority, data, qLo, qMid); return; } else if (_queues\u0026#91;qMid].Peek().Priority.CompareTo(priority) \u003e 0) { // This item belongs in the lower half of the range QueueInsert(priority, data, qMid + 1, qHi); return; } else { // we got lucky, the middle item is of the same priority _queues\u0026#91;qMid].Enqueue(new PriorityItem\u0026lt;P, T\u003e(priority, data)); return; } } } /// \u0026lt;summary\u003e /// Remove the top item from the queue /// \u0026lt;/summary\u003e public T Dequeue() { if (_queues.Count == 0) { // There are no items in the priority queue return default(T); } // Get the first item from the first queue T data = _queues\u0026#91;0].Dequeue().Data; if (_queues\u0026#91;0].Count == 0) { // If the queue at the top priority is empty, remove it _queues.RemoveAt(0); } _count--; return data; } /// \u0026lt;summary\u003e /// Retrieves the top item from the queue without removing it /// \u0026lt;/summary\u003e public T Peek() { if (_queues.Count \u003e 0) { return _queues\u0026#91;0].Peek().Data; } else return default(T); } /// \u0026lt;summary\u003e /// Gets the number of items in the priority queue /// \u0026lt;/summary\u003e public int Count { get { return _count; } } /// \u0026lt;summary\u003e /// Returns a string representation of the queue /// \u0026lt;/summary\u003e public override string ToString() { string val = string.Empty; foreach(Queue\u0026lt;PriorityItem\u0026lt;P, T\u003e\u003e queue in _queues) { PriorityItem\u0026lt;P, T\u003e\u0026#91;] items = queue.ToArray(); foreach (PriorityItem\u0026lt;P, T\u003e item in items) { val += string.Format(\" \u0026#91; {0} ] \", item.Data.ToString()); } } return val.TrimEnd(','); } } public class PriorityItem\u0026lt;P, T\u003e where P : System.IComparable\u0026lt;P\u003e { public P Priority; public T Data; public PriorityItem(P priority, T data) { this.Priority = priority; this.Data = data; } } } ","permalink":"https://www.bloodforge.com/2008/10/c-priority-queue-implementation-for-silverlight/","summary":"\u003cp\u003eWhile writing some code for Silverlight, I realized that Silverlight does not include a PriorityQueue implementation in their libraries.\u0026nbsp; I searched around, but I couldn\u0026#8217;t find any code that I thought was decent, so I wrote up something pretty quick.\u0026nbsp; I\u0026#8217;ll be testing this some more in the near future, but for now, I think it has the basics.\u0026nbsp; This should be fairly quick for large collections, as the enqueue is logarithmic, while the dequeue is pretty much as fast as it can be.\u003c/p\u003e","title":"C# Priority Queue Implementation for Silverlight"},{"content":"I needed a pretty quick way of displaying file upload progress in a ASP.NET project.\u0026nbsp;In the past while working for a different employer, I\u0026#8217;ve written my own code from scratch, and it was a complete pain in the ass.\u0026nbsp; Fortunately, after doing a bit of searching, I\u0026#8217;ve ran across an open source control that works great.\u0026nbsp; The control is called NeatUpload and can be found at this URL:\nhttp://www.brettle.com/neatupload\n","permalink":"https://www.bloodforge.com/2008/10/very-nice-and-flexible-file-upload-control-with-progress/","summary":"\u003cp\u003eI needed a pretty quick way of displaying file upload progress in a ASP.NET project.\u0026nbsp;In the past while working for a different employer, I\u0026#8217;ve written my own code from scratch, and it was a complete pain in the ass.\u0026nbsp; Fortunately, after doing a bit of searching, I\u0026#8217;ve ran across an open source control that works great.\u0026nbsp; The control is called NeatUpload and can be found at this URL:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.brettle.com/neatupload\"\u003ehttp://www.brettle.com/neatupload\u003c/a\u003e\u003c/p\u003e","title":"Very nice and flexible file upload control with progress"},{"content":"While creating a page that used server side includes, I ran into some very strange behavior.\u0026nbsp; Right before each SSI, a blank line would appear on the page.\u0026nbsp; It didn\u0026#8217;t have anything to do with margins or padding.\u0026nbsp; It was just like an empty line appeared right out of nowhere, messing up the layout.\u0026nbsp; First, I thought it was some problem with IIS and SSI, but I couldn\u0026#8217;t find anything there.\nAfter a few hours of frustration and trying the weirdest solutions I could think of, I started playing around with saving the include files with different file names.\u0026nbsp;Well, when I got to the *.txt, I noticed that Visual Studio gives me a new option under \u0026#8220;Save As\u0026#8221;\u0026#8230; its \u0026#8220;Advanced Save Options\u0026#8221;.\u0026nbsp;When I looked at the encoding of the file, it was set to \u0026#8220;Unicode (UTF-8 with signature)\u0026nbsp;\u0026#8211; Codepage 65000\u0026#8221;.\u0026nbsp; I then switched to \u0026#8220;Unicode (UTF-8 without signature) \u0026#8211; Codepage 65001\u0026#8221;, and the blank lines disappeared.\u0026nbsp;\nIt appears that Visual Studio picks an encoding when saving pages that doesn\u0026#8217;t really produce desirable effects when using server side includes.\u0026nbsp; However, you can go to File -\u0026gt; Advanced Save Options and select a different\u0026nbsp;encoding.\u0026nbsp; I\u0026#8217;m not sure how to set the one w/o signature as the default yet, but hopefully soon I\u0026#8217;ll figure that out 🙂\n","permalink":"https://www.bloodforge.com/2008/08/server-side-includes-ssi-adding-a-blank-empty-line-to-html-page/","summary":"\u003cp\u003eWhile creating a page that used server side includes, I ran into some very strange behavior.\u0026nbsp; Right before each SSI, a blank line would appear on the page.\u0026nbsp; It didn\u0026#8217;t have anything to do with margins or padding.\u0026nbsp; It was just like an empty line appeared right out of nowhere, messing up the layout.\u0026nbsp; First, I thought it was some problem with IIS and SSI, but I couldn\u0026#8217;t find anything there.\u003c/p\u003e","title":"Server Side Includes (SSI) adding a blank/empty line to HTML page"},{"content":"I\u0026#8217;ve ran into issues using the WebService object in Flash.\u0026nbsp; The thing is incredibly buggy.\u0026nbsp; In certain cases, it works just fine, but in other cases, it flat out does not work. In my last case, the web service loaded perfectly fine (onLoad was called), but the PendingCall would not return anything.\u0026nbsp; The onFault method was never called after I invoked my web service call, but the web service never returned either.\u0026nbsp; Examining the outgoing messages from Flash (using HTTP headers in Firefox)\u0026nbsp;revealed that Flash was never even attempting to call the web service.\u0026nbsp; Flash did correctly acquire the crossdomain.xml file (which allowed access from all domains), and it did load the WSDL.\u0026nbsp; But, for whatever reason, it did not call the web method like it was supposed to.\nWell, after a few hours or attempging to make this work, I gave up with the WebService object.\u0026nbsp; Instead, I went to the LoadVars object, something I\u0026#8217;m more confident in than the WebService class, simply due to the fact that it has been around much longer and has had more attention from the Adobe / Macromedia team.\nUsing the WebService object, my code looked like the following:\nvar _wsdl:String = \"http://www.bloodforge.com/webservice.asmx?WSDL\"; // \u0026lt;- this is fake for the purpose of this blog var MailService:WebService = new WebService(_wsdl); MailService.onLoad = function() { var MailServiceResult:PendingCall = MailService.MyMethod(\"my parameters\"); MailServiceResult.onFault = function(fault) { trace(\"it never gets here even though it fails!\"); } MailServiceResult.onResult = function(result) { trace(\"it never got here either!\"); } } The above was replaced with the code below, and it works perfectly fine: var result_lv:LoadVars = new LoadVars(); result_lv.onData = function(responseStr:String) { if(responseStr == undefined) { trace(\"Error occurred!\"); } else { trace(\"Success... parse my data below...\"); } } var send_lv:LoadVars = new LoadVars(); send_lv.myWebServiceParam1 = \"param 1\"; send_lv.myWebServiceParam2 = \"param 2\"; send_lv.sendAndLoad(\"http://www.bloodforge.com/webservice.asmx/MyMethod\", result_lv, \"POST\"); Oh, and make sure that if you do this with your web service, that you have the following line in your web.config file. Otherwise, you won\u0026#8217;t be able to access it using these methods (you should be familiar w/ it anyways if you use Ajax to call web services). \u0026lt;webServices\u003e \u0026lt;protocols\u003e \u0026lt;add name=\"HttpGet\"/\u003e \u0026lt;add name=\"HttpPost\"/\u003e \u0026lt;/protocols\u003e \u0026lt;/webServices\u003e ","permalink":"https://www.bloodforge.com/2008/08/using-loadvars-sendandload-instead-of-webservice-when-calling-web-services-with-flash-actionscript/","summary":"\u003cp\u003eI\u0026#8217;ve ran into issues using the WebService object in Flash.\u0026nbsp; The thing is incredibly buggy.\u0026nbsp; In certain cases, it works just fine, but in other cases, it flat out does not work. In my last case, the web service loaded perfectly fine (onLoad was called), but the PendingCall would not return anything.\u0026nbsp; The onFault method was never called after I invoked my web service call, but the web service never returned either.\u0026nbsp; Examining the outgoing messages from Flash (using HTTP headers in Firefox)\u0026nbsp;revealed that Flash was never even attempting to call the web service.\u0026nbsp; Flash did correctly acquire the crossdomain.xml file (which allowed access from all domains), and it did load the WSDL.\u0026nbsp; But, for whatever reason, it did not call the web method like it was supposed to.\u003c/p\u003e","title":"Using LoadVars sendAndLoad instead of WebService when calling web services with Flash ActionScript"},{"content":"We had a rather silly argument at work today.\u0026nbsp;A co-worker claimed that electronic drums are not drums, but something entirely different.\u0026nbsp;Now, I generally don\u0026#8217;t post about all the silly arguments we have at work (there\u0026#8217;s a new one every day it seems), but this one just is way over the top in my mind.\nMy first method of argument was, basically, that the term \u0026#8220;electronic\u0026#8221; (or electric, I consider those to be the same in this particular context) is simply an adjective that describes something.\u0026nbsp; So, just like all red robins are a subset of robins, electronic drums are a subset of drums.\u0026nbsp; However, this was not satisfactory, and the co-worker brought up the term \u0026#8220;straw man\u0026#8221;.\u0026nbsp; He stated that a straw man is not actually a man.\u0026nbsp; Fine, I\u0026#8217;ll give him this, although it is certainly a rather weak argument since the context must be entirely different for this to be valid.\nNext up was\u0026nbsp;dictionary.com\u0026#8217;s definition of a drum\u0026nbsp;(his source, not mine, but I\u0026#8217;m more than happy to work with that).\u0026nbsp; There are several definitions for drums on that page, but my co-worker decided that the first one must be used (never mind the fact that if we took the first definition of \u0026#8220;straw man\u0026#8221; would actually mean that \u0026#8220;straw man\u0026#8221; are a subset of \u0026#8220;men\u0026#8221;*).\u0026nbsp; Well, electronic drums fit basically the entire definition, with one\u0026nbsp;possible\u0026nbsp;exception:\u0026nbsp;with a tightly stretched membrane, or head.\u0026nbsp; Now, if you would assume that a drum head must be a tightly stretched membrane, then that definition would exclude electronic drums.\u0026nbsp; However, that\u0026#8217;s a rather silly assumption.\u0026nbsp; I suppose that would mean that the\u0026nbsp;drum heads that guitar center sells for electronic drums\u0026nbsp;must be imaginary \u0026#8211; or something like that.\u0026nbsp; Not to mention that many other drums, such as\u0026nbsp;slit drums,\u0026nbsp;log drums, etc, would not actually be drums.\nWhy is it so important to exclude every other definition of a drum other than the first one from dictionary.com?\u0026nbsp; Because if you were to take other definitions into account, electronic drums would most certainly be covered.\u0026nbsp; There are also\u0026nbsp;other places\u0026nbsp;that support the concept that drums are not simply something that must have a membrane, but instead may be something which is designed to resemble a drum.\u0026nbsp;But, of course, these definitions must be ignored for some reason.\nThere\u0026#8217;s a very good saying that\u0026#8217;s worth bringing up:\u0026nbsp;If a bird looks like a duck, swims like a duck and quacks like a duck, then it probably is a duck.\u0026nbsp;Apply that to electronic drums, and its pretty obvious if they\u0026#8217;re drums or not.\n\u0026nbsp;* note to self: in the future, when someone randomly decides to pick certain definitions out of a dictionary and randomly rejects others, just stop the argument there, because it will go nowhere\n","permalink":"https://www.bloodforge.com/2008/07/can-electronic-drums-be-classified-as-drums/","summary":"\u003cp\u003eWe had a rather silly argument at work today.\u0026nbsp;A co-worker claimed that electronic drums are not drums, but something entirely different.\u0026nbsp;Now, I generally don\u0026#8217;t post about all the silly arguments we have at work (there\u0026#8217;s a new one every day it seems), but this one just is way over the top in my mind.\u003c/p\u003e\n\u003cp\u003eMy first method of argument was, basically, that the term \u0026#8220;electronic\u0026#8221; (or electric, I consider those to be the same in this particular context) is simply an adjective that describes something.\u0026nbsp; So, just like all red robins are a subset of robins, electronic drums are a subset of drums.\u0026nbsp; However, this was not satisfactory, and the co-worker brought up the term \u0026#8220;straw man\u0026#8221;.\u0026nbsp; He stated that a straw man is not actually a man.\u0026nbsp; Fine, I\u0026#8217;ll give him this, although it is certainly a rather weak argument since the context must be entirely different for this to be valid.\u003c/p\u003e","title":"Can electronic drums be classified as drums?"},{"content":"It has been 6 days since my\u0026nbsp;nJoy Electronic Cigarette Review (Part 1). My biggest complaint in that review was the price of the refill cartiges.\u0026nbsp; Thanks to some help from very kind people at the\u0026nbsp;e-cigarette-forum.com, I found out that e-liquid (smoke juice, whatever you want to call it) is actually available for purchase.\u0026nbsp; A couple sites that offer it, such as\u0026nbsp;ePuffer\u0026nbsp;and\u0026nbsp;e-cig; however, both were out of stock (after researching this some more, I found out that e-cig.com has temporarily suspended shipping due to the Olympics and tightened security for sending liquids \u0026#8211; they\u0026#8217;re based in China).\u0026nbsp; Well, fortunately, we have eBay, and I was able to purchase my very first bottle of the liquid.\nMy smoke juice refill station I\u0026#8217;ve taken a picture (courtesy of my brand new Nikon D40 ) of the whole setup.\u0026nbsp; Basically, refilling was pretty simple.\u0026nbsp; I just put on some latex gloves, took out the little filter-like things and put some liquid on them.\u0026nbsp; I tried not to put too much, because I certainly don\u0026#8217;t want to be drinking the stuff as it could possibly leak through the little hole.\u0026nbsp; Just make sure you do this on something that doesn\u0026#8217;t stain, as this stuff doesn\u0026#8217;t look like it would come out easily.\u0026nbsp; Granite countertops worked just fine for me.\u0026nbsp; After refilling the cartiges, I just wiped off the mouthpiece and placed the refills into the little cases that they originally came in.\nAs for the electronic cigarette itself, I\u0026#8217;ve found that the high nicotine cartiges work best for me.\u0026nbsp; Keep in mind, I\u0026#8217;m not all that into nicotine \u0026#8211; I\u0026#8217;ve gotten poisoned from patches before \u0026#8211; but the medium and low refills just don\u0026#8217;t have that much at all.\u0026nbsp; Also, the claim that these things last as long as a pack of cigarettes is rather silly.\u0026nbsp; I go through more than one of these per day, and I didn\u0026#8217;t even smoke a pack of cigs that quickly.\u0026nbsp; Theoretically, I suppose it is possible for these to last for that long, but it would just not be enjoyable to try to get that last puff of smoke from a cartige (something that does seem to work is flipping the filter insert around when smoke starts to decrease, but it still doesn\u0026#8217;t last too long after that).\nWhen I started this little adventure, I had about half a pack of cigarettes left.\u0026nbsp; I\u0026#8217;ve basically cut down to 1-2 cigs per day, and I ran out of smokes two days ago.\u0026nbsp; I haven\u0026#8217;t really had the need to buy another pack, as this electronic cigarette is doing its job for me so far.\u0026nbsp; I have noticed that my smoking habits are slightly different than before with the electronic cigarette, however.\u0026nbsp; Whereas before I would generally smoke at some intervals (like once every 90 min or so), I find myself taking a few puffs of this cigarette every 10-20 min.\u0026nbsp; So, basically, not as much at once, but since this doesn\u0026#8217;t burn out, there\u0026#8217;s nothing I need to \u0026#8220;finish\u0026#8221;.\nIn a week and a half I\u0026#8217;ll be going to Europe for a couple weeks for vacation.\u0026nbsp; I don\u0026#8217;t have a charger for this thing that works with European plugs + voltage, so I\u0026#8217;m kind of hoping that I can take this thing on the plane, and then I can use my spare battery for the trip back.\u0026nbsp; While abroad, I\u0026#8217;ll just buy my cigarettes over there. I feel kind of comfortable doing that considering how easy it was for me to basically cut down (and maybe even stop) smoking real cigarettes in the last few days.\u0026nbsp; Also, my favorite cigarettes are sold everywhere over there (L\u0026amp;M Lights), and I can\u0026#8217;t find these anywhere where I live in Cincinnati.\n","permalink":"https://www.bloodforge.com/2008/07/njoy-electronic-cigarette-review-part-2/","summary":"\u003cp\u003eIt has been 6 days since my\u0026nbsp;\u003ca href=\"http://bloodforge.com/post/nJoy-Electronic-Cigarette-Review-Part-1.aspx\"\u003enJoy Electronic Cigarette Review (Part 1)\u003c/a\u003e. My biggest complaint in that review was the price of the refill cartiges.\u0026nbsp; Thanks to some help from very kind people at the\u0026nbsp;\u003ca href=\"http://www.e-cigarette-forum.com/forum/electronic-cigarette-reviews/602-njoy-review-13.html\" target=\"_blank\" rel=\"noreferrer noopener\"\u003ee-cigarette-forum.com\u003c/a\u003e, I found out that e-liquid (smoke juice, whatever you want to call it) is actually available for purchase.\u0026nbsp; A couple sites that offer it, such as\u0026nbsp;\u003ca href=\"http://www.epuffer.com/\" target=\"_blank\" rel=\"noreferrer noopener\"\u003eePuffer\u003c/a\u003e\u0026nbsp;and\u0026nbsp;\u003ca href=\"https://e-cig.com/\" target=\"_blank\" rel=\"noreferrer noopener\"\u003ee-cig\u003c/a\u003e; however, both were out of stock (after researching this some more, I found out that e-cig.com has temporarily suspended shipping due to the Olympics and tightened security for sending liquids \u0026#8211; they\u0026#8217;re based in China).\u0026nbsp; Well, fortunately, we have eBay, and I was able to purchase my very first bottle of the liquid.\u003c/p\u003e","title":"nJoy Electronic Cigarette Review (Part 2)"},{"content":"A week or so ago I ordered the nJoy electronic cigarette.\u0026nbsp; I\u0026#8217;ve tried to quit smoking before, and although I had no problems stopping (apart from the 1-2 day nicotine withdrawal), I\u0026#8217;ve always felt like starting up again because the thing I was really addicted to doing was the action of smoking.\u0026nbsp; Well, over lunch one day I heard someone talking about electronic cigarettes, so I decided to look it up.\u0026nbsp; The fact that these seem to be relatively harmless (no tobacco, tar, carcinogens, etc.) was very appealing, and I could fulfill my desire to actually inhale something. In the past, I\u0026#8217;ve tried nicotine patches (I actually got poisoned from one), but as I pointed out before, the thing I miss most when I stop smoking is the actual action of smoking, not the nicotine itself, so, needless to say, the patch didn\u0026#8217;t work.\nfrom left to right: Marlboro Ultra Light 100, pen, nJoy cigarette, pencil After doing some reading online, I decided on ordering the nJoy cigarette and a pack of medium refills. The first thing that really struck me was how big this thing was.\u0026nbsp; I\u0026#8217;ve taken a picture of the device with some things to compare it to, since I didn\u0026#8217;t really find that anywhere online before I placed my order.\nApart from the size, the other thing I didn\u0026#8217;t really like was my color choice.\u0026nbsp; If I were to order again, I would probably choose the black model.\u0026nbsp; When I ordered, I thought I would get white since it would match the white Marlboro Ultra Lights 100s that I smoked.\u0026nbsp; Well, since this thing doesn\u0026#8217;t even closely resemble a cigarette, I would suggest going with the black instead.\u0026nbsp; But, of course, everyone has their own preferences.\u0026nbsp;\nBesides the looks of this thing, I do have to say I\u0026#8217;m pretty pleased with it.\u0026nbsp; It actually gives you the sensation of smoking, and the fact that I can do it indoors without bothering anyone is a very nice plus.\u0026nbsp; I still like to go outside and \u0026#8220;smoke\u0026#8221; sometimes since it provides a nice break from the desk, but at least when it is raining (and in the winter, when it is cold), it is good to know that I can remain indoors.\u0026nbsp;\nThe taste of the smoke is not too different from the Ultra Lights I smoked, but that\u0026#8217;s really not saying much, since these certainly lack the taste of stronger cigarettes.\u0026nbsp; I haven\u0026#8217;t tried the \u0026#8220;High\u0026#8221; refill yet ( my nJoy package came with a high, medium, low, and \u0026#8220;no\u0026#8221; nicotine refill), so I can\u0026#8217;t really comment on the taste of that, but I can say that if you smoke Marlboro Ultra Lights (or anything similar), you probably won\u0026#8217;t be terribly disappointed with the taste.\u0026nbsp; It isn\u0026#8217;t exactly the same, but it certainly is a better replacement than nothing.\nI\u0026#8217;ve gone back to my cigarettes a few times, mostly out of habit, but I can see myself quitting smoking actual cigarettes by using this as a replacement.\u0026nbsp; It, in my opinion, is a suitable alternative to smoking if your addiction was to doing something with your hands and inhaling smoke.\nMy biggest complaint with the nJoy cigarette is the price of the refills.\u0026nbsp; Although they try to make it slightly less than buying regular cigarettes, it still seems like a rip-off.\u0026nbsp; Basically, the refill consists of the mouthpiece, along with some cotton (or plastic fibers, I\u0026#8217;m not sure what it is) soaked in their nicotine-containing substance.\u0026nbsp; There\u0026#8217;s really no reason why we shouldn\u0026#8217;t be able to purchase a bottle of this substance and do our own refills this way.\u0026nbsp; There would be several advantages to doing this, such as being able to adjust the taste ourselves, and of course the price.\u0026nbsp; Since there isn\u0026#8217;t too much liquid in each refill, a bottle should last for a very long time, and it could come out to be significantly cheaper than paying $25 for a week\u0026#8217;s\u0026#8217; worth of refills.\n","permalink":"https://www.bloodforge.com/2008/07/njoy-electronic-cigarette-review-part-1/","summary":"\u003cp\u003eA week or so ago I ordered the nJoy electronic cigarette.\u0026nbsp; I\u0026#8217;ve tried to quit smoking before, and although I had no problems stopping (apart from the 1-2 day nicotine withdrawal), I\u0026#8217;ve always felt like starting up again because the thing I was really addicted to doing was the action of smoking.\u0026nbsp; Well, over lunch one day I heard someone talking about electronic cigarettes, so I decided to look it up.\u0026nbsp; The fact that these seem to be relatively harmless (no tobacco, tar, carcinogens, etc.) was very appealing, and I could fulfill my desire to actually inhale something. In the past, I\u0026#8217;ve tried nicotine patches (I actually got poisoned from one), but as I pointed out before, the thing I miss most when I stop smoking is the actual action of smoking, not the nicotine itself, so, needless to say, the patch didn\u0026#8217;t work.\u003c/p\u003e","title":"nJoy Electronic Cigarette Review (Part 1)"},{"content":"Well, I finally downloaded IE8 to see how some of the sites I\u0026#8217;ve worked on behave.\u0026nbsp; Most things work just fine, however, I did find a pretty significant problem with the AjaxControlToolkit.\nI\u0026#8217;ve been using the Tab control quite a bit, and I noticed that, when switching between tabs, the new tab was not showing up.\u0026nbsp; The old tab was hiding, though\u0026#8230;\u0026nbsp;\nDebugging has led me to the setVisible method located in \u0026#8220;Common/Common.js\u0026#8221; in the AjaxControlToolkit.\u0026nbsp; Specifically, the problem existed in the following code:\nif (element \u0026amp;\u0026amp; value != $common.getVisible(element)) { if (value) { if (element.style.removeAttribute) { element.style.removeAttribute(\"display\"); } else { element.style.removeProperty(\"display\"); } } else { element.style.display = 'none'; } element.style.visibility = value ? 'visible' : 'hidden'; } In the above code, removeAttribute() was being called, but the display attribute remained (display=none).\u0026nbsp; I looked up the\u0026nbsp;removeAttribute method, and it does return a boolean value indicating if the method was successful or not.\u0026nbsp; Well, as it turns out, the method (for whatever reason) is not successul in IE8!\nI\u0026#8217;m not sure why this fails in IE8, but it does cause a problem.\u0026nbsp; Fortunately, there\u0026#8217;s a pretty quick fix to this:\nif (element \u0026amp;\u0026amp; value != $common.getVisible(element)) { if (value) { if (element.style.removeAttribute) { if(!element.style.removeAttribute(\"display\")) { element.style.display = ''; } } else { element.style.removeProperty(\"display\"); } } else { element.style.display = 'none'; } element.style.visibility = value ? 'visible' : 'hidden'; } ","permalink":"https://www.bloodforge.com/2008/06/ie8-and-ajaxcontroltoolkit-visibility-bug/","summary":"\u003cp\u003eWell, I finally downloaded IE8 to see how some of the sites I\u0026#8217;ve worked on behave.\u0026nbsp; Most things work just fine, however, I did find a pretty significant problem with the AjaxControlToolkit.\u003c/p\u003e\n\u003cp\u003eI\u0026#8217;ve been using the Tab control quite a bit, and I noticed that, when switching between tabs, the new tab was not showing up.\u0026nbsp; The old tab was hiding, though\u0026#8230;\u0026nbsp;\u003c/p\u003e\n\u003cp\u003eDebugging has led me to the setVisible method located in \u0026#8220;Common/Common.js\u0026#8221; in the AjaxControlToolkit.\u0026nbsp; Specifically, the problem existed in the following code:\u003c/p\u003e","title":"IE8 and AjaxControlToolkit – Visibility bug"},{"content":"I ran into a weird problem today.\u0026nbsp; I needed to escape a string in c# in such a way as to be able to unescape() it later with JavaScript into the original string.\u0026nbsp; JavaScript has an escape() method that is able to do this, but since I\u0026#8217;m writing the code in C#, I can\u0026#8217;t really access that method.\u0026nbsp; At first, I looked into HttpServerUtility.UrlEncode() and the HttpServerUtility.HtmlEncode() methods, but those are not equivalent to JavaScript\u0026#8217;s escape() method.\u0026nbsp;\nHowever, it seems Microsoft has put in a library which gives us access to JavaScript methods ( whether this is simply mimicking what JavaScript does or if it actually uses JavaScript\u0026#8230; I could really care less).\u0026nbsp; All that was needed is a reference to Microsoft.JScript in the project, and I was able to call the Microsoft.JScript.GlobalObject.escape() method, and it produces the exact same output as the JavaScript version.\n","permalink":"https://www.bloodforge.com/2008/06/using-javascript-methods-in-c/","summary":"\u003cp\u003eI ran into a weird problem today.\u0026nbsp; I needed to escape a string in c# in such a way as to be able to unescape() it later with JavaScript into the original string.\u0026nbsp; JavaScript has an escape() method that is able to do this, but since I\u0026#8217;m writing the code in C#, I can\u0026#8217;t really access that method.\u0026nbsp; At first, I looked into HttpServerUtility.UrlEncode() and the HttpServerUtility.HtmlEncode() methods, but those are not equivalent to JavaScript\u0026#8217;s escape() method.\u0026nbsp;\u003c/p\u003e","title":"Using JavaScript methods in C#"},{"content":" Programming JavaScript can be fun, but sometimes when I get errors like this it can get a little frustrating\u0026#8230; It happened on the following line, where the variable \u0026#8216;o\u0026#8217; was null: o.onmousedown = Drag.start; ","permalink":"https://www.bloodforge.com/2008/05/microsoft-jscript-runtime-error-null-is-null-or-not-an-object/","summary":"\u003cp\u003e Programming JavaScript can be fun, but sometimes when I get errors like this it can get a little frustrating\u0026#8230; \u003c/p\u003e\n\u003cfigure class=\"wp-block-image size-large\"\u003e\u003cimg loading=\"lazy\" width=\"527\" height=\"235\" src=\"/wp-content/uploads/2020/02/jserror.jpg\" alt=\"\" class=\"wp-image-24\" srcset=\"/wp-content/uploads/2020/02/jserror.jpg 527w, /wp-content/uploads/2020/02/jserror-300x134.jpg 300w\" sizes=\"(max-width: 527px) 100vw, 527px\" /\u003e\u003c/figure\u003e\n\u003cp\u003e It happened on the following line, where the variable \u0026#8216;o\u0026#8217; was null: \u003c/p\u003e\n\u003cpre class=\"wp-block-code\"\u003e\u003ccode\u003eo.onmousedown = Drag.start;\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003c/p\u003e","title":"Microsoft JScript runtime error: ‘null’ is null or not an object"},{"content":"I\u0026#8217;m not sure why Adobe makes it so hard to install the flash player with a MSI.\u0026nbsp; By going to adobe.com and clicking on the \u0026#8220;Get Flash Player\u0026#8221; link, it will direct you to a page that automatically will attempt to install Flash in IE.\u0026nbsp; I needed a MSI because I needed to install Flash on a machine with restricted internet access.\u0026nbsp; Fortunately, even though they don\u0026#8217;t advertise it, you can get a standalone installer for IE as well\u0026#8230;\nhttp://fpdownload.macromedia.com/get/flashplayer/current/licensing/win/install_flash_player_active_x.msi\n","permalink":"https://www.bloodforge.com/2008/05/flash-standalone-installer-for-internet-explorer-ie-msi/","summary":"\u003cp\u003eI\u0026#8217;m not sure why Adobe makes it so hard to install the flash player with a MSI.\u0026nbsp; By going to adobe.com and clicking on the \u0026#8220;Get Flash Player\u0026#8221; link, it will direct you to a page that automatically will attempt to install Flash in IE.\u0026nbsp; I needed a MSI because I needed to install Flash on a machine with restricted internet access.\u0026nbsp; Fortunately, even though they don\u0026#8217;t advertise it, you can get a standalone installer for IE as well\u0026#8230;\u003c/p\u003e","title":"Flash standalone installer for internet explorer (IE MSI)"},{"content":"We\u0026#8217;ve had a request from a client to build a Windows Vista Sidebar Gadget. The background on the gadget is to be somewhat see-through. So I\u0026#8217;ve played around with gadgets, and noticed that when I make a semi-transparent background on the gadget, the font color gets all messed up. For example, I wanted white text on a blue background with 50% opacity, and the font appeared blueish, even though it was supposed to be white. If I turn off the opacity on the background, the font becomes white, but as long as there\u0026#8217;s opacity, the font is messed up.\nWell, after doing some research, it appears there is a way to display the proper font color on transparent backgrounds, although I didn\u0026#8217;t find this anywhere on the Microsoft site.\u0026nbsp; The trick is to use JavaScript and the addTextObject() method.\u0026nbsp; Here\u0026#8217;s an example of some code, and the resulting gadget:\n\u0026lt;html\u003e \u0026lt;head\u003e \u0026lt;title\u003eSample Gadget\u0026lt;/title\u003e \u0026lt;style\u003e body { width: 120px; height: 200px; font-size: 12px; margin: 0; font-family: Verdana; color: #FFFFFF; } .gadget { margin: 3px; } \u0026lt;/style\u003e \u0026lt;/head\u003e \u0026lt;body\u003e \u0026lt;div class=\"gadget\"\u003e \u0026lt;div\u003eThis text is not white.\u0026lt;/div\u003e \u0026lt;/div\u003e \u0026lt;g:background id=\"background\" src=\"images\\bgblue.png\" style=\"width:100%;height:100%;z-index: -1; position: absolute; top: 0; left: 0;\" opacity=\"50\"\u003e\u0026lt;/g:background\u003e \u0026lt;script language=\"javascript\" type=\"text/javascript\"\u003e document.getElementById(\"background\").addTextObject(\"This text is white.\", \"Verdana\", 12, \"white\", 3, 50); \u0026lt;/script\u003e \u0026lt;/body\u003e \u0026lt;/html\u003e ","permalink":"https://www.bloodforge.com/2008/05/vista-sidebar-gadget-transparent-backgrounds-and-font-color/","summary":"\u003cp\u003eWe\u0026#8217;ve had a request from a client to build a Windows Vista Sidebar Gadget.  The background on the gadget is to be somewhat see-through.  So I\u0026#8217;ve played around with gadgets, and noticed that when I make a semi-transparent background on the gadget, the font color gets all messed up.  For example, I wanted white text on a blue background with 50% opacity, and the font appeared blueish, even though it was supposed to be white.  If I turn off the opacity on the background, the font becomes white, but as long as there\u0026#8217;s opacity, the font is messed up.\u003c/p\u003e","title":"Vista Sidebar Gadget, Transparent Backgrounds, and Font Color"},{"content":"I got this annoying error recently in a website I\u0026#8217;ve been working on.\u0026nbsp; It worked perfectly fine locally, it worked fine after uploading to the web server on my machine and other machines in the lab (various browsers).\u0026nbsp; Then, it turns out, it doesn\u0026#8217;t work on (one of) the client\u0026#8217;s machines.\u0026nbsp; Of course, I\u0026#8217;m unable to replicate the error locally.\nI looked around and it seems the first solution was to clear the cache.\u0026nbsp; A lot of people said that Ctrl+F5 works, others said they needed to manually clear the cache and then restart the browser.\u0026nbsp; Well, neither of those worked.\nFortunatelly, the solution turned out to be pretty easy:\u0026nbsp; Set the \u0026#8220;CombineScripts\u0026#8221; property of the ToolkitScriptManager to false.\n\u0026nbsp;\u0026lt;ajaxToolkit:ToolkitScriptManager\u0026nbsp;runat=\u0026#8221;server\u0026#8221;\u0026nbsp;ID=\u0026#8221;ajaxScriptManager\u0026#8221;\u0026nbsp;EnablePartialRendering=\u0026#8221;true\u0026#8221;\u0026nbsp;CombineScripts=\u0026#8221;false\u0026#8221;\u0026nbsp;/\u0026gt;\n","permalink":"https://www.bloodforge.com/2008/05/ajaxcontroltoolkit-is-undefined-javascript/","summary":"\u003cp\u003eI got this annoying error recently in a website I\u0026#8217;ve been working on.\u0026nbsp; It worked perfectly fine locally, it worked fine after uploading to the web server on my machine and other machines in the lab (various browsers).\u0026nbsp; Then, it turns out, it doesn\u0026#8217;t work on (one of) the client\u0026#8217;s machines.\u0026nbsp; Of course, I\u0026#8217;m unable to replicate the error locally.\u003c/p\u003e\n\u003cp\u003eI looked around and it seems the first solution was to clear the cache.\u0026nbsp; A lot of people said that Ctrl+F5 works, others said they needed to manually clear the cache and then restart the browser.\u0026nbsp; Well, neither of those worked.\u003c/p\u003e","title":"‘AjaxControlToolkit’ is undefined (javascript)"},{"content":"Well, after a few years of doing absolutely nothing with this site, I\u0026#8217;ve decided to bring it up again.\u0026nbsp; Not sure what I\u0026#8217;m going to use it for yet, but I think I\u0026#8217;ll be posting some annoying bugs I\u0026#8217;m running into along with other information that probably no one in the world really cares about.\u0026nbsp; But its fun.\u0026nbsp;\nAlso, amazingly, a few days after I activated this domain again, I\u0026#8217;ve noticed some people already visited this site\u0026#8230; at first I thought it was some random stuff, but these visits were from South Bend, Granger, etc\u0026#8230; strange, but neat at the same time.\n","permalink":"https://www.bloodforge.com/2008/05/and-bloodforge-is-up-again/","summary":"\u003cp\u003eWell, after a few years of doing absolutely nothing with this site, I\u0026#8217;ve decided to bring it up again.\u0026nbsp; Not sure what I\u0026#8217;m going to use it for yet, but I think I\u0026#8217;ll be posting some annoying bugs I\u0026#8217;m running into along with other information that probably no one in the world really cares about.\u0026nbsp; But its fun.\u0026nbsp;\u003c/p\u003e\n\u003cp\u003eAlso, amazingly, a few days after I activated this domain again, I\u0026#8217;ve noticed some people already visited this site\u0026#8230; at first I thought it was some random stuff, but these visits were from South Bend, Granger, etc\u0026#8230; strange, but neat at the same time.\u003c/p\u003e","title":"And Bloodforge is up again…"}]