I have begun a YouTube channel called Homespun Effects. I will show my process of creating guitar effect pedals from schematic to finished product.
Check out the site and visit the YouTube channel.
I have begun a YouTube channel called Homespun Effects. I will show my process of creating guitar effect pedals from schematic to finished product.
Check out the site and visit the YouTube channel.
I’ve always wanted to make a career in computers. It’s been 32 years since I got my first computer, a TI-99/4A, and taught myself BASIC and Extended BASIC.
I’ve done a number of other jobs between then and my web programming gig. This marks the end of my sixth season of going back to nature. Back to tending to lawns for the fine folks of my city. I’ve got to say, I’ve never been happier.
I can’t imagine going back to sitting behind this keyboard and staring at this screen all day for money. I may still work a few programming jobs during the off-season but I do believe that I’d actually enjoy delivering pizzas more.
I’ve been rather happy with ASP.NET and especially with ASP.NET MVC. I’ve got to say that C# and especially Linq is just a plain pleasure to use. I have no issues with the programming side. Ever since I’ve gone from running my own Windows Server to using shared hosting it’s been one headache after another. Getting permissions set on a folder is like pulling teeth. Getting the host to set trust levels is more teeth pulling. Have an issue with a web app? I’m running out of teeth!
Comparing PHP to C# is sort of laughable. I really don’t like the syntax. I’ve actually gone so far as to avoid PHP by trying Ruby on Rails because it was suggested because the MVC architecture is supposedly similar to ASP.NET MVC. I’ve got to say that Ruby on Rails is just one hot mess. I can’t stand using any of the editors and using the console to generate a simple controller takes so long that I lose interest by the time it’s ready. The “Ruby way” is just nuts, too. The ability or desirability of putting the condition at the end makes absolutely zero sense. What is the difference between “if this occurs, do this” and “do this if this occurs”? Asking for help about Ruby on Rails online is like shouting in the desert. All the forums are dead. No replies. It was once suggested that I get on IRC for Ruby on Rails help. Really? IRC? Maybe I should just hook up a CB Radio while I’m at it. Better brush up on my ten-code.
I currently pay for shared hosting on an Apache server and I’ve had maybe 2 issues totaling half an hour, if that. My shared Windows server constantly gives up and shuts down AppPools refusing to spool them up in a timely fashion. Getting crawled by Google and Bing at the same time just brings the server to it’s knees and I get emailed error reports at least weekly.
Basically, I’ve traded my “WHAT IN BLAZES” moments in programming for “WHAT IN BLAZES” moments in hosting. I can control my confusing moments so I’m strongly considering getting back into PHP and leaving the issues behind. I’ve been fighting it because of all the time and money invested in learning .NET and purchasing Visual Studio but I think in the long run to cut the Windows Server service and go back to Apache will make more sense.
I’ve got to give Microsoft a whole lot of kudos for Visual Studio. It really is that good. They also deserve applause for LINQ, it’s wonderful. In the end though, if I can’t keep a site rolling properly, and I can’t easily add a site to the block list (.htaccess makes this so very simple) then I’m just going to say goodbye and take the other path and relax.
I helped a friend set up his Shoutcast server for his web site. It was a fun project and I really enjoyed it. I may have to install one for myself one of these days. 🙂
Check out Polish New Castle for polka goodness 24 hours per day. 🙂
Adding strongly typed objects to javascript is now simple to achieve and instead of adding javascript to the <head> in your master page you can just have a dynamically generated and cached .js file.
You may download a sample MVC2 project here.
I’ve been considering the usefulness of adding a CSS management system to my CMS that I’ve been working on. Here are the steps I’ve taken to implement it.
I’m not sure that I’m convinced of the usefulness of this idea but it’s possible and easy to implement in your ASP.NET MVC project. The possibility of using variables in a CSS file is intriguing.
You may download a sample of the MVC2 project here.MVC3 project here. Let me know if this is a good idea, a horrible idea or just a bit interesting.
Edit – I’ve added a Response.Filter to this to remove extra spaces, tabs, carriage returns/new lines, final semicolons and comments. It brought the 4.96kb file down to 2.74kb. It can be enabled/disbled in Web.config using appSettings key CompressCSS (bool)
OK, I named this post that so that perhaps google will pick it up and those new to CSS will find this post.
There is a really good reason that there are no tutorials on the internet concerning how to add content (a site menu is the most common request) to all the pages on your web site using CSS. That’s because CSS doesn’t control content. It controls styling and nothing more. You don’t use styling to add content.
Why not look into some sort of server side includes. PHP includes will handle the situation. ASP.old can handle it but don’t use it unless you have no other choice (and you do). If you’re really fancy and modern and handsome and awesome you can just use ASP.NET MasterPages and/or User Controls. 🙂
To wrap it up, CSS doesn’t do that. Stop asking about it! Thank you.
Recently someone challenged me to write a server-side method for finding the current season and changing a style sheet accordingly.
The first step is deciding how to differentiate the seasons. I figured to use the day of the year so that astronomically Spring begins on March 21st, the 80th day of the year. Summer begins on the 172nd day, Autumn, the 266th and Winter the 355th. Of course, on a leap year add one day to each, 81, 173, 267 and 356.
Now to find the day of the year use the DayOfYear property. Also, use the IsLeapYear property to take a day away on leap year if the current day is after February 28th (the 59th day of the year). This is easily done by converting the bool IsLeapYear to an Int32 giving a 0 during non-leap years and 1 during leap year.
int doy = DateTime.Now.DayOfYear - Convert.ToInt32((DateTime.IsLeapYear(DateTime.Now.Year)) && DateTime.Now.DayOfYear > 59);
Then find the current season using a few nested ternary operators (I like ternary operators)
string currentSeason = String.Format("{0}.css",((doy < 80 || doy >= 355) ? "winter" : ((doy >= 80 && doy < 172) ? "spring" : ((doy >= 172 && doy < 266) ? "summer" : "fall"))));
I use this in the head of my MasterPage:
<link rel="Stylesheet" runat="server" id="seasonSheet" type="text/css" />
So all I have to do to add the correct style sheet for the current season is this:
seasonSheet.Attributes.Add("href",currentSeason);
Now a stylesheet named spring.css, summer.css, fall.css or winter.css will be added to your rendered MasterPage.
I hope you’ve found this helpful.
While reading about a recent question concerning @@Identity and the reasons to use SCOPE_IDENTITY() instead I experimented with LINQ to get the SCOPE_IDENTITY() results.
using (var dbc = new siteDataContext()) { dbc.Log = Console.Out; repertoire newSkill = new repertoire { skill = "a new item" }; dbc.repertoires.InsertOnSubmit(newSkill); dbc.SubmitChanges(); Console.Write(newSkill.id.ToString()); }
It seems that calling the id column of the inserted object gives you the SCOPE_IDENTITY(). Here is the SQL Log:
INSERT INTO [dbo].[repertoire]([skill]) VALUES (@p0) SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value] -- @p0: Input NVarChar (Size = 10; Prec = 0; Scale = 0) [a new item] -- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.1
WebAIM‘s Screen Reader Survey, conducted December 2008 to January 2009, is a very interesting read. Yet another nail in the Flash coffin but surprisingly Frames are deemed easy to use by nearly 60% of screen-reader users.
Give it a quick look. Comments open.
I was working on a project and just on a whim decided to try out some of .NET’s AJAX controls. I chose a random page, added a ScriptManager, tossed in a TextBox and a CalendarExtender.
F5. Page shows up. Javascript error:
Line: 121 Char: 1 Error: 'Sys' is undefined Code: 0 Url: http://localhost:49329/admin.aspx
Hmm.
Try a new project. Add a ScriptManager, tossed in a TextBox and a CalendarExtender. Works fine. Huh?
I go through the Web.Config files of the two. Nothings changed except the version number on everything:
non working: Version=3.5.0.0 working: Version=1.0.61025.0
Ah ha! That must be it. I reset the working project as a 3.5 app and run it. I was so sure it was going to fail. Nope. Worked fine.
Must be something else. *grumble*
I start taking pieces out of my existing app and when I came to the Global.asax I took out the RouteTables and AJAX comes to life! FINALLY!
Here is what I had:
Global.asax
protected void Application_Start(object sender, EventArgs e) { // Code that runs on application startup RegisterRoutes(RouteTable.Routes); } private static void RegisterRoutes(ICollection<RouteBase> Routes) { RouteTable.Routes.Add( new Route("{Parameter}/{pageID}", new RouteHandler())); RouteTable.Routes.Add( new Route("{Parameter}", new RouteHandler())); }
With my routing handler file showing this little gem:
RouteHandler.cs
string virtualPath = string.Format("~/{0}.aspx", pageName); return (Page)BuildManager.CreateInstanceFromVirtualPath(virtualPath, typeof(Page));
So basically it was swiping the file extensions from my httpHandlers and replacing them with .aspx meaning they were not found.
Web.Config
<httpHandlers> <remove verb="*" path="*.asmx"/> <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add verb="GET,HEAD" path="ScriptResource.axd" validate="false" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> </httpHandlers>
To handle the situation I added the following to Global.asax:
Global.asax
protected void Application_Start(object sender, EventArgs e) { // Code that runs on application startup RegisterRoutes(RouteTable.Routes); } private static void RegisterRoutes(ICollection<RouteBase> Routes) { RouteTable.Routes.Add(new System.Web.Routing.Route("{resource}.axd/{*pathInfo}", new System.Web.Routing.StopRoutingHandler())); RouteTable.Routes.Add(new System.Web.Routing.Route("{service}.asmx/{*path}", new System.Web.Routing.StopRoutingHandler())); RouteTable.Routes.Add( new Route("{Parameter}/{pageID}", new RouteHandler())); RouteTable.Routes.Add( new Route("{Parameter}", new RouteHandler())); }
I hope this helps. 🙂
To do:
public class bibleParts { public static Func<bibleDataContext, string, IQueryable<bibleParts>> theVersion = CompiledQuery.Compile((bibleDataContext context, string bibleVersion) => (from v in context.bibles_infos where v.bibleName == bibleVersion select new bibleParts { version = v.bibleID, language = v.language, copyright = v.copyright })); public static Func<bibleDataContext, int, string, IQueryable<bibleParts>> theBook = CompiledQuery.Compile((bibleDataContext context, int bookLang, string book) => (from b in context.book_names where (b.book == book || b.abbreviation == book || b.alt == book) && b.language == bookLang select new bibleParts { bookID = b.book_id, book = b.book })); public static Func<bibleDataContext, int, int, int, IQueryable<bibleParts>> theVerses = CompiledQuery.Compile((bibleDataContext context, int version, int book, int chapter) => (from v in context.verses where v.versionID == version && v.bookID == book && v.chapter == chapter select new bibleParts { verseNum = v.verse1, thisVerse = v.text })); public int version {get;set;} public int language {get;set;} public string copyright {get;set;} public int bookID {get;set;} public string book {get;set;} public int verseNum {get;set;} public string thisVerse {get;set;} } </pre></pre> <pre><pre>private string verseMod(string text) { string textVal = text; string errorValue = ""; string verseNumBegin = "<sup>"; string verseNumEnd = "</sup>"; string footerBegin = "<em> - "; string footerEnd = "</em>"; string bibleVersion = "kjv"; //default version if none is specified string pat = @"\[bible[=]?(?<version>[a-zäëïöüæø]*)](?<entire>(?<book>([0-9][\s]?)?[a-zäëïöüæø]*[\s]{1}([a-zäëïöüæø]*[\s]?[a-zäëïöüæø]*[\s]{1})?)(?<chapter>[0-9]{1,3})(:{1}(?<verse>[0-9]{1,3})(-{1}(?<toVerse>[0-9]{1,3}))?)?)\[/bible]"; Regex r = new Regex(pat, RegexOptions.IgnoreCase); MatchCollection m = r.Matches(textVal); foreach (Match match in m) { string verseVal = ""; string errorText = ""; if (!String.IsNullOrEmpty(match.Groups["version"].Value)) bibleVersion = match.Groups["version"].Value; string thisBook = match.Groups["book"].Value; int fromVerse = 0; int toVerse; if (!String.IsNullOrEmpty(match.Groups["verse"].Value)) fromVerse = Convert.ToInt32(match.Groups["verse"].Value); toVerse = fromVerse; if (!String.IsNullOrEmpty(match.Groups["toVerse"].Value)) toVerse = Convert.ToInt32(match.Groups["toVerse"].Value); using (var bdc = new bibleDataContext()) { var searchVersion = bibleParts.theVersion(bdc, bibleVersion).SingleOrDefault(); if (searchVersion != null) { var searchBook = bibleParts.theBook(bdc, searchVersion.language, thisBook).SingleOrDefault(); if (searchBook != null) { var searchVerses = bibleParts.theVerses(bdc, searchVersion.version, searchBook.bookID, Convert.ToInt32(match.Groups["chapter"].Value)); if (fromVerse != 0) { searchVerses = from v in searchVerses where v.verseNum >= fromVerse && v.verseNum <= toVerse select v; } string realToVerse = ""; verseVal += String.Format("{1}{0}{2}", match.Groups["entire"].Value.Replace(match.Groups["book"].Value.Trim(), searchBook.book), "<span class=\"bibleHead\">", "</span>"); verseVal += "<span class=\"bibleContent\">"; foreach (var theVerse in searchVerses) { string verseFormat = "{2}{1}{3}{0} "; if (String.IsNullOrEmpty(match.Groups["toVerse"].Value) && !String.IsNullOrEmpty(match.Groups["verse"].Value)) verseFormat = "{0} "; verseVal += String.Format(verseFormat, theVerse.thisVerse, theVerse.verseNum, verseNumBegin, verseNumEnd); realToVerse = theVerse.verseNum.ToString(); } verseVal += String.Format("{1}{0}{2}</span>", searchVersion.copyright, footerBegin, footerEnd); verseVal = verseVal.Replace(String.Format("-{0}", toVerse), String.Format("-{0}", realToVerse)); verseVal = verseVal.Replace("-</span>", "</span>"); } else { errorText = "The book \"{0}\" does not exist. Please check the spelling and try again."; errorValue = match.Groups["book"].Value; } } else { errorText = "The version \"{0}\" is not installed on this server"; errorValue = match.Groups["version"].Value; } if (String.IsNullOrEmpty(errorText)) { textVal = textVal.Replace(match.Groups[0].Value, verseVal); } else { textVal = textVal.Replace(match.Groups[0].Value,String.Format(errorText,errorValue.Trim())); } } } return textVal; }
Currently active at newcastlechurchofChrist.com.