Wednesday, December 29, 2010
New favorite Microchip PIC is the 18F14K22
I discovered this little microchip recently. The 18F14K22 PIC is really neat. At about $2 from mouser or digikey and supported by the USBProg for ICSP and also supported by mikroC compilers, it is my new favorite low-end chip. I use it anywhere USB coms are not required. It also runs at 64 MHz with an external crystal, but I mostly use the 2 internal clock sources. The primary internal runs at up to 16 MHz and has fantastic stability. The secondary clock runs at 31 KHz, which is great for saving the batteries. This chip comes in SMD/SMT and PDIP flavors as you might expect. I like the SOIC-20 style because this is really easy to solder down quickly on a prototype board (like a schmartboard). You can also run them at 1.8v to 5.5v, which is nice is you are using usb power or 2 double A batteries. I use this chip with the Linx TRM433 transceiver, which runs at a strict 3v. So I regulate power once and smooth it out and forget about it! If you are getting into the embedded world, I would highly recommend this chip! It beats the pants off of any arduino out there at a fraction of the cost!
Wednesday, October 13, 2010
Git: What SHA does this tag refer to?
I often have to tag a branch in my Git repo for QA. Our QA people prefer to have a tag to deploy on to their QA environments, so that they do not have a "moving target" to ensure features and bugs are accounted for. Sometimes, however, I forget exactly where in the lineage the tag was created. In other words, on which commit the tag was drawn.
There is a way in Git to see this information. Here is a use case for the situation.
You complete feature A and commit it. You then tag feature A with an annotated tag and immediately start working on feature B, then C, etc. QA asks about the tag. You no longer remember what that tag was for, so you fire up a console and type in the following to find out:
git show-ref --dereference
You can find the tag in the list and perform a simple git log matching the sha from the show-ref to the sha in the git log. Simple. Even easier would be to run a filter using --exclude-existing on the show-ref using a regular expression and then piping the result to git show or git log.
There is a way in Git to see this information. Here is a use case for the situation.
You complete feature A and commit it. You then tag feature A with an annotated tag and immediately start working on feature B, then C, etc. QA asks about the tag. You no longer remember what that tag was for, so you fire up a console and type in the following to find out:
git show-ref --dereference
You can find the tag in the list and perform a simple git log matching the sha from the show-ref to the sha in the git log. Simple. Even easier would be to run a filter using --exclude-existing on the show-ref using a regular expression and then piping the result to git show or git log.
Sunday, October 10, 2010
Debian Unstable (SID) Squeeze: installing Grub2
This is frustrating. Installing the Debian system in development (SID, AKA squeeze) is really broken currently. Installing GRUB or GRUB2 just does not work at all and can ruin your day. You get all the way to the end of the install when the error pops up. During the install of either GRUB or GRUB2.
Here is what you can do to fix this:
1. Choose to install GRUB2 and let it fail; be sure to allow GRUB to write to the MBR.
2. Go back to the main menu of installer items and choose "continue without installing a bootloader". Trust me on this one, it will all work out.
3. reboot your machine, the grub (this will be the GRUB2) bootloader prompt will be presented. This is your ticket back into your newly installed system
4. At the "grub>" prompt, type the following: (you may need to adjust the boot drive)
linux hd(0,1)/boot/vmlinuz-2.6.32-5-amd64 root=/dev/sda1
then:
initrd /boot/initrd-2.6.32-5-amd64
then:
boot
of course substitute the kernel and initrd you are using for the real ones. Also check the root drive for the correct one. Sometimes you can just guess, the machine will just not boot if it is wrong and you can go back and do it again until you get it right.
Then once you have everything booted. You can install GRUB2 properly by doing the following:
apt-get install grub2
then:
grub-install /dev/sda
then:
grub-mkconfig > /boot/grub/grub.cfg
then:
reboot
All should be well after the reboot.
Here is what you can do to fix this:
1. Choose to install GRUB2 and let it fail; be sure to allow GRUB to write to the MBR.
2. Go back to the main menu of installer items and choose "continue without installing a bootloader". Trust me on this one, it will all work out.
3. reboot your machine, the grub (this will be the GRUB2) bootloader prompt will be presented. This is your ticket back into your newly installed system
4. At the "grub>" prompt, type the following: (you may need to adjust the boot drive)
linux hd(0,1)/boot/vmlinuz-2.6.32-5-amd64 root=/dev/sda1
then:
initrd /boot/initrd-2.6.32-5-amd64
then:
boot
of course substitute the kernel and initrd you are using for the real ones. Also check the root drive for the correct one. Sometimes you can just guess, the machine will just not boot if it is wrong and you can go back and do it again until you get it right.
Then once you have everything booted. You can install GRUB2 properly by doing the following:
apt-get install grub2
then:
grub-install /dev/sda
then:
grub-mkconfig > /boot/grub/grub.cfg
then:
reboot
All should be well after the reboot.
Wednesday, September 29, 2010
Changing xterm-new/xterm text output colors
I recently found that in my iterm (and Mac terminal) applications the text coloring was not optimal. For instance, I use a dark background, but when issuing a command such as 'ls' would list directories in dark blue. This is impossible to read. It seemed to me that this would affect most who prefer a dark background in their terminals. I think this only applies to Mac terminal since the environment variable used is a bit different than what Linux uses.
to find out which terminal you are using (aside from the application running the terminal such as terminal app or iterm) issue this command:
echo $TERM
as always, you can read all about the information here in the ls man page
man ls
here is what you can do to change one or all of your lscolors, environment variable is LSCOLORS
Add the following to .bashrc or .bash_profile or whatever file runs when you start an interactive shell: (mine is called .bash_profile and lives in my home directory)
LSCOLORS='fxfxcxdxbxegedabagacad'
export LSCOLORS
straight from 'man ls'
LSCOLORS
The value of this variable describes what color to use for which attribute when colors are enabled with CLICOLOR. This string is a concatenation of pairs of the format fb, where f is the foreground color and b is the background color.
The color designators are as follows:
a black
b red
c green
d brown
e blue
f magenta
g cyan
h light grey
A bold black, usually shows up as dark grey
B bold red
C bold green
D bold brown, usually shows up as yellow
E bold blue
F bold magenta
G bold cyan
H bold light grey; looks like bright white
x default foreground or background
Note that the above are standard ANSI colors. The actual display may differ depending on the color capabilities of the terminal in use.
The order of the attributes are as follows:
1. directory
2. symbolic link
3. socket
4. pipe
5. executable
6. block special
7. character special
8. executable with setuid bit set
9. executable with setgid bit set
10. directory writable to others, with sticky bit
11. directory writable to others, without sticky bit
The default is "exfxcxdxbxegedabagacad", i.e. blue foreground and default background for regular directories, black foreground and red background for setuid executables, etc.
So add the following to your .bash_profile or equivalent:
LSCOLORS='fxfxcxdxbxegedabagacad'
export LSCOLORS
As you can see I just changed the first character from 'e' to 'f'. This has the effect of making directory listings be listed in a magenta color instead of a dark blue.
Save .bash_profile and issue:
. !$
that is the same as:
source ~/.bash_profile
if issued right after the command to edit .bash_profile. In other words, you are asking bash to source (which is what the dot is) and then reprint the last argument to the last command.
to find out which terminal you are using (aside from the application running the terminal such as terminal app or iterm) issue this command:
echo $TERM
as always, you can read all about the information here in the ls man page
man ls
here is what you can do to change one or all of your lscolors, environment variable is LSCOLORS
Add the following to .bashrc or .bash_profile or whatever file runs when you start an interactive shell: (mine is called .bash_profile and lives in my home directory)
LSCOLORS='fxfxcxdxbxegedabagacad'
export LSCOLORS
straight from 'man ls'
LSCOLORS
The value of this variable describes what color to use for which attribute when colors are enabled with CLICOLOR. This string is a concatenation of pairs of the format fb, where f is the foreground color and b is the background color.
The color designators are as follows:
a black
b red
c green
d brown
e blue
f magenta
g cyan
h light grey
A bold black, usually shows up as dark grey
B bold red
C bold green
D bold brown, usually shows up as yellow
E bold blue
F bold magenta
G bold cyan
H bold light grey; looks like bright white
x default foreground or background
Note that the above are standard ANSI colors. The actual display may differ depending on the color capabilities of the terminal in use.
The order of the attributes are as follows:
1. directory
2. symbolic link
3. socket
4. pipe
5. executable
6. block special
7. character special
8. executable with setuid bit set
9. executable with setgid bit set
10. directory writable to others, with sticky bit
11. directory writable to others, without sticky bit
The default is "exfxcxdxbxegedabagacad", i.e. blue foreground and default background for regular directories, black foreground and red background for setuid executables, etc.
So add the following to your .bash_profile or equivalent:
LSCOLORS='fxfxcxdxbxegedabagacad'
export LSCOLORS
As you can see I just changed the first character from 'e' to 'f'. This has the effect of making directory listings be listed in a magenta color instead of a dark blue.
Save .bash_profile and issue:
. !$
that is the same as:
source ~/.bash_profile
if issued right after the command to edit .bash_profile. In other words, you are asking bash to source (which is what the dot is) and then reprint the last argument to the last command.
Tuesday, September 28, 2010
Microchip Pic 18F2455/2550/4455/4550 Oscillator Settings Explained
I have a new fav Microprocessor. The Microchip Pic 18F2455. This is a feature-full yet powerful little device has almost limitless possibilities. Alas, you must understand that I am coming from the Pic 16F77, which lacks USB support, but is far more simple to get "blinky lights".
What the 18F2455 achieves in features, it gives up in ease of use (for newbies like myself). The external oscillator settings where an epic nightmare to get right! I believe the reason for this is twofold:
1. Nanowatt (tm) specifies the use of 2 clocks/oscillators for the 18F2455. The first clock for the main clock source to run the cpu itself; the ALU, the USB port(s) and all that. The second clock runs timers. This setup allows the main clock (and CPU) to power down leaving the second clock running to handle checking for new data on the USB port and running timers.
2. The USB port needs a strict 48 MHz clock to run, but Microchip still wanted to allow users of these chips to use oscillator configurations that they were used to. For example, for me, I have always clocked my chips at 20 MHz and I have a surplus of those crystals, so using a 20 MHz clock source would be really nice. I can still do this, but I need to use internal chip configurations to make use of the chip's internal pre/post oscillator scalers.
Here is how it all breaks down for me:
using 18F2455 and a 20 MHz external crystal. Please open the data sheet for the 2455 and refer to figure 2-1.
diagraming it out:
20 MHZ --> pins 9,10 (on pic)
you can see from Figure 2-1 that whatever you hook up to pins 9,10, you are feeding a PLL prescaler internally and you MUST feed the subsequent PLL prescaler a 4 MHz clock source as its input. This means that for me, I have to prescale my 20 MHz oscillator to 4 MHz. This means that we need to divide 20 MHz by 5. You can see from figure 2-1 that this bit setting is 100 on the PLL DIV MUX.
Now you have 96 MHz at the exit of the second PLL that is feeding another divider and also feeding a PLL postscaler. So then you can set the CPU DIV for the appropriate div for the main CPU clock source. This is 1 in my case because I want the main CPU to be clocked at 20 MHz.
If you are thinking that this is pretty confusing, you are right! There are a lot of choices (12 different oscillator modes) in oscillator setup and configuration. This leads to confusion and dismay. Mayhem might ensue. But, I think if you take the time to read Fig. 2-1 and learn the register bits that control which mode the clocks can be in, then I think this is an extremely powerful tool.
What the 18F2455 achieves in features, it gives up in ease of use (for newbies like myself). The external oscillator settings where an epic nightmare to get right! I believe the reason for this is twofold:
1. Nanowatt (tm) specifies the use of 2 clocks/oscillators for the 18F2455. The first clock for the main clock source to run the cpu itself; the ALU, the USB port(s) and all that. The second clock runs timers. This setup allows the main clock (and CPU) to power down leaving the second clock running to handle checking for new data on the USB port and running timers.
2. The USB port needs a strict 48 MHz clock to run, but Microchip still wanted to allow users of these chips to use oscillator configurations that they were used to. For example, for me, I have always clocked my chips at 20 MHz and I have a surplus of those crystals, so using a 20 MHz clock source would be really nice. I can still do this, but I need to use internal chip configurations to make use of the chip's internal pre/post oscillator scalers.
Here is how it all breaks down for me:
using 18F2455 and a 20 MHz external crystal. Please open the data sheet for the 2455 and refer to figure 2-1.
diagraming it out:
20 MHZ --> pins 9,10 (on pic)
you can see from Figure 2-1 that whatever you hook up to pins 9,10, you are feeding a PLL prescaler internally and you MUST feed the subsequent PLL prescaler a 4 MHz clock source as its input. This means that for me, I have to prescale my 20 MHz oscillator to 4 MHz. This means that we need to divide 20 MHz by 5. You can see from figure 2-1 that this bit setting is 100 on the PLL DIV MUX.
Now you have 96 MHz at the exit of the second PLL that is feeding another divider and also feeding a PLL postscaler. So then you can set the CPU DIV for the appropriate div for the main CPU clock source. This is 1 in my case because I want the main CPU to be clocked at 20 MHz.
If you are thinking that this is pretty confusing, you are right! There are a lot of choices (12 different oscillator modes) in oscillator setup and configuration. This leads to confusion and dismay. Mayhem might ensue. But, I think if you take the time to read Fig. 2-1 and learn the register bits that control which mode the clocks can be in, then I think this is an extremely powerful tool.
Labels:
18F2455,
Clock,
embedded,
Microchip,
microcontroller,
Oscillator,
PIC programming
Sunday, September 26, 2010
Montana Property
I wish I had the money and freedom to buy this property myself.
Check this beautiful Western USA property out!
Monday, September 20, 2010
SSH: setting up key authorization only (authorized_keys)
This is a great site for dealing ssh key authorization.
The problem with sites that help you setup ssh key authorization is that they typically leave out the specific chmod commands (permissions) that you need to make the darn thing work!
What I mean to say is that people need to see an example of how this works and not just out of context commands and scripts.
Here is an example of a Mac OS X ssh client trying to setup ssh key authorization with a CentOS ssh server.
on the Mac, issue the following commands (you may or may not want a pass phrase on your private key), also substitute your username and hostname in where the double quotes are.
1. ssh-keygen -t dsa
2. scp .ssh/id_dsa.pub "user"@"CentOS host":~
3. ssh "user"@"CentOS host"
on the CentOS server
1. mkdir .ssh (this directory may or may not already be there; it should be safe to issue either way)
2. cat id_dsa.pub > .ssh/authorized_keys
3. chmod 755 .ssh && chmod 755 .ssh/authorized_keys
on Mac again: (hit ctrl-D to log off the server)
1. ssh -vvv "user"@"CentOS host"
The ssh client should log you in without a password if there is not password protected private key. If you protected your private key with a password, then it should ask for the password for the private key. Ssh should NOT ask you to provide a login for the shell on the remote side. The triple 'V' will display a verbose list of the conversation going on betwix client and server.
Wednesday, May 19, 2010
Modulo operators with respect to Ruby and Javascript
Recently, I was tasked with creating a calendar which transitioned from month to month such as December to January to February, etc.. Also, I needed to go backward on the transition.
A good way to do this is to use a modulo operator. This means that you can figure out which month is the next month number very easily.
So if the month is December, which is month number 12, to find out which month is next:
month = (month % 12) + 1 or (12 % 12 )+ 1, this will work for any month number from 1 to 12.
BUT to go backwards on the month numbers, here is the operation:
month = ((12+(month-2)) % 12) + 1 ... the funny thing is that this operation does not work in Ruby, but it does in Javascript.
In Ruby, here is the equivalent backward operation:
month = ((month-2) % 12) + 1
What is the difference? Why would there be a difference? I have no idea. It seems like Javascript would generate the right response to -1 % 12, which is -1 because 12 divided by -1 is 0 with -1 left over, but Ruby, Python, Perl, and the Google calculator figure that it should be 11 left over. This may be because a negative remainder would make no sense. So if the modulo is negative, then add it to the second operand to get the real modulo.
A good way to do this is to use a modulo operator. This means that you can figure out which month is the next month number very easily.
So if the month is December, which is month number 12, to find out which month is next:
month = (month % 12) + 1 or (12 % 12 )+ 1, this will work for any month number from 1 to 12.
BUT to go backwards on the month numbers, here is the operation:
month = ((12+(month-2)) % 12) + 1 ... the funny thing is that this operation does not work in Ruby, but it does in Javascript.
In Ruby, here is the equivalent backward operation:
month = ((month-2) % 12) + 1
What is the difference? Why would there be a difference? I have no idea. It seems like Javascript would generate the right response to -1 % 12, which is -1 because 12 divided by -1 is 0 with -1 left over, but Ruby, Python, Perl, and the Google calculator figure that it should be 11 left over. This may be because a negative remainder would make no sense. So if the modulo is negative, then add it to the second operand to get the real modulo.
Labels:
date,
javascript,
modulo,
month,
Ruby,
signed integer
Thursday, April 22, 2010
I must speak out on the this one
Recently, while at work, I was discussing why Google maps do not include a scale. In fairness to Google, the maps may have this functionality, but I am ignorant as to how to enable this feature.
My hypothesis as to why there is no scale was a simple one. To accurately determine scale for a map, one would need to consider the topography of land the map covers. Maybe Google just does not want to go to the trouble.
Seems simple enough to me, but to my surprise, the other two parties in the conversation said that topography has nothing to do with scale on this map. Huh?!? I stipulated the point to avoid a nasty argument where more than one person might need to get schooled, Sesame Street style.
Well, I can't take it anymore; time for some schooling. The assertion I am attempting to buttress is that topography (whether there are mountains and valleys on the surface of the earth) matters when applying a scale marker on a map. Google could probably estimate this very accurately since topography overlays are available to them, but who wants to do calculus for such a small thing? Anyway, here is an image which details my explanation.
Monday, April 5, 2010
Installing Rails 3 on Debian Unstable (Sid)
Recently, I was installing Rails3 on my Debian unstable machine and I noticed an error that was really strange.
Here was the error:
ERROR NameError: uninitialized constant ActiveResource::Base
The problem ended up being that I was missing this deb file:
libopenssl-ruby1.8
I have seen posts from people proclaiming that uninstalling old versions of activeresource would do the trick, but I reinstalled activeresource-2.3.5 gem after Rails 3 starting working again without a failure. I hate cryptic errors like that.
Here was the error:
ERROR NameError: uninitialized constant ActiveResource::Base
The problem ended up being that I was missing this deb file:
libopenssl-ruby1.8
I have seen posts from people proclaiming that uninstalling old versions of activeresource would do the trick, but I reinstalled activeresource-2.3.5 gem after Rails 3 starting working again without a failure. I hate cryptic errors like that.
Sunday, March 21, 2010
Mac OS X Leopard installing the ruby gem eventmachine
I was having some trouble installing eventmachine (a ruby gem that needs an extension library written in C++) recently in Mac OS X Leopard. I am currently running ruby 1.8.8dev. I think, perhaps, when I compiled ruby from source, the config left out the CXX flags setting. This makes mkmf not know what C++ compiler it needs to set in the Makefiles it creates. Since there are not too many gems that have extensions written in C++ (that I know of), I never really ran into this issue. Here is how to fix this.
Edit this file inside the directory of the gem, in my case;
$ vim /usr/local/lib/ruby/gem/1.8/gem/eventmachine-0.12.11/ext/extconf.rb
Right above the last line (the last line being a call to create_makefile), insert this line:
CONFIG['CXX'] = g++
then do the same thing for this extconf.rb in the fastfilereader dir (or anywhere else in the ext dir where there might be more nested extconf.rb files.
then run this:
cd /usr/local/lib/ruby/gem/1.8/gem/eventmachine-0.12.11; rake gem:install
this should solve the issue of getting errors like this:
make: I.: Command not found
make: dynamic: Command not found
Edit this file inside the directory of the gem, in my case;
$ vim /usr/local/lib/ruby/gem/1.8/gem/eventmachine-0.12.11/ext/extconf.rb
Right above the last line (the last line being a call to create_makefile), insert this line:
CONFIG['CXX'] = g++
then do the same thing for this extconf.rb in the fastfilereader dir (or anywhere else in the ext dir where there might be more nested extconf.rb files.
then run this:
cd /usr/local/lib/ruby/gem/1.8/gem/eventmachine-0.12.11; rake gem:install
this should solve the issue of getting errors like this:
make: I.: Command not found
make: dynamic: Command not found
Thursday, February 25, 2010
The Web needs a language
I am now convinced that the Web needs a language of its own. It is not good enough to try and build systems with general purpose computer languages such as Java, C#, Python, or Ruby. Tick, tock, request, response, the collage of technologies that it takes to put together a simple website and backend is a wonderful display of inefficiency. I have seen the future and it is not hacking Javascript or HTML! How many ways can the same Rails app be written doing almost the same thing? Wouldn't it be nice to develop a solution to a problem using one language to express business rules? It seems like the best way to solve this problem is with better tools. New languages are judged on their expressive power, both the computer and human type. Most of the people using the Ruby language, do so because it will be used to generate what is between a couple of html tags.
I hereby propose that a new language be created that inherently knows the semantics of the web leaves us problem solvers with the ability to apply business log simply and directly.
I hereby propose that a new language be created that inherently knows the semantics of the web leaves us problem solvers with the ability to apply business log simply and directly.
Wednesday, January 6, 2010
PHP -- much better than using switch statements
PHP's syntax is manic muddled mess. It is not object oriented programming, but there are a few things that make it easy to do things better than the average hacker.
Function pointers, if you are a C person, Funs, if you are an Erlang cat, Procs or lambdas for Ruby, delegates in C#, lambdas in my beloved Python is what I am talking about.
PHP too, supports this, but in a completely straight forward way.
take the following PHP code:
you can simply refer to pass around a reference (or pointer) to 'iMRichBitch' using a string by the same name. Of course, when the function is to be invoked, you simply can say:
So this begs the question, "if I have function pointers", then I ought to use those instead of case statements and maybe even nested conditionals, right?" The answer is a big 'YES'.
so instead of this:
you might think about doing this (with a little defensive code for garnishment):
Function pointers, if you are a C person, Funs, if you are an Erlang cat, Procs or lambdas for Ruby, delegates in C#, lambdas in my beloved Python is what I am talking about.
PHP too, supports this, but in a completely straight forward way.
take the following PHP code:
function iMRichBitch() { compute48thMersennePrime(); }
you can simply refer to pass around a reference (or pointer) to 'iMRichBitch' using a string by the same name. Of course, when the function is to be invoked, you simply can say:
$func = 'iMRichBitch';
$func();
So this begs the question, "if I have function pointers", then I ought to use those instead of case statements and maybe even nested conditionals, right?" The answer is a big 'YES'.
so instead of this:
switch($conditional) { case 1: do1(); break; case 2: do2(); break; default: break; }
you might think about doing this (with a little defensive code for garnishment):
$conditional();
Sunday, January 3, 2010
Lambda Calculus
Can anyone fully understand lambda calculus? If so, what would they do with that power?
Subscribe to:
Posts (Atom)