Over the weekend a fellow software developer sent me an email message with a question regarding the JUnit Example post. Given that the interchange did not occur via the message section following all posts, I will not post the sequence of messages. The question was not regarding an existing test case in the TriangleTest class. What he was interested in is a new test case in which one could generate a text file with the information to run multiple (e.g., 100) test cases at once. If you are interested you can find the proposed solution in my GitHub repository. I post it as a
second branch. I will not be merging branches due to the fact that this modification would not work with the original challenge. In addition, I did modify the test scaffolding on the Solution not to prompt for the lengths of the sides in the triangle. It is easier to copy and paste the sides that to be prompted for each side separately.
I mentioned in a previous post that over the past weekend I was going to load and experiment with TensorFlow 2.0. I was planning on using Linux and for completeness Windows. I was not not able to complete the Linux or Windows installations.
I started by reading and watching the videos in the “TensorFlow is dead, long live TensorFlow” post by Cassie Kozyrkov. All was well so far.
TensorFlow 2.0 is in alpha release. The full official release is scheduled for sometime in spring 2019. The installation seems to be quite simple. The documentation is located here. I booked marked on Chrome the TensorFlow web site.
Seems like Google decided to use Keras as an interface for TensorFlow 2.0. The new version supports CPU, GPU and TPU processing. When I first started experimenting with TensorFlow 1.0 it only supported CPU and GPU.
!!! NOTE !!!
The first thing you need to do is to check if your computer supports AVX instructions. You can find more on AVX here . If your compute does not, you can install previous versions of TensorFlow. Given that you want to install the latest and greatest, this is a deal breaker. See below how to check for AVX support.
The first item was for me to check if Python, pip3 and virtualenv were installed and their associated versions.
$ python3 --version Python 3.6.5 :: Anaconda, Inc. $ pip3 --version pip 18.1 from /home/johncanessa/anaconda3/lib/python3.6/site-packages/pip (python 3.6) $ pip --version pip 19.0.3 from /home/johncanessa/anaconda3/lib/python3.6/site-packages/pip (python 3.6) $ virtualenv --version 16.4.3
The next step was to create a virtual environment to make sure there are no conflicts if different components (e.g., Python) are updated.
$ virtualenv --system-site-packages -p python3 ./venv Running virtualenv with interpreter /home/johncanessa/anaconda3/bin/python3 Using base prefix '/home/johncanessa/anaconda3' New python executable in /home/johncanessa/TensorFlow/venv/bin/python3 Also creating executable in /home/johncanessa/TensorFlow/venv/bin/python Installing setuptools, pip, wheel... done.
The next step is to activate the virtual environment we created in the previous step.
$ source ./venv/bin/activate # sh, bash, ksh, or zsh (venv) $ pip install --upgrade pip Requirement already up-to-date: pip in ./venv/lib/python3.6/site-packages (19.0.3) (venv) $
Just to check out things, I ran the following to see which packages were installed in our virtual environment (venv):
(venv) $ pip list # show packages installed within the virtual environment Package Version ---------------------------------- --------- alabaster 0.7.10 anaconda-client 1.6.14 anaconda-navigator 1.4.3 anaconda-project 0.8.2 asn1crypto 0.24.0 astroid 1.6.3 astropy 3.0.2 attrs 18.1.0 Babel 2.5.3 backcall 0.1.0 backports.shutil-get-terminal-size 1.0.0 beautifulsoup4 4.6.0 bitarray 0.8.1 bkcharts 0.2 blaze 0.11.3 bleach 2.1.3 bokeh 0.12.16 boto 2.48.0 Bottleneck 1.2.1 certifi 2018.4.16 cffi 1.11.5 chardet 3.0.4 chest 0.2.3 click 6.7 cloudpickle 0.5.3 clyent 1.2.2 colorama 0.3.9 conda 4.4.6 configobj 5.0.6 contextlib2 0.5.5 cryptography 2.2.2 cycler 0.10.0 Cython 0.28.2 cytoolz 0.9.0.1 dask 0.17.5 datashape 0.5.4 decorator 4.3.0 dill 0.2.5 distributed 1.21.8 docutils 0.14 entrypoints 0.2.3 et-xmlfile 1.0.1 fastcache 1.0.2 filelock 3.0.4 Flask 1.0.2 Flask-Cors 3.0.4 gevent 1.3.0 glob2 0.6 gmpy2 2.0.8 greenlet 0.4.13 h5py 2.7.1 heapdict 1.0.0 html5lib 1.0.1 idna 2.6 imageio 2.3.0 imagesize 1.0.0 ipykernel 4.8.2 ipython 6.4.0 ipython-genutils 0.2.0 ipywidgets 7.2.1 isort 4.3.4 itsdangerous 0.24 jdcal 1.4 jedi 0.12.0 Jinja2 2.10 jsonschema 2.6.0 jupyter 1.0.0 jupyter-client 5.2.3 jupyter-console 5.2.0 jupyter-core 4.4.0 jupyterlab 0.32.1 jupyterlab-launcher 0.10.5 kiwisolver 1.0.1 lazy-object-proxy 1.3.1 llvmlite 0.23.1 locket 0.2.0 lxml 4.2.1 MarkupSafe 1.0 matplotlib 2.2.2 mccabe 0.6.1 mistune 0.8.3 mkl-fft 1.0.0 mkl-random 1.0.1 more-itertools 4.1.0 mpmath 1.0.0 msgpack-python 0.5.6 multipledispatch 0.5.0 nbconvert 5.3.1 nbformat 4.4.0 networkx 2.1 nltk 3.3 nose 1.3.7 notebook 5.5.0 numba 0.38.0 numexpr 2.6.5 numpy 1.14.3 numpydoc 0.8.0 odo 0.5.1 olefile 0.45.1 openpyxl 2.5.3 packaging 17.1 pandas 0.23.0 pandocfilters 1.4.2 parso 0.2.0 partd 0.3.8 path.py 11.0.1 pathlib2 2.3.2 patsy 0.5.0 pep8 1.7.1 pexpect 4.5.0 pickleshare 0.7.4 Pillow 5.1.0 pip 19.0.3 pkginfo 1.4.2 pluggy 0.6.0 ply 3.11 prompt-toolkit 1.0.15 psutil 5.4.5 ptyprocess 0.5.2 py 1.5.3 pyasn1 0.1.9 pycodestyle 2.4.0 pycosat 0.6.3 pycparser 2.18 pycrypto 2.6.1 pycurl 7.43.0.1 pyflakes 1.6.0 Pygments 2.2.0 pylint 1.8.4 pyodbc 4.0.23 pyOpenSSL 18.0.0 pyparsing 2.2.0 PySocks 1.6.8 pytest 3.5.1 pytest-arraydiff 0.2 pytest-astropy 0.3.0 pytest-doctestplus 0.1.3 pytest-openfiles 0.3.0 pytest-remotedata 0.2.1 python-dateutil 2.7.3 pytz 2018.4 PyWavelets 0.5.2 PyYAML 3.12 pyzmq 17.0.0 QtAwesome 0.4.4 qtconsole 4.3.1 QtPy 1.4.1 redis 2.10.5 requests 2.18.4 rope 0.10.7 ruamel-yaml 0.15.35 scikit-image 0.13.1 scikit-learn 0.19.1 scipy 1.1.0 seaborn 0.8.1 Send2Trash 1.5.0 setuptools 40.8.0 simplegeneric 0.8.1 singledispatch 3.4.0.3 six 1.11.0 snowballstemmer 1.2.1 sockjs-tornado 1.0.3 sortedcollections 0.6.1 sortedcontainers 1.5.10 Sphinx 1.7.4 sphinxcontrib-websupport 1.0.1 spyder 3.2.8 SQLAlchemy 1.2.7 statsmodels 0.9.0 sympy 1.1.1 tables 3.4.3 tblib 1.3.2 terminado 0.8.1 testpath 0.3.1 toolz 0.9.0 tornado 5.0.2 traitlets 4.3.2 typing 3.6.4 unicodecsv 0.14.1 urllib3 1.22 virtualenv 16.4.3 wcwidth 0.1.7 webencodings 0.5.1 Werkzeug 0.14.1 wheel 0.33.1 widgetsnbextension 3.2.1 wrapt 1.10.11 xlrd 1.1.0 XlsxWriter 1.0.4 xlwt 1.3.0 zict 0.1.3 (venv) $
I thought I was so close to get TensorFlow 2.0 installed! The next step was to install TensorFlow 2.0:
(venv) $ cd $HOME (venv) $ pwd /home/johncanessa (venv) $ pip3 install --user --upgrade tensorflow # install in $HOME Collecting tensorflow Using cached https://files.pythonhosted.org/packages/77/63/a9fa76de8dffe7455304c4ed635be4aa9c0bacef6e0633d87d5f54530c5c/tensorflow-1.13.1-cp36-cp36m-manylinux1_x86_64.whl Requirement already satisfied, skipping upgrade: astor>=0.6.0 in ./TensorFlow/venv/lib/python3.6/site-packages (from tensorflow) (0.7.1) Requirement already satisfied, skipping upgrade: grpcio>=1.8.6 in ./TensorFlow/venv/lib/python3.6/site-packages (from tensorflow) (1.19.0) Requirement already satisfied, skipping upgrade: gast>=0.2.0 in ./TensorFlow/venv/lib/python3.6/site-packages (from tensorflow) (0.2.2) Requirement already satisfied, skipping upgrade: tensorboard<1.14.0,>=1.13.0 in ./TensorFlow/venv/lib/python3.6/site-packages (from tensorflow) (1.13.1) Requirement already satisfied, skipping upgrade: six>=1.10.0 in ./anaconda3/lib/python3.6/site-packages (from tensorflow) (1.11.0) Requirement already satisfied, skipping upgrade: tensorflow-estimator<1.14.0rc0,>=1.13.0 in ./TensorFlow/venv/lib/python3.6/site-packages (from tensorflow) (1.13.0) Requirement already satisfied, skipping upgrade: absl-py>=0.1.6 in ./TensorFlow/venv/lib/python3.6/site-packages (from tensorflow) (0.7.1) Requirement already satisfied, skipping upgrade: numpy>=1.13.3 in ./anaconda3/lib/python3.6/site-packages (from tensorflow) (1.14.3) Requirement already satisfied, skipping upgrade: keras-applications>=1.0.6 in ./TensorFlow/venv/lib/python3.6/site-packages (from tensorflow) (1.0.7) Requirement already satisfied, skipping upgrade: protobuf>=3.6.1 in ./TensorFlow/venv/lib/python3.6/site-packages (from tensorflow) (3.7.1) Requirement already satisfied, skipping upgrade: termcolor>=1.1.0 in ./TensorFlow/venv/lib/python3.6/site-packages (from tensorflow) (1.1.0) Requirement already satisfied, skipping upgrade: keras-preprocessing>=1.0.5 in ./TensorFlow/venv/lib/python3.6/site-packages (from tensorflow) (1.0.9) Requirement already satisfied, skipping upgrade: wheel>=0.26 in ./TensorFlow/venv/lib/python3.6/site-packages (from tensorflow) (0.33.1) Requirement already satisfied, skipping upgrade: markdown>=2.6.8 in ./TensorFlow/venv/lib/python3.6/site-packages (from tensorboard<1.14.0,>=1.13.0->tensorflow) (3.1) Requirement already satisfied, skipping upgrade: werkzeug>=0.11.15 in ./anaconda3/lib/python3.6/site-packages (from tensorboard<1.14.0,>=1.13.0->tensorflow) (0.14.1) Requirement already satisfied, skipping upgrade: mock>=2.0.0 in ./TensorFlow/venv/lib/python3.6/site-packages (from tensorflow-estimator<1.14.0rc0,>=1.13.0->tensorflow) (2.0.0) Requirement already satisfied, skipping upgrade: h5py in ./anaconda3/lib/python3.6/site-packages (from keras-applications>=1.0.6->tensorflow) (2.7.1) Requirement already satisfied, skipping upgrade: setuptools in ./TensorFlow/venv/lib/python3.6/site-packages (from protobuf>=3.6.1->tensorflow) (40.8.0) Requirement already satisfied, skipping upgrade: pbr>=0.11 in ./TensorFlow/venv/lib/python3.6/site-packages (from mock>=2.0.0->tensorflow-estimator<1.14.0rc0,>=1.13.0->tensorflow) (5.1.3) Installing collected packages: tensorflow The scripts freeze_graph, saved_model_cli, tensorboard, tf_upgrade_v2, tflite_convert, toco and toco_from_protos are installed in '/home/johncanessa/.local/bin' which is not on PATH. Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location. Successfully installed tensorflow-1.13.1 (venv) $
A message came up during the installation regarding the PATH so I addressed it.
The script markdown_py is installed in '/home/johncanessa/.local/bin' which is not on PATH. Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
The final item was to check the installation:
(venv) $ python -c "import tensorflow as tf; tf.enable_eager_execution(); print(tf.reduce_sum(tf.random_normal([1000, 1000])))" 2019-03-31 07:31:01.946494: F tensorflow/core/platform/cpu_feature_guard.cc:37] The TensorFlow library was compiled to use AVX instructions, but these aren't available on your machine. Abort(coredump)
Apparently TensorFlow 2.0 is compiled with AVX instructions. I tried the following to see if my Linux machine had support for AVX:
(venv) $ sudo dmidecode | grep "avx" (venv) $ grep avx /proc/cpuinfo (venv) $ lscpu | grep "avx"
For kicks and giggles I decided to check out TensorFlow 1.5 as you can see here:
(venv) $ pip3 install --user --upgrade tensorflow==1.5 Collecting tensorflow==1.5 Using cached https://files.pythonhosted.org/packages/04/79/a37d0b373757b4d283c674a64127bd8864d69f881c639b1ee5953e2d9301/tensorflow-1.5.0-cp36-cp36m-manylinux1_x86_64.whl Requirement already satisfied, skipping upgrade: protobuf>=3.4.0 in /home/johncanessa/TensorFlow/venv/lib/python3.6/site-packages (from tensorflow==1.5) (3.7.1) Requirement already satisfied, skipping upgrade: wheel>=0.26 in /home/johncanessa/TensorFlow/venv/lib/python3.6/site-packages (from tensorflow==1.5) (0.33.1) Requirement already satisfied, skipping upgrade: absl-py>=0.1.6 in /home/johncanessa/TensorFlow/venv/lib/python3.6/site-packages (from tensorflow==1.5) (0.7.1) Requirement already satisfied, skipping upgrade: numpy>=1.12.1 in /home/johncanessa/anaconda3/lib/python3.6/site-packages (from tensorflow==1.5) (1.14.3) Requirement already satisfied, skipping upgrade: tensorflow-tensorboard<1.6.0,>=1.5.0 in /home/johncanessa/.local/lib/python3.6/site-packages (from tensorflow==1.5) (1.5.1) Requirement already satisfied, skipping upgrade: six>=1.10.0 in /home/johncanessa/anaconda3/lib/python3.6/site-packages (from tensorflow==1.5) (1.11.0) Requirement already satisfied, skipping upgrade: setuptools in /home/johncanessa/TensorFlow/venv/lib/python3.6/site-packages (from protobuf>=3.4.0->tensorflow==1.5) (40.8.0) Requirement already satisfied, skipping upgrade: werkzeug>=0.11.10 in /home/johncanessa/anaconda3/lib/python3.6/site-packages (from tensorflow-tensorboard<1.6.0,>=1.5.0->tensorflow==1.5) (0.14.1) Requirement already satisfied, skipping upgrade: markdown>=2.6.8 in /home/johncanessa/TensorFlow/venv/lib/python3.6/site-packages (from tensorflow-tensorboard<1.6.0,>=1.5.0->tensorflow==1.5) (3.1) Requirement already satisfied, skipping upgrade: bleach==1.5.0 in /home/johncanessa/.local/lib/python3.6/site-packages (from tensorflow-tensorboard<1.6.0,>=1.5.0->tensorflow==1.5) (1.5.0) Requirement already satisfied, skipping upgrade: html5lib==0.9999999 in /home/johncanessa/.local/lib/python3.6/site-packages (from tensorflow-tensorboard<1.6.0,>=1.5.0->tensorflow==1.5) (0.9999999) Installing collected packages: tensorflow Found existing installation: tensorflow 1.13.1 Not uninstalling tensorflow at /home/johncanessa/.local/lib/python3.6/site-packages, outside environment /home/johncanessa/TensorFlow/venv Can't uninstall 'tensorflow'. No files were found to uninstall. The scripts freeze_graph, saved_model_cli, tensorboard, toco and toco_from_protos are installed in '/home/johncanessa/.local/bin' which is not on PATH. Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location. Successfully installed tensorflow-1.13.1 (venv) $
When you are done experimenting with TensorFlow you can exit the virtual environment:
(venv) $ deactivate # don't exit until you're done using TensorFlow
I should have tested for AVX instructions as the first step. I did not. I then decided to quickly check with my main Windows 10 machine.
C:\Temp>coreinfo Coreinfo v3.31 - Dump information on system CPU and memory topology Copyright (C) 2008-2014 Mark Russinovich Sysinternals - www.sysinternals.com Intel(R) Xeon(R) CPU E5606 @ 2.13GHz Intel64 Family 6 Model 44 Stepping 2, GenuineIntel Microcode signature: 0000001F HTT * Hyperthreading enabled HYPERVISOR - Hypervisor is present VMX * Supports Intel hardware-assisted virtualization SVM - Supports AMD hardware-assisted virtualization X64 * Supports 64-bit mode SMX * Supports Intel trusted execution SKINIT - Supports AMD SKINIT NX * Supports no-execute page protection SMEP - Supports Supervisor Mode Execution Prevention SMAP - Supports Supervisor Mode Access Prevention PAGE1GB * Supports 1 GB large pages PAE * Supports > 32-bit physical addresses PAT * Supports Page Attribute Table PSE * Supports 4 MB pages PSE36 * Supports > 32-bit address 4 MB pages PGE * Supports global bit in page tables SS * Supports bus snooping for cache operations VME * Supports Virtual-8086 mode RDWRFSGSBASE - Supports direct GS/FS base access FPU * Implements i387 floating point instructions MMX * Supports MMX instruction set MMXEXT - Implements AMD MMX extensions 3DNOW - Supports 3DNow! instructions 3DNOWEXT - Supports 3DNow! extension instructions SSE * Supports Streaming SIMD Extensions SSE2 * Supports Streaming SIMD Extensions 2 SSE3 * Supports Streaming SIMD Extensions 3 SSSE3 * Supports Supplemental SIMD Extensions 3 SSE4a - Supports Streaming SIMDR Extensions 4a SSE4.1 * Supports Streaming SIMD Extensions 4.1 SSE4.2 * Supports Streaming SIMD Extensions 4.2 AES * Supports AES extensions AVX - Supports AVX intruction extensions <==== FMA - Supports FMA extensions using YMM state MSR * Implements RDMSR/WRMSR instructions MTRR * Supports Memory Type Range Registers XSAVE - Supports XSAVE/XRSTOR instructions OSXSAVE - Supports XSETBV/XGETBV instructions RDRAND - Supports RDRAND instruction RDSEED - Supports RDSEED instruction CMOV * Supports CMOVcc instruction CLFSH * Supports CLFLUSH instruction CX8 * Supports compare and exchange 8-byte instructions CX16 * Supports CMPXCHG16B instruction BMI1 - Supports bit manipulation extensions 1 BMI2 - Supports bit manipulation extensions 2 ADX - Supports ADCX/ADOX instructions DCA * Supports prefetch from memory-mapped device F16C - Supports half-precision instruction FXSR * Supports FXSAVE/FXSTOR instructions FFXSR - Supports optimized FXSAVE/FSRSTOR instruction MONITOR * Supports MONITOR and MWAIT instructions MOVBE - Supports MOVBE instruction ERMSB - Supports Enhanced REP MOVSB/STOSB PCLMULDQ * Supports PCLMULDQ instruction POPCNT * Supports POPCNT instruction LZCNT - Supports LZCNT instruction SEP * Supports fast system call instructions LAHF-SAHF * Supports LAHF/SAHF instructions in 64-bit mode HLE - Supports Hardware Lock Elision instructions RTM - Supports Restricted Transactional Memory instructions DE * Supports I/O breakpoints including CR4.DE DTES64 * Can write history of 64-bit branch addresses DS * Implements memory-resident debug buffer DS-CPL * Supports Debug Store feature with CPL PCID * Supports PCIDs and settable CR4.PCIDE INVPCID - Supports INVPCID instruction PDCM * Supports Performance Capabilities MSR RDTSCP * Supports RDTSCP instruction TSC * Supports RDTSC instruction TSC-DEADLINE - Local APIC supports one-shot deadline timer TSC-INVARIANT * TSC runs at constant rate xTPR * Supports disabling task priority messages EIST * Supports Enhanced Intel Speedstep ACPI * Implements MSR for power management TM * Implements thermal monitor circuitry TM2 * Implements Thermal Monitor 2 control APIC * Implements software-accessible local APIC x2APIC - Supports x2APIC CNXT-ID - L1 data cache mode adaptive or BIOS MCE * Supports Machine Check, INT18 and CR4.MCE MCA * Implements Machine Check Architecture PBE * Supports use of FERR#/PBE# pin PSN - Implements 96-bit processor serial number PREFETCHW * Supports PREFETCHW instruction Maximum implemented CPUID leaves: 0000000B (Basic), 80000008 (Extended). Logical to Physical Processor Map: *------- Physical Processor 0 -*------ Physical Processor 1 --*----- Physical Processor 2 ---*---- Physical Processor 3 ----*--- Physical Processor 4 -----*-- Physical Processor 5 ------*- Physical Processor 6 -------* Physical Processor 7 Logical Processor to Socket Map: ****---- Socket 0 ----**** Socket 1 Logical Processor to NUMA Node Map: ******** NUMA Node 0 No NUMA nodes. Logical Processor to Cache Map: *------- Data Cache 0, Level 1, 32 KB, Assoc 8, LineSize 64 *------- Instruction Cache 0, Level 1, 32 KB, Assoc 4, LineSize 64 *------- Unified Cache 0, Level 2, 256 KB, Assoc 8, LineSize 64 ****---- Unified Cache 1, Level 3, 8 MB, Assoc 16, LineSize 64 -*------ Data Cache 1, Level 1, 32 KB, Assoc 8, LineSize 64 -*------ Instruction Cache 1, Level 1, 32 KB, Assoc 4, LineSize 64 -*------ Unified Cache 2, Level 2, 256 KB, Assoc 8, LineSize 64 --*----- Data Cache 2, Level 1, 32 KB, Assoc 8, LineSize 64 --*----- Instruction Cache 2, Level 1, 32 KB, Assoc 4, LineSize 64 --*----- Unified Cache 3, Level 2, 256 KB, Assoc 8, LineSize 64 ---*---- Data Cache 3, Level 1, 32 KB, Assoc 8, LineSize 64 ---*---- Instruction Cache 3, Level 1, 32 KB, Assoc 4, LineSize 64 ---*---- Unified Cache 4, Level 2, 256 KB, Assoc 8, LineSize 64 ----*--- Data Cache 4, Level 1, 32 KB, Assoc 8, LineSize 64 ----*--- Instruction Cache 4, Level 1, 32 KB, Assoc 4, LineSize 64 ----*--- Unified Cache 5, Level 2, 256 KB, Assoc 8, LineSize 64 ----**** Unified Cache 6, Level 3, 8 MB, Assoc 16, LineSize 64 -----*-- Data Cache 5, Level 1, 32 KB, Assoc 8, LineSize 64 -----*-- Instruction Cache 5, Level 1, 32 KB, Assoc 4, LineSize 64 -----*-- Unified Cache 7, Level 2, 256 KB, Assoc 8, LineSize 64 ------*- Data Cache 6, Level 1, 32 KB, Assoc 8, LineSize 64 ------*- Instruction Cache 6, Level 1, 32 KB, Assoc 4, LineSize 64 ------*- Unified Cache 8, Level 2, 256 KB, Assoc 8, LineSize 64 -------* Data Cache 7, Level 1, 32 KB, Assoc 8, LineSize 64 -------* Instruction Cache 7, Level 1, 32 KB, Assoc 4, LineSize 64 -------* Unified Cache 9, Level 2, 256 KB, Assoc 8, LineSize 64 Logical Processor to Group Map: ******** Group 0 C:\Temp>
I used the coreinfo utility which you can download from the web. It comes in a zip file. I unzipped and copied it to my c:\temp folder. As you can see my main Windows machine does not support AVX either.
Next weekend I will bring up a new machine I got a year or so ago but have not brought up. If it is running Linux I will try the TensorFlow 2.0 installation. If it is a Windows machine I will install TensorFlow 2.0 on the new Windows system until I get a new computer with Linux. That can take me a few weeks.
Hope you enjoyed and learned something from my mistakes.
If you have comments or questions regarding this or any other post in this blog, or if you need help on any SDLC phase in a software development project, please leave me a note below. Requests for help will not be made public.
Keep on reading and experimenting. It is the best way to learn.
John
Follow me on Twitter: @john_canessa