Site Sponsors:
Python: Colorized Textual User Interfaces on Windows and POSIX 
With the advent of Windows 10, for the first time in history we could do - installed by default - what everyone else had been doing for over 50 years: Create colorized applications right-out of the box!

(PyCharm IDE)


While the use of drivers such as `ANSI.SYS` or `VT100.SYS` had come and gone over the decades, those of us who wanted to create cool looking Textual User Interfaces (TUIs) were encouraged by the fact that we could finally use simple "ESCAPE SEQUENCES" once again!



And then - in the infinite "wisdom" of corporate-think, the zombies disabled it... once again! (sigh)

Oh well: Different millennium... same 'ol Microsoft! (lol)

Cygwin


Yet we should understand that STANDARD terminal support STILL works fine on Microsoft Windows when using things like Cygwin:



Standards


So - as ever - in the STANDARDS BASED world creating cool TUIs remains precisely as it has ever been on Linux, OS X, and everywhere else:



Hence, for those who like to use PREDICTABLE operating systems ;) here is the code I created today:


class Console:
color = {
'black': 30,
'red': 31,
'green': 32,
'yellow': 33,
'blue': 34,
'magenta': 35,
'cyan': 36,
'white': 37,
# 'extended': 38,
'default': 39
}

@staticmethod
def _esc(zint, zmode):
return u"\u001b[{}{}".format(zint, zmode)

@staticmethod
def get_colors():
return sorted(Console.color.keys())

@staticmethod
def get_color(key):
if key in Console.color:
return Console._esc(Console.color[key], 'm')
return Console._esc(Console.color['default'], 'm')

@staticmethod
def get_color_back(key):
if key in Console.color:
return Console._esc(Console.color[key] + 10, 'm')
return Console._esc(Console.color['default'] + 10, 'm')


@staticmethod
def get_color_back_bright(key):
if key in Console.color:
return Console._esc(Console.color[key] + 70, 'm')
return Console._esc(Console.color['default'] + 70, 'm')


@staticmethod
def get_color_bright(key):
if key in Console.color:
return Console._esc(Console.color[key] + 60, 'm')
return Console._esc(Console.color['default'] + 60, 'm')

@staticmethod
def has_color():
import os
if os.name is 'posix':
return True
if os.name is 'nt':
import platform
ver = platform.version()
if ver is None or len(ver) is 0:
return False
ver = ver.split('.')
if ver[0] == '10':
return True
return False

if Console.has_color() is False:
print("Sorry, at the moment only POSIX has default VT100 / ANSI support.")
print("Some versions of DOS use ANSY.SYS / VT100.sys. 'Google it.")
exit(-1)

for color in Console.get_colors():
print(Console.get_color(color), color, end="...")
print(Console.get_color_bright(color), "bright", color, end="...")
print(Console.get_color('default'), end="")
print(Console.get_color_back_bright(color), "back", color, end="...")
print(Console.get_color_back('default'))



Please note that most people will have to update the above to return 'False' when the OS is 'nt.' But if you are lucky enough to be running the Bourne-Again Shell (bash) under Windows, then you've hit a home-run ... omit the platform checking, all together?

etc ...


For what its worth:




Google Keywords: Free Source Code Public Domain Roguelike Console Terminal TTY DOS Prompt



[ view entry ] ( 126 views )   |  permalink  |  related link
PR1000.02: The Hex Dumper Project 
From banners to ASCII tables, in Python 1000 we created allot of useful data representations. Putting it all together however, when our review team was having difficulty creating the password encoder, we decided to cobble together a review exercise.



Moving forward, if you have ever wanted to know how to create a hex-dump, then click here for a "Developer's Review" of how to do so in Python.

Those who need an introduction to the UML (at least enough to understand the core diagrams) might enjoy our YouTube UML Primer (video link).

[ view entry ] ( 82 views )   |  permalink  |  related link
An Easy PHP CRUD Example ... for SQL / Sqlite! 
When our needs are simple, then so should be our code.

For 100% of what we need to do at the moment (manage a massive collection of data across a local network,) this class will do what we need it to do: CRUD far too many rows consisting of TEXT / string values!


So, is DAO-generation necessary? When using a name-associated array in PHP 5, all we need do is to define our fields, and away we go!


class SqlStringRecord {

function get_file_name() {
return "default.sqlt3";
}

function get_table_name() {
return "contacts";
}

function get_columns() {
$data = array();
$data[0] = "Name";
$data[1] = "Address";
$data[2] = "Note";
return $data;
}

function delete_table() {
$db = new SQLite3($this->get_file_name());
$tbl = $this->get_table_name();
$db->exec("DROP TABLE IF EXISTS $tbl");
$db->close();
if ($db->lastErrorCode() != 0) {
return FALSE;
}
return TRUE;
}

function create_table() {
$this->delete_table();
$fields = $this->get_columns();
$tbl = $this->get_table_name();
$cmd = "CREATE TABLE $tbl (ID INTEGER PRIMARY KEY AUTOINCREMENT";
foreach ($fields as $field) {
$cmd .= ', ';
$cmd .= $field;
$cmd .= ' STRING';
}
$cmd .= ")";
$db = new SQLite3($this->get_file_name());
$db->exec($cmd);
$db->close();
if ($db->lastErrorCode() != 0) {
return FALSE;
}
return TRUE;
}

function count() {
$db = new SQLite3($this->get_file_name());
$tbl = $this->get_table_name();
$rs = $db->query("SELECT COUNT(*) FROM $tbl");
if ($rs == FALSE) {
return FALSE;
}
$data = $rs->fetchArray();
$db->close();
return $data[0];
}

function create($special) {
$cols = $this->get_columns();
$tbl = $this->get_table_name();
$cmd = "INSERT INTO $tbl (";
$bfirst = true;
foreach ($cols as $col) {
if ($bfirst == false) {
$cmd .= ", ";
}
$cmd .= $col;
$bfirst = false;
}
$cmd .= ") VALUES (";
$bfirst = true;
foreach ($cols as $col) {
if ($bfirst == false) {
$cmd .= ", ";
}
$cmd .= "'$special[$col]'";
$bfirst = false;
} $cmd .= ")";
echo "\n\n$cmd\n\n";
$db = new SQLite3($this->get_file_name());
$db->exec($cmd);
$db->close();
if ($db->lastErrorCode() != 0) {
return FALSE;
}
return $this->count();
}

function read($id) {
$db = new SQLite3($this->get_file_name());
$tbl = $this->get_table_name();
$cmd = "SELECT * FROM $tbl WHERE ID = $id LIMIT 1";
$rs = $db->query($cmd);
if ($rs == FALSE) {
return FALSE;
}
$results = $rs->fetchArray(SQLITE3_ASSOC);
$db->close();
return $results;
}

function update($id, $special) {
$tbl = $this->get_table_name();
$cmd = "UPDATE $tbl SET";
$cols = $this->get_columns();
$bfirst = TRUE;
foreach ($cols as $col) {
if ($bfirst == FALSE) {
$cmd .= ", ";
}
$cmd .= " $col = '$special[$col]'";
$bfirst = FALSE;
}
$cmd .= " WHERE ID = $id";
echo "\n\n$cmd\n\n";
$db = new SQLite3($this->get_file_name());
$db->exec($cmd);
$db->close();
if ($db->lastErrorCode() != 0) {
return FALSE;
}
return TRUE;
}

function delete($id) {
$tbl = $this->get_table_name();
$cmd = "DELETE FROM $tbl WHERE ID = $id";
$db = new SQLite3($this->get_file_name());
$db->exec($cmd);
$db->close();
if ($db->lastErrorCode() != 0) {
return FALSE;
}
return TRUE;
}

}


So feel free to update:

get_columns()
get_table_name() [optional]
get_file_name() [optional]

Then simply use associative arrays as your "data access object" - as returned from the read($id) operation - then accessed via your own get_columns() names - to see how easily (ahem) CRUD happens!

The complete code + test case is here.

[ view entry ] ( 141 views )   |  permalink  |  related link

<<First | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | Next> Last>>