Building a WebSite Via The Command Line and MSBuild

As a software developer, I am always looking for ways to generate a build with the additional cost and overhead of commercial products and this is where the command line and msbuild can save the day.

If you have never worked with the executable aspnet_compiler.exe or msbuild.exeit is not as difficult as you may thing once you begun to understand the various switches. In fact I prefer the direct interface when performing a build because there are many times I can catch errors in code that for one reason or another are masked when performing a build within the Visual Studio .NET IDE and to be honest I have no idea why the IDE reports a successful build when the command line results in a failure. Before I continue any further I want to provide credit to Steve Smith of ASPAlliance who was gracious enough to answer questions that I had when I begun traveling down this road.

ASP.NET Compilation Tool (Aspnet_compiler.exe)

The ASP.NET Compilation tool (Aspnet_compiler.exe) enables you to compile an ASP.NET Web application, either in place or for deployment to a target location such as a production server. In-place compilation helps application performance because end users do not encounter a delay on the first request to the application while the application is compiled.

MSBuild (MSbuild.exe)

The Microsoft Build Engine (MSBuild) is the new build platform for Microsoft and Visual Studio. MSBuild is completely transparent with regards to how it processes and builds software, enabling developers to orchestrate and build products in build lab environments where Visual Studio is not installed. MSBuild introduces a new XML-based project file format that is simple to understand, easy to extend, and fully supported by Microsoft. The MSBuild project file format enables developers to fully describe what items need to be built as well as how they need to be built with different platforms and configurations. In addition, the project file format enables developers to author re-usable build rules that can be factored into separate files so that builds can be performed consistently across different projects within their product.

Example MSBuild XML File

To best understand the XML file you must have basic knowledge of XML otherwise you may find the document a little confusing. To start I always find it best to reduce anything that can be duplicated to a means where it can be declared one and then referenced as need. That being said we need to establish a property group that will contain the following:

  1. Name of the solution
  2. Physical file path to the solution
  3. Target path to where the build will reside
  4. Virtual path which is in the name of the IIS application
  5. .NET Framework path
  6. Development server path

[code language="xml"]

RadicalDevelopment.sln

C:DevelopmentWebProjectsRadDevRadDev.Website C:SoftwareBuildsRadDev
/raddev
C:WINDOWSMicrosoft.NETFrameworkv2.0.50727
\REMOTE_SERVERPATH
[/code]

The next step is to establish two targets one will create the build the directory and the other will clean any existing build.

[code language="xml"]





[/code]

The next step is creating targets that will either produce a debug or release build.

[code language="xml"]







[/code]

The next targets that you need to create are the actual targets that integrate the previous targets.

[code language="xml"]

$(DotNet2Path)aspnet_compiler.exe


$(DotNet2Path)aspnet_compiler.exe


[/code]

That is all there is to build.xml with the the exception of two targets that you may or may not want to use. These targets handle housekeeping in the build and can deploy the build from your local environment to a given server.

[code language="xml"]















[/code]

Now that your build script is exactly as you want it is time to call MSBuild and provide the script name as well as the target you are wanting to invoke.

[code language="plain"]
* Example use:
* Perform release build: C:WINDOWSMicrosoft.NETFrameworkv3.5msbuild build.xml /target:releasebuild
* Perform debug build: C:WINDOWSMicrosoft.NETFrameworkv3.5msbuild build.xml /target:debugbuild
* Clean build: C:WINDOWSMicrosoft.NETFrameworkv3.5msbuild build.xml /target:clean
[/code]

There you have it! Now you can generate your own builds and maintain 100% control over the process. [ Download the full build script ]

June 2010 SQL Script Collection

Structured Query Language Pronounced “S-Q-L” or “see-quill,” a language used to interrogate and process data in a relational database. Originally developed by IBM for its mainframes, all database systems designed for client/server environments support SQL. SQL commands can be used to interactively work with a database or can be embedded within a programming language to interface to a database. Programming extensions to SQL have turned it into a full-blown database programming language, and all major database management systems (DBMSs) support the language. Each month I intend on posting a collection of scripts that I have found beneficial for myself as well as something that you may be able to put to use.

Military Time Format

DECLARE @d DATETIME = GETDATE()
--ddHHmmMMMyy.toUpper (military format).
--That is two digit day, two digit hour, two digit minute, three letter month, two digit year, and month is uppercase.
SELECT RIGHT('00' + CAST(DATEPART(DAY,@d) AS VARCHAR(2)),2) +
RIGHT('00' + CAST(DATEPART(HOUR,@d) AS VARCHAR(2)),2) +
RIGHT('00' + CAST(DATEPART(MINUTE,@d) AS VARCHAR(2)),2) +
UPPER(LEFT(DATENAME(MONTH,@d),3)) + RIGHT(CAST(DATEPART(YEAR,@d) AS VARCHAR(4)),2)

Retrieve all Primary and Foreign Keys

SELECT t.table_schema AS PrimarySchemaName ,
t.TABLE_NAME AS PrimaryKeyTable,
tc.CONSTRAINT_NAME AS PrimaryKey,
COALESCE(tc2.constraint_schema,'N/A') AS ForeignSchemaName,
COALESCE(rc1.CONSTRAINT_NAME,'N/A') AS ForeignKey ,
COALESCE(tc2.TABLE_NAME,'N/A') AS ForeignKeyTable
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
INNER JOIN INFORMATION_SCHEMA.TABLES t ON tc.TABLE_NAME = t.TABLE_NAME
LEFT JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc1 ON tc.CONSTRAINT_NAME =rc1.UNIQUE_CONSTRAINT_NAME
LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc2 ON tc2.CONSTRAINT_NAME =rc1.CONSTRAINT_NAME
WHERE TC.CONSTRAINT_TYPE ='PRIMARY KEY'
ORDER BY tc.TABLE_NAME,tc.CONSTRAINT_NAME,rc1.CONSTRAINT_NAME

List All Tables That Contain No Triggers

SELECT t.TABLE_NAME FROM INFORMATION_SCHEMA.TABLES t
LEFT JOIN(SELECT OBJECT_NAME(o.parent_obj) AS TableName
FROM sysobjects o
WHERE OBJECTPROPERTY(o.[id], 'IsTrigger') = 1
) tr ON t.TABLE_NAME= tr.TableName
WHERE tr.TableName IS NULL
AND TABLE_TYPE ='BASE TABLE'
ORDER BY t.TABLE_NAME

Calculate An Age Based Upon YYYYMMDD

DECLARE @Birthday DATETIME, @DateToCheck DATETIME
SELECT @Birthday = '19680401', @DateToCheck = CURRENT_TIMESTAMP
SELECT DATEDIFF(YEAR, @Birthday, @DateToCheck) -
CASE WHEN DATEPART(mm,@Birthday) > DATEPART(mm,@DateToCheck)
OR (DATEPART(mm,@Birthday) = DATEPART(mm,@DateToCheck)
AND DATEPART(dd,@Birthday) > DATEPART(dd,@DateToCheck))
THEN 1 ELSE 0 END

Formatting Dates

DECLARE @d DATETIME
SELECT @d = GETDATE()
SELECT @d AS OriginalDate,
CONVERT(VARCHAR,@d,100) AS ConvertedDate,
100 AS FormatValue,
'mon dd yyyy hh:miAM (or PM)' AS OutputFormat
UNION all
SELECT @d,CONVERT(VARCHAR,@d,101),101,'mm/dd/yyyy'
UNION all
SELECT @d,CONVERT(VARCHAR,@d,102),102,'yyyy.mm.dd'
UNION all
SELECT @d,CONVERT(VARCHAR,@d,103),103,'dd/mm/yyyy'
UNION all
SELECT @d,CONVERT(VARCHAR,@d,104),104,'dd.mm.yyyy'
UNION all
SELECT @d,CONVERT(VARCHAR,@d,105),105,'dd-mm-yyyy'
UNION all
SELECT @d,CONVERT(VARCHAR,@d,106),106,'dd mon yyyy'
UNION all
SELECT @d,CONVERT(VARCHAR,@d,107),107,'Mon dd, yyyy'
UNION all
SELECT @d,CONVERT(VARCHAR,@d,108),108,'hh:mm:ss'
UNION all
SELECT @d,CONVERT(VARCHAR,@d,109),109,'mon dd yyyy hh:mi:ss:mmmAM (or PM)'
UNION all
SELECT @d,CONVERT(VARCHAR,@d,110),110,'mm-dd-yyyy'
UNION all
SELECT @d,CONVERT(VARCHAR,@d,111),111,'yyyy/mm/dd'
UNION all
SELECT @d,CONVERT(VARCHAR,@d,112),112,'yyyymmdd'
UNION all
SELECT @d,CONVERT(VARCHAR,@d,113),113,'dd mon yyyy hh:mm:ss:mmm(24h)'
UNION all
SELECT @d,CONVERT(VARCHAR,@d,114),114,'hh:mi:ss:mmm(24h)'
UNION all
SELECT @d,CONVERT(VARCHAR,@d,120),120,'yyyy-mm-dd hh:mi:ss(24h)'
UNION all
SELECT @d,CONVERT(VARCHAR,@d,121),121,'yyyy-mm-dd hh:mi:ss.mmm(24h)'
UNION all
SELECT @d,CONVERT(VARCHAR,@d,126),126,'yyyy-mm-dd Thh:mm:ss:mmm(no spaces)'

Enabling xp_cmdshell in 2005/2008

EXEC master.dbo.sp_configure 'show advanced options', 1
RECONFIGURE
EXEC master.dbo.sp_configure 'xp_cmdshell', 1
RECONFIGURE

Selecting From System Tables in 2005/2008

SELECT * FROM sys.objects  -- new objects table
SELECT * FROM sys.sysobjects -- SQL Server 2000 style objects table
SELECT * FROM sys.all_columns
SELECT * FROM sys.all_objects -- system objects included also with user-defined
SELECT * FROM sys.all_parameters -- stored procedure and function parameters
SELECT * FROM sys.all_sql_modules -- stored procedures, functions, triggers, app views
SELECT * FROM sys.all_views

Converting A String To DatTime

DECLARE
@DateTimeValue varchar(30),
@DateValue char(8),
@TimeValue char(6)

SELECT
@DateValue = '20081023',
@TimeValue = '211920'

SELECT @DateTimeValue =
convert(varchar, convert(datetime, @DateValue), 110)
+ ' ' + substring(@TimeValue, 1, 2)
+ ':' + substring(@TimeValue, 3, 2)
+ ':' + substring(@TimeValue, 5, 2)

SELECT DateInput = @DateValue,
TimeInput = @TimeValue,
DateTimeOutput = @DateTimeValue,
DateTimeFormat = convert(datetime, @DateTimeValue)

List All Tables

SELECT   SchemaName = SCHEMA_NAME(schema_id),
TableName = name
FROM     sys.objects
WHERE    TYPE = 'U'
ORDER BY SchemaName,
TableName
GO

List All Triggers

SELECT   SchemaName = SCHEMA_NAME(schema_id),
TableName = name
FROM     sys.objects
WHERE    TYPE = 'TR'
ORDER BY SchemaName,
TableName
GO

List All Views

SELECT   SchemaName = SCHEMA_NAME(schema_id),
TableName = name
FROM     sys.objects
WHERE    TYPE = 'V'
ORDER BY SchemaName,
TableName
GO

List All Stored Procedures

SELECT   SchemaName = SCHEMA_NAME(schema_id),
TableName = name
FROM     sys.objects
WHERE    TYPE = 'P'
ORDER BY SchemaName,
TableName
GO

Current System Date Conversions

SELECT Now=GETDATE() -- 2016-10-23 18:59:09.483
SELECT CONVERT(datetime, getdate()) -- 2016-10-23 18:59:09.483
SELECT CONVERT(datetime2, getdate()) -- 2016-10-23 18:59:09.4830000
SELECT CONVERT(smalldatetime, getdate()) -- 2016-10-23 18:59:00
SELECT CONVERT(date, getdate()) -- 2016-10-23
SELECT CONVERT(datetime, CURRENT_TIMESTAMP) -- 2016-10-23 18:59:09.483

-- SQL Server current system date functions
SELECT  SYSDATETIME() -- 2016-10-23 19:04:34.28125007
,SYSDATETIMEOFFSET() -- 2016-10-23 19:04:34.2812500 -04:00
,SYSUTCDATETIME() -- 2016-10-23 23:04:34.2812500
,CURRENT_TIMESTAMP -- 2016-10-23 19:04:34.280
,GETDATE() -- 2016-10-23 19:04:34.280
,GETUTCDATE(); -- 2016-10-23 23:04:34.280

-- SQL Server current system date functions with conversions
SELECT CONVERT (datetime, SYSDATETIME()) -- 2016-10-23 19:02:19.547
,CONVERT (datetime, SYSDATETIMEOFFSET()) -- 2016-10-23 19:02:19.547
,CONVERT (datetime, SYSUTCDATETIME())  -- 2016-10-23 23:02:19.547
,CONVERT (datetime, CURRENT_TIMESTAMP) -- 2016-10-23 19:02:19.543
,CONVERT (datetime, GETDATE()) -- 2016-10-23 19:02:19.543
,CONVERT (datetime, GETUTCDATE()); -- 2016-10-23 23:02:19.543

Random Password Generation

DECLARE
@complex tinyint
, @minlen tinyint
, @maxlen tinyint

SET @minlen = 8 --min length of password
SET @maxlen = 12 --max length of password
SET @complex = 4
--  1 all lowercase
--  2 include upper case
--  3 include number
--  4 include punctuation

DECLARE
@password varchar(12)
, @len tinyint
, @type  tinyint
, @type2 tinyint

SET @len = 0
SET @password = ''
WHILE @len NOT BETWEEN @minlen and @maxlen
BEGIN
SET @len = ROUND(1 + (RAND(CHECKSUM(NEWID())) * @maxlen), 0) + 1
END
WHILE @len > 0
BEGIN
DECLARE @newchar CHAR(1)
SET @type = ROUND(1 + (RAND(CHECKSUM(NEWID())) * (@complex - 1)), 0)
IF @type = 1
SET @newchar = CHAR(ROUND(97 + (RAND(CHECKSUM(NEWID())) * 25), 0))
IF @type = 2
SET @newchar = CHAR(ROUND(65 + (RAND(CHECKSUM(NEWID())) * 25), 0))
IF @type = 3
SET @newchar = CHAR(ROUND(48 + (RAND(CHECKSUM(NEWID())) * 9), 0))
IF @type = 4
BEGIN
SET @type2 = ROUND(1 + (RAND(CHECKSUM(NEWID())) * 3), 0)
IF @type2 = 1
SET @newchar = CHAR(ROUND(33 + (RAND(CHECKSUM(NEWID())) * 14), 0))
IF @type2 = 2
SET @newchar = CHAR(ROUND(58 + (RAND(CHECKSUM(NEWID())) * 6), 0))
IF @type2 = 3
SET @newchar = CHAR(ROUND(91 + (RAND(CHECKSUM(NEWID())) * 5), 0))
IF @type2 = 4
SET @newchar = CHAR(ROUND(123 + (RAND(CHECKSUM(NEWID())) * 3), 0))
END
-- remove invalid characters as well as characters easily confused with others
IF @newchar NOT IN ('b', 'l', 'o', 's', 'I', 'O', 'S', '0', '1', '!', '''', '.', ',', '/', '`', '', '|')
BEGIN
SET @password = @password + @newchar
SET @len = @len - 1
END
END
SELECT @password as Password

Copy Data From One Table Into Another

INSERT INTO    [TABLE2]
SELECT *
FROM [TABLE1]

Basic Cursor

declare @email nvarchar(255)
declare CustList cursor for
SELECT email from STE_EMAILS
OPEN CustList
FETCH NEXT FROM CustList
INTO @email
WHILE @@FETCH_STATUS = 0
BEGIN
if (SELECT count(custid) from customer where (current_customer=1) and (notes1 is not null) and (notes1 like '%' + @email + '%')) > 0
SELECT custid from customer where (current_customer=1) and (notes1 is not null) and (notes1 like '%' + @email + '%')
print '%' + @email + '%'
FETCH NEXT FROM CustList INTO @email
END
CLOSE CustList
DEALLOCATE CustList

Do you have a script that you would like to share? Feel free to contact me and I will add it to the list.

WordPress Themes Roundup

If you’re looking for a theme to refresh that tired look of your WordPress blog then take a moment to look at these resources. While there are a number of different theme flavors out there both free and commercial only you can decide what best suits your needs. I must say if you find a commercial theme please purchase it and support the theme owner. While many if not all theme owners work out of love they still must eat. I have tried a number of themes myself and I keep coming back to my personal favorite Hybrid and the child themes. The author of this theme is very responsive to the community and continually is making improvements.

Theme Hybrid

[browsershot url="http://themehybrid.com/" width="595"]

Pixel Theme Studio

[browsershot url="http://pixelthemestudio.ca/" width="595"]

Theme Junkie

[browsershot url="http://www.theme-junkie.com/" width="595"]

GabFire Themes

[browsershot url="http://www.gabfirethemes.com/" width="595"]

WP Bandit

[browsershot url="http://wpbandit.com/" width="595"]

PageLines

[browsershot url="http://www.pagelines.com/" width="595"]

WooThemes

[browsershot url="http://www.woothemes.com/" width="595"]

Theme Forest

[browsershot url="http://themeforest.net/" width="595"]

Web Hosting Gone Wrong: Webhost4life

As you may have noticed last Friday evening my website was extremely slow and when it loaded it resulted in error after error. As soon as I saw the problem I begun to investigate the root cause in order to determine the best approach to resolve the issue. To my surprise WebHost4Life whom I am now calling WebHostNot4Life had migrated my site and database to a new server. Typically a move to newer hardware represents a positive aspect but in this case WebHost4Life completely failed at the task, in fact a quick search of Google yielded a number of customers experiencing similar problems as myself and in some cases a complete loss of data. It makes one wonder if this company no longer cares about quality or is simply unqualified to perform the job. Turning to Twitter I noticed a number of others in the exact same boat as myself.

As I mentioned earlier last Friday around 6:00 PM I noticed the problems with my site. After a few hours trying to resolve the problem I contacted technical support to let them know that I learned that my site had been migrated to the new platform and the database was a mixture of outdated content and configuration that spanned weeks if not months. The same held true for the physical file system content. For the life of me I just could not understand how they could have made such a massive mistake. At this point begun a 24 hour period of trying to get technical support to fix what they had broken.

Round One 18-Jun-2010:

tech: Hi Steven, my name is Tech. How are you today?
steven: seems my site was migrated and I can no longer log in via FTP and the site is throwing errors.. http://radicaldevelopment.net/
tech: I apologize for any inconvenience this has caused you.
steven: I just fixed the FTP issue. Need you help with the site
tech: Please make sure to use the following settings in the FTP client software to connect our server through FTP:
tech: 1. FTP server is: ???.webhost4life.com
tech: 2. Host directory: /
tech: 3. Username: FTP username
tech: 4. Password: FTP password
tech: 5. Port: 21
tech: 6: login type: Normal.
steven: : I just fixed the FTP issue. Need you help with the site
tech: Okay.
tech: You need to update the scripts available in the file ‘functions.php’ to fix the website issue.
steven: how
tech: You need to fix this issue from your end. You can contact the script vendor to get help with editing the file ‘functions.php’.
steven: wait.. this only occured after you folks migrated my site. why now am I on my own??
tech: May I place you on hold for 4 or 5 minutes, while I check this for you?
steven: sure.. I am trying to log into my site now to disable the plugin that seems to fighting me
tech: Okay.
steven: why is the site so SLOW?
steven: and what you all migrated contains files that came from weeks if not months back. It differs than what was on my site as early as today
steven: OMG! even the database is wrong. There are plugins there that I removed a long time back!
tech: Okay.
steven: Please tell me what I had in place at midnight last night on the old server is still there
tech: Thank you for your patience, I am still testing the issue, I will be back with some more information in 5 more minutes.
steven: sure
tech: Thank you for holding.
tech: Steven, it appears that the files have not been migrated properly to the server. I will run a tool from back end to migrate all the files and database to the new server.
tech: I ran the tool from back end. It will take couple of hours to move the database and files to the new server.
tech: Did you receive my last message?
steven: please be sure it is the database a file content as of midnight last night. I must say this is very disappointing and I expect that the second attempt at migration goes without fail. Speaking with others I know with webhost4life this seems to be an ongoing problems as many folks have had numerous problems after the migration. May I expect what you just ran will be complete at 12:15 CDT?
tech: Yes

At this point I had no reason to believe that the two hour window would resolve the issue as technical support had always resolved any issues quickly in the past. Little did I know that this time would be very different.

Round Two 19-Jun-2010:

tech: Hi Steven. My name is tech #2, how are you today?
steven: My site was improperly migrated and at 10:00pm on 6/18 I was told in two hours it would be corrected. It has not. Please advise.
tech: I apologize for any inconvenience this has caused you.
tech: Can you please provide me the exact URL, with which you are experiencing the issue?
steven: http://radicaldevelopment.net/
tech: Okay.
tech: May I place you on hold for 4 or 5 minutes, while I check this for you?
steven: the database and content is out of date for one. Whatever was migrated was old and weeks and weeks old.
steven: sure
tech: Thank you for holding.
tech: I apologize for any inconvenience this has caused you.
tech: I have checked the website and noticed that it is coming up. I can see an error message at the top of the website. Also, can you please let me know whether this is the old contents?
steven: the error is due to the database is out of date with the wordpress functions and etc. There are themes and logs on my site now that have not been there for weeks. Whatever was pulled from the old server is not was was online as on 6/17
tech: Okay.
steven: it is SLOW as well… I do not want to go over all of this again. Here is what the tech stated hours ago.
steven: tech #1: Steven, it appears that the files have not been migrated properly to the server. I will run a tool from back end to migrate all the files and database to the new server.
tech #1: I ran the tool from back end. It will take couple of hours to move the database and files to the new server.
tech: I apologize for any inconvenience this has caused you.
tech: I was able to duplicate your issue. In order to investigate further, I need to escalate the issue to one of our technical specialists. You will be able to view the activity and the status of the ticket in the Support Console of the account.
tech: You can check the status of the ticket at:
tech: http://www.webhost4life.com/member/sconsole
steven: why did this process not fall under a QA review? I should not have to spend my time on this..
tech: Yes, I can understand your concern but there seems to be some other issue with the website.
tech: One of our specialists will contact you as soon as possible.
steven: Please put in the notes that what needs to be migrated is what was in place on 6/17. I do not want to explain this problem again for a third time.
tech: Yes, sure.

Well now the problem has begun to be so severe that it was escalated. Maybe now something will get resolved. Oh, did you notice that I have been apologized to four times now? At this point it was after midnight and decided to go to bed and let the technical folks work their magic.

Round Three 19-JUN-2010:

No that I woke up well rested it was time to check and see if my issues had been resolved. To my surprise the ticket from the previous night had no indication that anyone even begun working on it. Therefore it was time for yet another online chat with the live support and here it how that went.

tech #3: Hi Steven, my name is tech #3. How are you today?
steven: what is the status of 7175624? The problem is not resolved and nothing reflects status in the ticket
tech #3: I apologize for any inconvenience this has caused you.
tech #3: I have noticed that you have updated the ticket. I will ask our engineers to resolve your issue at the earliest.
steven: It is 18hrs now and counting that my site is down and failing to work because of folks on your end. This is unacceptable and the support thus far has been a failure. Please do escalate this
tech #3: Okay.

For those of you that are counting that is a grand total of five apologies and still no fix in sight.

My Next Step

Since I backup both my database a file content myself I decided to transfer my domain to another host and within three hours I had completed this transfer, restored the database, and uploaded the file content. As I was doing all of this I wondered why WebHost4Life technical support was so incompetent that they could not had done the same. Remember that they had a 24 hour window and did absolutely nothing to correct the problems that they caused.

The last step was to contact WebHost4Life sales and terminate my account. I was asked why I had elected to terminate the account and after I explained the problem the sales representative offered me a discounted rate if I would stay with them. I found this so funny that I laughed and replied why would I pay a discounted rate for service that clearly is not working.

At the time of this post my website is sitting on a new host and the best advice I have for anyone thinking of using WebHost4Life is don’t! I have no idea what has happened with this company but it is not what it once was! I have heard that is was sold and tech support is now outsourced overseas. If this is the case then it may explain the crash and burn that I recently experienced.

Are you currently a customer of WebHost4Life or have you decided to take your business elsewhere? I am interested in hearing your story so please leave a comment.

June 2010 Audible.com Picks

Spoken from the Heart In this brave, beautiful, and deeply personal memoir, Laura Bush, one of our most beloved and private first ladies, tells her own extraordinary story. Born in the boom-and-bust oil town of Midland, Texas, Laura Welch grew up as an only child. She vividly evokes Midland’s brash, rugged culture, her close relationship with her father, and the bonds of early friendships that sustain her to this day. For the first time, she writes about the devastating high-school car accident that left her friend Mike Douglas dead and about her decades of unspoken grief.

Search Results for Keywords: Use Your Head To Get Your Foot In The Door Harvey Mackay has written five New York Times best sellers, including one of the most popular business books of all time: Swim with the Sharks Without Being Eaten Alive. Now he returns with the ultimate audiobook on how to get, and keep, a job you truly love, whether you’re 21, 51, or 71.The average person will have at least three career changes and 10 different jobs by age 38. In this era of downsizing and outsourcing, you can never be sure your job will still exist in five years – or five weeks. So you’d better think of your career as a perpetual job search. That demands a passion for lifetime learning and the skills for relentless and effective networking.

Getting Things Done: The Art of Stress-Free Productivity In today’s world of exponentially increased communication and responsibility, yesterday’s methods for staying on top just don’t work. Veteran management consultant and trainer David Allen recognizes that “time management” is useless the minute your schedule is interrupted; “setting priorities” isn’t relevant when your e-mail is down; “procrastination solutions” won’t help if your goals aren’t clear. Allen’s premise is simple: our ability to be productive is directly proportional to our ability to relax. Only when our minds are clear and our thoughts are organized can we achieve stress-free productivity and unleash our creative potential.

The 4-Hour Workweek: Escape 9-5, Live Anywhere, and Join the New Rich Forget the old concepts of retirement and a deferred life plan. There is no need to wait and every reason not to, especially in unpredictable economic times. For living more and working less, this book is the blueprint. This expanded edition includes dozens of practical tips and case studies from people who have doubled their income, overcome common sticking points, and reinvented themselves using the original book. Also included are templates for eliminating email and negotiating with bosses and clients, how to apply lifestyle principles in unpredictable economic times, and the latest tools, tricks, and shortcuts for living like a diplomat or millionaire without being either.

The Magic of Thinking Big Millions of people throughout the world have improved their lives using The Magic of Thinking Big. Dr. David J. Schwartz, long regarded as one of the foremost experts on motivation, will help you sell better, manage better, earn more money, and – most important of all – find greater happiness and peace of mind. The Magic of Thinking Big gives you useful methods, not empty promises. Dr. Schwartz presents a carefully designed program for getting the most out of your job, your marriage and family life, and your community. He proves that you don’t need to be an intellectual or have innate talent to attain great success and satisfaction – but you do need to learn and understand the habit of thinking and behaving in ways that will get you there.

Pages:123»