[python] Building and installing python3.x with python2.x in Linux

RHEL 6.x doesn't comes with python3. So if any of your project require python3 and also some of the projects need python2 then you may need those 2 version same time in your system.

Prerequisite:
gcc (C89)/g++
ld
ranlib


How:
1. Download python3.x package from https://www.python.org/downloads/release/python-343/
2. Extract it and move inside the package python-3.4.3
$ cd /python-3.4.3
3. Open a console and run the following configure command. We will build python with shared library support as many of the other project will require python3 dynamic library linking.

so, configure it by,
$ ./configure --prefix=/opt/python3 --enable-shared

We are putting build output directory as /opt/python3.

4. After completion now build it by,

$ make
 5. Then install it by alternate installation by,
$ make altinstall

6. Now create a symlink of the newly created python3 binary and copy the shared library to the /lib64/ directory of filesystem.
$ ln -s /opt/python3/bin/python3.4 /usr/bin/python3
$ cp /opt/python3/libpython3.* /lib64/
7.  Now run python script by,
 $ python3 my.py
And your python2 is also ok and usable!


[IPv6] Various address reachability scope on IPv6 network

IPv6 comes with various IP address terminology which can be assign to a system. Lets simply clarify their name and scope of reachability respect to IPv6. 


 In general it has four address type one of which is depreciated by RFC standard.

1. Link Local Address (LLA)
Description: Link-local address can be access in directly connected router. Its basically same as IPv4 private address. 
 
2. Unique Local Address (ULA)
Description:Unique Local Address(ULA), they will often be advertised by IPv6 home gateways for subscriber local use only, and won't be reachable anywhere outside the home. Unique Local Address (ULA), which is an address that is used for local communication in a site – within a company, within a campus or within a set of networks in branch offices.

3. Site Local Address
Description: Deprecated.

4. Global Unicast Address
Description: Global unicast address is basically reachable from anywhere in internet. IPv6 unicast global addresses are similar to IPv4 public addresses.




[MySql] relocation error: /usr/lib64/libmyodbc5.so: symbol strmov, version libmysqlclient_16 not defined

When using myDSN and connection to remote DB(MySQL) this issue arise.

Error:

: relocation error: /usr/lib64/libmyodbc5.so: symbol strove  version libmysqlclient_16 not defined in file libmysqlclient_r.so.16 with link time reference


Cause:

this is an issue of back dated odbc-connector. You can check by systems' isql command that it's also returning same error. It's happen when there is a mismatch between the version of, 

mysql-connector-odbc-5.1.5r1144-7.el6.x86_64.rpm
&
MySQL-shared-compat-advanced-5.6.22-1.el6.x86_64


Solution:

Download and install mysql-connector-odbc-5.3.4-1.el6.x86_64.rpm by,

rpm -Uvh mysql-connector-odbc-5.3.4-1.el6.x86_64.rpm

And after that change the following file,


$ vi /etc/odbcinst.ini

[MySQL]
Description             = ODBC for MySQL
Driver          = /usr/lib64/libmyodbc5w.so
Setup           = /usr/lib64/libodbcmyS.so
Driver64                = /usr/lib64/libmyodbc5w.so
Setup64         = /usr/lib64/libodbcmyS.so
FileUsage               = 1

[MySQL ODBC 5.3 Unicode Driver]
Driver          = /usr/lib64/libmyodbc5w.so
UsageCount              = 1

[MySQL ODBC 5.3 ANSI Driver]
Driver          = /usr/lib64/libmyodbc5a.so
UsageCount              = 1

[Node.js] https connection return curl: (35) Unknown SSL protocol error

Error:

curl: (35) Unknown SSL protocol error

Cause: For node.js https connection you are using invalid certificate. Invalid certificate is because the procedure you create the certificate.

Solution: Use the following mechanism to generate certificate and key.

openssl req -x509 -sha256 -newkey rsa:2048 -keyout key.pem -out cert.pem -days XXX


[Node.js] Error: EISDIR, illegal operation on a directory at Error (native)

Error:

fs.js:552  var r = binding.read(fd, buffer, offset, length, position);                  ^Error: EISDIR, illegal operation on a directory    at Error (native)    at Object.fs.readSync (fs.js:552:19)    at Object.fs.readFileSync (fs.js:384:28)    at /usr/eyeball/auth_server/js/server.js:98:15    at Socket.<anonymous> (/usr/eyeball/auth_server/js/util/process.js:11:5)    at Socket.emit (events.js:129:20)    at _stream_readable.js:908:16    at process._tickCallback (node.js:355:11)

This error happen when you use invalid file path for opening and reading using nodejs dependency library fs. 

Solution:

File must be the file path with the file name. Not the file directory.

[Node.Js] squel.js:167 throw _iteratorError2; ^ ReferenceError: Symbol is not defined

When you are using nodejs on RHEL 6.7 with the following version of default RHEL 6.7 repo,

"node":"0.10.41","npm":"1.4.29"

This is basically a version mismatch of squel library with node. So you just need to downgrade the squel version  or upgrade the nodjs version. Upgrading over 0.10.X in RHEL 6.7 is tough without custom build or some online rpm.

Error:

/usr/eyeball/auth_server/node_modules/squel/squel.js:167        throw _iteratorError2;              ^ReferenceError: Symbol is not defined    at _registerValueHandler (/usr/eyeball/auth_server/node_modules/squel/squel.js:148:36)    at Object._buildSquel.cls.registerValueHandler (/usr/eyeball/auth_server/node_modules/squel/squel.js:294:5)    at _buildSquel (/usr/eyeball/auth_server/node_modules/squel/squel.js:1222:7)    at /usr/eyeball/auth_server/node_modules/squel/squel.js:2971:13    at object (/usr/eyeball/auth_server/node_modules/squel/squel.js:5:22)    at Object.<anonymous> (/usr/eyeball/auth_server/node_modules/squel/squel.js:9:2)   at Module._compile (module.js:456:26)    at Object.Module._extensions..js (module.js:474:10)    at Module.load (module.js:356:32)    at Function.Module._load (module.js:312:12)error: Forever detected script exited with code: 8

Solution:
Remove the previous squel by,
npm uninstall squel
Then install the correct version
npm install squel@4.3.3
Thats it!

[MYSQL] relocation error: /usr/lib64/libmyodbc5.so: symbol strove, version libmysqlclient_16 not defined in file ...

Ok, this is an issue of back dated odbc-connector. You can check by systems' isql command that it's also returning same error. It's happen when there is a mismatch between the version of, 

mysql-connector-odbc-5.1.5r1144-7.el6.x86_64.rpm
&
MySQL-shared-compat-advanced-5.6.22-1.el6.x86_64

download and install mysql-connector-odbc-5.3.4-1.el6.x86_64.rpm by,

wget http://ftp.kaist.ac.kr/mysql/Downloads/Connector-ODBC/5.3/mysql-connector-odbc-5.3.4-1.el6.x86_64.rpmrpm -Uvh mysql-connector-odbc-5.3.4-1.el6.x86_64.rpm

And after that change the following file,


cat /etc/odbcinst.ini[MySQL]Description             = ODBC for MySQLDriver          = /usr/lib64/libmyodbc5w.soSetup           = /usr/lib64/libodbcmyS.soDriver64                = /usr/lib64/libmyodbc5w.soSetup64         = /usr/lib64/libodbcmyS.soFileUsage               = 1 [MySQL ODBC 5.3 Unicode Driver]Driver          = /usr/lib64/libmyodbc5w.soUsageCount              = 1 [MySQL ODBC 5.3 ANSI Driver]Driver          = /usr/lib64/libmyodbc5a.soUsageCount              = 1

[PLAY-FRAMEWORK] UnsupportedClassVersionError: com/typesafe/config/ConfigException : Unsupported major.minor version 52.0

[PLAYFRAMEWORK] Using JRE for running java binary/application made of PLAY framework::


On production system its better not to use JDK as it has compiler on it. So only JAVA runtime installation should do the trick for running PLAY-FRAMEWORK based java application. Its basically REST service providing server.
So lets see how it is done,

code for symbolic link:
  $ export JAVA_HOME=/usr/java/jre1.8.0_91/  $ export PATH=$PATH:$JAVA_HOME/bin
  $ ./your_play_frameworkbased_app


All are done in the same console which doesn't store the JAVA HOME on the system path. 

If the specified  JRE/JDK version is not available on system path or on execution console then running PLAY framework based application will provide following error trace,


Exception in thread "main" java.lang.UnsupportedClassVersionError: com/typesafe/config/ConfigException : Unsupported major.minor version 52.0
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at play.core.server.ProdServerStart$.readServerConfigSettings(ProdServerStart.scala:76)
    at play.core.server.ProdServerStart$.start(ProdServerStart.scala:37)
    at play.core.server.ProdServerStart$.main(ProdServerStart.scala:22)
    at play.core.server.ProdServerStart.main(ProdServerStart.scala)

[HACKERRANK] Problem analysis Manasa and Stone





Problem link: https://www.hackerrank.com/challenges/manasa-and-stones

Manasa is out on a hike with friends. She finds a trail of stones with numbers on them. She starts following the trail and notices that two consecutive stones have a difference of either aa or bb. Legend has it that there is a treasure trove at the end of the trail and if Manasa can guess the value of the last stone, the treasure would be hers. Given that the number on the first stone was 00, find all the possible values for the number on the last stone.
Note: The numbers on the stones are in increasing order.


Analysis: On this problem the questioner is asking for the possible combination of addition of a and b integer in an increasing series and the last number of the series. As it is an increasing series then it is must that either a or b will be added to the next number of the series. So possible combination for the n stone with 2 number (a and b) is 2^n number of solution. But as start stone is always 0, then you have 2^n-1 place. Now as your set consist of just 2 number you can get the number of solution by just increasing occurrence of a and decreasing the number of occurrence b. So at the end last number of the series is,

last num = a*num-occurrence + b * num-occurence

So for  n number of places iterate this equation for the all possible solution,

while(n--)
{
      last num = a*n + b*(max_place - 1 - n) //Where max_place is number of stone
}

N.B. Consider corner cases on input which is not added on the solution analysis.