This is default featured slide 1 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

This is default featured slide 2 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

This is default featured slide 3 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

This is default featured slide 4 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

This is default featured slide 5 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

Thursday, February 28, 2013

Book 1: Diving In – iOS App Development for Non-Programmers Series: The Series on How to Create iPhone & iPad Apps

Book 1: Diving In – iOS App Development for Non-Programmers Series: The Series on How to Create iPhone & iPad Apps

Review:
“Most of the books I scanned, even the ‘Dummies’ series, assumed a basic knowledge of computer programming even for iOS beginners. What I like about Kevin’s writing is that he doesn’t make any assumptions — he just takes you there — step by step.” – Lorraine Akemann – Moms With Apps

Unleash the App Developer Within!
This first book in the series from Kevin McNeish, award-winning App Developer, highly acclaimed iOS trainer and conference speaker, is specifically desi

List Price: $ 16.99

Price:


Source : ducktyper[dot]com

Wednesday, February 27, 2013

Alcorn McBride LightingPad iPad / iPhone Lighting Control Application Demo


LightingPad is the perfect tool for controlling small shows, or for installing and testing lighting systems. It’s also great for programming our LightCue Pro lighting controller. Simply connect any Art-Net compatible DMX device to your wireless network, and you have a complete lighting console in the palm of your hand. Because it’s an iPad / iPhone application, it’s incredibly simple to use. For more information, visit www.alcorn.com


Source : iphonedevx[dot]com

Tallahassee, Fla., is a bad place to be an iPhone owner

Tallahassee, Fla., is a bad place to be an iPhone owner

Tallahassee, Florida is a bad place to be an iPhone owner

The folks at gizmo trade-in site Gazelle see a lot of broken iPhones, and fortunately for those in the blogging biz, they keep a lot of statistics on where those phones come from and what kind of damage they see. Gazelle published a Top 10 Klutziest Cities list based on the percentage of broken or damaged iPhones received, and this year’s winner was Tallahassee, Florida. A whopping 21.29 percent of all of the iPhones traded in by people from that city had some sort of damage.

With the exception of Bakersfield, California — which was number three on the list with 20.63 percent damage rate for trade-ins — the vast majority of klutzes appeared to be in the US South (six of the top ten!) or clustered around New York City. The Bronx and Staten Island were both in the top 10, which makes me wonder if a lot of iPhones received water damage during Hurricane Sandy last year.

If you’ve recently fumbled your iPhone and destroyed it, Gazelle’s also giving you a chance to win a new phone of your choosing with their “Broken Phone Stories” contest on Facebook.

Tallahassee, Fla., is a bad place to be an iPhone owner originally appeared on TUAW – The Unofficial Apple Weblog on Wed, 27 Feb 2013 19:00:00 EST. Please see our terms for use of feeds.


Source : blancer[dot]com

iOS Programming 101: Record and Play Audio using AVFoundation Framework

Editor’s note: Some of you asked us to write a tutorial about audio recording. This week, we work with Raymond Au from Purple Development to give you an introduction of AVFoundation framework. Raymond is an independent iOS developer and has recently released Voice Memo Wifi that allows users to record voice memo and share it over WiFi.

iOS provides various framework to let you work with sound in your app. One of the frameworks that you can use to play and record audio file is the AV Foundation Framework. In this tutorial, I’ll walk you through the basics of the framework and show you how to manage audio playback, as well as, recording.

To provide you with a working example, I’ll build a simple audio app that allows users to record and play audio. Our primary focus is to demonstrate the AV Foundation framework so the user interface of the app is very simple.

The AV Foundation provides easy ways to deal with audio. In this tutorial, we mainly deal with these two classes:

  • AVAudioPlayer – think of it as an audio player for playing sound files. By using the player, you can play sounds of any duration and in any audio format available in iOS.
  • AVAudioRecorder – an audio recorder for recording audio

Starting with the Project Template

First of all, create a “Single View Application” and name it as “AudioDemo”. To free you from setting up the user interface and code skeleton, you can download the project template from here.

I’ve created a simple UI for you that it only contains three buttons including “Record”, “Stop” and “Play”. The buttons are also linked up with the code.

AudioDemo Project Template

AudioDemo Project Template

Adding AVFoundation Framework

By default, the AVFoundation framework is not bundled in any Xcode project. So you have to add it manually. In the Project Navigator, select the “AudioDemo” project. In the Content Area, select “AudioDemo” under Targets and click “Build Phases”. Expand “Link Binary with Libraries” and click the “+” button to add the “AVFoundation.framework”.

Adding AVFoundation Framework

Adding AVFoundation Framework

To use the AVAudioPlayer and AVAudioRecorder class, we need to import in ViewController.h.

1
#import <AVFoundation/AVFoundation.h>


Audio Recording using AVAudioRecorder

First, let’s take a look how we can use AVAudioRecorder to record audio. Add the AVAudioRecorderDelegate protocol and AVAudioPlayerDelegate in the ViewController.h. We’ll explain both delegates as we walk through the code.

1
@interface ViewController : UIViewController <AVAudioRecorderDelegate, AVAudioPlayerDelegate>

Next, declare the instance variables for AVAudioRecorder and AVAudioPlayer in ViewController.m:

1
2
3
4
@interface ViewController ( ) {
    AVAudioRecorder *recorder;
    AVAudioPlayer *player;
}

The AVAudioRecorder class provides an easy way to record sound in iOS. To use the recorder, you have to prepare a few things:

  • Specify a sound file URL.
  • Set up the audio session.
  • Configure the audio recorder’s initial state.

We’ll do the setup in the “viewDidLoad” method of ViewController.m. Simply edit the method with the following code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
- ( void )viewDidLoad
{
    [super viewDidLoad ];
   
    // Disable Stop/Play button when application launches
    [stopButton setEnabled : NO ];
    [playButton setEnabled : NO ];
   
    // Set the audio file
    NSArray *pathComponents = [ NSArray arrayWithObjects :
                                [NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES ) lastObject ],
                                @ "MyAudioMemo.m4a",
                                nil ];
    NSURL *outputFileURL = [ NSURL fileURLWithPathComponents :pathComponents ];
   
    // Setup audio session
    AVAudioSession *session = [AVAudioSession sharedInstance ];
    [session setCategory :AVAudioSessionCategoryPlayAndRecord error : nil ];

    // Define the recorder setting
    NSMutableDictionary *recordSetting = [ [ NSMutableDictionary alloc ] init ];
   
    [recordSetting setValue : [ NSNumber numberWithInt :kAudioFormatMPEG4AAC ] forKey :AVFormatIDKey ];
    [recordSetting setValue : [ NSNumber numberWithFloat : 44100.0 ] forKey :AVSampleRateKey ];
    [recordSetting setValue : [ NSNumber numberWithInt : 2 ] forKey :AVNumberOfChannelsKey ];
   
    // Initiate and prepare the recorder
    recorder = [ [AVAudioRecorder alloc ] initWithURL :outputFileURL settings :recordSetting error : NULL ];
    recorder.delegate = self;
    recorder.meteringEnabled = YES;
    [recorder prepareToRecord ];
}

Note: For demo purpose, we skip the error handling. In real app, don’t forget to include proper error handling.

In the above code, we first define the sound file URL for saving the recording. and then configure the audio session. iOS handles audio behaviour of an app by using audio sessions. Upon launch, your app automatically gets an audio session. You can grab such session by calling [AVAudioSession sharedInstance] and configure it. Here, we tell iOS that the app uses “AVAudioSessionCategoryPlayAndRecord” category which enables both audio input and output. We will not go into the details of audio session but you can check out the official document for further details.

The AVAudioRecorder uses a dictionary-based settings for its configuration. In line 21-25, we use the options keys to configure the audio data format, sample rate and number of channels. Lastly, we initiate the audio recorder by calling “prepareToRecord:” method.

Note: For other settings keys, you can refer to AV Foundation Audio Settings Constants.

Implementing Record Button

We’ve completed the audio preparation. Let’s move on to implement the action method of Record button. Before we dive into the code, let me explain how the “Record” button works. When user taps the “Record” button, the app will start recording and the button text will be changed to “Pause”. If user taps the “Pause” button, the app will pause the audio recording till the “Record” is tapped again. The audio recording will only be stopped when user taps the “Stop” button.

Edit the “recordPauseTapped:” method with the following code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
- (IBAction )recordPauseTapped : ( id )sender {
    // Stop the audio player before recording
    if (player.playing ) {
        [player stop ];
    }
   
    if ( !recorder.recording ) {
        AVAudioSession *session = [AVAudioSession sharedInstance ];
        [session setActive : YES error : nil ];
       
        // Start recording
        [recorder record ];
        [recordPauseButton setTitle : @ "Pause" forState :UIControlStateNormal ];

    } else {

        // Pause recording
        [recorder pause ];
        [recordPauseButton setTitle : @ "Record" forState :UIControlStateNormal ];
    }

    [stopButton setEnabled : YES ];
    [playButton setEnabled : NO ];
}

In the above code, we first check whether the audio player is playing. If audio player is playing, we simply stop it by using the “stop:” method. Line 7 of the above code determines if the app is in recording mode. If it’s not in recording mode, the app activates the audio sessions and starts the recording. For recording to work (or sound to play), your audio session must be active.

In general, you can use the following methods of AVAudioRecorder class to control the recording:

  • record – start/resume a recording
  • pause – pause a recording
  • stop – stop a recording

Implementing Stop Button

For the Stop button, we simply call up the “stop:” method to the recorder, followed by deactivating the audio session. Edit the “stopTapped:” method with the following code:

1
2
3
4
5
6
- (IBAction )stopTapped : ( id )sender {
    [recorder stop ];
   
    AVAudioSession *audioSession = [AVAudioSession sharedInstance ];
    [audioSession setActive : NO error : nil ];
}

Implementing the AVAudioRecorderDelegate Protocol

You can make use of AVAudioRecorderDelegate protocol to handle audio interruptions (say, a phone call during audio recording) and the completion of recording. In the example, the ViewController is the delegate. The methods defined in AVAudioRecorderDelegate protocol are optional. Here, we’ll only implement the “audioRecorderDidFinishRecording:” method to handle the completion of recording. Add the following code to ViewController.m:

1
2
3
4
5
6
- ( void ) audioRecorderDidFinishRecording : (AVAudioRecorder * )avrecorder successfully : ( BOOL )flag {
    [recordPauseButton setTitle : @ "Record" forState :UIControlStateNormal ];
   
    [stopButton setEnabled : NO ];
    [playButton setEnabled : YES ];    
}

After finishing the recording, we simply change the “Pause” button back to “Record” button.


Playing Sound using AVAudioPlayer

Finally, it comes to the implementation of the “Play” button for audio playback using AVAudioPlayer. In the ViewController.m, edit the “playTapped:” method using the following code:

1
2
3
4
5
6
7
- (IBAction )playTapped : ( id )sender {
    if ( !recorder.recording ) {
        player = [ [AVAudioPlayer alloc ] initWithContentsOfURL :recorder.url error : nil ];
        [player setDelegate :self ];
        [player play ];
    }
}

The above code is very straightforward. Normally, there are a few things to configure an audio player:

  • Initialize the audio play and Assign a sound file to it. In the case, it’s the audio file of the recording (i.e. recorder.url).
  • Designate an audio player delegate object, which handles interruptions as well as the playback-completed event.
  • Call play: method to play the sound file.

Implementing the AVAudioPlayerDelegate Protocol

The delegate of an AVAudioPlayer object must adopt the AVAudioPlayerDelegate protocol. In this case, it’s the ViewController. The delegate allows you to handle interruptions, audio decoding errors and update the user interface when an audio has finished playing. All methods in AVAudioplayerDelegate protocol are optional, however. To demonstrate how it works, we’ll implement the “audioPlayerDidFinishPlaying:” method to display an alert prompt after the completion of audio playback. For usage of other methods, you can refer to the official documentation of AUAudioPlayerDelegate protocol.

Add the following code in ViewController.m:

1
2
3
4
5
6
7
8
- ( void ) audioPlayerDidFinishPlaying : (AVAudioPlayer * )player successfully : ( BOOL )flag {
    UIAlertView *alert = [ [UIAlertView alloc ] initWithTitle : @ "Done"
                               message : @ "Finish playing the recording!"
                              delegate : nil
                     cancelButtonTitle : @ "OK"
                     otherButtonTitles : nil ];
    [alert show ];
}


Compile and Run Your App

You can test audio recording and playback using a physical device or software simulator. If you test the app using actual device (e.g. iPhone), the audio being recorded comes from the device connected by the built-in microphone or headset microphone. On the other hand, if you test the app by using the Simulator, the audio comes from the system’s default audio input device as set in the System Preference.

So go ahead to compile and run the app! Tap “Record” button to start recording. Say something, tap the “Stop” button and then select the “Play” button to listen the playback.

AudioDemo App

AudioDemo App

For your reference, you can download the complete source code from here. Feel free to leave me comment if you have any questions.

This post is contributed by Raymond Au from Purple Development. Raymond is an independent iOS developer and has recently released Voice Memo Wifi that allows users to record voice memo and share it over WiFi.


Source : appcoda[dot]com

Tuesday, February 26, 2013

Twitter Client Project: YoruFukurou

Twitter Client Project: YoruFukurou

Echofon for Mac is no longer in development. TUAW’s Twitter Client Project surveys popular desktop alternatives in highly subjective reviews.

The YoruFukurou Twitter client (Free) has been designed by geeks for geeks. Packed with customizable features, it bears all the hallmarks of design-by-engineer.

Anyone searching for precise end-user control will gladly find options for many display and notification tweaks. You can set up multiple Twitter accounts, control keyword highlighting, and much more.

What the app doesn’t deliver, in my opinion, is a sophisticated design aesthetic, either in usability or the visual layout. Although it’s blessed by one of the cutest icons possible, that same quality of visuals hasn’t transferred to the app itself. I found the app window cluttered, confusing, and lacking in refinement. I was put off by many of the app’s default design choices, such as highlighting mentions in red.

It takes a tremendous amount of effort to simplify an app, polishing it to the point where features are obvious and follow the user’s desires. YoruFukurou isn’t one of those apps.

It’s got most of the features you expect in a Twittter client but the flow in scanning, reading, replying, and following conversations left me unimpressed. It took me forever to discover how to view conversations (Conversations icon in the primary toolbar, Timeline > Conversations, or Command-3), an approach I felt was unintuitive. I had expected conversation choices to be tied to individual tweets, not to be placed among global modes.

Twitter Client Project YoruFukurou

I committed to testing YoruFukurou for an entire week. During that time, I often found myself Googling to figure out how to do one thing or another. This is not the hallmark of fine design. I got through the week and I was able to use the app, but I kept sneaking back to Echofon to get the “real work” done.

On the plus side, I did appreciate the app’s many features. From translation to shortening links to a built-in error console, the app is packed to the gills with options that will please demanding users.

The app was reliable, and seems to be built on a solid foundation. I did not experience crashing or flakiness.

From what I can tell, YoruFukurou has a loyal fanbase and remains in active development. You can follow the development team at @aki and @hydroxygenic on Twitter.

Twitter Client Project: YoruFukurou originally appeared on TUAW – The Unofficial Apple Weblog on Tue, 26 Feb 2013 19:00:00 EST. Please see our terms for use of feeds.


Source : blancer[dot]com

iPhone Skillshare Kickoff – Getting Started with App Development in Xcode and Learning Concepts

Video notes are in progress. Check back here, or on Skillshare.com for an update. Skillshare iPhone class. skl.sh Class Notes – Kickoff Video (1/28/13) Q: Will the Xcode software update affect how useful the Big Nerd Ranch books are? A: Everything should work and look the same. They’re the best books to start with and are written for beginners. Xcode’s improvements are more real-time feedback as you’re typing. (It’s better at suggesting and fixing things) Q: What chapters should we have read by the next class? A: Chapters 1-14 Objective-C Programming Q: If we have to choose between the two Big Nerd Ranch books, which one is more critical? A: If you’re new to programming. I’d recommend Objective-C Programming in a heart beat. If you’ve done C++/C then get the iOS Programming Book Q: When creating a team of 1-3 people, is that for the purpose of all working on one app together? Or just a small group to get feedback from on your own app idea? A: It can be to work on an app idea, or just to have a small study group. You’ll learn more if you teach each other the material. Having people to bounce questions off and answer questions is critical for deeper learning. Q: After taking the screen shot with command+shift+4, how to I access the picture? A: It’s on your desktop with a date stamp as it’s name. Q: How can we post our project Thursday before we make it? A: On Thursday you’ll post your project idea. Write a description, include a picture and create mockups or drawings of the


Source : ducktyper[dot]com

How to build effective 404-error pages in WordPress

ThumbnailThe greatest sites out there are always notable for their attention to detail. One often underestimated detail is the existence of a useful and user-friendly 404-error page. WordPress provides an easy way to create and customise the 404-error page, but unfortunately, the simplicity in customization does not automatically mean effectiveness.

The well-known WordPress SEO expert Joost de Valk (aka yoast) reports his recent findings from several years of website SEO audits. According to this report a significant number of the websites audited had problems with optimising their 404-error page. The default WordPress theme (currently TwentyTwelve) has a very basic template for this case and not so many site owners go beyond that.

Why is it important?

Let’s look at this from the common sense point of view. When does a 404 error occur? When someone clicks on a link that should point to content on your site, but for whatever reason there is no corresponding page: maybe you have changed a permalink or removed the page, maybe you have changed the tags or category slug, maybe the link was just wrong. There are any number of reasons for the error, but one important fact cannot be denied: the visitor is already on your site, s/he is already interested in something, s/he has already made an effort to find it, so this effort should be rewarded.

One of the fundamental rules of UI is not to leave users in dead-ends without guidance. There is always a back button in the browser, but do you really want your visitor to have to use it?

?Apple provides a sitemap on their 404-error page accompanied with a simple and clear message.

37signals use the extra opportunity to present their products, and provides contact information to solve the problem.

Zurb‘s 404-error page emphasises the option to contact them with a problem. Designers should solve problems, right?

?Problogger presents a wide range of various content to dive into reading.

Justin Tadlock‘s Blog uses breadcrumbs to present a homepage link.

Creating custom 404 error page in WordPress

What can be done to improve this situation? How can the mistake be turned into an opportunity?

In search of ideas and guidelines we can consult WordPress Codex or Google Webmaster Guidelines as perfect starting points. Actually, our main task is quite simple: explain why a page can’t be located and offer suggestions for getting to the right screen. From this point of view we can derive a list of possible components that creates a “perfect” 404-error page:

  • a clear error message in a simple and friendly manner, with apologies for the inconvenience;
  • the look and feel of the rest of the site with clear branding and navigation options;
  • possible alternatives and hints on how to find the desired information. A search form, links to relevant and/or popular content and the homepage are all possible solutions for this part;
  • a way to report an error if the user wants to; you can provide a contact email or other contact information.

From this list we can determine useful tips and ideas for what to include in a 404-error template:

  • recent and/or popular posts, or alternatively random posts;
  • subscription options (like RSS) in addition to contact details;
  • sitemap, especially in the case of small sites;
  • promotions or information about your offers and services;
  • branding materials to easily identify your site and your industry;
  • information about the requested URL and most relevant content;
  • tagcloud as a quick way to place the visitor into the context of your site;
  • a notification and/or tracking system to be aware of any 404 errors on your site.

One important thing about a 404-error page is a proper 404 HTTP status that should be served by the server. Fortunately, WordPress handles this for us automatically, so that we can focus our efforts on creating the page itself. We need the active theme to have a separate template for the page named 404.php. The bare bones structure of the template is quite simple:

<?php
/**
The template for displaying 404 pages (Not Found).
**/
get_header(); ?>
<div id="content" class="not-found-page">
<!-- page content goes here -->
</div>
<?php get_footer(); ?>

The markup that creates the page structure should correspond with what’s used by the active theme. Alternatively, some additional styling can be provided to imitate that structure. By including the standard calls get_header and get_footer we ensure that the page has all the branding elements and navigation options and all scripts and styles are loaded properly.

Now, when we have made the initial preparations, let’s fill in the page. The best thing we could do for the visitor on the 404 page is to guess what’s actually requested and provide the closest possible match. Information about the requested URL is stored by WordPress in the $wp->request property. We can parse that string and try to find similar content based on post_name data, which stores information about post and page slugs. If such a search does not return anything meaningful we can try a regular search through post content. If these efforts do not produce any positive results we can always provide a list of recent posts as a fallback.

Of course, we also include the friendly message, the search form and a link to the homepage.

First we are going to create some auxiliary functions to handle some template routines; they could be included in functions.php of your theme or directly in the beginning of 404.php file.

function frl_get_requested_slug(){
  global $wp;
  $q = $wp->request;
  $q = preg_replace("/(\.*)(html|htm|php|asp|aspx)$/","",$q);
  $parts = explode('/', $q);
  $q = end($parts);
  return $q;
}

frl_get_requested_slug function tries to obtain the requested page slug using the global $wp object and regular expressions. The code assumes that the site uses permalinks and the request goes in the appropriate form.

function frl_list_posts($posts){
  if(empty($posts))
  return '';
  $list = array();
  foreach($posts as $cpost) {
    $title = apply_filters('the_title', $cpost->post_title);
    $url = get_permalink($cpost);
    $list[] = "<li><a href='{$url}'>{$title}</a></li>";
  }
  return implode('', $list);
}

frl_list_posts helps to quickly output a list of post links, accepting an array of WP_Post objects as arguments.

function frl_load_error_style(){
  if(!is_404())
  return;
  $src = get_template_directory_uri().'/css/error-style.css';
  wp_enqueue_style('error-style', $src);
}

frl_load_error_style loads custom styles with the 404 template, assuming that the appropriate .css file is located in the /css folder inside the active theme’s directory.

The template code as we planned includes four parts: the friendly message; the search; the recent posts list; the last chance.

The friendly message:

<!-- Message -->
<h2>404: Page not found</h2>
<div class="message not-found">
<p>Sorry, unfortunately, we could not find the requested page.</p>
<p>Let's find the information you need.</p>
</div>

The search for the requested content:

<!-- Did you mean -->
<?php
$q = frl_get_requested_slug();
$args = array(
'post_type' => 'any',
'post_status' => 'publish',
'name' => $q,
'posts_per_page' => 5
);
$query = new WP_Query($args); //query posts by slug
if(empty($query->posts)){ //search for posts
$q = str_replace('-', ' ', $q);
$args = array(
'post_type' => 'any',
'post_status' => 'publish',
's' => $q,
'posts_per_page' => 5
);
$query->query($args);
}
if(!empty($query->posts)):
?>
<h4>Were you looking for the one of the following pages?</h4>
<ul class="posts-list">
<?php echo frl_list_posts($query->posts);?>
</ul>
<?php endif;?>

First of all, we perform a WordPress query with an initial set of arguments which looks for the requested slug in a post/page name field. If we don’t get any results after that, we replace dashes in the requested string with spaces and perform another query that searches for the requested words in the posts/pages content. If we’ve obtained any results we then output them with the help of the previously created frl_list_posts function.

Recent posts list:

<!-- Recent content -->
<?php
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => 5
);
$query->query($args);
if(!empty($query->posts)):
?>
<h4>Why not take a look through the most recent posts?</h4>
<ul class="posts-list">
<?php echo frl_list_posts($query->posts);?>
</ul>
<?php endif;?>

In this part we perform a query for the 5 most recent posts in the blog and output them in the same manner as previously.

The last chance:

<!-- Search options -->
<?php $home_link = home_url(); ?>
<h4>No good?</h4>
<p>Please use the search form to try again or start browsing from the <a href='<?php echo $home_link;?>'>Homepage</a>.</p>
<p>If you need further assistance please don't hesitate to contact at <em>info@domain.com</em>.</p>
<?php get_search_form();?>

Finally, if none of the above options satisfy the user, we offer a link to the homepage and provide a search form.

Preventing 404 errors on your site

It seems that we have done our best to help the visitor on the 404-error page. Actually, the best help there is to prevent the 404 page ever being used. In particular, we can:

  • set up well-structured permalinks from the start of project, so it is less likely there will be any need to change them in the future;
  • monitor incoming links that are incorrect, contact owners of the websites where such links appear, with a request to correct them;
  • take care of the old content, don’t remove it until it’s absolutely necessary, and set up proper redirection on page migration.

There’s no real excuse why your site or blog should not have a helpful and user-friendly 404-error page. I hope, that this guide has given you some helpful tips.

What do you have on your 404 page? What do you find useful when you encounter 404 pages? Let us know in the comments.

Featured image/thumbnail, lost image via Shutterstock.




Source
Source : internetwebsitedesign[dot]biz