A typical privacy agreement:
https://addons.mozilla.org/en-US/firefox/addon/screenshot-pimp-screengrab-scr/privacy/
when i was a kid we had to walk uphill both ways!
i know that seems contradictory but it was on a liquid planet where the gravitational center varied by daytime
don't ask me how i walked on a liquid planet...i have other problems
What is the significance of the oft popular references to romantic love taking in accord the separation typically applied before union?
Is the mistake inventing the time machine or going back in time to ensure the time machine is not invented?
Since you care about X, you should attend to X, because expecting other people to attend to X is predicate upon them caring about it
i see my upload to youtube is waiting for WiFi access. so much fot the promise of 3G
...and thank you, Google
The television in the elevator just told me that corn bread is venerated by Southerners for New Year's fare as it is the color of gold. Is this true?!?
The # of individuals nor the time they put forward nor past success are not good indicators of future success
Normally I hate it when companies I do business with (AT&T, I don't really need your newsletter, thank you very much), but Dyn's CTO had a blog post about SOPA they linked in an email that I thought had some excellent points:
http://dyn.com/sopa-breaking-dns-parasite-stop-online-piracy/
I can't really say much about SOPA except that it is a horrible horrible idea from so many points of view. But Tom's post illustrate some of the reasons why its a technically horrible idea. Just because you can write a law on paper does not make it technically wise or feasible.
jimi hendrix quite a guy
angel in the devil's sky
but i can't understand what he says sometimes
and half the time i think he's high
L. could picture in his mind perfectly the geometric reconstruction in Anton's thoughts of the port. He tried to read Anton's thoughts of his designs but it was too far of a reach already holding the mental map. Anton began to speak, but L. projected, 'No, let me try to read this way'.
His thoughts roused disproportionate anger in Anton, and the latter's mind came collapsing down around L.
"What is art?" Anton asked.
"An expression of--" L. began, but Anton nod his head and raised his hand as punctuation.
"'Expression' is enough," Anton said. He paused, the silence deeper for the stillness of mind. Then Anton leaned close, their faces almost touching. "What would you express unto the world?" There was no answer, for both knew the nameless that was pointed at. "While art can be wrought of only subtextures, and there is some skill expressed in doing so, not of such can all art be manifest," Anton continued, "Use your skill as means of your expression, not as its object."
L bowed his head.
"Shall we continue?" Anton asked rhetorically, and once again allowed their minds to commune in projection of the port's configuration.
I doubt anyone reads this anyway
I have a story that I have been working, on and off, for most of my life at this point. As you might guess, it has changed a lot over the years such that it is hardly the same story. Even after multiple efforts of cleanup, there are still strong elements that I today find amatuerish, but the plot is pretty intricately linked and I'm not sure what to do about that. Maybe I'll figure that out someday. But right now, it is daunting. Some of the writing is really good, probably the best that I have done. Some of it is awful. I'd like to keep the good and discard the bad.
So for now I am going to post snippets of it on this blog. I don't know if anyone actually reads my blog at this point. Probably not. But if you do, I hope you enjoy it. As always, feedback is adored. I don't really plan on explaining context of anything, at least not on the blog. So it will be somewhat of a mystery.
If you, dear readers, are out there, I hope you like it.
How things work
(Noe Valley affects Christmas) + jhammel == http://k0s.org/blog/20111210154108
Frosty the snow man was a jolly happy soul with his coal-black eyes and his corncob pipe and his fifty grams of blow
humans look down on fish because they have such short attention spans that they swim around in a tank all day. but we like to watch them do it...
clean house vs. dirty house
I'm a developer. Given that software development is in a state of burgeoning growth and has not solidified on a methodology (contrast 3rd world factory workers, where their operating methodologies have become science), organization are often inconsistent on how development is done. This is great as a means of self expression, as I as a developer may behave as a craftsman, even an artist, claiming my methodology may make a mark upon the work. But it is bad in the sense of inconsistency, in the same sense whereby artists, being less inclined to survive in primordial culture, are bullied and not favored unless they cater to the powers that be.
So there are essentially two opposing development methodologies:
Both sides have upsides and downsides. It is worth noting that with an ideal API, both sides are exactly the same. If you start with a clean code base, and you have positive changes, you end up with a clean code base. However, this is almost never reality.
The actual effect is that programmers that affect methodology 1. are penalized for their efforts whereas programmers that do not clean up after themselves (re: methodology 2.) are rewarded. How can this be?
Development processes are never light-weight. At least, I have never encountered any that are. Given that, type-1 programmers are weighed down by the effort of making shared code bases cleaner for everyone. OTOH, outcome is measure in short-term incremental goals. Abstract notions like down the road extensibility are ignored. So, by following methodology 2., you are guaranteed a good report card.
I feel like I say this over and over, but if you ignore the crap and hack your shit in and probably make worse crap because you have to work around the crap already there, you achieve "results" and are lauded for it. Mark that these are short term results, the terms defined by those setting the goals and not necessarily for the survival of the organism that is the software you are developing. Whereas if you try to make things better for everyone, you will be laden with the burden of proof, the burden of showing that your provide any value, questioning doubts, and if anything you do, even rightly so, breaks something because of other bad behaviour, you will be crucified for it.
So enters the rock star programmer and his kin. A software project is hard to maintain. Well, yes, legacy is expensive. Even clean legacy and no one has clean legacy. So the common reaction is to abandon legacy and start anew. Why? Two reasons:
A. By starting something new you are no longer bogged down by the decisions, good or bad in the context, of yesteryear B. And by starting something new, you can say that you worked on something new
Do not underestimate B.! The hidden factor that should be considered before you do this is that you throw away the entire knowledge base of a project when starting something new! Take Fennec on nightly. I can no longer give feedback in the app, because there are (evidently, putting on my user hat) no addons. If I can't report bugs, something is wrong. I realize that my primary position is not reporting Fennec bugs. But I used to, because it was easy. And now I can't. OTOH, I get to see that my browser is refreshing on my phone at 60fps. Native UI is speedy, but...
Another classic example is Firefox vs. Chrome. Google was Firefox's partner. Google made some noise when we made a deal with Microsoft and Bing but the fact is we had a browser that complied with their purported ethics and instead of helping develop it they forked it!. Now Chrome has a legacy, and all the smart kids at Google are beginning to see what a pain in the ass it is to have a legacy.
Being a nascent field, software development has many aspects that have long ago been dealt with in other fields, such as the debate whether it is better to keep a clean house or a dirty house. In more mature fields, only in dysfunctional -- and desparate -- situations do you see the logic applied of applying disproportionate effort to work around a problem vs. solving a problem. If you have a clean house, it is easy to keep it clean. If you have a dirty house, less so. But the dysfunctionality comes in several sayings in the software industry on why it is justified to keep a dirty house:
Note that none of these address the issue or tell how to make it better. They're just excuses. But somehow they're believed. They're not taken to be the kindergarten logic they are. If you're a for-profit company and show me a spreadsheet of (untainted) time estimates, I'll buy it. But mostly I feel the same about these as when I hear a review of a movie that's "the best movie of this or any year".
If you ran a house this way, you would never clean anything. You would have a house that got dirtier and dirtier until it was almost unlivable and then you would move. Really. We can do better than that.
I see a lot of old faces at Suicide Club. This means you haven't been following the first rule of Suicide Club: commit suicide! In fact, it is the only rule
NPR is the play closes its doors forever on a biker gang, I can't apologize for the biker, ``Who are sorry in a winged collar? Perkins: I would tell them, ``You gotta respect the Los Angeles International Airport, think of Command. Then, if someone was part of The hottest new Broadway production: The Glossary of the leading brand Witch Project movies
Doing the dirty work? Absolve yourself! With Pontius Pilate Hand Wash
From the makers of Holy Smokes
got an email from my bank today that said, in effect, that they may have accidentally sent me too many emails
I reorganized my site a bit. It now approximately resembles what it should have looked like five years ago. In other words, its the state of the art!
just when you thought my site couldnt get any less readable... http://k0s.org/?css=noir-de-noir
jokes are serious business
I organized my jokes a bit and they now have permalinks and are more of them. Cheers and jeers welcome
The Cloud will change your life!
i was also thinking that what "The Cloud" means is exactly the opposite of what i care about from The Cloud so the idea of the badly name The Cloud is that it doesn't matter what computer I'm in front of wrt what i'm doing sure, it has disc, ram, cpu, but other than that its just a box so The Cloud (pretty much plan 9) is about not being tied in to a particular resource, federation whereas "The Cloud" means using a particular, locked in implementation which is not federation, its just a silo again
its amazing
people have problems; these problems are solvable but instead of solving them The Establishment provides something that looks shiny and fancy but has the exact same problems baked in that is the only problem, i think the only problem worth caring about, except, say, whether my cat is hungry or not
i need to meditate upon this
i was just thinking about Cane's 999 plan i think i'll run on the 666 platform. lower taxes for everyone! plus you get the Devil-worshipper vote
From the most talked about screenwriter of the year comes a new Broadway production:
The Glossary of Alexei Kahn: a play on words
What About Bob?
I was recollecting with a friend about David Lynch's Twin Peaks and got to talking about Bob. What about Bob? Bob was the Demon who posessed Leland Palmer and who made him rape and kill his daughter, Laura Palmer.
While few people claim any direct experience with demons, they inherit a common mythology. Unlike ghosts, demons are not vestiges of lives, but whirlpools in the psychic plane, inhuman. They wish to get into the physical world to fuck things up. Perhaps it is rich and sensuous to them. Perhaps they are concious beings, perhaps not. In either case, they are completely alien to us. They come in through the mind. At first their hold is weak and they can manifest only in short bursts. But once a demon has its tendrils in you, they do not let go. They lurk, in the background, sinking themselves deeper into you, breaking you down from the inside. Eventually, uncontested, they have complete control of your mind and they use you as a shell to manifest psychic destruction on the mortal plane. Demons may be thought of as "real" or merely as metaphors. For me, I don't really see the distinction. Nor does the demon.
I present a hypothesis of how Bob came to possess Leland Palmer. As David Lynch is fond of, Leland is a pent up father with the morals of the '50s that say to smile at the world and hide any unpleasant thoughts even from one's self. The repressed self grows inward and consumes one's self, leading to one fracture. Like more than would admit to it, even to one's self, Leland desired his daughter even from the tenderest age. But he hid this from himself. He could not bear to admit to himself that he had these feelings. When he acted on these buried feelings and molested Laura, he opened this crack. A disparity was born...a cognitize dissonance.
Laura, like all daughters, wished to see her father in nothing but a positive lot. Leland was a little kooky, animated, and basically a great dad. There was something wrong with him, something she could not bear to see, so she hid this from herself. When her father molested her, she sought an illusion that might make the reality unreal.
You have a conflicted father divided between what he thought he must believe and what he felt, and a daughter who did not wish to see the evil in him. They created Bob. Bob was born of them. Not all births are the combinations of DNA, but a synthesis of beings. Between Leland and Laura, a crack appeared, a mutual secret hidden behind a shared desire of illusion and repression. Through this crack the Demon, Bob, entered into Leland and all of the subsequent events were triggered.
"A little boy went out to play. When he opened his door, he saw the world. As he passed through the doorway, he caused a reflection. Evil was born. Evil was born and followed the boy." -- an old tale, Inland Empire
Once Bob got hold of Leland, he took his mind. We know that Leland molested Laura from a very early age. At first it must have been a life-wrenching shock. Bob could only manifest in bursts as Leland still had a fragment of his divided self. He had emotional resistence. But as time wore on, it became easier for Leland just to let go, to pretend it was all an illusion, hidden beneath the surface of his mind, a dream.
Laura was affected differently. Ungrounded by her molestation and by her disparity, she sought a tether to the earth. She sought out all of the advanced school activities, several boyfriends and sex partners, and cocaine to try to tie herself to something. But this all made her lighter, less tied to anything. She positioned herself to be a sacrifice to Bob.
Both parties, in blinding themselves to their own actions, created a subconcious space where the horrors they attempted to oppress could grow and fester.
I do not know what Lynch meant by this presentation. Perhaps it is a metaphor. Perhaps he is telling tales of the supernatural. Perhaps he points to psychic forces which are very real but as are yet misdefined. It does make for a fascinating tale.
i always thought it'd be great for an action movie if someone was about to be shot with a cannon and the action hero said "I hope you enjoy sainthood because you're about to be canonized!"
i get very nervous that i'm doing too much doing and not enough thinking. seems to be the best way to corner one's self
anyone that uses the Socratic method needs an icepick in the eye
the fundamental assumption of the Socratic method is that you know more than another person about their affairs
git vs. hg: the ultimate bikeshed discussion
After listening to the Mozilla and git talk at this week's all-hands and the ensuing discussion, I've decided that the git vs. hg wars are the ultimate bikeshed discussion since emacs vs. vi. You'll probably hear me complaining about git after this post, but I've decided that I no longer need to care about the issue.
Being realistic, I don't really care about VCS (much like editors). Like most programmers, I want to program and integrate my work with the work of others, so in that since I care that a VCS exists and that I can push and pull and what not. But the nuances of how it works....why would I care?
I do care about workflow. It probably irritates me more than it should when simple tasks are hard, but realistically a lot of my time is eaten by simple things gone awry and me having to manually pick up after them. In this sense, both hg and git are awful. I want to pull others changes, program, and push. Anything other than that is a waste of my time. Neither git nor hg particularly makes this easy. hg queues fit my brain better, and I've thought of some pretty interesting usecases for them, but in the hg queue vs git branch debate, neither opinion is wrong any more than painting a bikeshed blue vs.green is wrong.
Looking at the technical merits of the system, git is faster. And that's about it. The rest is all opinion. Neither is particularly nice to automate. Neither of them have particularly automatable workflow. As John O'Duinn points out, when many people argue for git they're really arguing for github, but honestly I think its mostly horrible too. I could go over a system I think is generally better, but honestly there's no point. I won't have time to program it, and even if I did, as long as the bikeshed discussion continues it doesn't really matter if there is something better or even different. Dogmatism has become the dominant moderator.
I realized today that the git vs. hg debate had nothing to do with the technical merits of the system. Rather it was a debate based on two non-technical concepts: how the programmer wants to work and the culture of git users vs. hg users. I'll take the latter first.
While I don't like git and constantly wonder why the fuck I have to type -a for each of my commits, I've learned to use it reasonably effectively as a programmer that doesn't really care about the guts of version control software. Mostly what I don't like is talking to proponents of git. Generally, they have presented git as unquestionably better, they haven't been interested or willing in understanding my problems with the software, they automatically assume that any problem I might have with git or github is a deficiency in me, and when I ask how to do something more than a trivial command in git they throw their hands up and walk away since its not their problem. This is the sort of attitude I hate to see in the open source community: elitism. The people that are more fond of hg, on the other hand, don't really care much about the innards of version control, are more willing to help, and are more willing to listen. In other words, they are more like me.
In a bikeshed discussion, eventually things break to sides mostly based on the "more like me" factor. Instead we pretend that this is a debate about version control innards. Programmers aren't excited about version control innards. The fact that so much debate happens about hg vs. git tells me that something is wrong in the same way that the vi vs. emacs war illustrates that they are both awful editors. Instead, its a debate about how people want to work. git branches vs hg queues, the github workflow vs. a more traditional workflow. Neither is right. Neither is complete. And the whole discussion is pretty pointless.
So I'm content to let the debate run its course. I continue to think that what people want on top of a VCS is a real tool to configure workflow both in the manner that their community works but also how they want to work. But we can't even talk about this until the hg vs. git debate is over. Otherwise the talk degenerates into "well, I'm happy that git does this" or "hg queues are a much better workflow". People won't be happy until they can work the way they want and not the way that whoever is in majority tells them they have to. I can't wait for this day until we can start talking about having real workflow with a VCS instead of the twin crap workflows git and mercurial give us. But I don't think that can happen until the bikeshed discussion is called.
As a passing shot at dead history, Linus once said that by using the same model as CVS that SVN was "the most pointless software ever written". If I were going to be as arrogant, I would claim that by not solving the workflow problem, by introducing a DAG database but not as a library, and leading to the rise of statements like "if you don't have a github account, you don't care about open source", that git is "the most pointless software ever written". But really, I bear no more ill will. I don't care about VCS. I just want things to work.
so as you (assumedly) know...
∴ What are the implications of evolution/time?
"Optional episode commentary by cast and crew"
That's good....I hate those mandatory commentaries...
The Essential Problem of Curation
If X and Y are contradictory to the nature of the workflows, then both people can't be happy. This is a human problem.
an interesting parallel
i was thinking of the Marxism "The workers control the means of production", when in his time was the physical instruments of capital. but today, the means of production are business logic, and while the capitalists (classic sense) present what they want, the software engineers implement the systems to manifest business logic
Pauline's Pizza had entered the shadow stage of a restaurant, where sometimes they seemed closed and vacated forever and others they just seemed not open right now
Joey Martinelli: "Ya know what they say, you can eat more flies with honey than you can with vinegar."
"You've been running it as an Empire that is both time-limited and resource-limited....well, which is it?"
Holy Smokes : the cigarette Jesus used
"The Son of God smoked these...and he didn't die of cancer!"
"If you want to die at the cross as well... Smoke Holy Smokes!"
How to get me to completely ignore your package
http://pypi.python.org/pypi/ab/
One sentence description: Manage your address book.
No long description
My reaction: Well, i'd love to manage my address book. But I don't know what that means, I already have a crappy solution, and since its not telling me anything I'll move on to other things
the longer I'm away from college, the more I forget people's names....like that guy and that other guy with the funny beard...
Here at cccrrraaazzzyyy Larry's Used Cars, Larry went cccrrraaazzzyy and start slashing prices....and throats...
From not-at-all the makers of Cafe Gratitude comes...
"You want some food or you just feeling like standing there and looking stupid?"
Located at 20th and Harrison (right across the street from Cafe Gratitude)
Cafe Attitude: when you want it all up in your face
the internet is a directed graph and each person's personal traversals of the web are each a directed graph. why not show this to people?
Did you hear about the guy that confused the inventor of the steam engine with the Premier of China?
He didn't know Watt from Wen
"This is a message from BART police. In an effort to protect you and your personal electronic devices..."
since the latter == asserted state identity, i can see why they would warrant an usurpation of "property'
[Man walks in to gold and silver + walks up to the counter. Rick + Old Man are there]
Rick: It looks like you're coming to pawn something but I don't see anything
[Man pulls a stick of used chewing gum out of his mouth]
Old Man: Oh mai gawd!
[cut to fact board]
[back to g+s]
Rick: Were you looking to pawn or sell it?
Customer: Actually, I was just going to throw it in the trash but I'd like to sell it
Rick: Ha ha ha
[cut to Rick]
Rick: Used chewing gum isn't worth much, but if I can get it for the right price, I can make a profit, and that's what I'm after
[back to g+s]
Rick: So how much you want for it?
Customer: Well, new it was 25 cents. But I'll give it to you for ten
Rick: No. Look, its been in your mouth....its kinda disgusting really. [pause] I'll give you 2 cents for it
Customer: How about five? I've seen used chewing gum on ebay go for like a whole dollar.
Rick: I'm going to have to wash it off. That costs money. Look, I have to make a profit on it. Three. And not a penny more.
Customer: Would you go four?
Old Man: You're being a fool, Rick.
[Long pause with suspense]
Rick: Okay, I'll do four. But don't -- ew -- hand it to me. Just set it on this paper.
[Old man puts face in palm]
[Cut to Rick]
Rick: I know its an old piece of gum, but I am confident I can turn a profit on it. Or maybe I'll just give it to Chumlee and maybe that'll shut him up for awhile. Ha ha ha
[Cut to customer]
Customer: I was high on mescaline and just wandered into this pawn shop. I was just looking to throw my gum away but this crazy guy wanted to buy it. So yeah, I'm happy.
[Cut to Old Man]
Old Man: I have an idiot for a son.
FIN
the reason i hate most documentation
http://www.virtualenv.org/en/latest/index.html
aside from the URL being retarded, the first thing i learn is that "virtualenv is a successor to workingenv, and an extension of virtual-python."
so if i don't know anything about virtualenv, i now know it is vaguely associated with two other things i know nothing about
The Old Guard
"The prisoner tried to escape by lowering himself on a rope, but I found that con descending"
google has really come a long way from their humble beginnings. now they can nag me into filling out some piece of paperwork with the best of them
itd be fun to be on the moon....if you measured time using earth as your central body then time would purely be a function of geography
"see you at midnight!"
So, for whatever reason, when I updated to the latest nightly of Firefox today homedash, https://addons.mozilla.org/en-US/firefox/addon/prospector-home-dash/ , which I installed awhile ago, decided to renable itself. I remembered thinking at the time that I thought homedash was the future of browsing, but for reasons I can't remember I found it somewhat unusable other than as an experiment. Well, I decided to try out this new version that had turned itself on.
Turns out...its pretty awesome.So, my browser is really the entire screen. srsly. There is a tiny tiny Firefox in the upper left corner which opens up to an entire full Firefox-button type menu. I can scroll through my "tabs" (there are no tabs) and get a fast preview and do anything else I could do through the Firefox button. It is seriously slick. It is not just Firefox in fullscreen. It is a genuine new and cool interface. Coupled with panorama (ctrl+shift+e), this feels like the right browsing experience. Not for all time or anything silly like that. But...just to repeat....seriously slick.
It requires a pretty high familiarity with how browsers work (not Firefox specific per se, but modern browsers in general) in order to really get it. I wish it was more self evident. But for an experimental project, its downright usable. I've already contaminated my home machine with it.
There's a few things I really need. I want a way to copy the current page URL to clipboard. I do this a lot to share links outside of the browser. The best I can do is ctrl+l && ctrl+c && click back on page. This should be a single command to do this (keyboard or otherwise). Also, my page previews a la ctrl+t don't render (linux). I don't know why. I don't actually care about them that much, but the fact that they don't render bother me.
To make this useful for more people, it'd be nice if it displayed and configured keyboard shortcuts. I know ctrl+l, ctrl+k, ctrl+t, ctrl+w (both of them), and that's about it. And I work at Mozilla. I have a short memory for things I don't use, and I don't use things I can't remember. Also, attention to addons? If I need to access addon functionality....I have no idea how to do that. Addons are first class citizens. We should give them that respect. And URLs are first class citizens too. I want to see the URL I am clicking on. I want to see what is loading. homedash combined with https://mozillalabs.com/prospector/2011/07/14/tab-focus-automagically-organize-tab-groups/ could be a good shippable combination.
There are some bugs too, but they're mostly details here.
So, how is it so slick?
I was browsing my website, http://k0s.org (yes, the very site this blog is on!), with homedash in fullscreen. Without chrome and widgets to distract me, with nothing but HTML, it really made evident how my UX worked. What is actually slow that should be snappier? How do things really look minus a virtual frame? Its quite striking when presented to you like that. Also, it made me realize how ugly the default scrollbars are. Yuck. Lets make them better.
So try it out. Maybe you'll love it. Maybe you'll hate it. It's open source -- https://github.com/mozilla/prospector-- so feel free to play along.
On an unrelated note, it's often more (actually) pretentious to sound common-spoken than to use archaic expression forms
13:18 < jhammel> i wonder if i have the most twitter followers of anyone that
doesn't tweet?
13:18 * jhammel should tweet that
about 9 out of 10 times i see regex-based dispatching is the equivalent of making a PDF that reads "Meet me down stairs in an hour" and sent in an email
"Do you espouse a proscriptive or a prescriptive structuralist viewpoint?"
"I espouse an anti-structuralist viewpoint."
annoying
From http://autolycusrogue.weebly.com/submission-guidelines.html
autolycus: rogue literary journal [...] Please ONLY SEND SUBMISSIONS AS A SINGLE WORD DOCUMENT ATTACHED TO YOUR EMAIL
word documents...very this century and very rogue
k0s.org -> web-3.0, part 1: pyloader
Earlier this year, I moved my site to wsgiblob. The idea is that a composite (poly-application) website is an acyclic directed graph (DAG) and that using a native format for the DAG would make true traversal realizable.
wsgiblob was an exploratory project. While I put k0s.org on wsgiblob for several months, it was mostly to remind myself to finish up what I was doing. Amongst a few other things (see http://k0s.org/hg/wsgiblob ), wsgiblob contained various matching conditions for dispatching (via path, domain name, etc) and an object loader. The object loader used an .ini file, with each "app" having an :app section and an :options section (e.g.):
[hg:app] factory = hgpaste.factory:make_app path = /hg [hg:options] global_conf = config_file = %(here)s/hgweb.config
It was a realization that while there were special things going on (e.g. path = /hg ), loading a python object was agnostic to whether or not that object was a WSGI app. I intended to rewrite this at some point.
For wsgiblob 2.0, which became wsgintegrate ( http://k0s.org/hg/wsgintegrate ), after several months of consideration I realized that this rewrite was going to be necessary. Thus was born pyloader: http://k0s.org/hg/pyloader .
pyloader actually contains several utilities for inspecting, constructing, and calling python objects. But what I will talk about now is the abstract factory for creating DAGs of arbitrary python objects that improves upon and generalizes that in wsgiblob. (See http://k0s.org/hg/pyloader/file/9203ca3a5182/pyloader/factory.py#l23 )
Like wsgiblob, the base format is JSON-serializable:
{'foo': # (arbitrary) object name,
{'args': ['positional', 'arguments'],
'kwargs': {'keyword': 'arguments'},
'path': 'dotted.or.file.path:ObjectName'},
'bar': ... } # etc
(From http://k0s.org/hg/pyloader/file/9203ca3a5182/README.txt#l12). An arbitrary name is chosen for the object (e.g. foo) and the args and kwargs associated with its construction are stored. These may also refer to other objects in the same (net) configuration via python string semantics: %(bar)s denotes the bar object, etc. So long as you have a DAG, the connectivity is arbitrary.
Additionally, you can have an .ini file that translates into a JSON file, e.g.:
[foo:dotted.or.file.path:ObjectName] . = positional, arguments keyword = arguments
In addition to just mirroring the JSON syntax, the .ini format allows for easy use of "decorators" as would be useful for matching a request in WSGI, though the entire thing is WSGI agnostic. For instance, a portion of my site looks like:
[:wsgintegrate.dispatcher:Dispatcher]
. = %(hg)s
%(mozilla_hg)s
%(bitsyblog)s
%(wordstream)s
%(dissociate)s
%(anagram)s
%(a8e)s
%(toolbox)s
%(k0s)s
%(decoupage)s
# wrapper decorator
[@:wsgintegrate.match:wrap]
app = %(object)s
[hg:@:path=/hg:hgpaste:wsgi_app]
config_file = %(here)s/hgweb.config
[mozilla_hg:@:path=/mozilla/hg:hgpaste:wsgi_app]
config_file = %(here)s/hgmozilla.config
[bitsyblog:@:path=/blog:bitsyblog.factory:bitsierfactory]
global_conf =
namespace =
file_dir = %(here)s/blog
date_format = %H:%M %A, %B %-d, %Y
site_name = blog
user = k0s
header = %(here)s/templates/site-nav.html
...
The @ symbol is used as a convenient decorator. More about the syntax is available at http://k0s.org/hg/pyloader/file/9203ca3a5182/README.txt#l27
So the real question is....why do this in JSON or an .ini file versus a python file? Well, easy to read, easy to write and all of that. But much more importantly, imposing a structure -- that is restrictions -- in creating an abstract factory allows use and manipulation of said structure. A python file allows absolute freedom, but almost zero chance to be able to robustly manipulate what's going on. You can't very intelligently inspect what the python is doing: trying to do so is already black magic and it will fail in the face of other black magic, on top of being counter intuitive and, dare I say (I probably shouldn't) unpythonic. In addition, the use of python as factory configuration inevitably leads to an incestuous union of configuration and program logic...because its easy to do so. Freedom is never really free.
Contrast an .ini or JSON based approach (or XML, but...shudder). Given an .ini configuration file, you can tell when the file has been modified. Since you enforce a DAG (which covers not only WSGI traversal but a wide variety of practical python problems), you can reload the whole graph or, if you keep track of what depends on what, you can selectively reload only the modified objects. You can enable read or write access through (e.g.) a JSON request. Using this, it would be easy to make a drag+drog SVG map to construct/modify a WSGI site in real time.
I'm pretty proud of pyloader. I'd love to see something like the JSON format for object serialization be part of the standard library. The mapping of path, args, and kwargs fits well to both the JSON and .ini representation, and while the .ini format is somewhat unusual....is it really any more so than e.g. apache or nginx?
While goings are slow, since k0s.org is a side project of low priority (and time, sadly, is limited and taken up by stupid things like laundry), I look forward to improving and leveraging pyloader for k0s.org and other purposes. Stay tuned for more on wsgintegrate, built on top of pyloader.
For more details, see:
removing the perforated strips from a spiral notebook after tearing out another page, i realized that this moment holds some truth at what life is
Machine Architects
A: Divorce yourself from the petty vanities of self and its incesant programmatic concerns. We are simply machines, miniscule cogs in a universe, and as surely as machines we can be operated.
K: To what end?
A: It is with that thought you should gauge telepathy.
Peet's Coffee and Four Barrel come together to bring you a reserve venture into Japanese rice wine: Four Peet's Sake
I wonder what the safe ambient microwave density for (order of magnitude 2.4MHz) wireless devices. Could everyone have (multiple) wireless devices without us cooking ourselves?
not reinventing the wheel is the mark of a good programmer
knowing what wheel to reinvent and when is the mark of a great programmer
automagic development
Consider e.g. Mozilla could benefit from deploy a plethora of tools (see e.g. http://brasstacks.mozilla.com/toolbox/ ) and custom configuration on e.g. developer laptops. Ideally, you would have a variety of configurations that could be mixed and matched depending on desires and needs, but the simplest case -- a single configuration -- can be extrapolated to the more complicated case. Imagine if, when you alter your configuration or any of the provided tools it was automagically pushed to your own fork (pre-provided). Then these could be used for notification and combed for information that can be used to update the canonical repository
the decriminalization of the suicide pill is held to be the greatest furtherment of civilization since the invention of toilet paper
The wonder of manufacture, the creation of form from ideas, of objects that faded even more slowly than the life of animals, has faded as a subject of concious observation in these days. Look to the mandate to build faster, cheaper, more temporary, washing from the mind without leaving a mark
dependencies should be reconciled at packaging time, not fetching time
setuptools presents a typical installer type program which recursively resolved dependencies. This presents several practical problems, most of which involve requiring reliable network access at the time the packages are to be deployed, in addition to version incompatability. If the dependencies were instead resolves on packaging, a full version could be presented with dependencies resolved.
in Europe, there are facts and there are "facts"; in America, we see no reason for the quotation marks
its like when you lose your mail so you just take something out of your neighbor's box...it may not be what you want, but at least you have mail
Cost-cutting strategies for canoe trip
"Alright, I need your best ideas on the table and I need them now!"
I read about 2/3 of this....he's just starting on how to use Class now, which might actually be interesting, but I don't think I can read anymore. While nothing he says is "wrong" per se, and he even invites jQuery authors to fact-check him, he (I can only presume its a he based on language and tone) presents his opinions as if they are valid and correct and conversely that others are invalid. In some parts, I agree with what he is saying. For instance, it would be nice to have a JS something that extended native objects and made inheritence easier. However, to contend, as he seems to, that since jQuery doesn't do this it is therefore not particularly worth considering I find as horribly invalid. Hey, I have my opinions too.
He presents jQuery as a toolkit and mootools as a framework. I've come to loathe the latter term and, thereby, develop affection for the former. When asked what web framwork I like, my answer remains "none of them". A framework, in experience (and I suppose partially in definition), presents a "do things our way and you'll solve the problem we tell you you want to solve". A bit unfair perhaps, but largely true. To name a very frameworky framework, take django. Answers to a few questions:
Etc. Frameworks are dogmatic. If your dogma meshes with the frameworks, or if you don't care, you're probably fine. For instance, if your questions are like "What template system should I use?", django has an excellent answer: "Ours." Or to put it from a more utilitarian perspective, if you're programming something, you probably have something to do. If you're just playing around, fine, it doesn't really matter if you use esoteric language A on esoteric platform because there aren't any design considerations for your software. Interesting problems usually have design constraints. I could easily invoke economics, but I don't even need to. Even if you're a hobbyist and you don't expect many -- maybe even any -- people other than you to use your software, you still have design constraints if, say, you're making a federated bookmark site. You probably don't want spam. You probably need it to work on a standard browser. You probably don't want it to break if you throw unicode at it. You probably want it easy to deploy and maintain. Maybe you don't. Maybe you enjoy complex and fragile deployments. But probably not. Those are pretty low bars, but its not a horrible example. So you make technology choices to do what you want. Most people don't like reinventing the wheel just for fun. If there is a clear, free, OOTB solution that fits your needs, most people will go for it. Software that I don't have to think about is generally software I like. But, failing that, you have to do it yourself.
The first thing you have to do is decide A. what the problem is; and B. what your solution to the problem will look like. If your problem is making software to organize your bookmarks, well, that's a clear problem :) But this really doesn't give a solution. That's where creativity comes in. You think: "What would it look like if my bookmarks are organized?" Several things flash to mind. If you're an experienced designer, you realize that even if your vision is implemented perfectly, it will probably just point to other problems that you didn't even realize you had, or more optimistically, opportunities and ways of intuiting the universe that you were previously unaware existed. So given that, you set down to write it.
The first thing you do is make technology choices: languages, libraries, platforms, etc. Usually you'll use tools that you know if they apply cleanly (unless, again, your real problem is "I want to learn erlang" and the project is semi-incidental). Herein comes the problem. You've imagined your solution. You can program it with these tools. But how much do you work against the grain of the technologies your working with?
Frameworks, as the word is popularly used, work great when you're going with the grain of the technology. If your vision is served by a regex-based dispatcher interfacing with an SQL database with static files served by (e.g.) Apache that is a traditional-type website with an admin panel, then django may work very well for you. If, on the other hand, you're using a graph database with a highly configurable traversal-based dispatcher with in-memory caching of a small set of static files that will work out of the box on any computer with python and (e.g.) setuptools with complex XML templates using inheritence, then django won't help much at all. It will probably mostly get in your way. HTTP is not complicated. Try it! Seriously, try it! The next time you're writing a simple web app, read the headers and body of the request and construct your response by hand. You may never want to do it again, but it will never more be magic. Frameworks (sometimes) do a lot of stuff. Some of it (e.g. i18n) is pretty substantive. But its only useful if you need it and use it.
The problem, if you will, is that frameworks, and more so, the users and proponents of said frameworks, try to tell you what your problem is. Often, I've been told that the problem I'm trying to solve isn't a valid problem. Sometimes that assessment has been correct. Other times that assessment has been wrong. For instance, if the answer you're offered is "do it this way, its easier/better/more pythonic/etc", consider that. Is it the problem you want to solve? If you want a directed graph of bookmarks and someone tells you to use a hierarchy, is that what you want? Does it make it less useful to you? Does it not let you do things you care about?
I was in a dicsussion recently about whether e.g. "/new" or "/new/" was the "correct" canonical resource. The argument given was that "/new/ is easier to match with a regex dispatcher". This is how methodologies taint one's thought patterns. I wasn't using a regex dispatcher, so it really didn't matter to me. And the fact that the answer is tailored to a method -- a framework, if you will -- is to me a good example of bending what I'm trying to do (figure out which the canonical URL should be and how best do deal with the alternate case, redirect or 404) to a particular technological implementation, in this case one I wasn't even using.
That's how I feel about most arguments in http://jqueryvsmootools.com/ . For the record, I don't consider jQuery just a toolkit. It is a framework, with all of the good and bad that goes with it. Its not a complete JS framework: it is very DOM-centric. But its also not just a bunch of tools and integration layers to build your own damn whatever. It is a framework I happen to like and have found useful. But I'm not particularly trying to defend it, or for that matter cast any dispersions on MooTools. MooTools might be awesome! It solves a different problem, but could very well be cool. I just think the comparison is written in a way that turns me off to it since the author is obviously very involved in the MooTools community.
"MooTools is a framework that attempts to implement JavaScript as it should be (according to MooTools' authors)." - well, at least he's honest. What if I disagree? Are there consequences to this? I have things about any language I use that I don't like, but even if I was given carte blanche to change everything, others wouldn't necessarily like my changes.
"...while the jQuery version is more concise; its hover method accepts two methods - the first for mouse enter and the second for mouse leave. I personally like the fact that the MooTools code is more legible but that's a very subjective observation." - yes, and this is what I want 99% of the time for this problem. Its much easier for me to read, contrasting "I personally like the fact that the MooTools code is more legible but that's a very subjective observation."
"Again, the MooTools code is a bit more verbose, but also more explicit. Also note that the design pattern here is to store the reference to #faq in a variable, where jQuery uses its .end method to return to it." -- That is a design pattern and one I disagree with and don't use. jQuery doesn't force you to do this. And I don't. I store the variable like a sane person when jQuery "convenience" patterns don't fit. You can't (in general) match a regex with a regex (for example). Don't become so dogmatic about any tools you use so that you write bad code for aesthetic or design pattern sense. Design patterns are about communication. If you're adhering to design patterns that make you less communicative, stop.
jQuery doesn't modify native prototypes. Intentionally. I'm glad it doesn't.
"It's actually kind of rude to ask users to download two frameworks. The only reason to include two frameworks is because you want to use plug-ins from both, and in the minds of the MooTools authors (myself included), if you want a plug-in that isn't available with the framework of your choice, it's more appropriate for you to spend the time porting it to your environment than to ask your users to download another framework." - that's probably true. Note the word framework. The toolkit philosophy is somewhat different. A tool solves a specific problem. A toolkit (my definition) is loose integration layers on top of tools that work well together. The difference? While a framework tries to put your problem in its box, if jhammel's mathtool and joeuser's graphtool work well together, why not use them together?
So, really, no slight on MooTools. I will check it out and play with it someday. It probably solves a lot of interesting problems. And I will continue to use jQuery for the problems I know it solves well, which as the author correctly points out are not nor are meant to be all of the problems in JS-land. I do resent the framework >> toolkit attitude that he espouses. But that's my opinion, based on my practical experience. I can already think of arguments against my case and you're free to disagree
Dear Misters Hanna and Barbera, respectively,
Sirs ! I empart this correspondence to both praise you with one hand and to scold with the other your most interesting presentation, The Great Grape Ape Show. This show both entices and fulfills with exhuberent whimsy, imparting lessons both moral and esoteric, not to mention the excellent entertainment value therein carried. However, Sirs, I would implore you to consult with your designated experts concerning the adherence to physical law in such cartoons! While aspects such as a beagle that talks -- and has been given license to operate a motor vehicle -- are to be expected in the genre, and even the implausible event of lifting up an entire jail and placing it over suspected criminals with its structural integrity intact may be lent (however reluctantly) some creedence, I find it impossible to suspend disbelief that a forty foot ape could leap on to a cargo van, still in motion, without any impact to the detriment of the vehicle. Using an estimate of a six foot gorilla at 800 lbs [Reference: wikipedia], a forty foot gorilla may be conservatively estimated at over 80 tons (metric), accounting for purely the scalability of mass into three-space and not taking into account the bone and organ enlargement that would be required to make feasible the existence of such a gorilla. Even from the modest height of ten meters, with an (again conservative) estimate of an impact moment of under 0.1 s, this provides a force far exceeding that required to crush a cargo van even of reinforced titanium! This isn't calculus -- this is simple arithmetic! Surely the poor Beagly Beagly would be crushed every time Grape Ape lept on to his vehicle, ignoring entirely the effect of the lateral momentum on the van's dynamic stability. While I applaud you for this and other fine forays into the medium of animation, the blatant disregard of simple physics cannot be overlooked. In the future, please consult your fact-checkers, or my services may be sought by appointment. And I would implore you, Sirs, for the sake of your reputations, to issue an apology for your oversight in this matter.
A concerned and devoted fan,
Jeff Hammel
re http://k0s.org/blog/20110517142323 , i was joking but.... http://www.tetris1d.org/tetris.php
captchas are like every other thing in webdev: they're extraordinarily easy but all the baseline implementations are awful
"bb&beyond prices themselves like they were moderately fancy when in fact they're just moderate"
(...could almost be a NewYorker cartoon caption except that it mentions BB&B at all)
re http://k0s.org/blog/20110514182108 :another classic blog post runed by misspelling
application of a wine rack
while from a perspective, a wine rack is essentially meaningless furniture, holding bottles that could just as easily stand on a floor, counter, or table uncontained, the wine rack presents the wine with a distinction that is both aesthetic and practical.
when retrieving a bottle from the wine rack, the guest is given an air of mystery to the story of the wine. is it a prized bottle saved through the years for this moment, or simply a forgotten vintage that has lingered and pulled out by chance?
wines tied to one's story should be buried deep, unseen in the wine rack, while more casual bottles should be more evident. the wine rack should be in no real categorical order, save perhaps for very large racks where such is necessitated.
all bottles in a wine rack should be good, or at least presumed very good if they have not yet been tasted. a poor wine presented from the rack will cast doubt to the quality of the entire collection. lesser wines unworthy of the rack, if kept at all, should be kept physically separate so that the bringing of a wine from the rack -- part of an occasion -- is not confused with simply drinking an indistinct wine.
when the wine is presented to a guest, the story of the wine, if mentioned at all, should be only as a trivium in the context of a party favor. it should not be boasted of, only presented as the condensation of its story .it should never be mentioned out of obligation or to alert the guest that they are drinking an especially distinct wine. the nuance must be appreciated through its rise to the senses, not by casting attention upon it. of course when the nature of the wine is inquired into, such should be presented save when it would be uncouth.
stop for a coffee
At my morning coffee spot behind a guy whom the cashier was flirting with with such abandon that she forgot how to operate the cash register. This further disconcerted her in the presence of a hot boy that she accidentally charged him an arbitrary amount, points to be worked out later after he left her morning. I wondered what it would be like to be her. Covering my paper cup with a plastic Solo-brand traveler lid, I spied the book she was reading. While I did not know the title, I judged the book not by its cover but its relation to the reader, ascribing to its words, its author, all of the facets of her witnessed through a typical moment's fumbling. I wondered why she read. Did she read because she enjoyed it or because it was a thing to do?
In my obsessiveness, I applied the same lens to myself. I once thought I had a good understanding of how things worked, at least from the point of view of a hyper-evolved monkey in an ephemeral civilization built on economies of imagined exhuberence. Now....less so. Why do I read books? Do I read them because I enjoy them or because they're a think to do? Have I fallen from some intelligent perspective and am now an artefact of what I was (likely) or was I just never that bright in the first place (also likely)? And what does it matter? Nothing has changed that the greatest relief in my life is that the universe is not my sole responsibility. So I learn to take solace in my inadequacies and insignificance
There's something horribly and inappropriately decadent about drinking Chimay blue straight from the bottle
sum peephole complane abowt mai sepllung butt eye doent allways half thyme too pay a tension two details
chores
So there are three kinds of tasks:
People often assume that I favor tasks of type 1. and disfavor tasks of types 2. and 3. Not so! While there is something satisfying about type 1. tasks, in reality its not realistic. Even for the examples given, there may be follow-up to the novel and the SATs are just a step towards college. I'm quite content with type 2. tasks...that is the bulk of life.
Its the type 3. tasks I don't have much respect for. When effort is duplicated, or worse, when effort results in more effort, this is the beginning of untenability. Let's quit tolerating this
my curator sense tells me if the classifier approach of toolbox could be merged with hierarchy something awesome would happen...
how i write a letter
...kinda sucks. So I switch computers, Alot . Which means I need a way of having a long email live in several places. Unfortunately, my mail program (which will remain nameless) isn't really quite up to bar here. Not to mention that an offline editor, whose purpose is to edit, is going to be Alot better at editing than something rolled into to a mail program. So I edit files and sync the files, something I already have a solution for . However, my problem is exacerbated by the fact that my MUA doesn't let me insert a file into my message :/ Nor, for reasons I don't understand but are probably intrinsic to X and/or GTK, does xclip -i < myemail.txt and shift+insert do what it should and solve about 90% of my problem. So here's what I do:
3. Make my screen really really tiny so I can copy and paste the entire email. 4. Paste the entire email.
Sound stupid? It is! How can it be 2011 and computers be so awful? :/
New! from Baskin-Robbins:
Iraqi Road iced cream
Now with more marshmallow IEDs (improvised explosive deliciousness)!
Try with a scoop of Abu Grape!
Q: Why was the president so eager to have the text line up with the margins in the Patriot Act?
A: So that it would be justified
dna lounge was packed for probably the one event of theirs i'd ever care about so i passed them by. i heard industrial from slims but it was a bear party so i split back to mission. went to that club on 16th that i still don't know its name. the dj was a little awesome but it was crowded so i couldn't dance and it sucked.
Victor - "Finally found a wine rack at the MOMA store which was surprisingly reasonably priced. Drank an espresso and smoked a cigarette across fron Moscone center where a lady I saw earlier was still on the phone."
didn't go to the container store because they might try to sell me a shoe rack as a wine rack and shatter my entire belief in rational thought
now at beauty bar for the first time ever having a beer while i wait for pizza since amnesia had a band. its actually not horrible this early. everyone is cliquey and wont talk to me but nothings different there
i am in crate and barrel shopping for wine racks. everything is too new and expensive but some of their bars are nice. theyre playing the muzak version of nevermind
│cat american_politics.py parties = ['Democrats', 'Republicans'] current_party = 'Democrats' debt = 7E13 deficit = 1E12
bug trackers need a way of attaching patches with the message "Look, here's a free patch, but don't expect me to further work on it"
Stages of language mastery
So in writing toolbox (https://github.com/k0s/toolbox for now, not my idea to use github so don't yell at me) I realized I didn't know JS nearly as well as I thought. This is to say....I know how to do stuff in JS, but it is more difficult to structure it than I thought.
I've realized that there are different stages for learning a programming language. This is given the assumption that one knows how to program but one is learning a new language/way of doing things. How do they go?
In python, I'm probably a 4. (roughly speaking). In JS, I had previously assumed I was a 3, but really I'm a 2.5 tops.
idea that someone will probably steal and do something evil with
So....you have search algorithms that e.g. count where the page is linked from. What about scraping names. E.g:
Jeff Hammel was at war with the evil orcs of Saruman the White
So you scrape and analyze the text nodes and see how people are related to each other. You can construct a social graph and asociate people with things and other people. Pretty evil, eh? So why hasn't anyone done it?
My experience with HTML and CSS (especially forms)
We may speak of what we call reality as solid by convention as there is entropy and an arrow of time to which all actions are fixed and we fall from them to the future. Yet actions fall from the interwoven thoughtscape. Is there not a vantage point that plants this astral plane in solidity?
I have now been at Mozilla over a year. I won't pretend any of it has been easy -- even in things I have prided myself on doing well in, it is a continuous challenge to do more, better, effectively.
As you can tell from my recent slew of blog entries not to mention press all over the media, Firefox 4 came out yesterday. It was my first major launch at Mozilla and I can only say that I am impressed -- not only by the fact that everyting went real smooth, but also at reflecting upon all of the progress that has been achieved in the last year and how after the launch (the very day), a plethora of conversations ensued addressing so many of the issues that have been on my mind for awhile. Sometimes I'm really proud of us.
Another thing that really hit home with the launch is that Mozilla is a community. That is what it is. While the general reception by the tech press regarding Firefox 4 has been positive (our new CEO, Gary, has been most excellent in translating our values and what we do to a form that the press could convey. kudos!), there have been numerous articles predicting the demise of Firefox to Chrome and IE. Nothing new here. But having been here for a year and going through the Firefox 4 launch has given me a new understanding of why these articles are at most unimportant. We're not offering the same thing as what Chrome or IE or Safari are offering. We're offering community. We use phrases like "the open web" to describe what we want and -- truly -- our values are aligned with our words ... because they can be, because these are really why we exist. Not for profit. But while anyone can recite pretty buzzwords, we really do allow the internet to become something that is participatory in its construction.
We build the internet. We all do. At Mozilla, we work to raise awareness of how the internet works and how its not something that is written for you that you are just following some path on, but that you are part of. Since the launch, so much of the discussion has been about how to empower our community -- us -- to make the internet what they want. The process can be cold and prickly now, like with most open source projects of any size. But we believe in what we do. And we do it well. If you want to compare the nuances of technical characteristics of Firefox, Chrome, IE, and Safari, I would still say, objectively as I can be, Firefox is superior, but I could see other points of view. But we are the only one of these whose purpose is to build a better internet for you, for all of us.
In the first 36 hours, about *one in thirty' people in San Francisco downloaded Firefox 4: http://glow.mozilla.org/
oh SF !
i wake up at 4a to go to the Firefox 4 launch party. i walk over a bridge i could have well gotten mugged carrying an expensive computer. i walk over a giant hill in the rain to wait for the first caltrain, an awful local one. but the thing that gets me ... no fucking coffee house is open
I hate to be the one to say this -- again -- but the clean energy problem is not hard to solve. Rather, it would not be hard to solve if it was a societal priority. Its not solved because its not as cheap to do. So....no one is going to do it until it is. Invest in energy saving technologies. Invest in renewable/clean energy generation. Its not hard. Its just expensive.
Or, think of it another way. You can live off of rice and beans for less than $50 a month. I know this for a fact. Or you can eat a more balanced diet. We(=society) say, "Hey, you're a consumer, do what you want! In fact, spend more because it elevates your social status and is good for the economy (albeit, not your economy)." But as society, we don't make decisions like this, at least anymore it seems (unless someone important gets a kick back, see the Iraq war). Why not? Why should we make decisions based on dollar figures rather than what the dollar actually represents -- that is, prosperity?
I was somehow hoping that Barrack Obama would, as part of the stimulus, do what I thought was obvious -- creating jobs by investing in energy technologies vs or in addition to giving over -- let me spell it out -- $1,000,000,000,000 to (e.g.) Wall Street. I haven't done the math, but, really, how much clean energy would that buy us? Things to ponder
You sculpt the future from your expectations. If you open yourself to the will of the universe, your dreams will take you to wonderous and terrible unknowns. If you are insistent in your expectations, then time is forced to yield only your greatest doubts realized.
when solving a problem, don't go through the steps about what you need to do to solve the problem. instead, imagine how things will look like after the problem is solved and do that. the former, while more expedient, tends to lead to cruft. the latter, to contrast, will give you the clean solution you really want
a membraned creature has several architectural disadvantages. the toxins taken into the body must be processed and expelled. processing toxins ages the body and contributes to eventual system failure. the membraned creature therefore is subject to the environmental absorption rate and thus the chemical nature of the creature is revealed as opposed to it being a 'black box' of conciousness. it is therefore concluded that all membraned creatures are subject to ambient toxicity, permeability being a constitutive property of a contained existence. the only invulnerability: permeability approaching infinity
i sit in bars and take notes. i'm not sure how its come to this. i don't hang out with anyone. sometimes i just stay in my house and, i don't know, program or listent to NPR ... or paint ... or whatever. but being a programmed social creature, i go out. i'm too shy and antisocial to talk to anyone. so i don't know why i do it except to be around people. so i go to bars, even if its just a Thing To Do. i don't know where to put my eyes. eye contact is key. i accidently made eye contact with a girl when i thought she was someone i knew and she talked to me. silly isn't it? i'm not sure which is more silly: that she was compelled to talk to me because i made eye contact, or that i don't try to exploit this eye contact thing to get girls to become superficially fascinated with who i would pretend to be.
i was at, if you will, a "happening club", writing in my notebok, when a very attractive girl said to me, "so you come to a bar to take notes?" i didn't really have much to say to that
there's something nice that internet searching "long pants" actually does what i want, except the ads on top
I was stupid enough to open an envelope saying "Financial Information Enclosed"
""" Debt can feel so overwhelming [...] A Discover Personal Loan can make all the difference! """
...no comment
CSS-like metadata for files
I wonder if anyone has played with attributing metadata to files with css selectors. You have selectors for files, which albeit would look slightly different than CSS (but very similar) and you can put metadata on them:
*.txt {
type: text/x-rst;
}
"Al Qaeda gave young people drugs"
Figures. I thought I was watching democracy unfurl, but what was I thinking?
If you tell someone to do something, you have a certain resposibility that falls into a finite set of categories:
Failure to acknowledge this responsibility leads to unhealth and a bad disposition for all affected parties.
Teh factz: 1. most coders hate to clean up after themselves 2. most coders who are not in 1. don't want to be yelled at for making a mistake 3. most coders who are not in 2. don't want to be yelled at for wasting time 4. most coders who are not in 3. don't write code
Teh kingdom: Meet OpenSorceum, a once peaceful land on the edge of the sea. For thousands of years, OpenSorceum lived in peace. But villagers lived in fear -- there were places in the Code Woods that no one would go. The couldn't understand the code! They were afraid to change the code! Aged wizards claimed that the code could be changed by no man but he out of prophecy....
But this was a lie!
The dark Code Woods encrouched on the world of light, isolating villages, and the kingdom of OpenSorceum faded into a world of proprietary web services and ancient hacks.
Ur qwest:
To take back the code and have once again software == intent!
Ur Toolz: 1. A VCS repository w. A text editur 7. tests! 8. The Holy Lamp of Continuous Integration!
With these tools you are so tasked with the slaying of bugz! Fear not! Continuous Integration and tests will protect you lest you falter! But in order to check your bugs into the great vessel of VCS, you must slay Cruft!
...In other words...clean up shit until you have enough XP to check in, you lazy bastard
I realize I'm oversensitive to this crap but....
http://stackoverflow.com/questions/533857/whats-the-best-web-image-search-api/5038521#5038521
Gives me a good excuse not to write software in my free time!
possibly the best beer ever: http://beeradvocate.com/beer/profile/1146/10672
this is my former favorite and a close second: http://beeradvocate.com/beer/profile/24/36
i hate it when i lose things
There's a quote I heard, sampled in a song, so I have no idea whence it originates, that I would love to find....but google...and the interior of my head are being useless. Its gist is "It is not uncommon, not rebellion, to stand against the faults of the establishment. But to rise up against your own generation, and to cast them down and ostracize yourself from them...that is the path to singularity." I fucked up the phrasing, other than the "rise up against your own generation part" -- that part is close, anyway -- but this speaks something to my life.
When I was a wee slip of a lad, I was pretty popular in my rebellion. I rebeled against corporate rock, and drug laws, and capitalism. Maybe, in ways I couldn't express, it was more subtle than this. But these were the epithets I uttered against the universe. While these are somewhat contraversial topics for high school, they're not exactly hard things to support. Yes, art should come from the heart. Yes, the criminalization of drugs is basically retarded. Yes, the competitive system of capitalism has some pretty bad effects. But its easy when you can speak out against something from a counter-culture who is willing to support you.
I'm not sure if that's rebellion
the civility of a place is inversely proportional to the length of time from when the walk symbol turns red to when the traffic light goes yellow
there are 01 kinds of people in the world
those that understand the difference between big and little endian binary and those that don't
Two guys are pass by a playground when they see a kid's merry go round.
"I bet you can't push anyone I put on there," said the first guy.
"I bet I can!" said the second guy.
So they put on kids, adults, fat guys, and, sure enough the second guy had no problems. "Give up?" he asked.
But the first guy pulled over Jesus on put him on. The second guy pushed as hard as he could and the merry go round wouldn't turn.
"Okay," he said, "But that's Jesus. I mean, seriously, he probably used his God powers to stop me."
"Fine fine," said the first guy. This time he picked Mohammed and put him on. Again, the second guy couldn't turn it. "I don't know what's going on here," he said.
"I have an idea," said the first guy. Nostradamus got on. The second guy pushed as hard as he could but, once again, he couldn't turn a prophet.
A ping math lesson
I got to see ping's counter turn over:
64 bytes from 74.125.224.82: icmp_req=65534 ttl=55 time=33.7 ms 64 bytes from 74.125.224.82: icmp_req=65535 ttl=55 time=18.4 ms 64 bytes from 74.125.224.82: icmp_req=0 ttl=55 time=17.3 ms 64 bytes from 74.125.224.82: icmp_req=1 ttl=55 time=15.4 ms
What are the odds? No, seriously, what are the odds?
So you have a 25 line terminal over, lets say 65000. So 1/2600 (where the magazine gets its name! Not really). But, lets say at most I'm looking at that particular terminal on that particular screen one percent of the time. So 1/260,000 ! I mean, its not lottery good, but its good!
However, its a complete piece of steaming bullshit.....*like* the lottery! This is the chance that I happen to look over this particular time and see the counter reset. To really see if its abnormal, you have to integrate over all time. I don't know what that number is, but its not insignificant. Comparable to 260,000 in my life? Quite possibly.
Math teaches us a lot of things. One of the things that it teaches us is how easy it is to interpret facts however you want, but that this has very little to do with truth
there are two kinds of problems in the world
those i don't have to care about and those I do
if I don't have to care about it, then good, it works and I can move on with my life
if I do have to care about it, then I'm going to want it solved properly
"this works by annihilating your particles with antimatter"
"and then i'm reconstituted on the other side?"
"sure, whatever makes you happy"
What Grinds My Gears
When sciency things start a sentence with, "Inside a black hole, ...."
Unless the next words are "you'd be dead", it's probably misleading.
We've really evolved, Alot
It used to be that I would have plenty of time to eat a bowl of cereal before my computer boots
Now that is no longer true
But I do have plenty of time to eat a bowl of cereal while I get on the wireless network
What times we live in! What a brave new world that has such virtual people in it!
in computer architecture, you run into limitations of front-side bus
in New York, front side of bus run into you!
From the makers of "The Makers of the Internet" comes....
The Internet: the director's cut
Coming soon! Available on 524 blu-ray discs
How to ensure frustration in linux developers
This has literally been my experience for the last 10+ years
"Frodo was attacked by a barrow wight!"
"Gasp! By Barry White?"
"No, not Barry White. A barrow wight!"
"Abbey Road white?!?"
"No! A barrow wight!"
12:59 < jhammel> i generally know what i want/need to do
12:59 < jhammel> i just have a hard time communicate with it
13:00 < jhammel> er, communicating it ;)
Another good thing about SVG
https://developer.mozilla.org/en-US/search?q=talos
See the second result, as least as of today
I finally understand why people like twitter
They can feel like they're doing something just by liking things
Of course, for that reason, I hate it
Alot of semicolons:
;
;;;;;;;;; ;;
; ;;;;;;;; ;;;;;; ;
; ;; ;;;; ; ; ;;; ;; ;;; ;;; ;
; ;;; ;;;;;;; ; ;;; ;;;;;;;; ;
; ; ;;;;;; ;;;; ; ;; ;; ;; ;
;;;; ; ;;;; ;;;;;; ;;;;;;;;
;;;; ;; ; ; ;;;;; ;;;;;;;;
;;; ; ; ;; ;; ; ;;;;; ;;;;; ;
;;;;; ; ;;;;;;;;;;;;;;;;;;;;;;;
; ;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;
;; ;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;; ;; ;
;;;;;;;;;;;;; ;;;;; ;;;;;;;;; ;; ;;;;;;;;;;;;;
;;;;;;;; ; ;; ; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;
;;;;;;; ; ; ;;;; ;; ;;;;;;; ;;;;; ;;;;;;;;;;;;;;;;;;;;
;; ;;;;; ;; ;; ;;; ;; ; ;;;;;; ;;; ;; ;;;;;;;;; ;;;;;;;
;; ;;;; ; ; ; ;; ; ;; ; ;;;;;; ;;;;;;;;;;;;;;; ;;;;;;;;;;;;;
;;;;;;; ;; ; ;;; ;; ;; ; ; ;;;;;;; ;;;;; ;;;;;;;;; ;;;; ;;;;;
;;; ;;; ; ; ;; ;; ; ;; ;;;;;;;;;; ;;;;; ;;;;;;;;;;;;;; ;;;
;;;; ;; ;; ; ;; ; ;;; ;; ;;;;;;;;;;;;;;;;;; ; ;;;;;;;;;;;;;;;
;; ;; ;;; ; ;; ; ; ; ; ; ;;; ;; ;;;;;;;;;;;;;;;;;;;; ;;;;; ;;;;
; ; ; ; ; ;; ; ;;;;; ; ; ; ;; ; ;;;;; ;;;;;; ;;;;;;;; ;; ;;;;;
;;;; ;; ;; ;; ;; ; ;; ; ; ; ;;;;;;;;;; ;;;;;;; ;;;;;;;;;;;;;
;;; ;; ;;; ;; ; ;; ;; ;;; ;; ;;; ;;; ;;;;;;;;; ;;;; ;; ;; ;; ;
;; ; ; ; ;; ; ;;; ; ;; ; ; ; ; ;; ;;;;; ; ;; ;;; ;;;;;;;;;;;;;;;
;;; ;; ;;;; ; ; ; ;; ; ;; ;; ;;; ;;;;;; ;;;;; ;; ;; ;; ; ;; ;;;;
; ;;; ; ; ; ;;; ;; ;; ;; ; ; ;;;; ;;;; ;;;; ;;;;;;;;;;;;; ;;;
;; ;; ;; ;;; ; ;; ; ;; ;; ; ;; ;;;;;;;; ;; ;;;;; ;;;; ;;;; ;;;;
;;;; ;;; ; ; ; ; ; ;;;;; ;; ;; ; ;;; ;; ; ;;;;;;; ;;;; ; ;; ;;; ; ;
;;;; ;; ;; ;; ; ; ; ; ; ; ;; ; ;;; ;;;; ;;; ;;;;;; ; ;;; ; ;;; ; ;
;;;;; ;; ; ;; ;;; ; ; ; ; ;;;;;;;;; ;;;; ;;; ;;;;;; ;;;; ;;; ;;
;;;; ;; ;;; ; ;; ;; ; ; ;; ; ; ;;; ; ;;; ;;;;;; ;;;;;; ;;; ;; ;; ;
; ;;;; ; ; ;;; ; ; ; ; ; ; ; ;;;;;;; ; ; ; ; ;; ;;;; ;; ;; ;;
;;; ; ;; ;; ; ; ; ; ;;; ;; ;;;;; ;; ;;;;;; ; ; ;;; ; ; ;;
;;;;; ; ;; ; ; ;; ; ;; ; ; ;; ;;; ;;; ; ; ;; ;;; ; ; ;;;;
;;; ; ; ; ;; ;; ;;; ; ; ;;; ;; ;;;; ; ;; ; ;; ;; ;;; ;
;;; ;; ; ; ;; ; ; ; ; ;; ;; ;; ; ; ; ; ; ; ; ;; ;; ;;; ; ;
;;;;;; ; ; ; ; ; ;; ;; ; ;; ; ;;; ; ;; ; ; ;; ;; ; ;;
;;;;;;; ;; ; ; ; ; ;; ;; ; ;;; ;;; ; ;; ; ; ;; ; ;; ;; ;; ;;
;;;;;; ; ; ; ; ;;; ;; ; ;;;; ; ; ; ; ; ; ;;; ;; ; ;; ;;;;;
;;;;;;;;; ;;; ;;; ;; ; ; ;;;; ; ;; ; ; ;;; ; ; ;; ;; ;; ; ; ;
; ;;;;;;;;; ; ; ;;;; ;; ;; ;;;;; ; ;; ;; ; ;;;;; ; ;; ; ;; ; ; ;;;;
;;;;;;;;;;; ;; ;;;;;;; ;; ; ;;;; ; ; ; ; ;;;;; ;; ; ; ;;; ;; ;
;; ; ;;;;;;;;; ;;; ;;; ; ;;; ;;;; ; ; ; ; ;; ; ;;;; ; ; ;; ; ;;; ;
; ;;; ;;;;;;;;;; ;;;;;; ;; ; ;;;;; ; ; ;; ; ; ; ;;;;;;;; ;;; ;; ;; ;;;
;;; ;;; ;;;; ;;; ; ; ;;; ; ;; ;;;;; ; ; ; ; ; ;; ;;;; ; ; ; ; ;; ;;
;; ; ; ;; ;;;;;;;; ;;;; ;;;;;; ; ;; ; ; ; ;;;;; ; ;;;;;; ;;;; ;;
;;;;;;;;;; ;;; ;; ; ; ;;;;;;;; ;; ;;;;;;;;;;;;;;;;;;;;;; ;;;; ;
;;; ;;;;;;;;;;;;; ; ;;;; ;;; ; ; ; ;;;;;;;;;; ;;;;;;
;;;;;;;;;;;;; ; ;; ;; ;;; ;
;;;;; ;;;;;; ; ;
"Chase could double your deposit, up to $5,000!"
Most people look back at the macroeconomic indicators and cite these as clear portents towards the collapse of major financial institutions in the recent crisis.
For me, when banks started emailing me contests telling me how I could get rich quick, that's when I had some idea that bad things were happening on a societal level.
I don't want my bank to mail me contests! I want my bank to be boring, efficient, and basically a place I can put my money and not think about it. If I ever have the capital to go after some risky venture, well, maybe i'll do that. But I certainly don't need the prompting.
All my life I was told I should go to college. The economics of college were never really explained to me -- all I knew is that it was very very expensive. Over and over my parents told me, "Don't worry about paying for school, just worry about getting in to the best school you can." I suppose by my teenage years when I started to question everything else I should have questioned this too, but it had been repeated to me so many times I thought there was some master plan to be had.
Well, there wasn't. My senior year, when the rubber hit the road as they say in the venacular, they changed their stance a bit, "Well, we don't have any money. You're on your own." The school I ended up going to for undergrad and my master's was Worcester Polytechnic Institute. Its a pretty good engineering school, maybe a slot down from an MIT. They even gave me a scholarship of $10,000 a year. But even with that, at the end of my undergrad I had accumulated over $100K in student loans. Everyone else was doing it, so it must be cool. Right?
My grandparents even helped out quite a bit. As a graduation present, they paid off most of my loans. Mind you, most of over $100K still leaves tens of thousands in outstanding debt. I got my Master's in some esoteric field and I didn't know what to do. So I went to .... more school! at UC Berkeley. Berkeley's a public school, but living in the Bay Area is expensive. So more loans. A lot more loans.
I ended up leaving Berkeley to take a fairly well paying job minus the degree. By this point, I was again at way over $100K in debt. I had no capital. And I got into financial troubles for reasons having nothing to do with education. I wasn't partying it up or doing anything particularly foolish. Just bad circumstances and helping out other people. So I had to take out more loans. Even with my decent salary, about half was going to student loans even before having to take out the personal loans and maxing out my credit cards. Afterwards, there were months when I mostly ate beans and rice for financial reasons.
Now I'm at a great job making even more money. I don't particularly have any immediate financial hardships. I generally spend how I want, but my life isn't particularly expensive. I don't own a house, a car, or anything worth over $1000 (I'm neither proud nor not proud of that, its just how it has worked out). But its given me a chance to reflect.
Even with my salary, which is more than I really ever thought I would make, it will likely take me to my 50s to pay off my student loans. Read: my retirement plan is....paying off my loans early. I'm lucky and my employer contributes to a 401K. But its not going to be anything to retire on.
I often wonder where I went wrong, exactly. Loans aside, I'm very happy where I am, career-wise. But financially, I'm in a real pile of crap. Yes, I have a good salary. But my loans require me to have a job with a high salary just to make the payments. Its pretty much indentured servitude. Having not gotten my doctorate, I probably shouldn't have gone to Berkeley. But what could I have done with my master's degree? I didn't know then and I don't know now, and not having any money to live off of, its not like I could have taken time off to figure that out. Its kinda "get a career right quick". I was always jealous of relatives and friends that actually got to take a few months off and reflect on things. I really need that right now. But que sara sara.
Financially, I probably would have been better off if I had taken my alternative plan I formulated at 19. I was going to go to a 2 year trade school, become a welder, and screw the educational complex. At the time, welders were in demand (I have no idea now). It paid fairly well ($40-50K again at the time). And I would have been making a positive income for ten years instead of kinda just starting now. Again, I love my job now, so can't really complain about how things ended up. But it would have been nice to have a job where I could work 8-5, go home and have the rest of the time to do whatever I wanted. I'm mostly a thinker. I think about things and I play with thoughts. This is extraordinarily time consuming to do in depth. I also tend to be depressed and physically unwell. I am jealous of my coworkers that feel fine (physically and mentally) everyday. Most ever day I hurt. Most every day is a struggle for me. But with the indentured servitude of debt through student loans, I have little choice but to plod on. I don't know if it helps me or anyone else not to really have a chance to get a handle on my life.
I often joke that I should become a motivational speaker for high schools carrying the message, "Don't pay for school, kids! It will ruin your life!"
COUNTER, Inc: developers of high-precision digital timers
Interested? Call today for your free COUNTER-example
"When I was a child, I thought as a child and spoke as a child. And when I became a man, I took that child out back and had him shot." -- C.S. Lewis
Mission Bars: do we need more of them?
I need a better hobby. Generally, when I'm not programming or eating or sleeping, my hobby has been going to a bar (whichever) and generally not talking to anyone. I'd much rather go to a friend's house and/or talk to someone, but....well, I'm a loser, and no one offers that.
My problem is mostly: I haven't been able to have a seat at many Mission bars of late. When the holidays were on, it was great. No one was here. Lord knows where people go. I have somewhat of an opinion that people that leave the Mission during the holidays kinda don't belong here. But hubris aside, since people have gotten back in this last week I've had a helluva time getting a seat.
Maybe its too much to have a seat. But I don't think so. Why should I be the weirdo off in the corner wanting a seat? Generally, I don't drink at a bar if I can't sit down. There's just enough of a gentleman in me to think this is the minimum of civilization. If I was going out with other people, I probably wouldn't care. But like I said, it is a hobby, albeit a poor one. This is as close as I get to social. I'd love it if people actually talked to me. But they don't. And I don't expect them to.
So what does this mean? Does this mean we need more bars in the Mission? I dunno, but its starting to sound likely. Maybe it just means we need longer bars. I'm not really sure, but, to be honest, with as much as I pay for my apartment in the middle of nowhere, I should at least be able to sit down and get a drink.
Of course I could drink at home. And it would be much cheaper. But to reiterate, I am a loser. I don't have friends that want to hang out with me. Sometimes, my apartment feels cramped and I need to get out of there. It doesn't really matter if I drink. But, sadly, going to bars seems to satisfy that part of me that is programmed to be around people best.
i "love" how people pretend to be interested in each other even in the brunt face of cognitive dissonance
appearances and reality
All of my life, I've gotten a lot of flack for saying that I won't do something. This probably speaks to my lack of intelligence, my poor social skills, or both. Most people learn to phrase this in the passive voice, "Nothing can be done...." But which is more ultimately anti-social? At least standing by my guns and saying that I'm not going to do something for such and such a reason is admitting that I'm not going to play with others. Saying nothing can be done and dodging responsibility allows one to play a sufferer unto the world even when what is really meant is that another's problems are of no concern, even when the other offers to help. It is ultimate dismissal. For who among us would have the daring to stand up and call he the liar who would speak such a thing? To daemonize him as a black spot on the universe? For in such, one becomes a pariah and the hands of all others withdraw into their winter coats
Failed names for crêperies:
Load-a-crêpe
Tastes like crêpe!
Take-a-crêpe
"Now with our new smaller sizes, you can really take a crêpe in your pants!"
"damn racist hippies" - its copyrighted!
(The phrase "its copyrighted!" is also copyrighted. See also http://k0s.org/comedy/copyright.html )
a possible renaming of wsgiblob: wsgintegration
i kinda like it because it tells more what it is (it is an integration layer for a wsgi "stack") and it rhymes with disintegration
theres a piece inside of me that feels like im falling into a cave. it is cold. it is dark. and i am alone with myself. the cave feels like a presence and i wonder what depths it reflects ?
site mapping middleware
I've often been curious as to how people use my site. Its been a backburner priority to add some sort of analytics WSGI middleware. Sadly, such a thing doesn't exist. Which is sad, really. Middleware is the perfect place for accumulating statics, as the net effect doesn't alter the request at all but gets to look at each request. I don't really want to program such a thing, but I might piecemeal add things as I need them.
One piece I have been curious about is what people do on my site. They see a page...where do they go? Partially just to see how many people are using my site, but equally to see how the site actually works. Where does the traffic flow? I'm also a huge fan of directed graphs, as you may/may not know. So let's make a map!
I put a piece of WSGI middleware using PyGraphviz (aside: is there something else I should be using? I'm not sure what good, deployment-friendly solutions to storing a directed graph and -> SVG ... but I'd love to find one) to write a directed graph of site traffic. It looks for where the traffic came from and the page you're going to and it keeps a tally on the graph. The code is pretty simple: http://k0s.org/hg/svgsitemap/ I put up a simple map at http://k0s.org/map.svg .
Its not pretty. There are tons of cosmetic things to be done. The text is barely readable as is. I should probably prune paths with lower prune counts (though I'll still need to store them). It'd be nice to zoom in or zoom out. Adding some nice Raphael JS would be awesome. You could also embed this on a page and display a "here" with common links from "here" and maybe a bit more of the map.
The other big goal would be to have this a federated service. That is to say, you have site A, I have site B. If we both had these maps, we could weave them together. At the very least like old-style nintendo games.
its interesting the older i get the more people look like monkeys whoever would point to form in protest to evolution is not vain enough for in doing so one may claim to have touched the divine
OED CUTTING ENGLISH
Oxford University, England - The Oxford English Dictionary has announced it is removing thousands of core English words to make room for expanding cyberjargon. The words removed include many in common usage, including 'gullible', 'naive', and 'foolish'.
Professor s. C. Lewis, one of the curators of British English, explained, "While the internet generates thousands of new words each year, the dictionary is already full. So words in use for centuries have to go to make way for today's more popular words like "defriend' and 'smart phone'. Kind of sad, really.
"We cant print any larger volumes as they already overflow a standard desk. Quite frankly, the OED has become a workplace hazard. Prof. Johnson sprained his ankle this sprint when the final volume fell on his foot."
Professor Lewis did not seem receptive to the idea of keeping the dictionary online. "We cant have an entire language simply based on computers. What if they all went down one day?"
When asked, "What can people do when they need to use a word like gullible?", Prof Lewis responded:
"Well you see that bit you said at the end there isnt a word, its just gibberish so I cant very well answer your question. It used to be a word. But it isnt anymore, so I cant really acknowledge what youre talking about.
"We have to be careful not to cut any vital words, like 'and' or 'the' or we'll have a devil of a hard time talking."
Canonical -> multiple distributed publishing platforms
The walled gardens have changed. Yesterdays' walled gardens were the closed desktop app. Think Microsoft office. While there is still a place for desktop applications, most people want publishing instead of just isolated resources that live on their hard drive, and publishing today means the web.
Today's walled gardens are non-federated services. Take twitter. There's only one twitter. Its not like twitter does anything amazing. Even though it is closed source, it does have a (albeit pretty poor) RESTful interface, so one could make their own twitter.
However, why should twitter (and facebook and google apps and...) be the one canonical service? People go pretty far towards federating twitter. You can tweet to your facebook, your google buzz, etc. But there's no twitter2. And there's no way you can have your own twitter. Instead, people do as I have tried to do for bitsyblog and blog -> tweet.
(Sorry, I really had more to say here. I started this blog post weeks ago, then got busy, and now find that whatever I really meant to say is lost to me.)
Here at GenericCorp, we believe in giving the customer the key values of Quality, Quantity, Quintessence, and Qualifications. So when a customer asks, "What can you do for me today?", we answer, "4Q".
How the universe really began
> ls -l everything* crw------- god god 0 0000-00-00 00:01 everything-0.0.1.tar.gz > tar xzvf everything-0.0.1.tar.gz
God: hmmmmm....I didn't really want to do that....
failed invention: Pascal's rectangle
| 1 | 1 | 1 | 1 | 1 | 1 |
| 2 | 2 | 2 | 2 | 2 | 2 |
| 3 | 3 | 3 | 3 | 3 | 3 |
| 4 | 4 | 4 | 4 | 4 | 4 |
| 5 | 5 | 5 | 5 | 5 | 5 |
| 6 | 6 | 6 | 6 | 6 | 6 |
its amazing to think about
qwerty keyboards, developed to avoid locking mechanical typewriter keys, will probably be the last keyboards used before computers have a neural interface that will make typing obselete, the province of embarassed half-understood conversations between parents and their progeny and tools of the eccentric old who refuse, in their twilight, to get the surgery that will convolve flesh and machine
i care about this Alot
from http://hyperboleandahalf.blogspot.com/2010/04/alot-is-better-than-you-at-everything.html
Ideas from workweek opening session
Its Mozilla workweek! We just had our opening session this morning. There were a lot of good ideas, and many of the opening remarks made me think of a observations of my own. I decided to write these as a blog post instead of trying to get my mostly specific and possibly contentious questions in the Q+A session.
Employees whose full time job is to audit the (dev side) of mozilla to make things eadier for newcomers and community members to increase their ease and therefore productivity with the direct side effect of making things easier for current devs.
What are the rough spots?
How rough are they?
Who do they affect?
How much time is lost or would be lost through these issues?
The answers to these quedtions allow these issues to be prioritized and meaningfully tackled. Even vague critiques like "this website is confusing", when probed, can lead towards significant streamlining. This is going to especially important for fostering community as well as our wishes to expand hiring.
Tailored Firefox: Customize firefox for your own needs. Mozilla builds a very good all-purpose browser. However, there is a market for Firefoxen specialized for specific needs. There is already a rich addons community to base on. At first, a preselected number of flavors of Firefoxen could be hand-crafted for user-motivated needs. Ideally, several important packages of addons could be selected: web developer, education, minimal, etc, and the downloader could choose which pacakge to download (being able to drill down and choose/unchoose individual addons) through a friendly webpage. A base profile could be chosen as well. Build options, etc, could be additionally be thought about, but they're probably not as important.
Partnerships with birds of a feather. There was some talk about partnerships. Obviously, partnerships with players such as google, samsung, intel, etc are valuable. But what about on the dev side? We use several open source tools heavily with powerful communities. Python. Ubuntu. Django. MediaWiki. Just to name a few I know. None of these are exactly along the lines of our core mission. But we use their tools. We want their help. They want our help. If we cant even work with our kind, why should we think we can suceed?
Sync should optionally export data to a webpage : I am a great bookmarks collector. I want to share my bookmarks with people. I want to do this on k0s.org. I can, of course, export my bookmarks as an HTML page. But currently, I have to do this manually. It'd be nice if I could tell sync to do this everytime I synced, as currently I pretty much don't update at all. I'm not sure if this is doable as an extension. That would be a great thing to do as a plugin, if that's doable.
Two other more definitive issues I've filed as bugs:
- Directed graph for Firefox : https://bugzilla.mozilla.org/show_bug.cgi?id=618888
- Tooltips for new features and UI for Firefox releases : https://bugzilla.mozilla.org/show_bug.cgi?id=618891
the face, the animal's flower, looking up from primordial cesspools to be touched by flakes of heaven
i hate it when i have to futz with my mouse. programming is challenging, but it shouldn't be physically challenging
I think it'd be funny to ask someone "Can you tell the difference between butter and I can't believe its not butter?" Then, if they say yes, throw a tub of butter at their head. And ask them, "Was that butter or I can't believe its not butter?"
? : So I ended up getting a labrador. My friend told me I could name her "Kim" so she could be "Kim Lab". So I sorta took his suggestion.
? : No, Physics.
equivicator
As best I understand it, last week a couple of bills were turned down in congress regarding the expiring of the George Bush tax cuts. One of them would have indefinitely extended cuts for people who make up to $250,000. The other would have extended cuts for people making up to $1,000,000. Now, I hear, Obama wants to work with Republicans to reach a compromise.
Honestly, I don't know enough about macroeconomics to say which tax plan is appropriate. Its probably not a good idea to disrupt very many peoples' taxes during a tenuous recovery? But I don't know. One thing I do know about a bit is power. This will be the last month of democrats in control in Congress. They're eternally depicted, at least on NPR, as backing down in the face of any power struggles. Power struggles are pretty idiotic, but continuously compromising only weakens one's position. The democrats can't even control the House and Senate even when they control the House and Senate.
After these two attempts, I would just let tax expire. Not because it is necessarily the best economic decision, but because it is the best decision with the respect of compromising one's position. If there are two parties, whether they are husband and wife, or democrats and republicans, and one continuously backs down in the face of adversity, they will assume a subservient position. I'm not particularly a democrat or a repulican, but its actually bad for the whole system to have a weak opposition. When the democrats don't play the game -- I don't know if its out of inaptitude or a sense of the greater good -- instead of putting up a strong front, they will lose sense there is no third-party balance. And in America, they don't.
There is probably much more behind the scenes interaction that makes a whole lot more sense in game theory. But this is how the democrats' position is seen by the public, which goes some way to how the power goes.
Somedays I feel we're all just going to be inconvenienced to death. The death of a thousand paper-cuts...
Watch, over the glass of black beer and the reflections on the hardwood bar from the tin ceiling, how everything dissolves
and be glad of it
I think i might marry Paula Poundstone, excepting that she wouldnt be into me, is way older, likes kids, and doesnt seem to care about relationships
but other than that...
cybernetics and globalism
So, to the notion: "The more wired we are, the better off we are."
Its too obvious to point out that this is a naive question. But lets break it into components.
Firstly, and oft-neglected, there is the sustainability of connectivity as a resource-based economy. As much as we like to pretend that computers are true telepathy vs proto-telepathy, the reality is that broadband economics is resource intensive. Not only do you have silicon, but rare exotic doping materials once scientific footnotes have now become important enough to, say, cause bloodshed and rape in the Congo.
So, this again points to the notion that capitalism as a "screw your neighbor" system is kinda becoming obselete. Regardless of the size of the monkeysphere, we, as reasoning and abstracting beings who can create these complex devices, are capable of behaving civilized when we want to. Instead of side-stepping the "is our economy sustainable?" issue, let's go through the steps:
I realize this sounds too easy, and there will be a lot of chaos and pain, but can you imagine having a fairly firm idea that the economy was sustainable? Its completely doable. Pay me to do 3. or do it yourself or hire someone, but my hand-wavy calculation says it can be okay as soon as we face it up.
So there is the material cost.
Then there is throwing computation at a problem. This is a positive and a negative.
The cloud!
Firstly, cloud computing means something different to me than the term seems to mean. I don't know. I have this idea of cloud computing of being something like developing a deployment and giving an architecture to have this fit together.
... I'll probably rant about this more later, as its really a tangential issue. So let's carriage-return to a related issue: software.
If we had perfect computers, there's still what runs on them. Software, by and large, doesn't write itself, and in the case where it does (to the cases I know of) it is still ultimately a human-germinated creation that behaves within certain bounds. You look at the magic of logic gates and then you look at the software that people run on it. Software is pretty lagging.
Why is this? I rant about it often enough, don't I?
Cooperation. People have become very good about solving a particular problem. However, people are general poor about cooperating about putting solutions together.
So, there is the sustainability index. And there is cooperation. The more we cooperate the better off we are. The more we cooperate, the more we will become a broadband-based society. The more effort we put into making worthwhile structures, the more quickly we can move away from those tired arguments of cut-throat individualism
the cyborgs won: and we're the good guys!
Probably most people know this, but we're now fully cybernetic organisms. There is still a lot of concern about what this means or resistence to this idea, that humanity has changed forever into a new species, one symbiotic with machines.
There's the movies like Terminator 2, or my own dark fictions. All of those things will likely happen, assuming we give up this idiotic outmoded individualist capitalism vs true globalism before we destroy ourselves. But to look at the other way, all of this can happen. We can enter the wider universe.
Is it wise to do so? That question has no answer
But it might be worth noting that the people that were early adopters of the cybernetic philosophy were the heros of the story. We tethered ourselves to the electronic thoughscape because it was an untapped well, and if we did not tether ourselves to it, the antagonists would come around and chain us to it according to their rules.
so more chaos, a step sideways, and the evolution of a new species
My Dream
Its funny how dreams make you reconsider your perspective. I guess that's their point -- the chemical DMT, the chemical that psychedelics emulate, is injected at the transition between the point where the neural net finally falls quiesscent and dreams emerge.
I had a dream last night. I was a kid, maybe about 12, which is probably near my emotional age. After pushing Abraham Lincoln off a snowy mountain (he was a real asshole in the dream), all of the kids began pushing each other off the mountain.
Climbing up after pushing Licoln down, there was a cute girl who gave me a mischevious look. "Are you going to push me down the mountain?" I asked.
"Maybe so," she said.
To defend myself, I grabbed her and pulled her down. "Stop!" she yelled, giggling. I could have thrown her down to her doom. But I didn't. She was cute, and just looking at her eyes, I knew we could be friends. I helped her back up the mountain, and I awoke.
Even though its a silly dream, it made me think about some things. Firstly, it gave me a glimpse of that nice quality that I miss so much: friendship. Just having a friend that will just appreciate me for me. Its so rare in my life. It used to happen....it hasn't in a long time.
Secondly, though relatedly, it made me think of permanance versus ephemerality. It seems to me that most people live mainly in the ephemeral. Things just happen. In contrast, I dwell on things. History is written in pen. What has happened is etched forever, never to be undone. I'm over-analytic. I think about what everything means, and though I try not to, I take it personally sometimes. Looking at the universe in this way is really dark, if you keep your eyes open.
What this dream made me realize, somehow, is just how brief life is. While I dwell on things like "will I ever be wanted", because I am programmed to and conditioned for, life is ephemeral. And if I would look back on my life from the depthless beyond, I doubt I would very much consider my petty concerns that mean so much to be now, like being wanted as a significant other.
I would probably think of moments with people like the little girl and silly little things like how we almost pushed each other off the mountain. Maybe there is more truth there
Attic is open, which is sadly more than I can say for most Mission bars (even Bar).
And, so it seems, i can blog with Android, which is more than i can say for the iPhone
Oh, and i have the best cat
You win this time, twitter!
Awhile ago, I set up bitsyblog (that is, this thing you're reading right now) to tweet snippets of my blog to twitter. You can see some results here: http://twitter.com/k0scist
Lemme take a step back....why the hell did I do this? I hate twitter. Its....kinda one of those sites that make me really abhor the web. I mean, there's nothing wrong with the site....it just doesn't do anything. But everyone reads it. I mostly wanted to post on twitter so I could get my posts into google buzz. It would be nice to have my friends read my posts. Again, google buzz has that same idiotic problem that most pretend-federated sites have: it just doesn't work with arbitrary RSS. I jumped through a few hoops trying to get my blog and photos on there, but to no avail. On the other hand, it picks up twitter just fine.
You'll notice that most of my posts in the time I did this didn't pick up on twitter. There's a reason for this. Twitter changed their API to only allow OAuth access. This seems all well and good, but now its a pain in the ass for a consumer like bitsytweet. If you care about the boring details, read http://code.google.com/p/python-twitter/ . Of course, they didn't update their script :( See http://dev.twitter.com/pages/basic_to_oauth
I've decided not to jump any more hoops for the time being. Web developers jumping through hoops is, IMHO, one of the things that makes the web sucky. Instead of working towards a solution, people bend over backwards to do what other people tell them to do.
So fuck you twitter. If you want to read my blog, it will be here.
Why I'm a Loser
I'm mostly a loser because I am. But why write about it? Well, its a Tuesday night, I don't feel like going out right now, I don't really feel like programming, so I'll waste some time writing a blog post. That's what life is, right?, filling that time between birth and death.
Some guys are winners. They're the kind of guys that have a girlfriend (with more probably in line) who thinks of them as inspirational, outstanding, great, or any of those adjectives. I don't know what makes them winners. People just think of them that way. Maybe its because they've been brought up being told that they were great. Maybe they just got lucky along the way. I don't know. I'm not really convinced they're all that much better than me. I haven't done much with my life, but to be fair, no one's really believed in me either. Its hard to get enthused about doing something great just because. As an analogy, I like to cook, and making myself food is cheaper than going out to eat constantly like I do. But its hard for me to get excited cooking for an hour just for me and then eating it in 15 minutes. Usually when I buy groceries, I end up just eating ingredients. So goes my life. If I had someone to cook for, I'd love to. If I had someone to paint for or write for or program for or fix up the house for....someone that I could make them happy by practicing a skill, it would be worthwhile. But just sitting and honing my talents so I can feel like my talents are honed....not really worth it to me. Its probably some fundamental failing on my part.
Then, some guys are losers but they know they're losers or just don't care. I wish I could be one of those guys.
But...I do care. I am programmed to want someone in my life. Maybe that's what makes me a loser. I didn't realize that this was inborn programming until recently. Maybe its a nature/nurture combo, I don't know. No one wants me. No one thinks about me and says, "That Jeff...he might actually be able to make our lives better. He's a great man." No, I'm not trusted that way. Probably for the best. I just have to learn to live with it and move on, taking what pleasure as I may from watching people in the subway train with that pointless detachment that defines society.
seamonkeysphere
I haven't really used seamonkey. I probably should at least check it out, working at Mozilla and all. But from what I've seen in its documentation and heard, its just the old-style marriage of browser + MUA + etc internet suite.
While I think an internet suite could become useful in 2010 (or whatever year it is), I think the driving question towards its design should be: "what synthesis is gained by the marriage of disparate products?" If the main gain is not having more than one window open, I dunno...I'm not sold.
I do have a few armchair ideas for synthesis of a web browser and an MUA:
I think cross-app information management should be the focus of any sort of suite at this level. But what do I know?
software idea:
I want a she-bang based configuration file that follows the curl | python pattern (so you don't have to install anything) that makes a virtualenv, makes a source directory, and then for each line in the file checkout/clone that url and run python setup.py develop on it.
So like...pip without having to install pip + setting up a virtualenv
find it odd how sometimes bitsytweet works and sometimes it doesn't
i'll have to debug that....some mythical day
The thing about life is ... when you're here, everything seems so ordinary, as mammals we are programmed to perceive lest the tasks needed to ensuing survival would become an whirlwind of perceptual complexity.
But when you are not here, you recall the colors, the fluidity of motion, the twinkling of chemical combustion of paraffin encased in slow-moving liquid [*] , and it all seems as wonderous as a Dream
| [*] | how long would it take for a glass candle-holder under the |
force of Earth's gravity to collapse to a puddle?
People put their projections on me and I can figure them out. Since there is a grain of truth, that perception of their projection grows to a reality, and soon I act as other than what I am.
What do you get when combine a Southern plantation family and a Jewish family in Tsarist Russia?
The hottest new act on off-off-off Broadway, that's what!
Fiddler on a Hot Tin Roof
Its the cross-over they said couldn't be done...and it can't.
Hurry! Get your tickets now, before the play closes its doors forever on opening night!
i'd love some peeps to work on our respective websites together. i really miss that from the confab days. so much to do and so much funner to do it together
New thing: essasys!
I put some essays on my site. Many of these have already been done as blog posts, many of them aren't really polished, but hey, more content.
it is a funny thing to think that people celebrate when their orbital star is in the same position relative to its reference frame from their little blue planet
the new traversal: another free idea
So I'm not sure why what I want doesn't exist. I was hoping repoze had something like this, but...it doesn't look like. I've always called this traversal, but its not just path based. Its....request based. Let me explain.
Let's say you have a request handler. Or really a bunch of them. How do you wire them up? Currently k0s.org uses paste. This allows me to use domain names (which I don't) and paths (which I do). But what about something more general?
What I really want is a matching based system. You have a root application. This is probably HTTPNotFound. Its a standard WSGI application. However, you want to hang subapplications on this. And you want these subapplications to be called when the request matches some condition. The application shouldn't care about these conditions: you just pass them in. Maybe you only listen to POST requests. Maybe you key off PATH_INFO. Or domain. Or...
In this way, you can build a real website out of simple WSGI applications.
This is step one.
Step two is to allow filters to modify the incoming request and/or response. Again, based on certain criteria.
This isn't quite netblocks yet.
This probably sounds too simple. Maybe it is. But the point is it kinda gives WSGI infinite flexibility of piping.
And...its easy to program
people keep talking about this micepace.com site but I go there and there's just a bunch of crap
...at least its better than myspace
existential problem
I have a problem.
Last night, an army of the undead passed by my house. I decided to follow them. A band of skeletons played amidst hipsters smoking pot. I didn't have time to don my cloak or trechcoat, so swept into the night I was as I am. This is not my problem
I followed the horde to a park at 26th and Treat that I had not known of. Unmarked altars dotted the nightscape. It was another burningman: dia de los Muertes.
I was glad that I went. But it seemed I was the only one there without anyone. I hate that.
I'm caught between worlds. I know I should meditate, probably devote the rest of my life to meditation and just have a kind though detached attitude towards the human condition. But it is hard to be so empty. There are those that play this game and become attached to unattachment, or so they play to be.
I don't know why it means so much to me to have someone to share my life with. I don't know why loneliness hurts so much. I don't know why I don't have any friends who I can hang out with when I'm lonely. And I don't know what to do about it.
Notice: This ATM charges a $5.00 convenience fee. Do you want to continue?
-> Yes, I want continue and pay the fee
-> No, I don't want to continue but I'll still pay
k0s.org: dreams for the future
Its been on my backburner for quite sometime to do the next generation of my website.
Bugzilla: I really need a place to keep track of my ideas. I'm high on creativity low on time and ability to keep everything in my head. In addition, I really want to start hacking bugzilla since I'll need it for work anyway. Until recently, I was blocked by bugzilla not having a sqlite backend. But that was recently fixed. So I need to investigate this and deploy and do a brain dump there.
Découpage templates: the majority of my website is done via http://k0s.org/hg/decoupage . I did a change this morning to move most of the <head> logic into a template, head.html, that each subtemplate includes. This allows me to add new items to the document head in one place instead of copying and pasting to each template for each change. However, this raises other questions. Put in the most general way, how does one create a slotted template system that is flexible and generic enough? Does each template include head.html, for instance, or is there a template that frames everything and includes subtemplates? One of the problems (though it has positives too) in coding for my website is that I am too tempted to code for my use case and be blinded by the big picture. Realistically, this is how many websites are coded, but I want to code generic software that just happens to be deployed on my website, which I think is a better development model anyways.
Traversal: webob_view has the beginning of a traversal system. I want to move away from being tied to the paste server, and would like something that does traversal in a generic way. Ian Bicking mentioned that repoze has something like this, so I should investigate. What I want is something like this: you have a traversal block tied to a WSGI application (the traversal block is in fact a piece of middleware). In other words, you have several handlers hanging off of this. You check if any handler matches. If so, call that handler and return the response. Keep going down the chain. I'll probably blog more about this later.
The new smart phone from Verizon! Not only does it have a camera, mp3 player, and full touch screen internet, but it is rated as waterproof up to a hundred meters. So leave yesterday's smartphone on the beach and dive on in to...
The Deep Water Verizon
the first rule of Alzheimer's club is that you don't talk about Alzheimer's club
the second rule of Alzheimer's club is that you don't talk about Alzheimer's club
the third rule of Alzheimer's club is that you don't talk about Alzheimer's club...
funneling open source efforts
The bazaar has grown a lot bigger. This is a good thing :) However, we need a better way -- coordination -- to feed people into open source projects. Traditionally, the impetus has been entirely on the contributor. Want to work on a project? Go for it. Want to start a new project (with the likely case being you are duplicating effort)? Likewise, go for it. What is needed is a way to point people towards the right open source project. You have requirements that you want. These might be satisfied by some project....or they might not. I'm mostly talking about developers that actually need a product to do something, not just futzing around with code.
This comes to mind because I have this problem at the moment. My efforts to develop http://k0s.org are pretty lagged because I don't have an issue tracker. Since I have to work with bugzilla anyway, I would really like to use bugzilla. However, I have a particular requirement, the ability to sync data from all of my development computers. I have this with files via silvermirror . But this is hard to automate in a general sense for SQL, maybe even impossible to do in a robust way. If bugzilla supported SQLite ( https://bugzilla.mozilla.org/show_bug.cgi?id=337776 ) then that would be an easy win (despite the necessity to write a WSGI-CGI bridge to run the damn thing). But...sigh, it doesn't. The next likely candidate is Trac. Having worked a lot on Trac, I know there are things deep inside it that bother me enough (like not having a real model, just using SQL statements...grrr! good luck abstracting that) that I fear I would spend all of my time developing Trac instead of developing my website. Not my goal.
So what to do? If I'm going to be working on an issue tracker software, I want it to fit into my overall goals. I wrote some rough specs: http://k0s.org/portfolio/issue-tracker.txt . This really involves three software projects: workflow, discussions , and the issue tracker. I honestly don't care about the issue tracker part, except as a client, though the other two I do care about.
I can, and maybe will develop this myself. But, you know?, for multiple reasons I'd rather work with other people, one of them being I'm tired of rolling everything myself because I have peculiar requirements. If there was a project that really wanted me as a contributing member that was willing to listen to my requirements, I'd much rather put my effor there. If there was interest by others in helping me develop my software, then that would be cool too (and keep me more motivated than if I just have it as yet-another-free-time-project). So what to do?
A problem that I care about enough to write a blog post about but not enough to solve is this funneling problem. For those developers that have particular requirements (i.e. are not willing to change their requirements to use a piece of existing software) and want to work in the open source world, which project do you choose? Or do you start your own? And if you do, how do you get others to play with you?
Left as an exercise for the reader
In the spirit of Halloween, the end of an internet ghost story. WARNING!! may not be suitable for small nerdy children.
"...he unplugged the router, but the packets kept coming. He ran netstat and found that the packets were coming from 127.0.0.1."
Scary!
triumph
The notion of the ascending arc and falling action used to mark in Western literature the accepted form of narrative gives rise to the goal of triumph. But vitory over what?
My life is a melancholic victory, one of the victories that are never voiced in narrative but must be induced from the subtext. My dreams are dead, gone from the realm of possibility, and all I am left with is a blank page, so far scribbled only with meaningless words, spilt stains of beer, and the unknown ailment that burns in my intestines. And I call this triumph.
I will never know my dreams. Apologies to those who dismiss my certainty as pessimism, but for you who have known my life only through a looking glass, never wishing to seek further, but such is a statement of fact, even if only because I chooose it to be so. It may be that I will know what others would call greater victories, but they will never make me happy in the same simple way that my dream to love imagined satisfied would. It may be a silly dream, perhaps even unimaginable for me in manifestation, but it is what I have wished. This is not my victory.
My quiet victory, that better left to subtext but loneliness and gaps of time lend me to record it in poor form, is the return to this unborn state to the page never written. It is the triumph of awakening to the cessation of this perfect dream, of rising from bed against the aches of a body failing prematurely, and daring to face truth. It is the victory of having fallen off the planet. Though I am sad that I float in the ether alone ... there are none who wished to come with me.
So untethered, I let the words again fall to subtext
I again watched my favorite film I've seen this year, Moon. It comes at a seredipitous point in my life. While I'm sure the film would always have resonated with me, a human alone with himself on an empty landscape, it has a special meaning as I start a new life alone. While part of me feels that something has died, it more feels like I'm starting again. What do I want? What should I do with myself? These questions used to be so clear, and now they are trackless .
Like Sam, there's nothing particularly horrible about my existence. I don't fear starving, or persecution, or have to deal with any of the other awful things as do animals and the vast majority of poorer denizens of this planet. But I feel I missed my life, and that is not a good feeling. I feel my dreams have been stolen away from me, but like Sam they were never really mine to have. They were just dreams. I wished so much for them to be true, but have to deal with the reality of waking up.
I wanted someone to share my life with. Someone to be in love with, in spite of the social distortion of love and the need to procreate as a conflation. I didn't, and don't, think that it is really that much to ask. Maybe I'm wrong on this one. Its more than most people get. I don't know why I thought I was special. Maybe because I saw how it could work, could see how two people together could live in genuine contentment in alliance, and was willing on giving up so much that other people value but that never mattered much to me. But it is something I have never known. And now, the dream, that sweet dream of being young and stupid in love and growing old, as out bodies cease their beauty and we only have each other in a world of selfishness and uncaring, cold and icy drifting alone against the stars....now it won't be true.
What to do about this now that I can no longer slip into this dream again? I guess like Sam, I have to just deal with it....deal with the fact that I'm one poor monkey out of billions whose dream isn't that important to the cosmos, pick up the pieces of my life and move on. It is terrifying to be so untethered, and I have sympathy towards that majority that choses not to remember their dreams for the sadness of their absence. But I would rather have that over the pain of self-effacing lies.
But I have not pointer towards what to do. In an existence where survival and perpetuation are not paramount, what does one call a destiny? Attachment seems ... odd to me somehow. I knew I would have to give it up, but now that I have fallen off the world , I'm not sure what to do with this concious body floating in the ether.
I guess some things won't change. I'll still go to cafes and bars because it is in my nature to want people around sometimes. I'll still go for walks in the rain. I'll still write blog posts to no one in particular (so why would I do it, save that that too has become programmed?) and program and go to work and advocate my beliefs. But all of that is playing to the board. What happens outside the game? I suppose I will learn to become more an archaeologist of people, observing them, and otherwise honing myself. But for what other than my own whims and for standing against the background even while fading to it?
maybe that question has no answer
So, if you're a teacher with a crush on a student, I think it would be funny to give this math problem:
Simplify the following expression to put i on the left hand side:
u > i/3
Then when they return with the result written on their paper, say "well, that's highly inappropriate, but I feel that way about you too".
it's like i tell people a thousand times: "don't repeat yourself", "don't repeat yourself", "don't repeat yourself" ...
you must be able to have multiple instances of your mom running around, because there's no way she could be a single-ton
if there's one thing i've learned working with production software, its the quickest way to dig a hole for yourself is to rush features to production
http://twitter.com/beltzner/status/27956020097 : more proof that Apple is the new M$
...does that make google the new IBM?
Mozilla: Six(+) Amazing Months!
I completely meant to do a six months at Mozilla blog post. The fact that I'm a month late doing so betrays how busy I and everyone else here is.
Firstly, Mozilla is awesome. I am completely amazed at how well Mozilla lives up to its ideals, both technically and interpersonally. Everyone I've met here is really smart, which I'd like to think is a high compliment coming from me. My team-mates on the Tools + Automation Team (the A*Team, as it were) are all extremely talented in so many different ways. I could go on for a whole post about each of them, but suffice it to say, we're quite a force to be reckoned with and I'm very happy to be a part of the team. People toss around the term "dream job" maybe more easily than they should, but after being here a bit, I can honestly say I can't imagine finding a place I'd rather be. I feel bad that I'm so busy and at the same time never get as much done as I feel I should, but...I hope I'm getting better. I've been lucky enough for the past many years to be at places that had some claim to say are the "best of the best": the Plasma Theory and Simulation Group at UC Berkeley, the many very talented programmers (and a few non programmers) at The Open Planning Project, but Mozilla is the first place that I've felt that not only do you have people who are among the best and the brightest, but that they're actually functioning effectively. We (well, less so me, as a newcomer, but "my peeps") built a web browser that most likely changed the web from a dark closed place to an open happy place, and we're (legitimately) working on keeping it that way and making it better. It makes me proud to be part of such an effort.
Technologically wise, I still feel like a newcomer. But I'm getting there. I've been exposed mostly to the testing frameworks and infrastructure and a little towards the periphery of how Firefox (and other Mozilla products) actually work. The build system is amazing. People complain about it every day (including myself), but I think people are just as glad that we have something that is not only technically robust but that actually is used to orchestrate development in a usually friendly way (including myself). It could be better ... it could be a lot better, and I hope to help towards that end.
I still haven't had time for many of my dreams. I want to make a few Firefox extensions (that, honestly, I have a hard time believing everyone doesn't want them). I want to improve bugzilla, improve buildbot, and develop more metrics tools for our infrastructure. I haven't really gotten a chance yet, though some of the projects coming online (that I should already have done something for, but I'm playing catch up) will serve that end. I have bigger dreams too. I'd love to help make addons a real ecosystem that enables Firefox == a web OS (effectively, anyway). I'd love to make Firefox serve web. And, as always, I have some ideas for webapps that would make the world really cool if they could get adoption. I mean, I don't even have WSGI tagging yet! So, sadly, this post won't be added to planet.mozilla.com. All in time, I hope.
One thing that strikes me every day is how great it is to work in a place where creativity and good development practices are encouraged. Sure, I have arguments all the time on "what are good development practices?" mostly with members of my team, but its all in good spirits. One size does not fit all. Other places I have worked have looked upon creative analysis of problems as either wastes of time or downright subversive (this isn't to say that at Mozilla I can or should just do what I want, but at least my ideas are heard, appreciated, and occassionally even agreed with), and good development practices were scrapped for getting something done yesterday only to devote more time to it much later. I get know pleasure for being able to say "I was right" about such things.
So, Yay! Mozilla! Its fast approaching the year of Firefox 4. Nightly benchmarks show that we're nearly as fast as Apple and Chrome. I can't claim much responsibility for this -- I'm still learning the ropes (though the firehose has dropped to a reasonable level) -- but I'm excited to put as much effort to things as I reasonable can.
Thank you everyone, and most especially those on the A*Team.
Engineering has a special place in the coopting of the human state. I'm sure this is true for other fields of expertise, but engineering's uniqueness is marginal returns as a result of artificial external constraint. It is easily showable that we have the entirety of technology needed to maintain a stable system where everyone had elevated standards of absolute wealth, many dramatically so. Obviously, this must fail in the way things all fail.
But taken to a microcosm, engineering is reduced to ineffectiveness. In the effort to get profit, engineering companies are run ineffectively. There are few novel ideas, yet everything engineered pretends to be a novel idea. It is technologically easier, in the same way manner as it is easier to mix coffee and cream than to unmix them, to replicate existent technology. Yet synthesis is achieved from the harmony of technologies: innovation.
So, no, there'us nothing wrong with making a game that has a wacky gopher popping out of some phone that you get points on for tapping on your iPhone. But the way engineering is practice does harm to the field itself. Instead of developing cohesively, the "let's pretend this is a [new] idea" just gives spawn to "do it you f-ing self"-ism.
Historically, for product, there was scarcity. There is no scarcity of information or engineering. So the suffering is needless. It would be much easier -- much easier! -- to allow engineers to work collectively to develop better systems. It would be cheaper, more time efficient, and result in much more stable innovation more quickly, to take the body of engineers and allow them to work very much part time and on their own schedule and very minimally supervise them.
I guess I'm lucky enough to largely have this, so I shouldn't complain. But it really makes me sad that people...engineers...can't just make the world better
i always wanted to get a car and paint the front part blue and the rear red so people would think i was driving so fast i was red-shifting on them
So 5/12, 11/18, and 36 walk into a swank restaurant. The Maitre D says, "I'm sorry, none of you have reservations and we only have one table available. 36, we'll take you." 11/18 hughed and object, "Well, now you're just pandering to the lowest common denominator."
When the moon retreats from the sky shall there only be cloud-covered night? Or will there be naked stars, singing?
It has been my experience in picking up a project that other people have started that there is usually a large amount of cleanup involved. I'm not talking about the learning curve so much -- some pieces of software are complex regardless of how considerate the previous developer was. I'm more talking about fixing things that really, IMHO, should have been fixed before. I'm sure every programmer has had the same experience.
Cleaning up after yourself is good karma. More than that, its actually not much work and even if you're the only person on the project, keeping things clean will save you time when requirements change or you have to port to a different system (etc.). Some of these practices are pretty obvious, e.g. not hard-coding strings. Others are those sorts of things people like to argue about. If you're just you working on a piece of software, then it really only matters when others become involved in the project. Everyone is free to keep their own house as messy as they want. However, in reality it is usually very hard to say when someone else will join your project. So I'd be so bold to implore you just to keep things clean as you go and do things the right way. Cutting corners won't save you any significant amount of time, but will potentially cost a newcomer very significant chunks of time as well as discouraging them from your project. Some rockstar programmers might think this is a good thing. Some people also pride themselves on how messy their lives are.
Here are some basic things that probably everyone knows are true but yet I see violated all the time.
yesterday was John Lennon's 70th birthday. Today i'm washing my linens, which takes about 70 minutes. COINCIDENCE?!?
...yeah, most likely
...if you doubt this is possible, how is it there are pygmies and dwarfs?
Why do WYSIWYG editors hate HTML5?
While looking for help on HTML elements, I stumbled upon http://rebuildingtheweb.com/en/why-do-wysiwyg-editors-hate-html5/ . In the style of its author, I'm just going to refuse to deal with any difficulties that aren't easy for the way I work. For instance, view source displays one giant line of HTML that is most of the article. So I won't link to anchors...not even sure if they have anchors! So you'll just have to read the article.
Firstly, it is asserted that HTML has too many elements. Then he (I'll use 'he' internally even though I don't know the gender of the author) shows a crowded toolbar and points to it and says, "SEE?!?". Q.E.D. I guess. This shows the beginning of his misunderstanding. HTML isn't designed to have a large subset in a WYSIWYG toolbar, nor are WYSIWYG editors designed to give all of the features of HTML. If you want all of the features of HTML...write HTML. GUIs serve those that want a crafted subset for a specific domain. Do your users need strikethrough? Do they need emoticons? I'd much rather have a slim editor if I was using one that communicated the intent of the site master.
Then he goes on and complains about alt tags for images. See, the great thing about a WSYIWYG editor -- in fact, any abstraction layer between the user and the resulting markup -- is that the site master (or GUI designer, etc) can build in functionality. If the site is, say a blog, you'll want headings, subheadings, etc. Each of those should be an anchor. If the writing is semantic, you probably don't need more anchors. If I double-space (or alternately, any time I press enter), I want a new paragraph. Images should get captions that are set to their alt and title, etc, and should be dynamically resized thusly. I'm not saying any of the rules above are how the web should or must work. I'm saying if you're designing an abstraction layer, thinking of this as policy both allows you to craft a site that is easier to use (without the tons-o-buttons) for users, has better markup, and is more consistent.
If you don't want this, just let them write raw HTML.
The browser is the OS of the modern network. As such, it is good to have a browser that correctly and efficiently implements that functionality required for browsing while allowing extension such that the OS may be tuned for particular needs.
Firefox is a good example of this model. The out of the box browser allows a good interface to the web while not trying to tell you how to use it. Hitherto, this was all people really wanted except us geeks that like to customize everything.
The Firefox addons community is pervasive and fierce. Some addons allow simple functionality. Other addons greatly modify your browsing behaviour. I see potential for Firefox + addons to achieve what has been an outstanding goal in applied computer science: high-performance tailored installations of what amounts to an operating system for a spectrum of use-cases.
How will this work? It depends on the use-case. As a web developer and someone picky about their UI, people like me will download a semi-virgin Firefox and install packages of add-ons tailored to our use case. There will be (one or more) web developer package(s) and then several UI packages depending on what you want. Since I am picky, I will probably augment this with several individual addons too. And since media is part of the web, I'll probably get some video and audio packages too. Its like shopping, except for free!
Many people will work this way. There will be others, however, that just want a solution out of the box. Different versions of Firefox pre-loaded with packages will be available from various distributors. Some will become popular. Some won't. There will be the small business distribution, the government distribution, the accounting distribution, all with addons tailored for this purpose and for interacting with various web and onboard applications as needed by the consumer. Smart phones, as android phones already tend towards, will be a net interface with the browser being the primary point of contact.
This is already mostly a reality. Its funny. Looking back to the things we said we almost wrote off as failed in this last decade -- calendaring solutions and the Chandler project, ubiquity of open source, net computing (http://k0s.org/blog/20101001113942) -- these are basically here now. Oh what a brave new world that has such technologies in it.
The (Near) Future of Computing
We're still physically dealing with what amounts to be a legacy of how computers were used. We have computers: laptops, desktops, etc; and things that are almost computers: smartphones, tablets, etc. What is the natural state of what we can produce today vs. what we are doing?
Computing has reached the predictions going back more than 30 years: that computational resources and information are available independent on how you connect to them. People will carry around an interface to the internet: for some people this will be their phone, for others, a tablet or a small laptop depending on their needs/wants for roaming computation. The purpose of this device is to allow connectivity, not on-board computation. Since processors, memory, storage is cheaply small, these are limited by the size/technological limitations of the display and the keyboard or other points of interaction. With glasses, not only does display size become a non-issue, but this allows for augmented reality as well, which will clearly soon become how the world works. For input devices, we already have projection keyboards, touch screens, and other soft devices to allow for a wide possible frame of interaction not limited by size. The way of interaction, following this, will be true cybernetics: direction neural/computers interplay. This will transform more than just our day-to-day interactions with computers, so I'm limiting my scope here to talk about just short of that, though that will be a reality soon enough as well.
You will walk into someone's house with your portable device. You can use this to interact with their various household electronics -- screens, speakers, computers, video games -- wirelessly. Or you can use whatever input device your friend has lying around. Interfacing with devices will no longer be bound by which interface you are in front of, but what credentials you are granted by the agents of control.
Despite all my early enthusiasm, I don't think anyone would argue that writing bitsyblog has been a significant time win. However, that may change. WARNING: another million dollar idea ahead
While I plan on implementing a calendar interface for navigation, I'm still a big believer in the blog roll: http://k0s.org/blog . One real strength of a blog is having a unified place to put new content that is automatically filed and dated. For bitsyblog, the filing options are somewhat limited (namely, is it public, secret, or private). However, since there is effectively one event -- posting a blog -- it is easy to turn this into a pluggable event handler. See http://k0s.org/hg/bitsytweet for an example.
But how does this solve the CMS problem? So, if you've been paying attention, you'll know that I'm a big believer in curating information. Take a typical development cycle, for example. A programmer is assigned a bug, fixes it, and commits his changes to a VCS repository. Through manual convention or automatic process, the programmer can note in the commit message which bug was fixed and note on the bug which commit message fixed it. This is good practice that allows rich linking of resources. It is also information curating.
Now, let's take k0s.org, which is really saying "take the software that I use as a portal to the excellent CMS, my filesystem". bitsyblog is clearly the "idea roll" -- its where I put random text to be organized. Some of it should just stay there. Others I end up doing things with. I want to start automating this a bit.
A few ideas on what can be done here:
"on <blah>:" so, let's say I want to accumulate a corpus of work on a particular topic. An example: """on writing: how word order makes a difference""" So I give the post handler a directory to work with. Then, if the title matches "on [-A-Za-z0-9]:.*", then I append stuff to a file. For instance the "on writing" post would be appended to writing.txt like:
""" -- how word order makes a difference """
and then the rest of the article. This let's me blog and file essays simulataneously
jokes: I waste far too much brain power making jokes. I can't really help it. Look at http://k0s.org/comedy/cheapshots for how I waste my time (as well as, what 40% of my blog posts?). So there are a few kinds of bad jokes I generally make
I don't really know how to store these. I guess I can have a file for each one and split on, oh, maybe --+ *$. I definitely want files that I can edit instead of a database (yes, my old complaint. Databases are nice, but just try using emacs on them).
probably more stuff too
Anyways...yeah, that's right, I said it! I talk a lot about how the filesystem is a good CMS and most everything else is a crappy CMS. I hope these practical examples give more of an idea of what i'm aiming for. Someday I'll even implement them ;)
If one wished to hold on to me, they would need to stay unphased by more than a flash of light and a puff of smoke
From the makers of The League of Extraordinary Gentlemen comes...
Higgins: I say, Perkins, should we accost that privateer with the Siberian tiger?
Perkins: I think not. We're just ordinary gentlemen.
THE LEAGUE OF ORDINARY GENTLEMEN
Higgins: Are you sporting a winged collar?
Perkins: It is the style of the times!
May, 2011; Get ordinary
A Simple Prioritization System
People go on about how hard it is to make a decent to-do list. People -- especially in the tech industry -- also complain that they're not sure what they're supposed to be working on. A quick solution:
You have a queue of tasks. These are ordered. I'm thinking of tasks == issues in an issue tracking system, but this isn't that important to the software itself.
You can add whatever you want to your queue.
Your boss or anyone else higher up than you can add tasks to your task list. You can't remove these or move them around. You can't move any of your items ahead of these.
That's probably all that I need to say on the matter.
Firefox is a great browser. It is even a better browser with a selection of add-ons. Now here in comes the problem, or a set of them (or solutions, if you like):
if you are an expert user (read: into firefox) then you know where to get addons and what to do with them. In fact it's kinda fun, like shopping. But if you're not an expert user, you're probably not going to install addons or know what addons to install. This is being worked on: https://bugzilla.mozilla.org/show_bug.cgi?id=574293 At this point, the community changes. Mozilla will have to make an effort, together with the community, to curate these add-on packages into recipes that make sense. There will be an additional level between individual addons and the user of add-on curators that will pick packages that are best of breed and will make sense together for (mostly casual) users.
There will need to be extended effort on making curated addons self-obvious to users. Very few people read help anymore unless they're confused. They'll install and addon and expect it to magically work. So this needs to happen.
Addon farming: there are two problems with the great success at the number of addons that are basically the same.
1. addons never get consolidated. That is, if my addon and your addon have significant overlap in intent, there is no push for us to combine these addons. This makes it really hard to find addons that I want and I have to install multiple related addons to get the superset of features
2. addon features are very slow to go into mozilla-central. Obviously, even for great addons, it may not be a good idea to upstream them. But some features are both lightweight and pretty non-contraversial. Like TabMixPlus's duplicate tab, which duplicates an entire tab including history. Its really awesome. So addons need to be aggressively farmed and upstreamed for simple user-desired features. This could even be a community point: voting on what addon features (from a preselected list) do you want in m-c?
I'll note that these aren't Firefox specific problems, but problems with the human side of software development in general.
Just for me, I want a better way of dealing with addon compatability (see http://www.oxymoronical.com/blog/2009/11/Changing-the-checkCompatibility-preference ). Firstly, doing this doesn't really fix things for my nightly build. Secondly, even if it did, it doesn't affect the fact that I really want addons to work on my Firefoxen. If I'm using a version of FF that really is incompatible, that's one thing. If the version of FF gets incremented, I don't want all of my addons to break. Ideally, there would be a more functional way of seeing if addons were compatible, and, ultimately disabling only the functionality that didn't work properly (unless they're tightly integrated in which case you're hosed). Obviously, this only affects bleeding edge users.
Its funny how the tiniest things can so impact productivity. On the train -- the Japanese kind with rows of individual seats on the top floor, not the stupid but more showy American kind that only have groups of seats each taken up by one or two people, the remainder empty or filled with their luggage -- there are usually two seats at the end, sometimes with a cup holder. On this day, he managed to take one of these seats, the other one next to him being left empty of course (people in the Bay Area refusing even to acknowledge that others exist unless such is thrust upon them) so he had a place to set his coffee while it cooled and between drinks. Having use of both of his hands, and the coffee, he was able to complete a substantive piece of work during his commute hour. Contrast this to the majority of mornings when he could not get this one seat out of a dozen or, as had happened, this last seat was free but was of the model without a cup holder, his work was diminished from having to hold his cup of cofee with one hand while he typed with another, juggling these with his commuter pass when the conductor collected fare from those who were too paranoid or proper to ride naked of legal protection.
If he missed the 7:04 train then the he had to take the 7:17 train, which was one of the sleek (albeit sleek only in the way that plastic can be sleek) American-built trains that only had seats in groups of three or four. While the capacity of both trains was approximately the same (there were probably fewer seats on the Japanese trains), he could rarely find a seat on the American variety. Each group of seats held at least one person. Without any way of knowing if anyone objected to his presence, as people had historically done, he wandered up and down the aisles, going from car to car, looking for that empty group of seats. He could ask them, "Do you mind if I sat here?", and while the tone of their voice would actually answer his question, more than likely the words would be something along the lines of "Sure, go ahead." These mornings he rarely got any work done. Even finding a seat was an accomplishment. He supposed most people just sat down whereever without caring about the issue. He wondered, why then, were there comparatively many attractive girls sitting alone. If he were to hypothetically apply that philosophy to himself, he would find a convenient seat with a girl that was easy on the eyes, if only to sooth that foolish need within towards feeling of self-worth through the dance of pseudo-procreation. He hypothesized that perhaps people would rather sit next to someone less attractive to avoid the question entirely.
MeetingCorp has a lot of meetings. In order to learn how to navigate through these meetings and how to choose a meeting, we recommend you attend the "Meeting about meetings" meeting.
a few complaints about things:
1. people that blatantly want dom/sub relationships. wow, you're really one-sided. Surely there's more to a relationship than that? And more to the point, surely you could do it with a little subtlty?
2. chat on the internet. I'm bored right now (big surprise) and wanted to, you know?, shoot the shit. So I looked up some channels on IRC and they're all awful. If you want to meaninglessly flirt with someone on line, that's easy to find. If you just want to, you know?, talk, good fucking luck.
"Did you figure out how to reproduce?"
"Yes, but I don't see how unprotected sex is going to fix this bug."
webcronym is a copyrighted term so don't even THINK about using it!
"don't even THINK about using it!" is also copyrighted
webcronym is a copyrighted term so don't even THINK about using it!
"don't even THINK about using it!" is also copyrighted
webcronym is a copyrighted term so don't even THINK about using it!
"don't even THINK about using it!" is also copyrighted
web-based filesystem
I was thinking this morning....it would not be hard to implement a web-based filesystem that was completely backwards compatible with existing filesystems. For existing OSes, you only have a few things you can do:
- try to open (read) a file
- try to open a file for writing
- get the parent of a file/directory
- list directory entries
For many common cases, even just reading a file is a huge gain. Consider this bash code to count the number of anagrams in the word "filesystem":
wc -l <(curl http://k0s.org/anagram?filesystem)
(If you're curious, with my current dictionary there are 956 anagrams.)
Now why can't this be done like this instead?
wc -l http://k0s.org/anagram?filesystem
If you allowed a handle that, for all filenames starting with http:// or https://, the filesystem/OS match a fetch to the resource and read the content (in any number of ways), it could. Again, trivial change to implement and completely backwards compatible (save for a file with a relative path starting with http:// ... I guess we could check for the existence of such files first).
Again, already huge gain. We've made a lot of people's lives much easier. And because we've implemented this at the filesystem level, it will work with any program, whether command line or GUI.
Now, let's imagine doing this better. Not so trivial to actually get people to play nice together, but it will happen eventually.
Normally you can't write to the web. Well, you can, but not like writing to a file. So these files are read-only in filesystem jargon. But what if you want to?
HTTP has an OPTIONS verb. Currently its not used much, but that is changing. If a server answers an OPTIONS request in such a way as to indicate whether that a resource is writable, then the OS could do a PUT (for URLs ending in /) or a POST (for other URLs) to the resource. While this is certainly implementable now, it won't really work as most servers don't expect this form of document. Which is to say....it will very selectively work.
However, this is where things are going. Right now, there is a division between "my computer" and "the internet". A lot of folks (::cough:: Apple) want to keep it that way or allow you only to operate within a fence. But, as with all things technological, eventually the easiest way will persist.
I won't pretend that any of these ideas are unique to me, or even anything but obvious. There are people working with real webbased filesystems now, like davfs, hadoop, and others. Most of them work in a sandbox, but that's only out of convention. The reality is, five years from now or fifteen years from now, the internet will be so integrated into every computing experience that most people will look back and say "wow, and we really thought we were using the internet well...tsk tsk..."
patchwerk (hg patch queue) workflow diagram
- Workflow: http://k0s.org/portfolio/patchwerk.gv.txt
- Original About pitch: http://k0s.org/blog/20100606155416
when you leave your surroundings to meditate in quietude,
so is it to meditate in everyday things and noises without abandoning awareness
"You wouldn't know your ass from a hole in the ground."
"That would explain those rectal pains after shoveling yesterday."
it's a saturday night and i wish there was someone to weave thoughts with me. i guess that, at the superficial level of communication, is what it's all about. i have a cat here who loves me. and i love her. but there is something missing of that going off into infinite mystery. Civilization, that thing we pretend to have, is about that infinite. a moment passing. this is all there is. and yet. here is another moment. some sort of culmination is in order
If All are One, how can there be an Other?
There is the duality of existence and non-existence.
Which one are we?
Why does Kansas always appear on maps with is Easterly bordering state?
Because Missouri loves company
"I'll get you a bag -- a body bag!"
-- another quote from a non-existant Arnie movie where he plays a waiter
The one lesson that life continues to teach me is the one I know all too well: others are completely unreliable and should not be trusted or depended on to take my welfare into account in any possible way.
Another New Yorker caption: "Barnard College? Looks more like barnyard college"
Put whatever image you want to to that to make it funny
simple web service: what's my ip?
you make an arbitrary request to a webservice and it will give a plain-text response of what IP address you're broadcasting from. Silly, yes, but this is often difficult/impossible to determine locally
I'm sure you'll grow up to be a beautiful swan. Then you'll have your head smashed in once they realize youre different
Damn, I missed my billion second anniversary! April 27, 2009
datetime.datetime(2009, 4, 27, 1, 46, 40)
Somehow I don't think I'm going to make a trillion
its 2010....and emacs still leaves f-ing ~ files all over the filesystem
i mean, i fix it on my computer, but when I'm on a shared machine, i'm just ass-screwed, or I can be an asshole and modify .emacs for everyone
fuck you, emacs, fuck you
fun on Facebook (ads): "Do you know your neighbors? Find Sex Offenders in Your Neighborhood"
That's the whole text. To watch out for? To connect with? You decide!
sometimes i think i see weird unicode characters on my screen; it usually turns out its just some bit of dirt
one bad effect of being crazy is that you're not sure if the mp3 is skipping or if your head is skipping
git, to the best of my knowledge, is the most complete and atomic version control system yet written. However, because it takes a tools-based approach to version control, it is cumbersome for typical development tasks. While release engineers and occassionally project managers may require the need to do very fine-tuned version control, as a typical developer, all I really care about from a version control system is the ability to check in my code, pull the latest changes, and merging conflicts.
git in fact has no workflow. This is a good thing, in that it allows arbitrary workflow to be built on top of it. Different workflows are appropriate to different projects and situations. However, it is a bad thing in that workflow has come to be expected from version control systems. While this is somewhat of a historical accident, a VCS without workflow is pretty useless. People will do whatever they want. People will complain when other people's method of doing what they want is at a conflict with theirs or makes theirs hard. I have found that agreeing on a workflow (a human problem) to be much more difficult than the usual taks of dealing with a VCS.
I have been disappointed that github.com, which brought git "to the masses", has completely ignored the workflow problem. github highlights how easy it is to fork and make your own copy of a project, and gives some hand-wavy explanation about pulling from each other's copies. However, for a large collaborative project, the instructions that github gives you are not really helpful. You'll want a workflow. You'll want an actual procedure whereby people can develop code and contribute upstream without stepping on each other's toes. While github does things like code-commenting and pull requests excellently, it gives no real tools for coordinating among people working on the same project.
So people write workflows as list of instructions. "Do this...then do this..." As a programmer, I'm good at writing lists of instructions -- that's in fact what programming is -- but when it comes to following a long list of instructions for a task I have to do several times a day, I am ill-suited. I get impatient. Often a small typo can have dire consequences. If its a one-off, then I can be very careful and do it. If its a bunch of typing I'm asked to repeat over an over again, I have very little patience. Machines do such things very well. I do not do such things very well. Enter: automation.
So the real solution to git's lack of workflow -- and probably to other VCS's as well -- is to write a layer on top of the bare VCS that contains the needed workflow. Ideally, such a workflow-program would have the following characteristics:
1. It should be easy to follow the workflow, in the same way that you don't have to worry about steering a train.
- It should be hard or impossible not to follow the workflow
3. The parts of the VCS that aren't part of the workflow, such as purely informational components (viewing logs, etc), shouldn't be affected by the workflow wrapper
I've written such a wrapper, that I call gut : http://k0s.org/hg/gut . This is a pretty naive implementation for a particular workflow, that for Mozmill detailed in https://wiki.mozilla.org/Auto-tools/Projects/Mozmill/RepoSetup . It doesn't really meet these ideals (except #3). However, it does automate a number of aspects of the git workflow that I've gotten wrong many many times due to typos or other silly human mistakes. It's not 100% identical to what is in the RepoSetup page, but it is conceptually the same.
I'll admit that this is a cheap fix and a brittle one. The important part is that since using gut I've made fewer mistakes and have more confidence working with a VCS that continues to baffle me. More so, with the --simulate flag, I can see what commands will be run, so if I do have to do manual intervention or want to make sure what will be run next is what I really want to do, I have that control.
While I wrote gut to make my life and the life of my coworkers easier, it is a good proof of concept for what I think needs to be done to really bring complex VCS "to the masses". In order to really tackle workflow wrappers for VCS, there should be a way to:
- precisely define the workflow that is being used
2. be able to build a tool like gut from this workflow definition automatically
- have wrappers that are more robust
if git is such a wonderful VCS, why is all my experience with git me working for my computer?
Oh! It's because its tools to build a VCS and doesn't have any workflow! So the workflow is "do everything by hand yourself, you expert!"
I have a friend who is very dear to me. She's kinda been my only real friend since I've been "all growed up". I treated her badly ... she treats me badly and I treated her badly before that. I guess it doesn't matter who started it. Its one thing to realize that you've been jealous and generally afflicted with meanness. It's another thing to realize that you really hurt and disappointed someone you care about. For me, those someones are rare. Most people in the world are blank faces, stories that I'll never know, wandering grey amidst the city streets because all people ever do is wander grey against the city streets. Then there are the people that I like to call friends. These too are rare, but I have them. We laugh, we talk about math, philosophy, war, and all the light-hearted things people like to laugh and talk about. But another face comes along, and if their eyes are not occluded, then the moment is gone and we all know it was just another lie. And then there is she. When she is there with me, she is always real. She can't help it. It's just the way she is. She is the darkest and cruelest person I have ever known, but also the most honest and sweet. I love her. And my love for her has made me blind and crazy. So I hurt her. I didn't mean to hurt her. I never meant to push her away. But I do because I am afraid of being hurt by her, afraid there will be a day when I will never see her again and all that I will be left with are memories of her. It is so hard just to be with her. Even as I cherish each moment with her, I also fear that it is just a blip, a chance passing in a dark cold universe where all meaning evaporates.
I know, for all that you hurt me, I will never deserve you. Though I'd like to think, of all the undeserving, that you would settle for me.
having to play with the windows VM, I saw the hard disk light lighting up. i thought, "Wow, that is actually kinda cool." Then I realized it was part of the VM software and not windows
i always forget just how retarded windows is until i go to work with it. seriously, i install git...and git isnt on my path. how can that possibly be what i want?
what do you call export PATH=$(dd if=/dev/urandom of=/dev/stdout bs=255 count=1)
a psycho-path
<rimshot/>
progression of technology
technology evolves in stages:
- a new technology is introduced
2. the wild west phase: everyone does whatever they want. life is good, at least for that sort of person
3. we standardize on something stupid. everything is horrible, except for that sort of person
4. the something stupid breaks. we standardize on something good as people actually start realizing the problem. everything is good again
oh, i see....
2009 was the year that explosive decompression hit those that have already lept from rocks to rocks without thinking of their own stability.
this year, bam! it his everyone.
so there is riding the wave
addons ecosystem
At the Mozilla summit, there are lots of exciting things going on: WebM video, Javascript audio transforms, making JS fast ... much has happened in the last year and much more is going to happen in the next.
One thing that particularly excited me was seeing the demo of building a Jetpack in 5 min. To do this yourself, go to https://builder.mozillalabs.com/ . The addons community -- with its freedom and openness -- is one of Firefox's greatest strengths. It is great to see this becoming easier and more accessible to everyone.
What I hope this makes happen is moving towards a real ecosystem of addons. I hope this isn't taken as a criticism, but while its great for power-users to have fine-grained control of being able to browse and install addons, for a majority of users, there isn't the time to figure out what addons they actually need.
So what I would love to see is recipes. Similarly with what I've done with TracLegos for Trac (see http://trac-hacks.org/wiki/TracLegosScript ), I would love to see: 1. a tool that allows the creation of recipes to put addons together (which like TracLegos can be chained and cascaded so that an ingredient can become a recipe; e.g. "a Tabbing solution" might be a component of a large recipe or a recipe of its own right); 2. recipes created with these tools that are presented as consumable software.
Lots more to save here but there's a keynote going on I want to see. Ping me for my thoughts
prediction
The folks that have switched to chrome for a perceived need (speed) will come back to Firefox 4 for things they don't yet know they need (site permissions)
federated services
what the web needs is for (lack of a better term) social identity and networking what DVCS has done for version control; namely, the ability to fork and move one's "data" around arbitrarily
Why I hate doing anything, part 2
So, I recently got a jury summons from New York. Since I'm no longer there, I have to get an excusal.
So I call the number. After getting deep enough into the automatic menus, I can see that there is no option for "If you are no longer a resident..." No, I can imagine that that would be a hard one to see coming. It's a good thing they have that convenient menu button for clergy.
So I keep yelling "Operator" until the system throws an exception and I get transfered out of automated hell. This is a good trick, by the way, if you don't already know it. Plus it has the nice bonus that you'll be real real mad by the time you have another person on the line. The wonders of this modern age....
So I get transfered and the voice says, "Oh, we're transfering you to this voice box, but he doesn't subscribe to this service." Then it hung up on me.
Five calls later, I'm preparing to write a letter and converting to one of those religions that supports praying. You can bet my letter will be irritated as hell. I don't want to be mean, but when you serve me crap, I generally let someone know it
Why I hate doing anything
re: http://airportexpresssf.com/
"... Where are you?"
"I'm at Alabama and 21st"
"We only pick up from San Francisco, sir" (Note again: 'sir' never means anything good)
"But...that's in San Francisco."
"Well, we don't pick up from there."
Boo! BOOO!!!
i just got a spam with subject: "does anger discolour your life"
it just literally burns me up with rage to see a thing like that
Learning patterns
Western innovation is based on the flawed premise that hours dedicated to work is proportional to work achieved. This is not the case, at least for me. The mind works in patterns. There is the period of striving, and the period of metastasizing.
In my history, never has my mind been as innovative as the year of my Master's. This is not to say that I don't perform better, by objective standards, now than I did then. I most certainly do. It is only to say that my vehicle for rational thought has never been so brillliantly curated.
The best of my Master's work was done sitting on a bench in an overlooked park looking over a lake. I would sit there and meditate, attempting to clear all thoughts from my mind, when popped in how to compute the eletrostatic flux on a Delaunay mesh. In Fortran. Its not the hardest problem in computer science, but it was substantive for me at the time.
The real point is that these moments of revelation have come consistently at times I was not striving for the furtherment of a definitive endeavor. My mind was focused, yet it was abstract.
So I sit now away from the endeavors of Mozilla, an organization I aspire to at an age when I thought I could no longer aspire. But my thoughts are there. I love Firefox as I can say of few other projects. And i aspire to it.
But it is greater for the unseen machinery in which is but a part. In reflection, we view beyond the horizon of our blinders, and so doing our view of the world grows larger and deeper. I need reflection, those moments between finite tasks, to allow the threads to weave in my mind. I am richer for it and the world is richer for it.
The machine knows best. Trust the machine
A new doll for today's little girl !
It's Polly Amorous !
Now with accessories: "Ken" ... and "other Ken"
i wonder if there is an antonym for ''contention''?
if so that is what Kain is. If not, he is a contention-nihilist
http://www.sutor.com/c/2010/07/ibm-moving-to-firefox-as-default-browser/
we say... "awesome!"
speaking of 'life before the simulation' is like asking the question "how far do i have to travel to get out of the universe?"
the problem with git
git is a fine set of tools to do version control. the problem is its not really user facing. the problem with git is that it acts like it is. the bottom line is, i, as a developer, don't care about version control or branching or merging or anything like that. i want to write code. i want whatever sort of branching and merging practices to just happen. if you give me a set of commands to run, or better, a script to automagically do what i need, this is sufficient. i've spent a lot of days where maybe half my time was actual development and another half was playing with git. not...my idea of fun, or the best use of my time IMHO.
git is like a breadboard and a bunch of components. you can probably do most anything you care about with version control with it. but some people, say, just want to watch TV. they don't want to build a TV everytime they want to watch the food network. i wish folks would git (yeah, bad pun) a clue and start writing wrappers around git that provided for an easy sane workflow that didn't involve developers, who are better off developing, playing with the nuances of version control often in an environment where the workflow is uncertain.
take in contrast netblocks. A crude diagram is here: http://k0s.org/portfolio/netblocks.gv.txt . netblocks is a way of managing documents. for the subset of problems where what you care about is a web, netblocks allows you to build frameworks or websites. it is not a framework! while people like me (document-oriented folks) may use netblocks OOTB to make a website, this is not the goal of the project. while i think django is as pointless as linus thinks svn is, if you want to make a site that's easily done with django, its a much better approach than trying to use netblocks to build a site. (likewise, if you want central version control and don't mind the stnanks of svn, then i'd recommend svn over git.)
i know truth in advertising is too much to expect. i'm a linux geek and am used to a tools-approach. but in general when someone asks for a solution, throwing a bunch of tools and raw materials at him and saying "here you go" isn't exactly couth.
One good thing about working for Mozilla is that I get to use a bleeding-edge browser.
One bad thing about working for Mozilla is that I use a bleeding-edge browser.
I'm kind of joking, but take me very seriously. We need to fix that bug where I get off work and lose connectivity walking to the CalTrain. Because that could be an intense commute: apt -> coffee -> transportation -> scramble consonance -> work -> iterate! -> next -> development -> bugs -> learning -> home
Browsers are the operating systems of the web
is there a conflict between this web-OS and your machine OS?
No! The proliferation of computing platforms and virtual machines is the divine spawn of connectivity
the leapfrog methodology
No, not the time-centered difference numerical method. I thought of a new work-sharing methodology for a group of programmers with a common area of expertise.
You begin with a group of programmers and an inbox of tasks greater than the number of programmers. You assign each programmer a task and an arbitrary order. The programmer works on the task until completion or until they become blocked. If they do become blocked, they may push their task up the chain.
If you finish your queue of tasks, you can select another and/or leap over the person in front of you. The intention is, since others can now push tasks to you, there is a self-selection process favoring the more skilled and more likely to help others. The front of the chain (maybe everyone, I don't know) can arbitrarily leap back at any point of time.
It seems pretty random, but there is some inherent structure in it. There is the self-selection, as mention. There is the fact that fewer people like to or are qualified to give help on a given class of problems. And there is an easy escape root if you are blocked on a problem.
This might not work too well in practice, mostly because people have different skill-sets and there is no clear-cut motivation to be high up the chain unless that's your thing. That said, I think its a pattern worth noting.
re: http://k0s.org/blog/20100609184843
the correct way to get this ratio is to have each team devote half their time to infrastructure and half their time to striding forward
It is a common conception that the porta-bella, or portable-bella, is quite large, when it fact it was developed as a more transportable version of the classic bella
a joke i don't have time to do
Go to a restaurant marked '$$$$' by Zagat. Then, when the bill comes, say, rather indignant, "But the book said it was going to be four dollars..."
Onion article
"[Facebook] is just like interacting with people in real life, but even worse," Anonymous Freshman, UC Berkeley
Why Technologies Fail
Technologies usually fail in a gentle way, compared to other human endeavors. A new technology supplants an existing technology. To look at recent trends, the buzzwords ten years ago were "blog" and "myspace" and the buzzwords of today are "twitter" and "facebook". The respective intents -- communication and social networking -- are parallel across these, but we have gotten an upgrade in medium. Compared to contemporary advances in software development, the differences between the technologies is not marked. Blogging has become a paradigm of its own, but has failed in the sense that it no longer is predominantly used for the quick (and often pointless) communication provided by twitter (this blog being an exception). MySpace, except for music, has failed almost completely in comparison to FaceBook. While both sites hired prominent engineers and MySpace had a huge early competitive lead, FaceBook is this one of the most traficked sites on the internet, while MySpace isn't in the top 20.
So we can ask then, why do technologies fail so slowly or why are the originators of original technologies so seldom those that ride the wave when the obseleting technology is evident?
Much of this comes from a fear of innovation. Due to financial and social pressures, maintainence of the status quo supercedes in priority the investment needed in driving technologies forward. Innovation needs two stimuli:
- Research and development of superceding technologies
- Development of infrastructure to perfect process
Since the one predictable facet of the future is that it will be unknown, the state of the art must be immersed. It is an oft-mistaken notion that future technologies appear abruptly. Except in certain cases, this is mistaken. As a historical example, Thomas Edison is said to have invented the electric light and that overnight the world was changed. In fact, several forms of electric lighting existing before Edison's incandescent bulb, which was not an unknown idea to scientists. Likewise, today the technologies that will drive the future of the web are not strangers to those in the field. But bringing them to market in a way usable to consumers is what changes the world.
Since engineers at the forefront of their industry are generally very bright, and since known good development methodologies are common knowledge, why does this process seem so slow and jagged to consumers? We've been promised the electric car, transparent computer interopability, and houses in space for years now. None of these is beyond the reach of the state of the art. And yet they are not palatable to the market, despite high demand.
In order to extend the state of the art, the state of the art must be full. That is to say, innovation saturates. In order to develop superseding technologies, the existing technology must flood the market. Until then, the practical points of implementation will not be perceptable as needs.
Taking each of our examples, the electric car has not become a dominant technology because of the investments of a legacy dominant technology, that of fossil fuels. The energy industry, first saturated by fossil fuels in the 19th century, has become a global power. Like all powers, a key component of it is preservation of its prevalence. So prices are kept (yes, even today!) artificially low. As a byproduct (or conspiracy, by others' counts, but quite inaccurately for the most part), gasoline powered cars become more practical, even if the absolute cost to the economy is a lack of innovation and slower progress in adopting future forms of transportation. We see a technology -- fossil fuels -- that due to a overarching demand for its product can continue such demand until scarcity forces alternatives to dominate. Its infrastructure is its product, and there can be no real competition because its infrastructure has such a high total capital value of the world.
What of the promise for computers to help organize our lives? Technologies exist today to put documents on the internet, to communicate about whatever we want to talk about, and to keep track of our schedule. However, while in one sense it can be said that the integration of these technologies is quite innovative (e.g. adding an event to your calender due to an ICS attachment in your email that was automatically rendered from the sender's message), the practical reality is the lack of seemless integration makes computers an appliance for doing a discrete number of things and less about engaging in a process that is information exchange. In software development, process equals product: the outcome of a seemless communication platform, allowing people to manifest intent with their machines, is symmetric with the manifestation of intent via the software development process. In this sense, programming is speaking very specifically to a computer in order to get one's ideas across. Just as there is no unbiased reporter, the code that drives computer programs is a direct manifestation of the engineer's comprehension of the problem to be solved.
Since so many engineers are really good at what they do, and since there is a large group of integral known problems that prohibit a direct path forward, why aren't these problems solved? Again, this is a result of a lack of saturation of the state of the art. On one side, this takes the form of consumers of technology being most keenly aware of the problems that confront them everyday. If a technology is satisfying, then there is no need to innovate. If it is known how to work around a deficiency, this is often seen as preferable to an expensive upgrade often of unknown quality and ease of adoption. Consumers and producers of technology don't move forward because the path forward is laden with holes.
What fills in these holes, ultimately, is investment in infrastructure. A system with an ideal infrastructure makes solving problems always a step forward. This is the densest communication vector. A system with a non-ideal infrastructure forces side-innovation. Steps forward may be achieved but only by concurrent side stepping to avoid difficulties. For a pure consumer, side stepping is only undesirable in that it causes displeasure. For a producer whose goal is furtherment of the technological state of the art (while, notice, like oil companies, some producers are not), this is a direct impediment to progress. A poor infrastructure allows only side innovation. The current state of technology is such that maintaining its state requires full-time investment.
Investment in infrastructure is often overlooked in the drive for innovation. Expectations are such that a great idea is something to implement and profit from. Such a discrete view of technology is ultimately noninnovative as it produces no direct growth, only an instance of a technological implementation. In order to grow, the fires of innovation must be continuously stoked. Problems must be continually fixed, build systems must be continuously kept up with the holes on the horizon. For technology, process equals product. If "progress" is just one-offs or work-arounds, the producer is pigeon-holed into a well of product maintainence instead of the ability to create.
Which brings us to houses in space. Space-faring technology has not become consumer accessible in over half a century of innovation, again by the best and brightest. The Apollo moon landing is held as one of the wonders of the modern world. Yet, in our history, it remains but a blip. Particularly in America, the cost as a response to demand of putting people into space has risen over the years despite investment in space technologies. The potential return on such an investment is vast, and yet it has met with no takers. The problem is that there has been no investment in the infrastructure needed to make this a reality. Scientists play with state of the art probes and ion drives, but the focus is not on beginning to fill the market, but the seeking of esoteric data with the unreasonable hope that the studies towards the mysteries of the universe can somehow be marketed. Sadly, this self-promotion has not received the same investment as professional sports. Houses in space will come, but only when we realize they are ours to have
not enough coffee
i was staring at my gmail trying to figure out what i needed to do, when i opened another tab to go to...my gmail
After years in the Bay Area, I just now realized that the spoonerism for "BART train" is "tart brain"
scientifically determined precise ratio of time working on new features vs time cleaning up for an old large project:
1:1
Important Note: if the above criteria applies to your project and you are not at the ideal ratio, it is not necessarily true that moving towards the ratio is a good idea
There are two kinds of people in the world: those that categorize things binarily and those that don't.
= patchwerk.org =
''social engineering for human beings''
A GUI (e.g. github) is actually usually the correct way to do repository administration. There are a finite amount of things that humans should really do, and while they should be be a group of atomic actions put together to form a workflow policy, doing something like "splitting a patch" is easily doable via a GUI (even if you're an idiot) and hard to get right from the command line (even if you're a pro).
patchwerk.org is a site for writing code in a collaborative way. Use the advantage of the mercurial system to write code with other people! Lots of eyes is better than your two!
Being the only engineer on a project lets you write code however you want to. If you're a good engineer (you know, the kind that writes tests and does all sorts of other checks to make sure you're software works), then being the only developer allows you to make applications really fast since the only bottleneck for decisions is you.
But something is missing....breadth. If you write code, it is how you think the problem should be solved which depends on your definition of the problem.
''Even the best engineers have something to learn!''
Even if you're the best hacker there is, others might think of valuable features that you didn't. Some of these you might disagree with. Others you might think, ''Why didn't I think of that?''
This is why social engineering is useful. While of course having others catch silly mistakes is important, and particularly with programmers less experienced with a language, having interaction can help teach them the tricks of the trade, developing a deep understanding of the problem-space is an aspect of engineering that has no limit of mastery.
Since its inception, distributed version control systems (DVCS), such as mercurial, git, and bzr, have had proponents stating that these had solved a vital problem in computer science. While this is not untrue, it is usually not the problem that proponents of these systems say it is.
The problem that DVCS solves is the problem of replication on top of that of regular version control systems (VCS). All of the sudden, a repository need not be canonical. I can easily just copy the repository and apply whatever changes I want. Others can contribute to my repository and, in fact, the repository that I copied from is no more canonical (save by convention) than my repository. If version control is an infinte spool of rope to hang yourself with, then DVCS is a rope factory.
The problem that DVCS doesn't solve is that of putting things back together. Sure, I can work on my clone and you can work on your clone and others can clone from us ad infinitum. But what if I want a change from you? DVCS proponents point out (correctly) that DVCS have much better tools for merging these changes than non-distributed VCS. However, ultimately merging is a problem that requires a human in front of a screen making decisions on whether and how disparate changes can work together. If you add a new file and I add a new file, then probably (but by no means guaranteed!) there will be no conceptual conflict between our changes. If you and I edit the same file but don't touch the same lines, the possibility of conflict is greater, but again is possibly unlikely (depending on what we did of course). If we edit an overlapping region of a file, then this just has to be sorted out. In special cases, it can be said that there is an easy merge algorithm...
So DVCS made it easy to develop a patch or similar to someone else's code. But, save for the trivial case where there are no changes to the master, DVCS has not solved the problem of how to put these hacks together.
The problem of merging is too easily and too often reduced to an algorithmic problem. Sure, better tools save time and make our life easier. We like better tools! But until machines start thinking for themselves (I'll give them ten years), programming is about manifesting intention and therefore merging changes is merging intention!
What is needed isn't better merging tools. Those are pretty good already. What is needed is...
patchwerk.org is designed to give you workflow that feels natural and that you really don't have to think about. We give you all the ability to get around this workflow and do horrible things, so if you don't agree with how we see the universe, then you're certainly welcome to work however you want. Hey, it's your software! But we hope you find what we've done pretty useful, at least within the context of social software engineering.
So what are we talking about here?
Forget forks. It used to be that fork had a rotten taste to it. Sure, the meaning of a fork in github is entirely different from "I'm going to fork ${project} because you refuse to include my feature" or even from vendor branch. But when you're hacking on some code, all you really care about is ...
- the changes you are making
...and...
- the ability to use the code with your changes
patchwerk makes this happen with patch queues and easy tools to use them. If you're making your own project, then you're probably working on the trunk (unless it's a large project). But if you're hacking on someone else's project, all you really care about is keeping it in sync with the source and getting your changes upstream. And if you're anything like me, append "as soon as possible" to that last sentence.
So your changes are hosted in a queue of patches. You can have as many patches to a project as you want. They may require being applied in order ... or not. That's up to you.
The best way to use patch queues is to have a patch associated with a single issue, like "implement 3d rendering" or "profile performance of web server" -- something that's atomic to a human, and to put these issues in some sort of issue tracker. This gives you a tight correlation between intent and manifestation.
''So how do I get started?''
Start a project on patchwerk.org and start hacking! Get other hackers involved, it's fun!
-or-
Find a project on patchwerk.org that you want to hack on! Once you have an account, just find some code you want to work on. Click on a place you want to edit (or you might notice the "Make a patch" button which will help get a clone of the code and a working patch queue on patchwerk.org and your local machine) and patchwerk will automatically make a patch queue for you! (Or if you already have a patch queue for that repository, make a new patch in it or append to an existing one).
Once you're done editing, browse to your patch. If you think it's ready, there is a "Ready to sail upstream" button that will let the original repository curator know that your patch is ready (in your opinion, anyway) to be put in his repository. S/he might put it in straight-away. Or s/he might have things s/he wants you to fix before putting it upstream. Or s/he might not want the patch (sorry!). But you can keep your patch and repository regardless of what upstream decision makers think. patchwerk.org still allows you to fork -- we just don't encourage it as a first option.
The reason that patch queues provide nice workflow as you can provide some guarantee that they apply cleanly. No, this isn't a contradiction about everything said above, that merging is a human problem not an algorithmic problem. You still want to have someone looking at these things before sending them upstream. But given the state of a repository and a patch, you can see if it applies cleanly or not. If it does, then you at least can push it upstream (whether you should or not is your call) and be assured it will apply cleanly.
Each patch has a icon indicating whether the patch is up to date with the canonical tree (or trees, for advanced users). If it is, you're good to go. You can optionally have notifications sent when the source repository changes (either the file(s) your patches are in, just when there are conflicts, or more safely, the entire repository). If a patch doesn't apply after a commit, the patch will be labeled as broken and you'll receive a notification unless you opt-out.
Once the patch is applied, it is removed from your active queue and put on the backshelf. You'll still have access to it, but you really don't need it anymore.
While you can't write a tool to solve problems, you can write a tool to help you think about problems. patchwerk.org is such a tool. We've bundled several bits of technology to help you develop software:
- patchwerk uses the excellent mercurial version control system
- patchwerk enables the excellent patch queue extension to mercurial. This enables you to hack on others' code while still keeping the source clean
- patchwerk features excellent workflow for collaboration. As a project manager, when someone alerts you to a patch they want you to include, you can review the patch easily and can see if it is applied to your most latest revision of the code (or more! We'll get back to this in a second). As a contributor, you can easily check out a project you're interested in and start hacking right away. Then, when you want to share your hack, you ping the project manager(s) to look at your patch! We can't make sure it will be included, no matter how useful it is, but we do provide the tools to make sharing patches easily.
- code review! Collaboration is really about talking about code. Some of this is pretty high level, but you also need to talk about the nuts and bolts. patchwerk let's you have discussions about files, patches, commits, or particular sections or lines in either of those.
- splitting patches! Often what was thought of as one issue is actually two (or more). patchwerk.org provides an easy TTW interface for splitting a patch into multiple pieces (or, much easier, flattening a set of patches).
- applying patches to multiple trees: it's never fun, but often there is a need for sizable projects to have multiple branches or (far worse!) to have the same source living in multiple places. While currently the latter is out of scope, patchwerk.org allows you to mark your patch for multiple trees. This is a bit of an advanced feature as now, instead of just one target, you have a few. On the other hand, it's better not to have to copy+paste when you don't have to. This feature is documented more completely on http://patchwerk.org
Future features: If people like patchwerk.org, there's a lot that can be done to make this not only a great platform for collaborative development, but a great community.
- Issue tracking: Something is wrong with your software! -or- You want to add a feature! Note it in our issue tracker! Once you adopt an issue, a patch will be set up in your queue and all commits on this patch will be automatically noted on the issue. Likewise, creating a patch will automatically trigger an issue to be created in the tracker. Finalizing a patch (either having it accepted upstream, or noting that it is finalized to whatever state) will automatically close the issue. Parallel to patches, issues can be forked and combined. I could talk about issue tracking all day, so stay tuned for excited updates here.
- Wiki and mailing list: Projects need places to talk about themselves. Wiki pages serve as a great collaborative space for everyone to develop canonical documentation. The wiki can consume documentation featured in the package (in many formats) -and- editing the wiki can push the documentation up to the project (in some formats). (The workflow of this depends on the general project policy. The default case is to treat wiki documentation the same as other source code, so the wiki edit creates a patch which must be approved before putting it in the source). Archived mailing lists give a place to have high level conversations. When a mailing list discussion crystalizes, we provide tools to mirror the takeaways onto the wiki, notifying folks of where this now lives. And as you might imagine, our wiki and mailing lists play nice with the issue tracker and code review tools!
- Continuous Integration! (coming soon!)
Q: What if I basically like someone's patch but there's something I don't like about it?
A: Easy. Since patch queues are first-class repositories, you can make a patch queue for their patch queue! Make a change to their patch and, if they decide to accept the change, you can end up with a patch you both agree on. You can even set it up so that if they accept your change, it automatically gets finalized to your source repository! (Assuming there were no other changes, of course).
Q: Neat! Can I have patch queues to patch queues to patch queues?
A: You can, of course, but we don't provide any front-end or functionality supporting this. A project is a piece of code. A patch queue is a collection of pending ammendments to that code. A patch queue to this is critiques of patches. Levels beyond this don't really mean anything more than critiques of critiques. Maybe if we get large enough projects to need this, we'll open up this functionality, but sometimes sanity is better than a complete lack of restrictions.
Q: Can I edit code through the web?
A: Yep! If you edit your own code, (be warned!) it will automatically be committed and pushed. So make sure that's what you want to do! If you try to edit someone else's code or patch, then you will automatically generate (or add to) a patch queue for that repository.
Working through the web is great if you have some little change or annotation to make. If you're doing something bigger, you might be more comfortable checking out the code and editing with your favorite emacs.
Q: What if I want to host my code elsewhere?
A: Assuming your code is in hg, git, or svn, you can host it anywhere so long as it is publically check-outable. We provide mechanisms such that you can give a way to automatically push upstream. If you don't want to use these mechanisms, then you'll have to do this manually. Sorry! There are some problems that can't be solved.
Q: Is patchwerk.org a federated system?
A: You bet it is! patchwerk.org is an openID provider and so should work with any other patchwerk websites. They like to talk to each other, so you can certainly mirror and aggregate work on any server running the software. If you want to set up your own patchwerk site, the code lives at
http://patchwerk.org/patchwerk/patchwerk.org
(Cute eh?) Read the README for instructions on how to get started. You can find other of our tools in http://patchwerk.org/patchwerk/ if you're interested.
HAPPY HACKING!
When you feel the urge to write something down because it is important, this translates to "mark this with an X and move on until it recurs"
On writing: the narrator
I've often been told my sentences in prose are often too long. This is true. In talking with a friend about how I find it hard to reduce their size and keep their flow and essence, I presented him with the sentence, "Luna still carried the hallmark of civilization, balanced between the overwhelmingly oppressive sophistication of Earth's decay and the vacuous military frontier of the outer worlds." He consented it was long but he liked it and said it would be fine as long as it was from a nonpersonified narrator.
I never really gave much thought to the narrator of that beloved story. But all narrators have a voice. I suppose that that one is of me in the mode of weaving a story. It is always third person, and mostly it is distant and seemingly impartial. It is certainly not the other-voice of any particular character. But occassionally, I slide closer to a character or more distant, always with deliberence. It is the kind of thing I would hope a careful reader would notice and appreciate.
Unless one has intimate reason, it is in poor form for a narrator to lie to the reader. But the narrator may deceive. As story-teller, the narrator's job is to make you think things, to draw you into a world whose effect is the measure of it. If by a perverted account the reader suffers more of the effect, then one's aims are acheived.
Though, or so I would like to believe, my narrator is more distant, as was Kafka's, also there is the sort of psychic soup of expression therein, like Phillip Dick or Bill Burroughs, as there were some sort of primordial dissolution of the characters' collective unconcious. Kafka's way is better, and in this I know I will never achieve his level of mastery.
The narrator's voice changes much over the saga, mirroring -- being -- the story told and also the characters who act it.
By no means do I present this form of narrator as ideal. Rather, this is the form of narrator one use sfor this story. Every story has a narrator, and every narrator has a voice. Share your story as it was shared with you
Want to keep your data concurrent across CouchDB instances? Try KitchenSync
(not affiliated with the culinary supply outfitter, Kitchens,Inc.)
so I said, "Keynesian economics? More like Dickensian economics!"
(I'm pretty sure there's a New Yorker cartoon in there somewhere)
Rules of conflict
Note I said won't and not can't
This implies...
Joey Martinelli:
I'd come with you two, but I'd feel like a third rail.
Just like the canary in a goldmine.
The only education I've had is from the school of Fort Knox.
You're a regular Hubert Einstein!
if python gives you enough rope to hang yourself, and version control is an infinite spool of rope, then DVCS is a infinite rope-spool factory
python -c 'import sys;_=[i.decode("base64") for i in "bGljZW5zZQ==\n:UHl0aG9uIHdhcyB3cml0dGVuIHNvbGV5IGJ5IEplZmYgSGFtbWVs\n".split(":")];globals()[_[0]]=lambda: sys.stdout.write(_[1]+"\n"); license()'
I want to write a program for the device I just bought....
70s: Well, most of the register names should be pretty obvious. You might need to buy some transitors to patch the board. But shit, you know that, right?
10s: Great. And we're really excited to have you writing applications for our device! Let's just get you started. First, you'll need to download the SDK. Now, it's $300, but you'll make that back right away in our app store! Then, when you complete the wizard to setup your application and register it with our company. And once you sign the license agreement, we'll have you register and up and running with our IDE in no time
Which is worse?
the myth persists:
This is nothing more than information hiding, which is one of the tenets of object-oriented programming.
-- from http://www.ibm.com/developerworks/webservices/library/co-xpcom.html
It is one thing to say I cannot help you, for this is what all say save to those few worthy of true loyalty. I hold no blame, for I can offer no better.
It is another to rip at your scars while blood rushes cold from your heart. These pickers of nits, well-meaning, surely, cannot even be scolded for their lie of help, for that lie to themselves they have not revealed.
Eh, poor Yorick. I knew him okay. A fellow of ... finite jest, and pretty cheap taste. He hath bore me in his back seat whenever I would give him gas money; and now, how abhorred my imagination is ... that I don't have a taco.
roadmapper
One piece of software I need is a way of making road-maps for other software. Issue trackers are great and essential. Unfortunately, what issue trackers miss out on is charting the course for software futures. I want a place to see where all of my medium- to long-term plans are laid out so I can assess them and meaningfully figure out what needs to be done, what can be done in a period of time, what would still be nice for the future, what is no longer important, and what should be prioritized soon. Issue trackers deal well with high priority issues and as a place to record longer-term plans. They do not do so well with strategically planning for the longer-term, and that's what I need right now.
For instance, take my website . I use this as an example not because it's really what I want this for (in fact, my website is a very low priority right now), but because it is a very applicable example with lots of pieces of software. If I were to jot some notes on longer term plans that need to be done for my website, they would go something like this:
- tagging WSGI middleware
- finish up my mozilla page: http://k0s.org/mozilla
- commenting middleware (with CAPTCHA middleware)
- putting up webcalc in the demos
- setting up email dispatchers so I can mail myself blog posts, images, and documents
- add a add_blog pluggable even handler in bitsyblog so that I can tweet the short form of my blog entries plus their URLs so that these tweets can be picked up by google buzz (thanks, google!)
- mirror my repositories to bitbucket and github
None of these are particularly daunting tasks (although they often seem that way with my relative lack of time). Probably it's a small enough set of tasks/components that I could get by with just an issue tracker (oh, forgot that one: "setup an issue tracker"; if I only had an issue tracker I could record there that it needs to be setup). But, if you will, imagine these are more strategic priorities with numerous subtasks. Since these are all medium- to long-term priorities, whose various many issues won't be scoured everyday, it is easy to lose the big picture in a complex report.
Let's pretend software [components] are ships. That's basically true, right? I want something that lets me see where all of my ships are on a map, so I can rearrange them and send them on different courses as the winds change. This would have to work with an issue tracker (at least for the real world large projects I'm actually imagining), but it's purpose is different from an issue tracker.
And once again, I realize the sad irony: I have written a blog post about a piece of software specced for medium- to long- term about the need for a piece of software to chart the needs for pieces of software specced for medium- to long-term. Ouch. That hurts just thinking about it.
Morpheus...could I maybe have the other pill now?
the halting problem
No, not the computer science one! I'm talking about how drivers in the Bay Area slow down everyone in their vain attempt to be polite. The scenario goes something like this, if you'll imagine with me for a second...
- I come walking up to a corner. I'm probably going to cross the street, maybe.
- A car comes up the the intersection. They stop. They have plenty of time to get through before I would even have to change the pace of my walking.
- But they just sit there. I stop, waiting to see what they'll do.
- They sit there a little bit more.
- I give up and cross the street in front of them. ::sigh:: Now they've slowed me down and they've slowed themselves down for no friggin' reason.
Okay, I understand they're just trying to be polite. But, um, why is this polite? They had plenty of time to go before I would have even had to slow down! I mean, do they have such poor sense of timing that they aren't sure if I'll make it across the street before they go? (If so....I'm not so sure if they should be driving.) Do they think that them stopping for an extended period of time and me stopping for an extended period of time is a thing to do?
This happens several times a day. If it was once in awhile, I probably wouldn't care. But it's all the time.
Worse, this is the best case scenario. Other, much worse, variations on this scenario that have happened to me (some several times) include the following:
- The car stops or pulls up halfway into the street. Then they wait for me. I mean, their car is directly in my path, so what am I supposed to do? Walk in front of them in the middle of the cross-traffic street? Then they honk at me, letting me know that I'm wasting their time "making" them wait for me when all I want them to do is go so I can cross behind them.
- I'm not crossing the street. I'm just standing on a corner. They halt for me anyway. Then they honk at me, often waving their arms and mouthing who-knows-what for (again) "making" them wait for me. All I'm do is standing here, guys (and gals). Just, um, go about your business.
- They stop. I stop. They wait. I wait. I wait for a bit more. When it's obvious that they're just going to downright refuse to move until I cross in front of them, I walk across. Then when I don't mouth "thank you" they get all pissy.
So, attention motorists! I know not many of you -- or anyone else -- reads my blog. But if ya do, this weird weird form of politeness...isn't. Just go. Assume that everyone is just doing their thing, mon, cuz that's most likely the truth. And in the end, you've made everyone happier. Maybe you don't get to drive home with the self-congratulating "I stopped for that guy so I must be a good person". But trust me, you're better off.
It's one of the things I miss about New York. People say we're rude out their, but it's really just kinda more live and let live. Do what you want to do and more than likely you're not going to bother anyone else. If you see someone loaded up with baggage, it might be a nice thing to hold the door for them. But I've gotten yelled for that too.
another website i don't have time to make
imboredandhavenofriends.com
Basically, it stems from a common collusion of problems I tend to have and am suffering from now:
So imboredandhavenofriends.com is a site where you can do something with other people. You put down where you are and what you want to do, and maybe someone else is bored enough to do it.
There is a site already for this: craigslist! But it's become increasingly awful.
Bah....bored! So bored!!! Need to leave house before crazy I go
I wish I had someone to read plays with. I have been reading my favorite snippets of Shakespeare to myself, but it is not the same to play to the mirror.
Life's but a walking shadow, a poor player That struts and frets his hour upon the stage And then is heard no more: it is a tale Told by an idiot, full of sound and fury, Signifying nothing.
all is occluded
If you're a bad programmer or otherwise don't want other people to figure out what you're coding, there's a two step path to success. Don't worry! They're easy! You're probably doing them already!
- Don't write tests
- Don't comment or otherwise document your code
Between these two, there will be no record of the intention of the code. And if the intention isn't known....you can just claim it's desired behaviour!
and yes, i am fully aware that it is childish to pastebin my pastebin script using my pastebin script
to measure one's self versus one's fellow unwashed masses leads to mediocrity
to measure one's self against the strides of those that walk amongst the stars points towards excellence
Truth is Treason
I went to drop my laundry off to have it washed+folded.
Aside: I don't really care about doing laundry myself. As far as putting it in the washing machine myself, switching it to the drier, and folding it, let's call it....30 min. No big deal. What I mind, especially as I have too many of them already, are the headaches. Like...the last time I went to a laundromat....oh! no driers! So I have to string the clothes all over my apartment. I suppose I may be too much of a gentleman in some respects. But it bothers me. It bothers me most that I have A Task I Cannot Complete. Then there is the timing. While my laundry is going at the laundromat, I better precisely time it. If I stay with my clothes, I throw away time. If I leave, I chance having them stolen. Or worse...being yelled at because I've left my laundry too long in the wash/drier. Or having them thrown on the floor. Yes, these things have happened to me, multiple times. /End backtrace.
So, the place three blocks away from me, which I took off deliberately early just to meet their SF hours, was unmanned when I took my clothes there. I knocked. For 20 minutes. No answer. While I was waiting, I googled "wash and fold, the mission, san francisco" as well as google mapped it. The closest location was the Fiesta laundromat. Open 24/7. Great.
So I went there and asked "Do you do wash and fold". "No". "Do it yourself" was the response of someone flirting with the attendant. should have said "Fuck you". But I didn't. Yeah, it's easy to do laundry if you know someone working at the god damned laundrymat. If I knew someone working at a laundrymat....I'd probably do my laundry there. As it is, I've already waste half an hour's salary fucking with my laundry.
So I go further. I find a laundry automat. Yes, they exist. While it's far from my apartment, I'm just tired of carrying my laundry at that point. Evidently, San Francisco doesn't know about wash+fold.
Look...it's not about saving time. It's about accountability and not having to care. If I had laundry in my building, and, if unlike Berkeley, my laundry wasn't thrown on the floor literally five minutes after being in the washer or drier (yes, absolutely, this happened), I don't mind doing laundry. I don't. Like I said above...actual time: 30 min. Amount of worry: priceless.
Long aside aside, I end up at the Zeitgeist. This used to be a serious biker bar: http://k0s.org/blog/20100512212231 . It now has a myspace page: http://www.myspace.com/zeitgeistsf Things are going fine. I almost forget I am wearing a nerd T-shirt as much as the clientelle has changed.
I like taking photos of stupid shit. See http://k0s.org/pictures/specialfx/ . So I'm debating whether I want to stay at yet another place where no one talks to me when I notice a(nother) really cool reflection in a bar glass. I take a picture. The bartender demands I erase it.
I'd post the picture to clarify the Truth. Oh, but wait, I can't! So you'll just have to take my word I was doing something innocuous.
I thought the Truth is Treason was ironic. Now...I'm not quite sure...
bikes in the Mission have replaced bikes in the Mission
when the world becomes that fucked to death shite pile that has become, in retrospect, precious, it is those who almost knew what things were that shall know nostalgia
nothing is ever what it was ( http://www.quotationspage.com/quote/421.html )
when you, an experienced drone, hear the shockwave, you wait for the blast
In every field of magick, there are the believers in esoterica and those who use the craft to manifest their will
The basis of diplomacy is that two selfish parties may take more advantage of a compromise between their objectives than adversit between them. No one walks away happy from a compromise, but each party feels relief that deadlock is breached.
Test Driven Development, take 2
I haven't done much test driven development recently. I, sadly, find it usually hard to write meaningful test. I've hoped someone would teach me how to write good tests one day, but, in absence of that, I can only do what I usually do: throw things at the wall until they stick.
I've recently started to do some testing for a piece of software I'm working on: http://k0s.org/mozilla/hg/ProfileManager/ . Basically, it's a manager for Firefox profiles. There's nothing particularly complex here, just managing directories. After doing the same sets of steps for testing my code manually, however, I got really tired of it. Also, I wanted reproducibility in the likely case I forgot something. So I started writing tests.
The first thing I discovered was how much python testing frameworks suck. I was originally using doctest as it's an integration test and I want to keep state and do tests based on the current state. Things were going well...until i needed to debug. so i had the simple request of wanting doctest to stop on first failure. Nope! I mean, if i can, an hour of reading didn't find it. I can suppress reporting of other errors. Or I can raise an exception on first error that is basically indecipherable to where it died in my code. So that's out. Unittest is just not suited to doing anything, well, other than unittests, which is not what I'm doing. When I have done TDD of my own accord, it has usually been testing with a preserved state. I suppose this is largely because of the above (getting tired of doing the same set of steps to test manually). I'd love to do more unittests. I find it really hard to write code that is unittest friendly. Maybe this means I'm not a good coder. IMHO, if you have to stub a lot out to get a unittest working, then not only is it a pain, you're often not testing what you think you're testing (speaking from experience). so I did what I usually do. I wrote my procedure in a .py file and did my testing with asserts: http://k0s.org/mozilla/hg/ProfileManager/file/tip/profilemanager/tests/test.py
Tests should be easy to write. Testing is wonderful and not testing is retarded. But i'll tell ya, when it's hard to do simple things, I have a real hard time getting motivated to do them.
The second thing I discovered is just how many stupid mistakes I make in coding. I suppose I shouldn't be surprised. Usually I fix as I go along and I'm sure ProfileManager is no worse than anything else I do. It's just....so simple that I'm surprised at the number of my mistakes. Missing colons, wrong variable names, etc. So TDD kept me honest, not to mention finding many mistakes that I wouldn't have found as quickly were I doing by hand. And I don't even have much coverage.
you kids have it so easy today...
why, back in my day, bits had only one value. they were all off!
you kids just that you can turn them on these days...
Development Considerations: the contract
Observations:
- developers will always have issues that they'll wish to note. Some of these will be important only to them; some of these will be actually important
- effective managers will want to limit scope creep. This will mean shooting down developer ideas
Note that this is the best of scenarios. In dealing with human problems where one is on the same team, then it must be assumed that all parties are doing their best for the team. If we've gotten into the scenario where developers and managers are trying to undermine one another (or control one another), then the game is already lost and no good software will result.
So how do we make the above work?
In other words, to raise an issue is to put some sort of priority on it. No egos allowed here! All software of any age has design defects and things that don't work right. But to say "I don't like the way such and such is done" is not helpful. Basically, don't bitch. If you have a clear idea on how such and such could be done better, by all means, present such a solution if it is worth the team's time in the present or in preparation for the future. But just pointing out when something is wrong does not help.
The highest court in the land just got taken down a peg
Supreme Justice
Objection overruled...with a bullet
Don't forget to watch Supreme Justice 2: activist judges
i wonder if the Firefox build process takes intentionally long so that i will have more time to read documentation
The Open Source Hacker vs. The Proprietary Programmer
I ... don't pay for software. I don't steal it either. I'm mostly uninterested in proprietary software because it costs money, it's against the inherent philosophy that information flows freely, and most of it is no better than open source alternatives, at least if you're like me and don't mind getting your hands a little dirty. Let's face it: most (all?) software of any size has problems; things that it should do better and doesn't, outright bugs, or inability to work on problems that I, the user, wish it would.
There is good proprietary software out there. There really is. But I have very little motivation to use it. All software has a buy-in time, where you learn how to use the software effectively. This is already enough to keep me using emacs instead of vi, even though I feel that vi would fit my brain better. I've already paid the buy-in time for emacs and it is doubtful that I will want to use my little free time learning a new editor. I can use vi, I just can't do anything fancy with it (though, to be honest, I can't do much fancy with emacs either). Now if someone comes along with a new editor, supposedly better than emacs or vi, and wants to charge me money, will I pay? Highly doubtful. emacs basically does what I want. In many ways, it's kinda a crappy piece of software....but what isn't? It's a known crappy piece of software that does a bunch. So not only do you ask me to throw away my expertise in emacs for something that, if it does much complex, will be a new learning curve, but you also want me to pay money for it (possibly per machine)? And since emacs is open source, as archaic as it is I'm sure it will be around for the next twenty years. Your new text editor, however good it is....well, it's not open source, so who is to say that it won't go away when the next cool thing comes around? [On similar lines, I don't understand why anyone uses M$ word documents, since there is the non-proprietary HTML with many good editors and free online hosting services. But I digress.]
This has come down to a dialog in my head between an open source hacker and a corporate developer. Let's see what happens....
Developer: Hey, we have some shiny new toys. Want to buy into them?
Hacker: I dunno, I already have a lot of cool toys and they're free. Why should I pay for yours?
Developer: Your toys are kinda weird and hard to use. Ours are nice and streamlined.
Hacker: Yeah, but I can do anything I want with my toys. What if I want to change yours?
Developer: That's the good news! We have plugin points and an app store so you can make $$$ selling your extensions!
Hacker: But that won't help anyone but me. What if someone wants to change the code I wrote or offer a patch to fix something?
So it goes. It's kinda an old argument, and I almost feel bad about rehashing it. But it still bothers me and I still feel, along the line of Mozilla drumbeat, that once non-developers really understand what is at stake as far as how software works as part of their lives, then more people will choose freedom as long as it's convenient (which it mostly is these days). Let's be realistic here. I don't have time to go into a long history of OSS and how it's actually changed computing (though I probably will someday), but to point to one example (and to shamelessly plug Mozilla), Firefox really saved the internet from becoming a proprietary medium that required a corporate buy-in. It's still the wild west and I for one would prefer it be kept wild rather than falling under corporate dictatorship. If you think I'm being alarmist, then I hope you'll take my word that I'm actually understating.
Making your own cheeseshop
It is a common misconception that the cheeseshop (pypi.python.org) is the place to go for python packages. This is only true by convention. I won't go into the history of distutils/setuptools/distribute/pip packaging fiasco. Suffice it to say that (I hope) things are slowly converging and that both pip and easy_install, the two major ways of installing python software, both support a -i option to specify the URL of the package index (which is, by default http://pypi.python.org/simple).
In its base form, easy_install and pip just crawl links. You look at the base URL (see above) /<package>/<package>-<version>-<extension> and download this, unzip, run python setup.py install on it and you're done. So if you want to make a cheeseshop, there are two essential tasks:
- Generating e.g. tarballs for a package and all of its dependencies
- Putting these tarballs on the web with some appropriate parent directory
Not rocket science...barely computer science, really.
For generating packages and their dependencies, I used pip. pip is really great for this. I only used the command line interface, though if I was smarter, I probably should have looked at the API and figured out what pip is doing internally and I could have avoided a few steps. Basically, using the --no-install option downloads the package and its dependencies for you and lets you do what you want with it.
I made a program for this, see http://k0s.org/hg/stampit . It's a python package, but it doesn't really do anything python-y. It was just easier to write than a shell script for my purposes. Basically it makes a virtualenv (probably overkill already), downloads the packages and their dependencies into it, runs python setup.py sdist on each package so that you have a source distribution, and prints out the location of each tarball.
The source distribution is very important as we want packages that will work independent of platform. These should. If they don't, we can make them.
So problem #1 solved. Let's move on to problem #2: putting them somewhere on the web.
Mozilla is so kind as to have given me a URL space on people.mozilla.org. Since easy_install and pip are really dumb and basically just crawl links, and since Apache is smart enough to generate index pages for directories that don't have index.html files in them, the hard part is already solved. I will note that people.mozilla.org is not intended as a permanant place for these tarballs, just an interim instance until we decide where we really want to put them.
Since I like to write scripts, I wrote a script that will run stampit and copy the resulting tarballs to a place appropriate to a cheeseshop. You can see the code here:
http://k0s.org/mozilla/package-it.sh
The variables are pretty specialized to my setup, but of course that's fixable.
Does it really work?
Yes! You can try it for yourself. Try:
easy_install -i http://people.mozilla.org/~jhammel/packages/ mozmill
Watch where the links come from. Surprise! They're all from http://people.mozilla.org/~jhammel/packages/ ! I would highly advise doing this (and just about everything else in python) in a virtualenv so that you don't pollute your global site-packages.
Why am I doing this?
The Firefox buildslaves are supposed to fetch data only from mozilla URLs for stability. So, if python packages need to be installed, they need to be available internal to Mozilla. If a package didn't have dependencies, then this is a no-brainer. But packages do have dependencies. Mozmill depends jsbridge, simplejson, and mozrunner. While this is a lot of work for just one package, if we want more python stuff in our buildbot tests, we'll need to do more of this, and I'd rather have a good solid methodology to do so. I also imagine this growing as a place to put all of our python packages for internal Mozilla needs.
I will note that I did this in a few hours from basically knowing the problem space but never having actually done it. None of this is supposed to be a clean and polished solution. But really, its not bad. We did something similar but less functional at my last job, The Open Planning Project, for similar reasons, so its not like I tackled this blindly. This is not as fully functional as the cheeseshop. A maintainer needs to run the package-it.sh script for each package (and its deps) they want installed. There's no accounts or any of the other features the cheeseshop has. But for a simple prototype and a way to move the discussion forward, its actually not that bad of a solution. There are more robust ways of really doing the cheeseshop, such as http://github.com/ask/chishop , but for a package dumping ground, this solution works and its really not even that hacky (in my opinion anyway).
implicit is better than explicit
I understand what is meant by python -c 'import this' | grep Explicit. On the other hand, when people take this literally, it really annoys me. Python does many things implicitly that quite honestly aren't that interesting to the average programmer. If you disagree, please do your own garbage collection and module path resolution.
On the other hand, things like calling parent constructors implicitly I find much nicer than, say, the C++ way of implicitly doing them. So it's a mixed bag.
What's my point? Eh, I might have lost it. For one, explicit is not necessarily better than implicit. Implicit + sensible workflow is a huge time saver. On the other hand, the flexibility gained by explicitly doing things is also important. But don't believe the dogma
the source really is the documentation
I write a lot of scripts. Typically, when I say script, I mean "something that does something that's easy to do but that I am likely to forget". Since these scripts are educational to me, a nice side effect is that the script is the script can be educational to anyone.
Usually the phrase "the source == the documentation" fills me with dread. Its insulting, to say the least, in the same way that RTFM is insulting, or when you ask how to spell something and the teacher says to look it up in the dictionary. Of course you can, eventually, find information this way. If your task is learning a big system, then its not even a bad way of learning. But if you're curious of how the word is spelled to, say, use it in writing, or if you're using a program to accomplish some meta-goal, then you probably don't care about the minutae.
But what about the positive side, these educational scripts that are really mostly documentation that just happen to run?
I'd like to see something like a wiki that could include these scripts as learning examples. My idea is something like this: you take the comments of these shell scripts and feed them (going through some markup process like restructured text) as the wiki page text. The actual programmy part of the scripts -- you know, the parts that do things? -- these get turned into <pre> blocks or the equivalent thereof. Wouldn't that be nice? Your source code really becomes documentation!
A few extensions...
For a language like python with doc strings, you could use these as well as comments. I realize systems like sphinx already do this. However, I'm talking specifically about these kinds of scripts that are HOWTOs first and working code second.
If you did use these scripts as wiki source, you could also make them editable. That is, if you trust your user base, you could have scripts that are edited through the web. I realize that this idea isn't new. I usually think of editing code through the web as, at best, a questionable idea. But in this case, I think it's apt, since really what you're doing is editing documentation, to code part being anciliary.
"it's not my fault!" ... oh yes it is!
I recently moved to the Mission district in San Francisco -- yeah, back home -- and kinda fell in love with a place that wasn't there when last I was: Pirate Cat Radio Cafe. I mean, what part of that is there not to like? And instantly, some dick spoiled it for me.
I was in line behind some tourist who was taking forever. Whatever. I'm used to that sort of idiocy. Some other tourists were prancing around the cafe, the gratuitous attractive girl taking pictures while the typically douchey boy doing what douchey boys do. I didn't know what the fuck they were doing nor did I care. All I know is they weren't in any sort of line, they were just being little dicks around the shop, whereas I was waiting patiently. Well, as patiently as one can when one is worried about the cigarette smoking tables being taken and one is surrounded by folks with no personality.
Anyway, after the tourists grab their drinks they instantly take the cigarette smoking table. Great. I mean, there's another table, but I wasn't in the mood for being yelled at by tourists for satisfying my nicotine cravings too nearby. The barista asked what I wanted. "One coffee--"
"What about me? We've been waiting around way longer?" exclaimed Lord Douchington.
I said "Go ahead." and walked out of the cafe. Fuck that. The barista turned to me probably because I was waiting in line and not fiddling around the cafe. I realize most precious Californians have some sense of entitlement that they don't have to obey any sort of rules of politeness, that its okay to reserve a laundry machine with a magazine, that having kids is an excuse to act brain dead, and that wandering around a place taking pictures is the equivalent to waiting in line.
What I object to isn't even this. Its that I'm the asshole because I'm overt about it. Did I argue for my fucking rights? No. Let them have their fucking precious rights. But why am I the bad guy when the whiners get their way? Personally, I consider whining much more offensive that outright being a dick. Its being a dick that demands to be coddled.
upstream propagation to pastescript templates
I find pastescript templates (or something like them) vital to intelligent software development (see http://k0s.org/portfolio/workflow.html#software-development ). You create templates for your project and deploy them.
There is a missing piece: what happens when you need to propagate changes to the template back upstream? You have to change both your deployed copy and the template copy.
I don't have a good solution (yet), just noting the problem.
dreams of the tea party
I had a dream last night. I was, I don't know, some kid wizard in the Harry Potter world. Myself and Hermoine were in a class. For some reason, we were driven to the teacher's desk, where I spilt a potion into a pool, enabling me to see a prophecy. Something horrible was going to happen to a girl in the back of class, someone that no one in the class really liked, though she was fairly popular. Someone had set her up to be ruined with invisible strings. But because I saw the prophecy, we took action. Hermoine used alacrity to run over to her and warn her of what was going to happen. While it was still bad and hurt and embarrassed her, she was not publicly exposed.
Now consider the tea party movement. Firstly, let me say that the problem they oppose (the government misspends money) and the solution (make the government smaller) are actually unrelated. This is a sad fact. The government needs to learn how to budget, but this is a human problem, not a problem that can be solved by just cutting off the limbs. We can talk about this more later.
I see the Tea Party as a bunch of very frustrated people who flock around Sarah Palin, who serves somewhere between the Mad Hatter and the Queen of Hearts, saying meaningless things, riling people up. And to what end?
Here's what will happen:
I don't know if the tea party is truly a grass roots movement. It probably was originally, but that no longer matters. Somewhere, some puppet master with dark machinations decided they could use this to their end. Someone will appear at a time appropriately before 2012, and Sarah Palin will put her support fully behind him (it will be a male), and so the tea party will follow him. He will actually be a very scary man. Think Dubya but intelligent. I hope that he won't gain the presidency. In either case, he will try to do something awful. Actually, he'll probably try to do several awful things as a distraction, but there will be one focus. When he fails (which I hope he will), he will have set up Sarah Palin to take the fall.
These things seem unrelated at a casual glance. But I think they are the same thing.
sealed in envelope
i consider google buzz conversational in the same way that i consider what they do on talk shows conversational
(i originally posted this on google buzz, mostly for irony, but decided to import the meaningless banter to a real blog)
Its really sad that the only way to make people who wish to unload drama understand your position is more drama
I find that writers, even more than actors, are grossly aware of the division between their selves and the faces that they wear
idea: workspace correlations
I hate IDEs, in general. In fact, "integrated" anything usually says to me "work within how we tell you to do work", which is exactly my philosophy. I use emacs for editing, Firefox for browsing, python command line for running, etc, and really don't want/need these to talk to each other.
On the other hand, I would like a way to correlate work. I'll tell you what I mean in an example, as I don't want to make this a long blog post. I'm working on a project (well, a few of them, but let's take this one) and I need to do some programming, testing, and documentation. Sadly, the wiki documentation suffers because there's no quick way of updating this. What would make this work for me is if I could tie a group of applications (and contexts, for instance the project's wiki page) into a group and have a way of working on them collectively. In other words, the integration layer is the rules by which I define how I want to work on this application. (I realize I'm being hand-wavy, but as I said, short blog post).
Using this approach, I get to keep my heterogeneous environment and can hopefully do nice things like sending a docstring to a wiki page, or updating instructions via what I'm doing in a shell window.
Too abstract? Yeah, probably. I have a specific workflow in mind but don't have time to elaborate now. Maybe you get it anyway.
Takeaway from the wired revoluion
Information theory is no longer abstract, but something that everyone deals with everyday
For good software...
I'm sure there is some profound implication to all this, but right now I can only think inside the box.
i switched my python indent from 4 spaces to 2
http://k0s.org/hg/config/rev/30161c82a278
it feels a little like not wearing underwear...a little naughty
Ya know, I just have to say it...
bitsyblog is everything that's wrong with blogs. But at least its fast to post.
playing nicely
and yes, I know the 'play' will offend. no matter.
i don't play nicely, and i never said that i did. but i will say that i have played nicer and more honest than many of my contemporaries.
so judge me by that. i don't claim absolution. i just wish 'fair' with respect to me was judged by that which has been laid upon me
a rant about empty space
From http://www.python.org/dev/peps/pep-0008/ :
If necessary, you can add an extra pair of parentheses around an expression, but sometimes using a backslash looks better.
No! Backslashes to mark line continuation never looks better! It is completely non-semantic and their inclusion in python reminds me of the crazy people that do fancy nested tables using Restructured Text. Boo, I say. Boo! And this is not an opinion!
--
The views expressed in this blog post may not reflect the views of rational thought
its all a hack, anyway
I am always surprised when a company refuses to release source code with the reason "its only useful internally". Privacy concerns? Sure. But because its not tidy enough? I don't buy it.
Programmers are used to dealing with messes. In any language, there are parts of the standard library that are, let's face it, just plain bad. Let's look at python. ConfigParser is awful. urllib vs. urllib2? what the hell... And these are just standard libraries. Look at the svn swig bindings. Hell, look at mercurial. The APIs are, dare I say, piss poor. On the other hand, I need those libraries and am glad they exist.
What I object the most to is the double-speak. Its always phrased as if companies are doing a big favor by not releasing source code....protecting us poor programmers. The reality is, they're protecting their reputations. The reality is all companies produce hacky code because all programmers (some more than others) write hacky code. Google is supposed to be the height of genius, right? I've read some of their released python code that looks like it was written by a first-year computer science student (if you're curious, I'm talking about the Google Apps LDAP sync code....tsk...tsk...tsk...). So if they can write bad code so can you!
There's another take-away here. Don't write code that depends on your internals. Even if you never ever ever plan on releasing it, YOU will regret it. All of the sudden your internals change. Oops! Or, the alternative, you spend ten years maintaining spaghetti code and juggling internals because you've committed to a platform. You'll think one of three things after reading this:
- You're preaching to the choir, dude.
- Well, I don't know, but you seem like you know what you're talking about (trust me!)
- Nope, it saves me time
Not to argue the point, especially since I'm making hand-wavy generalization, but if you're #3, then I hope you like maintaining code. Because you will. <plea type="last">Separate deployment-specifics.</plea>
A Command-line Interface to the Command Line
What has become underappreciated in the world of GUI is that command line programs have vastly different interfaces. For instance, contrast something like mplayer with something like, oh, I don't know, cat. It doesn't matter. One common pattern (and certainly not the only one) is the command [options] subcommand [subcommand-options] pattern. This is useful when there is a common context of operations but different types of operations, and is used by svn, hg, python paste, etc.
So I've written a few of these. My latest attempt at this form uses the following form: underneath all, the API, in the form of a class. To interface with the command line, I wrote a class and a few standalone functions that should really be folded into the class that directly exposes the (public) API to users without knowing anything about the API class. python makes this possible. Is it a good idea? Well, probably not, but sometimes you have to do something clever in order to learn what you really want to do (maybe in 6 months).
How does it work? You have a class that inherits from OptionParser. To its constructor, you pass a list of commands that you want to expose to the user. Using the inspect module, you can examine these functions for their arguments and automatically construct an OptionParser (!) for each subcommand and, even more magically, invoke the chosen function once the class is instantiated (!!!).
Yeah, a little too magic, I know. On the other hand, this is a class of problem in which I have profound interest, namely translating one way of interacting with something to another way. Namely, the GoF interface pattern. If I needed something less magic, an IDL ( http://en.wikipedia.org/wiki/Interface_description_language ) would be a way to go, which functions as an adapter signature to an interface.
You can see the code here:
http://k0s.org/mozilla/hg/ProfileManager/file/tip/profilemanager/command.py
Its really messy, mostly because I started off using the command method as a decorator. While I still ideologically support this use case, there are two difficulties. The first is, in my simple incarnation, you need a instantiated object on which to act. This ideally should be restructured a bit. This brings us to the second difficulty: when decorating a method, the decorator cannot tell if it is a method with a class or a free-standing function. This is due to subtlties of how python deals with method binding. Namely, the decorator is called after function closure, but the binding mechanism for methods is called after class closure.
Another argument against this is that, if you have subcommands, it implies a common context. For a simple system, a class is a good instance of a common context. The correct way would be to have a way to pluggably associate contexts and functions, but that's more than I care about now. Class == context .
Ignoring all of the mess I'm sweeping under the rug in the above two paragraphs, there are serious conceptual problems with this approach too. For one, for better and worse, in this approach, the user API is the class API. There is a good work around this -- having a subclass of your real API which is the API you want to expose to the user and then working with this. Complex arguments won't work -- I take into account booleans and variable arguments, but anything more complex would require more work. This isn't really as dire as it sounds, as taken with the user API class idea, you can only pass strings through the command line anyway.
There is also the general problem of domain-specific languages. For instance, look at how I parse out help for arguments:
http://k0s.org/mozilla/hg/ProfileManager/file/tip/profilemanager/command.py#l46
Again, strength and weakness. There is no "standard" for how to document arguments, so I just made one up that is pretty common in the wild. The downside: you must now write your docstrings in this format (which admittedly shouldn't get in your way too much). The upside: you can now programmatically extract help for function arguments. In general, I find the argument that doing things like this is too restrictive uninteresting. Every time you abstract things, you lose some flexibility. The point is: do you get return on what you do and do you care about what you use? python (cpython, anyway) is an abstraction on top of C, which is an abstraction on assembly. Now, you can't do pointer arithmetic in python (this isn't a challenge!). But why would you want to?
I think its cool that you can do such intimate introspection in python. While there are some rough spots (and I'm not talking about my messy implementation), I think they just point to how cool the whole system is. Imagine trying to do the same thing in C. Then, when you get back from the asylum, take this work not as a somewhat too clever implementation, but as a pointer for what I really want, which is the instantiation of a pattern.
The Shih Dynasty is known for its highly cultivated teas. So if you're ever drinking a particularly good cup of tea at a Chinese restaurant, exclaim (loudly) "This is Shih tea!" and the compliment will be well received.
There is a difference in listening to real radio and net radio. With the olde-fashioned kind, I turn a knob and it works. With net radio, I wait for a host to resolve, which wouldn't be so bad if wnyc.org got their act together
It is not the individual that makes civilization great and it is not inherent structures that make the mind great.
It is tools and their application.
pie: the only food that describes the ratio of its circumference to its diameter by truncating its tailing letter
The real point of the American revolution is that were all gentlemen (and ladies). Maybe the original point was more like "the province of equality amongst gentlemen extends somewhat further than specified by birth or common law".
being domesticated
One of the core subjects that occupies my thoughtscape is domestication. To what extent is it harmful? To what extent is desirable? I don't know if I can adequately capture my thoughts in words. But perhaps giving a few examples from my own life will be illustrative.
The case nearest my heart is that of Lilly, my cat friend. Lilly was born into a feral environment as so had to develop the skills necessary to make it in that environment. When I brought her home, she trusted no one. Everything was new to her, each situation one of wonder and fear.
One day (and, yes, it really was about that sudden) Lilly decided that affection was what she most cared about in all the world. While she, like her dad, has always been a strict proponent of protocol, it was on that day that she stepped into domestication. She slowly relinquished her independence, her ability to be constantly desperate, and yes even some of her sharpness. But though they took a long time to manifest, she gained too, even if all she had gained one could renounce as merely illusory trappings. She learned to trust me. She learned to depend on me. She even learned to love me. It is true that when I adopted Lilly, I had no doubt that if she had to survive in the wild, she would be a fierce little feline. Now, while she retains a sharpness and sense of danger known only to those that have experienced peril, she would not make it save by chance. But Lilly has become such a sweetheart. And what of the important questions? Has she lived a good life? Has she lived as she would have wished?
What of me? It is easy to speak of a cat as domesticated, but because there is an innate hubris in thinking of humankind as apart from the other species, to speak of human domestication is a more delicate matter.
It is, perhaps, uncouth to mention the fact that girls become attached to boys in fairly short order. There was a time when this was enough: a girl who would go domestic for me. I don't state a claim to this misfortune of nature. Merely, in this messy messy world, I thought it would mean something to me to have a chemically-subservient partner.
I guess the sad part is that I had such an early will to become domesticated for someone that the next ten years were pretty much miserable. Girls didn't want a domesticated boy, not in their twenties anyway. Now...now I'm more confused than ever. Do I want to be domesticated? Do I want a domesticated partner? Truth or illusion....what is the difference... I guess it depends on which world I answer for: the world of ideas/ideals or the world of pragmatic, ugly reality. I guess the domestication phenomenon both disgusts me and entices me, because of its base nature and because it is a question that is ignored. I like to think of such things. It is a sad reality that the worthwhile questions cannot be discussed, cannot be marketed, for either they are of a profound understanding that need not be reduced to words, or words alone are incapable of transmitting understanding.
hopefully a not too clever solution
At first, I made heavy use of the menu, but have more recently mostly used hotkeys and free standing terminals to launch programs. One of the reason of my declination of menu usage is the fact that I want different programs installed on different computers. On a work computer, I want programs to help me program. On a home computer, I will have more fun programs. On a laptop, I will likely have wireless and power management accessories. On a desktop, not so much. So how do you keep them menu in sync with programs that are actually available? One could argue that this is fluxbox's job. And maybe so. But the fact is it doesn't do this.
My first thoughts were wishing to do python in the menu. While I still would love this, I stumbled upon a way to do dynamic menus in fluxbox via an included file . I don't know why I didn't know about this before...but I didn't. And strictly speaking, this is more flexible than just having python in the menus. (I would note, in passing, that this would be even cooler if I had another of my big wishlist items: a way to mark files that, when open, would run a program and read the output of that program.)
So I set to work on how to hook this up. To review, the scope of the immediate problem is "I have a superset of programs I want to use in general. I want the fluxbox menu to be generated only with the programs I have installed on my local machine."
I decided to store my programs in an HTML file, viewable here: http://k0s.org/programs.html . A friend of mine advised me to use definition lists for menus, which worked out amazing well (with the caveat that my current parser assumes a certain format but doesn't enforce it). So the first step was translating the programs I wanted to use to http://k0s.org/programs.html .
Then I wrote the parser: http://k0s.org/hg/config/file/tip/python/html2flux.py . With lxml it was fairly easy to transform HTML to fluxbox's config. I used a program I already had to get all of the executables in the user's path: http://k0s.org/hg/config/file/tip/python/lsex.py (get your minds out of the gutter ... its ls EXecutables). Then, I point the output of the program to ~/.fluxbox/applications and include this in ~/.fluxbox/menu. You can see the change here: http://k0s.org/hg/config/rev/069a739d88ad
Since my config is a mercurial repository and I use silvermirror to sync files between my computer, including http://k0s.org/programs.html , I now have a way to have up-to-date fluxbox menus on all computers from a superset of programs! I could regenerate in a cron job, but for the time decided just to regenerate on invocation of .bashrc .
What next? I'm glad you asked! I have yet, mostly out of laziness though more because I wanted a good solution, have yet to really utilize feeds (RSS, atom). I want to set up a planet to subscribe to feeds I care about. Then, I can have a program that outputs the RSS of my planet to fluxbox menu form (presumedly on a cron job) and I can have the news literally at my fingertips. The menu item name will be the feed item title and the executable will launch the link of the feed item in firefox.
But, not today, most likely, as much as I love the idea. I think I'll set up Thunderbird before my email situation gets out of hand.
...and so, in conclusion, you can easily see why my brain would confuse the need to eat a carrot with the need to go to a different Firefox tab
great, now public radio is teaching that achievement leads to happiness. never have i heard such lies
P.S. I hate it when people use the word marketplace when they mean ecosystem; the former is a very specialized subset of the latter
idea: Firefox bookmarks as site management
Since joining Mozilla and since using the excellent weave addon I have been using and organizing bookmarks in a much more serious way than I historically have. I got to thinking, bookmarks would be a great way to manage sites. What do I mean by this? I'm not sure! But I'm convinced there's something there.
Take delicio.us, however it's spelled. Its basically a way of sharing bookmarks. I can accomplish a lot of the same thing just by exporting my bookmarks: http://k0s.org/bookmarks.html . Okay, its really primitive. I also did it 10s ago, and in the future I can modify this however I like.
Now, take something more complicated. Lets say you want to do something with all of these bookmarks, or some subsection of these. Like "subscribe to all of these RSS feeds" or "make a blog post to all of these sites", etc. I can't yet do this, but there's nothing complicated there.
Ultimately, I envision a revolutionary UI that changes the way we think about web resources. But I admit, I can only really see the next few steps. I should make a FF extension to play with this idea. Actually, first, I should see what's already out there.
unix: the NeXT generation
the capitalization of NeXT is in fact a dead herring. I find a modern linux environment, e.g. ubuntu, just a joy to work with. On the other hand, I'm a bit of a hacker so I don't mind setting up a few things to make my life much easier. I don't really think about the tools until I don't have them.
For instance, I have a function called fn that I don't know how anyone lives without:
(buildbot)> type fn
fn is a function
fn ()
{
python -c "import os; print os.path.realpath('$*')"
}
Simple, right? I use it all the time. So...why isn't it in unix?
That's an easy one. Another is pasting. If you do any programming, you're bound to use a pastebin. http://pastebin.com now has it an API that made it soooo easy to write a script to paste to it from stdin: http://k0s.org/hg/config/rev/6b8573a62cd3
So now I can paste from the command line instead of copy+pasting like a caveman! Nice. (Yes I know about pastebinit, but for some reason the ubuntu package didn't work for me). But I can do one better than that.
Since I make heavy use of fluxbox hotkeys , I can make a hotkey for taking input from the X clipboard (using xclip), piping that to my script, and putting the pasted URL back on the clipboard so I can paste it to others: http://k0s.org/hg/config/rev/10fc72a4e6ca
I've also bound smartopen to Ctrl+Alt+s to open whatever is on the clipboard. So once I paste via my hoktkey I can instantly look at my paste (if I want_) using...one more hotkey! Its got synergy coming out of its rassoodocks.
I give this simple and relatively intricate examples as, well, examples. I'm deeply interested in putting the UX in unix. I'm not talking about the BS, just adding these little helpful things that make it so nice to get things done quickly and repeatably.
a simple problem with the web
I have an email from agent A and another from agent B. I want to forward agent B's email as a reply to agent A. But gmail doesn't support this behaviour. Very few systems would. Yet this is a common problem.
Pointing to web 3.0, thread weaving will be an essential problem. I really wanted to write software to do this, and, IMHO it would have been awesome. However, I have no time at the moment so will leave the implementation to those with less on their plates. The real challenge isn't implementing a UI for this....it is implementing a UI that works across discussion types.
atheism: finally got it
For some time now, I've had serious objections to atheism along the lines that it is presumptuous. When I've tried to nail down these objections, I found it difficult to voice what exactly my opposition is. But I think I've finally figured it out. Regardless of the dictionary or philosophic definition is, most atheists I've encountered in real life mean two disparate things simultaneously by the word:
- a denial of existence of a personified supreme being with a big white beard who has a mansion somewhere in the clouds and other faith-based acceptance of definitive facts that cannot be supported by empirical evidence
- an assertion that our understanding of science and the universe is, while incomplete, is an accurate descript