Monday, August 15, 2005

because Windows keeps jacking my clock

Of course the real solution is to eliminate the Windows partition altogether--and if I was done with school, that'd be acceptable.

Instead, here's a Ruby time synchronization hack/work-around I'll place in my startup script.

#!/bin/ruby
require 'net/http'
require 'date'

proxy_addr=ENV['http_proxy'].split(/:/)[1].split('/')[2]
proxy_port=80
#handle the case when the proxy_addr is null
date=nil


while(date == nil)
#fetch date
begin
Net::HTTP::Proxy(proxy_addr,proxy_port).start('www.google.com') {|http|
http.read_timeout = 1
http.open_timeout = 1
p = http.request_head('/')
puts p['content-type']
puts p['date']
date = p['date']
}
rescue
puts "is net connected?"
end

#set date
if(date != nil)
puts date
datetime = DateTime.parse(date)
puts datetime
mst = (datetime.new_offset(-0.25) )
#will need to determine if this is during daylight savings or not and adjust fraction accordingly
puts mst

#parse and format for posix
dates = mst.to_s.split('-')
times = dates.to_s.split(":")
finalDate = dates[1]
finalDate += dates[2][0,2]
finalDate += times[0][9,11]
finalDate += times[1]
finalDate += dates[0]
puts finalDate
`date #{finalDate}`
end
sleep(1)
end

Friday, August 12, 2005

Localized date resolution

Changing the datatype on our Oracle columns to Timestamp was one important step. Next, LocalizedTimestamp was created (implementing Hibernate's UserType for necessary integration) extending Timestamp and adding a bunch of constructors for multi-purpose instantiation. Moved all of the date converstion stuff into a separate abstract utility class. Followed the code-generation logic in the previous post and added a separate getDateValueLocalized(TimeZone) for specifically localized date columns (also, the date is GMT-ized going in on those same columns).

Took about two days, with the bulk of the work being in the refactoring of existing code and ensuring correct behavior via unit tests.

Wednesday, August 10, 2005

more headaches with localizing dates

Per the previous post we have decided upon normalizing dates into standard UTC/GMT times (at midnight of the day they occurred). Using the code generation tools that we have it was simply a matter of adding the necessary logic in the setters and getters of those fields on the domain model objects. So, if a date field is a GMT date we add in:

this._dateValue = new java.sql.Timestamp(setDateToUtcHourFromTimeZone((java.util.Date)dateValue).getTime());


Where setDateToUtcHourFromTimeZone is going to find the TimeZone in the session, modify the date value to midnight at that TimeZone and then translate the midnight date value to real UTC/GMT time.

Likewise fo the getter:

return new java.sql.Timestamp(getTimeZoneDate((java.util.Date)_dateValue).getTime());


Where getTimeZoneDate will translate the Date (which is GMT) back into the correct TimeZone date.

So, what's the problem with this? The problem is Hibernate calls the getters and setters. It's just fine and dandy when you set the value via the object. But, once that DMO gets into Hibernate's clutches it calls the getter on it which effectively negates the intended GMT normalization! And again, when Hibernate creates the object and calls the setter the GMT date retrieved from the database is then retranslated into a different value rather than the desired the translated local TimeZone date ).

What's the solution? If you're using Oracle , evaluate the Timestamp with timezone datatype. Same thing with PostgreSql. If not, what now? Use a varchar and muck with the values through the data access code? That's nasty and then you lose all major benefits of the RDBS datatype operations. Varchar operations could be more CPU intensive compared to numerical datatypes, especially as record sizes ramp. If I find out anything more I'll update.

RESOLUTION

So it's not going to be too difficult to fix this issue. The changes will be as follows:
1) generated DMO code will not hose with the getter, it will return the value as-is.

2) generated DMO code will have additional method for obtaining the local date value given a TimeZone.

3) generated DMO code will still use the above function but its signature will change to use a LocalizedTimestamp object.

4) LocalizedTimestamp object to be created. Has a Timestamp value and a TimeZone value. Default TimeZone is GMT.

Implementation details

The setter calls setDateToUtcHourFromTimeZone and passes in the LocalizedTimestamp. Internal logic evaluates that this is either a GMT Timestamp or not. If it is, translate, if not, keep original value. This way the code is smart enough to not hose the value if it is already GMT.

As for the getter, we'll toss on a new method (getLocalDateValue) that will require a TimeZone and will translate the value for the caller.

Thus, we satisfy the setter/getter issue for Hibernate operations and still provide necessary functionality for the additional callers.

Wednesday, August 03, 2005

test #4, w/4.6 dev

ran again with -Xmx1200m with same results.
----
java -Xmx1024m -classpath /home/russ/.maven/repository/junit/jars/junit-3.8.1.jar:/home/russ/.maven/repository/ims/jars/imsobjects-1.2.0-SNAPSHOT.jar:/home/russ/.maven/repository/db4o/jar
s/db4o-4.6-java1.2.jar:./target/test-classes junit.textui.TestRunner org.lds.ims.objects.TestDb4o

.Loading database with: 1000000 ids(2x), names, people

573565ms elapsed for task
Looking up Person by id 113322
1ms elapsed for task
Looking up Name from Person
[db4o 4.6.004 2005-08-03 22:47:42]
Uncaught Exception. Engine closed.
[db4o 4.6.004 2005-08-03 22:47:43]
Please mail the following to info@db4o.com:

java.lang.OutOfMemoryError

Closing database
0ms elapsed for task

Friday, July 29, 2005

test #3

java -Xmx1024m -classpath /home/russ/.maven/repository/junit/jars/junit-3.8.1.jar:/home/russ//.maven/repository/ims/
jars/imsobjects-1.2.0-SNAPSHOT.jar:/home/russ/.maven/repository/db4o/jars/db4o-4.5-java1.4.jar:. junit.textui.TestRunner org.lds.im
s.objects.TestDb4o
.Loading database with: 1000000 ids(2x), names, people

502640ms elapsed for task
Looking up Person by id 113322
1ms elapsed for task
Looking up Name from Person
[db4o 4.5.009 2005-07-29 10:48:45]
Uncaught Exception. Engine closed.
[db4o 4.5.009 2005-07-29 10:48:45]
Please mail the following to info@db4o.com:

java.lang.OutOfMemoryError

Closing database
39ms elapsed for task
E
Time: 569.755
There was 1 error:
1) testLookupByRfn(org.lds.ims.objects.TestDb4o)java.lang.RuntimeException: Uncaught Exception. db4o engine closed.
at com.db4o.YapStream.fatalException(Unknown Source)
at com.db4o.YapStream.get1(Unknown Source)
at com.db4o.YapStream.get(Unknown Source)
at org.lds.ims.objects.TestDb4o.testLookupByRfn(TestDb4o.java:152)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

FAILURES!!!
Tests run: 1, Failures: 0, Errors: 1

------
public void setUp(){
Db4o.configure().objectClass(TId.class).objectField("idValue").indexed(true);
Db4o.configure().objectClass(TName.class).objectField("nameValue").indexed(true);
Db4o.configure().objectClass(TName.class).objectField("person").indexed(true);
Db4o.configure().objectClass(TBasicPerson.class).objectField("imsId").indexed(true);


database = Db4o.openFile(DB_FILENAME);
setupDatabaseWithPeople(NUM_OF_PEOPLE_TO_LOAD);
}
-----

---loading code---
IMSID ims = new IMSID("" + (peopleCntr * 17));

TBasicPerson newDude = new TBasicPerson();
newDude.setImsId(ims);
database.set(newDude);

TId imsId = new TId();
imsId.setIdType(IdType.IMS_ID);
imsId.setIdValue(ims.toString());
imsId.setPerson(newDude);

database.set(imsId);

TId rfn = new TId();
rfn.setIdType(IdType.RFN);
rfn.setIdValue("" + (peopleCntr * 31));
rfn.setPerson(newDude);

database.set(rfn);

TName name = new TName();
name.setNameValue("Some Test dude name" + (peopleCntr * 19));
name.setNameType(NameType.CMIS_NAME);
name.setPerson(newDude);

database.set(name);
---end loading code---

---tests---
TId queryId = new TId();
queryId.setIdValue("113322");

Query query = database.query();
query.constrain(TId.class);

ObjectSet results = database.get(queryId);

beginLoggedEvent("Looking up Person by id " + queryId.getIdValue());
assertTrue(results.size() == 1);
TBasicPerson person = ((TId)results.next()).getPerson();
endLoggedEvent();

beginLoggedEvent("Looking up Name from Person");
TName queryName = new TName();
queryName.setPerson(person);
results = database.get(queryName);
assertTrue(results.size() == 1);
System.out.println("Name is: " + ((TName)results.next()).getNameValue());
endLoggedEvent();
---end tests---

Thursday, July 28, 2005

db4o second test

Using a BasicPerson, TestId and TestName pojos:
Loading database with: 1000000 ids(2x), names, people
just reached: 0 in 0
just reached: 10000 in 5235
just reached: 20000 in 9609
just reached: 30000 in 14014
just reached: 40000 in 18555
just reached: 50000 in 24294
just reached: 60000 in 29458
just reached: 70000 in 34711
just reached: 80000 in 38898
just reached: 90000 in 43103
just reached: 100000 in 48126
just reached: 110000 in 52073
just reached: 120000 in 56077
just reached: 130000 in 60128
just reached: 140000 in 64137
just reached: 150000 in 69626
just reached: 160000 in 73657
just reached: 170000 in 77673
just reached: 180000 in 81744
just reached: 190000 in 85833
just reached: 200000 in 89924
just reached: 210000 in 93986
just reached: 220000 in 98120
just reached: 230000 in 102249
just reached: 240000 in 108154
just reached: 250000 in 112670
just reached: 260000 in 117505
just reached: 270000 in 122052
just reached: 280000 in 126539
just reached: 290000 in 131076
just reached: 300000 in 136139
just reached: 320000 in 146089
just reached: 330000 in 150771
just reached: 340000 in 155347
just reached: 350000 in 159983
just reached: 360000 in 164586
just reached: 370000 in 169100
just reached: 380000 in 176931
just reached: 390000 in 181569
just reached: 400000 in 186232
just reached: 410000 in 190950
just reached: 420000 in 195867
just reached: 430000 in 200507
just reached: 440000 in 205159
just reached: 450000 in 209983
just reached: 460000 in 214668
just reached: 470000 in 219328
just reached: 480000 in 224170
just reached: 490000 in 228886
just reached: 500000 in 233544
just reached: 510000 in 238384
just reached: 520000 in 243180
just reached: 530000 in 247650
just reached: 540000 in 252316
just reached: 550000 in 256820
just reached: 560000 in 261308
just reached: 570000 in 266162
just reached: 580000 in 270585
just reached: 590000 in 275104
just reached: 600000 in 279884
just reached: 610000 in 289737
just reached: 620000 in 294251
just reached: 630000 in 299066
just reached: 640000 in 303539
just reached: 650000 in 308344
just reached: 660000 in 312893
just reached: 670000 in 317665
just reached: 680000 in 322080
just reached: 690000 in 326708
just reached: 700000 in 331115
just reached: 710000 in 335714
just reached: 720000 in 340175
just reached: 730000 in 344840
just reached: 740000 in 349324
just reached: 750000 in 353799
just reached: 760000 in 358612
just reached: 770000 in 363367
just reached: 780000 in 367962
just reached: 790000 in 372655
just reached: 800000 in 377622
just reached: 810000 in 382321
just reached: 820000 in 387158
just reached: 830000 in 391964
just reached: 840000 in 396887
just reached: 850000 in 401993
just reached: 860000 in 406987
just reached: 870000 in 411791
just reached: 880000 in 416510
just reached: 890000 in 421543
just reached: 900000 in 426205
just reached: 910000 in 431058
just reached: 920000 in 435586
just reached: 930000 in 440384
just reached: 940000 in 455117
just reached: 950000 in 459988
just reached: 960000 in 464647
just reached: 970000 in 469666
just reached: 980000 in 474506
just reached: 990000 in 486817
499153ms elapsed for task
Closing database
Total objects added: 2mil Ids + 1mil names + 1mil persons = 4mil objects

Next to test lookup on FKs.

Friday, July 22, 2005

db4o intial testing

Update
Thanks to Carl (and a bit of more reading of the tutorial) I updated my test to index on a single field--and then queried on that field. New results:

Million records took: 128966 ms
Fetching a record from a million: 5 ms
Deleting a million: 132258 ms

*Very* impressive. Perhaps I'll get more creative with a larger POJO and evaluate further metrics. The numbers for creating and deleting records are larger due to more processes running at the time of the test.
---------------

Dell D800 1.7 PM, 2G ram, JVM 1.4.2.06, from maven using JUnit

Dumped in a million objects (4 field POJO) and the db file grew to 64MB.

Million records took: 48195 ms
Fetching a record (QBE) from a million: 12460 ms
Deleting a million, but result set from (by Query): 48234 ms





Thursday, July 21, 2005

Importance of UTC date normalization in event triggers.

One important aspect of internationalizing an application may be that of date handling. That is, how will the application read and write dates. Should the scope of the project be limited to viewing only, then the point is moot. However, if the need arises that these dates drive some activity or event then "normalizing" the dates should be heavily considered. Choosing an international standard (UTC) and conforming date entries allows date-specific operations and triggers to be precisely executed.

Consider the following example. An organization has dates that drive specific events or triggers. A monitor/daemon is run that periodically evaluates these dates and fires the appropriate action. Presume the monitor awakes at midnight MST. Then the scenario in which an organization in New Zealand depends on the date of 24 July to trigger some action will then be delayed for 33 hours--and the people/systems dependent upon those date-driven operations will be hosed. Here's how:

    00:00 Denver July 23 the monitor awakes. Monitor evaluates all dates
    for 23 July and invokes appropriate operations.
    However, the New Zealand organization will not be processed yet,
    awaiting for midnight Denver on July 24.
    BUT, 00:00 Denver July 23 is 19:00 NZ July 24. The time difference
    is 19 hours. So, the New Zealand organization must wait until 00:00
    Denver July 24. So, 19h + 24h = 43h before the effective date
    processing occurs.

Alternatively, if the effective date is stored as a timestamp (even though only the "date" is really relevant considering the requirement to run operations based on "that day") and the monitor runs hourly the problem is solved. The New Zealand "date" of 00:00 July 24 is really 12:00 July 23 UTC. If the monitor then only evaluates per-hour dates, the application can then address international needs required by the effective date handling. Thus, all triggers and date dependent operations will only ever be delayed by an hour and ensuring that at midnight for any given timezone the correct operations for that timezone's day will be executed.

Thursday, July 07, 2005

more file procecssing stats

So I can't get over the fact that I want to write the GUI in Swing. I had the idea to use Ruby on the back end to get the list of files, then write the whole list to a file. Then use Java to pickup the file, parse it, search (per user input) for the file and use Swing as the GUI! All, of course, within a Ruby script. Sound impossible? Check it out:


time ruby finderPrinter.rb
17370

real 0m0.598s
user 0m0.427s
sys 0m0.164s

So that's 17370 files, written to disk in .598 seconds! Beautiful! File is ~1.5 meg. How about how fast Java can process the file?


java -classpath . JReader
17370
took 169 milliseconds
Looked for 'a' in all files: 17258 169 milliseconds


Incredible. Here's the java code:

public void readFile(String fileName) throws FileNotFoundException{
//see how long it takes to read in the file
//iterate the list
//then search through the list for a given name
long timeStarted = System.currentTimeMillis();
BufferedReader reader = new BufferedReader(new FileReader(fileName));
String currentLine = null;
try{
while(reader.ready()){
currentLine = reader.readLine();
fileList.add(currentLine);
}
reader.close();
}
catch(IOException ex){
ex.printStackTrace();
}

for(Iterator fileIter = fileList.iterator();fileIter.hasNext();){
String filePath = (String)fileIter.next();
if(filePath.indexOf("a") > 0){
resultList.add(filePath);
}
}
System.out.println(fileList.size());
System.out.println("took " + ((System.currentTimeMillis() - timeStarted)) + " milliseconds");
System.out.println("Looked for 'a' in all files: " + resultList.size() + " " + ((System.currentTimeMillis() - timeStarted)) + "milliseconds");
}


Pretty simple, but that's exactly what I want. The two Collections (fileList and resultList) are ArrayLists. If it operates this quickly, it *should* be acceptable to get a GUI in place that can execute with these ideas. Real kicker is to run the Ruby script that then kicks off the java code...


Finding files
found
17373
done writing file, now kicking off java process
17373
took 143 milliseconds
Looked for 'a' in all files: 17260 143milliseconds

real 0m0.895s
user 0m0.630s
sys 0m0.211s

Acceptable? Just have to code the gui to find out.

Wednesday, July 06, 2005

file fetching stats

I ported the ruby code to python and java for the file finder app. I'd love to use Swing to get out of the GTK pain, but the obesity of the JDK is going to hinder that route.

Here are the results:

time python test.py
18184
--------------------
real 0m0.649s
user 0m0.465s
sys 0m0.182s

time ruby test.rb
19948
--------------------
real 0m0.598s
user 0m0.383s
sys 0m0.195s
--------------------
java -classpath . SimpleTester
19946 took 37 seconds


Couple of interesting things to note:

First, the code running each of these tests is identical in nature--it's a simple recursive walk of a directory tree. The Pyton code came up with signifcantly less (~1800) files because it ignores symlinks. Wonder what two files Java didn't account for that Ruby did.

Second, the Java collection used in the test is a HashSet containing the file names (Strings). Changing the implementation to use an ArrayList of Files added a second or two onto the test.

I should write this also in C++ and post results. For now Ruby is the clear winner and my hunch held true that it's the slimmest and fastest of the three.

Test specs:
Dell D800 P4M 1700mhz
2G Ram
reiserfs
Linux rr800 2.6.11-gentoo-r4 #5 Tue May 3 08:32:04 MDT 2005 i686 Intel(R) Pentium(R) M processor 1700MHz GenuineIntel GNU/Linux

Monday, June 27, 2005

Tapestry: opinion on page property specifications

I think it is *bad* practice to define page properties with explicit initial-values. The main qualification for this statement is based upon the premise that the page implements PageBeginRender. I oppose defining explicit initial-values (other than new HashMap(), new HashSet() etc.) because it's unclear to the maintainer how/why certain variables are being set and requires two files open, rather than the one java file, to ascertain page state. In order to be really readable and maintainable the coder should define an initial setup method and then invoke that upon first page load. Thus providing logical class definition (since it *is* part of the object and now resides in its guts) and clear code documentation.

Monday, June 20, 2005

Aaron's cookies

Chips Ahoy White Fudge Chunky cookies are the best of the lot.

Good reasoning for ORM

http://www.gloegl.de/17.html
----------------------------------
If you are working with object-orientated programming and relational
databases, you will surely have noticed that these are two different
paradigms. The relational model deals with relations,tuples and sets -
it is very mathematical by nature. The object-orientated paradigm
however deals with objects, their atributes and associations to each
other. As soon as you want to make objects persistent using a
relational database you will notice: There is a rift between these two
paradigms, the so called object-relational gap. A object-relational
mapper (or ORM as a shorthand) will help you bridge that gap.

Well, how does this gap manifest? If you are passing objects around in
your application and sometimes reach the point where you want to
persist them, you will typically open a JDBC connection, create an SQL
statement and copy all your property values over to the
PreparedStatement or into the SQL string you are building. This may be
easy for a small value object - but consider this for an object with
many properties. Thats not the only problem. What about associations?
If your Cat object you want to store has a List of kittens contained?
Do you store them too? Automatically? Manually? What about foreign key
constraints?

The same applies for loading - let's assume you load a Cat object from
the database and it has a collection of kittens. Do you load the
kittens too? Not load them yet but later? If you load the kittens,
consider each of the kitten object has an association to yet more
objects. In this case, such eager loading may easily load your
complete object tree. Not loading the kittens is however not really
better however - you will need explicit reloading later if you
probably want to access the kittens.

As you can see, the object-relational gap quickly becomes very wide if
you have large object models. And there are a lot more things to
consider like lazy loading, circular references, caching, etc. In
fact, there have been studies that showed that about 35% of an
application code was produced by the mapping between application data
and the datastore.

So what can an ORM do for you? A ORM basically intends to takes most
of that burden of your shoulder. With a good ORM, you have to define
the way you map your classes to tables once - which property maps to
which column, which class to which table, etc

Tuesday, June 14, 2005

DB4o

http://www.db40.com
http://www.onjava.com/pub/a/onjava/2004/12/01/db4o.html

http://www.theserverside.com/news/thread.tss?thread_id=30353

Thursday, June 09, 2005

Tapestry vs JSF

Links:
http://java.sys-con.com/read/46050.htm
http://howardlewisship.com/blog/2004_01_01_archive.html
http://www-106.ibm.com/developerworks/library/j-jsf1/

http://howardlewisship.com/blog/2005/02/tapestry-jsf-and-fud.html
"...Erik Hatcher likes to "provoke" JSF-ers, such as David Geary, to
duplicate the Table component. The Table includes links for sorting
and paging through long contents ... these links just work, without
any configuration in the application. This is the Tapestry way -- drop
it in and let it work. JSF's approach is primarily a view component
and apparently can't duplicate this."

http://www.oreillynet.com/cs/user/view/cs_msg/48307
"Tapestry has literally taken a project that was stalled in
development hell for almost a year and finished it, rebuilt from the
groun up, in 3 months. We built it from the ground up using Tapestry.
We added things as we learned, but it was all very intuitive. First,
simple forms for customer input and simple screens for reporting."

Known implementations. Interestingly these all have their drawbacks.
Oracle's is an "early access edition", MyFaces is somewhat
proprietary, "The MyFaces version of Tiles Support requires the
MyFaces JSF implementation. It will not work with the Sun RI or any
other JSF implementation." And AjaxFaces looks the most intriguing,
but it's a commercial solution!

http://www.ajaxfaces.com/
http://www.oracle.com/technology/products/jdev/htdocs/partners/addins/exchange/jsf/index.html
http://myfaces.apache.org/components/overview.html

---------
Think I need to spend a night hosing around with JSF to evaluate it.

Wednesday, June 08, 2005

FindFile released!

Just finished releasing FindFile-0.1. Happy to be able to finally contribute something to the OSS world. Download is available at RubyForge, http://rubyforge.org/frs/download.php/4813/FindFile-0.1.tar.gz. I've loved coding this in Ruby and been pleased with how quickly and how great it performs. Gonna be a busy summer, but I hope to knock off some TODOs that I have to enhance it.

Tuesday, May 17, 2005

Getting JDE 2.3.5 working with XEmacs 21.4.5 in Gentoo

(all items done as normal user, assuming emerge privileges)
download cedet 1.0 beta 3
download elib
download jde
emerge app-xemacs/sgml
emerge app-xemacs/os-utils
create ~/.semanticdb
untar cedet, elib and jde in the same directory
from the cedet dir: make EMACS=/usr/bin/xemacs
read INSTALL and add appropriate lines to init.el/customize.el
from jde dir update lisp/makefile to point to the appropriate directories
then make jde
add appropriate load-paths and that's it!
-------init.el--------
;;;jde stuff here
(add-to-list 'load-path (expand-file-name
"~/.xemacs/jde/cedet-1.0beta3b/common"))
(add-to-list 'load-path (expand-file-name
"~/.xemacs/jde/cedet-1.0beta3b/contrib"))
(add-to-list 'load-path (expand-file-name "~/.xemacs/jde/cedet-1.0beta3b/ede"))
(add-to-list 'load-path (expand-file-name
"~/.xemacs/jde/cedet-1.0beta3b/eieio"))
(add-to-list 'load-path (expand-file-name
"~/.xemacs/jde/cedet-1.0beta3b/semantic"))
(add-to-list 'load-path (expand-file-name
"~/.xemacs/jde/cedet-1.0beta3b/speedbar"))
(add-to-list 'load-path (expand-file-name "~/.xemacs/jde/jde-2.3.5/lisp"))
(load-file "~/.xemacs/jde/cedet-1.0beta3b/common/cedet.el")

(require 'jde)

-------init.el--------

Friday, May 13, 2005

xemacs: typing over or deleting selections

Took too long to find this. for some reason pending-del *doesn't*
install when emerging xemacs. BUT, you can emerge it after, "emerge
pc". Then select "options->keyboard & mouse->delete key..."

delete selection in xemacs gentoo

Took too long to find this. for some reason pending-del *doesn't*
install when emerging xemacs. BUT, you can emerge it after, "emerge
pc".

--------------
`turn-on-pending-delete' is an interactive autoloaded Lisp function
-- autoloads from "pending-del"

Turn on pending delete minor mode unconditionally.

so I suggest reading the pending-del package. M-x locate-library RET
--------------
Adrian Aichner Jan 13 2002, 2:01 pm show options
Newsgroups: comp.emacs.xemacs
From: Adrian Aichner <adr...@xemacs.org> - Find messages by this author
Date: 13 Jan 2002 20:00:50 +0100
Local: Sun,Jan 13 2002 2:00 pm
Subject: Re: Auto-delete-selection??
Reply to Author | Forward | Print | Individual Message | Show original
| Report Abuse

>>>>> "John" == John Davin <jda...@andrew.cmu.edu> writes:

John> Hi, sorry if this is a stupid question but I haven't been
John> able to find a solution on the web.

John>
I'm trying to turn on Auto-delete-selection in xemacs 21.4 I

John>
have done this before in xemacs 21.1 but it is different in

John> 21.4. In the Options menu under Keyboard+Mouse it says
John> "Delete Key Deletes Selection" which sounds like what I want
John>

but the option is grayed out and won't let me select it. I

(locate-library "pending-del")
"c:\\Program Files\\XEmacs\\xemacs-packages\\lisp\\pc\\pending-del.elc"

Ergo, you see to be missing the "pc" XEmacs package.

Install it and live happily ever after.

Tuesday, May 03, 2005

CPU freq stepping

Decided I'd like to have more than 40 minutes of battery from the Centrino laptop when unconnected and noticed that CPU throttling didn't seem to be active. So, here's what I did to enable it:
(main source of info: http://forums.gentoo.org/viewtopic.php?t=248572&highlight=)
1. emerged cpufreqd cpufrequtils

2. Had to update kernel .config:
#
# CPU Frequency scaling
#
CONFIG_CPU_FREQ=y
CONFIG_CPU_FREQ_DEBUG=y
CONFIG_CPU_FREQ_STAT=y
CONFIG_CPU_FREQ_STAT_DETAILS=y
CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
CONFIG_CPU_FREQ_GOV_POWERSAVE=y
CONFIG_CPU_FREQ_GOV_USERSPACE=y
CONFIG_CPU_FREQ_GOV_ONDEMAND=y
CONFIG_CPU_FREQ_TABLE=y

3.Rebuilt the kernel

4. Logged in as root, and then "cpufreq-set -f 600000" instantly dropped my clock to 600Mhz, "cpufreq-set -f 1700000" raised it back up. This nice for on-the-fly custom tweaking. "cpufreq-set -g ondemand" is the real beauty, because this governor manages only increments the clock when it's needed. Keeps it @600mhz when not needed.

Trick now is to add this to a startup script.

Wednesday, April 27, 2005

Firefox 1.0.3 compilation time

While running flux,xscreensaver, abi-word, and openoffice Impress:
Linux rr800 2.6.11-gentoo-r4 #4 Mon Apr 4 22:43:46 MDT 2005 i686 Intel(R) Pentium(R) M processor 1700MHz GenuineIntel GNU/Linux
model name : Intel(R) Pentium(R) M processor 1700MHz
stepping : 5
cpu MHz : 1694.743
cache size : 1024 KB
real 37m27.053s

And this compares to:
http://anandtech.com/cpuchipsets/showdoc.aspx?i=2397&p=20

on Windows.

58 minutes on Intel Pentium D 840 3.2GHz!!

Saturday, April 23, 2005

volume keys on latitude dell d800

.xbindkeys entry:
"~/bin/audiomix.sh incr"
c:176
"~/bin/audiomix.sh decr"
c:174

Friday, April 22, 2005

change nice level to -1, and sudoers

Credit to Norm for this beauty. Here's the latest JEdit script to change the nice level to -1:

#!/bin/sh
# Java heap size, in megabytes
JAVA_HEAP_SIZE=256
DEFAULT_JAVA_HOME="/opt/sun-jdk-1.4.2.06/jre"
if [ "$JAVA_HOME" = "" ]; then
JAVA_HOME="$DEFAULT_JAVA_HOME"
fi
#exec "$JAVA_HOME/bin/java" -mx${JAVA_HEAP_SIZE}m ${JEDIT} -jar "/home/russ/jedit/4.3pre1/jedit.jar" $@
#exec "$JAVA_HOME/bin/java" -mx${JAVA_HEAP_SIZE}m ${JEDIT} -jar "/home/russ/jedit/4.3pre2/jedit.jar" $@
#exec "$JAVA_HOME/bin/java" -mx${JAVA_HEAP_SIZE}m ${JEDIT} -jar "/home/russ/jedit/4.2/jedit.jar" $@
#----speedup code----#
"$JAVA_HOME/bin/java" -mx${JAVA_HEAP_SIZE}m ${JEDIT} -jar "/home/russ/jedit/4.3pre2/jedit.jar" $@ > /dev/null 2>&1 &
jeditPid=$!
sleep 10
jeditPid2=`ps axl|grep $jeditPid|awk '{print $3}'`
for pid in $jeditPid2
do
jeditPid3=`ps axl|grep $pid|awk '{print $3}'`
for realPid in $jeditPid3
do
sudo /usr/bin/renice -1 $realPid > /dev/null 2>&1 &
done
done

New stuff is everything under "speedup code#". In order to enable this to work correctly, sudoers must be modified. Current sudoers is as follows:

russ ALL = NOPASSWD:/usr/bin/renice

Thursday, April 14, 2005

CVS update script

getting sick of verbose output. I once again realized why I love Ruby:
-----Begin code, cvsupdate.rb-----

#!/usr/bin/ruby
puts "Now updating imsteam...."
result=`cvs update -dP 2>&1`.split(/\n/)
colormodified="\e[0;36m"
colormerged="\e[0;34m"
colornon="\e[0;32m"
colorconflict="\e[0;31m"
colorupdated="\e[0;35m"
colorremoved="\e[0;34m"
endcolor="\e[0m"

puts "//-------------------//"
puts " Results "
puts "//-------------------//"
for element in result
#!/usr/bin/ruby
puts "Now updating imsteam...."
result=`cvs update -dP 2>&1`.split(/\n/)
colormodified="\e[36m"
colornon="\e[32m"
colorconflict="\e[31m"
colormerged="\e[34m"
colorupdated="\e[35m"
colorremoved="\e[34m"
endcolor="\e[m"

puts "//-------------------//"
puts " Results "
puts "//-------------------//"
for element in result
character=element[0,2]
filename=element[2,element.size]
state=""
case character
when "M ":
state="#{colormodified}MODIFIED: #{endcolor}"
when "C ":
state="#{colorconflict}CONFLICT: #{endcolor}"
when "P ":
state="#{colormerged}MERGED: #{endcolor}"
when "U ":
state= "#{colorupdated}UPDATED: #{endcolor}"
when "R ":
state= "#{colorremoved}REMOVED: #{endcolor}"
when "? ":
state= "#{colornon}(NONCVS) #{endcolor}"
end
if (state!="") then
puts "#{state} #{filename}"
end
end

-----End code-----

Wednesday, April 13, 2005

cvsview.py

needed another change to handle merges on line 134:

elif date=="dummy timestamp from new-entry" or date=="Result of merge":

Monday, April 11, 2005

TODO Meld update

create update script for CVS directory that yanks down all the changes
create "remote changes" capability:
find all changes in CVS dir, show changes in popup
OR add new column in layout, store changes in collection, update
view and column label
create module checkout
port code to Ruby

Friday, April 08, 2005

more elegent solution to cvsview.py

Minor refactoring and fixing:
try:
temp = re.compile(r'\s+')
weekday,month,day,ttime,year=temp.split(date)
hour,minute,second=ttime.split(":")
imonth = {'Jan' : 1, 'Feb' : 2, 'Mar' : 3, 'Apr' : 4, 'May' : 5, 'Jun' : 6, 'Jul' : 7, 'Aug' : 8, 'Sep' : 9, 'Oct' : 10, 'Nov' : 11, 'Dec' : 12 }[month]
sysmodtime = time.mktime(time.gmtime(os.stat(path).st_mtime))#now a float
cvsmodtime = time.mktime([int(year),imonth,int(day),int(hour),int(minute),int(second),0,0,0])#should also be float representation
except OSError:
state = tree.STATE_MISSING
else:
if cvsmodtime == sysmodtime:
state = tree.STATE_NORMAL
else:
state = tree.STATE_MODIFIED

cvsview.py

change to compare posix timestamp floats instead of strings (what were they thinking?!) I'll be posting this to bugzilla and hope for a patch. This was my first real whirl with python. It has some odd nuances (like enforced indentation), and lousy date/time handling (compared to Java objects). But overall, it's kinda slick. I still prefer Ruby.

-----------
try:
weekday,month,day,ttime,year=date.split(" ")
hour,minute,second=ttime.split(":")
#print year + " " + month + " " + day + " " + ttime +" " + hour + " " + minute+ " " + second
iyear = int(year)
#resolve month to int
imonth = {'Jan' : 1, 'Feb' : 2, 'Mar' : 3, 'Apr' : 4, 'May' : 5, 'Jun' : 6, 'Jul' : 7, 'Aug' : 8, 'Sep' : 9, 'Oct' : 10, 'Nov' : 11, 'Dec' : 12 }[month]
iday = int(day)
ihour = int(hour)
iminute = int(minute)
isecond = int(second)
cvsdate = datetime.datetime(iyear,imonth,iday,ihour,iminute,isecond,0)
sysmodtime = time.mktime(time.gmtime(os.stat(path).st_mtime))#now a float
sysstruct = time.gmtime(os.stat(path).st_mtime)
print "file " + name
print "sysstruct " + str(sysstruct)
print "modstruct " + str([cvsdate.year,cvsdate.month,cvsdate.day,cvsdate.hour,cvsdate.minute,cvsdate.second,0,0,0])
cvsmodtime = time.mktime([cvsdate.year,cvsdate.month,cvsdate.day,cvsdate.hour,cvsdate.minute,cvsdate.second,0,0,0])#should also be float representation
print "sys " + str(sysmodtime)
print "cvs " + str(cvsmodtime)
except OSError:
state = tree.STATE_MISSING
else:
if cvsmodtime == sysmodtime:
state = tree.STATE_NORMAL
else:
state = tree.STATE_MODIFIED



-----------

Thursday, April 07, 2005

JEdit javadoc comment macro

Quick and dirty, but it only works on one line functions. I'll get around to handling multiple lines another time:
//author RR, 7 Apr 2005
//create Javadoc comments for one-liner functions
//parses method signature
//for each param adds @param
//if returns value, prints @return


int funcLine=textArea.getCaretLine();
int cntr=0;
String function = textArea.getLineText(funcLine);
StringTokenizer st = new StringTokenizer(function," ");
String returnType =null;

textArea.goToStartOfLine(false);
textArea.insertEnterAndIndent();
textArea.setSelectedText("/**");
textArea.insertEnterAndIndent();
textArea.setSelectedText("*");
textArea.insertEnterAndIndent();
//parse for return type
while(st.hasMoreTokens()){
String element = st.nextToken();
if(!element.equals("void")&&cntr==1){
returnType = "* @return " +element;
break;
}
cntr++;
}
//parse for params
String params = function.substring(function.indexOf("(")+1,function.length()-1);
StringTokenizer stParams = new StringTokenizer(params," ");
int cntr2=0;
while(stParams.hasMoreTokens()){
String element = stParams.nextToken();
if(cntr2==0||(cntr2 %2==0)){
textArea.setSelectedText("* @param "+element);
textArea.insertEnterAndIndent();
}
cntr2++;
}

if(returnType!=null){
textArea.setSelectedText(returnType);
textArea.insertEnterAndIndent();
}

textArea.setSelectedText("*/");
textArea.insertEnterAndIndent();
textArea.shiftIndentRight();

Wednesday, April 06, 2005

Speed increase

Hosed with my maven script so that all maven procs are at a lower nice level. This way JEdit still maintains priority when I'm coding (or whatever) and there are no noticeble UI delays.
Replaced the last 9 lines in the /bin/maven file with the following:

/bin/nice -n 15 $JAVACMD $MAVEN_OPTS -Djavax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl -Djavax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.Doc
umentBuilderFactoryImpl -Djava.endorsed.dirs=$MAVEN_ENDORSED -classpath $MAVEN_HOME/lib/forehead-$FOREHEAD_VERSION.jar -Dforehead.conf.file=$MAVEN_HOME/bin/forehead.conf -Dtools.jar=$TOOL
S_JAR -Dmaven.home=$MAVEN_HOME $MAIN_CLASS $@

Thursday, March 31, 2005

change font in audiomix.sh, osd_cat

would be nice to find a font-picker (this was grabbed from xmms osd plugin control) outside of xmms. Great font for OSD through osd_cat:
-f -adobe-utopia-regular-r-normal-*-33-*-*-*-p-*-iso10646-1

aumix.sh update

slight update to get PCM and PCM2 working:

#!/bin/sh

cd $HOME

action=$1; shift
killall -q osd_cat > /dev/null 2>&1

get_volume() {
volume=`aumix -q | sed -ne 's/^vol \([^,]*\).*/\1/p'`
}

show_volume() {
#echo Volume:\ $1|osd_cat -o 300 -A center -c green -s 10
osd_cat --text Volume:\ $1 --barmode=percentage --percentage=$1 -o 300 -A center -c green -s 10
}

case "$action" in

incr)
delta=${1:-5}
rm -f .mutevol
aumix -v +$delta -w +$delta -W +$delta
get_volume
show_volume $volume
;;

decr)
delta=${1:-5}
rm -f .mutevol
aumix -v -$delta -w -$delta -W -$delta
get_volume
show_volume $volume
;;

mute)
if [ -s .mutevol ]
then
vol=`cat .mutevol`
rm -f .mutevol
aumix -v $vol
# echo "Volume: $vol" | xosd -- -
show_volume $vol
else
get_volume
[ $volume != 0 ] && echo $volume > .mutevol
aumix -v 0
echo "Volume: muted" | xosd -- -
fi
;;
esac

Volume controls

Now have volume keybinding in place. Thanks to Timo(http://www.jroller.com/page/timsu/20050215), updated script is below.
Needed to emerge xosd (already had aumix on the system), this script will work for xosd 2.2.8-14.

audio_adjust.sh:

#!/bin/sh

cd $HOME

action=$1; shift
killall -q osd_cat > /dev/null 2>&1

get_volume() {
volume=`aumix -q | sed -ne 's/^vol \([^,]*\).*/\1/p'`
}

show_volume() {
#echo Volume:\ $1|osd_cat -o 300 -A center -c green -s 10
osd_cat --text Volume:\ $1 --barmode=percentage --percentage=$1 -o 300 -A center -c green -s 10
}

case "$action" in

incr)
delta=${1:-5}
rm -f .mutevol
aumix -v +$delta
get_volume
show_volume $volume
;;

decr)
delta=${1:-5}
rm -f .mutevol
aumix -v -$delta
get_volume
show_volume $volume
;;

mute)
if [ -s .mutevol ]
then
vol=`cat .mutevol`
rm -f .mutevol
aumix -v $vol
# echo "Volume: $vol" | xosd -- -
show_volume $vol
else
get_volume
[ $volume != 0 ] && echo $volume > .mutevol
aumix -v 0
echo "Volume: muted" | xosd -- -
fi
;;
esac


.xbindkeysrc entry:
"~/bin/audiomix.sh incr"
c:86 + m:0x4
"~/bin/audiomix.sh decr"
c:82 + m:0x4

volume key binding

Big thanks to Timo Vuorela for the script and initial direction.

Had to emerge xosd, aumix was already on my system. I updated his script for 2.2.8-14 versions of xosd:
#!/bin/sh

cd $HOME

action=$1; shift
killall -q osd_cat > /dev/null 2>&1

get_volume() {
volume=`aumix -q | sed -ne 's/^vol \([^,]*\).*/\1/p'`
}

show_volume() {
#echo Volume:\ $1|osd_cat -o 300 -A center -c green -s 10
osd_cat --text Volume:\ $1 --barmode=percentage --percentage=$1 -o 300 -A center -c green -s 10
}

case "$action" in

incr)
delta=${1:-5}
rm -f .mutevol
aumix -v +$delta
get_volume
show_volume $volume
;;

decr)
delta=${1:-5}
rm -f .mutevol
aumix -v -$delta
get_volume
show_volume $volume
;;

mute)
if [ -s .mutevol ]
then
vol=`cat .mutevol`
rm -f .mutevol
aumix -v $vol
# echo "Volume: $vol" | xosd -- -
show_volume $vol
else
get_volume
[ $volume != 0 ] && echo $volume > .mutevol
aumix -v 0
echo "Volume: muted" | xosd -- -
fi
;;
esac

And my xbindkeys for ctrl+ and ctrl-
"~/bin/audiomix.sh incr"
c:86 + m:0x4
"~/bin/audiomix.sh decr"
c:82 + m:0x4

Tuesday, March 29, 2005

Kernel updated to 2.6.11-gentoo-r4

emerged ndiswrapper .12 with gentoo dev sources 2.6.11-r4
everything compiled and ran, but I could not set my essid. Need to upgrade my wireless-tools,possibly (update: needed update, now it works). Coworker experienced the same behavior.

On the other hand, installed linuxant driverloader 2.26 (bought it a year ago when my patience was completely run out--it's been working solid ever since and this is the first time I've upgraded) and it ran nicely. Tried to do the same when I was hosing with softwaresuspend2 and 2.6.11 vanilla. Hung the computer each time it loaded. Very odd and a pain to fix.

So I thought driverloader was working. It isn't. While the module loads the dang thing will never receive an IP address. Whereas, now that I've updated wireless-tools, ndiswrapper works much faster. Wonder which one I'll start using...

Lastly, I had to grab the latest nvidia-kernel to work with this one (thus, ~x86).

Nasty surprise this morning when starting xorg, it didn't work. After some hair-pulling due to circular dependencies I'm up and running. Problem was that opengl-update blocked and forced an Xorg update. emerge -O opengl-update fixed that. Then emerged nvidia-glx and everything works! Will probably upgrade xorg tonight while sleeping.

Config:
#
# Automatically generated make config: don't edit
# Linux kernel version: 2.6.11-gentoo-r4
# Mon Mar 28 20:44:26 2005
#
CONFIG_X86=y
CONFIG_MMU=y
CONFIG_UID16=y
CONFIG_GENERIC_ISA_DMA=y
CONFIG_GENERIC_IOMAP=y

#
# Code maturity level options
#
CONFIG_EXPERIMENTAL=y
CONFIG_CLEAN_COMPILE=y
CONFIG_BROKEN_ON_SMP=y
CONFIG_LOCK_KERNEL=y

#
# General setup
#
CONFIG_LOCALVERSION=""
CONFIG_SWAP=y
CONFIG_SYSVIPC=y
CONFIG_POSIX_MQUEUE=y
# CONFIG_BSD_PROCESS_ACCT is not set
CONFIG_SYSCTL=y
CONFIG_AUDIT=y
CONFIG_AUDITSYSCALL=y
CONFIG_LOG_BUF_SHIFT=14
CONFIG_HOTPLUG=y
# CONFIG_KOBJECT_UEVENT is not set
# CONFIG_IKCONFIG is not set
# CONFIG_EMBEDDED is not set
CONFIG_KALLSYMS=y
# CONFIG_KALLSYMS_EXTRA_PASS is not set
CONFIG_FUTEX=y
CONFIG_EPOLL=y
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
CONFIG_SHMEM=y
CONFIG_CC_ALIGN_FUNCTIONS=0
CONFIG_CC_ALIGN_LABELS=0
CONFIG_CC_ALIGN_LOOPS=0
CONFIG_CC_ALIGN_JUMPS=0
# CONFIG_TINY_SHMEM is not set

#
# Loadable module support
#
CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y
# CONFIG_MODULE_FORCE_UNLOAD is not set
CONFIG_OBSOLETE_MODPARM=y
# CONFIG_MODVERSIONS is not set
# CONFIG_MODULE_SRCVERSION_ALL is not set
CONFIG_KMOD=y

#
# Processor type and features
#
CONFIG_X86_PC=y
# CONFIG_X86_ELAN is not set
# CONFIG_X86_VOYAGER is not set
# CONFIG_X86_NUMAQ is not set
# CONFIG_X86_SUMMIT is not set
# CONFIG_X86_BIGSMP is not set
# CONFIG_X86_VISWS is not set
# CONFIG_X86_GENERICARCH is not set
# CONFIG_X86_ES7000 is not set
# CONFIG_M386 is not set
# CONFIG_M486 is not set
# CONFIG_M586 is not set
# CONFIG_M586TSC is not set
# CONFIG_M586MMX is not set
# CONFIG_M686 is not set
# CONFIG_MPENTIUMII is not set
# CONFIG_MPENTIUMIII is not set
# CONFIG_MPENTIUMM is not set
CONFIG_MPENTIUM4=y
# CONFIG_MK6 is not set
# CONFIG_MK7 is not set
# CONFIG_MK8 is not set
# CONFIG_MCRUSOE is not set
# CONFIG_MEFFICEON is not set
# CONFIG_MWINCHIPC6 is not set
# CONFIG_MWINCHIP2 is not set
# CONFIG_MWINCHIP3D is not set
# CONFIG_MCYRIXIII is not set
# CONFIG_MVIAC3_2 is not set
CONFIG_X86_GENERIC=y
CONFIG_X86_CMPXCHG=y
CONFIG_X86_XADD=y
CONFIG_X86_L1_CACHE_SHIFT=7
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
CONFIG_GENERIC_CALIBRATE_DELAY=y
CONFIG_X86_WP_WORKS_OK=y
CONFIG_X86_INVLPG=y
CONFIG_X86_BSWAP=y
CONFIG_X86_POPAD_OK=y
CONFIG_X86_GOOD_APIC=y
CONFIG_X86_INTEL_USERCOPY=y
CONFIG_X86_USE_PPRO_CHECKSUM=y
# CONFIG_HPET_TIMER is not set
# CONFIG_SMP is not set
CONFIG_PREEMPT=y
CONFIG_PREEMPT_BKL=y
# CONFIG_X86_UP_APIC is not set
CONFIG_X86_TSC=y
CONFIG_X86_MCE=y
CONFIG_X86_MCE_NONFATAL=y
# CONFIG_TOSHIBA is not set
CONFIG_I8K=y
# CONFIG_MICROCODE is not set
# CONFIG_X86_MSR is not set
# CONFIG_X86_CPUID is not set

#
# Firmware Drivers
#
# CONFIG_EDD is not set
# CONFIG_NOHIGHMEM is not set
CONFIG_HIGHMEM4G=y
# CONFIG_HIGHMEM64G is not set
CONFIG_HIGHMEM=y
# CONFIG_HIGHPTE is not set
# CONFIG_MATH_EMULATION is not set
CONFIG_MTRR=y
# CONFIG_EFI is not set
CONFIG_HAVE_DEC_LOCK=y
# CONFIG_REGPARM is not set

#
# Power management options (ACPI, APM)
#
CONFIG_PM=y
# CONFIG_PM_DEBUG is not set
# CONFIG_SOFTWARE_SUSPEND is not set

#
# ACPI (Advanced Configuration and Power Interface) Support
#
CONFIG_ACPI=y
CONFIG_ACPI_BOOT=y
CONFIG_ACPI_INTERPRETER=y
CONFIG_ACPI_SLEEP=y
CONFIG_ACPI_SLEEP_PROC_FS=y
CONFIG_ACPI_AC=y
CONFIG_ACPI_BATTERY=y
CONFIG_ACPI_BUTTON=y
CONFIG_ACPI_VIDEO=y
CONFIG_ACPI_FAN=y
CONFIG_ACPI_PROCESSOR=y
CONFIG_ACPI_THERMAL=y
# CONFIG_ACPI_ASUS is not set
# CONFIG_ACPI_IBM is not set
# CONFIG_ACPI_TOSHIBA is not set
CONFIG_ACPI_BLACKLIST_YEAR=0
# CONFIG_ACPI_DEBUG is not set
CONFIG_ACPI_BUS=y
CONFIG_ACPI_EC=y
CONFIG_ACPI_POWER=y
CONFIG_ACPI_PCI=y
CONFIG_ACPI_SYSTEM=y
# CONFIG_X86_PM_TIMER is not set
# CONFIG_ACPI_CONTAINER is not set

#
# APM (Advanced Power Management) BIOS Support
#
# CONFIG_APM is not set

#
# CPU Frequency scaling
#
CONFIG_CPU_FREQ=y
# CONFIG_CPU_FREQ_DEBUG is not set
CONFIG_CPU_FREQ_STAT=y
# CONFIG_CPU_FREQ_STAT_DETAILS is not set
CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set
# CONFIG_CPU_FREQ_GOV_USERSPACE is not set
# CONFIG_CPU_FREQ_GOV_ONDEMAND is not set
CONFIG_CPU_FREQ_TABLE=y

#
# CPUFreq processor drivers
#
# CONFIG_X86_ACPI_CPUFREQ is not set
# CONFIG_X86_POWERNOW_K6 is not set
# CONFIG_X86_POWERNOW_K7 is not set
# CONFIG_X86_POWERNOW_K8 is not set
# CONFIG_X86_GX_SUSPMOD is not set
CONFIG_X86_SPEEDSTEP_CENTRINO=y
# CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI is not set
CONFIG_X86_SPEEDSTEP_CENTRINO_TABLE=y
# CONFIG_X86_SPEEDSTEP_ICH is not set
# CONFIG_X86_SPEEDSTEP_SMI is not set
# CONFIG_X86_P4_CLOCKMOD is not set
# CONFIG_X86_CPUFREQ_NFORCE2 is not set
# CONFIG_X86_LONGRUN is not set
# CONFIG_X86_LONGHAUL is not set

#
# shared options
#

#
# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
#
CONFIG_PCI=y
# CONFIG_PCI_GOBIOS is not set
# CONFIG_PCI_GOMMCONFIG is not set
# CONFIG_PCI_GODIRECT is not set
CONFIG_PCI_GOANY=y
CONFIG_PCI_BIOS=y
CONFIG_PCI_DIRECT=y
CONFIG_PCI_MMCONFIG=y
# CONFIG_PCIEPORTBUS is not set
CONFIG_PCI_LEGACY_PROC=y
CONFIG_PCI_NAMES=y
# CONFIG_ISA is not set
# CONFIG_MCA is not set
# CONFIG_SCx200 is not set

#
# PCCARD (PCMCIA/CardBus) support
#
CONFIG_PCCARD=y
# CONFIG_PCMCIA_DEBUG is not set
# CONFIG_PCMCIA is not set
CONFIG_CARDBUS=y

#
# PC-card bridges
#
# CONFIG_YENTA is not set

#
# PCI Hotplug Support
#
# CONFIG_HOTPLUG_PCI is not set

#
# Executable file formats
#
CONFIG_BINFMT_ELF=y
CONFIG_BINFMT_AOUT=y
CONFIG_BINFMT_MISC=y

#
# Device Drivers
#

#
# Generic Driver Options
#
CONFIG_STANDALONE=y
CONFIG_PREVENT_FIRMWARE_BUILD=y
CONFIG_FW_LOADER=m

#
# Memory Technology Devices (MTD)
#
# CONFIG_MTD is not set

#
# Parallel port support
#
CONFIG_PARPORT=y
CONFIG_PARPORT_PC=y
CONFIG_PARPORT_PC_CML1=y
# CONFIG_PARPORT_SERIAL is not set
# CONFIG_PARPORT_PC_FIFO is not set
# CONFIG_PARPORT_PC_SUPERIO is not set
# CONFIG_PARPORT_OTHER is not set
# CONFIG_PARPORT_1284 is not set

#
# Plug and Play support
#
CONFIG_PNP=y
# CONFIG_PNP_DEBUG is not set

#
# Protocols
#
# CONFIG_PNPACPI is not set

#
# Block devices
#
CONFIG_BLK_DEV_FD=y
# CONFIG_PARIDE is not set
# CONFIG_BLK_CPQ_DA is not set
# CONFIG_BLK_CPQ_CISS_DA is not set
# CONFIG_BLK_DEV_DAC960 is not set
# CONFIG_BLK_DEV_UMEM is not set
# CONFIG_BLK_DEV_COW_COMMON is not set
# CONFIG_BLK_DEV_LOOP is not set
# CONFIG_BLK_DEV_NBD is not set
# CONFIG_BLK_DEV_SX8 is not set
# CONFIG_BLK_DEV_UB is not set
# CONFIG_BLK_DEV_RAM is not set
CONFIG_BLK_DEV_RAM_COUNT=16
CONFIG_INITRAMFS_SOURCE=""
CONFIG_LBD=y
CONFIG_CDROM_PKTCDVD=y
CONFIG_CDROM_PKTCDVD_BUFFERS=8
CONFIG_CDROM_PKTCDVD_WCACHE=y

#
# IO Schedulers
#
CONFIG_IOSCHED_NOOP=y
CONFIG_IOSCHED_AS=y
CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_CFQ=y
# CONFIG_ATA_OVER_ETH is not set

#
# ATA/ATAPI/MFM/RLL support
#
CONFIG_IDE=y
CONFIG_BLK_DEV_IDE=y

#
# Please see Documentation/ide.txt for help/info on IDE drives
#
# CONFIG_BLK_DEV_IDE_SATA is not set
# CONFIG_BLK_DEV_HD_IDE is not set
CONFIG_BLK_DEV_IDEDISK=y
CONFIG_IDEDISK_MULTI_MODE=y
CONFIG_BLK_DEV_IDECD=y
# CONFIG_BLK_DEV_IDETAPE is not set
# CONFIG_BLK_DEV_IDEFLOPPY is not set
# CONFIG_BLK_DEV_IDESCSI is not set
# CONFIG_IDE_TASK_IOCTL is not set

#
# IDE chipset support/bugfixes
#
CONFIG_IDE_GENERIC=y
CONFIG_BLK_DEV_CMD640=y
# CONFIG_BLK_DEV_CMD640_ENHANCED is not set
# CONFIG_BLK_DEV_IDEPNP is not set
CONFIG_BLK_DEV_IDEPCI=y
CONFIG_IDEPCI_SHARE_IRQ=y
# CONFIG_BLK_DEV_OFFBOARD is not set
CONFIG_BLK_DEV_GENERIC=y
# CONFIG_BLK_DEV_OPTI621 is not set
CONFIG_BLK_DEV_RZ1000=y
CONFIG_BLK_DEV_IDEDMA_PCI=y
# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
CONFIG_IDEDMA_PCI_AUTO=y
# CONFIG_IDEDMA_ONLYDISK is not set
# CONFIG_BLK_DEV_AEC62XX is not set
# CONFIG_BLK_DEV_ALI15X3 is not set
# CONFIG_BLK_DEV_AMD74XX is not set
# CONFIG_BLK_DEV_ATIIXP is not set
# CONFIG_BLK_DEV_CMD64X is not set
# CONFIG_BLK_DEV_TRIFLEX is not set
# CONFIG_BLK_DEV_CY82C693 is not set
# CONFIG_BLK_DEV_CS5520 is not set
# CONFIG_BLK_DEV_CS5530 is not set
# CONFIG_BLK_DEV_HPT34X is not set
# CONFIG_BLK_DEV_HPT366 is not set
# CONFIG_BLK_DEV_SC1200 is not set
CONFIG_BLK_DEV_PIIX=y
# CONFIG_BLK_DEV_NS87415 is not set
# CONFIG_BLK_DEV_PDC202XX_OLD is not set
# CONFIG_BLK_DEV_PDC202XX_NEW is not set
# CONFIG_BLK_DEV_SVWKS is not set
# CONFIG_BLK_DEV_SIIMAGE is not set
# CONFIG_BLK_DEV_SIS5513 is not set
# CONFIG_BLK_DEV_SLC90E66 is not set
# CONFIG_BLK_DEV_TRM290 is not set
# CONFIG_BLK_DEV_VIA82CXXX is not set
# CONFIG_IDE_ARM is not set
CONFIG_BLK_DEV_IDEDMA=y
# CONFIG_IDEDMA_IVB is not set
CONFIG_IDEDMA_AUTO=y
# CONFIG_BLK_DEV_HD is not set

#
# SCSI device support
#
CONFIG_SCSI=y
CONFIG_SCSI_PROC_FS=y

#
# SCSI support type (disk, tape, CD-ROM)
#
CONFIG_BLK_DEV_SD=y
# CONFIG_CHR_DEV_ST is not set
# CONFIG_CHR_DEV_OSST is not set
# CONFIG_BLK_DEV_SR is not set
CONFIG_CHR_DEV_SG=y

#
# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
#
# CONFIG_SCSI_MULTI_LUN is not set
# CONFIG_SCSI_CONSTANTS is not set
# CONFIG_SCSI_LOGGING is not set

#
# SCSI Transport Attributes
#
# CONFIG_SCSI_SPI_ATTRS is not set
# CONFIG_SCSI_FC_ATTRS is not set
# CONFIG_SCSI_ISCSI_ATTRS is not set

#
# SCSI low-level drivers
#
# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
# CONFIG_SCSI_3W_9XXX is not set
# CONFIG_SCSI_ACARD is not set
# CONFIG_SCSI_AACRAID is not set
# CONFIG_SCSI_AIC7XXX is not set
# CONFIG_SCSI_AIC7XXX_OLD is not set
# CONFIG_SCSI_AIC79XX is not set
CONFIG_SCSI_DPT_I2O=m
# CONFIG_MEGARAID_NEWGEN is not set
# CONFIG_MEGARAID_LEGACY is not set
CONFIG_SCSI_SATA=y
# CONFIG_SCSI_SATA_AHCI is not set
# CONFIG_SCSI_SATA_SVW is not set
CONFIG_SCSI_ATA_PIIX=y
# CONFIG_SCSI_SATA_NV is not set
# CONFIG_SCSI_PATA_PDC2027X is not set
# CONFIG_SCSI_SATA_PROMISE is not set
# CONFIG_SCSI_SATA_QSTOR is not set
CONFIG_SCSI_SATA_SX4=m
# CONFIG_SCSI_SATA_SIL is not set
CONFIG_SCSI_SATA_SIS=m
# CONFIG_SCSI_SATA_ULI is not set
# CONFIG_SCSI_SATA_VIA is not set
# CONFIG_SCSI_SATA_VITESSE is not set
# CONFIG_SCSI_BUSLOGIC is not set
# CONFIG_SCSI_DMX3191D is not set
# CONFIG_SCSI_EATA is not set
# CONFIG_SCSI_EATA_PIO is not set
# CONFIG_SCSI_FUTURE_DOMAIN is not set
# CONFIG_SCSI_GDTH is not set
# CONFIG_SCSI_IPS is not set
# CONFIG_SCSI_INITIO is not set
# CONFIG_SCSI_INIA100 is not set
# CONFIG_SCSI_PPA is not set
# CONFIG_SCSI_IMM is not set
# CONFIG_SCSI_SYM53C8XX_2 is not set
CONFIG_SCSI_IPR=m
# CONFIG_SCSI_IPR_TRACE is not set
# CONFIG_SCSI_IPR_DUMP is not set
# CONFIG_SCSI_QLOGIC_ISP is not set
# CONFIG_SCSI_QLOGIC_FC is not set
# CONFIG_SCSI_QLOGIC_1280 is not set
CONFIG_SCSI_QLA2XXX=y
# CONFIG_SCSI_QLA21XX is not set
# CONFIG_SCSI_QLA22XX is not set
# CONFIG_SCSI_QLA2300 is not set
# CONFIG_SCSI_QLA2322 is not set
# CONFIG_SCSI_QLA6312 is not set
# CONFIG_SCSI_DC395x is not set
# CONFIG_SCSI_DC390T is not set
# CONFIG_SCSI_NSP32 is not set
# CONFIG_SCSI_DEBUG is not set

#
# Multi-device support (RAID and LVM)
#
# CONFIG_MD is not set

#
# Fusion MPT device support
#
# CONFIG_FUSION is not set

#
# IEEE 1394 (FireWire) support
#
CONFIG_IEEE1394=y

#
# Subsystem Options
#
# CONFIG_IEEE1394_VERBOSEDEBUG is not set
# CONFIG_IEEE1394_OUI_DB is not set
# CONFIG_IEEE1394_EXTRA_CONFIG_ROMS is not set

#
# Device Drivers
#

#
# Texas Instruments PCILynx requires I2C
#
CONFIG_IEEE1394_OHCI1394=y

#
# Protocol Drivers
#
# CONFIG_IEEE1394_VIDEO1394 is not set
# CONFIG_IEEE1394_SBP2 is not set
# CONFIG_IEEE1394_ETH1394 is not set
# CONFIG_IEEE1394_DV1394 is not set
CONFIG_IEEE1394_RAWIO=y
# CONFIG_IEEE1394_CMP is not set

#
# I2O device support
#
# CONFIG_I2O is not set

#
# Networking support
#
CONFIG_NET=y

#
# Networking options
#
CONFIG_PACKET=y
# CONFIG_PACKET_MMAP is not set
# CONFIG_NETLINK_DEV is not set
CONFIG_UNIX=y
# CONFIG_NET_KEY is not set
CONFIG_INET=y
CONFIG_IP_MULTICAST=y
# CONFIG_IP_ADVANCED_ROUTER is not set
# CONFIG_IP_PNP is not set
# CONFIG_NET_IPIP is not set
# CONFIG_NET_IPGRE is not set
# CONFIG_IP_MROUTE is not set
# CONFIG_ARPD is not set
# CONFIG_SYN_COOKIES is not set
# CONFIG_INET_AH is not set
# CONFIG_INET_ESP is not set
# CONFIG_INET_IPCOMP is not set
# CONFIG_INET_TUNNEL is not set
# CONFIG_IP_TCPDIAG is not set
# CONFIG_IP_TCPDIAG_IPV6 is not set

#
# IP: Virtual Server Configuration
#
# CONFIG_IP_VS is not set
# CONFIG_IPV6 is not set
CONFIG_NETFILTER=y
# CONFIG_NETFILTER_DEBUG is not set

#
# IP: Netfilter Configuration
#
CONFIG_IP_NF_CONNTRACK=y
# CONFIG_IP_NF_CT_ACCT is not set
# CONFIG_IP_NF_CONNTRACK_MARK is not set
# CONFIG_IP_NF_CT_PROTO_SCTP is not set
# CONFIG_IP_NF_FTP is not set
# CONFIG_IP_NF_IRC is not set
# CONFIG_IP_NF_TFTP is not set
# CONFIG_IP_NF_AMANDA is not set
CONFIG_IP_NF_QUEUE=y
CONFIG_IP_NF_IPTABLES=y
CONFIG_IP_NF_MATCH_LIMIT=y
CONFIG_IP_NF_MATCH_IPRANGE=y
CONFIG_IP_NF_MATCH_MAC=y
CONFIG_IP_NF_MATCH_PKTTYPE=y
CONFIG_IP_NF_MATCH_MARK=y
CONFIG_IP_NF_MATCH_MULTIPORT=y
CONFIG_IP_NF_MATCH_TOS=y
CONFIG_IP_NF_MATCH_RECENT=y
CONFIG_IP_NF_MATCH_ECN=y
CONFIG_IP_NF_MATCH_DSCP=y
CONFIG_IP_NF_MATCH_AH_ESP=y
CONFIG_IP_NF_MATCH_LENGTH=y
CONFIG_IP_NF_MATCH_TTL=y
CONFIG_IP_NF_MATCH_TCPMSS=y
CONFIG_IP_NF_MATCH_HELPER=y
CONFIG_IP_NF_MATCH_STATE=y
CONFIG_IP_NF_MATCH_CONNTRACK=y
CONFIG_IP_NF_MATCH_OWNER=y
# CONFIG_IP_NF_MATCH_ADDRTYPE is not set
# CONFIG_IP_NF_MATCH_REALM is not set
# CONFIG_IP_NF_MATCH_SCTP is not set
# CONFIG_IP_NF_MATCH_COMMENT is not set
# CONFIG_IP_NF_MATCH_HASHLIMIT is not set
CONFIG_IP_NF_FILTER=y
CONFIG_IP_NF_TARGET_REJECT=y
CONFIG_IP_NF_TARGET_LOG=y
CONFIG_IP_NF_TARGET_ULOG=y
CONFIG_IP_NF_TARGET_TCPMSS=y
CONFIG_IP_NF_NAT=y
CONFIG_IP_NF_NAT_NEEDED=y
CONFIG_IP_NF_TARGET_MASQUERADE=y
CONFIG_IP_NF_TARGET_REDIRECT=y
CONFIG_IP_NF_TARGET_NETMAP=y
CONFIG_IP_NF_TARGET_SAME=y
# CONFIG_IP_NF_NAT_SNMP_BASIC is not set
CONFIG_IP_NF_MANGLE=y
CONFIG_IP_NF_TARGET_TOS=y
CONFIG_IP_NF_TARGET_ECN=y
CONFIG_IP_NF_TARGET_DSCP=y
CONFIG_IP_NF_TARGET_MARK=y
CONFIG_IP_NF_TARGET_CLASSIFY=y
CONFIG_IP_NF_RAW=m
CONFIG_IP_NF_TARGET_NOTRACK=m
CONFIG_IP_NF_ARPTABLES=y
CONFIG_IP_NF_ARPFILTER=y
CONFIG_IP_NF_ARP_MANGLE=y

#
# SCTP Configuration (EXPERIMENTAL)
#
# CONFIG_IP_SCTP is not set
# CONFIG_ATM is not set
# CONFIG_BRIDGE is not set
# CONFIG_VLAN_8021Q is not set
# CONFIG_DECNET is not set
# CONFIG_LLC2 is not set
# CONFIG_IPX is not set
# CONFIG_ATALK is not set
# CONFIG_X25 is not set
# CONFIG_LAPB is not set
# CONFIG_NET_DIVERT is not set
# CONFIG_ECONET is not set
# CONFIG_WAN_ROUTER is not set

#
# QoS and/or fair queueing
#
# CONFIG_NET_SCHED is not set
# CONFIG_NET_CLS_ROUTE is not set

#
# Network testing
#
# CONFIG_NET_PKTGEN is not set
# CONFIG_NETPOLL is not set
# CONFIG_NET_POLL_CONTROLLER is not set
# CONFIG_HAMRADIO is not set
# CONFIG_IRDA is not set
CONFIG_BT=y
# CONFIG_BT_L2CAP is not set
# CONFIG_BT_SCO is not set

#
# Bluetooth device drivers
#
# CONFIG_BT_HCIUSB is not set
# CONFIG_BT_HCIUART is not set
# CONFIG_BT_HCIBCM203X is not set
# CONFIG_BT_HCIBPA10X is not set
# CONFIG_BT_HCIBFUSB is not set
# CONFIG_BT_HCIVHCI is not set
CONFIG_NETDEVICES=y
CONFIG_DUMMY=m
# CONFIG_BONDING is not set
# CONFIG_EQUALIZER is not set
# CONFIG_TUN is not set
# CONFIG_NET_SB1000 is not set

#
# ARCnet devices
#
# CONFIG_ARCNET is not set

#
# Ethernet (10 or 100Mbit)
#
CONFIG_NET_ETHERNET=y
CONFIG_MII=y
# CONFIG_HAPPYMEAL is not set
# CONFIG_SUNGEM is not set
# CONFIG_NET_VENDOR_3COM is not set

#
# Tulip family network device support
#
# CONFIG_NET_TULIP is not set
# CONFIG_HP100 is not set
CONFIG_NET_PCI=y
# CONFIG_PCNET32 is not set
# CONFIG_AMD8111_ETH is not set
# CONFIG_ADAPTEC_STARFIRE is not set
# CONFIG_B44 is not set
# CONFIG_FORCEDETH is not set
# CONFIG_DGRS is not set
# CONFIG_EEPRO100 is not set
# CONFIG_E100 is not set
# CONFIG_FEALNX is not set
# CONFIG_NATSEMI is not set
# CONFIG_NE2K_PCI is not set
# CONFIG_8139CP is not set
CONFIG_8139TOO=y
CONFIG_8139TOO_PIO=y
# CONFIG_8139TOO_TUNE_TWISTER is not set
# CONFIG_8139TOO_8129 is not set
# CONFIG_8139_OLD_RX_RESET is not set
# CONFIG_SIS900 is not set
# CONFIG_EPIC100 is not set
# CONFIG_SUNDANCE is not set
# CONFIG_TLAN is not set
# CONFIG_VIA_RHINE is not set

#
# Ethernet (1000 Mbit)
#
# CONFIG_ACENIC is not set
# CONFIG_DL2K is not set
# CONFIG_E1000 is not set
# CONFIG_NS83820 is not set
# CONFIG_HAMACHI is not set
# CONFIG_YELLOWFIN is not set
# CONFIG_R8169 is not set
# CONFIG_SKGE is not set
# CONFIG_SK98LIN is not set
# CONFIG_VIA_VELOCITY is not set
CONFIG_TIGON3=y

#
# Ethernet (10000 Mbit)
#
# CONFIG_IXGB is not set
CONFIG_S2IO=m
# CONFIG_S2IO_NAPI is not set
# CONFIG_2BUFF_MODE is not set

#
# Token Ring devices
#
# CONFIG_TR is not set

#
# Wireless LAN (non-hamradio)
#
CONFIG_NET_RADIO=y

#
# Obsolete Wireless cards support (pre-802.11)
#
# CONFIG_STRIP is not set

#
# Wireless 802.11b ISA/PCI cards support
#
# CONFIG_HERMES is not set
# CONFIG_ATMEL is not set

#
# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support
#
# CONFIG_PRISM54 is not set
CONFIG_NET_WIRELESS=y

#
# Wan interfaces
#
# CONFIG_WAN is not set
# CONFIG_FDDI is not set
# CONFIG_HIPPI is not set
# CONFIG_PLIP is not set
# CONFIG_PPP is not set
# CONFIG_SLIP is not set
# CONFIG_NET_FC is not set
# CONFIG_SHAPER is not set
# CONFIG_NETCONSOLE is not set

#
# ISDN subsystem
#
# CONFIG_ISDN is not set

#
# Telephony Support
#
# CONFIG_PHONE is not set

#
# Input device support
#
CONFIG_INPUT=y

#
# Userland interfaces
#
CONFIG_INPUT_MOUSEDEV=y
CONFIG_INPUT_MOUSEDEV_PSAUX=y
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
# CONFIG_INPUT_JOYDEV is not set
# CONFIG_INPUT_TSDEV is not set
# CONFIG_INPUT_EVDEV is not set
# CONFIG_INPUT_EVBUG is not set

#
# Input I/O drivers
#
# CONFIG_GAMEPORT is not set
CONFIG_SOUND_GAMEPORT=y
CONFIG_SERIO=y
CONFIG_SERIO_I8042=y
# CONFIG_SERIO_SERPORT is not set
# CONFIG_SERIO_CT82C710 is not set
# CONFIG_SERIO_PARKBD is not set
# CONFIG_SERIO_PCIPS2 is not set
CONFIG_SERIO_LIBPS2=y
# CONFIG_SERIO_RAW is not set

#
# Input Device Drivers
#
CONFIG_INPUT_KEYBOARD=y
CONFIG_KEYBOARD_ATKBD=y
# CONFIG_KEYBOARD_SUNKBD is not set
# CONFIG_KEYBOARD_LKKBD is not set
# CONFIG_KEYBOARD_XTKBD is not set
# CONFIG_KEYBOARD_NEWTON is not set
CONFIG_INPUT_MOUSE=y
CONFIG_MOUSE_PS2=y
CONFIG_MOUSE_SERIAL=y
# CONFIG_MOUSE_VSXXXAA is not set
# CONFIG_INPUT_JOYSTICK is not set
# CONFIG_INPUT_TOUCHSCREEN is not set
# CONFIG_INPUT_MISC is not set

#
# Character devices
#
CONFIG_VT=y
CONFIG_VT_CONSOLE=y
CONFIG_HW_CONSOLE=y
# CONFIG_SERIAL_NONSTANDARD is not set

#
# Serial drivers
#
CONFIG_SERIAL_8250=y
# CONFIG_SERIAL_8250_CONSOLE is not set
# CONFIG_SERIAL_8250_ACPI is not set
CONFIG_SERIAL_8250_NR_UARTS=4
# CONFIG_SERIAL_8250_EXTENDED is not set

#
# Non-8250 serial port support
#
CONFIG_SERIAL_CORE=y
CONFIG_UNIX98_PTYS=y
CONFIG_LEGACY_PTYS=y
CONFIG_LEGACY_PTY_COUNT=256
CONFIG_PRINTER=y
# CONFIG_LP_CONSOLE is not set
# CONFIG_PPDEV is not set
# CONFIG_TIPAR is not set

#
# IPMI
#
# CONFIG_IPMI_HANDLER is not set

#
# Watchdog Cards
#
# CONFIG_WATCHDOG is not set
# CONFIG_HW_RANDOM is not set
# CONFIG_NVRAM is not set
# CONFIG_RTC is not set
# CONFIG_GEN_RTC is not set
# CONFIG_R3964 is not set
# CONFIG_APPLICOM is not set
# CONFIG_SONYPI is not set

#
# Ftape, the floppy tape device driver
#
# CONFIG_FTAPE is not set
CONFIG_AGP=y
# CONFIG_AGP_ALI is not set
# CONFIG_AGP_ATI is not set
# CONFIG_AGP_AMD is not set
# CONFIG_AGP_AMD64 is not set
CONFIG_AGP_INTEL=y
CONFIG_AGP_INTEL_MCH=m
# CONFIG_AGP_NVIDIA is not set
# CONFIG_AGP_SIS is not set
# CONFIG_AGP_SWORKS is not set
# CONFIG_AGP_VIA is not set
# CONFIG_AGP_EFFICEON is not set
CONFIG_DRM=y
# CONFIG_DRM_TDFX is not set
# CONFIG_DRM_R128 is not set
# CONFIG_DRM_RADEON is not set
# CONFIG_DRM_I810 is not set
# CONFIG_DRM_I830 is not set
# CONFIG_DRM_I915 is not set
# CONFIG_DRM_MGA is not set
# CONFIG_DRM_SIS is not set
# CONFIG_MWAVE is not set
# CONFIG_RAW_DRIVER is not set
# CONFIG_HPET is not set
# CONFIG_HANGCHECK_TIMER is not set

#
# I2C support
#
# CONFIG_I2C is not set

#
# Dallas's 1-wire bus
#
# CONFIG_W1 is not set

#
# Misc devices
#
# CONFIG_IBM_ASM is not set

#
# Multimedia devices
#
# CONFIG_VIDEO_DEV is not set

#
# Digital Video Broadcasting Devices
#
# CONFIG_DVB is not set

#
# Graphics support
#
# CONFIG_FB is not set
# CONFIG_VIDEO_SELECT is not set

#
# Console display driver support
#
CONFIG_VGA_CONSOLE=y
CONFIG_DUMMY_CONSOLE=y

#
# Speakup console speech
#
# CONFIG_SPEAKUP is not set
CONFIG_SPEAKUP_DEFAULT="none"

#
# Sound
#
CONFIG_SOUND=y

#
# Advanced Linux Sound Architecture
#
CONFIG_SND=y
CONFIG_SND_TIMER=y
CONFIG_SND_PCM=y
CONFIG_SND_SEQUENCER=y
# CONFIG_SND_SEQ_DUMMY is not set
CONFIG_SND_OSSEMUL=y
CONFIG_SND_MIXER_OSS=y
CONFIG_SND_PCM_OSS=y
CONFIG_SND_SEQUENCER_OSS=y
# CONFIG_SND_VERBOSE_PRINTK is not set
# CONFIG_SND_DEBUG is not set

#
# Generic devices
#
# CONFIG_SND_DUMMY is not set
# CONFIG_SND_VIRMIDI is not set
# CONFIG_SND_MTPAV is not set
# CONFIG_SND_SERIAL_U16550 is not set
# CONFIG_SND_MPU401 is not set

#
# PCI devices
#
CONFIG_SND_AC97_CODEC=y
# CONFIG_SND_ALI5451 is not set
# CONFIG_SND_ATIIXP is not set
# CONFIG_SND_ATIIXP_MODEM is not set
# CONFIG_SND_AU8810 is not set
# CONFIG_SND_AU8820 is not set
# CONFIG_SND_AU8830 is not set
# CONFIG_SND_AZT3328 is not set
# CONFIG_SND_BT87X is not set
# CONFIG_SND_CS46XX is not set
# CONFIG_SND_CS4281 is not set
# CONFIG_SND_EMU10K1 is not set
# CONFIG_SND_EMU10K1X is not set
# CONFIG_SND_CA0106 is not set
# CONFIG_SND_KORG1212 is not set
# CONFIG_SND_MIXART is not set
# CONFIG_SND_NM256 is not set
# CONFIG_SND_RME32 is not set
# CONFIG_SND_RME96 is not set
# CONFIG_SND_RME9652 is not set
# CONFIG_SND_HDSP is not set
# CONFIG_SND_TRIDENT is not set
# CONFIG_SND_YMFPCI is not set
# CONFIG_SND_ALS4000 is not set
# CONFIG_SND_CMIPCI is not set
# CONFIG_SND_ENS1370 is not set
# CONFIG_SND_ENS1371 is not set
# CONFIG_SND_ES1938 is not set
# CONFIG_SND_ES1968 is not set
# CONFIG_SND_MAESTRO3 is not set
# CONFIG_SND_FM801 is not set
# CONFIG_SND_ICE1712 is not set
# CONFIG_SND_ICE1724 is not set
CONFIG_SND_INTEL8X0=y
# CONFIG_SND_INTEL8X0M is not set
# CONFIG_SND_SONICVIBES is not set
# CONFIG_SND_VIA82XX is not set
# CONFIG_SND_VIA82XX_MODEM is not set
# CONFIG_SND_VX222 is not set

#
# USB devices
#
# CONFIG_SND_USB_AUDIO is not set
# CONFIG_SND_USB_USX2Y is not set

#
# Open Sound System
#
# CONFIG_SOUND_PRIME is not set

#
# USB support
#
CONFIG_USB=y
# CONFIG_USB_DEBUG is not set

#
# Miscellaneous USB options
#
CONFIG_USB_DEVICEFS=y
# CONFIG_USB_BANDWIDTH is not set
# CONFIG_USB_DYNAMIC_MINORS is not set
# CONFIG_USB_SUSPEND is not set
# CONFIG_USB_OTG is not set
CONFIG_USB_ARCH_HAS_HCD=y
CONFIG_USB_ARCH_HAS_OHCI=y

#
# USB Host Controller Drivers
#
CONFIG_USB_EHCI_HCD=y
# CONFIG_USB_EHCI_SPLIT_ISO is not set
# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
# CONFIG_USB_OHCI_HCD is not set
CONFIG_USB_UHCI_HCD=y
# CONFIG_USB_SL811_HCD is not set

#
# USB Device Class drivers
#
# CONFIG_USB_AUDIO is not set

#
# USB Bluetooth TTY can only be used with disabled Bluetooth subsystem
#
# CONFIG_USB_MIDI is not set
# CONFIG_USB_ACM is not set
CONFIG_USB_PRINTER=y

#
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
#
CONFIG_USB_STORAGE=y
# CONFIG_USB_STORAGE_DEBUG is not set
# CONFIG_USB_STORAGE_RW_DETECT is not set
# CONFIG_USB_STORAGE_DATAFAB is not set
# CONFIG_USB_STORAGE_FREECOM is not set
# CONFIG_USB_STORAGE_ISD200 is not set
# CONFIG_USB_STORAGE_DPCM is not set
# CONFIG_USB_STORAGE_HP8200e is not set
# CONFIG_USB_STORAGE_SDDR09 is not set
# CONFIG_USB_STORAGE_SDDR55 is not set
# CONFIG_USB_STORAGE_JUMPSHOT is not set

#
# USB Input Devices
#
CONFIG_USB_HID=y
CONFIG_USB_HIDINPUT=y
# CONFIG_HID_FF is not set
# CONFIG_USB_HIDDEV is not set
# CONFIG_USB_AIPTEK is not set
# CONFIG_USB_WACOM is not set
# CONFIG_USB_KBTAB is not set
# CONFIG_USB_POWERMATE is not set
# CONFIG_USB_MTOUCH is not set
# CONFIG_USB_EGALAX is not set
# CONFIG_USB_XPAD is not set
# CONFIG_USB_ATI_REMOTE is not set

#
# USB Imaging devices
#
# CONFIG_USB_MDC800 is not set
# CONFIG_USB_MICROTEK is not set

#
# USB Multimedia devices
#
# CONFIG_USB_DABUSB is not set

#
# Video4Linux support is needed for USB Multimedia device support
#

#
# USB Network Adapters
#
# CONFIG_USB_CATC is not set
# CONFIG_USB_KAWETH is not set
# CONFIG_USB_PEGASUS is not set
# CONFIG_USB_RTL8150 is not set
# CONFIG_USB_USBNET is not set

#
# USB port drivers
#
# CONFIG_USB_USS720 is not set

#
# USB Serial Converter support
#
# CONFIG_USB_SERIAL is not set

#
# USB Miscellaneous drivers
#
# CONFIG_USB_EMI62 is not set
# CONFIG_USB_EMI26 is not set
# CONFIG_USB_AUERSWALD is not set
# CONFIG_USB_RIO500 is not set
# CONFIG_USB_LEGOTOWER is not set
# CONFIG_USB_LCD is not set
# CONFIG_USB_LED is not set
CONFIG_USB_CYTHERM=m
# CONFIG_USB_PHIDGETKIT is not set
CONFIG_USB_PHIDGETSERVO=m
# CONFIG_USB_IDMOUSE is not set
# CONFIG_USB_TEST is not set

#
# USB ATM/DSL drivers
#

#
# USB Gadget Support
#
# CONFIG_USB_GADGET is not set

#
# MMC/SD Card support
#
# CONFIG_MMC is not set

#
# InfiniBand support
#
# CONFIG_INFINIBAND is not set

#
# File systems
#
CONFIG_EXT2_FS=y
# CONFIG_EXT2_FS_XATTR is not set
CONFIG_EXT3_FS=y
CONFIG_EXT3_FS_XATTR=y
# CONFIG_EXT3_FS_POSIX_ACL is not set
# CONFIG_EXT3_FS_SECURITY is not set
CONFIG_JBD=y
# CONFIG_JBD_DEBUG is not set
CONFIG_FS_MBCACHE=y
CONFIG_REISERFS_FS=y
# CONFIG_REISERFS_CHECK is not set
# CONFIG_REISERFS_PROC_INFO is not set
# CONFIG_REISERFS_FS_XATTR is not set
# CONFIG_JFS_FS is not set

#
# XFS support
#
# CONFIG_XFS_FS is not set
# CONFIG_MINIX_FS is not set
# CONFIG_ROMFS_FS is not set
CONFIG_INOTIFY=y
# CONFIG_QUOTA is not set
CONFIG_DNOTIFY=y
# CONFIG_AUTOFS_FS is not set
CONFIG_AUTOFS4_FS=y

#
# CD-ROM/DVD Filesystems
#
CONFIG_ISO9660_FS=y
CONFIG_JOLIET=y
# CONFIG_ZISOFS is not set
CONFIG_UDF_FS=y
CONFIG_UDF_NLS=y

#
# DOS/FAT/NT Filesystems
#
CONFIG_FAT_FS=y
CONFIG_MSDOS_FS=y
CONFIG_VFAT_FS=y
CONFIG_FAT_DEFAULT_CODEPAGE=437
CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
# CONFIG_NTFS_FS is not set

#
# Pseudo filesystems
#
CONFIG_PROC_FS=y
CONFIG_PROC_KCORE=y
CONFIG_SYSFS=y
CONFIG_DEVFS_FS=y
# CONFIG_DEVFS_MOUNT is not set
# CONFIG_DEVFS_DEBUG is not set
CONFIG_DEVPTS_FS_XATTR=y
# CONFIG_DEVPTS_FS_SECURITY is not set
CONFIG_TMPFS=y
# CONFIG_TMPFS_XATTR is not set
# CONFIG_HUGETLBFS is not set
# CONFIG_HUGETLB_PAGE is not set
CONFIG_RAMFS=y

#
# Miscellaneous filesystems
#
# CONFIG_ADFS_FS is not set
# CONFIG_AFFS_FS is not set
# CONFIG_HFS_FS is not set
# CONFIG_HFSPLUS_FS is not set
# CONFIG_BEFS_FS is not set
# CONFIG_BFS_FS is not set
# CONFIG_EFS_FS is not set
# CONFIG_CRAMFS is not set
CONFIG_SQUASHFS=y
# CONFIG_VXFS_FS is not set
# CONFIG_HPFS_FS is not set
# CONFIG_QNX4FS_FS is not set
# CONFIG_SYSV_FS is not set
# CONFIG_UFS_FS is not set

#
# Network File Systems
#
CONFIG_NFS_FS=y
# CONFIG_NFS_V3 is not set
# CONFIG_NFS_V4 is not set
# CONFIG_NFS_DIRECTIO is not set
CONFIG_NFSD=y
# CONFIG_NFSD_V3 is not set
CONFIG_NFSD_TCP=y
CONFIG_LOCKD=y
CONFIG_EXPORTFS=y
CONFIG_SUNRPC=y
# CONFIG_RPCSEC_GSS_KRB5 is not set
# CONFIG_RPCSEC_GSS_SPKM3 is not set
# CONFIG_SMB_FS is not set
# CONFIG_CIFS is not set
# CONFIG_NCP_FS is not set
# CONFIG_CODA_FS is not set
# CONFIG_AFS_FS is not set

#
# Partition Types
#
# CONFIG_PARTITION_ADVANCED is not set
CONFIG_MSDOS_PARTITION=y

#
# Native Language Support
#
CONFIG_NLS=y
CONFIG_NLS_DEFAULT="iso8859-1"
CONFIG_NLS_CODEPAGE_437=y
# CONFIG_NLS_CODEPAGE_737 is not set
# CONFIG_NLS_CODEPAGE_775 is not set
# CONFIG_NLS_CODEPAGE_850 is not set
# CONFIG_NLS_CODEPAGE_852 is not set
# CONFIG_NLS_CODEPAGE_855 is not set
# CONFIG_NLS_CODEPAGE_857 is not set
# CONFIG_NLS_CODEPAGE_860 is not set
# CONFIG_NLS_CODEPAGE_861 is not set
# CONFIG_NLS_CODEPAGE_862 is not set
# CONFIG_NLS_CODEPAGE_863 is not set
# CONFIG_NLS_CODEPAGE_864 is not set
# CONFIG_NLS_CODEPAGE_865 is not set
# CONFIG_NLS_CODEPAGE_866 is not set
# CONFIG_NLS_CODEPAGE_869 is not set
# CONFIG_NLS_CODEPAGE_936 is not set
# CONFIG_NLS_CODEPAGE_950 is not set
# CONFIG_NLS_CODEPAGE_932 is not set
# CONFIG_NLS_CODEPAGE_949 is not set
# CONFIG_NLS_CODEPAGE_874 is not set
# CONFIG_NLS_ISO8859_8 is not set
# CONFIG_NLS_CODEPAGE_1250 is not set
# CONFIG_NLS_CODEPAGE_1251 is not set
# CONFIG_NLS_ASCII is not set
CONFIG_NLS_ISO8859_1=y
# CONFIG_NLS_ISO8859_2 is not set
# CONFIG_NLS_ISO8859_3 is not set
# CONFIG_NLS_ISO8859_4 is not set
# CONFIG_NLS_ISO8859_5 is not set
# CONFIG_NLS_ISO8859_6 is not set
# CONFIG_NLS_ISO8859_7 is not set
# CONFIG_NLS_ISO8859_9 is not set
# CONFIG_NLS_ISO8859_13 is not set
# CONFIG_NLS_ISO8859_14 is not set
# CONFIG_NLS_ISO8859_15 is not set
# CONFIG_NLS_KOI8_R is not set
# CONFIG_NLS_KOI8_U is not set
# CONFIG_NLS_UTF8 is not set

#
# Profiling support
#
# CONFIG_PROFILING is not set

#
# Kernel hacking
#
# CONFIG_DEBUG_KERNEL is not set
CONFIG_DEBUG_PREEMPT=y
CONFIG_DEBUG_BUGVERBOSE=y
# CONFIG_FRAME_POINTER is not set
CONFIG_EARLY_PRINTK=y
# CONFIG_4KSTACKS is not set

#
# Security options
#
# CONFIG_KEYS is not set
# CONFIG_SECURITY is not set

#
# Cryptographic options
#
# CONFIG_CRYPTO is not set

#
# Hardware crypto devices
#

#
# Library routines
#
# CONFIG_CRC_CCITT is not set
CONFIG_CRC32=y
CONFIG_LIBCRC32C=m
CONFIG_ZLIB_INFLATE=y
CONFIG_GENERIC_HARDIRQS=y
CONFIG_GENERIC_IRQ_PROBE=y
CONFIG_X86_BIOS_REBOOT=y
CONFIG_PC=y

Thursday, March 24, 2005

Initial Lincvs hack

So I want to see all files from any given directory, recursively. Very effecient commitals that way, and it's very handy. SmartCVS does it nicely. However, I like a lot of things about LinCVS. And *it* is open source. So, rather than fork out $150 for the prof version just to get the feature I want I'm going to try and hack my way through it. If I'm successful, I'll make it available for others.

So far, I've found where the function that handles the directory change events, cvslistview.cpp: CvsDirListView::selectionChanged() . Now I just need to step through the rest of this function to determine where the files for the pane are being handled. And, theoretically, all I need to do is recurse for all the files underneath and pass back an array or some collection--just need to find out where to do this. Unfortunately I've been unsuccessful in attaching a debugger and even
getting to this function, but I did place some cout statements. Gonna take a lot of work if I have to write scaffolding for this whole endeavor, especially since the make takes almost 10 minutes on my 1.7GHZ Pentium M. Thus ends the first evening of work.

Monday, March 21, 2005

CVS, Eclipse is dead

It's hosed on me one too many times now. Best runner-up is LinCVS with Meld as the diff app. Problem is that LinCVS, only shows directory specific files. Thus, I cannot see an entire view of all files--which is extremely handy for batch CVS operations. SmartCVS has this and it's very handy. Trade off is that SmartCVS Profe$$ional (purchase required)reports server changes, where LinCVS shows them for free. So, now to figure out how to recursively show all the files in a directoryin LinCVS and I'll be very happy.

Friday, March 18, 2005

rock, rock on

gnotepad+, it's what I've been looking for--it loads lightning fast,
is a simple text editor and is fairly customizable. Yeah it's a bit
dated, but it's fast and solid.

Thursday, March 17, 2005

Ruby script for generating Jane entries

The first post of this is *extremely* scoped for what I'm doing at work. So, while it will work to build Jane library entries for everything in your maven repository, it may take some minor tweaking to do only that. Hand in hand with the Jane Stackoverflow fix we made, this is awesome with CodeAid--complete the code from the source.


#!/usr/bin/ruby
require 'find'
#-------------------------------------------------------------------------------
# Russ 17 Mar 2005
# parse all src,test,and target/leaflet/leafmd/domain directories and add
# to Jane libraries. Optional entire Maven repository library creation.
#
# script is *really* rough, but it works--could be polished up
# apologies to the Windows guys that I hard-coded the path separators instead
# of File::SEPARATOR
#
# lastly, it's probably a good idea to increase the Jedit heap size for
# performance benefits (/usr/bin/jedit). Also, for this to work nicely, you'll need
# Norm's build of Jane.
#-------------------------------------------------------------------------------


#INSTRUCTIONS:
# change the following as necessary for your system
Jane_Libraries="/home/russ/.jedit/libraries"
Unity_Home = "/home/russ/UnityHome"
Leaf_Home = "/home/russ/LeafHome"
Maven_Repository = "/home/russ/.maven/repository"
#leave the rest of the script alone ;)

#---------------Begin globals and class/function defs--------------------------#
$javaSrcDir = []
$javaSrcName = []
$javaJar = []
$javaJarName = []
$cntr = 0

#thanks to Massimiliano Mirra for this beauty below
class Dir
def Dir.visit(dir = '.', files_first = false, &block)
if files_first
paths = []
Find.find(dir) { |path| paths << path }
paths.reverse_each {|path| yield path}
else
Find.find(dir, &block)
end
end

def Dir.rm_rf(dir)
Dir.visit(dir, true) do |path|
if FileTest.directory?(path)
Dir.unlink(path)
else
File.unlink(path)
end
end
end
end

def addLeafSrcsToJane(dirPath)
aDirectory = Dir.open(dirPath)
begin
for file in aDirectory
next if file == "." or file== ".."
if file=="src" then
puts "Found a source " + file
else
File.directory?(file)
temp = aDirectory.path + "/" + file
if File.directory?(temp) then
secondDir = Dir.open(temp)
if File.directory?(secondDir.path + "/src") then
srcBaseDir = Dir.open(secondDir.path + "/src")
temp2 = srcBaseDir.path + "/java"
if File.directory?(temp2) then
$javaSrcDir<<Dir.open(temp2).path
$javaSrcName<<file
puts "added " + Dir.open(temp2).path
end
temp3 = srcBaseDir.path + "/test"
if File.directory?(temp3) then
$javaSrcDir<<Dir.open(temp3).path
$javaSrcName<<file + " test src"
puts "added " + Dir.open(temp3).path
end
end
leafmd = secondDir.path + "/target/leaflet/leafmd/domain"
if File.directory?(leafmd) then
$javaSrcDir<<Dir.open(leafmd).path
$javaSrcName<<file + " leaf domain"
puts "added " + Dir.open(leafmd).path
end
end
end
end
end
end
def addMavenJarsToJane(mavenRepository)
mavenRepoDir = Dir.open(mavenRepository)
puts mavenRepoDir.path
begin
for projDir in mavenRepoDir
next if projDir == "." or projDir== ".."

tempJarDir = mavenRepoDir.path + "/" + projDir +"/jars"
puts tempJarDir
if File.directory?(tempJarDir) then
jarDir = Dir.open(tempJarDir)
#if File.directory?(jarDir.path) then
for file in jarDir
next if file =="." or file == ".." or file.to_s.index("md5")!=nil or file.to_s.index("rar")!=nil
#puts "found jar #{File.expand_path(file)}"
#puts file.to_s
$javaJar<<jarDir.path + "/" + file
puts jarDir.path + "/" + file
$javaJarName<<file
end
#end
end
end
end


end
#-----------------End globals and class/function defs--------------------------#
addMavenJarsToJane(Maven_Repository)
puts "This script will wax your current Jane libraries, are you sure you want to continue? (yes | no)"
gets
if (($_<=> "yes")==1) then

Dir.rm_rf(Jane_Libraries)
Dir.mkdir(Jane_Libraries)
addLeafSrcsToJane(Unity_Home)
addLeafSrcsToJane(Leaf_Home)

f = File.open(Jane_Libraries + "/libraries.properties","w")
cntr2 = 0
for el in $javaSrcDir
f.puts "library.#{cntr2}.class-path="
f.puts "library.#{cntr2}.parse-type=-1"
f.puts "library.#{cntr2}.cache-type=jane.cache.SimpleClassCache"
f.puts "library.#{cntr2}.doc-path="
f.puts "library.#{cntr2}.name=#{$javaSrcName[cntr2]}"
f.puts "library.#{cntr2}.source-path=#{el}"
tempstr = Jane_Libraries + "/" + $javaSrcName[cntr2]
Dir.mkdir(tempstr)
cntr2+=1
end
puts "Add Maven repository jars as classpaths ?"
gets
if (($_<=> "yes")==1) then
addMavenJarsToJane("/home/russ/.maven/repository")
cntr2 = 0
for el in $javaJar
tempstr = Jane_Libraries + "/" + $javaJarName[cntr2] + "dir"
name = $javaJarName[cntr2]
next if File.directory?(tempstr)
Dir.mkdir(tempstr)
f.puts "library.#{cntr2}.class-path=#{el}"
f.puts "library.#{cntr2}.parse-type=-1"
f.puts "library.#{cntr2}.cache-type=jane.cache.SimpleClassCache"
f.puts "library.#{cntr2}.doc-path="
f.puts "library.#{cntr2}.name=#{name}"
f.puts "library.#{cntr2}.source-path="
cntr2+=1
end
end
f.close
else
puts "operation terminated"
end


Two factor authentication solves nothing

Very enlightening, a new method would be helpful:

http://www.schneier.com/blog/archives/2005/03/the_failure_of.html
March 15, 2005
The Failure of Two-Factor Authentication

Two-factor authentication isn't our savior. It won't defend against phishing. It's not going to prevent identity theft. It's not going to secure online accounts from fraudulent transactions. It solves the security problems we had ten years ago, not the security problems we have today.

The problem with passwords is that they're too easy to lose control of. People give them to other people. People write them down, and other people read them. People send them in e-mail, and that e-mail is intercepted. People use them to log into remote servers, and their communications are eavesdropped on. They're also easy to guess. And once any of that happens, the password no longer works as an authentication token because you can't be sure who is typing that password in.

Two-factor authentication mitigates this problem. If your password includes a number that changes every minute, or a unique reply to a random challenge, then it's harder for someone else to intercept. You can't write down the ever-changing part. An intercepted password won't be good the next time it's needed. And a two-factor password is harder to guess. Sure, someone can always give his password and token to his secretary, but no solution is foolproof.

These tokens have been around for at least two decades, but it's only recently that they have gotten mass-market attention. AOL is rolling them out. Some banks are issuing them to customers, and even more are talking about doing it. It seems that corporations are finally waking up to the fact that passwords don't provide adequate security, and are hoping that two-factor authentication will fix their problems.

Unfortunately, the nature of attacks has changed over those two decades. Back then, the threats were all passive: eavesdropping and offline password guessing. Today, the threats are more active: phishing and Trojan horses.

Here are two new active attacks we're starting to see:

* Man-in-the-Middle attack. An attacker puts up a fake bank website and entices user to that website. User types in his password, and the attacker in turn uses it to access the bank's real website. Done right, the user will never realize that he isn't at the bank's website. Then the attacker either disconnects the user and makes any fraudulent transactions he wants, or passes along the user's banking transactions while making his own transactions at the same time.

* Trojan attack. Attacker gets Trojan installed on user's computer. When user logs into his bank's website, the attacker piggybacks on that session via the Trojan to make any fraudulent transaction he wants.

See how two-factor authentication doesn't solve anything? In the first case, the attacker can pass the ever-changing part of the password to the bank along with the never-changing part. And in the second case, the attacker is relying on the user to log in.

The real threat is fraud due to impersonation, and the tactics of impersonation will change in response to the defenses. Two-factor authentication will force criminals to modify their tactics, that's all.

Recently I've seen examples of two-factor authentication using two different communications paths: call it "two-channel authentication." One bank sends a challenge to the user's cell phone via SMS and expects a reply via SMS. If you assume that all your customers have cell phones, then this results in a two-factor authentication process without extra hardware. And even better, the second authentication piece goes over a different communications channel than the first; eavesdropping is much, much harder.

But in this new world of active attacks, no one cares. An attacker using a man-in-the-middle attack is happy to have the user deal with the SMS portion of the log-in, since he can't do it himself. And a Trojan attacker doesn't care, because he's relying on the user to log in anyway.

Two-factor authentication is not useless. It works for local login, and it works within some corporate networks. But it won't work for remote authentication over the Internet. I predict that banks and other financial institutions will spend millions outfitting their users with two-factor authentication tokens. Early adopters of this technology may very well experience a significant drop in fraud for a while as attackers move to easier targets, but in the end there will be a negligible drop in the amount of fraud and identity theft.

This essay will appear in the April issue of Communications of the ACM.

Belkin wireless routing and bridging

A couple weeks back I purchased a Belkgin Wireless G router (F5D7230-4) for $30 after a $30 rebate from Staples (which arrived in 3 weeks!). My neighbor purchased an access point (F5D7130). Last night we enabled wireless bridging and it worked beautifully! He can connect through the port on the AP and receive a dhcp assigned ip address, while the wireless is also activated/connected.

Here's the hitch. We followed the directions in the booklet, and double-checked everything without it working correctly--that is, it wasn't bridging the signal. The fix was in the Wireless MAC menu and we unchecked the box that indicates "Enable...blah blah blah...for ONLY these MAC addresses". For some reason it wasn't working when we had the MACs specified, but it does now that we turned of the restriction. Cool stuff. Next thing to try is moving the router another 30 feet away to see how strong his signal is through his AP.

Friday, March 11, 2005

ssh remoting

[from ~/.ssh]
ssh-keygen -t rsa
mv id_rsa identity
mv id_rsa.pub identity.pub
scp identity.pub rollinsrc@10.xx.xx.xx:/home/rollinsrc/.ssh/authorized_keys
[done]

Friday, March 04, 2005

Maven testing

ensure that:

maven.test.skip=false

and in the project.xml:



**/TestAllWhateverSuite.java

and

TestAllWhateverSuite is located here:

/src/test/com/whatever/

Thursday, March 03, 2005

getch() -->getchar()

First run at porting mingw (school) projects tonight so I can develop in Linux. To my astonishment and gratification, the *only* change needed was to wax the conio.h include. And, without including TERMIO.h, I'm able to use getchar() instead of getch(). Beautiful.

Using Anjuta, and so far enjoying it.

Wednesday, March 02, 2005

best airfare price comparisons

http://beta.itasoftware.com/