Saturday, June 23, 2012

MVC3 on Soft Sys Hosting

I am trying to get an MVC 3 web application running on a Web Server. Soft Sys Hosting claims support of MVC 3 and .Net 4.0 and since this is what I am using, I thought I would give it a shot.

Setting up Soft Sys Hosting

I started by logging in and ordering a package including domain name N1-Web.com. That was easy. What was much more complicated than it had to be was setting up all the logins. I don’t know why there were so many. I set all the passwords to be the same. See Password Safe

Host Name

User Name

Description

https://www.n1-web.com:8443

https://173.248.177.6:8443

nwebcom

This is the login to Parallels control panel for ONE machine account.

http://domaincp.softsyshosting.com/customer

wc@wc1.us

This is the login for the master account

ftp://www.n1-web.com

Nwebcom

This is the default FTP account. It is read only.

ftp://www.n1-web.com

Warren

I had to set this up to get an FTP account that would allow me to write

With this, I was able to upload HelloWorld.html to /httpdocs and display it using: http://www.n1-web.com/HelloWorld.html.

Uploading Files

I am starting by copying the following to /httpdocs:

  • Bin directory (including EntityFramework.dll which I hope is not necessary)
  • Content directory
  • Images directory
  • Scripts
  • ASPX files
  • N1_Logo.gif
  • Global.asax
  • Web.config

I also renamed index.html to index.html_old.html

 

Trying to run the web site

When I tried to run the web site, the system told me I had errors but would not tell me what they are. I added <customErrors mode="Off"/> to the <system.web> section of Web.Config.

Then when I ran it again, it tells me:

clip_image002

So, I contacted them and they did something that caused me to get a different error message:

clip_image004

I was able to make this go away by getting rid of the line: <customErrors mode="Off"/> in Config.sys that I had added above. This gave me a bit of success; I was able to get the default page of my application, then go to the users page and then try to do a filtered search. The attempt to go to the database failed and of course since I could no longer see my errors, I did not get an error message.

So, I surrounded the code in N1_UserController with a try/catch block with catch doing a Response.Write(U_Log.ToHtmlText(ex));.

This showed me the error which was that it could not find MySql.Data. I tried copying MySql.Data.dll from: clip_image006 to the bin directory on the web site.

That worked! Horray! I am up and running.

Wednesday, May 2, 2012

Moving from SQL Server to MySQL for Web Development

I am a Web Developer who is quite comfortable using Visual Studio 2005 and 2008 to build web sites based on SQL Server. Today, I am trying to transfer this knowledge to creating sites based on three new technologies:

  • Visual Studio 2010 Web developer
  • MVC 3 for developing sites that are partially or completely based on the Model / View / Controller design pattern. This seems to be the wave of the future and also seems to be the basis for using DHTML5 with AJAX. Hey – maybe this isn’t necessary, but it looks to me like the most probably future direction for Microsoft based development.
  • MySQL. Narrative 1 databases are currently based on MySQL and this will continue. This last transition is the one I will talk about here.

Connecting to MySQL

In my experience, connecting the plumbing is always the hardest part of any new technology and connecting to MySQL from Visual Studio is no exception. Here is what I think is necessary.

  1. You need something called the MySQL Connector for .Net which I got from http://dev.mysql.com/downloads/connector/net/. Somewhere I saw that I was supposed to uninstall previous versions of this. I did so and that made my Narrative 1 workbooks stop connecting to the MySQL databases. Hopefully, reinstalling Narrative 1 will correct this,but I have not yet tried this.
  2. Once you have successfully installed MySQL Connector, open the VS 2010 project and add a reference to this. Right click the References section under the Project in the Solution Explorer, Select the .NET tab, and sort by Component Name. Scroll down and click on MySQL.Data. Then click OK. For me, this component was on my system at

image

For easier access, I added the following to the top of the file:

image

The first step in using the program to connect to a MySQL database is setting up the connection. Here is the the connect string format that I ended up using:

image

At this point, one would think that all our problems would be solved; if you can do it in SQL Server, you should be able to do it in MySQL, right?  WRONG! It ain’t that easy.

Accessing a table seems to work as one would expect. You set the Command Text property to the name of the table, and set the Command Type to Table and you get back the entire table. No Problem.

Invoking a normal SQL Command also seems to not be a problem. Set the Command Text property to a string holding the command, set the Command Type to Text and it runs the the stored procedure.  No Problem.

Stored Procedures, however, are a problem. Set the Command Text Property to a string holding the procedure name, set the Command Type property to Stored Procedure and Execute Reader says that it cannot find the Stored Procedure. I have tried this with and without “`” characters, with and without the database name in front, with and without the “( )” characters surrounding it all to no avail. I suspect that there is some stupid incantation that I am missing, but I have no idea what that would be.

I did find a workaround. Instead of setting the Command Type to Stored Procedure, I set it to Text. I was successful when I set:

image

The next issue is the passing of parameters. One might think that if you are going to pass the procedure name as text, you might just as well pass the parameters as text as well. That sounds find to me. But there are two reasons that you might not want to do this.

For me, the first reason is that I have code that has to work with both SQL Server and MySQL. It is all set up to loop through the parameters and add them to the parameter list. I want to be able to structure the code the same way in MySQL.

The way you do this is to add the parameter names to the Command Text, preceding the parameter name with a “@”. Note that MySQL procedures would not take arguments starting with “@”; I used “_” instead. When passing the parameters, the “@” character works fine. Because MySQL does not accept default values, it seems that it cares only about the order of the parameters and not the names. This means that all parameters must be passed; you can’t default them to null and skip them as I often do (or did) in SQL Server. Also, I discovered that if one wants to pass a null value to a parameter, one should use “dbNull.Value”. Of course, if you are putting this into a Command Text string, you just put in “null” as shown in the previous code snip.

Here is some sample code that shows how to work with parameters.

image 

Note the Prepare statement above. This causes a sort of compile to occur. In the code above, this would improve performance if the command is to be executed multiple times.

All this sure sounds simple enough. Why did it take me half the day to figure it all out??? I wish it had been in the manuals. But that is what this blog is for, isn’t it?

Thursday, November 24, 2011

Backup and Synchronize Contacts

This morning, I was taking a look at my system for backing up my files. Everything seems pretty much under control except for my contacts. It seems that I have many different contact systems and they are all completely independent. Here is a list:

  • Windows Contacts: (Start -> All Programs -> Windows Contacts) These appear to be completely obsolete, but I don’t dare to delete them. Actually, I probably will.
  • Windows Live Contacts on my desktop system.
  • Windows Live Contacts on my laptop system.
  • Contacts in Thunderbird.
  • Contacts in G Mail.
  • My on-line address book.

Remember that mostly, I just want to back up the contact list, but it would also be nice if there could be some sort of synchronization between some of them.

To make matters worse, Microsoft tends to hide all the contact information deep within directory structures that it also makes inaccessible. What a pain.

So, I did an internet search and what I found was that I was supposed to add Windows Live Messenger to tie all this stuff together. Just what I need: another database, but at least this one is in the cloud and would synchronize between my desktop and laptop systems. Not perfect, but it meets my minimum requirements.

 

Windows Live Messenger

Well, I am still not sure exactly what Microsoft Live Messenger actually is, but I think it is Microsoft’s answer to Facebook. Whatever it is, I would just as soon not have it on my systems, but I am willing if it will do the job. The websites extolling its virtues promised to synchronize with Windows Live Mail contacts, so I decided to give it a try. I downloaded and installed it. This may not actually have been necessary, but I did it.

And it did not synchronize with Windows Live Mail. I thought that the problem could be that I had different account names for Windows Live, so I created a new Windows Live account using the email account from at which I read my email messages. That made no difference.

Eventually, I think I found the trick.

  • Open Windows Live Mail.
  • Click Contacts in the lower left of the window.
  • That changes the ribbon bar at the top of the window.
  • At the right side of the ribbon, there is an icon. On my system, it offered me the option to Sign In. I did using my Windows Live ID. I think this was the key to synchronizing.
  • At this point, the icon changed to show my name and a drop down list which allows log out, change user and similar things.
  • I also clicked Clean Up Contacts. I don’t know if this was necessary, but it was probably a good idea.
  • I then went to my laptop, opened Windows Live Mail and logged into that program as well. I clicked Clean Up Contacts and the contacts appeared there. I had not installed Windows Live Messenger on that system.

I also note that with Contacts selected in Windows Live Mail, there are options on the ribbon to import or export my contact list. While I have not yet thought of a way to make this automatic, it would offer me a means of saving my contacts to a file that could be backed up.

So, I guess this solves my problem. It is not perfect, but it does seem to meet my immediate concerns.

Monday, October 10, 2011

Creating a WPF Web Application

I had a LOT of trouble getting anything working. This will help avoid future pitfalls.
I started by opening a new application:
Visual C# –> Windows –> WPF Browser Application.
Next, I tried to add a WPF Window. WRONG! I should have added a WPF Page. They are very similar, but a WPF Window would not work. I named the page Trans_Main.xaml.
At this point, the project was set up to run Page1.xaml. To change this, I went into the App.xaml file and corrected the StartupUri parameter.
This worked on IE, but when I tried to run it on Chrome, it reported that I was missing a Plug In.
I also noted that the Debug tab in the Project Properties window lets us select the Start Action. I had hoped that I could set this to Trans_Main.xaml, but this did not work. I had to set it to …bin\Debug\Translate.xbap. In fact, double clicking this file would bring up the Trans_Main.xaml file, but double-clicking the Trans_Main.xaml file directly caused an error.
I tried eliminating x:Class="Translate.Trans_Main"  from the XAML file. After that, IE would open and display the file.  I put the line back and copied the EXE file to the bin directory and this seemed to work. I tried setting the program to build directly to the bin directory (instead of bin\debug), but this seemed to mess things up. I did not play with it for long enough to figure out why.
Bottom line is that this technology is OK for use with Internet Explorer, but not for other browsers. I guess I will stick to using WPF for Applications only.
(Note to self: See the project in c:\wwwroot\inetpub\Translate)

Tuesday, September 27, 2011

How to build Help into a WPF Program

Over the last couple of days, I have spend an inordinate amount of time trying to figure out how to integrate on-line help into my WPF programs. I am amazed at how difficult it was to find concise and useful information on this subject. In fact, it makes me think that I must be missing something major. Also, it seems that none of my programming books do a very good job covering the subject.

In fact, creating the Help File and Linking to it are two separate topics and will be dealt with separately.

Lest there be any doubt, we are limiting ourselves to creating “CHM” help files.

Using HTML Help Workshop

This is a free download from Microsoft and it is pretty basic. It starts with HTML files into which you can put links to other HTML files. You add these HTML files to a Table of Contents as “Topics”. You can also insert Headings and Files. My theory is that a Heading is just like a Topic, except that it does not NEED to have an HTML file associated with it.

The biggest draw-back to this program is that it does not allow interactive editing of HTML files. Also, it was far from intuitive to use. I found an excellent Help Workstation Tutorial by Char James-Tanny. I downloaded it from http://frogleg.mvps.org/helptechnologies/htmlhelp/hhtutorials.html.

BUT – there is something better out there for preparation of CHM files.

Using HelpNDoc to create Help Files

A search for Free Help Authoring Tools brought me to http://www.helpndoc.com/ from whence I was able to download HelpNDoc which is free for non-commercial use.

This program is very cool and I think it could be just the thing I need for documenting programs. The reason that it would be better than MS Word or something like that is that it allows me to work in outlines and it allows me to enter hyperlinks. It would be really nice if allowed me to follow them while I was authoring something, but you can’t have everything.

It comes with a pretty good on-Line help system of its own and is pretty easy to use.

Another nice thing about it is that it outputs in any or all of four different formats: CHM, HTML, DPF and Word.

And if you look in the CHM folder, it seems that it puts out all the files that would be used by HTML Help Workshop. According to one source, HTML Help Workshop must be installed for HelpNDoc to compile its help projects.

It was not clear that it allows you to create indexes, but if this is important, one might be able to do this using HTML Help Workshop as a post-processing step. Experimentation would be useful here.

Linking to help from WPF Programs

As nice as these free programs are, neither explains how to link a WPF application to the help.

The Char James-Tanny tutorial does discuss linking using the hhctrl.ocx control from VB 5/6 and perhaps it would be possible to adapt those instructions.

Apparently, there is a System.Windows.Forms.HelpProvider control. This appears to not work with WPF controls.

I did, however, find a way to open CHM help files.

But first, a little about the structure of HelpNDoc.

HelpNDoc builds a help system out of Topics. Each Topic is one entry in the table of contents, and when as the help system is being built, it creates an HTML file on the topic. This HTML file gets compressed and included in the CHM file, but a copy of the HTML file is left in the CHM directory.

This topic gets a name or Help ID based on the Topic Name in the Table of Contents. You can change this Help ID by right clicking the TOC entry. This Help ID plus “.html” is used as the name of the HTML file for this topic.

You can also add Anchor points to a Topic. You can set an anchor by placing the cursor where you want the anchor, going to the Insert tab and clicking Insert/Remove Anchor on the right side of the ribbon. The program then prompts you to enter the name of the anchor. You can see a green bar where the anchor is placed, but unfortunately, I did not find a way to go back later and see what the name had been set to. I was able to see it after generating the help file by looking at the source code in the resulting HTML file.

So, now we have a generated CHM help file, HTML files holding topics that have been compiled into this help file and possibly anchors in some of the Topic/ HTML files. How do we access them.

The answer is to use the static ShowHelp method of System.Windows.Forms.Help. Here is what the calls will look like. Assume that the help file is named MyHelp.chm. Assume that the Help ID is MyTopic and that the topic file in that help file is therefore named MyTopic.html. Also, there is an anchor point in this file named MyAnchor. You might want to use a full path instead of just a filename.

To open the help file at the beginning, use:

Help.ShowHelp(null, @"MyHelp.chm");

The following will open the help file at the MyTopic page:

Help.ShowHelp(null, @" MyHelp.chm", "MyTopic.html");

And the following will open the help file at the anchor point:

Help.ShowHelp(null, @"MyHelp.chm", "MyTopic.html#MyAnchor");

So, that is enough to get me started. As I learn more, perhaps I will update this note.

Friday, September 23, 2011

Using my LG Dare as a Music Server

I like to listen to music while I am in my workshop. You would think this would be easy, and it would be if I were not so lazy. I want to be able to walk into the shop, throw a switch, and just have the music start – without thinking about a thing.

You might think that a radio would be just the thing, but there is only one passable FM radio station in my area and while I like a lot of their music, I don’t love it.

What about an old computer? Well, I don’t want to keep it on all the time or wait for it to boot up or log on or anything like that.

And how about Satellite Radio? Well, I am too cheap to pay for it.

But the LG Dare, plugged into a small charger, running all the time, might be just right. I plan to put the speakers onto the switch that I turn on when I enter the shop, so they will draw power only when I am using them.

Loading the Music

One can certainly use V-Cast/Rhapsody to load music. In fact, I had to install the V-Cast software on one of my computers in order to figure out the file structure of the Dare. But my goal is to pop micro-SD cards into and out of the Dare as my music store. I figure that it will be easier than using special software.

So, I loaded V-Cast onto the Vista side of the Timeline-X computer and told it to connect to the Dare. I then dragged some music  files from a windows explorer folder into the music directory on the Dare. I added a playlist and put a few songs into that as well.  The display on V-Cast shows that I had three folders: music, albums and playlists. I told the system to disconnect from the Dare, powered down the Dare, and removed the micro-SD card.

When I plugged the micro-SD card into my main computer, it had five folders on it:

  • media
  • my_flix
  • my_music
  • my_pix
  • my_sounds

The music was in the my_music folder (with all file names in lower case). I could not find the playlist; I searched for it several times. My only guess is that this could be on the part of the Dare that is not removable. It seems that all the music goes into this folder without subdirectories.

Thursday, September 22, 2011

Experimenting with iTunes

In my last post, I described tools I had written that would:

  • Swap names of artists when they had been rendered with a comma. Holly, Buddy became Buddy Holly, etc.
  • Update the metadata for the files based on their locations using the old structure.
  • Remove the track number from the start of the file names.
  • If the file was part of a collection, attempt to extract artist name from the file name and move it to a directory for that artist.

I ran this on the M:\ drive and it worked (even though I had to designate the M drive using \\wd-netcenter\Music rather than “M:\”.

This is all well and good, but it left me with a couple of problems:

  • iTunes put a lot of crap into the library that was NOT on the M drive. I don’t want this crap in the library.
  • I wanted to give all the tracks a default Rating of two stars. That way I can change only the ones I want to be other than “normal”.
  • Previously, there had been a lot of track in the library that did not in fact exist on the disk. I needed some way to expunge those.

I decide to try to write code to do this.

I wondered if I could do this my editing playlists. These could be in either tab-separated text or XML. I created a Playlist and added a track to it. I then exported the playlist to a text file, modified it to change the rating and then imported it again. The import worked, but it did not change the rating.

 

Working with Library.xml

I learned that I could export the entire library as an XML file (but not a text file) by using File -> Library -> Export. It was easy to spot fields for Location and Rating.

According to Francisco Balena, there are two ways to manage XML. I started with what he said would be the easier one: using an xml reader and an xml writer. I figured out how to use them, but I also soon learned that this is handling the xml at a very low level and would require a huge amount of coding.

Instead, I loaded the whole thing into an xml document and then figured out how to navigate down to the information on the individual tracks. I did this pretty much by trial and error – looking at the library.xml file as text in one window and opening nodes in Visual Studio to figure out which child of each node I wanted to use.

I did run into one interesting problem. Visual Studio would not allow me to use “M:\” as the root of my music server. Instead, I had to call it \\wd-netcenter\Music. I have no idea why.

I put a feature into Music Manager to update the library.xml file. It does two things:

  • If the Location is other than on the M drive, it removes the track from the DOM.
  • If there is no Rating, it adds a rating of “40” which corresponds to two stars, my default.

I then started iTunes while holding the shift key. This allows me to specify the XML library I want to enter. I had to key in the file names, since the file-open dialog only shows .ITL files. It took two or three hours to complete this and when it was done, it told me that the file was incompatible and offered to try to repair it. This appears to be taking even longer. I think it is trying to reload album artwork or something like that.

Well, this DID work. It took about 6 hours to grind through everything, but in the end, it appears to have worked. Still, I am not interested in waiting for 6 hours to do a small update. Plus, it appears that there are still a lot of duplicate files. I can probably find them fairly easily by scanning, but I am not looking forward to deleting them one by one.

I think the iTunes SDK will be better suited to what I want to do

 

Repairing the damage done by the XML efforts

By searching the Internet, I found numerous articles on how to link to the iTunes COM object. It looked pretty easy – except for one thing. I could not initiate the App object. It kept telling me that: The folder containing “LibraryOut” cannot be found, and is required. Please choose or create a new iTunes library.

I wrestled with this for several hours. I could not find a library.itl file that iTunes seemed to be using. This was supposed to be in MyMusic\iTunes, but the one I found there did not have a late enough data on it and did not seem to change when I made changes to the library. Also, I renamed it and iTunes still seemed to start when invoked by itself. I finally gave up and went out to split some wood and think about it.

I have now decided that the problem must be that when I tried to start iTunes using the output file from my XML efforts, it changed the directory in which it was looking for the íTunesLibrary.itl file as well as the name of the file it was looking for.

Here is what I will do:

  • Change registry so that \HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ShellFolders\MyMusic now points to “M:\”. Also changed ..\User Shell Folders\My Music.
  • Made sure there was a directory named m:\iTunes.
  • I note that there is an iTunes Library.itl file in there and it is dated from this morning before I tried to do the import from the XML efforts. I held the shift key down while starting iTunes so that it prompted me to select the library.
  • I now note that the date on my iTunes Library.itl is set to current time.
  • I tried to run the program again and this time I got a different error.
  • I closed iTunes and tried again. This time I was prompted to specify the name of the library which I did. The program now seems to work as expected.
  • BUT – it seems that the location information is gone from most of the files. I am going to just empty the library and reload the whole thing.

Getting iTunes reloaded

Well, I got to where I wanted to – at least to step 1.

Here is what I did:

  • Cleared the entire library by selecting everything in it and clicking Delete.
  • Reloaded it by File -> Add Folder to Library.
  • That took many hours.
  • I then wrote a program to set all the Ratings to 2 stars (40). I ran it and that worked, but again took a couple of hours.
  • I went through the entire list and changed the ratings of the tracks that I liked better than 2 stars. I added some smart playlists.
  • I tried to write one of them to a CD (as an “MP3 CD”). It was going to be 200 files with 600+ MB of data. It has been grinding for a couple of hours. I don’t know if it is hung or not.

Conclusion:

iTunes seems to be pretty cool, but it is severely lacking in a couple of aspects. Here is no easy way to:

· Find and remove duplicate music.

· Copy sets of tracks (i.e. a playlist) to another directory for eventual movement to a phone.

· Move files to a different directory.

· Set the rating on a group of files at the same time.

As a result, I expect that I will write a program to assist with using iTunes. I will come up with a rough spec on this and post it.

 

 

Notes on using the iTunes SDK

While waiting around for the library to load, I did some internet searching and found that there is an SDK for iTunes. I registered as a Free apple developer (see PasswordSafe) and downloaded the SDK. Mostly, it consists of a help file. Turns out that the DLL is already installed with iTunes.

Here are some useful sites that I found:

http://www.robertprice.co.uk/robblog/archive/2006/8/iTunes_Now_Playing_In_C_.shtml

http://www.ohscope.com/2009/04/02/itunes-com-api-in-c/

http://www.codeproject.com/KB/cs/itunes_and_net.aspx

http://ratnakarg.wordpress.com/tag/c-itunes-sdk/

The following tells how to iterate over the tracks in the library and assign artwork to them. Should be easy to modify to make other modifications as well.

http://www.diller.ca/?p=40

The following tells how to add names to a playlist

http://www.itunessdk.com/blog/itunes-sdk-examples/

And this one that deletes tracks where the source is no longer available:

http://www.hanselman.com/blog/RemovingDeadTracksDuplicatesThatDontExistFromITunesUsingC.aspx

This one shows how to build a simple viewer/player based on the iTunes library.

http://www.codeproject.com/KB/audio-video/iTuneit.aspx

And this one shows how to make an audio recorder in c# based on iTunes

http://www.codeproject.com/KB/audio-video/MP3WaveAudioRecorder.aspx