20 October 2013

Prevent eye strain with a software that reminds you to blink and exercise

UPDATE 2018: The "look up and down, look outside the window" etc. are exercises that do not work. See this: http://nrecursions.blogspot.com/2018/03/eye-strain-is-not-caused-by-digital.html
UPDATE 2020: The real cure for eye strain: https://nrecursions.blogspot.com/2020/11/the-real-cure-for-eye-strain.html


----------------------------------


It is only when I was affected with severe eye strain that I realized how important it is to get enough of sleep everyday and to take breaks while working on the computer.

Even if you're not having back pain or eye strain, I'd still recommend that you install a software like Eye Leo or Work Rave (works on Linux too) to remind you to take breaks. I found Eye Leo to be nice, but there are more alternatives.
It has short-breaks like in the image above, and long breaks where the entire screen is dimmed. You can change the settings (mine are short breaks every 3 minutes and long breaks every 30 minutes for 5 minutes at a time). The application sits quietly in the system tray and starts when the system starts.

Some corrections: When your eye muscles are tired, it's wrong to do eye exercises. The people who came up with the eye exercise routine had the logic that when you look leftward, the extraocular muscles of the right eye would relax and allow the lactic acid to flow away. I know from experience that it's just a piece of theory that doesn't work in practice. Simply keep your eyes closed, relax your face muscles and neck muscles. That's all you need to relax your eyes during daytime. At night, make sure you get uninterrupted 8 hours of sleep. And simply blinking and drinking enough water is enough to ensure sufficient lubrication of your eyes via tears. After almost a decade of strain I realized that doctors are actually clueless about how to cure eye strain. The incompetent lot give people spectacles and eye drops instead of advising sleep and rest. 
For more information on curing eye strain that actually works, see this: https://nrecursions.blogspot.com/2018/03/eye-strain-is-not-caused-by-digital.html

I would recommend this software even to people who don't wear spectacles and even to people who say they have no strain while working on the computer. You need to take rest.

04 August 2013

An equivalent for MS Paint in Linux

Well honestly, there's no equivalent that I found good enough in Linux. MS Paint has an ease of use and functionality that's just about good enough for drawing and image editing, but not as complex as something like Gimp or Photoshop. I like using MS Paint for simple editing tasks.

There is one program which comes close to MS Paint. It's called mtpaint.
Install it with :
sudo yum install mtpaint
It's able to perform the necessary basic image editing tasks and drawing tasks required.




Linux also has CinePaint (comes with even a smudge tool, import capability for xcf, splines, but can't import even a png file and crashed when I did a colour sampling), xpaint (with a UI that's rather primitive and it crashed when I tried to select-all and move the graphics).

For children, there's a nice application called Tuxpaint. You can install it with sudo yum install tuxpaint. It's got simple features and accompanying sounds which will make it a joy for little kids to use.


Some others exist too for Ubuntu.

Say thank you or donate

02 September 2010

Setting up your bash prompt for colours, aliases and other things

One of the little joys in life is to have a nice coloured bash prompt and a lot of aliases to simplify navigation in bash.

I've placed most of my commands in ~/.bash_aliases.


To know how to colour a terminal, see this and this
Being able to create aliases to commands is one of the best things I've found out about the bash shell. You'll find a similar functionality in MS-DOS, called doskey.

These are the aliases I use in bashrc. Typing "cd .." became so annoying that the alias "f" (for "fall" to the below directory) became a handy tool.

# User specific aliases and functions
alias bashrc='gedit ~/.bashrc;source ~/.bashrc;echo bashrc has been sourced'
alias bashaliases='gedit ~/.bash_aliases;source ~/.bash_aliases;echo bash_aliases has been sourced'    
alias bashprofile='gedit ~/.bash_profile;source ~/.bash_profile;echo bash_profile has been sourced'
alias aliases="clear;cat ~/.bash_aliases|grep --color \"alias\""
alias home='cd;ls;pwd'
alias root='cd /;ls;pwd'
alias die='halt -p'
alias desktop='cd ~/Desktop;ls;pwd'
alias f='cd ..;ls;pwd'
alias ff='cd ../..;ls;pwd'
alias fff='cd ../../..;ls;pwd'
alias ffff='cd ../../../..;ls;pwd'
alias fffff='cd ../../../../..;ls;pwd'
alias ffffff='cd ../../../../../..;ls;pwd'
alias fffffff='cd ../../../../../../..;ls;pwd'
alias ffffffff='cd ../../../../../../../..;ls;pwd'
alias home='cd;ls;pwd'
alias root='cd /;ls;pwd'
alias shtdn='halt -p'
#alias startsql="service mysqld start"
#adding a hibernate option which I found while using Fedora20
alias hibernate='systemctl hibernate'
#--- For a coloured, customised prompt
# 0 is for non-bold colour. Replace it with 1 for bold
# 31m is the colour
# \u makes it show the username
# \h makes it show the address
# \W makes it show the directory name. Use \w for showing the full path
#export PS1="\e[0;32m[\u@\h \W]\$ \e[m"
#export PS1="\e[1;32m[\W] \e[m"
#alias br='xrandr --output eDP1 --brightness 0.5'
#alias brightness='xrandr --output eDP1 --brightness '
alias night='sct 2300'
alias day='sct 4000'
alias normal='sct'
#to shift memory from swap space to RAM
alias swap='sudo swapoff -a; sudo swapon -a'
#to convert webp files to png
alias convertwebp="find ./ -name '*.webp' -exec dwebp {} -o {}.png \;; find . -type f -name '*.webp' -delete"
#irest is a program I created
#alias restartirest='kill -9 $(pgrep -f 'irest');cd;nohup java -jar /someFolder/iRestTracker/irest/dist/irest.jar&'
alias killirest="kill -9 $(pgrep -f 'iRest')"
alias pauseirest="kill -STOP $(pgrep -f 'iRest')"
alias resumeirest="kill -CONT $(pgrep -f 'iRest')"
alias ireststatus="ps -aef | grep iRest"
alias irest="cd ~;python -B /home/nav/iRest/main.py >> iRestErrors.log"
alias ufw='sudo ufw'

alias pushall="git push --all origin"
alias pullall="git pull --all"
alias commit='git add -A && git commit -m '
 
alias deb='sudo dpkg -i '
alias showinstalled='sudo apt list --installed'
alias install='sudo apt-get install -y '
alias uninstall='sudo apt-get remove -y '
alias update='sudo apt-get update '
alias aptsearch='apt-cache search ' 
alias autoremove='sudo apt -y autoremove'
alias fixbroken='sudo apt --fix-broken install' 

alias updatedb='sudo updatedb'
 
#To play a beep in Ubuntu after running some program from the bash prompt.
alias beep='paplay /usr/share/sounds/freedesktop/stereo/complete.oga'
 
#To use wipe, first install via sudo apt-get install -y wipe
alias shred='wipe -rfiqQ 1 '

alias cleanpc='sudo bleachbit'
alias invert='xcalib -i -a'
alias sysinfo='inxi -Fxz;sudo get-edid | parse-edid;sudo lshw -c memory'
alias osinfo='lsb_release -a'
alias monitoroff='xset dpms force off'
alias lastsuspend='journalctl | grep -i suspend | tail | grep "Entering sleep state"'
alias lastshutdown='last|head'
 
alias netio='sudo nethogs'
alias gedit='xed' #for Linux Mint


Say thank you or donate

01 August 2010

Installing gcc 4.4.2 on Fedora 8

( Note from the future: This was the first of my build-from-source attempts, hence the excitement and detail.  )

I recommend that you go through the entire document first before following the steps (because some steps were performed wrong and corrected later. Other steps were repeated un-necessarily). The steps are numbered as 1., 2., 3. etc.

GCC 4.4.2 installation on Fedora 8:
How I did it:
1. Placed the gcc-4.4.2 folder in home and created a folder called gccbuild in home.
2. typed gcc -v in the terminal and got the following info

Using built-in specs.
Target: i386-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --enable-plugin --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --with-cpu=generic --host=i386-redhat-linux
Thread model: posix
gcc version 4.1.2 20070925 (Red Hat 4.1.2-33)


3. Entered cd gccbuild/
4. Typed ../gcc-4.4.2/configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --enable-plugin --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --with-cpu=generic --host=i386-redhat-linux
5. and got the following message:
configure: WARNING: If you wanted to set the --build type, don't use --host.
If a cross compiler is detected then cross compile mode will be used.
checking build system type... i686-pc-linux-gnu
checking host system type... i386-redhat-linux-gnu
checking target system type... i386-redhat-linux-gnu
checking for a BSD-compatible install... /usr/bin/install -c
checking whether ln works... yes
checking whether ln -s works... yes
checking for i386-redhat-linux-gcc... i386-redhat-linux-gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether i386-redhat-linux-gcc accepts -g... yes
checking for i386-redhat-linux-gcc option to accept ANSI C... none needed
checking for i386-redhat-linux-g++... i386-redhat-linux-g++
checking whether we are using the GNU C++ compiler... yes
checking whether i386-redhat-linux-g++ accepts -g... yes
checking for i386-redhat-linux-gnatbind... no
checking for gnatbind... no
checking for i386-redhat-linux-gnatmake... no
checking for gnatmake... no
checking whether compiler driver understands Ada... no
checking how to compare bootstrapped objects... cmp --ignore-initial=16 $$f1 $$f2
checking for correct version of gmp.h... yes
checking for correct version of mpfr.h... no
configure: error: Building GCC requires GMP 4.1+ and MPFR 2.3.2+.
Try the --with-gmp and/or --with-mpfr options to specify their locations.
Copies of these libraries' source code can be found at their respective
hosting sites as well as at ftp://gcc.gnu.org/pub/gcc/infrastructure/.
See also http://gcc.gnu.org/install/prerequisites.html for additional info.
If you obtained GMP and/or MPFR from a vendor distribution package, make
sure that you have installed both the libraries and the header files.
They may be located in separate packages.

6. Tried ../gcc-4.4.2/configure --prefix=/opt/
7. and got the following messages:
checking build system type... i686-pc-linux-gnu
checking host system type... i686-pc-linux-gnu
checking target system type... i686-pc-linux-gnu
checking for a BSD-compatible install... /usr/bin/install -c
checking whether ln works... yes
checking whether ln -s works... yes
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ANSI C... none needed
checking for g++... g++
checking whether we are using the GNU C++ compiler... yes
checking whether g++ accepts -g... yes
checking for gnatbind... no
checking for gnatmake... no
checking whether compiler driver understands Ada... no
checking how to compare bootstrapped objects... cmp --ignore-initial=16 $$f1 $$f2
checking for correct version of gmp.h... yes
checking for correct version of mpfr.h... no
configure: error: Building GCC requires GMP 4.1+ and MPFR 2.3.2+.
Try the --with-gmp and/or --with-mpfr options to specify their locations.
Copies of these libraries' source code can be found at their respective
hosting sites as well as at ftp://gcc.gnu.org/pub/gcc/infrastructure/.
See also http://gcc.gnu.org/install/prerequisites.html for additional info.
If you obtained GMP and/or MPFR from a vendor distribution package, make
sure that you have installed both the libraries and the header files.
They may be located in separate packages.

8. Tried ../gcc-4.4.2/configure --prefix=/usr/local --enable-threads=posix --mandir=/usr/share/man --infodir=/usr/share/info --enable-checking=release --disable-libunwind-exceptions
9. and got:
checking build system type... i686-pc-linux-gnu
checking host system type... i686-pc-linux-gnu
checking target system type... i686-pc-linux-gnu
checking for a BSD-compatible install... /usr/bin/install -c
checking whether ln works... yes
checking whether ln -s works... yes
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ANSI C... none needed
checking for g++... g++
checking whether we are using the GNU C++ compiler... yes
checking whether g++ accepts -g... yes
checking for gnatbind... no
checking for gnatmake... no
checking whether compiler driver understands Ada... no
checking how to compare bootstrapped objects... cmp --ignore-initial=16 $$f1 $$f2
checking for correct version of gmp.h... yes
checking for correct version of mpfr.h... no
configure: error: Building GCC requires GMP 4.1+ and MPFR 2.3.2+.
Try the --with-gmp and/or --with-mpfr options to specify their locations.
Copies of these libraries' source code can be found at their respective
hosting sites as well as at ftp://gcc.gnu.org/pub/gcc/infrastructure/.
See also http://gcc.gnu.org/install/prerequisites.html for additional info.
If you obtained GMP and/or MPFR from a vendor distribution package, make
sure that you have installed both the libraries and the header files.
They may be located in separate packages.

10. Trying ../gcc-4.4.2/configure --prefix=/usr/local --enable-threads=posix --mandir=/usr/share/man --infodir=/usr/share/info --enable-checking=release --disable-libunwind-exceptions --with-gmp=/usr/share/doc/gmp-4.2.2
11. and got:
e-libunwind-exceptions --with-gmp=/usr/share/doc/gmp-4.2.2
checking build system type... i686-pc-linux-gnu
checking host system type... i686-pc-linux-gnu
checking target system type... i686-pc-linux-gnu
checking for a BSD-compatible install... /usr/bin/install -c
checking whether ln works... yes
checking whether ln -s works... yes
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ANSI C... none needed
checking for g++... g++
checking whether we are using the GNU C++ compiler... yes
checking whether g++ accepts -g... yes
checking for gnatbind... no
checking for gnatmake... no
checking whether compiler driver understands Ada... no
checking how to compare bootstrapped objects... cmp --ignore-initial=16 $$f1 $$f2
checking for correct version of gmp.h... yes
checking for correct version of mpfr.h... no
configure: error: Building GCC requires GMP 4.1+ and MPFR 2.3.2+.
Try the --with-gmp and/or --with-mpfr options to specify their locations.
Copies of these libraries' source code can be found at their respective
hosting sites as well as at ftp://gcc.gnu.org/pub/gcc/infrastructure/.
See also http://gcc.gnu.org/install/prerequisites.html for additional info.
If you obtained GMP and/or MPFR from a vendor distribution package, make
sure that you have installed both the libraries and the header files.
They may be located in separate packages.

12. downloaded mpfr-2.4.2 from http://www.mpfr.org/
13. logged in as root and extracted the tar.bz2 to /usr/share/doc/
14. entered the mpfr-2.4.2 folder, typed 'configure' and typed 'make'
15. Tried ../gcc-4.4.2/configure --prefix=/usr/local --enable-threads=posix --mandir=/usr/share/man --infodir=/usr/share/info --enable-checking=release --disable-libunwind-exceptions --with-gmp=/usr/share/doc/gmp-4.2.2 --with-mpfr=/usr/share/doc/mpfr-2.4.2
16. and got:
e-libunwind-exceptions --with-gmp=/usr/share/doc/gmp-4.2.2 --with-mpfr=/usr/share/doc/mpfr-2.4.2
checking build system type... i686-pc-linux-gnu
checking host system type... i686-pc-linux-gnu
checking target system type... i686-pc-linux-gnu
checking for a BSD-compatible install... /usr/bin/install -c
checking whether ln works... yes
checking whether ln -s works... yes
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ANSI C... none needed
checking for g++... g++
checking whether we are using the GNU C++ compiler... yes
checking whether g++ accepts -g... yes
checking for gnatbind... no
checking for gnatmake... no
checking whether compiler driver understands Ada... no
checking how to compare bootstrapped objects... cmp --ignore-initial=16 $$f1 $$f2
checking for correct version of gmp.h... yes
checking for correct version of mpfr.h... no
configure: error: Building GCC requires GMP 4.1+ and MPFR 2.3.2+.
Try the --with-gmp and/or --with-mpfr options to specify their locations.
Copies of these libraries' source code can be found at their respective
hosting sites as well as at ftp://gcc.gnu.org/pub/gcc/infrastructure/.
See also http://gcc.gnu.org/install/prerequisites.html for additional info.
If you obtained GMP and/or MPFR from a vendor distribution package, make
sure that you have installed both the libraries and the header files.
They may be located in separate packages.

17. From the /usr/share/doc folder I did an "mv mpfr-2.4.2 /home/username/gcc-4.4.2/mpfr"
18. Tried ../gcc-4.4.2/configure --prefix=/usr/local --enable-threads=posix --mandir=/usr/share/man --infodir=/usr/share/info --enable-checking=release --disable-libunwind-exceptions --with-gmp=/usr/share/doc/gmp-4.2.2
19. and got:
ibunwind-exceptions --with-gmp=/usr/share/doc/gmp-4.2.2
checking build system type... i686-pc-linux-gnu
checking host system type... i686-pc-linux-gnu
checking target system type... i686-pc-linux-gnu
checking for a BSD-compatible install... /usr/bin/install -c
checking whether ln works... yes
checking whether ln -s works... yes
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ANSI C... none needed
checking for g++... g++
checking whether we are using the GNU C++ compiler... yes
checking whether g++ accepts -g... yes
checking for gnatbind... no
checking for gnatmake... no
checking whether compiler driver understands Ada... no
checking how to compare bootstrapped objects... cmp --ignore-initial=16 $$f1 $$f2
checking for version 0.10 of PPL... no
checking for correct version of CLooG... no
The following languages will be built: c,c++,fortran,java,objc
*** This configuration is not supported in the following subdirectories:
target-libada gnattools
(Any other directories should still work fine.)
checking for bison... bison -y
checking for bison... bison
checking for gm4... no
checking for gnum4... no
checking for m4... m4
checking for flex... flex
checking for flex... flex
checking for makeinfo... makeinfo
checking for expect... no
checking for runtest... no
checking for ar... ar
checking for as... as
checking for dlltool... no
checking for ld... ld
checking for lipo... no
checking for nm... nm
checking for ranlib... ranlib
checking for strip... strip
checking for windres... no
checking for windmc... no
checking for objcopy... objcopy
checking for objdump... objdump
checking for cc... cc
checking for c++... c++
checking for gcc... gcc
checking for gcj... gcj
checking for gfortran... gfortran
checking for ar... no
checking for ar... ar
checking for as... no
checking for as... as
checking for dlltool... no
checking for dlltool... no
checking for ld... no
checking for ld... ld
checking for lipo... no
checking for lipo... no
checking for nm... no
checking for nm... nm
checking for objdump... no
checking for objdump... objdump
checking for ranlib... no
checking for ranlib... ranlib
checking for strip... no
checking for strip... strip
checking for windres... no
checking for windres... no
checking for windmc... no
checking for windmc... no
checking where to find the target ar... host tool
checking where to find the target as... host tool
checking where to find the target cc... just compiled
checking where to find the target c++... just compiled
checking where to find the target c++ for libstdc++... just compiled
checking where to find the target dlltool... host tool
checking where to find the target gcc... just compiled
checking where to find the target gcj... just compiled
checking where to find the target gfortran... just compiled
checking where to find the target ld... host tool
checking where to find the target lipo... host tool
checking where to find the target nm... host tool
checking where to find the target objdump... host tool
checking where to find the target ranlib... host tool
checking where to find the target strip... host tool
checking where to find the target windres... host tool
checking where to find the target windmc... host tool
checking whether to enable maintainer-specific portions of Makefiles... no
checking whether -fkeep-inline-functions is supported... yes
configure: creating ./config.status
config.status: creating Makefile

20. Now my gccbuild folder contains : config.log config.status Makefile serdep.tmp
21. Typed make
22. a lot of "checking" lines later I got this:
Configuring stage 1 in ./mpfr
configure: WARNING: unrecognized options: --enable-threads, --enable-checking, --disable-libunwind-exceptions, --enable-languages, --disable-intermodule, --enable-checking, --disable-coverage, --enable-languages
configure: creating cache ./config.cache
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for none-pc-linux-gnu-strip... no
checking for strip... strip
configure: WARNING: using cross tools not prefixed with host triplet
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
configure: error: source directory already configured; run "make distclean" there first
make[2]: *** [configure-stage1-mpfr] Error 1
make[2]: Leaving directory `/home/username/gccbuild'
make[1]: *** [stage1-bubble] Error 2
make[1]: Leaving directory `/home/username/gccbuild'
make: *** [all] Error 2

23. went to the gcc-4.4.2/mpfr/ directory
24. typed "su" and logged in as root user
25. ran "make distclean"
26. Ctrl+d
27. entered the gccbuild folder
28. typed "make distclean"
29. Deleted the rest of the files in the folder
30. ran ../gcc-4.4.2/configure --prefix=/usr/local --enable-threads=posix --mandir=/usr/share/man --infodir=/usr/share/info --enable-checking=release --disable-libunwind-exceptions --with-gmp=/usr/share/doc/gmp-4.2.2
31. typed make
32. The build process started at 13:15 hrs
33. Build completed 14:19 hrs with the final lines as:
make[5]: Leaving directory `/home/username/gccbuild/i686-pc-linux-gnu/libgomp'
/home/username/gccbuild/./gcc/gfortran -B/home/username/gccbuild/./gcc/ -B/usr/local/i686-pc-linux-gnu/bin/ -B/usr/local/i686-pc-linux-gnu/lib/ -isystem /usr/local/i686-pc-linux-gnu/include -isystem /usr/local/i686-pc-linux-gnu/sys-include -g -O2 -Wall -fsyntax-only omp_lib.f90
make[4]: Leaving directory `/home/username/gccbuild/i686-pc-linux-gnu/libgomp'
make[3]: Leaving directory `/home/username/gccbuild/i686-pc-linux-gnu/libgomp'
make[2]: Leaving directory `/home/username/gccbuild/i686-pc-linux-gnu/libgomp'
make[1]: Leaving directory `/home/username/gccbuild'

34. You can optionally run some tests as specified here: http://gcc.gnu.org/install/test.html
35. Otherwise, in the gccbuild directory, type "su"
36. Log in as root user
37. Type 'make install'
38. The installation procedure will begin. For me, it took two to three minutes.
39. That's it! gcc is installed in your system. You can log out of root with Ctrl+d
40. Type "gcc -v" and you'll see the new version number of gcc Enjoy!!!

Using built-in specs.
Target: i686-pc-linux-gnu
Configured with: ../gcc-4.4.2/configure --prefix=/usr/local --enable-threads=posix --mandir=/usr/share/man --infodir=/usr/share/info --enable-checking=release --disable-libunwind-exceptions --with-gmp=/usr/share/doc/gmp-4.2.2
Thread model: posix
gcc version 4.4.2 (GCC)

Tried make -k check. It showed "PASS" for many tests and then came to a part where it needed overwriting permissions. So I pressed Ctrl+C, logged in with 'su' and ran "make -k check" again. This time, it gave me:

Collector appears to work
Completed 368 collections
PASS: gctest
==================
All 1 tests passed
==================

28 August 2008

Nth permutation without swapping; without recursion

Colleagues say I have good pattern recognition skills. It's perhaps this skill that gave me a unique solution to one of our assignment problems when I was doing my rigorous PGDST course at C-DAC.

You'd get many programs for finding the N'th lexicographic (alphabetical order) permutation of a string. They're done with recursion and swapping.
I present you a completely unique algorithm which I've devised myself. It makes use of no recursion or swapping. Besides, the algorithm is WAY shorter than the others.

Consider you have a string with 'e' elements. You're asked to find the N'th lexicographic permutation.
The sequence for three elements would be:
abc, acb, bac, bca, cab, cba

But my algorithm won't even have to generate this list. It directly reaches the Nth permutation. How? Read on...



The Algorithm:
 
1. e=number of elements in string. [Store them in an array as 'abc', where a is in the zero'th position of the array]
2. n=n'th permutation of the string.
3. division=(e!)/e [This divides the list into equal sections](where e! is 'e factorial'. If e=3, e!=3*2*1)
4. Calculate pos=ceil(n/division) to find where the n'th string would be in the list.
5. Find the pos-1 element in the array.
6. Concatenate the element found from step 5, in the final output string.
7. e=e-1 [decrease the number of elements]
8. Remove the pos-1 element from the array and reinitialize the array with only the leftover characters.
9. oldDivision=division [store temporarily]
10. n=n-(oldDivision*(pos-1))
11. Goto step 3 if you haven't iterated 'length of the original string' times.
12. Print the output string.



The code:

package nthpermutation;

public class NthPermutation {

 public static void main(String[] args) {

     int NthPermutationToConsider = 1;//change this number to the value of N you want

     String sampleString = "abcd";
     int numberOfLettersForPermutation = sampleString.length();

     String[] oneLetter = new String[numberOfLettersForPermutation];
     String outputString = "";//string to be outputString
     for (int i = 0; i < numberOfLettersForPermutation; i++) {
         oneLetter[i] = sampleString.substring(i, i + 1);
     }

     int elements;
     double pos;
     float oldDivision;
     float division;
     elements = numberOfLettersForPermutation;
     oldDivision = 0;

     for (int i = 0; i < numberOfLettersForPermutation; i++) {
         division = fac(elements) / elements;
         float temp = NthPermutationToConsider / division;
         pos = Math.ceil(temp);
         outputString = outputString + oneLetter[(int) pos - 1];
         oneLetter[(int) pos - 1] = "999";
         elements--;
         String[] t = new String[elements];
         int counter = 0;
         for (int j = 0; j < oneLetter.length; j++) {
             if (!oneLetter[j].equals("999")) {
             t[counter++] = oneLetter[j];
         }
     }
     oneLetter = t;
     oldDivision = division;
     NthPermutationToConsider = NthPermutationToConsider - ((int) oldDivision * ((int) pos - 1));
 }
     System.out.println(outputString);
 }//main

 private static int fac(int n) {
     int j = 1;
     for (int i = 1; i <= n; i++) {
         j = j * i;
     }
     return j;
 }

}//class