Wow! The response has been impressive. I just posted a blog post, the first I’ve done in quite some time, and already that post is on the front page of duck1123.wordpress.com. I can’t believe. I can’t stand it. How dare that post take of the most coveted first post on that site that just so happens to be the one that takes it’s name from the online id I use. I must knock it down by publishing that one.
First I must sprinkle you with fairy dust and while you’re distracted, I go and grab a cigarette from my wife.
Ha Ha! She may only have two, but I have many. Not only that, but I found some Cherry Coke and the keyboard for my macbook.
I try to like the macbook. I will give it credit, it is not that bad, but for the past several years I have been pretty much exclusively an Ubuntu user. I like Ubuntu and I pretty much have it set up pretty well. I’ve run dual boot off and on, but recently it’s been I only rebooted on the weekends if I wanted to play sims or Toby wanted to play Portal and then I would immediately reboot back into linux because ironically I haven’t been able to get Windows 7 to share it’s NTFS drive with the mac using the windows share protocol. I have to log into linux to get that.
I’ve been becoming a big fan of XBMC lately. We don’t have a TV in our bedroom and I bring the macbook into the bedroom and hook it up to an old CRT monitor that we had extra and the iPod docking clock radio my dad bought me for christmas one year because he thought I had an iPod. I didn’t. I had a Creative Zen M:Video which I now can’t use anymore because Toby jammed the cord into it and bent the pins.
Anyway, XBMC (You know. I really wish the technology was (Pandora just asked me if I was still listening (my wife just messaged (can you tell I’m a lisp programmer) from the other room. ) I said yes) there to nest thoughts better in blog posts) No time for that tonight. I should write that in another post
I love freebase.com. It is a very aptly named site. Much like Wikipedia, where you can find yourself getting sucked from link to link, you could spend hours just clicking around. It becomes really dangerous when you consider how low the barrier to entry is to add new information. If you modify your account to keep you permanently in edit mode, then you see all these little blank spaces of where information is missing, and you just can’t help but fill it in. You don’t know what language that episode of Will and Grace that you are watching was in, well guess what? I do. Let me just click edit here, type out “English Language” pick the item off the list, enter and I’m done. Oh wait. This doesn’t list that this character was in this episode. Let me just fix that real quick, and… You can see how you can become lost.
My real focus, has of course, been in the fictional realm. I love the idea of being able to not only be able to look up any book, tv show, movie or comic book and not only see the actors and authors and artists associated with those works, but the character and places described by these works and the connections between them.
In my fleshing out of some of the fictional universes that are close to my heart, I decided that I wanted to be able to track who was killing who. I had to create two new types for the killers and the killed. Of course only fictional characters can kill other fictional characters, (act of the author notwithstanding) so the killers and the killed are co-typed as fictional characters, but the killed characters are now dead. We need a type to track that information. So the deceased character is created, i need a way to track when they died. I can’t use real time. We know that Leto Atreides died in 10,191 AG., but when in AD years was the guild formed? In junior high, I calculated the events of Dune to be somewhere around 50,000 AD using a chronology in the non-canonical Dune Encyclopedia but I don’t really trust that for serious data entry.
So the Fictional Date/Time type was created. It sliced, it dices, it holds a slot for dates occurring in the Gregorian Calendar and a matched pair of slots for both the numerical date and the fictional calendar system that date is based on. Whether you want to know when lightning struck the clock tower or when Hayden Christensen managed to get himself inserted into Luke’s post-dramatic stress-induced acid trip you’re covered.
But wait, there’s more
If you act now, I’ll throw in a link to works of fiction portrayed in at no extra cost. No longer will you have to lose sleep trying to figure out exactly when the events of Care Bears II took place. This multi-purpose co-type works well in any situation
Well I am happy to announce that I was able to convince the powers that be at Freebase of the usefulness of the bottom layer in my quest to have a definitive list of every actor to kill someone in an episode of Monk. Fictional Date/Time, Fictional Calendar System, and Calendar System Directionality (forward and reverse) have been removed from my fictionaluniverse base and into the fictional_universe commons.
The deceased fictional character has many problems still owing both to a limitation of the levels of nesting that can occur with CVTs and the fact that because of DC comics, these damn superheroes just won’t stay dead. I’ll post more on that in another post.
This wave is moderated to keep the responses down, do not be worried if your comments disappear. The result of each branch will summarized as part of the Whitepaper(IB)
Related Waves:
Interaction Flow: Wave Client Protocol Interaction flow
Google Wave Conversation Model(Copied From Whitepaper): Google Wave Conversation Model
Wave Definitions: Wave Definitions
List Of Programming Languages Put Forward For Implementation: List Of Programmers
Wave Data Model: Wave Data Model
Requirements
Functionality
Handshaking
Capabilities
MUST have
XML Schema?
Operation Schemas (adding,OTing, etc)
Recovery
Persistent Changes / Temporary Storage
Annotations (standard names as well? or just provisions)
Push-based protocol. (must not rely on polling as the only means of fetching updates)
Authentication agnostic (use OAuth in examples?)
SHOULD have
XMPP-based transport
Compatible with BOSH / HTTP transports.
Meta-Wavelets (Unread/Read Blips should be standardised)
Bandwidth Throttling (blip by blip, character by character, word by word)
[2009-10-14] * [2009-10-14] Andrew Hyatt:
This probably isn’t necessary – just enable chunked messages.
Update Incremental is what we’re now used to seeing. The rates are determined by load.
Update Commit sends changes only “when done has been pressed” (for low capability clients)
Update Never will not receive updates. The client must poll for changes manually. This is the default model for non-BOSH HTTP connections.
I’m not convinced of the need for this one yet, however.
Maybe for new message count-type things?
A conky script is a perfect example of the need to support dumb, Update Never, HTTP access. You would be able to define a view for exactly what you would like to have displayed and have those updates be retrieved as an Atom feed. There’s no need to have a full XMPP client for something like this.
Good to note for the future, if anyone asks.
MAY have
PGP signing
Support for alternate serializations. (json, yaml, etc.)
Actions
Wave
create
add wavelet
read
all history [a summary]
fetch changes (requires index number, as given by “all history”)
Wavelet
create
add participant
remove participant (no consensus on permissions, but at the present only bots can be removed)
add blip
read
Each blip has individual r/w controls with the ability to set inherit. The privledges of users in the wavelet are persisted to the blip. This would be the default for blips so that anyone with access to the wavelet, has access to the blip.
So if the client doesn’t have ACL support, and the server does, then the client might allow the user to apparently perform an operation that the server then rejects. Which implies that the server has some general mechanism for rejecting changes. (I assume that’s in the protocol somewhere, but haven’t gotten to that yet…)
Blip
create
modify
add contributor
Consider commands such as `git blame` that show who has written what lines of a program. (except that wave isn’t line based)
That would simplify the initial protocol, for what it’s worth.
Note that this implementation of client doesn’t have ‘Cancel’ button.
The only time a change might be not tracked if client modifies blip in ‘Draft’ mode, although it is not clear to me what happens when someone wants to back out of ‘Draft’ based change (in this case having ‘Cancel’ button seems necessary.
An advanced client would be able to hold off on sending out those changes and allow the user to review, modify, and delete changes from their queue before allowing the client to send them off. Discarding an edit would simply be removing all edits related to that edit from the queue.
Threading
Semi-realtime (that is, conversations that can progress quickly in realtime, pause, and then are easy to pick up as other people come online – character-by-character isn’t the only aspect of “realtime” here)
Topical split (that is, conversations are described by their purpose, not just the people)
And so on.
Personally, I consider the jury still out on whether character-by-character is a good idea for initial replies – I’d like to experiment with seeing edits happen in realtime, but replies get sent out whole. (Although this would require some kind of “Joe is writing…” protocol to indicate that a reply is pending.) Even without that aspect, there is a massive difference between the Wave concepts and what you generally see in IM…
This is one of the reasons I am pushing for using Atompub as the basis as it will allow us to use the atom threading extension to track which blip another blip is in reply to..
As for atom threading, I’m open to that (need to read into it), but note that XEP-0085 is written in terms of traditional XMPP threads; at this point, it’s not quite obvious to me how it works if you are identifying threads in other ways. May become clearer after I read into the atom stuff…
Those changes are then analyzed, sent out to your domain’s xmpp server, and then sent on to you.
While it would be possible to build the threading mechanism off of XMPP threading. I feel it would be very brittle and wouldn’t hold up to people communicating with a wave server by means other than XMPP. It’s best to make whatever we need to identify threading part of the content of the message, not part of the envelope.
I’m still wrapping my head around the atom thing, since I think of the two specs as fairly unrelated (I associate atom with RSS). So I’ll need to take a look at an example or two of how you expect to integrate the ideas. But I’m entirely content to believe that there’s a reasonable way to use them together.
Is the notion that we treat each blip like an <entry> in the atom spec? With a unique identifier under the wavelet, and use the <thr:in-reply-to> syntax to identify the relationships between blips?
Basically, I’m assuming that you’re not talking about using atom per se here, so much as lifting the relevant bits of XML syntax where it seems to be useful to us. Is that correct?
I think the relevant bits are pretty much the entire atom spec though. Entries do not need to be wrapped in a feed element and many of the standard optional fields in an Atom entry wouldn’t make much sense in a Wave context and would be simply ignored or omitted. (they should still be preserved when present to allow for further extension)
I need to re-read the atom specs, but I think it may be possible to only need to send that data if you are creating or moving relationships between blips. It would still show up for full representations of a blip at a given point in time, but again would probably only need to be sent when it changes for incremental mode.
So I’m trying to map this to blips in my mind, and it raises the question of where the atom info and the blip info live in the XMPP stanzas. Most specifically, is the atom info inside the blip XML, or parallel to it? The atom way of doing business would suggest the latter, which hadn’t been the way I’d originally assumed, but might have a lot going for it.
I picture like this: You have an XMPP stanza, inside that is an atom document that describes all of the characteristics of the blip, and inside that you have whatever xml or plain text content you still need to describe the actual content (or the changesets) of that blip.
If you’re into Java (or JVM languages) you might want to check out the Abdera library.
So I tend to expect a range of services, from geeks like us who have our own servers (I’ve got a half-dozen domains myself, so I understand where you’re coming from), to giants like Facebook, to boutique servers in the middle that are likely to provide services for distinct communities. (That middle category is, to me, one of the most exciting.)
There was a use case in the ACL thread about using wave to communicate with a group of subordinates. (in this case, teacher / students.) If the contributor list isthe list of any user that has ever attempted to make modifications to that blip, (even if that change was canceled or reverted) then that students icon would always be displayed next to the teacher’s icon, and you would never again be able to determine easily that all the content came from a single contributor.
read
delete
Events
Wave
new Wavelet
Wavelet
contributor added
contributor removed
special?
new blip
Blip
live update
commit update
header update (summary of changes, no content sent)
deleted
Extensions
Search and Index Waves
References
Wave
Expand On Federation Protocol Spec (http://www.waveprotocol.org/draft-protocol-specs/draft-protocol-spec) using a XMPP extension
Wave Data Model: Wave Data Model
Wave Definitions: Wave Definitions
Conversation Model Spec Here: http://www.waveprotocol.org/draft-protocol-specs/wave-conversation-model (Google Wave Conversation Model )
FedOne Client and Server Here: http://code.google.com/p/wave-protocol
Whitepapers (including a Google C/S Protocol): www.waveprotocol.org/whitepapers
Access Controls: http://www.waveprotocol.org/whitepapers/access-control
Wave Client Protocol Interaction flow
XMPP
Put Good XMPP Protocol Links here: Good XMPP Protocol Links
Atom
Atompub over XMPP: http://tools.ietf.org/html/draft-saintandre-atompub-notify-07
OpenSearch: http://www.opensearch.org/
Languages
Implementation Languages: Python and/or Java (put your preferences here: List Of Programming [reference implementation] Languages )
Although, there really wouldn’t need to be a difference between the live and commit update. It’s simply a normal update. The only one that would be any different is the header or summary update, as that one would only contain minimal information.
It would be best, however, for showing unread counts next to my saved searches (views).
There was some discussion in one of the other threads about using iq messages for much of this, so that would aleiviate much of this. Does anybody who understands what was discussed in the other thread better than I care to respond?
So would the Wave server show up like most transports do?
I generated a copy and could put it up somewhere, but I don’t really have a stable heb host at this point, so if someone has space to offer, I could send you the files.
When a client connects to a server, it sends it’s requested update state for each of it’s saved views or any new ad-hoc ones that it wishes to track. A view is a fully specified and parameterized saved search. When changes happen on a server, the server compares those events against the users’ views. The server will then push out updates for any changes that match a user’s views depending on the update status.
It would be perfectly reasonable to for a server to decide that it’s going to limit the number of active subscriptions a user is allowed to have at any one time.
If you can think of a better way to control what updates the user is interested in, I’m glad to hear it.
When actual waves are opened for viewing, the client sets or unsets any relevant subscriptions at the wave-only level so the server is only sending information for the conversations the user is actually interested in.
So what if a client wants to have a list of “saved searches”, like this UI does? Probably few of them will be active views at any moment, so most of them aren’t covered by what you wrote under Views above, right? Do you plan on a place to store these many inactive searches?
(Obviously this could just be saved in a per-user private wave, in the same way I talked about for read-blip metadata below.)
Ad-hoc views would be for the searches you type into the search bar. They would function exactly the same as any other view, except they are removed once the subscription is canceled.
A server can choose to proactively filter updates into inactive views if it wishes, or it can do the search only when the view is activated. (implementation detail)
I’ve got a specific agenda here: I’m expecting to extend the system with integration into social networks, which would probably means “views” that correspond to externally defined communities in those networks. So I want to make sure I understand how that would fit into the design…
The servers will have to take care, however, that if an update appears in multiple views, that only a single notification is sent.
So I’m not too worried about overcomplicating the protocol – I’m more concerned about separating concerns carefully, so that bits can be separated from each other…
Internally, these views could be considered as pubsub nodes. Every user has their own default view, (your inbox) and will be able to perform operations on their set of views. (add, remove, change update status, etc.)
That does imply that we need a convention for how to look up a well-defined “kind” of private wave, though. Would name work? I dunno. The CommYou design was leaning towards what amounted to GUID identifiers for metadata types (but open, so that anybody could add a new type), to address questions like this. I haven’t noticed anything obviously like this in here yet, although I’m still reading in.
(ETA: And I see that Daniel made the same point below – good, we all seem to be thinking in similar directions here. (As I desperately attempt to not use the word “wavelength” in conversation…))
Even if you had some sort of C/C protocol to sync read information, you would require both clients to be running and able to communicate with each other. My client at home would have no chance syncing with the client at my work. (behind a firewall and shut down for the evening.)
It seems better that metadata for a user’s read state be stored on that user’s wave server. (to reduce the calls to originating servers when checking read state) Also, this mechanism for per-user metadata could be extended to things such as bookmarking and private tagging of blips as well as private notes about a wavelet/blip
I’m just pointing out that you can decide “no” on (1) – that is, the C-S protocol can be silent on read-blip-state – but still get all the benefits as long as you get (2). The state is stored on my local wave server: but it is stored in a special wavelet, with private (=to user only) visibility. The server treats it like any other data, but the client knows to fetch that wavelet and use the data in it to mark blips as read/unread, and update it as appropriate.
If many clients all used the same format of private wavelet to hold this data, then what we get effectively is a client-client protocol. But it’s all server-mediated; the clients are never communicating directly with one another, and thin clients might hold no such state at all. Multiple clients can share the state of the metadata blip, and update it using the full OT machinery.
I’ve brought this issue up in other waves, and it didn’t generate the discussion I had hoped. How do you all feel about using Atompub and minimal Atom documents in the protocol.
(helpful tip: spewing out thoughts directly without further formatting is not a good idea, as I just did xD)
Atom takes care of many of our issues. It gives us a well thought out means of tracking modification dates, unique identifiers, threaded documents, authors, extensibility, and RESTful architecture.
// TODO: only one request history should be pending at any one time?
// We should derive a new one whenever the active one is finished,
// based on the current state of pendingDeltas.
federationProvider.requestHistory(waveletName, domain, expectedVersion, appliedAt, -1, new HistoryResponseListener() {
This is the most useful when a federated host is getting back in sync. But it has a direct corollary in client code.
It would be possible to define semantics for multiple “request history” messages to overlap, or it would be possible to re-define how history is tracked, instead of using the current version numbers. Using a great big lock to limit the number of possible history requests in flight would probably hurt scalability.
This should only be an issue for HTTP-based pull requests, and even then it’s a client issue as the server will just send whatever it’s asked for. It’s up to the client to not get confused by overlapping messages.
The remote host that hosts the wave will push updates and the requestHistory() method is the equivalent of HTTP-based pull requests. fedone not defining it doesn’t mean we can’t come up with a sensible way of behaving.
Like – if the federated host (or a client) is missing pieces of history, request them (pull). Otherwise, wait for new events (push).
It would only be challenging for a host to keep up if a new event arrived out of order and the host had already sent a pull request. Events probably will always arrive in monotonic order of version number (so, version 3, then 4, then 5…) This question is relevant for clients, too – but clients are easier to deal with, like just shutting it down and logging in again.
regardless, the drawback of using a http pull backend (non-BOSH) is that the responsibility is on the client to make sure they have an up to date view of the system.
This is only used (currently) when the remote host initially adds a participant on the local host. After that, the local host can keep track of the wave, and doesn’t need to pull again. Similarly, a client would only rarely make pull requests, and those would typically occur during the “initializing” stages.
I am not aware of anything about this in the whitepapers.
It helps, it really does… even if someone is completely wrong, sometimes interesting ideas come out of them…
Oh, and I really wish there was a way to leave a wavelet… you can join, but not remove yourself… it should also be smart enough to get rid of a wavelet that no one is attached to.
And up above, Daniel is suggesting a way of finding out the “git blame” – well, to use other words – the current participants in a wave based on actual content in blips, and the edit history.
Of the two possibilities, I think the one that lets you express your intentions is more valuable in the short term.
http://wavingtheshiny.collaborynth.com.au/books/fedone-book/federation
So if I need to fetch only the updates to a wave since I last signed in, I need only to transmit the timestamp of the most recent change that I have along with my subscription request.
Also, keep in mind that these timestamps must be the time that the originating server actually committed the change to the wave, not any notions of time that either my client, or my federated server may have.
This has been lurking at the back of my mind pretty much since I started on Wave, because it’s a conspicuous difference between Wave and my CommYou prototype. CommYou worked exactly as duck suggests: things track the last time I read this thread, and think in terms of the difference between then as now.
But it looks like Wave is actually tracking blip-by-blip. I haven’t tried the experiments to verify this yet, but it appears that it knows exactly which blips I’ve read and which ones I haven’t, even if I’m reading in an ad-hoc order. So when I come back and do “next unread”, it needs to know which ones I’ve actually read.
The protocol entirely aside, the storage implications of this are kind of terrifying: it implies a (user x blip) number of records to manage. There are some optimizations that could be performed (at the cost of code complexity), but more than anything this has given me pause about implementing a practical, fully-functional reference server.
So here’s my related question: does anybody know for sure whether this last-read state is being tracked blip-by-blip, or simply as a per-wavelet timestamp? It has dramatic implications for the UI, the protocol, and the server implementation…
Why is the storage cost for this so awful? Your usenet news reader did the same thing decades ago. Sure, it’s stored on the server instead of in each user’s client; welcome to the cloud…
Basically, the point is that, while Google can handle that level of data, I must admit that it makes me a little nervous for the open-source projects. We need to put some serious work into optimizing that table (what was called the ReadState table in CommYou), because it’s likely to swamp everything else in the system if you’re not careful.
(Granted, there are some interesting unanswered questions of usage and convention here. It’s obviously less of an issue if the average Wave has three participants. But in a lot of the usage models I’ve been looking at, 75-person Waves wouldn’t be uncommon, and that can really stack up pretty fast…)
I’m not saying it’s impossible – just that, like I say above, we have to pay extremely close attention to the optimization. Frankly, it looks like one of the harder aspects of implementing the system, so we need to go into this with our eyes open.
(Granted, a lot of this is probably not quite so awful in the Actors-oriented architecture that I have in mind for the hypothetical Scala implementation, which would manage the Wavelet as an in-memory Actor that serves as a write-through cache. But that’s easier in Scala than in many other languages, and is a fairly unusual architecture still.)
Assume:
Wavelets are big, complex and evolving. Until today, I had thought that “wavelet” == “thread”; Michael corrected this misimpression. Basically, a wavelet is a complex tree.
ReadState – the relationship between a reader and a Wavelet – is stored on the reader’s “home” server, not the authoritative server for the Wavelet.
First off, I don’t believe in the bitmap-by-blip approach, for two reasons. It’s a bit tricky to begin with, because the “canonical ordering” isn’t obvious. We’re talking about a complex tree structure that is getting in-line insertions frequently, so the order isn’t trivial.
More importantly, even if we assume that the server imposes some arbitrary canonical ordering (say, by creation time of the blip), it still doesn’t work, because blips are live objects. Just because I have read this blip now doesn’t mean that it stays read. So we have a remarkably messy problem of marking blips unread when they get edited. That’s hard enough when everything lives on the same server; it’s nightmarish in a distributed architecture. (Probably possible, but I don’t like the smell of it.)
So I think that, if we are using a packed bitmap, that implies that we are using a bitmap of the history instead – reader * wavelet * transforms. That does have a simple canonical ordering, and never reverses – once you have read a particular history state, the server will never cause that transform to become unread. (You might do so manually, but that’s not a problem.) But it implies that the space constraint is probably hundreds or thousands of bits per reader * wavelet. And the code is still pretty complex: the server probably needs to deal with a lot of calculation of what it means for the client to say which transform is affected when the client says, “I’ve read this blip”.
I also suspect it’s not the best optimization, at least from an efficiency POV. In practice, you probably get better compression by thinking in terms of the transform stamp that this reader has read through, plus an exception list. (That is, “I’ve read through frame 273, but not transforms 270 and 271.”) I’d bet that that turns out to be considerably less storage than the flat bitmap, but the code is even hairier and harder to get right.
So overall, my main takeaway is still that this is a tricky problem, and one we need to tackle relatively early in developing a serious reference server, because I’d bet that it’ll take effort to get right and will touch a bunch of problems…
However you store it, what you ultimately need is a map from blips to last-read-transform (not a bitmap over blip history, since what you read is the current state of a blip always), right? But since reading everything is a common use case, I’d guess store it as “All blips read through transformation N; also {b1->N1, b2->N2,…}”
Probably at this point we should find out what the present client actually does
Brian, where are you seeing dangers here? Are there areas in the protocol that you think might break down if a server clock is off?
I’ve been holding off on contributing further on this issue until I have time to go over the server protocol again. There are some things in that spec I still don’t fully understand, and I think they may give clues as to how we should be progressing. Even so, the C/S protocol need not bear any relation to the S/S protocol, but it pays to reuse as much of the components as possible. We should still consider that the clients will most likely not be nearly as advanced as the servers will be, and we should try to reduce the amount of complexity for the client.
It’s still unclear to me as to how exactly these hashes are produced, and if the history hash is suitable information to be transmitting to a client, or not. (as I said, I need to look over the whitepapers again.)
If we are using hashes to control synchronization, then some (but not all) of the reasons for looking at Atom go away.
So first you check if the version numbers match and only if they match you actually do the hash and see if they match, if they do you know you are up to par with the server.
This has the advantage of being independent of any time information and the versioning gives a natural ordering for the different operations while still being independent on the order they are actually being executed.
Date: 2009-10-24 15:15:56 EDT
HTML generated by org-mode 6.30c in emacs 23
It seems inevitable but whenever I test out a new blog client I have to post some stupid message that i’m doing a test.
Well here it is.
Test message from my android phone
I forgot I had this blog. I no longer have a website. I once took a small amount of pride in my website, but my heart has always belonged to Mycyclopedia.
It’s coming along well now. I want to release it, because I know I’ve come up with some cool tricks to do with compojure, but I’ll have to wipe my history first. It’s been a long road to where I’m at. I played around for a time using Jena and a real RDF parser, but I’ve found it has made my job much easier taking a simplified approach and just faking it.
One of the beauties of RDF is it allows you to say anything about anyone. I needed to take this one step further and track information about who said what, and what are the privacy levels of what they said, and when did they say it, and was them saying this prompted by another user saying something that they saw.
I realized that I could assign my own uri to the class of Entries that appear in the Subject position of any statements. I can always refer to another uri by giving it a sameAs relation, but that, like all other statements, is subject to the trustworthiness of the person that made that claim.
So if I can create my own uri’s, then I don’t have to muck about with using the full uri internally, and can refer to entries and statements by their id. When I was modeling this using a pure RDF engine, I had to store all of the metadata as my actual statements, and had to construct model views of the information using reification.
Now that I am using a simple MySQL database, everything is much simpler. The statement table is the most complicated.
I no longer feel like writing, so I will stop this now.
Put your iPod or other music player on shuffle.
For each question, press the next button to get your answer.
YOU MUST WRITE THAT SONG NAME DOWN NO MATTER HOW SILLY IT SOUNDS!
Tag your friends who might enjoy doing this.
IF SOMEONE SAYS “IS THIS OKAY” YOU SAY?
Throes of Rejection – Pantera
WHAT WOULD BEST DESCRIBE YOUR PERSONALITY?
Pushing Me Away – Linkin Park
WHAT DO YOU LIKE IN A GIRL?
Born of a Broken Man – Rage Against the Machine
WHAT IS YOUR LIFE’S PURPOSE?
Conspiracy of One – The Offspring
WHAT IS YOUR MOTTO?
Overrated (Everything Is) – Less Than Jake
WHAT DO YOUR FRIENDS THINK OF YOU?
Gasoline – Seether
WHAT DO YOU THINK ABOUT VERY OFTEN?
Heaven Sent – Hinder
WHAT IS 2+2?
A Whole New World – Brad Kane and Lea Salonga
WHAT DO YOU THINK OF YOUR BEST FRIEND?
A Condom? – Dane Cook
WHAT DO YOU THINK OF THE PERSON YOU LIKE?
The Ghosts of Me and You – Less Than Jake
WHAT IS YOUR LIFE STORY?
Symphony of Destruction – Megadeth
WHAT DO YOU WANT TO BE WHEN YOU GROW UP?
Lucas With the Lid Off – Lucas
WHAT DO YOU THINK WHEN YOU SEE THE PERSON YOU LIKE?
Capricorn – 30 Seconds to Mars
WHAT DO YOUR PARENTS THINK OF YOU?
Fell on Black Days – Soundgarden
WHAT WILL YOU DANCE TO AT YOUR WEDDING?
Second Chance – Shinedown
WHAT WILL THEY PLAY AT YOUR FUNERAL?
Cheer Up, Boys (Your Make Up is Running) – Foo Fighters
WHAT IS YOUR HOBBY/INTEREST?
Remember the Time – Michael Jackson
WHAT DO YOU THINK OF YOUR FRIENDS?
Suicide Note, Part 1 – Pantera
WHAT’S THE WORST THING THAT COULD HAPPEN?
Miracle – Foo Fighters
HOW WILL YOU DIE?
P.S. Shock the World – Less Than Jake
WHAT IS THE ONE THING YOU REGRET?
Ich Will – Rammstein
WHAT MAKES YOU LAUGH?
The Story – 30 Seconds to Mars
WHAT MAKES YOU CRY?
Vendetta – Slipknot
WILL YOU EVER GET MARRIED?
James – Blue October
WHAT SCARES YOU THE MOST?
Chemical Marriage – Mr. Bungle
DOES ANYONE LIKE YOU?
Year of tha Boomerang – Rage Against the Machine
IF YOU COULD GO BACK IN TIME, WHAT WOULD YOU CHANGE
Epic – Faith No More
WHAT HURTS RIGHT NOW?
Long Way Down – Goo Goo Dolls
WHAT WILL YOU POST THIS AS?
Heartless – Hinder

So I logged into my identi.ca account this morning only to find out that they pushed out a new version.
In addition to the snazzy new theme and interface, we also finally got groups. Groups are similar to what Jaiku had going, and what I was emulating by using the track feature.
When I first looked into it, there were only a handful of groups created. Checking back a few hours later shows that that number has exploded. Perhaps the barrier for creating a group is too low, who knows. I kinda fear that the vast majority of these groups are going to languish.
My only problem is, this has just pumped up the amount of messages i am now receiving from various micro-blogging sources. I subscribe to my identi.ca feed, my twitter feed, my friendfeed feed, and my laconi.ca track feed.
1 message from a “friend” could potentially produce up to 4 messages to be sent to me. I really wish all of the micro-blogging platforms would do a better job of linking all the copies and only sending me the first instance. (This would probably require a special XMPP client to do this)
Oh well, as long as I can continue reading all my messages in emacs, I’ll find a way to keep up.
Edit: Writing this post reminded me of jaiku, so I turned that feed back on as well.
What is the best blog hosting service that’ll let me point my domain at it for free. My domain is without a home since the place I was using freaked out on me.
For the longest time, I was using this other guy’s company. A friend of a friend who moved to New Mexico knew him. He charged me for the first 6 months, and then never hit me up for money after that. It was a pretty basic service, and since I hadn’t been paying him for a while, I felt guilty asking for anything.
For instance, it was still using PHP 4. I had been wanting to play with the PHP 5 stuff, but I didn’t want to ask him to install it. Also, the database creation messed up. Because of that, I couldn’t re-install my laconica instance on the server.
Then I started getting 500 errors one day. I just took back all my stuff, and I’ve been without a domain ever sence.