Thursday, December 16, 2010

Prime Counter

An early mathematical result of mine was my own prime counting function.

With natural numbers--means use ints or longs--where pj is the jth prime:

P(x,n) = x - 1 - sum for j=1 to n of {P(x/pj,j-1) - (j-1)}

It counts primes when n equals the count of primes up to sqrt(x), so if n is greater than the count of primes up to and including sqrt(x) then n is reset to that count.

To see an example of it used click here.

For say, the count of primes up to 100, if you tried P(100,10), the algorithm would reset n to n=4, so you'd have P(100,4), because there are 4 primes--2, 3, 5 and 7--up to sqrt(100), and the answer of course is 25. The algorithm is fairly easy to program.

An innovation of mine was to use a two-variable function where math people traditionally use a single variable one.

If you're curious about more of the underlying mathematics--warning is a good deal more abstruse--you can go to a post of mine on my math blog.

James Harris

Thursday, November 18, 2010

Design philosophy of Class Viewer

Class Viewer allowed me to put out my minimalist design philosophy. From the outset I wanted to stay away from feature-creep and lots of buttons or menus or all those other things that developers are notorious for tossing into projects. So much so that even as a tech-savvy person I'm amazed still when I can't use my cellphone well, without consulting a manual, which tends to be incomprehensible. I joke you need a college course to properly use one of these things. (Of course modern kids seem to just inhale them, but they're genetic mutants who have evolved to use modern technology.)

So Class Viewer is designed to be a user friendly as possible--for real, not just saying it is.

Actually I wanted to toss menus entirely but found I couldn't, but I could deliberately break the traditional set of menus across the top!!!

The two window groups design was deliberate as well. My idea was of a larger dataset to your left, which you refine to a simpler set of data to your right. The program is focused around methods, so they can fill the left window, with results in the stacked windows on the right.

Of course I also wasn't excited about trying to put out a lot of languages for what I'd hope would be a useful app--there are too many around the planet and I just really know English--so I like to think that if you're shown how to use Class Viewer, you can use it in any language, and in fact downloads now come from roughly 30+ countries per seven days, according to SourceForge statistics, so maybe I achieved that goal.

So the simple answer to the design philosophy of Class Viewer is, simplicity.


Monday, September 27, 2010

Class Viewer 5.0 Beta

There is a fairly stable beta version of Class Viewer 5.0 now available on SourceForge. So I think I should say a bit about what's happening under the hood.

First I've done a few clean-up things trying to make the app a bit easier to use and also help it look the same across platforms, so now it will tell you where it's looking for packagedirectory.xml if it can't find it. So you can put it where the app is looking. It is supposed to be looking in the directory from which you're running the program which works fine on Windows, but I'm seeing it do something I think slightly different on Linux.

Oh, yeah, so the app can work just fine across platforms as it is a Java app, but I'm more certain about what it's doing on Windows. So feel free to download it for whatever, but you may have to tweak a few things, but that should be fairly easy.

One thing I've done is fix the math on sizing the screen regardless of resolution so that the app should look roughly the same across resolutions. I'm testing on multiple machines now, more so than before, which is how I even noticed a problem. Freaking thing was giant on the machine I have running Ubuntu Linux.

Biggest change justifying an advance to 5.0 is that I've added in the ability to go to an actual Java file to the method, which I think is cool. So now instead of going to javadocs to the method, if the file is on your hard drive you can open it up and go to the method, if your text editor supports accepting a line number when called, and gedit does so I've defaulted to it.

If your text editor does not support going to line number then the program will just give you the line number of the method before opening it up.

But is that feature useful? I need it. So it's useful to me. Now I can use Class Viewer to open programs I'm working on, which right now mostly means, Class Viewer itself! I think that's sort of neat. And it has been fun doing more programming in this way after so many years. I kind of like, sort of miss it, but not ready to go back into the professional grind with it.

You can download from the main Class Viewer page.

And again, if you're not on Windows it should be easy enough to get it to work on your system without a lot of effort, but I'm just putting it out there for Windows now because that's easier for me.


Saturday, August 07, 2010

Scan to Post Office idea

Problem solving is just fun as an exercise and it seems to me that it's useless for me to work puzzles--man-made problems--as I'm just not good at them, and so hate puzzles, but I love real-world problems.

And the US Postal Service is in the news a lot these days about huge losses, as they try to adjust to the changes brought on by the Information Revolution, where people just don't physically mail as much these days, and I came up with a simple idea--which I have sent to them--which is to allow people to scan a letter at one post office, which is printed out, put into an envelope and physically mailed out from another, closer to the letter's destination.

So the idea simply removes physical transport of the letter between post offices, having it go through cyberspace instead to then be printed out and delivered like a normal letter.

And you may think, why bother? Why can't someone just email or fax the info then?

What if they can't, for any number of reasons? Like not giving their email address? Or not having one for the destination? Or not having a fax number, or not having someone who can accept email or faxes?

Or even better, what if they need a postmark date on the letter? Or proof of delivery?

Problem solving can be about abstracting benefits, and if you think that getting a letter from the postal service is just about the information in the letter, then yeah, email covers that, but if you say, but wait, there's more! Then you can see the postal service gives BENEFITS beyond just the information within a letter, like a postmark date.

Postal services then need to shift in the new world by figuring out all the benefits they give, like the postmark date. I'm sure there are many others that are not covered by things like email and fax.

What I'd like would be to be able to mail a payment for a bill where I can't do that payment online in this way, where I go to the post office and scan in the bill, so that I could avoid late fees or worrying about whether or not the letter would make it on-time. Oh, with that variant on the idea, you'd buy a postal money order--probably with a debit or credit card--for the the amount of the bill, and your bill would be scanned to the closest post office to its destination, printed out, and a money order printed out with it, and inserted along with it to be physically mailed to its destination.

The postal service then saves money on physical transportation of the mail, and can charge full price for the cost of the service, which can be a benefit to consumers, who need a physical letter to arrive fast.

And that is a problem solving exercise for the postal service.

And as it IS an exercise I'm not saying it's THE answer, but I think it's worth putting out there along with whatever other ideas are floating around.

Note, any postal service in the world, of course, can use the idea. It's open source!

Which means free as long as I'm given attribution as the source. Though hey, if someone else had it before, good for that person! It's not like it's a complicated idea, but at least at this point as far as I know, it's an idea original to me.

And I say, real world problems are lot more fun than man-made puzzles.

James Harris

Thursday, June 17, 2010

Code work starting on 5.0

Looks like I'm starting code work on Class Viewer 5.0, which may sound strange--don't I know?--but things are different when you're a single developer with a somewhat mature product as Class Viewer is now over 6 years old (first on SourceForge February 2004).

The thing is, you wear all hats. Which means I end up in weird kind of arguments with myself. So the project administrator is worried about a stable baseline, ok have a new beta-5.0 branch, the developer in me wants to toss in all kinds of new features--um, are you sure?--and the project manager is trying to schedule times around my busy schedule for the actual codework. Plus any other jobs that just don't occur to me now while typing this post up quickly.

But at least I feel like I've resolved a lot of issues in my mind that have hampered my interest in development and I'll admit that one longterm possibility is coding for cellphones. And it also turns out that Class Viewer is my primary development tool, so when I think about doing more coding, and opportunities appear to be emerging in doing apps for cellphones, I start looking at ways that it can be a more robust tool for me, and maybe that means something more for others as well from this project (but maybe not).


Sunday, June 06, 2010

Back to basics, re-learn Java?

While I've done a little programming here and there--usually a little bit of code for some math research--it's been a while since I've done full-time computer development so I needed to buy a book and found that Head First Java has worked out.

Nicest thing though? It doesn't look to me like I forgot much! But I'll know for sure as I ponder making more changes to Class Viewer. So far so good though with the latest minor update release, but it remains to be seen how much I really still know as I contemplate bigger changes.

Sunday, April 11, 2010

Method searches with Class Viewer

Part of the design philosophy of the Class Viewer project is getting the best method you need for a particular object or to return a particular object, where I also like to warn that one problem with that philosophy is that there is a drop in emphasis, oddly enough, in actually memorizing all the methods associated with a class.

Understanding how powerful Class Viewer is in searching for the perfect method is best done by seeing it in action, where my favorite example is to use the String class, which gives the main screenshot for the Class Viewer project, where you need to know what methods take chars or return them. Using Class Viewer now I can copy and paste to show them:

static String valueOf(char[])
static String valueOf(char[],int,int)
static String valueOf(char)
char charAt(int)
boolean contains(CharSequence)
boolean contentEquals(CharSequence)
static String copyValueOf(char[])
static String copyValueOf(char[],int,int)
byte[] getBytes(java.nio.charset.Charset)
void getChars(int,int,char[],int)
static String join(CharSequence,CharSequence[])
static String join(CharSequence,Iterable)
String replace(char,char)
String replace(CharSequence,CharSequence)
CharSequence subSequence(int,int)
char[] toCharArray()

And that's it. Everything that can possibly give or receive a char in the entire String class, so if you're developing and wonder if there is anything else, nope, not in the String class. That's it. And I did a search on "char", highlighting a method that had "char" from the left window of the app.

But hey, there is another class that can handle chars which is StringBuilder, and yes, you DO need to keep up with knowing classes, just not the methods in them, so it pushes you to only know your classes, as you can just pull out which method you need based on what you will hand them, and what you want them to give back to you.

That is key to the design philosophy: what thing do I have that needs to be given to a class and what do I need it to hand back to me?

Now if you open StringBuilder in Class Viewer you may notice--as I did while pondering what to say in this post--that it has a LOT of methods with "String" in them. But let's say I only want methods that receive just a String, here they are:

AbstractStringBuilder append(String)
StringBuilder append(String)
int indexOf(String)
int lastIndexOf(String)

And that's it. There are no other methods (of course I'm only talking public methods) which will take just a String, and how did I achieve the feat of finding them? I did a search on a method in the left window, highlighting "(String)". That's the easy way. To get just those methods using the "Search String" box in Class Viewer you actually have to search on: (java.lang.String)

You can get fancy searches by what you highlight and search on from the left window, like here's a fun one: "String "

It gives:

String toString()
String substring(int)
String substring(int,int)

And those are all the methods in the StringBuilder class that return a String. That one is kind of tricky as I actually highlighted whitespace, which you can only do with searches on the left hand window. But that can be a very powerful tool. So it's important to emphasize that whatever you highlight in the left window is what is searched, even special characters, like whitespace.

But notice if you were wondering how to get a String from StringBuilder those are the only ways.

Curious about any one of them? Then double-click on the method in the right hand window, and you get taken to javadocs. Here's the link that Class Viewer built for me for the third one:

Which is the final piece to helping you get the best method possible as if you have questions you can go directly to javadocs at the method, which I call deep linking.

So the focus is on what you want the class to give you. Or you can focus on what you wish to hand the class and that is where Class Viewer can help you a lot.

Results above valid with Java 8 SDK.

Editorial notes:

9/27/12 Updated built link to go to latest Java SDK. ___JSH
7/08/14 Updated copied searches and built link to go to latest Java SDK. ___JSH