Constrained Codes And Signal Processing For Non-Volatile Memories