Amazon.com Widgets

Archive for 2006

How to Setup a USB drive to boot

by Greg on Dec.16, 2006, under PC Repair

There’s lots of reasons to boot to a USB drive, but mainly I am interested in booting to a Pen/Key/Jump drive for utility purposes. Like making drive images, partition resizing, or other system maintenance.

One of the main problems I am running into these days, as a service technician, is I can’t see the drives or CD drives on the newer systems running SATA RAID controllers. Nor do I have floppy’s. Heck, I tried booting to a CD with my utilities, and it wouldn’t load the ASPI drivers for the CDRom or allow me to use a keyboard! Makes it difficult to do any system level work.

I had to do it. I had to figure out how to maintain these systems. Had to make a bootable USB drive.

Here’s how you make it. Easy…

1. Boot to a floppy or CD (on a different system possibly) where you can run PQMagic and DOS tools.

2. Make sure you see the key drive. Must be FAT.

3. Run: sys c: (or whatever the key drive is)

4. cd to the key drive, run: fdisk /mbr

5. run PQMagic, and set that FAT partition as Active. (I was not able to do that with FDisk, but if you removed the hard drives, so it looked like it was the primary drive, then that should work. Fdisk will only work if the drive is the primary drive.)

6. Don’t forget to set your boot priority on the BIOS. On one system, it just recognized it as a hard drive and I set that drive as first, on another it had to be set to boot to USB specifically.

Now you’ve got a bootable usb key drive. Just like setting up a DOS/Win98 drive anyway. After all that, I setup all my autoexec.bat info and menu’s to setup ramdrive’s and quickly boot into diag tools or imaging software.

This is really handy now! These new computers are setup so differently than the old style. After doing this, I had usb keyboard and mouse, and access to usb drives from my imaging software.

Next, I’d like to setup a Linux bootable pen drive with some of the great utilities available on Linux.

Leave a Comment more...

Unable to print on server shared printer with event id 6161

by Greg on Dec.11, 2006, under Networking, Printers, Windows XP

I was using a Jetdirect print server (parallel) to an HP 960c printer.  I got Event ID 6161 when printing with a  non-admin user and the spooled docuements said Error.  The fix was to set the Jetdirect TCP/IP port on the  server as the IP address of the Jetdirect, NOT THE HOSTNAME.

Also, quick check, give full control to c:\windows\system32\spool directory.

Leave a Comment more...

Remote ssh rsync linux backups with certificates and no passwords

by Greg on Oct.25, 2006, under Backup, Linux, Scripting, Security

Uber quick howto:  (based on Debian)
1. Make sure ssh, rsync and sudo are installed and working.
2. Add a user account,  on remote system.
2.a Add a certificate with openssl or ssh-keygen (look that up elsewhere)
2.b Make sure the cert is unencrypted with no password. Yes,  that is a slight security concern, HOWEVER, if you are very careful to secure that private key, you are ok.  In other words, don’t share it or let it out!
2.c Add your public key to your new users /home/username/.ssh/authorized_keys file.  (how to’s for this stuff are on the web)
2.d Test this user’s login and make sure it logs you in from your local machine.
3.  Now, this new user is unprivileged, so you need to use sudo for running the remote rsync command.  Add this to your remote machine /etc/sudoers file:

 nameofnewuser	remotemachinename=NOPASSWD:/usr/bin/rsync

Above, you replace with the appropriate names.

4. Copy your private key from the remote machine and save it on the local machine where you will be backing up to.  For example, save it in the local user’s .ssh directory.  /home/localuseraccount/.ssh/private.key

5. You need to create a script.  In the example below, I have an exclude.txt file also, so I can exclude directories and files.  Look that up in the rsync how-to’s.

#!/bin/bash
rsync -avz --rsync-path="sudo /usr/bin/rsync" 	

	--exclude-from=exclude.txt -e

 	"ssh -p 22 -i /home/localuseraccount/.ssh/private.key"

  	remoteuseraccount@remote.server.com:/ /backup/to/path

In case you didn’t catch that, the section above with the rsync command is all one line!

Leave a Comment more...

Debian apt error mmap ran out of room

by Greg on Oct.25, 2006, under Linux

I spent quite a while searching for solutions to this issue:

Reading Package Lists... Error!

E: Dynamic MMap ran out of room

I found several posts and sites that mention updating the cache limit, but that did not work. Here’s what I found though.

First, create the file if it does not exist.
/etc/apt/apt.conf

Then, add this:

APT::Default-Release "stable"; 

APT::Cache-Limit "141943904";

And that did the trick!  You can probably find this lots of places, but it took me too long to find the right fix, so I saved this here for myself!

Have a great day!

1 Comment more...

How to set Do not Display Last User Name and No Shutdown

by Greg on May.11, 2006, under Networking, Registry, Windows Server, Windows XP

This used to drive me nuts. Go to Group Policy, set the Last Username display setting to enabled, and you still see the username at logon. What? Most sites you find when searching for this will tell you to adjust the policy (group or local). OR, they will tell you to remove the DefaultUserName in the registry. For some reason, these do not always work, and I haven’t figured out why. (particularly on a domain controller.)

Anyway, here’s the trick. Keep in mind, that this will disable the last logged on user at ALL logon prompts, terminal (RDP) logons and local console logons.

To make sure that the last username does not show at logon screen go here:

HKLM\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon

In there, make sure there is a value for:

DontDisplayLastUserName

It should be a REG_SZ type: String value. So, if it’s not there, add it, and make the value = 1

That’s it.

BIG NOTE: I have not tested this on a domain controller yet. But I think this will do it. It works great on 2000 Server (non-DC) and on XP Pro.

Hive: HKEY_CURRENT_USER
Key: Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
Name: NoClose
Type: REG_DWORD
Value: 1

This will disable the Shutdown command on the start menu.

On the shutdown registry hack above/below, put it in HKLM to affect the whole server/dc/workstation.

Leave a Comment more...

Setup virtual users and domains on Courier (Debian package)

by Greg on Apr.02, 2006, under Linux

Courier Virtual Email Hosting – No SQL Servers

Using USERDB

  1. Add the domain(s)
    Add your domain name to esmtpacceptmailfor.dir/default
    Add your domain name to hosteddomains/default
    Then create the courier system files, run:

      makeacceptmailfor
      makehosteddomains

  2. Add the users
    You run 2 commands to add a user. (same user/pw for smtp also)
    userdb and userdbpw

    Let’s say we want to add a user account for misc@1stbyte.com.

    1st create the virtual account home dirs. I save mine in /home/virtual. You will create a sub dir for each domain, then user. And you must create the Maildir folders in this home folder. So it will look like this:
    /home/virtual/domain.com/user
    Run:
    mkdir /home/virtual/1stbyte.com/misc
    maildirmake /home/virtual/1stbyte.com/misc/Maildir
    chown -Rv 999.999 /home/virtual/1stbyte.com/misc
    userdb misc@1stbyte.com set uid=999 gid=999 home=/homevirtual/1stbyte.com/misc
    userdbpw | userdb misc@1stbyte.com set systempw

    userdbpw will ask for a password and pipe into the “set systempw” command and save it into the userdb database. You can see the data in /etc/courier/userdb.

    When you are done run: makeuserdb

  3. Setup any aliases

    if you have any aliases, set them in aliases/system. Edit the file and add full email account names like:
    vuser@domain.com: mailaccount@domian.com

    It’s alias: realaccount.
    The can be other domains too:
    fakeuser@accptedmaildomain.com: realaccount@realhosteddomain.com
    info@1stbyte.com: misc@1stbyte.com

    And of course, run: makealiases

Leave a Comment more...

Compile Apache 2 with PHP 4 and MySQL 5 (while MySQL 4 is also installed)

by Greg on Apr.02, 2006, under Databases, Linux

Download and unpack Apache and PHP. MySQL 5 is install already. (as per another blog: http://www.1stbyte.com/2006/04/02/mysql-5-upgrade-compiled/

Make sure you have the proper dev packages. In my case I had to install ‘libflex’ and ‘libgdbm-dev’ using apt-get install to install PHP. (I have Debian Unstable)

./configure –prefix=/var/httpd –enable-so –enable-proxy –enable-proxy-ftp –enable-proxy-http –enable-ssl –enable-headers –enable-rewrite –enable-cgi –enable-deflate –enable-mime-magic –enable-dav –enable-dav-fs –enable-userdir –enable-status –enable-info

make && make install

then I copied the original Apache conf from /etc/apache2 to the new root, /var/httpd/conf. I also had to update the httpd.conf file to set the correct server root and other misc server directives, but mostly they were all the same.

Test your install /var/httpd/bin/apachectl start
Goto http://localhost and make sure you get the web site.

Now install PHP.
./configure –with-apxs2=/var/httpd/bin/apxs –with-mysql=/var/mysql5010 –with-mysql-sock=/tmp/mysql5.sock –prefix=/var/httpd/php –with-config-file-path=/var/httpd/php –enable-force-cgi-redirect –disable-cgi –with-zlib –with-gettext –with-gdbm

make
cp -p .libs/libphp4.so /var/httpd/modules
cp -p php.ini-recommended /var/httpd/php/php.ini

I then put these into httpd.conf

<IfModule mod_php4.c>
AddType application/x-httpd-php .php .phtml .php3
AddType application/x-httpd-php-source .phps
</IfModule>
LoadModule php4_module modules/libphp4.so

then ran:
make install

Edit: 10/25/05

Additional new notes:

When configure is run, I do it this way now:

./configure –prefix=/var/httpd –enable-so –enable-proxy –enable-proxy-ftp –enable-proxy-http –enable-ssl –enable-headers –enable-rewrite –enable-cgi –enable-deflate –enable-mime-magic –enable-dav –enable-dav-fs –enable-userdir –enable-status –enable-info –enable-cache –enable-disk-cache –enable-mem-cache

And…

For setup with Zope I am running ProxyPass instead of Rewrites:

ProxyRequests On ProxyPass / http://127.0.0.1:18080/VirtualHostBase/http/www.adomain.com:80/clients/adomain_com/VirtualHostRoot/ ProxyPassReverse / http://127.0.0.1:18080/VirtualHostBase/http/www.adomain.com:80/clients/adomain_com/VirtualHostRoot/ ProxyRequests On ProxyPass / http://127.0.0.1:18080/VirtualHostBase/http/domain.1stbyte.org:80/clients/domain_com/VirtualHostRoot/ ProxyPassReverse / http://127.0.0.1:18080/VirtualHostBase/http/domain.1stbyte.org:80/clients/domain_com/VirtualHostRoot/

When you add the PHP config, you need to first add flex.

apt-get install flex

Also, the httpd.conf additons are partially done in the mods-enabled folder for php.conf.

1 Comment more...

Make dynamic amount of columns with PHP

by Greg on Apr.02, 2006, under PHP, Programming

Below is a demonstration of how I created variable amount of columns in a table listing.  In this example I was creating a picture gallery and using template files, so you can see even more than the dynamic columns, but anyway…

The only bit of important info here are these two snippets of code:

//Every x iteration based on GALLERYLISTCOLS, when 0, start new row

if (($c % GALLERYLISTCOLS)==0) {

$sdelim = $gll_startdelim;

} else {

$sdelim = ‘ ‘;

}

//Now, when x iteration is x – 1, then end the row (GALLERYLISTCOLS – 1)

if (($c % GALLERYLISTCOLS)==(GALLERYLISTCOLS – 1)) {

$edelim = $gll_enddelim;

} else {

$edelim = ‘ ‘;

}

It is using the modulus operator.  And when we reach every x amount of columns, specified by GALLERYLISTCOLS global var, we make the $sdelim and/or the $edelim = the template row delimiters. (<tr> or </tr>) This makes the new row.  If we set GALLERYLISTCOLS = 4, then we make 4 columns.

There are a lot of variable coming from external sources, so you’ll have to figure it out from there, but at least you can get the idea.  (and more importantly, I can view this and remember how the hell I did it!)

—————————————

$gll_start= readFromFile(TEMPLATEDIR.’/gll_start.tpl’);

$gll_startdelim= readFromFile(TEMPLATEDIR.’/gll_startdelim.tpl’);

$gll_item= readFromFile(TEMPLATEDIR.’/gll_item.tpl’);

$gll_enddelim= readFromFile(TEMPLATEDIR.’/gll_enddelim.tpl’);

$gll_end= readFromFile(TEMPLATEDIR.’/gll_end.tpl’);

//////////////////////////////////

///  Show the main gallery

$gallinks = “”;

$webgallery=WEBGALLERY;

$webgallerythumbs=WEBGALLERYTHUMBS;

require_once ‘DB.php’;

$db =& DB::connect(“sqlite:///$sdb”);

if (DB::isError($db)) {

die($db->toString());

}

$sql = “SELECT imgid, imgname,imgthumb,imgcategory,category,imgcomment FROM vw_gallery where category = ‘$gallery’”;

$res = $db->query($sql);

if (PEAR::isError($res)) {

die($res->getMessage());

} else {

$c = 0;

$rc = $res->numRows();

$parsedresult = ”;

while ($res->fetchInto($row)) {

$imgid = $row['0'];

$imgname = $row['1'];

$imgthumb = $row['2'];

$imgcomment = $row['5'];

$imgcomment = str_replace(‘\\”‘, ‘”‘, $imgcomment);

$imgcomment = str_replace(“\\’”, “‘”, $imgcomment);

$thispage = “$me?imgid=$imgid”;

/*

Here we want every x amount of iterations.

Ex. If GALLERYLISTCOLS = 3, then every third item.

$c is the current iteration of records. 1,2,3,4,…

So, when the modulus of $c and 3 is equal to 0, then

we have a group of three and should start a new row.

Modulus meaning, 3 goes into $c with x left over.

If current rowcount is 17, then 3 mod 17 = 5 with 2 left over.

Soon as we hit 18, 3 goes into it 6 times, with 0 left over,

making it another group of three.

To get start of col amount we to (($c % GALLERYLISTCOLS) == 0).

To get the end of the col we need one less than GALLERYLISTCOLS.

And we have (($c % GALLERYLISTCOLS) == (GALLERYLISTCOLS – 1)).

(the max leftover, else it would be 0)

*/

//Every x iteration based on GALLERYLISTCOLS, when 0, start new row

if (($c % GALLERYLISTCOLS)==0) {

$sdelim = $gll_startdelim;

} else {

$sdelim = ‘ ‘;

}

//Now, when x iteration is x – 1, then end the row (GALLERYLISTCOLS – 1)

if (($c % GALLERYLISTCOLS)==(GALLERYLISTCOLS – 1)) {

$edelim = $gll_enddelim;

} else {

$edelim = ‘ ‘;

}

$parsed = $sdelim . $gll_item;

$parsed = tplParser(‘{gll_thumbsrc}’,$webgallerythumbs . ‘/’ . $imgthumb,$parsed);

$parsed = tplParser(‘{gll_comment}’,$imgcomment,$parsed);

$parsed = tplParser(‘{gll_imageurl}’,$thispage,$parsed);

$parsed = tplParser(‘{gll_imagename}’,$imgname,$parsed);

$parsedresult = $parsedresult . $parsed . $edelim;

$c++;

}

echo($gll_start.$parsedresult.$gll_end);

}

Leave a Comment more...

Mysql 5 upgrade – compiled

by Greg on Apr.02, 2006, under Databases, Linux

I just upgraded my MySQL server from 5.0.7 to 5.0.10. I wanted to make a few notes about what I did to set it up.

1. I compiled MySQL 5.0.10-beta.

./configure --prefix=/var/mysql5010
--with-unix-socket-path=/tmp/mysql5.sock
--with-mysqld-ldflags=-all-static
--enable-assembler
--with-low-memory
--with-named-curses-libs=/lib/libncurses.so.5
--with-mysqld-user=mysql

2. Did a make && make install
3. Stop mysql507 (on my server I created a script to stop and start mysql and mysql5, this way I can easily run both servers at the same time) stopmysql5
4. mkdir /var/mysql5010/var
5. cp -Rv /var/mysql507/var/* /var/mysql5010/var
6. Chmod -Rv mysql.mysql /var/mysql5010
7. Updated the startmysql5 script to point to the new path (var/mysql5010), same with stopmysql5 script.
8. startmysql5

And I was running!  Now, this might not work on future versions, particularly since MySQL 5.x is in beta right now.

I did not recompile MySQLdb yet, as it is working fine for me, however it might be wise.  In fact, I really should do that because the libraries are pointing to the /var/mysql507 directory.

Edit: 10/25/05

The config options here are for a smaller/slower server.  Use this for normal servers with decent amount of RAM:

./configure --prefix=/var/mysql
--with-unix-socket-path=/tmp/mysql.sock
--with-mysqld-ldflags=-all-static
--enable-assembler
--with-named-curses-libs=/lib/libncurses.so.5
--with-mysqld-user=mysql
--enable-thread-safe-client

This also enables the Thread Safe client, which will work better with mysql-python modules.

1 Comment more...

Retrieve or return an output parameter from a Mysql stored procedure in Zope

by Greg on Apr.02, 2006, under Databases, Programming, Zope

Zope 2.7.6 – Mysql 5.0.7. I have always thought that output parameters from stored procedures were not useable in Zope’s ZSQL methods, but a few minutes ago is suddenly occured to me that I could do it by using the “sql_delimiter” function in Zope. To be quick, put something like this in a ZSQL method:

call sp_test(@y)
dtml-var sql_delimiter
select @y as thecount

(put the <> around dtml-var sql_delimiter)

This works perfectly! I simply return a count in a simple sproc, but it’s exciting because this makes it even more useable! I LOVE ZOPE! (and now the MySQL has stored procedures, I LOVE MYSQL!)

Sample code if you want it:

— Here is the stored procedure —-
— This simply returns the parameter vout
— as a count.

DELIMITER $$

DROP PROCEDURE IF EXISTS `fb`.`sp_test`$$
CREATE PROCEDURE `fb`.`sp_test` (
out vout int
)
BEGIN
select count(*) into vout from blogs;
END$$

DELIMITER ;

— Here is the ZSQL Method —

call sp_test(@y)
dtml-var sql_delimiter
select @y as thecount

(put the <> around dtml-var)

Now you should note… for some reason, in MySQL Query Browser you can’t issue the commands:
call sp_test(@y);
select @y as thecount;

It wont work. But you can do that at he command line client just fine.

Also, you cannot do this AND return a recordset in the same procedure. It works from the command line client, but not in the ZSQL method. So, you will be limited to only return parameters this way.

Leave a Comment more...

Install a non-linux USB Wireless adapter on Ubuntu

by Greg on Apr.01, 2006, under Linux, Networking

Wow! This has turned out to be a real pain.  Below is a process I started, but ran into issues.  I could see the module, but it would never make a Wlan0 to access using iwconfig or ifconfig.

I tried this on the Trendnet TEW-229UB and the TEW-424UB.  Maybe because they are cheap devices, but heck, I spent something like $25 for both, and in Windows, they work perfectly.

After I had depmod -a and the ndiswrapper module listed (lsmod), everything seemed ok.  The syslog had no errors on the 424, but never showed the wlan0.  I could run lshw -C network, but would only show the wired adapter.  I could run lsusb, and it would show the device.  I could even run ndiswrapper -l and the device showed installed and hardware present.  So, what the hell?  No errors, everything working, but no WLAN0 shows up?

If I find more info, I’ll post it.


  1. make sure the ndiswrapper package is installed, so do that.
  2. Make sure that the wireless-tools package is installed. Probably is from the initial install.
  3. Get your wireless driver for Windows XP.
  4. Unpack the driver somewhere, then cd there and run ndiswrapper on driver. Something like so:
    ndiswrapper -i driver.inf

    I installed the Trendnet TEW-229 and that was:
    ndiswrapper -i sis162u.inf

  5. Then let ndiswrapper setup the module.
    ndiswrapper -m
  6. Then run: depmod -a
    After that you’ll see the ndiswrapper module when you run lsmod.

And from here I can see the module, but don’t know what to do… I’ll try to figure it out though, and write it here!

1 Comment more...

Python Script/ZSQL – Alternate data over 2 columns

by Greg on Mar.31, 2006, under Linux, Programming, Python

Here’s a quick post based on a Python Script I made in Zope to display the data from a ZSQL method in a 2 column table layout. Not that big of a deal, but I wanted to save this because it took a little bit of thought and some learning.
(My original code is all mess up on this, I’ll try to find and repost it.)

## Script (Python) "genlodinfo" ##bind container=container ##bind context=context ##bind namespace= ##bind script=script ##bind subpath=traverse_subpath ##parameters=itemid ##title= ## # Example code:  ################################### """  Author: Greg Fischer  1st Byte Solutions - greg@1stbyte.com   Date: 9/24/05   License: You are free to reengineer  rework, recode, redistribute, resell  or alter this  code in any way you see fit, but you   must give credit to my original work  and you must provide this same license  to those that may receive your distribution  if you do. (just leave my name on it,  and you must offer the same freedom  in your work, that's all)   Purpose: This script will gather  from a zsql method, cat the records  into address records (with exra info),  then generate a table with alternating  rows. In other words, it will fill the table  from left to right, then down a row, 2 columns  wide. """ ###################################  def iseven(n):    """Return true if n is even."""    return n%2==0  def isodd(n):    """Return true if n is odd."""       return not iseven(n)  # Import a standard function, and get the HTML request and response objects. from Products.PythonScripts.standard import html_quote request = container.REQUEST RESPONSE =  request.RESPONSE  rs = context.sql.ap_lodging(itemid) rownum = 1 x = [] for r in rs: 	ritemid = str(r[0]) 	rtqstart = str(r[4]) 	rtqend = str(r[5]) 	rstreet1 = r[12] 	rstreet2 = r[13] 	rcity = r[14] 	rstate = r[15] 	rzip = r[16] 	rnotes = r[18] 	 	lodstr = rtqstart + ' - ' + rtqend + '
' 	lodstr = lodstr + rstreet1 + '
' + rstreet2 + '
' 	lodstr = lodstr + rcity + ', ' + rstate + ' ' + rzip + '
' 	if rnotes <> '': 		lodstr = lodstr + rnotes + '
' 	 	x.append(lodstr)  table = '' tablee = '

' tr = '' tre = '' td = '' tde = '' 	 if len(x) >= 1: 	c = len(x) 	listing = '' 	cur = 0 	for addy in x: 		listing = listing + '' 		#first build the addy with starting table elements 		#first record only 		if cur == 0: 			listing = listing + table + tr + td + addy + tde 		#Now check if this is an odd seq item, 		#just add a new cell and end the row 		if isodd(cur): 			listing = listing + td + addy + tde + tre 		#if this is an even item, it should be on a new row 		#and NOT the first item 		if iseven(cur) and cur <> 0: 			listing = listing + tr + td + addy + tde 			#all good, but if last record, then end row 			#else skip and loop to previous isodd and  			#add a new cell(which ends the row as well) 			if cur == (c - 1): 				listing = listing + tre 		#if this is the last item, end the table 		if cur == (c - 1): 			listing = listing + tablee 		cur = cur + 1 else: 	listing = 'No records'   return listing

And you return the results simply by calling the script in your dtml. something like: dtml-var “path.to.script(itemid=itemid)”

As always, I hope this help someone else out there, not just myself! Good luck!

1 Comment more...

Compile PHP 5.1 with JPEG support on Debian

by Greg on Mar.30, 2006, under Linux, PHP

Ok, here’s my configure command:

 ./configure
--with-apxs2=/path/to/httpd/bin/apxs
--with-mysql=/path/to/mysql
--with-mysql-sock=/tmp/mysql.sock
--prefix=/path/to/httpd/php
--with-config-file-path=/path/to/httpd/php
--enable-force-cgi-redirect
--disable-cgi
--with-zlib
--with-gettext
--with-gdbm
--with-gd
--with-png
--with-png-dir=/usr/lib
--with-jpeg
--with-jpeg-dir=/usr/lib
--with-pdo-mysql
--with-mysqli

I ran into errors trying to run the function imagecreatefromjpeg and imagesx and imagesy. And the system could not find the jpeg libs. On Debian Sarge, you need to run an apt-get install libjpeg62-dev. Also, I ran configure with just the –with-jpeg switch, and it didn’t work. So, I had to also include the –with-jpeg-dir=/path/to/lib. On Debian is was in /usr/lib. After that, it all worked out.

It’s worth noting, you must have libpng, libjpeg, and GD installed as well.  If I remember, GD was already on Debian, or maybe it was in PHP, not sure about that, but I know it must installed.

Leave a Comment more...

My top three web design requirements

by Greg on Mar.23, 2006, under Programming, Web Design

Recently I asked myself, “If I had to pick 3 things that are most difficult in web design to achieve, and achieve all at once, what would I pick?” I thought about that and decided it really boils down to these three things: ( I may rephrase them later )

  1. Visually acceptable.
  2. Quick to load
  3. Accessible

If I can get all three of these things to match up, then we’re in good shape.

Let me explain briefly about this. At first you might say, “Duh!” Well, here’s how I define them.

Visually Acceptable

I really have 3 sub items that I must, must have in my designs, or must work around somehow as a limitation. Of course, to me it is unsaid, that you should strive for cross-browser compatibility. I am willing to live with a few graphical errors in Safari, because it is still visually acceptable. Such a very small percentage of the visitors use it on my sites. Even Opera, but I noticed that more and more, if it looks good on Firefox, it probably looks very close, if not just like it on Opera. (using fairly recent versions)

  • I must always provide a graphically pleasing design that aligns images to the pixel. Having an image that is sliding over a single pixel can look terrible. Though, sometimes, if the bottom right corner of the page has a single pixel issue with colors that are hard to make out, then I don’t fuss too much. But I don’t like it.
  • The layout must stretch according to my content. NOT WINDOW SIZE! Unlike all the CSS fans out there, I don’t utilize all CSS layouts because of the limitations in browser standards and the box model. The box model does not allow my dynamic content to stretch out the layout as needed. Liquid CSS layouts are not the same. So I use a hybrid layout, using a single table to wrap, maybe an inner 2 column table for my content, but other than that, it’s all divs. (new blog on just this topic later)
  • Image transparencies! UGH! GIFs just don’t look good enough, and Internet Explorer does not support transparent PNG’s. PNG is an awesome image format, and the lack of support by the most widely used browser causes me to design around this limitation.

Quick to load

Do I really need to explain this one? Well, let’s just say, this is where I like CSS more. The more I can load into an external CSS file, the better. I can use them on tables too. But, being able to specify “header art” as a whole, even if it’s a larger image, is faster than loading many smaller images. So, I strive for this always.

Accessible

Yes, this is for those of us who have a hard time with all our graphics, small print, and visual layouts. When I create anything, I like to allow for larger fonts the visitor might adjust to on their browser. This can cripple the graphic layout if not done correctly. Screen readers for the blind, also, must be accounted for. Tables, as far as I can tell, do NOT deter from their use. (maybe I am wrong, and if so, someone please show me.) The section508.gov website is all table based.

To make things more Accessible, I try to have cleaner markup code (more CSS), give resizable fonts, list “title” and “alt” properties in my tags, and provide skip navigation.

1 Comment more...

My new opinion on AJAX

by Greg on Feb.18, 2006, under Programming, Web Design

So I’ve spent the last 6 months learning more about Javascript and how to use different AJAX libs. After trying to create some apps using it, I can say this. It is best used either in small doses on basic web apps (bloggers, forums, forms), or use it extensively on a proprietary web-based app.

So far I have found it is very cool and helpful to run some simple graphics effects and XMLHTTPRequests for single form fields or small forms, but designing the “single page” web app isn’t quite suited for standard web site right now. I say that for on simple reason, useability. Yes, useability. People have it so implanted in the mind on how to operate a web site, when you stray from the standard practice (like back buttons, urls), people don’t like it. Sure, you can deal with the back button issue, but why work so hard to do that when it’s so fast to do things with a new page.

I just find that using AJAX to compliment a web site form works best for now. However, say you want to build a complete application running over the Internet, then doing things the AJAX way might make things interesting. But, you’d have to rid yourself of the toolbars and run the app in a clean window, because you will be forcing the useability into your app, not into a web browser. (even though it still runs in your browser)

Leave a Comment more...

Looking for something?

Use the form below to search the site:

Still not finding what you're looking for? Drop a comment on a post or contact us so we can take care of it!

1st Byte Solutions