All posts by Morpheus

Password Generator in tk/tcl

The basis for this program was written in another lifetime to create basically pronouncable passwords for students.

# pass_gen - create pronouncable passwords with 4-20 characters, 1-10 numbers
# and optional symbol
# author:Morpheus Being
# licence: GPL
# tested on
# puppy linux - initial development and testing
# xubutu
# windows xp
# changelog
# 1.5 - Added capital letters
# 1.4 - added template for different forms of password
# 1.3
# 1.2 - fixed random problem not choosing z u 9 etc
# 1.1 - mods to allow different lengths of vowels, letters, digits, symbols
# 1.0 - initial development
exec wish "$0" "$@"

package require BWidget

set version "1.5"
set licence "G.P.L"
set author "Morpheus Being"
set dupdate "August 2018"

# data sets used for creating the password
set vowels { a e i o u A E I O U }
set letters { b c d f g h j k l m n p q r s t v w x y z B C D F G H J K L M N P Q R S T V W X Y Z }
set digits { 0 1 2 3 4 5 6 7 8 9 }
set symbols { ! @ # $ % ^ & * ( ) _ - + }

# -----------------------------------------------------------------------------
# appCreate - create window frame and all its contents, spinboxes, buttons,
# display elements
proc appCreate { } {
variable version

# menu description
set descmenu {
"&File" all file 0 {
{command "E&xit" {} "exit application" {} \
-command appExit }
"&Help" all help 0 {
{command "H&ow To Use" {} "how to use" {} \
-command appHelpHow }
{command "&About" {} "about the application" {} \
-command appHelpAbout }

# create the main menu
wm title . "Password Generator $version"
set wid [expr {25*[font measure mydefault 0]}]
set mainframe [MainFrame .mainframe -menu $descmenu -width $wid]

# create spinboxes for number of letters and numbers
set titf1 [TitleFrame $mainframe.titf1 -text "Number of Characters" ]
set subf1 [$titf1 getframe]
set spin1 [SpinBox $subf1.spin -range { 4 20 1 } -textvariable alpha ]

pack $spin1 -side right
pack $titf1 -fill x -pady 2 -padx 2

set titf2 [TitleFrame $mainframe.titf2 -text "Number of Numbers" ]
set subf2 [$titf2 getframe]
set spin2 [SpinBox $subf2.spin -range { 1 10 1 } -textvariable numeric ]

pack $spin2 -side right
pack $titf2 -fill x -pady 2 -padx 2

# create radio button (yes/no choice) for symbols
set titf3 [TitleFrame $mainframe.titf3 -text "Symbol"]
set subf3 [$titf3 getframe]
set rad1 [radiobutton $subf3.rad1 -text "Yes" \
-variable wantsymbol -value 1 -relief "flat"]
set rad2 [radiobutton $subf3.rad2 -text "No" \
-variable wantsymbol -value 0 -relief "flat"]

pack $rad1 $rad2 -side left
pack $titf3 -fill x -pady 2 -padx 2

# create radiobutton for format type
set titf4 [TitleFrame $mainframe.titf4 -text "Format - symbol is optional"]
set subf4 [$titf4 getframe]
set rad3 [radiobutton $subf4.rad3 -text "w(s)nw" \
-variable ftype -value 0 ]
set rad4 [radiobutton $subf4.rad4 -text "ww(s)n" \
-variable ftype -value 1 ]

pack $rad3 $rad4 -side left
pack $titf4 -fill x -pady 2 -padx 2

# create display box for generated passwords
set titf5 [TitleFrame $mainframe.titf5 -text "Password"]
set subf5 [$titf5 getframe]
set ent1 [Entry $subf5.entry -textvariable genpassword]

pack $ent1 -pady 4 -anchor w -side left
pack $titf5

# create button for generating new password
set but [Button $mainframe.but -text "New" \
-command "newPass" -helptext "create new password" ]

pack $but -side left -padx 4

wm protocol . WM_DELETE_WINDOW { appExit }
pack $mainframe -fill both -expand yes
update idletasks

# newPass - determine how many letters, vowels, digits, symbols and display the
# created password
proc newPass { } {
global genpassword alpha numeric wantsymbol ftype

set fpl [ expr $alpha / 2 ]

if { $alpha % 2 } {
set fpl [ expr int($alpha / 2) + 1]

set lpl [ expr $alpha - $fpl ]

# to change format of password edit following lines
set start [ aPart $fpl ]
set mid [ nPart $numeric ]
set end [aPart $lpl ]

# want symbol in password
if { $wantsymbol == 1 } {
set sym [ sPart ]

# which type of format to display
switch $ftype {
0 {
if { $wantsymbol == 1} {
set genpassword [ format "%s%s%s%s" $start $sym $mid $end ]
} else {
set genpassword [format "%s%s%s" $start $mid $end ]
1 {
if { $wantsymbol == 1} {
set genpassword [ format "%s%s%s%s" $start $end $sym $mid ]
} else {
set genpassword [format "%s%s%s" $start $end $mid ]

# aPart - return randomly selected letters and vowels from the lists
proc aPart { slen } {
global vowels letters

set vlen [ expr [ llength $vowels ] ]
set llen [ expr [ llength $letters ] ]

for { set i 0 } { $i < $slen } { incr i } { if { $i % 2 == 0 } { set randid [ expr int( rand() * $llen ) ] append ret [ lindex $letters $randid ] } else { set randid [ expr int( rand() * $vlen ) ] append ret [ lindex $vowels $randid ] } } return $ret } # # nPart - return randomly selected digit(s) from the digit list # proc nPart { slen } { global digits set dlen [ expr [ llength $digits] ] for { set i 0 } { $i < $slen } { incr i } { set randid [ expr int( rand() * $dlen ) ] append ret [ lindex $digits $randid ] } return $ret } # # sPart - return randonly selected symbol from the list # proc sPart { } { global symbols set sylen [ expr [ llength $symbols ] ] set randid [ expr int( rand() * $sylen ) ] append ret [ lindex $symbols $randid ] return $ret } # # appExit - selected from menu # proc appExit { } { set choice [ tk_messageBox -message "Are you sure you want to exit?"\ -icon question -type yesnocancel ] if {$choice == "yes" } { exit } } # appHelpHow proc appHelpHow { } { tk_messageBox -message "Select the number of\n\ - letters\n\ - numbers\n\Aug 2018 - optional symbol\n\ - format\n\ before pressing the \bNew\b button.\n" } # # appHelpAbout - display info about the program in new disposable window # proc appHelpAbout { } { global version licence author dupdate tk_messageBox -message "Written in tk/tcl.\n\ Author: $author. \n\ Date: $dupdate \n\ Updated: $update. \n\ Version: $version.\n\ Licence: $licence." } # # main procedure to manage window creation and destruction # proc main { } { wm withdraw . appCreate wm deiconify . } main #---------------------------- end of program ----------------------------------

My New .vimrc

Recently rebuilt my laptop with latest Debian Testing after HDD failure. While I was at it, I redid my .vimrc file to suit new activities better. Remember to have git installed along with vundle from github first, ignore errors, then once vim/gvim loaded run :PluginInstall.

set nocompatible " required
filetype off " required

" set the run time path and initialise vundle
set rtp+=~/.vim/bundle/Vundle.vim

call vundle#begin()

" let Vundle manage itself
Plugin 'VundleVim/Vundle.vim'

" Now do the extras
Plugin 'tpope/vim-fugitive'
Plugin 'tpope/vim-git'
Plugin 'tpope/vim-obsession'
Plugin 'tpope/vim-sleuth'

" Plugin 'vimoutliner'
Plugin 'scrooloose/syntastic'
Plugin 'scrooloose/nerdtree'

" statusbar
Plugin 'vim-airline/vim-airline'
Plugin 'ervandew/supertab'
Plugin 'majutsushi/tagbar'
Plugin 'lervag/vimtex'
Plugin 'airblade/vim-gitgutter'
Plugin 'tpope/vim-surround'
Plugin 'vim-pandoc/vim-pandoc'
Plugin 'vim-pandoc/vim-pandoc-syntax'

" Plugin 'LaTeX-Box-Team/LaTeX-Box'
" Colourscheme stuff
Plugin 'nightsense/night-and-day'
Plugin 'altercation/vim-colors-solarized'
Plugin 'tpope/vim-vividchalk'
Plugin 'gkjgh/cobalt'

" all plugins must be installed before this line

call vundle#end() " required

" now able to turn filetype back on
filetype plugin indent on " required
" Brief help
" :PluginList - lists configured plugins
" :PluginInstall - installs plugins; append `!` to update or just :PluginUpdate
" :PluginSearch foo - searches for foo; append `!` to refresh local cache
" :PluginClean - confirms removal of unused plugins; append `!` to auto-approve removal
" see :h vundle for more details or wiki for FAQ
" Other settings
set encoding=utf-8 " handle all characters
set mouse=a " mouse every where
set ff=unix " set file format to unix
set spelllang=en_au " set spellcheck language to english
syntax enable " syntax highlighting with current colour scheme
set termguicolors

" tree view
let g:netrw_liststyle=3

" Console UI and Text Display
set vb t_vb =
set ruler
set noerrorbells
set scrolloff=5
set number " line numbering
set smartindent autoindent " smart indent and autoindenting
set showmatch " show matches

" TAB specific options
set tabstop=4
set expandtab
set softtabstop=4
set shiftwidth=4
set smarttab
set shiftround
set nojoinspaces

" colourscheme settings

let g:nd_themes = [
\ ['07:00', 'solarized', 'light' ],
\ ['18:00', 'cobalt', 'dark' ],
\ ]

"if &t_Co >= 256 || has("gui_running")
" set lines=35 columns=100
" set background=light
" colorscheme solarized
"colorscheme calmar256-dark
" set t_Co=256
" " set background=dark
" colorscheme solorized

set wildmenu
set wildmode=list:longest

set fileformats=unix,dos,mac
filetype plugin indent on "

" gui font settings
" -----------------------------------------------------------
if has('gui_running')
set guifont=Lucida_Console:h11

" Search settings
set incsearch
set ignorecase
set smartcase

" check for custom .vim.custom in a folder
if filereadable(".vim.custom")
so .vim.custom

" vim-airline
" -----------------------------------------------------
" enable/disable fugitive/lawrencium integration
let g:airline#extensions#branch#enabled = 1
" change the text for when no branch is detected
let g:airline#extensions#branch#empty_message = ''
" enable/disable syntastic integration
let g:airline#extensions#branch#syntastic#enabled = 1
let g:airline#extensions#tabline#enabled = 1

" syntastic extensions
set statusline+=%#warningmsg#
set statusline+=%{SyntasticStatuslineFlag()}
set statusline+=%*

let g:syntastic_always_populate_loc_list = 1
let g:syntastic_auto_loc_list = 1 " always show error list
let g:syntastic_check_on_open = 1
let g:syntastic_check_on_wq = 0
" to toggle between active/passive type checking
map e :Errors
map s :SyntasticToggleMode

nmap :TagbarToggle

" doxygen settings
" nmap :Dox
" nmap :DocLic

" statusline
set statusline=%-5.3n\ %F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]%=\ [ASCII=\03.3b]\ [HEX=\02.2B]\ [POS=%04l,%04v][%p%%]\ [LEN=%L]
set laststatus=2
set cmdheight=1

" hdevtools
" --------------------------------------------------
au FileType haskell nnoremap :HdevtoolsType
au FileType haskell nnoremap :HdevtoolsClear

" Word processing mode
function! WordProcessorMode()
setlocal formatoptions=1
setlocal noexpandtab
map j gj
map k gk
setlocal spell spelllang=en_gb
set thesaurus+=/home/robin/.vimrc/thesaurus/mythesaur.txt
set complete+=s
set formatprg=par
setlocal wrap
setlocal linebreak
com! WP call WordProcessorMode()

" ---------------------------------------------------------------------------
" latex stuff

" Nerdtree settings
autocmd StdinReadPre * let s:std_in=1
autocmd VimEnter * if argc() == 0 && !exists("s:std_in") | NERDTree | endif

autocmd StdinReadPre * let s:std_in=1
autocmd VimEnter * if argc() == 1 && isdirectory(argv()[0]) && !exists("s:std_in") | exe 'NERDTree' argv()[0] | wincmd p | ene | endif

map :NERDTreeToggle

autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif

tcl/tk slider example program

Simple program to convert temperatures in F to C and vica versa. Just copy and paste the following code and make it executable.

# script to convert between F and C
# \
exec wish “$0″ ${1+”$@”}

# set window title
wm title . “Temperature Converter”

# convert C to F
proc celsiusTofahren { ctemp } {
global fahrenheit
set fahrenheit [ expr ($ctemp * 1.8) + 32 ]

# convert F to C
proc fahrenToCelsius { ftemp } {
global celsius
set celsius [ expr ($ftemp – 32 ) / 1.8 ]

# create a scale for f temps
set fahrenscale [ scale .fht -orient horizontal \
-from 0 -to 212 -length 500 \
-resolution .1 -tickinterval 20 -label “Fahrenheit” \
-variable fahrenheit -command fahrenToCelsius ]

# create a scale for c temps
set celscale [ scale .cel -orient horizontal \
-from -20 -to 100 -length 500 \
-resolution .1 -tickinterval 20 -label “Celsius” \
-variable celsius -command celsiusTofahren ]

# Grid the widgets
grid $fahrenscale
grid $celscale

Making Balms and Salves

You will need the following equipment:

  • stainless steel stock pot minimum of 10 litres, 2 off
  • stainless steel stirring spoon
  • stainless steel steel fine sieve
  • stainless steel ladle
  • digital scales
  • cutting board
  • brown glass or good plastic jars with lids

You will also need the following materials:

  • virgin olive oil
  • beeswax, organic if possible

Now, its time to start

  • collect your plant material, essential oils etc
  • strip all leaves from stems
  • place leaves/essential oils in one of the stainless steel stock pots
  • cover with olive oil, pressing down and stirring with the spoon
  • gently warm on the stove or fire, do not boil
  • let cool and sit for 24 hours
  • zero the scales with the second pot
  • strain the oil into the second pot on the scales and let drain for 12-24 hours or until no more oil running off
  • note the weight
  • place the oil back on gentle heat source, making it just hot enough to melt the bees wax
  • shave bees wax to ratio of 1:5 for stiff balm, 1:8 for soft, quick melting balm
  • allow the oil to cool, and ladle into the containers

Scabies Infection

What is scabies?

Scabies is a parasitic infestation in which Sarcoptes scabei mites burrow under the skin and cause intense itching.

What are the symptoms of scabies?

Aside from intense itching, which usually is worse at night, symptoms may include hive-like bumps on the skin. These lesions tend to first appear between the fingers or on the elbows, wrists, buttocks, or waist. The mites can also burrow under fingernails or around the skin near watch-bands or rings. The itching of scabies results primarily from the body’s allergic reaction to the mites, their eggs and their waste.

Vigorous scratching can break the skin and allow a secondary bacterial infection to occur. Superficial infections of the skin, known as impetigo, are caused most often by staph (staphylococcal) and occasionally strep (streptococcal) bacteria. These bacterial infections can cause localised inflammation marked by redness, swelling, heat and pain as well as a honey-coloured exuded fluid.

Scabies can become a serious problem in those with weakened immune systems, such as people with HIV or cancer. Scabies can also be an issue for those with chronic illnesses or living in institutionalised settings such as hospitals, rehabilitation centers, childcare facilities and nursing homes. If the condition becomes chronic, a more severe and very contagious form of scabies may develop called crusted scabies, which causes a hard, scaly rash that covers large areas of the body and can be difficult to treat.

What are the causes?

Sarcoptes scabei is a microscopic eight-legged mite. Females burrow just beneath the skin, creating a tunnel in which they deposit their eggs. The eggs mature in about three weeks, after which the new mites hatch and burrow to the skin’s surface, from which they can spread to other areas of the skin or to other people. Close physical contact and, less often, sharing clothing or bedding with an infected person can spread the mites. The mites can live for up to a month on the human body, but can’t survive for more than 48-72 hours elsewhere, and laundering eliminates them. Despite urban legends, humans cannot get scabies from pets. Animals attract types of mites that don’t survive on the human body.


Salt Water Bathing

Common table salt in a warm bath cured my Scabies. After soaking for 15 minutes, get out of the bath and drip dry. Do not use a towel, but if you must, just pat dry with kitchen towels as they are more hygenic. If needed, repeat after 4 days.

The salt will get into the mite holes to kill the eggs, and also kill the mites on the surface almost instantly.

Herbal Skin Treatment

Make up a mixture of:

  • Oil of cloves – kills the mites and reduces the pain – 50 parts
  • Tea Tree oil – kills the mites and any bacterial infections – 10 parts
  • Rosemary oil – kills the mites, reduces itching and inflammation – 5 parts
  • Lavender oil (optional) – kills the mites, reduces the inflammation and itching – 5 parts

and apply to the skin of whole body especially where itching and inflammation.

Precautions to Take When You Have Scabies

  • Treat All Family Members and Close Contacts

    Most scabies recurrences are because of reinfection from untreated contacts. It’s so important that your loved ones receive scabies treatment too, and don’t forget about your pets! Although cats and dogs are affected by their own distinct species of mites, they can still contract human scabies, which causes a temporary skin reaction and keeps the mites in your home. Contact your veterinarian about pet treatments for scabies.

  • Wash Bedding and Clothing

    Immediately wash the bedding and clothes that you used or wore since the time of contracting scabies. If you aren’t sure of the exact time, then be safe and wash all of your worn clothes and bedsheets. The laundry cycle alone may not kill the mites, so make sure your drier is on the hottest setting possible, even better yet, dry on outside clothes line in full sun.

  • Vacuum Furniture and Carpet

    After vacuuming the furniture and carpet at home, make sure to throw away the vacuum bag because it may contain mites. Using a steam cleaner with borax powder can be even more effective.

  • Stay in One Small Room or Area

    The less you touch, the less you have to disinfect after the scabies has been treated. Do your best to keep your home and environment scabies-free by limiting your exposure to furniture, materials and people. If you can’t wash your clothing or towels right away, put them in a tied plastic bag; scabies mites cannot survive off of the body for longer than three days.

  • Avoid Scratching Itchy Skin

    Scratching your itchy skin does not actually provide relief because the problem is still there. In fact, scratching the infested area only makes matters worse because it can spread the mites across your body and increase your risk of a secondary skin infection.

  • Try to Minimize Stress

    Stress can increase the severity of itchiness, which will lead to scratching and the possibility of skin infections. For this reason, it is important to minimize stress. Try stress relievers, such as relaxing exercises like yoga or taking a long walk. Read a chapter or passage from your favorite book, or practice meditation. Dealing with a scabies infestation can be difficult to handle emotionally and mentally, but try your best to stay positive — there are cures, but it takes some time.

  • Eat a Healthy Diet

    When dealing with scabies, it’s important that your body’s immune system is ready to work hard. Sticking to detoxifying and anti-inflammatory foods is beneficial as you rid the body of these harmful mites and deal with the side effects of medications. Anti-inflammatory foods also help to relieve swelling, itching and discomfort. Some of the best foods to add into your diet include leafy greens, beets, walnuts, blueberries, salmon, coconut oil and bone broth.

  • Hand Stitching Versus Machine Stitching

    What is the difference between machine sewing and manual hand stitching (Saddle Stitching)?

    One thread vs. two threads

    When you use a machine, that sewing line uses two separate threads that lock around each other in what is known as a “Machine Lock Stitch”.

    A hand-stitched line uses a single thread with needles on both ends. The thread runs back and forth on either side of the leather in what is called a “Saddle Stitch”

    Difference in Construction

    Technically speaking, the hand-stitched piece that uses the “saddle stitch” provides a stronger and more durable construction than the machine sewn piece that uses the “locking stitch”.

    A locking stitch by a sewing machine has two threads running the length of the material on opposite sides, if one thread were to snap at a single point, the entire thread could unravel along that side of the material thereby allowing the material to separate.

    However in a hand-stitched piece, should the thread snap at a single point, it could not easily unravel the length of the item since it’s passing on both sides of the leather. More importantly, it’s easier to repair the line of stitching.

    Difference in Aesthetics

    Saddle stitch results in an elegant line of slightly angled stitches when used with a particular set of tools. Decisions like stitches per inch, size and type of thread, and how we set the holes (e.g. pricking iron, diamond chisel) all play a role in the design of a piece.

    Machine lock stitches usually look pretty straight on the top and the bottom side would be a usually visibly thinner thread to complete the lock stitch.

    Leathercraft Workshop

    My new setup is now operational and starting to churn out products for locals and tourists alike. New stamps and leather recently arrived so the range of images on products greatly increased. A new supplier of kangaroo leather has been found, so now many new products in the pipeline.

    To see what is now available, visit shop from the menu.

    Come back and visit often as product line grows and changes all the time.