BCS c++ Class Source Code Generator

This application creates a new c++ class (header and cpp file). A dialog allows the user to supply the target for the source and new module name and a new class name.

The resulting header file is depicted below.

/*
 * newclassh.h
 *
 *  Created on: Apr 5, 2018
 *      Author: Mr. Arch Brooks
 */
 
#ifndef NEWCLASSH_H_
#define NEWCLASSH_H_
 
/**
 * This is some test Doc Text
 */
 
class ncl {
 
/**
 * Private  Declarations Go Here
 */
 
private:
 
/**
 * Public  Declarations Go Here
 */
 
public:
	void gui();
	void mainProc();
};
 
#endif /* NEWCLASSH_H_ */

The associated c++ file is depicted below.

/*
 * newclassh.cpp
 *
 *  Created on: Apr 5, 2018
 *      Author: Mr. Arch Brooks
 */
 
#include "newclassh.h"
 
using namespace std; // @suppress("Symbol is not resolved")
 
void ncl::gui(){
 
}
void ncl::mainProc(){
 
}

This simple code generator reads skeleton files and scripts them in order to produce newly created source code.

Mr. Arch Brooks, Software Engineer, Brooks Computing Systems, LLC authored this article.

BCS c++ Source Code Generator

When this utility is invaded the source code produced includes a utility class, a main program and all the associated files for en Eclipse c++ project.

The header file for the utility is as follows.

/**
 * db01h.h
 *
 *  Created on: Aug 28, 2017
 *  @author    Author: archman
 */
 
#ifndef DB01H_H_
#define DB01H_H_
 
#include <boost/algorithm/string/replace.hpp>
#include <iostream>
#include <fstream>
#include <string>
#include <string>
using namespace std;
const int sizeOfStringArray = 1000;
 
/**
 * This is some test Doc Text
 */
 
class dbc {
 
/**
 * Private  Declarations Go Here
 */
 
private:
 
/**
 * Public  Declarations Go Here
 */
 
public:
 
	int fin(string, string[]);
	void fot(string otf, string stv[sizeOfStringArray], int cnt);
	void fileCopy(string fin, string fot);
	bool forceDirectories(string path);
};
 
#endif /* DB01H_H_ */

The procedure file for the utility is as follows.

/*
 * db01h.cpp
 *
 *  Created on: Aug 28, 2017
 *      Author: archman
 */
#include <boost/filesystem.hpp>
#include <boost/filesystem/fstream.hpp>
#include <boost/algorithm/string.hpp>
#include "db01h.h"
using namespace std;
 
/**
 *This program designed
 */
 
void dbc::fileCopy(string fin, string fot) {
	std::ifstream src(fin, std::ios::binary);
	std::ofstream dst(fot, std::ios::binary);
 
	dst << src.rdbuf();
}
 
int dbc::fin(string inf, string stv[sizeOfStringArray]) {
	string line;
	int lcnt = 0;
 
	ifstream myfile(inf);
	if (myfile.is_open()) {
		while (getline(myfile, line)) {
			stv[lcnt] = line + "\n";
			lcnt++;
		}
 
		myfile.close();
		return lcnt;
 
	}
 
	else
		cout << "Unable to open file";
	return lcnt;
}
 
bool dbc::forceDirectories(string path) {
	boost::filesystem::path dir(path);
 
	if (!(boost::filesystem::exists(dir))) {
		std::cout << path << " Doesn't Exists" << std::endl;
 
		if (boost::filesystem::create_directory(dir))
			std::cout << path << " Successfully Created !" << std::endl;
		return true;
	} else {
		return false;
	}
}
 
void dbc::fot(string otf, string stv[sizeOfStringArray], int cnt) {
	string line;
	int ii = 0;
	ofstream myfile(otf);
	while (ii < cnt) {
		line = stv[ii];
		myfile << line;
		ii++;
	}
	myfile.close();
}

The main program is as follows.

//============================================================================
// Name        : db01p.cpp
// Author      : Mr. Arch Brooks
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
 
/*! \mainpage My Personal Index Page
 *
 * \section intro_sec Introduction
 *
 * This is the introduction.
 *
 * \section install_sec Installation
 *
 * \subsection step1 Step 1: Opening the box
 *
 * etc...
 */
 
#include <iostream>
#include "db01h.h"
 
 
using namespace std;
 
int main(int argc, char* argv[]) {
	Gnome::
	cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
	return 0;
}

 

Mr. Arch Brooks, Software Engineer, Brooks Computing Systems, LLC authored this article.

BCS Create Django Admin

To create and administration site for you models you must first establish a super user by issuing the following command in the project directory.

python3 manage.py createsuperuser

The results of issuing the command is as follows.

Superuser created successfully is the desired result.

Modify the admin.py in your application directory to reflect the following.

from django.contrib import admin
from .models import Post
 
# Register your models here.
 
admin.site.register(Post)

Start the server and bring up the administration web site.

python3 manage.py runserver

In the browser issue the following command.

http://localhost:8000/admin

When prompted to login use the credentials created when you established the superuser.

Mr. Arch Brooks, Software Engineer, Brooks Computing Systems, LLC authored this article.

BCS Create Django Application

Return to the project location in terminal and issue the following command.

django-admin startapp blog

In the terminal application change directories to current application sub directory.

Modify models.py to define the tables in question.

All the associated field descriptions can be reviewed by clicking here.

After the tables have been defined use the following command to make migrations.

b

python3 manage.py makemigrations blog

The following depicts the output from the command.

We should apply all migrations to the database by issuing the following command.  Return to the project root and issue the following command.

python3 manage.py migrate

The result of the following command is as follows.

Mr. Arch Brooks, Software Engineer, Brooks Computing Systems, LLC authored this article.

BCS Create Django Site with MySQL Backend

For those times when Django site need to support MySQL this tutorial may be helpful.

The first task is to create the Django project. Go to the command prompt and issue the following command.

django-admin startproject mysite

The result may be observed in the following screen shot.

Next we should allow the MySQL connection.  Firs we need to import the MySQL interface by including the two statements below into settings.py for your project.

import pymysql 
pymysql.install_as_MySQLdb()

Next declare the default database description to point to the correct MySQL database by incorporating the following lines.

'ENGINE': 'django.db.backends.mysql', 
  'NAME': 'pblog', 
  'USER' : 'bcs', 
  'PASSWORD' : 'YourPassword', 
  'HOSTS' : 'localhost', 
  'PORT' : '3306',

After the chages are incorporated the resulting settigs.py file reflects the following.

"""
Django settings for mysite project.
 
Generated by 'django-admin startproject' using Django 1.11.8.
 
For more information on this file, see
https://docs.djangoproject.com/en/1.11/topics/settings/
 
For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.11/ref/settings/
"""
 
import os
import pymysql
pymysql.install_as_MySQLdb()
 
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 
 
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/
 
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'r8=&&1s%@60c%&cffq(bb54%_=px-@z=z#(htd!)jo^ny8xy9j'
 
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
 
ALLOWED_HOSTS = []
 
 
# Application definition
 
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
 
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
 
ROOT_URLCONF = 'mysite2.urls'
 
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
 
WSGI_APPLICATION = 'mysite2.wsgi.application'
 
 
# Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases
 
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'pblog',
        'USER' : 'bcs',
        'PASSWORD' : 'YourPassword',
        'HOSTS' : 'localhost',
        'PORT' : '3306',
    }
}
 
 
# Password validation
# https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators
 
AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]
 
 
# Internationalization
# https://docs.djangoproject.com/en/1.11/topics/i18n/
 
LANGUAGE_CODE = 'en-us'
 
TIME_ZONE = 'UTC'
 
USE_I18N = True
 
USE_L10N = True
 
USE_TZ = True
 
 
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/
 
STATIC_URL = '/static/'

We should start the server to determine the correctness of our configuration.

python manage.py runserver

Notice the server is running at the prescribed location.

The final step to this portion of the process is to migrate the database by issuing the following command.

python3 manage.py migrate

After the migration is successful you should have similar output messages in your terminal session.

Mr. Arch Brooks, Software Engineer, Brooks Computing Systems, LLC authored this article.

BCS Advantages, Using Anaconda Stack

A primary advantage to using the Anaconda stack for developing Python application is the ease in which the entire stack may be updated. When successfully installed the following script may be used to update the entire stack.

conda update conda
conda update python 
conda update spyder

For windows these command may be inserted in the appropriate .bat file for subsequent execution.

Mr. Arch Brooks, Software Engineer, Brooks Computing Systems, LLC authored this article.

BCS Install Anaconda on Ubuntu

Anaconda is the preferred approach for Python development on the Linux platform. To install Anaconda visit the web site and download the latest version. Click here for the Linux download.

The resulting shell script is lengthy and upon download completion the script must be marked as an executable file.

Execution of the script is the next process to be considered and it is accomplished by executing the command listed below.

./Anaconda3-5.0.1-Linux-x86_64.sh

Open a terminal and execute the command.

conda -V

If the version is not displayed you probably need to modify the path so the command may be found.

export PATH=/home/archman/anaconda3a/bin:$PATH

The installation process can be completed by issuing the following commands.

conda update conda
conda update python
conda update spyder
conda install django

Successful execution of these commands will ensure the latest versions of Anaconda, Python, Spyder and Django are installed and made ready for subsequent development.

Mr. Arch Brooks, Software Engineer, Brooks Computing Systems, LLC authored this article.

BCS c++ function

To use c++ functions the header definitions, implementation methods and the mainline must be properly configured.

The header file for our class is first.

/**
 * fxgen2h.h
 *
 *  Created on: Aug 28, 2017
 *  @author    Author: archman
 */
 
#ifndef FXGENH_H_
#define FXGENH_H_
 
#include <boost/algorithm/string/replace.hpp>
#include <iostream>
#include <fstream>
#include <string>
#include <string>
using namespace std;
const int sizeOfStringArray = 1000;
 
/**
 * This is some test Doc Text
 */
 
struct mods {
	string from;
	string to;
};
 
struct mod_rec {
	int numPair;
	mods mp[15];
};
 
class fxcl {
 
/**
 * Private  Declarations Go Here
 */
 
private:
 
/**
 * Public  Declarations Go Here
 */
 
public:
 
	int fin(string, string[]);
	void fot(string otf, string stv[sizeOfStringArray], int cnt);
	void fileCopy(string fin, string fot);
	bool forceDirectories(string path);
	void upd(mod_rec rmrp, string stv[sizeOfStringArray], int cnt);
	string fixPath(string inPath, string fName);
};
 
#endif /* FXGENH_H_ */

The implementation of the class follows.

/*
 * fxgen2h.cpp
 *
 *  Created on: Aug 28, 2017
 *      Author: archman
 */
#include "fxgenh.h"
 
#include <boost/filesystem.hpp>
#include <boost/filesystem/fstream.hpp>
#include <boost/algorithm/string.hpp>
using namespace std;
 
/**
 *This program designed
 */
 
void fxcl::fileCopy(string fin, string fot) {
	std::ifstream src(fin, std::ios::binary);
	std::ofstream dst(fot, std::ios::binary);
 
	dst << src.rdbuf();
}
 
int fxcl::fin(string inf, string stv[sizeOfStringArray]) {
	string line;
	int lcnt = 0;
 
	ifstream myfile(inf);
	if (myfile.is_open()) {
		while (getline(myfile, line)) {
			stv[lcnt] = line + "\n";
			lcnt++;
		}
 
		myfile.close();
		return lcnt;
 
	}
 
	else
		cout << "Unable to open file";
	return lcnt;
}
 
bool fxcl::forceDirectories(string path) {
	boost::filesystem::path dir(path);
 
	if (!(boost::filesystem::exists(dir))) {
		std::cout << path << " Doesn't Exists" << std::endl;
 
		if (boost::filesystem::create_directory(dir))
			std::cout << path << " Successfully Created !" << std::endl;
		return true;
	} else {
		return false;
	}
}
 
void fxcl::fot(string otf, string stv[sizeOfStringArray], int cnt) {
	string line;
	int ii = 0;
	ofstream myfile(otf);
	while (ii < cnt) {
		line = stv[ii];
		myfile << line;
		ii++;
	}
	myfile.close();
}
 
void fxcl::upd(mod_rec rmrp, string stv[sizeOfStringArray], int cnt) {
	int ii = rmrp.numPair;
	string rline;
	int j = 0;
	while (j < cnt) {
		int i = 0;
		while (i <= ii) {
			boost::replace_all(stv[j], rmrp.mp[i].from, rmrp.mp[i].to);
			i++;
		}
		rline = stv[j];
		j++;
	}
 
}
 
string fxcl::fixPath(string inPath, string fName){
 
  return inPath + fName;
 
}

Finally we include out main or calling program.

//============================================================================
// Name        : fxgen2p.cpp
// Author      : Mr. Arch Brooks
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
 
/*! \mainpage My Personal Index Page
 *
 * \section intro_sec Introduction
 *
 * This is the introduction.
 *
 * \section install_sec Installation
 *
 * \subsection step1 Step 1: Opening the box
 *
 * etc...
 */
 
#include <iostream>
 
#include "fxgenh.h"
using namespace std;
 
int main(int argc, char* argv[]) {
	cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
	fxcl fx;
	string rp;
	rp = fx.fixPath("/root/", "TestProg");
	cout << rp << endl;
	return 0;
}

The output from the execution is as follows.

!!!Hello World!!!
/root/TestProg

 

Mr. Arch Brooks, Software Engineer, Brooks Computing Systems, LLC authored this article.

BCS Order Of Operations

When solving equations the order in which the operations are performed is critical.

The general order of operations is:

P = Parentheses
E = Exponents
M = Multiplication
D = Division
A = Addition
S = Subtraction

To remember the acronym (PEMDAS) I repeat the following sentence Please Excuse My Dear Aunt Sally.

Mr. Arch Brooks, Software Engineer, Brooks Computing Systems, LLC authored this article.

BCS WaterFox Browser of Choice

FireFox has exhausted my patience. The discontinuance of tools that makes my programming job easier, their willingness to install plugins without permission, selling my information as well as unbridled advertising has made me switch to WaterFox web browser.

The WaterFox web site home page is available by clicking here.

To learn more about WaterFox by clicking here and selecting the About option.

The source code may be located by clicking here.

Mr. Arch Brooks, Software Engineer, Brooks Computing Systems, LLC authored this article.