A Django site.
September 7, 2008

Kyle Brantley
ScytheBlade1
URL > Average
» IPv6

Not too long ago, after reading yet another "the internet is dying! We're running out of address space and it's all coming by November 2010 according to Cisco!" I realized that, "hey waitaminute - that's just about two years from now. That's... soon."

So I setup IPv6 for the machines I own. I still depend on IPv4 simply due to IPv6 not being available... well, most anywhere. At least not natively.

A big part of the reason that we don't have IPv6 in more places is because... well, circular dependency here, but because it isn't around. I can't plug my laptop into any other ISP's line and use IPv6 natively, and even if I could, the chances of the average home grade router working with it is about two.

Out of thousands.

So to get around this, IPv6 in IPv4 tunnels are used. They do exactly what their name implies: tunnels IPv6 data within IPv4 packets. The downsides to IPv6 tunneling are latency/overhead and... your ability to keep your IP addresses. If you don't have native IPv6, then your current hosting provider or ISP won't be the one giving it to you - meaning you get to get the IPs from a third party company. When your hosting provider or ISP turns IPv6 on, what are the chances that you'll be able to reassign entire blocks of IPv6 address space? Probably not too great. If you've got Comcast as your home ISP, I don't think that your tunnel broker is going to happily move your address blocks over to Comcast's control - at all.

While the latter point is generally a deal breaker for a lot of people, in the long run, I don't care. IP address reassignment happens all the time. There's no rule stating that you must drop your tunnels once you get native IPv6, and there's no reason why it would be overly problematic or painful either. Simply bring up the native IPv6, change the DNS records, and drop your tunnels a few days later.

With this knowledge in hand, I went poking around the vast area known as the Internet and selected Hurricane Electric's IPv6 Tunnel Broker. What really sold me (for free, that is) on using HE for my tunnel was really twofold: one, their views on IPv6 (which boil down to "we'd really like to be in business when IPv4 is exhausted, so we're going to deploy native IPv6 everywhere, provide a tunnel broker for free for anyone and everyone, and we're going to do it three years before crunch time") and two, the fact that it was free.

In selecting HE, I also got full reverse DNS control, selection of the closest HE router to my server, full control of a /64 subnet and a /48 subnet (by request, which I requested), the possibility of adding three more /64 subnets and three more /48 subnets to my account, and full operating system support (with instructions for setup with  linux-net-tools, iproute2, *BSD, OSX, Solaris, Windows XP+, and Cisco).

Not bad for $0. I'm a happy customer (and a potential customer should I ever need colocation/dedicated servers).

I setup my account with HE, logged in, and was presented with simplistic instructions on how to setup my CentOS server.

ip tunnel add he-ipv6 mode sit remote 209.51.161.58 local 64.22.124.36 ttl 255
ip link set he-ipv6 up
ip addr add 2001:470:4:b2::2/64 dev he-ipv6
ip route add ::/0 dev he-ipv6

I created a new 'sit' tunnel named 'he-ipv6', with remote endpoint 209.51.161.58 - coming from 64.22.124.36 - and then turned the link up. Easy enough. Then I added my /64 allocation to the newly created tunnel, and pointed the default route through that tunnel.

Wait a minute. That's it? I'm IPv6 enabled already?

[kyle@averageurl ~]$ ping6 ipv6.google.com
PING ipv6.google.com(2001:4860:0:1001::68) 56 data bytes
64 bytes from 2001:4860:0:1001::68: icmp_seq=0 ttl=55 time=327 ms
Yup...

From there, I requested a /48 subnet so I could allocate a few full /64 subnets to my house (a /64 for my LAN, wifi, and secondary wifi), brought some more tunnels up, and then from my desktop...

kyle@ksb ~ $ ping6 ipv6.google.com
PING ipv6.google.com(2001:4860:0:2001::68) 56 data bytes
64 bytes from 2001:4860:0:2001::68: icmp_seq=1 ttl=54 time=325 ms

And now my desktop is IPv6 enabled. Go ahead, ping6 2001:470:d82b:ffff::2! You'll hit my home desktop. Then ping ::3 - my Vista box. Yup, that's right! My windows box is also on the IPv6 network. :fffe::2 would be my laptop on the wifi. The entire :fffd::0/64 subnet (and corresponding wifi AP) is unused currently, but perhaps once I decide to upgrade my router's software and play with wpa_supplicant that will change.


But why did I do this? What did I gain? Well, for starters, it was really fun to use HE's Looking Glass to run a traceroute to my desktop...


Tracing the route to IPv6 node 2001:470:d82b:ffff::2 from 1 to 30 hops

  1     2 ms   <1 ms   <1 ms 2001:470:0:32::2 
  2    76 ms   75 ms   75 ms 2001:470:0:35::2 
  3   103 ms  103 ms  103 ms 2001:470:0:4b::2 
  4   103 ms  103 ms  103 ms 2001:470:0:8c::2 
  5   148 ms  148 ms  148 ms 2001:470:4:b2::1 
  6   234 ms  236 ms  238 ms 2001:470:d82b:ffff::1 
  7   234 ms  233 ms  233 ms 2001:470:d82b:ffff::2
... while it sits behind my IPv4 NAT router. And then my Vista computer, and then my laptop connected to the wifi. Then I got to go take a look at The KAME project and check out the dancing turtle. It turns out that Google's IPv6 site also has an animated logo.

But in the end, I can now access all of my computers from behind NAT, without actually using any NAT - at all. I could drop the IPv4 addresses from some computers and still retain access to them, full access. This may prove to be both a blessing and a curse, but given time, we'll see..

(And yes, I know I shouldn't be using ::1 for my routers, that'll change soon enough.)

February 21, 2008

Phil Windley
pjw
Phil Windley's Technometria
» Unmounting Time Machine Drives

Apple Logo

I love Time Machine. I've been in the habit of doing full disk backups, but that won't save me from accidentally deleting a file unless I notice before the full disk backup is made. With time machine I'm protected. I still do a full disk back up from time to time so that I have something to boot from and then restore from Time Machine on if my main drive goes belly up.

One thing I've noticed: most mornings when I close up my laptop and take it with me for the day, the Time Machine backup disk won't eject. I get the standard "this disk is in use and cannot be ejected" warning. I'm confident the only thing using the disk is Time Machine. It seems that Time Machine makes it hard to eject disks.

This wouldn't be so bad on a desktop, but on a laptop, it's a pain. I hate just unplugging and getting the red stop sign warning about damaging the disk. Maybe more my paranoia than anything, but I like to avoid it.

I've found that forcing an unmount after trying the regular eject always works:

sudo umount -f /Volume/Phil\ Backup

Obviously your volume name is probably different and no, I didn't forget the "n" in "umount". Note that name of my backup drive is "Phil Backup". Why it doesn't work before an eject, I'm not sure. Still, it avoids the warning.

To make this easier, I made an alias for it in my .bashrc file:

alias u="sudo umount -f /Volume/Phil\ Backup"

Now, just typing "u" at the command prompt (which I've almost always got ready) will unmount the disk. Anyone have a better solution or am I the only one dealing with this problem?

Tags: osx apple howto

February 7, 2008

=Utah Open Source=
Utah Open Source
The Utah Open Source Foundation
» Utah Open Source Conference 2008: Location, Theme and Dates

For those of you waiting with bated breath, wait no longer. The Utah Open Source Conference volunteers have been hard at work year preparing an even more awesome conference for 2008.

Because 2007 was such a grand success, we’ve made some minor changes and improvements to help with a smoother conference. This year’s conference is at a different location and we’ve added a full day on Thursday.

The Utah Open Source Conference 2008 will be held at the Salt Lake Community College, Redwood Road campus August 28 - 30, 2008.

This years theme is HOWTO. The concept is that within the technology, education, community and business tracks, there will be plenty to talk about.

  • HOWTOs will help others get started
  • HOWTOs will help families use open source together
  • HOWTOs will provide a stepping stone along the road to technology mastery
  • HOWTOs will let those that are masters get together and make the products better.

These are just a few of the many things that HOWTO theme will accomplish during the Utah Open Source Conference (UTOSC) 2008.

The Salt Lake Community College Computer Science department is excited to be a sponsor of the 2008 conference and will be using it to improve students’ awareness and understanding of open source software.

The Utah Open Source Foundation is also re-dedicating itself to ensure the pricing structure remains reasonable for those who’d like to come and are on a budget. The pricing structure right now is tentative, but no major increases in the fees are planned for attendees.

We currently have a tentative plan on our wiki, so feel free to have a look. If you have suggestions, please join the chat anytime in the #utos channel on irc.freenode.net or email clints at utos dot org with your comments.

Watch closely over the next week for the Call for Papers, updates on the basic schedule, and the Call for Volunteers among other exciting announcements, including our keynote speakers.

See you all in August.

Clint Savage
Founder, Utah Open Source Foundation

October 17, 2007

Phil Windley
pjw
Phil Windley's Technometria
» Fixing MacBook Pro Sleep Problems

Apple Logo

One of the things I loved about my Powerbook was that it slept--and woke--reliably. I would go weeks without rebooting my machine and I bragged about it often to the poor saps who had to use XP on their laptops. I haven't been singing the praises of OS X stability as loudly lately because ever since I went to the Mac Book Pro (MBP), my machine has had issues with sleeping and waking to the point that it probably got rebooted once a day.

Well, no more! I tried something a few weeks ago that has made my MBP into a machine I can love again. Here's what I did.

When Apple shipped the MBP, they changed how sleep works. What? Mess with perfection? Yup, that's what they did, although they had a reason (I'm not saying it's a good one). The old Powerbooks could tolerate a battery switch when they were asleep without losing state. The MBPs can't. If you put your MBP to sleep, switch batteries, and then wake it, you'll note you've see a whited-out screen and a progress bar at the bottom. The machine is waking from hibernation. If you pop a battery out of a sleeping MBP, it automatically hibernates.

In order support this automatic hibernation, the machine has to write the contents of RAM to disk every time it goes to sleep. This is called "SafeSleep" by Apple. I call it "SureDeath." That's why putting a MBP to sleep takes to long. For whatever reason, that process seemed to be causing problems for me. Maybe because I've frequently got almost 4Gb of RAM in use with virtual machines, and so on. Often my machine would refuse to sleep or never wake up once it got there.

Here's the good news: Apple left the old mode in the OS and you can activate it if you want. You can also switch back to SafeSleep anytime you like. According to this MacWorld article, OS X supports five different sleep modes:

  • 0 - Old style sleep mode, with RAM powered on while sleeping, safe sleep disabled, and super-fast wake.
  • 1 - Hibernation mode, with RAM contents written to disk, system totally shut down while "sleeping," and slower wake up, due to reading the contents of RAM off the hard drive.
  • 3 - The default mode on machines introduced since about fall 2005. RAM is powered on while sleeping, but RAM contents are also written to disk before sleeping. In the event of total power loss, the system enters hibernation mode automatically.
  • 5 - This is the same as mode 1, but it's for those using secure virtual memory (in System Preferences -> Security).
  • 7 - This is the same as mode 3, but it's for those using secure virtual memory.
From Macworld: Mac OS X Hints: Set newer portable Macs' sleep mode
Referenced Wed Oct 17 2007 09:58:31 GMT-0600 (MDT)

The first step is to check which mode you're in now. Use this command from the terminal:

pmset -g | grep hibernatemode

Make a note of which mode it is (probably 3) so that you can return to it if you want.

Now, set your MBP to use mode 0:

sudo pmset -a hibernatemode 0

That's it. I rebooted. Not sure it that's necessary, but what the heck.

Now, you may be wondering...if my MBP was writing memory out to disk, is that stored somewhere, taking up precious disk space? Yes! Here's how to recover it:

sudo rm /var/vm/sleepimage 

My sleep image was 4Gb since that's how much memory I have. Nice to have it back.

Now, a word of warning: if you change to sleep mode 0 on a MBP, you lose the ability to do a battery swap without plugging the machine in. I only do that occasionally, so I'm happy to forego the feature if my machine works more reliably every day.

As I said, I made this change two weeks ago and my machine has been as stable as my old Powerbook every since. I'm happy to have solved one of the annoyances of my computing life. As always...YMMV.

Update: Bryan Morse made me aware of this Tidbits article that contains a script you can run as a cron job that will put you in hibernate mode when your battery gets low. Some people have reported that occasionally OS X will switch the mode back to 3 so you have to check to make sure you're still in 0 (and delete the sleepimage file). This script does that as well.

Tags: howto osx

September 21, 2007

Phil Windley
pjw
Phil Windley's Technometria
» Installing Rails on Fedora

I'm building a virtual machine (VMWare flavor) for use with Rails development. After installing Fedora, there were a few things I had to do to get everything ready. I thought I'd take a minute and document them in one play for the next poor soul.

First, I don't know what I do wrong, but the GUI auto-update feature seems more trouble than it's worth. I like doing it manually. So the first thing to do is:

sudo /usr/bin/yum -y update

I've found that the Yum system can get corrupted and hang (I think I do this by force quitting the auto-update tool). Alternantely, you might see a bunch of errors. To fix that, I do the following:

sudo rm -f /var/lib/rpm/__db.*
sudo rpm --rebuilddb

Next, I install or update some other tools:

sudo /usr/bin/yum -y install \
sudo \
wget \
tar \
gzip \
make \
gcc \
mysql \
mysql-devel \
mysql-server \
ruby \
ruby-libs \
ruby-mode \
ruby-rdoc \
ruby-irb \
ruby-ri \
ruby-docs \
ruby-devel \
ruby-mysql \
rubygems \
subversion \
lighttpd \
lighttpd-fastcgi \
httpd \
ImageMagick \ 
ImageMagick-devel

Now, we're ready to install rails and some other gems:

sudo gem install rails --include-dependencies
sudo gem install rmagick

If gem complains about "Could not find rails..." you need to reset the gem cache. The correct path can be found using the command gem env.

sudo rm -rf /usr/lib/ruby/gems/1.8/source_cache
sudo gem update

If you're going to use MySQL, be sure to set it to start up and set a root password:

sudo /sbin/chkconfig mysqld on

/usr/bin/mysqladmin -u root password 'new-password'
/usr/bin/mysqladmin -u root -h localhost.localdomain password 'new-password'

If you're going to use FastCGI with LightTPD, then you'll need to install the FastCGI code:

curl -O http://www.fastcgi.com/dist/fcgi-2.4.0.tar.gz
tar xzvf fcgi-2.4.0.tar.gz
cd fcgi-2.4.0
./configure --prefix=/usr/local
make
sudo make install
cd ..

And the Ruby FastCGI support:

curl -O http://rubyforge.iasi.roedu.net/files/fcgi/ruby-fcgi-0.8.7.tar.gz
tar xzvf ruby-fcgi-0.8.7.tar.gz
cd ruby-fcgi-0.8.7
ruby install.rb config --prefix=/usr/local
ruby install.rb setup
sudo ruby install.rb install
cd ..

And the fcgi gem:

sudo gem install fcgi

I also need RMagick (the Ruby ImageMagick package) installed. Notice that I installed ImageMagick in the yum command above. To install RMagick, I used the gem install:

sudo gem install rmagick

Note that the ImageMagick install I got from yum had been built with the configuration option for TrueType fonts, so it was looking for those and failing. You can see what fonts your installation is looking for using the convert command:

convert -list type

You'll see path information for the configuration files as well as the various fonts each type file is loading. I changed my type-windows.xml file to look like this:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE typemap [
  <!ELEMENT typemap (type+)>
  <!ELEMENT type (#PCDATA)>
  <!ELEMENT include (#PCDATA)>
  <!ATTLIST type name CDATA #REQUIRED>
  <!ATTLIST type fullname CDATA #IMPLIED>
  <!ATTLIST type family CDATA #IMPLIED>
  <!ATTLIST type foundry CDATA #IMPLIED>
  <!ATTLIST type weight CDATA #IMPLIED>
  <!ATTLIST type style CDATA #IMPLIED>
  <!ATTLIST type stretch CDATA #IMPLIED>
  <!ATTLIST type format CDATA #IMPLIED>
  <!ATTLIST type metrics CDATA #IMPLIED>
  <!ATTLIST type glyphs CDATA #REQUIRED>
  <!ATTLIST type version CDATA #IMPLIED>
  <!ATTLIST include file CDATA #REQUIRED>
]>
<typemap>
</typemap>

This did the job, but beware that it may break other things you want to use ImageMagick for. I just know it worked for what I wanted to do.

Finally there are a few small jobs.

  • Add /usr/local/lib to /etc/ld.so.conf and run /sbin/ldconfig.
  • Add a alias for root to /etc/aliases. Don't forget to run newaliases.
  • Set up hostname. I like to edit /etc/sysconfig/network directly, but that's OS specific.
  • Set up any users. Be sure to set passwords.
  • Run chkconfig --list |more and turn off anything you don't need. I usually turn off bluetooth, cups, and yum-updatesd for starters. Turn on anything you do (like mysqld).
  • Set up /etc/sudoers. I can't tell you what to do since that's specific to what you are setting up. The simplest configuration is to use set it up so that anyone in group wheel can be a sudoer. Then add the wheel group to each user who should be able to sudo.

At this point, I'm unsure that the FastCGI is working completely with LightTPD. I'll add more information if something changes.

Tags: linux howto rails ruby

January 23, 2007

=OALUG=
OALUG
» Jan 17, 2007 Meeting Report: Part 1

For the meeting on the 17th Kevin Carter talked about the installation and configuration of Apache and PHP from source. What follows is a detailed howto from that meeting. First off though is some links that were presented in the meeting.

VirtualBox goesopen source http://virtualbox.org/
Linux Kernel in a Nutshell book available for free download http://www.kroah.com/lkn/
Description of Linux filesystem hierarchy http://www.pathname.com/fhs/

Now onto the howto….

LAMP stands for Linux, Apache, MySQL, and PHP/Python/Perl. A couple of easy ways to get a LAMP server running is the SLAMPP LiveCD or Ubuntu Server. Those are good if you are ok running the default configurations. I am a web developer and I have a need to have things running with special configurations. So instead of using apt-get or yum or whatever package manager to install 20 packages to get the functionality I desire, I would rather just install them from source. So in this article I will talk about configuring and installing Apache and PHP. In the future I may go over MySQL as well.

To get started I am using Ubuntu 6.06 as the base. But this will work with any linux if you have the prerequisites. For starters Ubuntu does not come with the tool necessary to compile software. The easiest way to get these is to do

sudo apt-get install gcc g++ make flex

PHP will also require you to have libxml2 installed you can do this manually or with apt. The package you need with apt is libxml2-dev. That gets you the necessary header files that PHP uses to compile XML support. Also if you want MySQL integrated with this you will need to have it pre-installed. The Ubuntu packages are mysql-server and libmysqlclient15-dev.

OK now we have some of the dependencies out of the way. If your unsure how to compile for source please read this.

Lets start with apache. You can obtain the Apache server from here. This guide will go over version 2.0 but 2.2 should work just as well. The standard ./configure, make, make install will get you the default instillation of apache. This means that it will put everything under /usr/local/apache2 The folder it contains are as follows.


bin –Where the binaries are
build –Tools for build modules
cgi-bin –Location of PERL CGI scripts
conf –The conf files
error –Pages that are displayed when an error happens. eg 404
htdocs –Where all your website files go
icons –Icons used by apache when it create directory listing pages
include –Apache's header files
lib –Library files
logs –Where it keeps its logs
man –The manual pages
manual –The apache 2.0 manual
modules –where any modules are kept

Now I don’t like this layout. I think that your site files should be kept in either /var or /srv and the conf files should be in /etc and the logs should be in /var/log

One way to get a better layout is by some configure flags.

./configure --prefix=/usr/local/apache --datadir=/srv/www –sysconfdir=/etc/httpd --mandir=/usr/local/man

This is good but you would still have to move the location of the log files in the httpd.conf file. Apache makes use of a file called config.layout This file contains several layout variations to choose from or you could create your own. If you wanted you could also choose a layout that is close to what you want and then use some other flags to make a few changes. I figure if I’m going to compile Apache every time a new version comes out I might as well just write a layout out for myself. My layout looks as follows.


<Layout Kevin>
   prefix: /usr/local/apache
   exec_prefix: ${prefix}
   bindir: ${exec_prefix}/bin
   sbindir: ${exec_prefix}/bin
   libdir: ${exec_prefix}/lib
   libexecdir: ${exec_prefix}/modules
   mandir: /usr/local/man
   sysconfdir: /etc/httpd
   datadir: /srv/www
   installbuilddir: ${datadir}/build
   errordir: ${datadir}/error
   iconsdir: ${datadir}/icons
   htdocsdir: ${datadir}/htdocs
   manualdir: ${datadir}/manual
   cgidir: ${datadir}/cgi-bin
   includedir: ${prefix}/include
   localstatedir: /var/log
   runtimedir: /var/run
   logfiledir: ${localstatedir}/apache
   proxycachedir: ${localstatedir}/proxy
</Layout>

The choice is really up to you on where you put everything. Thats the great part about compiling from source. To use a layout you would use the flag –enable-layout=[NAME]

One last note before I finish up talking about configuration, Apache has a few different MPMs (Multi-Processing Modules). These control the way in which Apache handles its connections. You can read about the different ones here. But PHP says that it runs its best with the prefork MPM. So to enable this we use –with-mpm=prefork

At this point you should have decided what configure flags you would like to use. There are other that I haven’t talked about that you may want, read the provided documentation to see if there is anything else you want. And then we can do the make and make install to install Apache.

Configuration

Now I will talk about some settings in the httpd.conf and setting up things like log rotation and init scripts.

In the httpd.conf file is where you set your various configuration on how apache should run. The default should be fine but if you want to make some changes you can. Some config options of note are:


Listen 80 --This sets the port on which Apache operates. Another popular choice is 8080
User/Group --You can set the user and group Apache runs as with the User and Group options, by default its User nobody and Group -1
ServerAdmin --This is the email address that will be shown when errors are generated.
DocumentRoot sets the path to the website files. “/srv/www/html” in my setup, “/usr/local/apache2/htdocs” in the defaul setup.
ServerTokens and ServerSignature specify how much in will be given out about Apache. Such things as what version Apache is and what modules you are running.

The other configuration options are well documented in the httpd.conf file so give it a read if your curious about other things.

So now you have Apache installed how do you start it? As root run “apachectl start” depending on where you put the apache bin files this may or may not be in your path. apachectl takes the following commands: start,stop,restart,graceful,startssl,and configtest. This is nice but we want to have Apache start itself when the system starts. For this we use an init script. Depending on what Linux systemyou use, your init scripts may be different. But Ubuntu 6.06 uses the SysV init style. The apachectl program is made to act like a init script, so you can like directly to it for your init. So in /etc/init.d create a link to the apachectl program.


cd /etc/init.d
ln -s /usr/local/apache/bin/apachectl httpd

Then put the link to start it on system bot in the proper runlevel folder. By default Ubuntu boots to runlevel 2.


cd /etc/rc2.d
ln -s ../init.d/httpd S80httpd

Change the number depending on when in the sequence you want it to start. Also add a link in the rc0.d and rc6.d folders with a K instead of an S to stop Apache on system shutdowns and reboots.

Finally for Apache we’ll talk about log rotation. There are two ways to do log rotation with Apache. The first is the rotatelog script that comes with Apache. To use it you put something like the following in your httpd.conf file.

TransferLog “| /path/to/rotatelogs logfile rotation_time_in_seconds”

The other option is to use logrotate. Logrotate is a fairly common system utility designed to handle the log rotation for many program. It is run once a day by cron. To use it all you have to do is drop a config file for the logs you want to rotate into /etc/logrotate.d An example config is as follows


/var/log/apache/access_log {
   missingok
   compress
   rotate 5
   #mail webmaster@yourdomain.com
   size 10M

   postrotate
      /bin/kill -HUP `cat /var/run/httpd.pid 2>/dev/null` 2> /dev/null || true
   endscript
}

The script says to take the log file found at /var/log/apache/access_log.
missingok says if its not there don’t issue an error.
compress compresses the old files using gzip
rotate 5 says to rotate the logs 5 time before deleting. So you end up with access_log,access_log.1,access_log.2,etc
mail email@address makes it so logrotate will email you the log files instead of deleting them
size 10M will cause the log to be rotated only when it has become larger than 10 megs
And that part after postrotate causes Apache to restart so it will start writing to a new log file.

Read the man page for logrotate to see some more of its options.

Thats it for Apache. Stay tuned for part 2 where I’ll go over the installation of PHP.

» Installing software from source

Installing software from source is a fairly simply process once you learn the proper commands. Most software is compiled with a simple

./configure
make
make install

Only the last one needs to be run as root (provided your installing it in the normal system location). A lot of sofware can take flags on the

./configure
command to change the way the software is configured. A standard one is
--prefix=[PATH]
to change the location the software is installed into. To find out what flags are available for a particular piece of software you can run
./configure --help
Also always read the INSATLL and README files that come with the software and any documentation that is available.