Tim Habersack

Where I put my things..

Installing/upgrading Firefox in a Linux environment

Oct 27th 2011

This is pretty simple, but I wanted to write up how to install/upgrade Firefox manually, in a Linux environment.

First thing that was tricky is, where is the "proper" place to install it? There is much debate on this point still, but I believe that installing to the /opt directory seems to make the most sense.

So we've downloaded the Firefox version we want to install:

[text]firefox-7.0.1.tar.bz2[/text]

It is sitting in a directory:

[text]/home/tim/downloads/[/text]

I open up a terminal and type:

[text]sudo tar -jxvf /home/tim/downloads/firefox-7.0.1.tar.bz2 -C /opt/[/text]

What is this command? Let's break it down:

  • sudo - "The following commands we are going to run as super user", necessary for putting things in the opt directory.
  • tar -jxvf - The tar program is what can compress and uncompress archives. We are using the options jxvf
    • j - the compression method that was used is bzip2
    • x - We are going to be extracting the archive.
    • v - We want the output to be verbose, so we'll see every file extracted.
    • f - We are going to tell it the file to extract.
  • /home/tim/downloads/firefox-7.0.1.tar.bz2 - The full path to the Firefox archive we are going to be installing.
  • -C /opt/ - We want to specify the directory /opt/ as where it is going to be extracted to.

Then, bam Firefox should be extracted to the /opt/firefox directory. Then what do we need to do? Well, depending on your Linux distribution, you need to add a shortcut to that to your menu somewhere, so it's easy to get to. The program the shortcut should point to is:

[text]/opt/firefox/firefox[/text]

UPGRADE: For upgrading your Firefox install you have in the /opt/ dir, you do the exact same thing. :)

Now I don't have to spend the 1 min remembering how to do this every time a new version of Firefox comes out. Hope it helps others.

Handling the URI structure change when moving to new CMS

Oct 25th 2011

I recently worked on an internal project that replaced a current web app. The new one had a cms behind it, and was overall a better product. So, we made it live, and moved the old tool. And all heck broke loose, since staff had bookmarks pointing to the old location all over the place.

Here is an example of the old link structure:

http://example.com/sub_dir/filename.html

The new link to the same content:

http://example.com/sub_dir/view.php?doc=filename

Now, sure I could try searching and replacing everywhere those links could live, but that sounds like a disaster. Instead I leveraged the mighty power of the mod rewrite in Apache.

I created a .htaccess file in the subdir/ directory. Then I added: [text] ReWriteEngine on RewriteBase /subdir RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*).html view.php?doc=$1 [/text]

1) We are turning on the rewrite engine. 2) setting the base directory as sub_dir. 3) Saying "If the requested file is not found..". 4) "Grab the text before the .html, and put it where the $1 is".

And bam! All those old links, when hit, point to the correct page. I thought this would be much harder than it was. I'm trying to tag the heck out of this post, so if others are looking to do the same thing, it is here for them.

Web Developers and Academics

Oct 20th 2011

I had a thought earlier: There is a comparison to be made between web developers documenting their progress of personal projects online, and academic types (scientists, researchers, etc) publishing papers.

Both groups have to keep publishing, else their respective fields will see them as not current or dedicated.

What appears to be a sweet payment system

Oct 19th 2011

I am sure people already know all about this service, but I didn't so I thought I'd share. Stripe is a payment system for web apps, where everything lives on their servers, you don't need to store any sensitive info yourself. That is very appealing to me. Also, their API looks really straightforward.

The cost is reasonable as well. 2.9% of the transaction, plus 30 cents.

Soon, I hope to have a reason to build their services into a web app. :)

I don't control all the communication

Oct 12th 2011

Does this ever happen to you? You get an email or text from someone you haven't heard from in a while, with a message of, "Hope all is well, haven't heard from you in a while." Or something similar. What is even worse are the ones you hear it through others, where someone says, "Bob Balaw wanted me to tell you he misses you."

The older I get, the more this irks me. My main gripe with it is this: Communication goes both ways. It isn't my responsibility to always initiate communication. If someone misses you, why don't they contact you? At least with something more than a, "haven't heard from you in a while". Because that means that I haven't heard from them in a while too. But the implication I see there is that it is my responsibility to contact them, and I haven't. Which really, if you think about it, is manipulative. Some emotional blackmail, that. Especially if they use a parent or someone you really care about to convey the message.

I guess my point is this: if you want to talk to someone, or miss someone, initiate communication! Don't send guilt-laden messages.

This post is in no way is a result of recent life events. :)

I don't like it.

Sep 27th 2011

I'm looking at my blog, and I am totally uninspired to write.

I look at my blog circa 2004 and I totally want to write on that! Why is that?

I miss the old internet. There was less concern with slick-looking pages, and more excitement about just getting content up there. Part of it is too, it reminds me of my excitement I had back then for my blog.

I'm redesigning my site to make it look like my old Movable Type site. Maybe then I will post more. And I don't care that it won't look slick, this blog is primarily for me, after all.

Voltaire introducing me to some new words, ideas.

Sep 23rd 2011

I've been reading selections of Voltaire's work. Namely, a group of short essays, jots (dare we say blogposts) called 'Selections'. It's been good for me, I feel like my mind is getting a little more active. My plan to read more is paying off.

I'm stumbling across all sorts of wonderful words, and rabbit trails to new things to research. I'll be sharing them as I go along. Here are a couple new words:

  • Voluptuary: n - a person whose life is devoted to the pursuit and enjoyment of luxury and sensual pleasure.
    • This reminded me of San Francisco. I know people in SF who aren't like this, but it seems like the majority of people there are.
  • Calumniate: v - to make false and malicious statements about; slander.
  • Manichaeism: n - the system of religious doctrines, including elements of Gnosticism, Zoroastrianism, Christianity, Buddhism, etc, taught by the Persian prophet Mani about the 3rd century ad . It was based on a supposed primordial conflict between light and darkness or goodness and evil. (See also the wikipedia article)

Actual Nickelpinch news!

Aug 21st 2011

Link first, to the project on github.

So, I spent time this weekend working a little on Nickelpinch. Saturday, I haunted the Lafayette Library's halls and coded away, and have a pretty good finished product for what the new database structure will be like. See the model in PDF.

Then last night and today I worked with jQuery Mobile to start on the mockups of the new interface, optimized for mobile/tablets.

  1. Start here
  2. The starting page. click login at the top left
  3. The login page! just click submit
  4. The overview page. You are viewing a users info, they have four categories (rent, food, fun, utilities) Click on any to open the details of the category. It will show the Reserve (how much they've allocated to that category), Tally (how much they've spent so far this month in that category), and Limit (The limit of how much they want to spend on that category). The color coding should be mostly self-explanatory. Then click add, on the bottom left
  5. The Add Entry page. It's where you'll be able to add a new purchase. I believe it's pretty user friendly, though it needs a date picker.
  6. End of tour

Holy moly is it cool!

I'm totally wiped right now, otherwise I'd write more.

Date-storing tests in MySQL; Part 2

Aug 19th 2011

The results are in. First, there was a little thing I forgot about when describing the test to you earlier. Namely, storage size. The amount of storage required is also another thing to think about.

The relevant sizes of MySQL data types:

  • DATE: 3 bytes
  • INT: 4 bytes

Looking at my 3 ideas, one should be thrown out right away. Having three integers, even reducing them to 2 TINYINT's (1 byte) and 1 SMALLINT (2 bytes), we are still talking 4 bytes, and thats with a lot of extra complexity. So that was out.

I generated a dataset with a little over 7 million rows, with data looking like:

[sourcecode language="sql"] mysql> SELECT * FROM crunchme LIMIT 10; +------------+------------+----------+--------+---------+-------+ | idcrunchme | adate | timdate | ayear | amonth | a_day | +------------+------------+----------+--------+---------+-------+ | 12111 | 2009-01-01 | 20090101 | 2009 | 1 | 1 | | 12112 | 2011-03-03 | 20110303 | 2011 | 3 | 3 | | 12113 | 2008-11-19 | 20081119 | 2008 | 11 | 19 | | 12114 | 2009-07-16 | 20090716 | 2009 | 7 | 16 | | 12115 | 2008-10-19 | 20081019 | 2008 | 10 | 19 | | 12116 | 2009-04-22 | 20090422 | 2009 | 4 | 22 | | 12117 | 2009-04-03 | 20090403 | 2009 | 4 | 3 | | 12118 | 2011-06-10 | 20110610 | 2011 | 6 | 10 | | 12119 | 2009-06-01 | 20090601 | 2009 | 6 | 1 | | 12120 | 2008-08-24 | 20080824 | 2008 | 8 | 24 | +------------+------------+----------+--------+---------+-------+ [/sourcecode]

Let's see what happens when we run some queries!

[sourcecode language="sql"] mysql>SELECT SQLNOCACHE count(idcrunchme) FROM crunchme WHERE timdate >= 20100101 AND timdate <= 20110514;

+-------------------+ | count(idcrunchme) | +-------------------+ | 2388242 | +-------------------+ 1 row in set (2.96 sec)

mysql>SELECT SQLNOCACHE count(idcrunchme) FROM crunchme WHERE adate >= '2010-01-01' AND adate<='2011-05-14'; +-------------------+ | count(idcrunchme) | +-------------------+ | 2388242 | +-------------------+ 1 row in set (3.61 sec) [/sourcecode]

So, the integer solution is faster, by roughly 22% at this level. However, here is where it gets fun. It is larger, by one byte. Also, it will mean having to add extra code when I'm working with dates in my CodeIgniter app.

After all this, I am going to go with the MySQL DATE type. I was surprised to see the time difference being so low.

I hope this helps someone else out!

Date-storing tests in MySQL; Part 1

Aug 19th 2011

Data, what fun it is!

My issue is this, I'm working on a web app, which uses CodeIgniter, with a MySQL DB. My question was, since all I am storing for a date time is the year, month and day, what is the best way to do this? I'm going to be making a lot of queries like "select all entries from user bob from March to May of this year".

As I see it, there are several options:

  1. Use the DATE data type in MySQL, which stores as "YYYY-MM-DD".
  2. Generate 3 attributes, each an integer, one "year", one "month", and one "day".
  3. My new idea, to store it as an integer, in a "YYYYMMDD" format. It will allow for decent queries, since the hierarchy of time still works. (May still comes before March, 20110301 < 20110501).
  4. Use the time function in php, which returns the number of seconds since 1970. A lot of people go this route, but I think it's crap because in 2038 it will restart, causing issues . Y2K38 people! I'm going to pretend you didn't even bring this up.

I'm writing a script that will generate about 10.000.000 rows of data, each with every date recording option I mentioned above, then I will make some pretty bar graphs and we shall see what we shall see.

My guestimate is that my integer idea ("YYYYMMDD") will be the fastest, but let's see.

< Older Newer >