BibleGateway.com Verse Of The Day
Friday, October 17, 2008
A Website For Everything
Monday, September 29, 2008
The Chicken Nest Boxes Are Finally Done
Below is a photo of the completed nest box right inside the coop. It's a double-seater, which should be plenty since I only have 4 hens left. I put a hook on the bottom to hand the waterer from as well. I'm hoping the water won't get as nasty if it's hanging instead of sitting on the ground.
The design is fairly basic -- 2 nests with a perch on the front and a hinged top to ease egg gathering. I built the whole thing from various wood I had laying around the barn: some 2x3's, 2x2's, 1x12's, and a half-sheet of plywood. The only thing I purchased especially for this box was the set of hinges.
Below is a picture of the nearly completed nest box in my workshop. Here I'm demonstrating the hinged top and making sure the sizing is right -- notice the Blue Araucana hanging out in there trying tofigure out what's going on.
Once I moved this into the coop, I placed a small smooth rock in one side hoping it would look enough like an egg to let them know what the thing is for.
Yesterday I went in to check, and the rock was moved aside, and a nice brown egg was laying there.
Overall I would have to say I am pleased with the nest box. It took longer to build than I was hoping, but that's mostly because other things kept coming up. I could have purchased pre-built nest boxes, but what fun is that? This was a lot of fun to build, and finding my first egg in there made it all worthwhile.
Wednesday, September 17, 2008
You've Got Mail
Thursday, September 04, 2008
Error 2 (net::ERR_FAILED): Unknown error.
But once I got home and installed it on my laptop (XP home), every page I go to gives me an error saying the webpage is not available. Firefox and IE work fine, my firewall settings are to allow Chrome to access, everythign looks good. I reinstalled with no luck, I disabled my firewall, no luck.
So I installed on my desktop (XP as well), and same thing. I can get to the main Google page but cannot search. I got to Microsoft's homepage, but can't go anywhere from there. Same thing, where Firefox and IE work fine.
Several issues we posted on Google Code site for this error so it's not just in my imagination, here are a few samples (search for error msg, there were about 10-12 when I posted this)....
- http://code.google.com/p/chromium/issues/detail?id=89
- http://code.google.com/p/chromium/issues/detail?id=503
I guess it is a beta, so instead of whining I will just stop using it until the next version comes out.
This webpage is not available.
The webpage at http://www.google.com/chrome might be temporarily down or it may have moved permanently to a new web address.
More information on this errorBelow is the original error message
Error 2 (net::ERR_FAILED): Unknown error.Below is the original error message
Error 2 (net::ERR_FAILED): Unknown error.
Wednesday, September 03, 2008
Google Chrome versus Hype
Well, everybody in the online world seems to be writing about Google Chrome browser. Lots of hype, both good and bad. It's going to kill of Firefox and Internet Explorer, it's the final nail in the coffin for Microsoft, it's buggy, it's evil, it's great, it's just a beta, it's the next big thing, it will fizzle out and nobody will care about it, etc.
- It has some nice features, some of which are admittedly borrowed from other browsers. They are nice, but not enough to make me switch, not nice enough to make Microsoft tremble in fear.
- It is lacking some features of other browsers that I have come to rely on, and for that reason it's not "replacing" my other browsers any time soon (or ever).
- Viewing XML and XSL files -- they show up blank or with some text here and there. Basically it tries to treat them like HTML and ignores most of the tags.
- Sidebar - I have been using sidebar for the menu panel of my Bookmarks Launcher+ app. (shameless plug)
- RSS support, e.g. Firefox's live bookmarks feature
- Plugins, especially 'Firebug'.
- It seems pretty zippy, but speed wasn't an issue with my other browsers, so not sure this one will make it "win".
- Some of the stuff was a little odd to get used to at first, e.g. lack of menu bar or title bar,lack of bookmarks menu (unless you check the "Always show bookmarks bar" option under the wrench icon.
- The "New Tab" window is kind of neat once you get used to it -- the lack of bookmarks menu above is actually right there when you open a new tab, along side thumbnails of most often visited sites, and a list of recently closed tabs, and ability to search your history.
- Read some reports of the back button not working. It's been working for me. Even still, it is a beta, there will be bugs.
- I like the idea of each tab being a separate process in case one gets hung up. I have had that problem a lot with Firefox, especially when trying to open PDF's or long loading pages. To that end, the Task Manager window and the info for nerds link is kind of cool.
Monday, August 18, 2008
Simple JSP To List Java JVM Environment
I'm sure every Java developer has written similar code at some point, so I won't claim it's original, unique, or ingenious. But if you find it useful, go ahead and use it instead of writing another.
Wednesday, July 16, 2008
Making Your JVM Trust Those SSL Certificates
So the second step for me was to import them so my JVM(s) would recognize the certificate as "trusted".
To get your JVM to trust the certificate, you import it into your keystore using the keytool executable (found in your JDK bin directory):
[jboss@j2apptest01 bin]$ ./keytool -import -alias SomeWebserviceName -file ~/SomeCertificateFileName.CERIf the keystore does not exist yet, the tool will prompt you to enter a keystore password. Remember that password, as you will need to use it to import new certificates or export or view current ones.
It will then display all the keys and other info about the certificate and ask you to confirm that you really want to import. You will want to verify the keys match up to what you think you are importing, of course. Then type "yes" and it should tell you the certificate was added.
After that, our calls to the web service started to ork again, like magic.
Tuesday, July 15, 2008
Saving SSL Certificates From A Website
Tuesday, June 17, 2008
Redneck Father's Day 2008
My father's day gift? 250 rounds of 9mm ammo. Perfect!
I have to give credit to my sister-in-law Jen for taking the picture. She got it just as I shot so there is a smoke cloud coming out the barrel, the action is still cycling, and if you look where I circled, the casing is flying through the air.
The day starts off like any other Sunday, with a lovely breakfast (Paula made the eggs and bacon, Raina made me toast--and lot's of it), and then going to church. Then we go to Uncle Greg's house for some brunch.
Then home so my brother-in-law and family could come over. He brought some clays, his 12 gauge and his 9mm. I brought out my XD-9 and Paula's 20 gauge Benelli. I'd say we probably only went through a few boxes of shotgun shells, but probably at least 300 rounds of 9mm.
Then we came back to house to eat grilled deer meat and slow roasted prime rib, and had some beers.
Many rounds of ammo were fired in the making of this Father's Day, and there was no shortage of meat either. Let me show you where to put that ugly necktie!
Tuesday, June 10, 2008
Three Baby Geese
Sunday, May 18, 2008
Jboss SQL Deployer
It consists of a class implementing java.lang.Runnable (a Thread) that wakes up every 20 seconds or so and scans a directory for any new SQL files. Of course there is also a class implementing java.io.FileFilter to look for just SQL scripts. To turn this into a JMX service, I wrote a simple BeanShell wrapper to drop into the deploy directory.
Once a SQL file is found, the code assumes the first line will contain the DataSource JNDI name, so it knows what database to connect to. Then it currently assumes the rest of the file is one query. The query results are formatted and dumped to STDOUT.
To make this truly useful, I will have to make it accept updates as well as queries, and parse the file looking for multiple SQL statements instead of assuming it is just one. Other than those limitations, it works great with the few tests I have done so far. I have been testing under Jboss 4.0.3, but this should work with any version of Jboss with the BSHDeployer.
SqlFileScanner.java
SqlFileFilter.java
sqldeployer.bsh
Why would you use this? That's always a good question to ask, and this time I have an answer besides "because you can".
- Running ad hoc queries right from your app server, using the same Jboss DataSource bindings your applications are using, and from the same server your apps are running, can be very helpful in troubleshooting issues.
- Let's say you use Realms instead of username/password in the DataSource XML descriptor, for security reasons. Now you can troubleshoot database issues as that user even without knowing the DB username and password.
- Set up simple reporting jobs without needing an Oracle client installed on the machine -- run them right from Jboss.
I think I may create a new open source project to house this as well as all the other Java "odds and ends" I have written over the years, like some of the code generators, MQ tools, servlet filters, JSP tags, etc. The hardest part will probably be coming up with a meaningful project name -- who wants to download and install "RobbsRandomJavaCrap.jar"?
Tuesday, May 13, 2008
The Wait Is Over
So the first two days of having our Springfield XD-9, we fired about 170 rounds of ammo through it. That thing is really fun to shoot, but it could start to get expensive when you tear through a magazine in about 30-40 seconds.
I'm loving the XD. I like the extra safety features like the grip safety and split trigger, the cocked indicator and the chambered round indicator. And on the range, the gun shoots very nicely-- comfortable to grip, low recoil, fast follow-up shots, no jamming or misfires. The XD is also extremely easy to take down and put back together without any tools. And while a lot of handguns have a reversible magazine release, the XD simply has a magazine release on both sides -- no need to change anything. It also has a built-in accessory rail for tactical flashlights or laser sights if you so choose.
The XD came with a plastic carrying case, holster, 2 magazines, a speed loader, magazine holster that holds 2 magazines, cleaning brush, and a gun lock. Gander Mountain threw in another gun lock and a "gun sock".
My decision came down between the Springfield XD or the Beretta PX4 Storm, and I can honestly say I don't regret my decision at all. The Beretta is a nice gun, but if I were to buy another handgun, I would get another XD in a heartbeat.
Monday, May 12, 2008
Homesteader's Delight
If you are a small land holder and would like a small number of birds but a great variety, this is the assortment you've been waiting for. We will send you 10 Brown Egg Laying Chickens (female), 2 Ducklings (straight run), 2 Goslings (straight run), and 2 Turkeys (straight run). Our choice of variety of all the above.The variety should be interesting. They should be arriving the week of May 19th. Time to get that coop cleaned out!
Thursday, May 01, 2008
Some Old-School JAM and JPL Tips
I was cleaning out the barn and found a CD of some old code and documents I had written at an old job, kind of a "portfolio" CD if you will. We used JAM to build Motif screens.
JAM let you visually build your screens, and had it's own procedural programming language, JPL (JAM Programming Language). JAM came with the necessary C code to handle launching of the screens and handling events. You could write your own custom C code to be called from the screens, or write your code in the JPL file for the screen, or a combination of both. One nice thing is you could write SQL code right inline with the rest of your JPL (just prepend the keyword "sql") and everything was taken care of, even down to binding the result set to variables.
It's not exactly cutting edge technology now, but I know it is still in use by at least a few companies. This is not a tutorial for non-JAMsters, but rather a collection of troubleshooting tips I had taken note of. Maybe this could be of use to someone just inheriting legacy apps, or who knows when I might run into JAM again. Yuck!
For reference, these tips are mostly for JAM 5 and 7, but they may be applicable for other versions as well.
SELECT 1 FROM table... | This is often done to see if a record meeting your criteria (where clause) exists in the table. Doing this from a JAM screen (at least in Jam 5) will produce a @dmrowcount of 0 (zero), even if there are records in the table meeting the criteria. There are two alternatives within JAM to get the same information: 1. SELECT COUNT(*) temp_var FROM table... 2. SELECT column temp_var FROM table... |
SELECT column FROM table | This one can be tricky. If there is no JAM variable with the same name as the the selected columns, then JAM will create those variables and put the results of the query in those variables. If the variables do exist already, JAM will overwrite the values with the results of the query, even when the query returns nothing (it will essentially clear the variables). |
Mixed Case Variables | Mixed case variables can be a real problem with JAM, and the error messages are not intuitive enough to let you know what the real problem is. Keep tihs in mind when you can’t figure out some quirky behaviour, and all the other logic and syntax is proper. |
Changes in screen file don’t seem to take effect | Check the local directory you are running from. JAM will use screen, JPL, and dictionary files fro mthe current directory before checking in the SMPATH, regardless of what the SMPATH is set to. Check the data dictionary. The screen fields and variables can be stored in here, as well as in the screen definition file. Data dictionary tends to overwrite local (screen) vars. |
Some Useful environment Vars | Most of the relevant environment variables start with SM, e.g. SMVARS, SMPATH |
- Also worth noting is that while it might make sense that they would just make use of the underlying Motif widgets, in some cases that was not the case. Simple text boxes for instance would not work with bi-directional Hebrew whereas pure Motif screens did. We had to have JYACC / Prolifics issue a patch for us before we could release to an Israeli customer.
- There were also issues with some characters in the Turkish (ISO-8859-9) character set. Their database layer simply could handle it for some reason. Wouldn't bring back results, wouldn't update, and yet We ended up having to write our own generic database access layer using Pro-C, and replacing all the JPL "sql" statements with "call" statements into our library.
Tuesday, April 29, 2008
Some Notes On The Jboss BeanShell Deployer
public interface ScriptService
extends org.jboss.system.Service
{
public String objectName ();
public String[] dependsOn ();
public Class[] getInterfaces ();
public void setCtx (ServiceMBeanSupport wrapper);
}
It was extremely easy to write a few scripts and drop them in the deploy directory. Of course, you can start with the requisite "Hello World" script, which upon deployment, prints out to the console. A few more minutes of scripting (adding the above methods) yields a service mbean that can be managed via JMX.
But then the obvious questions: Why? Why would I write mbeans using bsh instead of Java? What do I gain? What do I lose? Is it really any quicker?
I don't really have good answers for the why question yet. I did write a few services using bsh. They were easy enough to implement, but nothing that couldn't have been done in a similar time frame using Java. You lose compile time error checking, but you avoid some of the plumbing regarding build scripts, deployment descriptors, and building .ear or .sar files.
I did write a few services. One connected to a Websphere MQ (a.k.a. MQ Series) queue manager to get queue depths and print them to the Jboss console. I ripped most of the code right from an existing MQ tool I wrote a few years ago. So not the most useful thing in the world, but it proves out importing existing Java classes and the Java syntax. Another used JDBC to connect to an audit database and purge old transactions. Again, nothing that couldn't be done in regular old Java code in the same amount of time.
Overall, I didn't feel like I was saving any time. For one, the syntax is Java. That's great for code re-use (either cutting/pasting or importing libraries), but Java syntax doesn't have that "lightweight scripting" feel to it. Also, the lack of compile-time error checking doesn't save you much time if you have to run the script to find errors. Make a simple mistake like a type mismatch or failing to catch a specific exception, and your IDE and/or compiler will tell you about it. Do the same thing in a bsh script, and you find out after you deploy it and run it.
I think this could prove useful in the future, as one more tool in my programming toolbox, but have to admit I don't have a lot of use for it right now. Maybe I'm just not seeing the big picture, or just haven't run across the scenario where this is the ideal way to solve a problem. If you are using the bsh deployer, please let me know what you are doing with, or what types of problems you are solving with it.
Once I have a reason to use it, at least I know it is easy to do. And once the why question starts to have answers, maybe I'll explore writing a JRuby or Groovy deployer. Or actually, what would be really useful would be a SQL script deployer, so you could run ad-hoc queries against your Jboss DataSources without writing JDBC code or having to launch a DB tool like Squirrel or TOAD. Since Jboss deployers are service mbeans, maybe I could write the SQL deployer in bsh...
GoodSearch
You're giving back without opening your wallet or going out of your way. Anybody can do it, and it all just happens while you're doing what you would normally be doing anyways.
Monday, April 21, 2008
And Now We Wait
I feel like a little kid waiting for Santa Claus to come. From what I keep hearing, the process does not take nearly as long for Wayne County as it does for other counties in NYS. We'll see.....
Sunday, April 20, 2008
Monday, April 14, 2008
The BeanShell Servlet Filter Summary
So to summarize:
- What's the point? It's a Java Servlet Filter that delegates to BeanShell scripts to do the actual Filter work.
- Does it really work? Yes. I am currently running it in Glassfish, but should work in any Java servlet container. It's still just a proof-of -concept and needs to be cleaned up to make it production ready.
- Where's the code? Of course, you still have to go to that post to see the code, but you can skip the blathering on and on and on.
- What's the point? Well, just because it can be done I guess. My theoretical ramblings on "why" are what made the post so long in the first place.
Saturday, April 12, 2008
Dynamic Servlet Filters Using JVM Scripting
But what if you could not only enable or disable the Filter, but also change it's behavior, on the fly at runtime without special build or deploy steps. I was pondering this idea and came up with the concept of a Servlet Filter, that by itself, does nothing.
Nothing? Well, nothing by itself.
"By itself" is the key phrase here. Instead of doing something in the Java code (getting timings, checking security, auditing calls, printing debug statements, etc.) it just instantiates a scripting engine, like BeanShell (BSH), JRuby, Groovy, etc. It starts up the scripting engine, passes the Request and/or Response objects, and runs a script that you have identified. That script does all the meat-n-potatoes work, and the Filter then calls next in chain like it normally would. And the best part is, the script could be changed at runtime, from a simple do-nothing-and-return to full blown screwing around with the Request and Response objects.
I've developed a proof-of-concept (POC) and have it running under Glassfish v2 application server. I used BeanShell for the scripting engine in the POC, but as stated above, any of the scripting engines for the JVM should work. This isn't quite ready for primetime, but it fully works.
There are actually 2 scripts called by this filter, one before the chain.doFilter() call is made, and one after. That way you have the flexibility to do operations either on the request, on the response, or both.
First, the Java code for the Filter:
Then, the 2 BSH scripts:
BSHServletFilter_PRE.bsh
import java.servlet.*;
import java.servlet.http.*;
import java.util.*;
System.out.println("This is the BSHServletFilter_PRE.bsh script!!!");
StringBuffer output = new StringBuffer();
output.append("\nRequest Attributes\n");
Enumeration attrs = request.getAttributeNames();
while (attrs.hasMoreElements()) {
String attr = (String) attrs.nextElement();
output.append(attr +" - " + request.getAttribute(attr));
output.append("\n");
}
output.append("Request Parameters\n");
Enumeration params = request.getParameterNames();
while (params.hasMoreElements()) {
String param = (String) params.nextElement();
output.append(param +" - " + request.getParameter(param));
output.append("\n");
}
System.out.println(output.toString());
System.out.println("This consludes the BSHServletFilter_PRE.bsh script!!!");
BSHServletFilter_POST.bsh
System.out.println("This is the BSHServletFilter_POST.bsh script!!!");
System.out.println("About to alter the response...");
response.getWriter().print("<h1>This response is from the BSH script</h1>");
response.getWriter().flush();
System.out.println("Done altering the response");
And the browser screenshot...
This is currently just at the POC stage. It is working as-is, running under Glassfish. But as you will immediately notice, the filenames for the scripts are hard-coded, and there is definitely some more cleanup to make this production quality code. But, you can change the behaviors of the filter, for better or worse, at runtime without any compiling, deploying, or restarting of servers. You can even "disable" the filter by writing BSH scripts that do nothing.
Thursday, April 10, 2008
A Servlet Filter For Easier Debugging
This isn't meant to be a tutorial on Servlet filters, I am assuming you either know (or know how to figure out) what filters are, and how to tie them into your application in the web.xml descriptor.
I "printed" the source into a PDF to keep the formatting in tact. Here is the link, or if your PDF plugin is working, it should appear in an iframe below....
Saturday, April 05, 2008
Spring Has Sprung Again
Tuesday, March 18, 2008
Now I Really Do Feel Old
I start thinking to myself, "c'mon, it wasn't that long ago!" I remember borrowing that CD from Greg Miller like it was yesterday. I must have listened to it a thousand times before begrudgingly giving it back to its rightful owner. But that wasn't yesterday, it was when we were in high school in the early 90's. In fact, that was way back when people borrowed CD's from friends instead of "sharing" them as mp3's over peer-to-peer networks. Since Greg wanted his back, I actually went out and bought my own -- how many high school kids do that anymore? Holy crap, I AM OLD!
Monday, March 17, 2008
Oracle on Windows Authentication Woes (And Solutions)
Except that several times already, when trying to run imports or simply connecting via SQL-Plus, I get the following crap:
C:\oraclexe\app\oracle\product\10.2.0\server\BIN>sqlplus XXXXXX/XXXXXThe first time it happened, I simply restarted the OracelServiceXE and OracleXETNSListener services. Then it happened again today, and restarting services had no effect. And I am NOT rebooting my whole machine just to get Oracle to work.
SQL*Plus: Release 10.2.0.1.0 - Production on Mon Mar 17 08:50:29 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
ERROR:
ORA-12638: Credential retrieval failed
But thanks to someone named "babu george" on this forum, I fixed the issue quite simply by getting rid of NTS authentication.
In your sqlnet.ora file, simply comment out the (NTS) line and create a new line with (NONE) in place of (NTS).
#SQLNET.AUTHENTICATION_SERVICES = (NTS)Alas, don't get me started on how much I love Windows.
SQLNET.AUTHENTICATION_SERVICES = (NONE)
Friday, March 14, 2008
Trashy Yet Effective Oracle Trick
I need to post this so I can remember it next time I screw up...
I was running an Oracle import (imp) on my local Oracle 10g XE instance today, and realized I did it incorrectly and imported everything into the SYSTEM schema. Oh crap, I can't just wipe everything out, it's my SYSTEM schema! I need surgical precision to only remove the crap and leave all the Oracle stuff unscathed.
Then, like a tornado in a trailerpark, it hit me. An idea that walks the fine line between genius and insanity. All the new table names started with a common prefix, which for sake of discussion I will call "BLAH_". So in Squirrel I run the following query:
select 'drop table system.' || table_name || ';' from all_tables where owner = 'SYSTEM' and table_name like 'BLAH_%'
Then cut and paste the results back into the Squirrel query runner and run the results as a script.
I'm sure there's an "official" way to accomplish the same thing, but screw that, this was extremely quick and kind of fun.
Trashy yet effective.
Tuesday, March 11, 2008
Whores, Spitzer, Swallows
With Gov. Spitzer, a.k.a. Client #9, getting busted using the services of a high class prostitution ring, some serious questions need to be answered. I'm not talking about the normal political crap like will he be impeached?, will he resign?, will he be arrested?, will other high-profile clients be outed?, etc. I'm mean questions like, what is the difference between a high priced hooker and a regular street hooker, anyways?
Really, they both take money from strangers and then slide down the dudes' meat-poles. They collect more DNA samples in a day than the CSI folks collect all year. That's a nasty, filthy whore, whether it costs $50 or $5000.
So what does the extra cash buy?
- Is there such a thing as a higher class of venereal disease?
- Does draining your man-goo feel better when you also drain your bank account?
- Is it somehow less disgusting to think a thousand rich dudes impaled the whore with their man-swords, as opposed to a thousand regular dudes?
- Do they share a glass of champagne with you after the deed, instead of hitting the crack pipe and watching Jerry Springer?
- Do you get a souvenir hat or t-shirt or something? Like when you ride a roller coaster and they snap your picture coming down the big drop off?
Thursday, February 28, 2008
Anticipation is Worse Than Real Thing
My truck passed NYS inspection without even needing so much as a windshield wiper blade. I was worried about the rear brakes, since the front ones were in such bad shape when I did them last month (needed new pads, new rotors, and on one side I ended up replacing the whole caliper and shearing off a banjo bolt, but that's another story). Getting the brakes replaced would have cost a butt load of cash we just don't have right now.
Then yesterday we finally got our act together and did our taxes. The big nagging fear, no matter how much math you do throughout the year, is that all of a sudden we owe the government butt loads of cash we don't have. Nope, we're still getting a return -- nothing too elaborate, but at least we're not paying.
Goes to prove another saying right -- "Procrastination is a lot like masturbation. It feels good while you're doing it, but in the end you just screw yourself".
Monday, February 25, 2008
FCKeditor - Embedded HTML Editor
After hitting Google, I ran across FCKeditor. I had heard of it before, and even played with the demo once, but never did anything with it. Never had much of a reason to. Today that all changed.
After reading through the Developers Guide, I downloaded the ZIP, unpacked into my public web directory, and had it working in no time. In less than 30 minutes, I had the FCKeditor completely tied into an existing Rails form, replacing a boring old text area. After a few minutes of testing inserts and updates, and some cross-browser testing with Firefox and Internet Exploiter, I was happy.
There were only a few lines of JavaScript code to add to the page, and those are all spelled out in the Developer's Guide, so I don't feel the need to repeat those here.
Overall, I was pleasantly surprised. Unlike a lot of open source projects out there, this was extremely easy to get started with, easy to install and embed into existing applications, and the documentation was pretty good for a change. The quality so far has also been nothing short of impressive. (the editor is more full-featured than the one Blogger uses.)
It's licensed under the GPL, LGPL, or MPL (your choice), and can be embedded in any project, open source or commercial. Also, in addition to the JavaScript version I used today, there are versions for JSP, ColdFusion, PHP, Python, etc.
This project today was just a personal side project, but I think FCKeditor might find it's way into my arsenal for work projects as well.
Thursday, February 07, 2008
Reading And Writing Text Files in Ruby
I ended up writing some Ruby scripts to run through a file of transaction responses, and sort out the various error types into separate files, and produce a summary report of the error counts in each category. Now the only manual part was cutting and pasting the summary into an email, and attaching the various sorted files.
I was pleasantly surprised at how easy it was to read and write text files in Ruby. Let's say you just want to read a text file, line by line, and spit it back out, a la "cat"...
File.new(filename, "r").each { |line| puts line }Wow, that was easy, eh? Let's try reading that file into an array for use later...
results = []Let's say you want to capitalize everything in the file, and spit it out to a new file...
File.new(filename, "r").each { |line| results << line }
out_file = File.new("upper_case.txt","w")
results.each do |line|
out_file.puts line.upcase
end
That was easy. It's probably obvious, but the first argument passed to the File constructor is the filename, and second is the read/write flag.
For comparison' sake, let's read a file in Java and spit it out line for line...
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
...
BufferedReader is = new BufferedReader(new FileReader(fileName));
String line = "";
try {
while (line != null)
{
line = is.readLine();
System.out.println(line);
}
catch (Exception e) { /* do nothing for now */ }
finally
{
try {is.close();}catch(Exception f) { }
}
Definitely not "hard", but it is a bit more code. Writing a file is very similar, except of course you use FileWriter and BufferedWriter instead of FileReader and BufferedReader, and write to the file instead of reading from it.
I'm not really trying to prove anything here -- Ruby isn't better than Java, Java isn't too hard or too verbose, etc. I like Java. I like Ruby. Against my better judgment, I even like Oracle, but that's another topic. I just found that working with files was easier than I expected, even for a Ruby beginner like myself.
Tuesday, February 05, 2008
Funny Thing About Taxes
"The worst thing about taxes is that you’re supposed to compute the total yourself. What if you ate at a restaurant and when you said hey, what do I owe you? They said you figure it out. And you thought about what you’d eaten and said well, I guess that’d be about $7.25, and they said no, it’s $11.40. Plus now we’re going to charge you an extra three bucks for trying to cheat us. If they knew what you owed them, what was the point of making you figure it out? Just to be jerks, probably. Or maybe in hopes you’d miss high, which is basically how taxes work."
Thursday, January 31, 2008
Lucid Vending Dreams
http://videos.howstuffworks.com/reuters/3905-marijuana-vending-machines-video.htm