Here's the scenario..
I have a web app that's used to display content dynamically. The page containing the app is static, stored in an S3 bucket.
The app doesn't have any data in it, just code and a few DOM objects. It's a liveblog reader. Think of it as a container that can be used to display lots of different stuff.
When it starts up, it loads the data from a file, displays it.
The URL parameter contains the ID of an item within the file it's displaying. It moves the cursor there. Here's an example, a post about cheese.
The user then posts the link on Facebook, the one from #4 above. The user thinks they're posting a link to their story, not to my app. They barely realize my app exists. It's all about what they've written.
When Facebook displays the post, I readers to see a description of the item that's being pointed to, what readers will see when they click the link.
So what I need to do is change the og:url, og:title, og:description, and og:image elements in the <head> when the app starts up. And (this is what doesn't work) have Facebook recognize the changes.
I want links to items to be passed around the net just like all links are. I could of course provide a programmatic way to post a link to Facebook, and that could have whatever info I want it to, but -- I love the magical scraping FB does. I just want it to get it right.
Here's a demo app that illustrates.
And a Facebook post about the feature.
And I'm accumulating notes here on my liveblog. This shit is useful!
I was just chatting with a friend, and was reminded of a value that's really important. Everyone should start every conversation with a clean slate with the other person. If you're holding a grudge of any kind, ideally, that's been aired, and heard, and dealt with. I know this is an ideal, but the closer you are to it, the more value there is in the friendship.
If you can get through years of hanging out with someone, and yet still at the beginning of every interaction you can say the slate is clean, then you really have something.
It also works for people you've never met. If you let other people's grudges interfere with your perception of someone else, then you're not going to have the best interaction possible. The more the grudges color things, the more you're interacting with the grudge, and less with the real person, who might not even have any knowledge of it!
Often, people don't bring their problems with other people to the person, they spread them around behind their back. You shouldn't let that kind of gossip interfere with your potential relationship. Again, that's an ideal to strive for. We're all human.
On the other hand it means you have to be ready to hear from someone about something they feel wronged by. And after that if they can say "it's now been dealt with" you can get back to being buddies.
The behind-your-back part of it can be really insidious. A couple of times people have asked me "Why does everyone say you're a dick." If that happens to you, please -- you do not have to respond to it. Or respond by pushing your glasses down your nose and look at the other person and say "Really?" Try an eye-roll. You are not responsible for the grudges people spread about you.
Also, many things that become grudges are really not worth worrying about at all. Remember how small we are and how short life is, and ask yourself if you can just let this one go, and not get full acceptance from the person who hurt you. Maybe this is a person who's worth it.
I tried an experiment a few years ago. Someone who had hurt my feelings came up in conversation with someone else, in public. So I said the other person was a very generous, wise and sweet person. Guess what happened. That's exactly what they turned into! I never got "closure" on the perceived offense. I'm sure had I confronted the person it would have just deepened the wound, for both of us. Instead, it was put aside, as an experiment, and something really interesting blossomed in its place. No regrets.
The point is this -- the resolution can come from you. You don't have to wait for the other person to give it to you, in order to get back on the "good friends" track. But there are other related lessons, and you always have to keep your eyes and ears open, and memory is important -- you should watch for repeat behavior. But it is possible to move on from a hurt without a confrontation. It often is the only way.
The people I admire most are the ones who I am sure have never had a grudge with me. I can think of a few such people. I never have to worry that I need to clear the air. Those people are what I think of as best friends.
PS: This idea was expressed in a more light-hearted way in a piece I wrote in 1995. Scroll down to the heading "A new form of social behavior." I attract a lot of hate, of course I know it. I can hear their voices in my head, as I write something that people will object to. I guess part of who you are is determined by what you do in response to those voices. Too often I give into them. When I was first starting out writing on the net, I wasn't so familliar with the voice, so my writing had a breezier more fun style to it. The hate grinds you down. I don't know how to avoid it. But I wish I could.
Back in the old days we'd have our snow storm, and everyone would go about their business until school was cancelled, then we'd get a holiday for sledding and shoveling, and life would be exciting and interesting for a while, then the snow would get cleared, we'd go back to school, and everyone got grouchy again, and that was that until the next time.
Nowadays the fun lasts a few minutes then the grouchy people get on TV and everyone gets all serious and grouchy, and it's like well why even bother.
var x = 12; alert (x.toLowerCase ());
Instead you have to say:
var x = 12; alert (x.toString ().toLowerCase ());
Only in very special circumstances in the code I'm working on is x a number. And when it is, converting it to lowercase, which should be a no-op, fails.
BTW, I would never advocate changing the behavior. Too deep, huge breakage potential.
Imagine if you were a popular musician in the 1960s, someone who started in the 40s or 50s. Looking forward to a decade or more of performing, then retiring. Then, British Invasion. So tell me, what do you do? Curl up in a ball and pretend it didn't happen? Or.. It's music! This is what you do. So what if I remember a time when there were no Beatles or Rolling Stones. It's music. And that's what I do. And I steal from the best. And here's some good music. So of course I want to understand it. And learn from it. And adapt. You think you can't learn from people who are younger than you? You're wrong. So of course I use Facebook. Because it's a fixture. It will heavily influence the new systems of the decades to come. And I'm making some of those. So I need to be influenced if I want to be part of the future. That's why I use it, and if you don't and you're serious about this stuff, you're wrong. (Sometimes ideas and people are wrong, as much as I don't like to judge. There are things people do that lead them away from what they want.)
I don't get it. Not joking.
Imagine you're standing outside in the cold. It's snowing. You have to get somewhere. You need a ride. Of course more people want a ride when it's cold and snowing. So you wait and wait.
That's what surge pricing is about. When there aren't enough cars to meet demand, the price goes up. Price-conscious people take public transit or a fixed-price cab. And presumably more drivers head over to where there's a greater demand, so they can get rides, and make more money. I guess if Uber really wanted to do it right, they'd let people bid on the price. So you could get a ride at the normal price. But only if someone wanted to provide a ride at that price. That would be the total VRM solution.
Surge pricing isn't a great name for what it is, a market.
A good blog exists independently of people reading it.
Even if no one read my blog, I'd still write it. Not exactly sure why. Maybe it's something like this -- I would still cook even if I was the only person eating.
I write because I am a writer. It would be the same if I was being paid for writing vs doing it for free, which is pretty much how I've always blogged. There was a brief time when pieces I wrote here were edited and published by Wired. But I still wrote the same stuff.
Some people seem to feel the need to justify blogging, blogging is still alive they say, but it's actually more than alive blogging is a cultural fixture. Thriving. Read this piece in today's NYT about two Japanese hostages in Syria. They both kept blogs, and their writing informed the reporter. This is why we don't need interviews so much these days. If you have something to say you should be blogging it. (And the hostages weren't available for interviews, in fact one is dead.)
Recently I've been writing stuff on Facebook, because the engagement level there is so high. But I've found that if you want people who don't use Facebook to read you, and there are important people who don't, you have to put it somewhere else, and for me that's here on my blog.
Amit Agarwal: "Wouldn’t it be nice if Twitter had an Export button? You search for something, maybe a trending #hashtag or your brand name, and all the matching tweets would get saved in a spreadsheet. And the archive would update itself as new matching tweets are posted on Twitter in the future. Twitter is unlikely to provide you an option to save search results directly."
The last sentence got me thinking.
What if MS-DOS hadn't allowed you to write applications for it? How long would it have lasted relative to other operating systems? Not very long, I think. It used to be that operating environments were all about the apps. I don't think things have really changed now, it just may take longer for users to realize the potential of add-ons. And Twitter is most definitely a platform, and lots of people use it.
Advertising has meant that the companies that run platforms are measured differently than earlier platform companies. Oracle, Amazon, Microsoft and Apple work differently from Twitter.
So what becomes of Twitter? Here's my opinion and it's only that. Long-term it's not viable for obvious Twitter utilities to be cut off. The opportunities will become too great, and it will eventually spawn competition. And the utilities will be exciting, as if someone all of a sudden turned on a spigot for creativity. People will say "D'oh why didn't anyone think of that before!" And the answer will be they did, but somehow they never got made.
Why should Twitter care if people use their platform as a note-taking tool? That's what would happen if utilities like Mr Agarwal's were commonplace. I would post an item to Twitter and have it flow right to my to-do list. Or I could take input from users of my product through another hashtag and have it flow right to the Issues tab on the GitHub repository for the software. These kinds of connections are incredibly valuable.
Yet there's question among developers as to whether Twitter even allows them. That's how screwed up communication is right now. If developers don't believe they'll be permitted to support Twitter as a platform by Twitter itself, what chance is there of them investing in it? Not very much.
But this problem is easily solved, if you believe. I've decided that, if we need to, we can reason with the people who run Twitter. If they don't lose from people enhancing their platform, why should they object? Maybe Twitter-as-a-platform is still viable? I chose to believe it is, in the spirit of Peter Pan, if enough people believe, it becomes real. In software that actually is the way it works!
Peter Pan: "All the world is made of faith, and trust, and pixie dust."
I loved watching the Knicks game last night. I know they only beat the lowly Orlando Magic, but they won, and it was a nice game, played with heart, by both sides. That's fundamentally what I get out of basketball. Winning is great for sure, but it really isn't why I watch. I love the SPORT.
I especially like the personal side of the sport. The Knicks weren't led out of the slump by a veteran star elite player. No! They were led by three players on ten-day contracts. The heart of it.
I also like that the Knicks management knew these three guys would make a difference. I think that must be Phil Jackson's basketball IQ at work. These are the guys we got in exchange for JR and Iman, and some technical stuff I don't fully grok.
I also think it's great that Melo played with the new crew, and was willing to pass the ball when he was double-teamed, and that Galloway hit another clutch three pointer when it mattered.
For the last couple of months the Knicks have been disintegrating, spectacularly. I kept watching, if only to see how far they could go before hitting bottom. I can't say for sure that this is real, but there are signs of life. I still have the paper bag on my head, but I can perhaps see a day when I take it off.
I wrote a piece at the very end of 2014 saying that early this year I would ship a bunch of "little focused server apps that do one thing well." I called them "snacks," because the first ones were little cool utilities you could use quickly. Not a full meal, but a nice appetizer perhaps or a dessert.
The last one, nodeStorage, I knew would be a little deep, perhaps esoteric, so I rolled them out roughly in order of immediate utility, or as Colbert might say, snackyness. Sorry.
At this point, most of them are out there, so it made sense to list them so that people could see them all in one place. It gives me something to point to when I talk about the collection of apps. So here they are:
nodeStorage -- a simple Amazon S3 storage system based on Twitter identity implemented in Node.js.
pagePark -- a folder-based HTTP server that serves static and dynamic pages.
nodeRunner -- a Node.js app that runs scripts every second, minute, hour or day, each group in its own folder. Great when used with Dropbox or equivalent.
tweetsToRss -- a Node.js app that periodically reads a Twitter account and generates a high-quality RSS feed from it. Can be configured to process multiple accounts into multiple feeds.
listicle -- the software used in the Cluetrain listicle.
macwrite -- a simple demo app for nodeStorage.
These are just the apps I've released in the last month. I was pretty busy during the previous year (2014). You can see all my open source releases on the index page on GitHub.
Had a dream last night where I was debugging some CSS in Chrome.
The computer was behaving strangely, but that's CSS.
On awakening I realized my mind played all the parts, including the computer, Chrome, and CSS.
Probably time for a vacation.
One way to deal with a sarcastic troll. Overlook that they're being sarcastic and take them at face value. Ask them to support their statement.
You think driving kills more people than guns?
Okay. Then let's license drivers. Require them to take training courses. And pass tests to prove they can use a car safely. And make places where you can't bring a car, so it's safe for people to have picnics or take a walk or ride a bike without fear of being mowed down by a car. We shouldn't allow cars on sidewalks, for example. And on ball fields and playgrounds.
You could try to prove that cars don't kill more people than guns, maybe they do maybe they don't. But activities that are dangerous even lethal must be regulated in a densely populated world. Might have made sense when people were scattered about. But we live close to each other, that means guns are often used without much thought or need.
We really need to consider, soberly and seriously, without sarcasm and ridiculous analogies, if we really get anything in return for the death and fear guns cause.
All apps need storage.
Developers have to do too much work to make something simple. If you want to make a text editor, how much work should you have to do to get something that works for users? I felt it was too much work.
I asked a few vendors to add this feature to their identity servers. I don't think they understood the problem. Probably because they had never tried to create a product from scratch, using what was available to developers working on the net. I don't know why. But I couldn't get through.
I called the demo app MacWrite because it plays the same role as MacWrite and MacPaint did in the early days of the Mac toolbox. It's a coral reef, code you can crib to create your own apps.
We provide the full source for this app so developers can get started quickly. I don't see why you should have to wade through a bunch of docs, and use trial and error to figure out how to put your app together. I'm a developer myself so I understand the need to get started quickly!
Here's the toolkit. MIT licensed.
Let's have fun!
All apps need to be able to store information on behalf of the user. We've had a couple of different approaches to work with that don't require an identity system -- cookies and local storage. These are good but the data is bound to a machine, not to a person. So if you went to a different machine, you'd have to start over.
So what then? If you use a social network's identity system, you only get to store stuff in their data structures. For example, with Facebook, which has a very simple and elegant toolkit, you can create all kinds of messages. But what if you want to store some prefs on behalf of the user? Or the source code for the content? You have to start over from zero.
Three core technologies: Node.js for the runtime, Twitter for identity, and S3 for storage.
PS: I cross-posted this on Facebook. In the comments I wrote what's sure to be the next post in this series.
Last week I wrote about my coming server product. Today we gave the software to the first round of testers, to see what they think and if it works for them. It's always good to do some reality checking.
I was just mailing with a friend and he noted that we hadn't reinvented core technology, storage and identity. This is part of my philosophy and I thought it was worth publishing the ideas on my blog.
I went with Twitter and S3 because they are debugged, run at scale, they work, now.
The big problem with software is to conserve complexity. There's only so much your brain can handle. The more you package up behind simple APIs, the higher you can build your castle. That's how we get higher level software. Unfortunately people are always coming along and wrecking the foundations!
More news sooooon.
Doc Searls has been writing and talking about VRM for many years. It's an acronym of course, for Vendor Relationship Management. It's the same thing as CRM, but viewed from the other side. We, as customers, see ourselves at the center of the universe, surrounded by a sea of vendors who have an imperfect ability to serve our wants and needs. Through VRM we hope to change them so they do our bidding better.
I have a kink in my neck. So I stretch more to try to get the pain to abate. Yesterday morning, at the start of work, I stretched more than I ever have, or perhaps the stretching was cumulative, because this time my desk chair broke. A broken desk chair for an aching back and neck is exactly what you don't want.
I am in the endgame of a product shipment, so I'd pay good money to solve this problem as quickly as possible.
I am also in the middle of Manhattan, surrounded by office buildings and office supply stores. There must be a suitable chair for sale within a couple of blocks of where I sit. In my broken chair. With money burning a hole in my pocket. With an aching neck and back.
In today's world, I am stuck with Google to try to find the product I need. Of course, it didn't work. I ended up ordering a chair from Amazon, after asking my friends on Facebook for a recommendation. That part worked. I got a bunch of advice, and decided to go with Philip Greenspun's suggestion of a Steelcase chair. $900 plus tax from Amazon, plus $35 to get it here tomorrow. Not bad. A few years ago my poor back would have been suffering for much longer. A few years from now such suffering will seem quaint.
In a post-VRM world, I would register a need.
I need an office chair.
Something my friends like.
Time is super important.
You must deliver.
Does it require assembly? Please do that for me.
I think that's about it. After registering the need, the offers would start flooding in almost immediately, assuming I'm right and there are suitable chairs nearby. Perhaps someone even has a used one so I could save a few bucks?
VRM has a funny technical-sounding name, but it is the way of the future.
I'm sure every person thinks they're at the end of evolution, that the next thing that happens, hopefully not until shortly after their death, in their sleep, of natural causes (of course) is that the world becomes uninhabitable. But I think for those of us who are alive now, it's more true than it's ever been.
My grandparents probably thought this, having lived through the Great Depression, and survived World War II, only to find that the death of the species was imminent and locked-in, any day now, because of nuclear weapons and ICBMs. The threat hasn't gone away, but somehow we have avoided disaster.
We think tech is the future. That our destiny is to learn how to transport our minds into cyber bodies, and live forever. And maybe if we knew how to sustain life here we would achieve that destiny. But everything happens in context. The context for all the great stuff we're creating with computers is that our species is not tenable. Unless there's big change, immediately, we don't survive to put our minds into cyber-bodies. We don't even survive to build huge empty apartment buildings on Central Park, or to have a winter olympics or a Superbowl, or presidential elections. We. Don't. Survive. That has to be the primary issue now, and until it's resolved.
Further, if we are going to put minds into cyber-bodies, they shouldn't be ours. Our programming has led us to where we are. Evolution, survival of the fittest, competitiveness. All this was good for the first 99 percent of human existence. But now we need a new kind of mind, one that does not view the self as all-important. It's such a foreign idea, so hard to explain in words, precisely because our minds were designed to reject the idea of personal sacrifice. Our goal, which was a good one from an evolution standpoint, was to suck up as much resources as we can, so our offspring will have a better chance when fighting with nature, and competing against the other people's offspring. This can no longer be the way we do things.
We need fewer people. We need to devise new systems for life support. New ways of thinking. In many ways we have to reverse the impulse that got us here. We have always been trying to get bigger. Now we have to learn, very quickly, how to get smaller.
Computers with human minds is just a diversion, like all of what we do with computers. We have to work on us, now, and make some big changes.
If you want to read more on this, I highly recommend this op-ed in yesterday's NYT. One of the best things I've read on climate change. The ideas aren't new, we've had plenty of time to see this coming. But it's time to stop viewing the crisis as off in the future. It's already our present.
A great site that has all kinds of About boxes for Mac apps from the 80s.
I wanted to know, where are my babies -- ThinkTank and MORE?
Well, Bill Heyman can still run them on his Mac, so he did the screen shots and posted them on Facebook.
I'm copying them here so they will be easily found in my archive too.
Also to celebrate I fixed outliners.com which had gone off the air.
Here's a tease, a roadmap, an idea of what's coming next.
The software has been running solid since the summer. I'm doing a careful code review, and lots of factoring and thinking. Getting help from people on the new server-snacks mail list.
I want to turn Twitter or something like it into a solid powerful development platform with storage. Without the limits the major vendors put on their backends.
I think there's a convergence of server features happening. Storage, identity and content management are the three big pieces. All the leading tech companies have two, none have all three.
Lately I've seen the actor Wendell Pierce in three shows: The Wire (he plays Bunk), Law and Order (a Nigerian chief) and Selma.
It would be great if they cast him as the star of something serious, like playing Martin Luther King in Selma. He'd play it totally straight, but there would be moments when the lovable, funny and righteous Bunk character surfaces. He doesn't really even have to say anything, you'd just know whatever he's thinking is funny and that would be fun all on its own. Some actors are like that.
Hopefully this will be the first of many meetups. This one is just for schmoozing and eating, no agenda, no speeches. Only for writers and developers, please no entrepreneurs, VCs or business models. Just people who create stuff for the net.
Part of the promise of doing the Cluetrain Listicle was to generalize it so that anyone could create one, even if they aren't Doc and Dave the two Cluetrain dudes. Turns out it was a very simple process to generalize it.
Here's the GitHub repository:
This is the thing on that repo, above, as something you can open in the browser.
The picture in the background is Walt Whitman, the famous American poet.
Start thetour by looking at the JSON file.
You want to learn how to code? It doesn't get much simpler than this, at least for real-world examples. Please, use my code to learn from. That's one of the reasons I put it out there. To help budding developers, of all ages, genders, races, or country of origin.
If you want to create your own listicle, and you have a way to get files onto the public web, download the repository folder to your local computer, unzip it, edit the JSON file, upload both files to a folder on the web, then open the HTML file in the browser. You should see your content instead of mine.
Iterate. Scratch your head. Try another approach, until it works. That's how programmers do.
Just post a comment here. Keep it simple. Kudos, hat tips, thanks and mazel tovs are very welcome.
Let's have fun!
PS: David Weinberger wrote this up on his blog. Thanks!
Lately I've been thinking about the idea of planting human intelligence in a computer. If you had asked me about it ten years ago I would have said it'll never happen, but now I'm not so sure.
First, some kind of thinking is already in computers, almost invisibly. Here's an example. I type a lot of text into the browser, Chrome, and it's talking back to the Google servers and is constantly evaluating what I type.
Over time it gets better at showing stuff that needs correcting. It started with spelling errors. Now it understands proper names and it can highlight some bad grammar.
Its sunny today. (Not flagged, but it should be, the correct word is a contraction, "it's" for "it is.")
Bill Gates got her hair done today. (Bill Gates is masculine, should be flagged it should be "his hair.")
I object on principal. (Flagged with a gray underline. Good!)
Marylin Monroe. (Red underline, name misspelled.)
Yesterday I eat some food. (Not flagged, but "eat" is the wrong tense.)
The dog to the moon flew. (Bad grammar, not flagged.)
So this is good. I like it when my computers make my work smarter, automatically without me having to do anything. But I'm not sure this is thinking. It's a lot like data processing, something computers have been doing since the beginning.
The tough question is can we make computers think like a human and if we can should we want to? Much of what humans act on is unconscious emotion, not thought, based on how things feel. Should we teach computers to do that? Is that what we had in mind when we talk about computers thinking?
Pop out and look at the big picture. What's been accomplished with human thought? Where did all this thinking lead us to? An over-populated unsustainable civilization. More thinking like that? I hope not!
I'd like to know what people working on machine intelligence plan to have their computers think about and if they're really trying to get them to think like humans.
Freedom-building software exists, there are developers who create it, and more who want to. But there isn't a distribution system for it. No way to spread the word when new stuff comes out. I'm not talking about developer tools, frameworks and environments. I'm talking about things users use.
I said this to Doc and Dave yesterday, but it really has to be said to everyone. It's like Peter Pan. If you believe in it, it will happen. You just have to be part of the network of users that beats the drum for good software that treats you with respect.
Look at the network Mac software has: John Gruber, Marco Arment, TidBits, and those are just the top guys. There's a whole network behind them of people who share news about cool new products. We need that for web-like software and until it happens we'll still be at the starting gate.
Here's a new bit of software for technical people who work in news organizations.
A news org has a flow in Twitter that isn't being reflected in RSS.
I think it's best to use a tool like Radio3 to flow the links to Twitter, Facebook and RSS at the same time. But most news orgs already post directly to Twitter, so if we want their news flow to be part of the open network, we're going to have to help.
Here's the new thing: tweetsToRss, an open source Node.js utility that produces good RSS from Twitter.
It's technical. To set it up you have to create an app on apps.twitter.com, and you have to have a machine somewhere you can run it on. The machine does not have to be a server. If you run it on Heroku it won't cost anything to run.
I included an example of the RSS it generates.
Twitter supported RSS a few years back, but it had to work with Google Reader, and it didn't understand the kind of communication that Twitter did. They insisted on items having both titles and descriptions, but tweets are simpler, by design. Now Google Reader is gone, and Twitter is no longer new. This problem, today, has a solution. So I solved it.
tweetsToRss is a crucial piece of code. It's possible to create an easy-to-use service building on it, but I've just provided, today, a foundation for one. The glue needed to get started. A for-pay service that required no expertise or machine to run the software, might make a good Kickstarter project. I'm thinking about it.
We've got a mail list with lots of good people. If you have a question you can post a comment here, or join us on the list.