Wednesday, December 21, 2005
Just a thought.
No, this should not use Gtk+, because that isn't productive (.Net has a GUI API, already!).
I tell them my name, "Calvin", and they persist to call me "Scott". How on Earth does anyone mistake the two? Now, many people (just ask my wife) will tell you that I speak softly and sometimes am misunderstood. But "Scott" for "Calvin" just doesn't make any sense, especially for the pure consistency of the occurrence! What is going on here?
People of Earth: My name is Calvin. Not Scott. It is Calvin.
Now, am I wrong in expecting anything more? I don't think they should all install Fedora and start using Linux, but as long as they are developing a .Net project, couldn't they at least open the door a little? Their installer even refuses to install with Mono, so I can't even test the damn thing.
That's too bad, because I'm disliking GIMP more and more every day.
Saturday, December 17, 2005
Now, why do we even need things like Autopackage and why is there such controversy over it. (Yes, there is controversy) Quoting mike from the Autopackage forums:
The culture of "my responsibility ends once I upload a tarball" is very deeply ingrained in the open source landscape I'm afraid - over a decade of distros controlling everything has made any true innovation in this field nearly impossible.
Free Software/Open Source operating system distributions can be traced back to the three major BSD derivatives: FreeBSD, NetBSD, and OpenBSD. These used the Ports system to control the compiling of software for the system. Guidelines about library locations and configuration files were created and software intended for a particular distribution would follow those guidelines. However, due to the days before real distributions, the developers were not directly targeting these distributions. As many distributions came to be, their volunteers and employees would port useful software, making just enough changes to get it to work on their distribution. Sometimes this would make it to the main source, but usually it would be bundled in some way, such as a tarball, along with installation scripts for their distribution, like Ports for the BSDs. These were called packages. The users were happy because they had good software, the distros were happy because they had users, and the developers were happy because they didn't have to do the work to make the software run on all those different distros.
Fast forward twenty years or so and we haven't come far. Developers find it hard to package for so many targets and many refuse to do so, even believing they have no such responsibility. And, why should they? Most are working for free, anyway. Reducing the number of targets is an option, but anyone is free to make more and that is a large portion of the value of free software.
Through these years, those standards and guidelines have converged in many ways. Something like autopackage was finally possible and perhaps we need it.
Let me tell you what bugs the crap out of me. I hate finding a good program on-line and then having to open up a terminal and typing "emerge search foobar" to find this app. I hate having to tell my roommate, who uses an extra computer of mine, how he has to go through Mandriva's software management app to find out if that game has a package available or not.
I welcome Autopackage, but we need cooperation from the community and the distributions to make it work. Perhaps work like Autopackage can converge the much repeated work of packaging all this software and we can reduce distributions to installation auxiliary scripts.
All I know is I am tired of waiting for a package after the tarball is released.
Saturday, December 10, 2005
Binary support is in desperate need and barely cared about. Packaging is a complete joke. The distributions are a mess.
I shall elaborate.
Friday, December 02, 2005
- Selection from multiple tables with a From(table1, table2).select(table1.colA) type syntax
- Column instansiations to pass to insert and update operations, such as table1.colA("foo")
- Streamlined and cleaned up unittests
- More complete unittests
- Deletion of rows
Thursday, December 01, 2005
I may have broken my release-a-day spree with Pat, but at least I did make progress tonight, and that's the important part.
Wednesday, November 30, 2005
Tuesday, November 29, 2005
Monday, November 28, 2005
Three releases in just over thirty hours. That's a record for me, but I may have wasted my weekend. A few hours after releases Pat 0.3, I caught a blog entry by titus mentioning something called SQLAlchemy. It seems to be pretty much what Pat would become, if I put a lot more work into it. It includes things like joins and seems a mix of my model and the basic Python dbapi, with execute() and fetchone() methods.
It makes me question things. Have I broken the TOOWTDI rule? Did I waste those thirty hours? Should I continue with Pat or put her to rest in favor of a more complete solution?
If I had spent the same amount of time learning SQLAlchemy, would I have gotten to the point with it that I am now with Pat? Also, I don't know if it uses pysqlite2 or the sqlite module, where I requre the prior. I will have to look into this other contender and decide my course of action. For now, I should probably sleep. I should have done that hours ago.
Sunday, November 27, 2005
The next release should move from the keyword interface to passing things like UserTable.username=="Bob" or CustomerTbl.customerForYears>10. It will also support deletion of rows (which I just forgot for this one, oops) and default column values and specified text lengths.
As it is, it should prove useful. It can already do enough for my current purposes. Hopefully, someone else will find it useful. Let me know if you do. If not, let me know why!
Pat 0.2 Release at the Cheeseshop
Saturday, November 26, 2005
Pat is very easy to use, but still pretty rough around the edges. It is very much a prototype, but as they say, "Release Early, Release Often", so I'm doing that. I've registered the project at the cheeseshop.
What it Doesn't Do:
- Create tables
- Verify integrity
- Bake cookies like Grandma makes
- A lot of things
- Represent named tables with python objects
- Allow you to table.where(id=5) to select rows
- Allow you to T.where(id=1).update(name="One")
- You can string multiple where calls and end with an update and only trigger a single query, as all the where clauses are combined. No query is done on a select until you actually iterate over the returned Results object.
Pat 0.1 (source)
Please, send me any bug reports, comments, complaints, etc.
Friday, November 18, 2005
I've been messing around with an account on blogsome.com, which uses the popular WordPress blog system. I like it. It seems a little less intuitive than Blogger sometimes, like not being able to explicity order links, or edit my templates directly. But, it does allow for catagories, which is the big thing I don't like missing from Blogger.
I have a meager, if existing at all, group of readers. So I guess I'm not abandoning much. I'll give this some thought and do some more testing with blogsome. If I make the move, I'll probably run my own WordPress server from home. We'll see...
Thursday, November 17, 2005
The Multiple Self
The Refactored Self (part 1)
These three posts are wonderful. The ideas are solid, and I've found most of them to be true on my own before finding them put to such great description and clearity. Moving in the direction of being more agressive with this would be a good thing for most of us.
I develope primarily in the Python programming language. My work is database and web related. I also do some minor work with Visual Basic and Microsoft Access and Excel, to make my "real job" easier.
Aside from the technical side, I also have an artistic flare. You can see some of my art on my DeviantArt page. I also have a second blog for political commentary, media reviews and quips, and things that just don't belong elsewhere.
Wednesday, November 16, 2005
A good example is that I'm posting this article instead of just commenting on the page like everyone else. Of course, those comments aren't this long. So, I'll convince myself I have some justification. Why do I need to justify these actions to myself?
Many of us have websites. They are a bit of a status symbol these days, and something anyone can create. But, a site that is important can not be created by anyone, it can only be created by everyone. Only in the value of the audience do we feel a real value for our own websites and the information we provide within them.
So, although we want to give the content away, we want to keep close hold on the credit. We want everyone to value the content and to know that we were responsible for its creation and for its continued availability to them. As long as the content remains on our websites, we have value in the value the audience holds in our website.
Where does this leave projects like Wikipedia and more focused efforts like the Python Wiki? Although the spirit of sharing urges us to combine our collective content where everything can be found together, we are greedy for self value. We may even make such meager claims such as, "Google pulls the information together as well as a wiki", in order to justify our actions of keeping our content out of the wikies.
The first thing that springs to my mind when pondering it, and the first thing that I thought of when reading the post on Ned's blog, is, "why do we need to make this distinction and this discission at all?". Content may be served from multiple physical servers, and available from multiple logical URIs, but why does this entail that it must be acredited to one person or organization for each source we can obtain it from? Why do we have to have such a hard line between our site and World Wide Web? The WWW was meant to be a sharing of information, and many people say that the Wiki is the heart of the spirit of the web. But people need some value in both the obtaining of information and the free distribution of information to others. It has to work both ways, and as we know, what each is giving must be worth less to that individual than what they get in return.
What I am getting at, is why can't Ned's Python Parsers page exist as both a page on his website and as a page on the wiki simultaniously? I won't go into implementation details, but he should be able to write the page on his website, and then submit it as a page on the wiki. If anyone wants to make changes to the wiki, they can. If we wants to merge changes in from the wiki, he should be able to. If he makes changes while his and the wiki-version are synced, they should show up on both, otherwise he or someone else might merge them in some semi-manual manner.
In any case, this would all be through good standards. There would not be any central servers involved. Neither individual or organization would have to do anything manual unless they themselves are changing something.
If we want to truely share, why do we have to give it away? Is it really sharing if we ourselves can not share in all of the value. Sharing by putting the content into something like a wiki allows everyone to share in the value of obtaining the content, but there is a lack of balance in the value of providing that content to those who would wish to obtain it.
We must share both the value of the content and the credit for that content.
Monday, November 14, 2005
This leads me to two related issues: I don't want to break the pickle code, because it may still be useful, mostly for in-memory, never-persisted stores that could be useful. And, I may at some point move to something other than SQLite. So, it seems I should decouple the backend that stores the data from the interface to the store, and everything else in the project, as much as possible. This is taking some time, both in design and implementation.
I just begin to wonder, when am I spending to much on good design and not enough on actually getting the work done, because I want to make sure its done right? What good is it to plan how to do it just right, if the work isn't getting done?
Sunday, November 13, 2005
I was even more impressed when I received an e-mail from Tim Westergren, Founder of Pandora, announcing the new Pandora 2.0, which is very nice, and has a lot of great improvements over an already wonderful system. What impressed me was the generous upgrade of my three month subscription to an annual one, free of charge. Wow. I only did a quarterly subscription because my trial ran out, I hungered for more, and I don't like to spend too much money without saying something to my wife.
My only fear is that as Pandora grows, this kind of personal touch will be lost. It is nearly inevitable, but how can any growing company continue to live small to the people?
Now, if only my speakers hadn't broken.
Wednesday, November 09, 2005
The current Linux kernels do not define a stable ABI. Between releases, small tweaks to drivers are often necessary to keep up with little changes in the interface between those drivers and the kernel core. This means that every driver must be compiled for exactly the same version of Linux, and it makes for a difficult situation for hardware developers, who want to support Linux.
Now, everyone has something to say about it and no one seems pleased. Either you're outraged at the very suggestion of allow binary drivers to work reliably without releasing source code so customers can recompile their drivers with every kernel upgrade, or you can't possibly comprehend how anyone finds it a bad idea for manufacturers to be able to develop one binary driver they can release with their product and know that it will work when the user plugs in the card and copies the driver over.
Well, there are some points on both sides. While it is true that it violates the GPL to distribute binary only drivers with the Linux kernel, we don't have to distribute the drivers with the kernel. When you pick up a cheap Ethernet card and open the box, do you know what's on that little disc thingy? Drivers. We don't have to distribute drivers for every known hardware with every release of the kernel. Besides, I'm tired of downloaded ham radio drivers over and over. I never use them.
What baffles me is how no one seems to grasp the simple concept that if it is illegal to distribute them so, they won't (successfully) do so, without a battle they'll loose. That leaves the only benefits all for the users and kernel developers. The users will have better hardware support, and be able to get cousin Mindy to try Linux, finally. The developers can stop redeveloping drivers for devices that already have drivers, but for whatever reason do not have (good) Linux drivers, and they can then focus on the kernel itself.
Everyone wins with binary ABI stability. While we're at it, maybe we can get the ABI implemented in Vista and OS X, but with the best native implementation in Linux, of course.
A key thing to remember here is this: users do not want to recompile anything. Period. Source is nice to be available, and I think it should be, but source should be the option, not the necessity.
Tuesday, November 08, 2005
This brings me to think about something I've pondered, and I'm sure has been discussed before: does a programming langauge have to compare apples and oranges? Perhaps it is a historical artifact that everything can be compared. When everything is just a representation of byte patterns, everything can be compared numerically, but this doesn't always make sense for what is being compared. Boolean logic is tied into nearly every computer langauge, so that everything can be considered true or false. Well, what about raising an exception on 1=="1" instead of just resolving to False? How about denying a conversion of an object to true or false, where it has no logical boolean equivalent?
Why does everything have to boil down to black or white?
Monday, November 07, 2005
I quickly realized that I am a sufferer of this condition. I waste many nights that could have been spent working on something, because I do just what this article describes. I don't have much to say about it, just read it, please.
Friday, November 04, 2005
The GNU GPL has four main clauses, if you look at it in a simplified manner.
- The right to use the software for any reason
- The right to my copies of the software
- The right to modify the software
- The right to redistribute the original or modified versions of the software
This last clause is the one I've always had trouble agreeing with. I think I should be able to make copies of software, if I have a desktop and a laptop, for example. I should be able to use it for anything, because if I bought it, that copy is mine. If they want to limit the warranty to certain uses, that's OK, but they shouldn't limit me to certain uses. There may be something I don't like about the software, or maybe I don't entirely trust it. In either case, I should have the option to see and modify the source code, to ensure I know what it is doing, or that it is doing what they say it is. But, they worked hard making that software and need to make a living to feed their families and pay off that house, so what right do I or should I have to say to my pal, who wants a copy of the software, "Sure, I'll send you a copy. Don't worry about buying it for yourself!".
I believe the forth clause is a mistake, not only in that Richard Stallman keeps it in there, but that he brought it into the license in the first place. There is some history behind this opinion that is very important to the issue at hand.
When the GNU General Public License was first created, and back in the days when Richard Stallman was jumpstarting the Free Software movement and founding the Free Software Foundation, the software and technology world was a very different picture. When the first users of Stallman's Emacs wanted to acquire a copy, they didn't download the source or prepackaged RPMs from the FSF website, or their distributions automatic package manager. They wrote him a letter, including a blank data tape and money to return it through post, and Stallman would copy the source code onto the tape and mail it back to them. Those days, I don't think there had to be much worry if someone redistributed your software, because distributing it was so difficult for both you and for them.
What this begs us to ask, however, is, "why is this still a GPL clause and why does anyone think its essential?" All of the other clauses of the GPL are enough. That last clause brings about all the problems. User's should have every right to make their own personal copies, to modify source code, and to use the software in any way. But copyright law is there for a reason, and I want to pay of that new car. Redistribute patches, if you'd like, but developers who can't or won't do it all for free, deserve to be compensated for their work.
And, yes, I know there are ways to make money on GPL software, but it much more difficult and risky. Developers deserve the same kind of per-consumer compensation as creators in any other medium.
The problem with the GPL's new version is that the changes will only strengthen this problem's hold on the GPL. More provisions will be put in place to ensure the users' rights of redistribution and the circumvention of the developers' rights to control the distribution of their own intellectual property.
I know what you're saying, "So, don't use the GPL!" And, I won't. My problem with all this is that many do and will continue to use the GPL misguidedly, and that the GPL symbollically stands for the concept of free software and open source licenses, so this huge error just reflects badly upon the whole community. Stallman may have started it, but at this rate he'll lead the movement to its end in his blindness and inability to admit that, though he had a good idea, he made one or two mistakes in the initial executions of that idea. Idealism is nice when you're ideals are grounded, but dangerous when you follow them simply because they are your ideals.
Rethink what your thought, and always make sure you still know what you're doing.
Monday, October 31, 2005
How may people do this? I mean really! Is it practical to cross this line?
If you are new to IPython, there is a decent intro article from ONLamp. Although, I fail to see how this article fits into the LAMP  world. Still, it unveils some need features like: magic: Quickly assess special IPython features. Tab Completion: auto-complete code attributes, classnames, methods, and more Introspection: Easy access to Doc Strings and internal documentation History: store a dumpable session of commands Debugger Access: internal access to pdb Run: a safe way to run a file and ignore the __name__ == '__main__', trick Macros: capture command history into a macro
All great stuff. Also mentioned in the article is System Shell Access. For example, you can use cd, pwd, and ls directly in IPython. To escape to the shell use '!' or '!!'.
The IPython Manual notes in the section IPython as system shell. I loose job control if I use iPython this way. Although, I haven't had many issues so far.
Starting IPython with 'ipython -p pysh', creates a special envirom"
I found this interesting because of recent ideas I've been drawing up for a Python Embedded Shell. The Python syntax for `foo` being taken as repr(foo) is to be removed, so I thought, "Why not have a special interpretter to expand `foo` to execute a program named `foo`?"
I went into it more in my mind, so I'll lay out the ideas here.
- foo=10 would be taken as normal
- print $foo would be used to print it to the terminal
- foo would just run the program, foo (I updated from the original thoughts)
- $foo would run a program stored in the string foo by name
- if, while, def, class, elif, else, and for all work as they currently do.
- That $ syntax is only needed where it would be otherwise confused for a program name.
- `foo` would resolve to a special object representing a new process running by executing foo. This process object would have stdin, stdout, and stderr file-like object attributes. It would also have kill, pause, and continue methods.
- New operators exist for piping. Such as foo->bar to pipe stdout of foo to stdin of bar. foo!->bar pipes stderr, instead. null is known as a built-in process object, which just pipes everthing to /dev/null or an equivalent.
Sunday, October 30, 2005
Saturday, October 29, 2005
As it is I seem to barely have time for my code, and I wasn't making the progress I'd like even when I was impressed with the progress I was making. Factor in my continuing frustrations over the lack of writing and art I've been able to spend time on, and my output just looks dismal. Real Life, the good and the bad, are cutting into the things I always though real life would be made of, for me.
I pretty much know that until I can support myself and my family independantly, I don't have time for coding, writing, and art. I only have time for one. It forces me to look at it from a bussiness aspect, of which would bring me money quick enough to allow me to resurrect my other hobbies? It also instills growing fears of loss if I fail at any of them. Not only will I continue to work a dead job, but I'll continue to have no time for creativity.
Where's a grant when you need one?
Friday, October 21, 2005
Monday, October 17, 2005
What we really need is a standardized from of representing Python code in Python code. Things like a Statement class and Expression instances, for example. This would allow people to easily write code to optimize and analyze code parsed by any front-end and compiled to any back-end.
Monday, October 10, 2005
Friday, October 07, 2005
Now, off the bat I'll say that I don't hate threads, but I really wish there was a better alternative. I do want to see the GIL go away. Finally, I don't like having to explicitly suspend my task every so often to allow something else to process for a while. This is tedious and does not always reflect the nature of the task well.
Active Objects seems like the most Pythonic approach, and like they could work well with existing, non-concurrent code. With Active Objects, you have objects designed to work concurrently. Calls to their methods are typically queued so that only one method of one active object will be executing at a single time. Thus, the active object does not need to syncronize on its internal state data. Extended loops in a method could get greedy, however, but that is a small matter.
The biggest issue is dealing with shared objects, which happens so much in Python's pass-everything-by-reference world. Methods can be crafted to be safer, such as by taking only basic types (integers and strings) and containers of those or containers (lists of strings and tuples of dictionaries mapping strings to booleans, etc.). But, inevitably, you will have to pass something more to a method.
One approach could be to copy objects before passing them, even to deep copy them all. Another would be to create special shallow objects that represent the state of the original without copying all of it. But, perhaps the best choice is to simply use more active objects. If we pass one active object to the method of another, and are accessing all data through their "active methods", then syncronization is generally secured. Perhaps it would also be beneficial to define a common locking API for all active objects.
Python is a wonderful, dynamic language, but there is some speculation that the very dynamic rules that make Python great, are also making it so difficult to settle on a good concurrency mechanism and to allow safe, concurrent code. Many Pythoneers scuff at the idea of true protected and private attributes, but maybe that's just what we need.
The ability to modify everything may be useful, but maybe it should be controlled a little more. We should be able to execute code in the context of protections on certain objects, like giving read-only versions of modules or write-locked lists. This becomes faulty when you realize you can just call object.__getattribute__, but I have a possible solution: the protected class. It would be a new built-in class, and anything inheriting it would be given special abilities: object's methods would treat is specially and following its access rules (properties would be immutable, exception through the functions defined for them, for example) even when using object methods directly, or other introspection mechanisms. Combining this with crafted globals and built-ins for 'jailed' code, could be a sucessful way to execute multiple lines of code in parellel without worrying they will step on each others' toes.
Sunday, October 02, 2005
Saturday, October 01, 2005
- Ranting and Raving about Games and Movies
- Ranting and Raving about Software
- Ranting and Raving about Art
Friday, September 30, 2005
Wednesday, September 28, 2005
Sunday, September 25, 2005
Anyway, Tom did say to feel free to continue blogging about Pandora, which I will do, because I have some more thoughts I'd like to share, especially knowing that he is listening.
Pandora is great. Its the best online music service I've found, and possible the greatest source of music I have, next to listening to Nights with Alice Cooper on the nights at work when I get the desk with the radio. When I say something is the best I've found, that doesn't really say a lot. It does in Pandora's case, but I'll clear it all up here.
What Pandora does right:
- Deployment as a web app
- Multiple stations
- More fine grained than genre and year
- Finds new music
- Dirt cheap subscription ($36/year or $12/quarter)
- Can't listen by genre and/or year
- Think computers are the best at organizing music
- Pass up on the greatest source of music listening habits since iTunes. Maybe better than iTunes.
I love when Pandora plays a song, and I think, "Hey, this is pretty good, who are these guys?" Of course, I also get Tivo flashbacks when I think, "Hey, why are you playing that?" It does find some nice tunes and I would be out of my league to acquire and organize a playlist of that quality and size. Now, I'm a Linux user (though more and more distastefully), so I'm happy Pandora went the web app route. It makes it so much easier to refer the service to my friends, who can just go to www.pandora.com and start listening, just like that. And, thank god they don't just group by year and genre, because I might be in the mood often for 80's music, but lots of music not made in the 80's will fit that class of music.
Sometimes, I just want to listen to 80's music, and how do I tell Pandora that? I can't seem to search for shared stations by name so I can just find anyone's "80's Music Mix" station. The redefinition of the very meaning of a station is a god-send, I must say. I can listen to the same station as thousands of people, and skip over any song I don't like. That freaking rules, because I hate when the radio plays something I don't like.
Now, what is the biggest thing that Pandora is missing? First of all, let me say this is speculation on some level, because if they take advantage of this, it must be completely on the internal level. They have thousands of listeners voting songs in and out of various groupings and all of this is stored into a wonderful database of golden information. So, Tom Conrad, I ask you, where is the "Play what other's like to listen to with this" option? The Music Genome Project may be a great venture and successful at what it does, but nothing beats a fellow human with a common taste in music. How about mining that database for common listening patterns, generating collective stations?
I'm sure they may find this a scary idea, because in essence it seems to go against the very beginnings and roots of Pandora itself, but it is also quite possibly the biggest value in the service for the company behind it, and to not take advantage of this would be, to put it simply, kind of stupid. (Sorry, Tom)
So, from the get-go, I admit that I do like C# for what it is. I've been looking for a compiled language for those cases when I would care to have one, and maybe it would be a good way to diversify my skill set. I've even considered an eventual implementation of Involgo in C#. With Python.Net I can wrap a .Net assembly for Involgo into the original Python API, and let any existing code still work, but likely faster.
C# looks like it would let me do a lot of the things that I like Python for, but without making them too difficult to manage like some other compiled languages. Delegates are nifty for passing function-like objects. I can pass objects without a specific type when I really need to, or have static typing when I need/want/think I want it. And, the automatic usability from so many languages is just "to die for".
I do wonder, however, what the consensus among the .Net community is for the Mono project. Most .Net users are definitely Microsoft users, so what do they think about us "others"? In the FS/OS world, the community is king. In their world, the community is surely strong, but it is far different. I wonder often about this rift between geeks. We're all after the same thing, we just think there are different ways to go about it.
Saturday, September 24, 2005
Today we have several horrible diseases plaguing the planet. We have HIV spreading across the globe, for example. We don't put people with HIV into special camps. No, instead we just tell them, "remember to wrap it before you tap it." Meanwhile, the little AIDS demons continue to laugh at the world they may some day cripple.
Now, I'm not suggesting that we lock every with an STD up, but shouldn't there be some accountability? If you are walking around able to cause such an ammount of death and destuction, you'd think someone would say, "Hey, you better own up to this."
Crazy people are still punished for killing people, but is it a crime to know you have HIV and sleep around anyway? If you knock someone up, you have to support the child, but do you have to pay for their HIV medications if you infect them? People in this country won't even where protective masks when they have a bad cold, so why should I expect anything reasonable?
Still, Pandora has given me the desire to spend money on music again, by giving me actual value in its service. Thanks, Ned, for blogging about this.
Do any of these bubbles have room for me? Can I make my own little bubble and hope I don't pop it myself?
I'm evaluating my options for a start-up. I'm considering costs, estimating revenues, and trying to decide the timetable in which I could make it actually work. I'm doing my best to balence a quick turn around with a solid investment of my money and time.
Lots of geeks have done this, and I'd like to think I could be one of them who succeeds. And, I do think that I will, too.
Thursday, September 22, 2005
Wednesday, September 21, 2005
I took the time to view the video interview about the LINQ project and C# 3.0's first-class query mechanisms. I was actually impressed with it, and it solved some problems I have with Python. It also made me think how the same solutions could be applied in Python, or any such dynamic language.
What is most interesting about LINQ, I couldn't be sure of from the video. Does it pull in all the data and apply the anonymous functions to it for conditional filtering, or does it take the where clause and actually generate that into a request to the server? Now, this doesn't matter for XML documents and especially direct queries on CRL objects, but with relational tables it really is important.
This is what Python needs: a generalized way to generate patterns to match, using existing operators. There are some tricks available, like allowing sometype==value to return a callable that can be passed an instance of sometype and return True if it equals value. This can be used to generate lots of pattern matchers. The problem is that some things aren't so easily redefined, like and and or operators, and it isn't easy to define that operation if you also want == for instances of sometype. That requires defining an instance method and class method of the same name for one type. Possible, but very tricky.
It would be very useful to add first-class pattern matching to Python. I'm thinking of a syntax along the lines of ?==x to generate a pattern object representing the pattern needed. What is important, however, is that it would create more than an object that can be called to test if something matches the pattern, but other code would be able to introspect the pattern, merge patterns together, generate SQL code from them, etc.
I wonder how well the community would respond to this. It would probably be best to promote a common and hopefully standard pattern package, and to propose syntax integration of the module at a later date. That would also give time for the pattern matchings to evolve. Hopefully this will happen, because Python is improving every day, but if it doesn't do so in the right places, it will fall from its rising seat of glory.
(More examples of the Pattern Syntax)
(All comparison operators work as expected, such as `?>10' to test for values greater than 10)
`?foo' to test for an instance of foo
`?is foo' to test is something is foo
`?in foo' to test is something is in foo
`?contains foo' to test if foo is something
`?hasattr foo' to test if something has the attribute 'foo'
`?attr foo ?==10' to test if something's 'foo' attribute is equal to 10
`bar?foo' to test if bar is of type foo, where bar is the name of an iterated object, such as in a for loop or list comprehension. This can be used to clarify when there are more than one object per loop to test.
`??=="four"' to test if the 4th item in a list-like object is equal to the string "four".
`?foo,bar' test if something is of type foo or type bar
`?all foo,bar' test if something is of both type foo and type bar
Any thoughts on this?
Sunday, August 14, 2005
The system is broken. While most studies show the average gamer as being 34 years old, the industry is still trying to sell games to kids and teenagers. Now, I have no trouble with giving a game an AO rating, but why do retailers have a problem selling them? They sure are cutting out a huge section of their consumer base. Besides, Wal-Mart actually does card for M games, last I checked, so why not sell AO games and card them as well?
The bottom line is this: if most of the people buying games are adults, why should they always aim for a rating that lets teens buy it (T or M is usually the highest rating they want)? The answer is that the stores don't carry AO games, but that just brings back the questions about the average gamer age.
In the end, we just need to work to make everyone realize that AO games aren't bad. You can carry them in your store and card anyone who looks too young, just like smokes. Only AO games don't kill people, they help stressed out adults relax after a long day of working as a productive member of society.
Monday, August 08, 2005
So, here I am laying them out. Maybe an IDE will be developed meeting these requests, or maybe I'll do it myself eventually, possibly joining one of the above mentioned projects.
Such an imaginary program we will call, for the time being, The Perfect Python IDE.
- Indentation is important in Python programs. The fact that one can not mix tabs and spaces brings hardship to anyone who commonly edits multiple projects' files simultaneously, when they use different indenting rules. The Perfect Python IDE sees what kind of indenting is being used in the current file, and auto-indent following that style.
- indentation exists both in the actual code and in how the code is displayed. Sometimes a line may be lengthy on a particular display, or when I'm using a horizontally split view. The Perfect Python IDE dynamically wraps the line's display without affecting the source code itself, and even indents the following line for clarity.
- Of course, The Perfect Python IDE knows that if any feature gets in the way, its not a feature; it is a bug. That's why it only follows through with an auto-completion when I explicitly tell it to, and it always implicitly goes away the moment it sees I don't want auto-completion.
- Even the smallest of projects needs a sense of history. You never know when you'll want to undo something you saved a week ago, so version control is a must. An IDE should naturally compliment such a system, like CVS or Subversion. The Perfect Python IDE only asks me for a path to the local working copy, or a svn+ssh:// URL to the repository, so it can just keep the working copy files hidden while I work on them.
- As long as I'm just giving The Perfect Python IDE the URL to the repository, there isn't a need for any silly project files.
- Now that my files are stored in a repository on a remote server, interested people might work on the code, too. They'll probably want the code to work when they update their working copies, so I'd better test before every time I commit something. The Perfect Python IDE can see my test/ directory and my test_*.py scripts and run them, being sure to set the PYTHONPATH for my package.
- UnitTests being run is one thing, but doing something with them when the tests fail is something to be really proud of. The Perfect Python IDE extracts the tracebacks and bookmarks all the lines in the call stack. It even numbers them and displays local values at the time of error.
- The Perfect Python IDE may be perfect, but part of that is being exactly what I want it to be, or what you want it to be. Those things may be different, but The Perfect Python IDE can be different, too. It can be customized at any point; and, it can be customized in Python. Of course, it is used as an editor of those very same customization scripts.
- Not everything needs custom code to make it act right. The settings and configuration can go a long way, too. The Perfect Python IDE never asks me to restart it for settings to take affect, and it always lets me know exactly what any particular setting does.
Yeah, they both have GUI modes, but they kind of suck. They're little more than terminal emulators enhanced for that particular program. Either of them could be a good GUI IDE, but communities around them just don't seem to understand the reason to make it looks "pretty", so I doubt they will, at least, not for a very long time. Despite what many techno-machos say, programs really are better when they're pretty.
Tuesday, August 02, 2005
There are three people in my life that I've ever really considered my best friends. Unlike the childhood movies you might be used to, we weren't like the four musketeers. As a matter of fact, for the most part they barely know each other. But what they all have in common is that at one point, we were supposed to do something big.
I was supposed to start a successful art career alongside Ben.
Matt and I were planning to build a solid tech company from our ideas.
And, along with David, I may have made gripping films of a powerful nature.
None of it came to pass, even though we are still great friends. Ben doesn't draw anymore, David never finishes any stories he writes, and Matt might be a decent SysAdmin, but he can't code a lick.
So where does this leave me? After much of my life looking forward to realizing a dream of potential alongside one of my best friends, how do I drag myself through it alone? It makes me wonder how much I wanted to success, and how much I wanted it alongside a really good friend.
Sunday, July 10, 2005
All the blog services I've looked into just lack something I want. Particularly, the kind of organizational system I'm looking for. I'm building my new FrogTongue with a Tag concept, where Tags are basically labels and any number of them can apply to any number of items of content. Tags can even imply that other tags are applied along with them. This will be very flexible, so I can cover a lot of different topics and keep things seperated where they need to be.
I'll be releasing FrogTongue at some point in the very near future. It won't take me long, and I don't intend to do a lot with it. Involgo and Picos keep me busy enough, at is it.
Thankfully, I'll have some help in that area, with a new coder joining the project. My best friend, actually, who is new to programming, but a very smart guy and I'll be giving him some tasks to do in Involgo, which will be very closed and controlled, so he can learn with some definate goals.
Hopefully this all goes well, and we can get Involgo out the door before the end of the year.
Sunday, June 12, 2005
I began this post a while back, saved the draft, and pretty much forgot where I was going with it. Make what you will of it...
I want people to think that I'm cool. I want to impress people, and more importantly, I want to impress the kind of people who otherwise would impress me. I want all the other geeks to think I'm cool. Hey, I'm human.How do you impress a geek? You be a better geek, in some respect. You write a very useful application, or create an amazingly efficient library for handling a common task. You be the geek the other geeks wish to be. I want to create software, and I want that software to be useful, maybe even to the point of making the world even just a little bit better. If I manage to impress some fellow geeks along the way, then I say that is even better.
To the point I had in mind when I began writing this: I should but do not wish to change my coding style if I want to impress anyone. People commonly don't like my coding style, for various reasons, none of them good reasons, even. There really aren't good reasons to dislike a particular coding style, and I want to make it clear why I think so.Firstly, why I don't think we have no reason to dislike a particular coding style, and how this is different from liking a particular coding style, which I do think we should do. Source code is supposed to be human-readable instructions to computer, but in truth they are no more readable at the lowest level than an executable binary. In the lowest levels, they are all bits, after all. Source code, however, is stored in a convention of bits, which a computer can process not only as instructions to follow, but as instructions to display to the user. The computer, in other words, can display the text on the screen. The biggest mistake in the software development world is the lack of instructing the computer to display this source code text intelligently. Source code presentation has not improved much over the years. We went from displays of hard-delimited lines, to having word-wrapping functionality that didn't do a good job, so we still keep old rules around about the length of the lines, because that's easier in the short-term than just making the word-wrappers smarter. We got syntax-highlighting, and that was pretty basic, but it stuck and works OK. Code-folding came along a long time after that, and it spread quickly and helps a lot, and its at least something near to intelligent, but it still works with those hard-delimited lines.
Why power of the tabIn itself and its symbolism
The tab is a controversial character, because it isn't really a character. The controversy began with the bad decisions in its original creation. The tab exists, really, in two forms, which work together and sometimes separately, causing most of the problems. The tab is a key on the keyboard and also a character present in many text files. It is the tab character's presence in source code that irks as many people as it makes happy.
Friday, June 10, 2005
Right off the bat, I want to say that if you are starting a good band with a good sound, name your band "The Victims", because when I wrote that I immediately thought, "That would be a great name for a band."
So, to the topic at hand. I wanted a blog and every blogger with a sense of trend is talking about the Apple/Intel deals going on before our eyes, and behind our backs. But, not just behind our backs, but behind the backs of several big name companies and tech-world shakers who are going to become very nervous at board meetings for months to come, maybe years, maybe until the very last board meeting their particular company holds. If Cringley is right about Apple and Intel merging, or even if they are only striking lots of extremely friendly, exclusive deals, there is a lot at stake in the world, technologically, economically, socialogically, and politcally.
The first and most important point to make here is to simply point out the amazing sense of irony this situation brings to the table. Do you honestly and fully realize what is going on here? Apple, the only major competetor to Intel's prize architecture over the years, is poised to become their biggest customer. Apple on Intel chips is a strange a sounding phrase as Sadam marrying Mother Teresa!
This move is going to have a two-fold affect on the open source movement, particularly the Linux people. On one hand, everyone is going to have a much slicker choice of alternatives for Windows very soon. On the other hand, this will open up the idea of using something other than Windows to the mind of Average Joe User, so he will be more willing to take a chance on free systems like Linux. It will be interesting to see where these trends balence.
Over on Slashdot, this guy makes an interesting comment about the biggest mythical challenges to the Apple/Intel pair that could pop up. The "Microsoft acquires AMD" is a little bit of a stretch, but the IBM/Cell/Linux idea is probably a crowd favorite. I've been waiting to get my hands on a Cell chip for a long time now, and seeing what it might be able to do in the hands of all those skilled Linux developers and other open source coders is really a fantastic thought. I'd love to get a look under the hood myself.
HP is definately going to be in on this deal, in my opinion. They already make Apple's iPods, they have close ties to Intel (Pavilion and Celeron sure bring in a pretty chunk of change for the two of them), and with a move to Intel it will be much easier for Apple to shift the hardware work over to another party, and focus on the software work they are so blessed at.
These are the cards, and the major players have their hands. How will they play them? What wild cards do they have up their sleaves? I for one am very interested to see how this game plays out. I was about to purchase an iMac or an iBook, but now I'm going to step back and watch, and way, and hope for the best. Rought waters are ahead, but we might come out of it all for the better, or hell could break loose and we'll all be stuck in the mud.
Wednesday, June 08, 2005
I ran a blog on my website (www.ironfroggy.com) a while back, with a very small number of readers. I probably knew each of the readers personally from before the blog, actually. The main reason I hosted it there was to roll my own blog technology. I actually wrote a very basic web-scripting system in Python, that let me embed posts, basic data, etc. into web pages. I even wrote my first GUI application as a tool for managing the posts and categories. To top it off, it was all multi-user enough for my wife to run one, too, and to merge our personal blogs from our homepages into the front page of the website, all in my own primitive scripting format.
What a trip.
Well, for the moment I can't spend the time maintaining my own server and all that, so I decided to move to a blog service. I wanted one that will still let me host from my own site, which blogger.com will let me do. And, when I saw I could post from my phone, I was hooked. Finally, a good way to vent on my lunch break at work!
So, what should a blog be? What should my blog be. I suppose, as any blogger does, I would post about the things that interest myself. I will post about my views of the world, my ideas for software and technology, and maybe some thoughts on my first book I am slowly writing.
This I write for myself, to take my jumbled mind and lay it down, for a moment, into a coherent enough a set of ideas that I can make sense of it, for a moment. Perhaps, just maybe, you can do the same.