7/26/2015

Fast Forward to the Nikon D5500 from the D3100

Fast Forward to the Nikon D5500 from the D3100

Part I - The Nikon D3100

History

A little more than a year ago, I took the leap back into serious photography, and starting doing business at http://wrightrocket.smugmug.com.  With a very limited budget, I started with the entry-level Nikon D3100, which provides beginning users with a guide mode, but intermediate or advanced users the basics of a DSLR with the sophistication and quality of Nikon.  At the time, I really wanted the Nikon D5300, but didn't have the budget for it, so I settled for a little less than I wanted to get what I really needed.

Here are the technical specifications of the D3100:
  • Expeed 3 Processor
  • 14.2 Megapixels
  • DX Sensor 23.1mm x 15.4mm
  • 3 Frames per second continuous
  • ISO 100 to 12800
  • HD 1920x1080 at 24 frames per second
  • 3.0 inch diagonal non-touchscreen monitor
  • 16.0 ounces weight for camera body

The kit that I bought included a 18-55mm and 55-200mm f/3.5-5.6G AF-S Nikkor VR lenses.  Over time, I have enjoyed using the camera very much taking over 6,000 photographs in about a year. Here's a couple of my favorites:



I added a Nikkor AF-S 35mm f/1.8G prime VR lens and a 55-300mm AF-S f/3.5-5.6G ED VR II lens, and lots of other stuff.  Here's one of my favorites from the 300mm, which has VR II so taking hand-held photos like this are possible:



After exploring more advanced photography techniques through reading and experimentation, I found several features which I wished were built-in to the camera, but were not. Here's a short list of features I wish that the Nikon D3100 had:
  • Bracketing of Exposure and Shutter Speed
  • Wireless remote control
  • Intervalometer
  • Advanced Flash integration
  • GPS
  • Wi-Fi
Prior to upgrading, the following explains how I dealt with these short-comings of the D3100.

Bracketing

It was not much of a problem to overcome the lack of bracketing controls by simply varying the exposure or shutter speed manually, but to do it effectively required a tripod to keep the camera at the same view.  For the outdoor photography that I tend to do, I usually would set up the camera on the tripod and set it to the aperture (A) mode. Then, I would simply turn the adjustment knob for the aperture between each frame.  Otherwise, I might set it up with the camera set to shutter speed mode (S) and adjust the shutter speed as shown below.

1/15th of a second, f10, ISO 100

1/20th of a second


1/25th of a second

1/30th of a second

1/40th of a second

1/50th of a second

Wireless Remote Control

I bought a wired intervalometer for taking time-lapse photography, and it also served as a way to release the shutter remotely, at a shorter distance, but like a wireless remote control.  It's also nice because in manual mode (M), if I set the shutter speed to Bulb, then I can hold the release button for as long as I would like to create long exposures like these:




Advanced Flash Integration

The small built-in flash is only adequate for up-close or very small room photography.  Any outdoor or large space photography required more.  By going with the Nikon SB-700 Speedlight flash, I was able to get an integrated flash that could provide Commander capabilities for the Nikon Creative Lighting System.  This flash isn't quite as large or as powerful as the SB-910, but is more than adequate even for outdoor or photos taken in moderate to large rooms.

GPS

There is a GPS port on the D3100, but I never acquired the Nikon GP-1A module which lists for $312 as of today at www.nikonusa.com. Within Adobe Lightroom or Photoshop, as well as other tools, there are ways to embed location information, although I never bothered.

Wi-Fi

There is no Wi-Fi on the Nikon D3100, so you have to wait until you can get to a computer and import them.  There is also no Eye-Fi support built-in, although I didn't explore this option, I should note that there is some option for Eye-Fi support built-in on the Nikon D5500.  Eye-Fi allow you to have the SDcard in the camera connect to upload to a Wi-Fi access point.


Current Offerings

Nikon no longer offers the D3100, except possibly as refurbished, which I saw one today at their site for $749, which made me smile.  The kit for the D5500 which I purchased with the 18-140mm f3.5-5.6G ED VR is listed at $1,049,95 after a $350 instant savings, but lacks many of the extras that I got in my kit, which you can read about in my next part of this post.

A much improved entry-level cameras can be found in the D3200 and D3300 still offered at $449.95 and $499.95, respectively.  They now feature 24.2 megapixels.  The D3200 still has the same Expeed 3 processor as the D3100, but the D3300 now has the Expeed 4 processor. With an extra WU-1a Mobile Adapter module for $59.95 you can connect to both of these cameras through Wi-Fi on your smartphone.

Part II - Fast Forward to the Nikon D5500 from the D3100 - The D5500

The second part to this post will be upcoming soon! I plan to share the benefits and downsides to the Nikon D5500 in comparison to the D3100, as well as a few new photos!







7/10/2015

Firewalld and iptables

Firewalld and Iptables

The Problem

The iptables command line interface to control the Netfilter functions in the kernel is being superseded by Firewalld's firewall-cmd.  Firewalld provides not only a command line interface, but also a very powerful graphic one. 

The problem is that once you enable the Firewalld service, then you should only use firewall-cmd from the command line for configuration.  Attempts to modify the firewall configuration with iptables commands directly will fail.  However, iptables commands can still be used to query the rules that are created by the Firewalld GUI, or by firewall-cmd commands.  For example, after using firewall-cmd to create rules, you could execute the following iptables command to view the actual Netfilter rules:

iptables -nvL 

HOT TIP: Take advantage of the command completion feature while working with firewall-cmd.  If forget an option, just press TAB and TAB and wait for a second for the list of available options!  Executing "firewall-cmd --help" also provides a good summary of the available options before you have to start reading the man page.

Service Rules

There are many services that have rules which are predefined by Firewalld.  It can make it much easier to enable access to a service by using these preset rules. To find out which services can be enabled access through the default zone, use the following command:

firewall-cmd --get-services

To enable access to the service through the firewall persistently, you can execute:

firewall-cmd --add-service=dns --permanent

The above command does not affect the state of the current firewall.  To add the service immediately, you can execute the above command without the --permanent option, or else use:

firewall-cmd --reload

Alternatively, you could add all the services and other rules that you wanted until you got the runtime configuration to reflect what you want by not using the --permanent option and then execute:
firewall-cmd --runtime-to-permanent

To see the set of all rules in the current (runtime) configuration, you can use:

firewall-cmd --list-all

Direct Rules

Direct rules are similar to rules that used to be added with the iptables command.  Instead of starting with an iptables -I INPUT, you start with "firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0".  Like adding services, a permanent rule is not immediately active, but you can make it so by using reloading the firewall rules.  For example to open port tcp/8200, you could use:

firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 \
-s 192.168.1.0/24 -p tcp --dport 8200 -j ACCEPT


firewall-cmd --reload


I discovered that you have to "get" the rules instead of querying for a "list" of them:

firewall-cmd --direct --get-all-rules

Rich Rules

Rich rules are designed to accept a more natural language than Direct rules.  Both require more knowledge of the workings of the firewall than Service rules.

firewall-cmd --list-rich-rules
firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" port \ port="2049" protocol="tcp" accept'
firewall-cmd --remove-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" port \ port="2049" protocol="tcp" accept'

3/29/2015

Minimal Linux with CentOS 7

Minimal Linux with CentOS 7

I've been on a quest to create a minimal desktop using CentOS 7.  Starting with a minimal install of CentOS 7, I've slowly been adding packages to provide normal command line functionality instead of only minimal command line functionality.

yum -y install net-tools vim-enhanced ncurses-devel readline-devel bash-doc kernel-doc mlocate ksh zsh words attr ftp nmap-frontend telnet strace 

If you need to compile any kernel modules for virtualization or other purposes, you should add to that list:
kernel-devel kernel-headers make and gcc

Minimal Graphical User Interface Desktop for CentOS 7

To get the minimal desktop environment (GUI) for CentOS, I had to install the "xfce-desktop" package group with the following command run as root:

yum -y group install xfce-desktop

To add a few packages for web development and viewing I also ran as root:

 yum -y install bluefish firefox mate-terminal

Since I've been working on a VMWare virtual machine, and the current version of vmware-open-vm-tools and vmware-tools packages were having issues capturing the mouse properly,  I had to uninstall them and install the following packages:

yum -y install xorg-x11-drv-vmmouse xorg-x11-driv-vmware

Now, I can click into the desktop window, and my mouse stays captured in the guest, whereas before the mouse would too easily return to the host.

For those of you who may be running a VirtualBox, you can make sure that you activate the Guest Additions CD through the Device menu of the VirtualBox application. Then, you can click back into the VirtualBox guest and execute from the command line as the root user:

mount /dev/cdrom /mnt
/mnt/VBoxLinuxAdditions.run

Gnu Free Mono Fonts


Having started from a minimal install of CentOS 7, I was not at all pleased with how the terminal looked in the minimal xfce-dessktop or in the mate-terminal.  After searching with:

yum search "font monospace"

I found the gnu-free-mono-fonts package.  After installing it with:

yum -y install gnu-free-mono-fonts

The terminal and desktop fonts immediately changed, and actually became fixed-width, and looked like proper monospace fonts.

3/12/2015

Sharing Shotwell in CentOS 7

Sharing Shotwell in CentOS 7

In CentOS 7, the database for shotwell is kept under the users home directory in the 
~/.local/share/shotwell/data directory along with a backup.  The thumbnails are stored the users home directory in the in the ~/.cache/shotwell/thumbs directory.

To share these directories between multiple users on my system, I created a group called "shotwell":
groupadd -r shotwell

I added each user to the group:
useradd -aG shotwell keith
useradd -aG shotwell wright

After importing all the multimedia possible into Shotwell, I backed up the data to make it easy to extract to the destination location:

cd ~/.local/share/shotwell/
tar cvzf shotwell-database.tar.gz  data/
cd  ~/.cache/shotwell/
tar cvzf shotwell-thumbs.tar.gz thumbs/

Next, the data was extracted to the destination location:

cd /usr/local/shotwell
tar xf shotwell-database.tar.gz
tar xf shotwell-thumbs.tar.gz

Make sure the permissions on the new directories will allow members of the group to write to the directories and files, and with setgid (g+s) make sure that they will own any new files created:

cd /usr/share/shotwell/
chgrp shotwell data
find data -type d -exec chmod 775 {} \;
find data -type f -exec chmod 664 {} \;
chgrp shotwell thumbs

find thumbs -type d -exec chmod 775 {} \;

find thumbs -type f -exec chmod 664 {} \;
chmod g+s data thumbs

For each user, you need to either remove their previous database and cache or rename these directories. Then, youThcan create a symbolic link to the shared directory for the database (data) and the thumbnails (thumbs).

For the first user:

cd ~keith/.local/share/shotwell/
mv data data-orig # or rm data
ln -s /usr/share/shotwell/data data

cd ~keith/.cache/shotwell/
mv thumbs thumbs-orig
ln -s /usr/share/shotwell/thumbs thumbs

For the second user:

cd ~wright/.local/share/shotwell/
mv data data-orig # or rm data
ln -s /usr/share/shotwell/data data

cd ~wright/.cache/shotwell/
mv thumbs thumbs-orig
ln -s /usr/share/shotwell/thumbs thumbs

Etc... for each user

Shotwell Sumary

The first time you have set up the directories, make sure you logout and log back in before trying to use shotwell again.  Also, shotwell is not designed for multiuser use, so do not allow multiple users to run the program at the same time.



It can take a long time to import your multimedia with shotwell. It may crash, but if you restart it, it will continue.  If you don't try and import too much, it seems to help, for example, going by month of the year you are importing instead of trying to import the whole year.  

Gate One - Command line applications from any HTML5 browser

Gate One

Gate One is a service that can be run on system to be able to provide secure access to any on the command line applications of the server and a SSH client.  No plugins are required for access, only an HTML5 compliant web browser.  There are both commercial and open source versions of this product available at http://liftoffsoftware.com/Products/GateOne.

Installation - Git it!

To install the Gate One you can use a git client to download it, and then execute the python setup.py install command.

  • First change to an appropriate directory as the root user
cd /usr/local

  • Clone the git repository
git clone https://github.com/liftoff/GateOne


  • Install it with setup.py in the GateOne directory
cd GateOne
python setup.py install




  • Start gateone to create a default configuration
gateone &
Once it runs, break out of the service

CTRL-c

Configuration

Configure the service with JSON files 10server.conf, 20authentication.conf, and 50terminal.conf.  The files are named with two important distinctions.  One, they are processed in alphabetical order. Two, they are only processed if they have .conf suffix.

The port to use is in 10server.conf, as I already had 443 in use.  The configuration files are found in the /etc/gateone/conf.d directory.  

cd /etc/gateone/conf.d
Edit to your liking.  Here is my  modified 10server.conf:

// This is Gate One's main settings file.
{
    // "gateone" server-wide settings fall under "*"
    "*": {
        "gateone": { // These settings apply to all of Gate One
            "address": "",
            "ca_certs": null,
            "cache_dir": "/tmp/gateone_cache",
            "certificate": "/etc/gateone/ssl/certificate.pem",
            "cookie_secret": "NGNiMjBhYjQ0M2FiNDgxYmFjOGE0ZmNkMWI1MGI0MzlhN",
            "debug": false,
            "disable_ssl": false,
            "embedded": false,
            "enable_unix_socket": false,
            "gid": "0",
            "https_redirect": false,
            "js_init": "",
            "keyfile": "/etc/gateone/ssl/keyfile.pem",
            "locale": "en_US",
            "log_file_max_size": 100000000,
            "log_file_num_backups": 10,
            "log_file_prefix": "/var/log/gateone/gateone.log",
            "log_to_stderr": null,
            "logging": "info",
            "multiprocessing_workers": null,
            "origins": ["localhost", "127.0.0.1", "localhost.localdomain", "localhost4", "localhost4.localdomain4", "localhost6", "localhost6.localdomain6"],
            "pid_file": "/var/run/gateone.pid",
            "port": 10443,
            "session_dir": "/tmp/gateone",
            "session_timeout": "5d",
            "syslog_facility": "daemon",
            "uid": "0",
            "unix_socket_path": "/tmp/gateone.sock",
            "url_prefix": "/",
            "user_dir": "/var/lib/gateone/users",
            "user_logs_max_age": "30d"
        }
    }
}

Here is my 50terminal.conf.  I added Perl, Python and Ruby applications by adding other objects in the commands for the terminal.

// This is Gate One's Terminal application settings file.
{
    // "*" means "apply to all users" or "default"
    "*": {
        "terminal": { // These settings apply to the "terminal" application
            "commands": {"SSH": {"command": "/usr/lib/python2.7/site-packages/gateone-1.2.0-py2.7.egg/gateone/applications/terminal/plugins/ssh/scripts/ssh_connect.py -S '%SESSION_DIR%/%SESSION%/%SHORT_SOCKET%' --sshfp -a '-oUserKnownHostsFile=\\\"%USERDIR%/%USER%/.ssh/known_hosts\\\"'", "description": "Connect to hosts via SSH."}, 
            "PYTHON": {"command": "/bin/python", "description": "Start Python Shell"},
            "PERL": {"command": "/bin/perl -d -e42", "description": "Start Perl Debugger Interactively"},
            "RUBY": {"command": "/bin/irb", "description": "Start Interactive Ruby Shell"}},
            "default_command": "SSH",
            "dtach": true,
            "enabled_filetypes": "all",
            "environment_vars": {"TERM": "xterm-256color"},
            "session_logging": true,
            "syslog_session_logging": false
        }
    }
}


Here is what I added to the 50terminal.conf:

,
            "PYTHON": {"command": "/bin/python", "description": "Start Python Shell"},
            "PERL": {"command": "/bin/perl -d -e42", "description": "Start Perl Debugger Interactively"},
            "RUBY": {"command": "/bin/irb", "description": "Start Interactive Ruby Shell"}}


If you want to customize how things work beyond these configuration files, then you can edit various files under the directory where gateone was installed on your system.
For example, to change the branding on the main screen from "Gate One - Applications", then the /usr/lib/python2.7/site-packages/gateone-1.2.0-py2.7.egg/gateone/static directory contains the file gateone.js, where I updated line 3342 to the following:

titleH2.innerHTML = gettext("OCS Learning Gateway");

Running GateOne Unprivileged

By default, the gateone.service systemd configuration file has the service run as the root user.  Since I wanted to be able to start programming shells, this was not something that I wanted to allow.  So, I modified the systemd configuration file for gateone.service found at: /usr/lib/systemd/system/gateone.service 

In the [Service] block, I added:
User=gateone

Update: In the 10server.conf, the uid value can also be changed from 0 to the uid of an unprivileged user.  This allows the server to start with root privileges to bind to a port, but then drop them. 

Here's what the whole gateone.service file looks like now:
[Unit]
Description=Web-based terminal

[Service]
Type=simple
PIDFile=/tmp/gateone.pid
WorkingDirectory=/var/lib/gateone
ExecStart=/usr/bin/gateone
Restart=on-abort
User=gateone

[Install]
WantedBy=multi-user.target


Next, I created the service account to match and set the proper ACLs on the user's home directory:

useradd -r -s /sbin/nologin -d /var/lib/gateone gateone
setfacl -Rm d:u:gateone:rwx /var/lib/gateone
setfacl -Rm u:gateone:rwx /var/lib/gateone

Then, I switched from the root account to the gateone user with sudo:

sudo -u gateone bash

As the gateone user, I executed gateone to create the default configuration:

gateone

Once it runs, break out of the service

CTRL-c

The configuration files for the gateone user were updated by copying from the /etc/gateone/conf.d

cp /etc/gateone/conf.d/*.conf ~gateone/.gateone/conf.d/


Applications

To send a message to the screen, you can get an application to use the JavaScript:
GateOne.Visual.displayMessage('Message notification');

To send text to the terminal application, you can use the JavaScript:
GateOne.Terminal.sendString('python\n')

2/19/2015

Working with Drupal

Working with Drupal

The last couple of weeks have been very exciting as I've managed to migrate two websites (www.onecoursesource.com and www.technicaltrainingresources.com) that were created in Drupal and helped to build a new one in Drupal (www.missionbaymassage.com).  In the last year, I've been doing more and more with PHP programming directly on our company's Point Of Sale system.  At first, I found that working with Drupal was confusing, as what thought would be a web page file was really just an entry in the Drupal database.  

What Got Me Started

The Fedora server that I set up several years to run postfix/dovecot/squirrelmail/ftp/http for our two company domains was at end-of-life for software updates, so we needed to upgrade.  Rather than actually upgrading, a new server was installed, and I was tasked with making the new server do everything that the old server was doing.

How I Fixed Problems

drush

Drush is the Drupal shell.  It gives you an awesome amount of power to work with Drupal.  You can use it to perform updates, download and install modules and themes.  You can do backups and restores.  It also allows you to execute PHP and SQL code for troubleshooting, and more.  I highly recommend this tool for managing a Drupal installation.

Download drush and install it.  

drupal.org does keep files for the release of drush, but the project is now maintained at github in the repository: https://github.com/drush-ops/drush

There is documentation available at http://docs.drush.org/ and specifically for installation for English users at http://docs.drush.org/en/master/install/

Start by executing the following commands (the exact file name may vary):

cd
wget http://ftp.drupal.org/files/projects/drush-7.x-5.9.tar.gz  
echo $PATH

Examine the output of the PATH directories listed for an optimal one where you have write permission
In my case, I was limited to my home directory/bin, so I executed -C option with the name of my home directory:

mkdir ~bin
tar -xvf  drush-7.x-5.9.tar.gz -C ~/

Next, create the links to the executables in the directory where you have write permission:

ln -s ~/drush/drush ~/bin/drush
ln -s ~/drush.php ~/bin/drush.php

Now, you can use drush, but before you execute it, you should change to directory where drupal is installed.  In a few of my sites this is /usr/share/drupal, but in this example for HostGator, it is ~/public_html. In order to use drush, cd to the directory where drupal is installed:

cd ~/public_html
drush

If you successfully executed drush, then you can see all the sub commands available:
Execute a drush command. Run `drush help [command]` to view command-specific help.  Run
`drush topic` to read even more documentation.

Global options (see `drush topic core-global-options` for the full list):
 -d, --debug                               Display even more information, including    
                                           internal messages.                          
 -h, --help                                This help system.                           
 -ia, --interactive                        Force interactive mode for commands run on  
                                           multiple targets (e.g. `drush @site1,@site2 
                                           cc --ia`).                                  
 -n, --no                                  Assume 'no' as answer to all prompts.       
 --php=
                    The absolute path to your PHP intepreter,
                                           if not 'php' in the path.                   
 -p, --pipe                                Emit a compact representation of the        
                                           command for scripting.                      
 -r , --root=                  Drupal root directory to use (default:      
                                           current directory).                         
 -s, --simulate                            Simulate all relevant actions (don't        
                                           actually change the system).                
 -l ,             URI of the drupal site to use (only needed  
 --uri=           in multisite environments or when running   
                                           on an alternate port).                      
 -v, --verbose                             Display extra information about the         
                                           command.                                    
 --version                                 Show drush version.                         
 -y, --yes                                 Assume 'yes' as answer to all prompts.      


Core drush commands: (core)
 archive-dump (ard,    Backup your code, files, and database into a single file.       
 archive-backup, arb)                                                                  
 archive-restore       Expand a site archive into a Drupal web site.                   
 (arr)                                                                                 
 cache-clear (cc)      Clear a specific cache, or all drupal caches.                   
 cache-get (cg)        Fetch a cached object and display it.                           
 cache-set (cs)        Cache an object expressed in JSON or var_export() format.       
 core-config (conf,    Edit drushrc, site alias, and Drupal settings.php files.        
 config)                                                                               
 core-cron (cron)      Run all cron hooks in all active modules for specified site.    
 core-execute (exec,   Execute a shell command. Usually used with a site alias.        
 execute)                                                                              
 core-quick-drupal     Download, install, serve and login to Drupal with minimal       
 (qd)                  configuration and dependencies.                                 
 core-requirements     Provides information about things that may be wrong in your     
 (status-report, rq)   Drupal installation, if any.                                    
 core-rsync (rsync)    Rsync the Drupal tree to/from another server using ssh.         
 core-status (status,  Provides a birds-eye view of the current Drupal installation,   
 st)                   if any.                                                         
 core-topic (topic)    Read detailed documentation on a given topic.                   
 drupal-directory      Return path to a given module/theme directory.                  
 (dd)                                                                                  
 help                  Print this help message. See `drush help help` for more         
                       options.                                                        
 image-flush           Flush all derived images for a given style.                     
 php-eval (eval, ev)   Evaluate arbitrary php code after bootstrapping Drupal (if      
                       available).                                                     
 php-script (scr)      Run php script(s).                                              
 queue-list            Returns a list of all defined queues                            
 queue-run             Run a specific queue by name                                    
 search-index          Index the remaining search items without wiping the index.      
 search-reindex        Force the search index to be rebuilt.                           
 search-status         Show how many items remain to be indexed out of the total.      
 self-update           Check to see if there is a newer Drush release available.       
 (selfupdate)                                                                          
 shell-alias (sha)     Print all known shell alias records.                            
 site-alias (sa)       Print site alias records for all known site aliases and local   
                       sites.                                                          
 site-install (si)     Install Drupal along with modules/themes/configuration using    
                       the specified install profile.                                  
 site-reset            Reset a persistently set site.                                  
 site-set (use)        Set a site alias to work on that will persist for the current   
                       session.                                                        
 site-ssh (ssh)        Connect to a Drupal site's server via SSH for an interactive    
                       session or to run a shell command                               
 test-clean            Clean temporary tables and files.                               
 test-run              Run tests. Note that you must use the --uri option.             
 updatedb (updb)       Apply any database updates required (as with running            
                       update.php).                                                    
 usage-send (usend)    Send anonymous Drush usage information to statistics logging    
                       site.  Usage statistics contain the Drush command name and the  
                       Drush option names, but no arguments or option values.          
 usage-show (ushow)    Show Drush usage information that has been logged but not sent. 
                        Usage statistics contain the Drush command name and the Drush  
                       option names, but no arguments or option values.                
 variable-delete       Delete a variable.                                              
 (vdel)                                                                                
 variable-get (vget)   Get a list of some or all site variables and values.            
 variable-set (vset)   Set a variable.                                                 
 version               Show drush version.                                             
 watchdog-delete       Delete watchdog messages.                                       
 (wd-del, wd-delete)                                                                   
 watchdog-list         Show available message types and severity levels. A prompt will 
 (wd-list)             ask for a choice to show watchdog messages.                     
 watchdog-show         Show watchdog messages.                                         
 (wd-show, ws)                                                                         

Runserver commands: (runserver)
 runserver (rs)        Runs a lightweight built in http server for development. 

Field commands: (field)
 field-clone           Clone a field and all its instances.                         
 field-create          Create fields and instances. Returns urls for field editing. 
 field-delete          Delete a field and its instances.                            
 field-info            View information about fields, field_types, and widgets.     
 field-update          Return URL for field editing web page.                       

Project manager commands: (pm)
 pm-disable (dis)      Disable one or more extensions (modules or themes).           
 pm-download (dl)      Download projects from drupal.org or other sources.           
 pm-enable (en)        Enable one or more extensions (modules or themes).            
 pm-info (pmi)         Show detailed info for one or more extensions (modules or     
                       themes).                                                      
 pm-list (pml)         Show a list of available extensions (modules and themes).     
 pm-refresh (rf)       Refresh update status information.                            
 pm-releasenotes       Print release notes for given projects.                       
 (rln)                                                                               
 pm-releases (rl)      Print release information for given projects.                 
 pm-uninstall          Uninstall one or more modules.                                
 pm-update (up)        Update Drupal core and contrib projects and apply any pending 
                       database updates (Same as pm-updatecode + updatedb).          
 pm-updatecode (upc)   Update Drupal core and contrib projects to latest recommended 
                       releases.                                                     

SQL commands: (sql)
 sql-cli (sqlc)        Open a SQL command-line interface using Drupal's credentials. 
 sql-connect           A string for connecting to the DB.                            
 sql-create            Create a database.                                            
 sql-drop              Drop all tables in a given database.                          
 sql-dump              Exports the Drupal DB as SQL using mysqldump or equivalent.   
 sql-query (sqlq)      Execute a query against the site database.                    
 sql-sync              Copy and import source database to target database. Transfers 
                       via rsync.                                                    

User commands: (user)
 user-add-role (urol)  Add a role to the specified user accounts.                   
 user-block (ublk)     Block the specified user(s).                                 
 user-cancel (ucan)    Cancel a user account with the specified name.               
 user-create (ucrt)    Create a user account with the specified name.               
 user-information      Print information about the specified user(s).               
 (uinf)                                                                             
 user-login (uli)      Display a one time login link for the given user account     
                       (defaults to uid 1).                                         
 user-password (upwd)  (Re)Set the password for the user account with the specified 
                       name.                                                        
 user-remove-role      Remove a role from the specified user accounts.              
 (urrol)                                                                            
 user-unblock (uublk)  Unblock the specified user(s).                               

Other commands: (make)
 make                  Turns a makefile into a working Drupal codebase.  
 make-generate         Generate a makefile from the current Drupal site. 
 (generate-makefile)    

What Kept Me Going

It was frustrating and difficult to migrate the existing websites because I was not involved in creating them.  My girlfriend was frustrated at the same time that the company hosting her website was not responsive to her requests.  I had been reluctant to create a website for my girlfriend, as I was not wanting to have to be the one who would have to be responsive to all of her requests.

I had reached a tipping point.  I decided that if I helped my girlfriend create a new site in Drupal, then I might have a better understanding of the whole framework.  I was right!  While my girlfriend still has plenty of requests, gradually I'm teaching her how to use Drupal (and HTML) to solve them on her own.  

1/26/2015

Reset Samsung 3D BluRay Player

  1. Power on your Blu-ray player and tune your TV to the input where the Blu-ray player is connected. For example, if the Blu-ray player is connected to HDMI 1 press the TV input/source/line button to tune your TV to HDMI 1.
  1. Remove any disc from the player and then press and hold theStop button on the front of the player, not the remote, for about 8 seconds or until the front display reads ‘SETUP’. 'Resetting all settings to default values...' is displayed on your TV screen as the Blu-ray player powers off and resets.
  1. The Blu-ray player is automatically powered on after the reset and the select Language screen is displayed.

1/24/2015

HTML5

HTML 5

HTML 5 is just the continuing evolution of content presented on the Internet. It adds some new elements, and obsoletes others, but it isn't a radical change from earlier versions. The W3C lists these differences.

WHATWG and W3C

There are two different standards of HTML 5.  Web Hypertext Application Technology Working Group (WHATWG) publishes what is called a "Living Standard" and was created in response to the slow pace of progress by the World Wide Web Consortium (W3C).

New DOCTYPE

To distinguish a document as HTML 5, the first thing contained in that document should be:
<!DOCTYPE html>
 

New Semantic Elements

The following are new elements added to HTML 5 to better organize content with meaning:
article, aside, footer, header, nav, and section. Instead of using meaningless div elements to divide up the document, these elements should be logically used.

New Input Elements

There are many new input element types, email and number.

New Editing Elements

To represent text added later use ins and text that should be removed use del elements.

New Audio

New Video

New Canvas

Presentational Markup

It is better to separate the presentation of the text from the text itself by using CSS. This helps to make the document smaller, easier to maintain, and easier accessibility.

HTML5 removes presentational markup language with the exception of the and i which are now intended to represent text that is stylistically different. Of course, as shown above most browsers will render them bold or italic, but it is recommended to use a class, so that CSS can be used to define alternative styles.

JavaScript

Current standard is ECMAScript 5.1 (ES5)
ECMAScript 6 is under development (ES6)
Remember to avoid side-effects:

  • Objects are assigned by reference.
  • Primitives are assigned by value.
  • All function arguments are passed by value
  • Variables declared with var have a function level scope 
  • Variables declared with let will have a block level scope in ES6

Primitives include:

  • numbers
  • strings
  • null
  • undefined
  • true
  • false


Vulnerabilities to Avoid

Cross site scripting (XSS) - Not validating user input. If combined with a database, may be used to SQL injection.

Cross site request forgery (CSRF) - If origin headers are not validated from forms or other user specific tokens embedded in forms, then they may be posted from other sites, often without the user's knowledge.

Clickjacking - pages should check if they are being "framed" with an iFrame by comparing the window object with top.

Do's and Don'ts

Do's:

  • Start with base functionality and use progressive enhancement and graceful degradation
  • Use a layered architecture separating HTML, JavaScript and CSS. 
  • Use a library like jQuery or Dojo to ease platform and browser differences
  • Use well-known design patterns
  • To ensure events fire for specific elements to run a script, the script should be attached directly to the element.

Don'ts:

  • Pollute the global namespace 
  • Modify the Object class prototype
  • Pass strings, use functions to pass to setTimeout and setInterval 
  • Use document.write 
  • Use reserved JavaScript keywords:
    • break do instanceof typeof
    • case else new var
    • catch finally return void
    • continue for switch while
    • debugger function this with
    • default if throw
    • delete in try
  • Use future reserved JavaScript keywords:
    • class enum extends super
    • const export import
  • Use future reserved JavaScript keywords in a strict context:
    • implements let private public yield
    • interface package protected static

Advanced Perl Notes

Advanced Perl Notes

Like many of my blog entries, Advanced Perl Notes is my own list of notes on a subject.  It is one of the worst organized.

Using &subname defaults to call a subroutine in the current package.

Class methods are package methods in the form: PackageName->MethodName();

The my variables are not scoped to a particular package

$VERSION must be placed in a package that has the same name as the file (without the .pm)

File names conventionally match package names

Loading a Perl module like Module.pm with use Module happens at compile time, but loading a module with require Module happens at runtime.

Perl libraries like syslog.pl can be loaded with do syslog.pl  or require syslog.pl.  Require does error checking, and is preferred.  Libraries have difficulty using other libraries so modules are preferred.

Along with references and modules,  Perl release 5.000,  added objects.  

When you use the ref function on an object, it will return the name of the class it belongs to.

sub class_only_method {
    my $class = shift;
    die "class method called on object" if ref $class;
    # more code here
} 

If you want to allow a particular method to be called as an instance method only, do something like this:
sub instance_only_method {
    my $self = shift;
    die "instance method called on class" unless ref $self;
    # more code here
} 

To format dates and times:
use POSIX 'strftime';
print strftime 'Today is %x', localtime



Gnome 3 Desktop Tips and Tricks

Gnome 3 Desktop Tips and Tricks

In updating to RHEL 7 / CentOS 7, I found myself having to live with the Gnome 3 Desktop.  Fortunately, Red Hat has documentation available at DESKTOP MIGRATION AND ADMINISTRATION GUIDE.  As I've been reading through this documentation and other sources, I'll be sharing the helpful tricks and tips that I find.

First, as you might read this documentation, you should know that when they refer to the SUPER key, they mean the Windows key on your keyboard.  Here are some of the shortcuts:

Shortcuts

 SUPER + m :  Display the message notification panel, and press ESC to return to normal view
                        This also happens when you point and click at the bottom of the screen, click again to return 
 SUPER + Tab:  Display window switcher


Desktop Customization

In the current desktop environment, you can customize the desktop by using the dconf-editor.
The dconf-editor package is not installed by default, and gives you access to be able to edit the settings of the desktop.  This tool replaces the gconf-editor that was used in Gnome 2 Desktop.  To install the tool you will need to have set yourself as an administrator during installation, or know the root password.

If you have been set up as an administrator, then you can execute and provide your own password:

sudo yum install dconf-editor

Otherwise, if you know the root password, then you can execute and provide the root password:

su -c 'yum install dconf-editor'

After executing as the user whose desktop you want to customize:

dconf-editor

Then, you can navigate the tree on the left to org.gnome.desktop and then click on settings on the right to change your desktop settings.  For example you can click on the background and provide a simple file URI to change the desktop from the default xml file.  

For example, clicking on org, then gnome, desktop, and then background on the left, you could then click on picture-uri on the right.  The default setting is an xml file named file:///usr/share/backgrounds/default.xml, but you could set it to something like file:///home/kwright/Pictures/Wallpapers/_DSC1468.png. By the way, an easier way of accomplishing the above is to locate the picture you want to use as a wallpaper, and then right-click on it and choose 'Set as Wallpaper'.

If you liked icons on your desktop, like in the Gnome 2 Desktop environment, then in the same org.gnome.desktop.background part of the dconf-editor, you can select show-desktop-icons.

The org.gnome.desktop.interface selection of the dconf-editor has some nice customization options for the clock like being able to show the date and display a 12 hour clock.

One feature I went looking for and could not find within the standard interface was a way to control how long my session was idle before the screensaver came on.  You can adjust this time by going to org.gnome.desktop.session and selecting idle-delay and entering the number of seconds to delay.

Finally, if you want to lock down what a user can do, then you can go to the org.gnome.desktop.lockdown part of the dconf-editor and lock down the ability of the user to do things such as print, change the print setup, access the command line, and save to the disk among other options.

Gsettings

The gsettings command can be used to get, set and query different keys and schemas. It's main utility is that you can use it in scripts to automate the process of customizing settings. Otherwise, the dconf-editor provides a more user friendly interface, and is easier to explore.

Getting a Key

If I had set the custom background as shown above, then using the following gets what the key picture-uri is set to within the org.gnome.desktop.background schema:

gsettings get org.gnome.desktop.background picture-uri
'file:///home/kwright/Pictures/Wallpapers/fireworks.png'



Setting a Key

To change the value of the same key, again there will be a space between the schema and the key, but using the sub-command set instead of get:

gsettings set org.gnome.desktop.background picture-uri  'file:///home/kwright/Pictures/Exports/2greatblueherons.jpg'




For keys that have a checkbox in the dconf-editor, you can use the value true or false to mean the box is checked or not.  For example, to display the icons on the desktop, you could use true as the value for the show-desktop-icons key:

gsettings set org.gnome.desktop.background show-desktop-icons true


Listing the keys

To list the keys of the org.gnome.desktop.background schema, you can use the list-keys sub-command:

gsettings list-keys org.gnome.desktop.background
color-shading-type
picture-opacity
picture-options
picture-uri
primary-color
secondary-color

show-desktop-icons

For more details about using gsettings, execute:

 man gsettings


Gnome Classic Desktop

Each user can choose whether they want to use classic desktop, which is more like Gnome 2 than Gnome 3, or the real Gnome 3.  By default users login with the classic desktop.  At the graphical login screen, you can click on the settings icon, which looks like a small gear, and choose which installed desktop they want to user.

To switch to the classic desktop for a session, from the command line you can execute:

gnome-shell --mode=classic -r &

If you are in a classic desktop, and want to use the current Gnome 3 desktop, then you can execute:

gnome-shell --mode=user -r &

For making a permanent change to which desktop a user will have, the file /var/lib/AccountsService/users/username can be modified.  The contents of this file on my CentOS 7 system looked like this:

[User]
Language=en_US.utf8
XSession=gnome-classic
SystemAccount=false

Notice that the XSession is set to gnome-classic.  By default, users user the "classic" desktop.  In order to make the desktop use the true Gnome 3 desktop, then this file would look like the following with the XSession set to gnome.

[User]
Language=en_US.utf8
XSession=gnome
SystemAccount=false

After updating the file, the user will need to log out and back in again.

Locking Down Settings

If you want to lock down certain settings, and then you can create the following directory by executing as an administrator:

mkdir /etc/dconf/db/local.d/locks/

Next, create a file named something like 00-local-lockdown.  Its contents should be any keys that you want to lock down like the following:

/org/gnome/desktop/background/picture-uri
/org/gnome/desktop/session/idle-delay

After creating the file, execute as root or with sudo:

dconf update


8/22/2014

Python Decorators

Python Decorators

What are Python decorators?

Python decorators are special syntax of the language that allows for functions to be applied to other functions or classes. The Python Enhancement Proposal (PEP) 318 describes the syntax used by these decorators as applied to functions. The Python Enhancement Proposal (PEP) 3129 describes the syntax used by these decorators as applied to classes.

The first use of decorator notation of @function_name appeared in Python 2.2.  The decorators for class methods and static functions were created so instead of using the following for a classmethod or a staticmethod: 

class Foo(object): 
    def bar(cls):
           pass
    bar = classmethod(bar)

class Biz(object):
    def baz():
        pass
    baz = staticmethod(baz)

The new decorator syntax allows you to call the __builtins__ functions, classmethod() and staticmethod() by using an @function_name syntax. This applied either the classmethod or staticmethod built-in functions to the function that followed the @function_name syntax.

class Foo(object): 
    @classmethod
    def bar(cls):
           pass

class Biz(object):
    @staticmethod
    def baz():
        pass

PEP 318 also proposed and extended this syntax to be able to be used by user defined functions.  PEP 3129 also extended this syntax to be able to be used by user defined classes. 

Properties

Properties are a special case of the use of decorators. In the case of properties, the property function gets called on the function that is either a attribute setter, getter, deleter method of a class. The following two examples are equivalent

class C(object):
    def __init__(self):
        self._x = None

    def getx(self):
        return self._x
    def setx(self, value):
        self._x = value
    def delx(self):
        del self._x
    x = property(getx, setx, delx, "I'm the 'x' property.")

class C(object):
    def __init__(self):
        self._x = None

    @property
    def x(self):
        """I'm the 'x' property."""
        return self._x

    @x.setter
    def x(self, value):
        self._x = value

    @x.deleter
    def x(self):
        del self._x

Examples of decorators

There is a repository containing numerous examples at https://wiki.python.org/moin/PythonDecoratorLibrary.

About Me - WrightRocket

My Photo

I've worked with computers for over 30 years, programming, administering, using and building them from scratch.

I'm an instructor for technical computer courses, an editor and developer of training manuals, and an Android developer.