Move feedType function to FeedType.swift. Add a few more cases to FeedParserTypeTests.
This commit is contained in:
parent
3bb9887513
commit
49a5e58ff2
|
@ -8,54 +8,14 @@
|
|||
|
||||
import Foundation
|
||||
|
||||
// FeedParser handles the various syndication feed types.
|
||||
// It might be a good idea to do a plugin-style architecture here instead —
|
||||
// but feed formats don’t appear all that often, so it’s probably not necessary.
|
||||
// FeedParser handles RSS, Atom, JSON Feed, and RSS-in-JSON.
|
||||
// You don’t need to know the type of feed.
|
||||
|
||||
public struct FeedParser {
|
||||
|
||||
static let minNumberOfBytesRequired = 128
|
||||
public static func parse(_ parserData: ParserData) throws -> ParsedFeed? {
|
||||
|
||||
public static func feedType(_ parserData: ParserData) -> FeedType {
|
||||
|
||||
// Can call with partial data — while still downloading, for instance.
|
||||
// If there’s not enough data, return .unknown. Ask again when there’s more data.
|
||||
// If it’s definitely not a feed, return .notAFeed.
|
||||
//
|
||||
// This should be fast enough to call on the main thread.
|
||||
|
||||
if parserData.data.count < minNumberOfBytesRequired {
|
||||
return .unknown
|
||||
}
|
||||
|
||||
let nsdata = parserData.data as NSData
|
||||
if nsdata.isProbablyJSONFeed() {
|
||||
return .jsonFeed
|
||||
}
|
||||
if nsdata.isProbablyRSSInJSON() {
|
||||
return .rssInJSON
|
||||
}
|
||||
|
||||
if nsdata.isProbablyHTML() {
|
||||
return .notAFeed
|
||||
}
|
||||
|
||||
if nsdata.isProbablyRSS() {
|
||||
return .rss
|
||||
}
|
||||
if nsdata.isProbablyAtom() {
|
||||
return .atom
|
||||
}
|
||||
|
||||
return .notAFeed
|
||||
}
|
||||
|
||||
public static func parseFeed(_ parserData: ParserData) throws -> ParsedFeed? {
|
||||
|
||||
// All the concrete parsers return a ParsedFeed struct.
|
||||
// Related: ParsedItem, ParsedAuthor, ParsedHub, ParsedAttachment.
|
||||
//
|
||||
// This is probably fast enough to call on the main thread —
|
||||
// This is generally fast enough to call on the main thread —
|
||||
// but it’s probably a good idea to use a background queue if
|
||||
// you might be doing a lot of parsing. (Such as in a feed reader.)
|
||||
|
||||
|
|
|
@ -16,3 +16,40 @@ public enum FeedType {
|
|||
case unknown
|
||||
case notAFeed
|
||||
}
|
||||
|
||||
|
||||
private let minNumberOfBytesRequired = 128
|
||||
|
||||
public func feedType(_ parserData: ParserData) -> FeedType {
|
||||
|
||||
// Can call with partial data — while still downloading, for instance.
|
||||
// If there’s not enough data, return .unknown. Ask again when there’s more data.
|
||||
// If it’s definitely not a feed, return .notAFeed.
|
||||
//
|
||||
// This is fast enough to call on the main thread.
|
||||
|
||||
if parserData.data.count < minNumberOfBytesRequired {
|
||||
return .unknown
|
||||
}
|
||||
|
||||
let nsdata = parserData.data as NSData
|
||||
if nsdata.isProbablyJSONFeed() {
|
||||
return .jsonFeed
|
||||
}
|
||||
if nsdata.isProbablyRSSInJSON() {
|
||||
return .rssInJSON
|
||||
}
|
||||
|
||||
if nsdata.isProbablyHTML() {
|
||||
return .notAFeed
|
||||
}
|
||||
|
||||
if nsdata.isProbablyRSS() {
|
||||
return .rss
|
||||
}
|
||||
if nsdata.isProbablyAtom() {
|
||||
return .atom
|
||||
}
|
||||
|
||||
return .notAFeed
|
||||
}
|
||||
|
|
|
@ -65,3 +65,11 @@ Normally I avoid this kind of thing *strenuously*. I prefer to work at the highe
|
|||
But my more-than-a-decade of experience parsing XML has led me to this solution, which — last time I checked, which was, admittedly, a few years ago — was not only fastest but also uses the least memory. (The two things are related, of course: creating objects is bad for performance, so this code attempts to do the minimum possible.)
|
||||
|
||||
All that low-level stuff is encapsulated, however. If you just want to parse one of the popular feed formats, see `FeedParser`, which makes it easy and Swift-y.
|
||||
|
||||
## Thread safety
|
||||
|
||||
Everything here is thread-safe.
|
||||
|
||||
Everything’s pretty fast, too, so you probably could just use the main thread/queue. But it’s totally a-okay to use a non-serial background queue.
|
||||
|
||||
|
||||
|
|
|
@ -71,6 +71,8 @@
|
|||
849A03E21F00902C00122600 /* RSDateParserTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 849A03E11F00902C00122600 /* RSDateParserTests.m */; };
|
||||
849A03E41F00912100122600 /* HTMLMetadataTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849A03E31F00912100122600 /* HTMLMetadataTests.swift */; };
|
||||
849A03E61F00952400122600 /* HTMLLinkTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849A03E51F00952400122600 /* HTMLLinkTests.swift */; };
|
||||
849A03E81F01F88600122600 /* ScriptingNews.json in Resources */ = {isa = PBXBuildFile; fileRef = 849A03E71F01F88600122600 /* ScriptingNews.json */; };
|
||||
849A03EA1F01F92B00122600 /* inessential.json in Resources */ = {isa = PBXBuildFile; fileRef = 849A03E91F01F92B00122600 /* inessential.json */; };
|
||||
84D81BDC1EFA28E700652332 /* RSParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D81BDA1EFA28E700652332 /* RSParser.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
84D81BDE1EFA2B7D00652332 /* ParsedFeed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84D81BDD1EFA2B7D00652332 /* ParsedFeed.swift */; };
|
||||
84D81BE01EFA2BAE00652332 /* FeedType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84D81BDF1EFA2BAE00652332 /* FeedType.swift */; };
|
||||
|
@ -157,6 +159,8 @@
|
|||
849A03E11F00902C00122600 /* RSDateParserTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RSDateParserTests.m; sourceTree = "<group>"; };
|
||||
849A03E31F00912100122600 /* HTMLMetadataTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HTMLMetadataTests.swift; sourceTree = "<group>"; };
|
||||
849A03E51F00952400122600 /* HTMLLinkTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HTMLLinkTests.swift; sourceTree = "<group>"; };
|
||||
849A03E71F01F88600122600 /* ScriptingNews.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = ScriptingNews.json; sourceTree = "<group>"; };
|
||||
849A03E91F01F92B00122600 /* inessential.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = inessential.json; sourceTree = "<group>"; };
|
||||
84D81BD91EFA28E700652332 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
84D81BDA1EFA28E700652332 /* RSParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RSParser.h; sourceTree = "<group>"; };
|
||||
84D81BDD1EFA2B7D00652332 /* ParsedFeed.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ParsedFeed.swift; path = Feeds/ParsedFeed.swift; sourceTree = "<group>"; };
|
||||
|
@ -317,9 +321,11 @@
|
|||
849A03C71F0081EA00122600 /* EMarley.rss */,
|
||||
849A03C81F0081EA00122600 /* furbo.html */,
|
||||
849A03C91F0081EA00122600 /* inessential.html */,
|
||||
849A03E91F01F92B00122600 /* inessential.json */,
|
||||
849A03CA1F0081EA00122600 /* KatieFloyd.rss */,
|
||||
849A03CB1F0081EA00122600 /* manton.rss */,
|
||||
849A03CC1F0081EA00122600 /* OneFootTsunami.atom */,
|
||||
849A03E71F01F88600122600 /* ScriptingNews.json */,
|
||||
849A03CD1F0081EA00122600 /* scriptingNews.rss */,
|
||||
849A03CE1F0081EA00122600 /* sixcolors.html */,
|
||||
849A03CF1F0081EA00122600 /* Subs.opml */,
|
||||
|
@ -495,9 +501,11 @@
|
|||
849A03D61F0081EA00122600 /* manton.rss in Resources */,
|
||||
849A03D11F0081EA00122600 /* DaringFireball.rss in Resources */,
|
||||
849A03D01F0081EA00122600 /* DaringFireball.html in Resources */,
|
||||
849A03EA1F01F92B00122600 /* inessential.json in Resources */,
|
||||
849A03D71F0081EA00122600 /* OneFootTsunami.atom in Resources */,
|
||||
849A03D41F0081EA00122600 /* inessential.html in Resources */,
|
||||
849A03D31F0081EA00122600 /* furbo.html in Resources */,
|
||||
849A03E81F01F88600122600 /* ScriptingNews.json in Resources */,
|
||||
849A03D91F0081EA00122600 /* sixcolors.html in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
|
|
|
@ -16,28 +16,28 @@ class FeedParserTypeTests: XCTestCase {
|
|||
func testDaringFireballHTMLType() {
|
||||
|
||||
let d = parserData("DaringFireball", "html", "http://daringfireball.net/")
|
||||
let type = FeedParser.feedType(d)
|
||||
let type = feedType(d)
|
||||
XCTAssertTrue(type == .notAFeed)
|
||||
}
|
||||
|
||||
func testFurboHTMLType() {
|
||||
|
||||
let d = parserData("furbo", "html", "http://furbo.org/")
|
||||
let type = FeedParser.feedType(d)
|
||||
let type = feedType(d)
|
||||
XCTAssertTrue(type == .notAFeed)
|
||||
}
|
||||
|
||||
func testInessentialHTMLType() {
|
||||
|
||||
let d = parserData("inessential", "html", "http://inessential.com/")
|
||||
let type = FeedParser.feedType(d)
|
||||
let type = feedType(d)
|
||||
XCTAssertTrue(type == .notAFeed)
|
||||
}
|
||||
|
||||
func testSixColorsHTMLType() {
|
||||
|
||||
let d = parserData("sixcolors", "html", "https://sixcolors.com/")
|
||||
let type = FeedParser.feedType(d)
|
||||
let type = feedType(d)
|
||||
XCTAssertTrue(type == .notAFeed)
|
||||
}
|
||||
|
||||
|
@ -46,28 +46,28 @@ class FeedParserTypeTests: XCTestCase {
|
|||
func testEMarleyRSSType() {
|
||||
|
||||
let d = parserData("EMarley", "rss", "https://medium.com/@emarley")
|
||||
let type = FeedParser.feedType(d)
|
||||
let type = feedType(d)
|
||||
XCTAssertTrue(type == .rss)
|
||||
}
|
||||
|
||||
func testScriptingNewsRSSType() {
|
||||
|
||||
let d = parserData("scriptingNews", "rss", "http://scripting.com/")
|
||||
let type = FeedParser.feedType(d)
|
||||
let type = feedType(d)
|
||||
XCTAssertTrue(type == .rss)
|
||||
}
|
||||
|
||||
func testKatieFloydRSSType() {
|
||||
|
||||
let d = parserData("KatieFloyd", "rss", "https://katiefloyd.com/")
|
||||
let type = FeedParser.feedType(d)
|
||||
let type = feedType(d)
|
||||
XCTAssertTrue(type == .rss)
|
||||
}
|
||||
|
||||
func testMantonRSSType() {
|
||||
|
||||
let d = parserData("manton", "rss", "http://manton.org/")
|
||||
let type = FeedParser.feedType(d)
|
||||
let type = feedType(d)
|
||||
XCTAssertTrue(type == .rss)
|
||||
}
|
||||
|
||||
|
@ -77,28 +77,77 @@ class FeedParserTypeTests: XCTestCase {
|
|||
|
||||
// File extension is .rss, but it’s really an Atom feed.
|
||||
let d = parserData("DaringFireball", "rss", "http://daringfireball.net/")
|
||||
let type = FeedParser.feedType(d)
|
||||
let type = feedType(d)
|
||||
XCTAssertTrue(type == .atom)
|
||||
}
|
||||
|
||||
func testOneFootTsunamiAtomType() {
|
||||
|
||||
let d = parserData("OneFootTsunami", "atom", "http://onefoottsunami.com/")
|
||||
let type = FeedParser.feedType(d)
|
||||
let type = feedType(d)
|
||||
XCTAssertTrue(type == .atom)
|
||||
}
|
||||
|
||||
// MARK: RSS-in-JSON
|
||||
|
||||
func testScriptingNewsJSONType() {
|
||||
|
||||
let d = parserData("ScriptingNews", "json", "http://scripting.com/")
|
||||
let type = feedType(d)
|
||||
XCTAssertTrue(type == .rssInJSON)
|
||||
}
|
||||
|
||||
// MARK: JSON Feed
|
||||
|
||||
func testInessentialJSONFeedType() {
|
||||
|
||||
let d = parserData("inessential", "json", "http://inessential.com/")
|
||||
let type = feedType(d)
|
||||
XCTAssertTrue(type == .jsonFeed)
|
||||
}
|
||||
|
||||
// MARK: Performance
|
||||
|
||||
func testFeedTypePerformance() {
|
||||
|
||||
// I get 0.000079 on my 2012 iMac. feedType is fast, at least in this case.
|
||||
// 0.000 on my 2012 iMac.
|
||||
|
||||
let d = parserData("EMarley", "rss", "https://medium.com/@emarley")
|
||||
self.measure {
|
||||
let _ = FeedParser.feedType(d)
|
||||
let _ = feedType(d)
|
||||
}
|
||||
}
|
||||
|
||||
func testFeedTypePerformance2() {
|
||||
|
||||
// 0.000 on my 2012 iMac.
|
||||
|
||||
let d = parserData("inessential", "json", "http://inessential.com/")
|
||||
self.measure {
|
||||
let _ = feedType(d)
|
||||
}
|
||||
}
|
||||
|
||||
func testFeedTypePerformance3() {
|
||||
|
||||
// 0.000 on my 2012 iMac.
|
||||
|
||||
let d = parserData("DaringFireball", "html", "http://daringfireball.net/")
|
||||
self.measure {
|
||||
let _ = feedType(d)
|
||||
}
|
||||
}
|
||||
|
||||
func testFeedTypePerformance4() {
|
||||
|
||||
// 0.001 on my 2012 iMac.
|
||||
|
||||
let d = parserData("DaringFireball", "rss", "http://daringfireball.net/")
|
||||
self.measure {
|
||||
let _ = feedType(d)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func parserData(_ filename: String, _ fileExtension: String, _ url: String) -> ParserData {
|
||||
|
|
|
@ -0,0 +1,945 @@
|
|||
{
|
||||
"rss": {
|
||||
"version": "2.0",
|
||||
"xmlns:source": "http://source.scripting.com/",
|
||||
"channel": {
|
||||
"title": "Scripting News",
|
||||
"link": "http://scripting.com/",
|
||||
"description": "Scripting News, the weblog started in 1997 that bootstrapped the blogging revolution.",
|
||||
"pubDate": "Mon, 26 Jun 2017 19:40:58 GMT",
|
||||
"lastBuildDate": "Mon, 26 Jun 2017 19:41:48 GMT",
|
||||
"language": "en-us",
|
||||
"copyright": "© 1994-2017 <a href=\"http://davewiner.com/\">Dave Winer</a>.",
|
||||
"generator": "oldSchool v0.42c",
|
||||
"docs": "https://github.com/scripting/Scripting-News/blob/master/rss-in-json/README.md",
|
||||
"source:localTime": "Mon, June 26, 2017 3:41 PM EDT",
|
||||
"cloud": {
|
||||
"domain": "rpc.rsscloud.io",
|
||||
"port": 5337,
|
||||
"path": "/pleaseNotify",
|
||||
"registerProcedure": "",
|
||||
"protocol": "http-post"
|
||||
},
|
||||
"source:account": [
|
||||
{
|
||||
"service": "twitter",
|
||||
"#value": "davewiner"
|
||||
},
|
||||
{
|
||||
"service": "facebook",
|
||||
"#value": "dave.winer.12"
|
||||
},
|
||||
{
|
||||
"service": "github",
|
||||
"#value": "scripting"
|
||||
},
|
||||
{
|
||||
"service": "linkedin",
|
||||
"#value": "scripting"
|
||||
}
|
||||
],
|
||||
"item": [
|
||||
{
|
||||
"link": "http://scripting.com/2017/06/26.html#a080605",
|
||||
"description": "Good morning students and teachers! 🍏 ",
|
||||
"pubDate": "Mon, 26 Jun 2017 12:20:05 GMT",
|
||||
"guid": "http://scripting.com/2017/06/26.html#a080605",
|
||||
"source:outline": {
|
||||
"text": "Good morning students and teachers! :green_apple: ",
|
||||
"created": "Mon, 26 Jun 2017 12:20:05 GMT",
|
||||
"type": "outline",
|
||||
"permalink": "http://scripting.com/2017/06/26.html#a080605"
|
||||
}
|
||||
},
|
||||
{
|
||||
"link": "http://scripting.com/2017/06/26.html#a030658",
|
||||
"description": "This is the <a href=\"https://twitter.com/kennethn/status/879367091953868801\">human side</a> of <a href=\"http://scripting.com/2017/03/08/theWorldIsSocialistPartIi.html\">Health care is socialist</a>. ",
|
||||
"pubDate": "Mon, 26 Jun 2017 19:40:58 GMT",
|
||||
"guid": "http://scripting.com/2017/06/26.html#a030658",
|
||||
"source:outline": {
|
||||
"text": "This is the <a href=\"https://twitter.com/kennethn/status/879367091953868801\">human side</a> of <a href=\"http://scripting.com/2017/03/08/theWorldIsSocialistPartIi.html\">Health care is socialist</a>. ",
|
||||
"created": "Mon, 26 Jun 2017 19:40:58 GMT",
|
||||
"type": "outline",
|
||||
"permalink": "http://scripting.com/2017/06/26.html#a030658"
|
||||
}
|
||||
},
|
||||
{
|
||||
"link": "http://scripting.com/2017/06/26.html#a020604",
|
||||
"description": "Interesting Politico <a href=\"http://www.politico.com/magazine/story/2017/06/26/trump-president-style-mayor-215294\">piece</a> posits that Trump acts as if he's mayor of the United States. If <a href=\"https://en.wikipedia.org/wiki/Mayor_of_New_York_City\">NYC</a> is his model, that mayor is esp powerless, because the governor of the state also has a lot of power over the city. It's approx 1/2 of the population of the state, and probably much more than 1/2 of the money. For example, the <a href=\"https://en.wikipedia.org/wiki/Metropolitan_Transportation_Authority\">MTA</a>, which runs the buses and subway, is run by the state, not the city.",
|
||||
"pubDate": "Mon, 26 Jun 2017 18:10:04 GMT",
|
||||
"guid": "http://scripting.com/2017/06/26.html#a020604",
|
||||
"source:outline": {
|
||||
"text": "Interesting Politico <a href=\"http://www.politico.com/magazine/story/2017/06/26/trump-president-style-mayor-215294\">piece</a> posits that Trump acts as if he's mayor of the United States. If <a href=\"https://en.wikipedia.org/wiki/Mayor_of_New_York_City\">NYC</a> is his model, that mayor is esp powerless, because the governor of the state also has a lot of power over the city. It's approx 1/2 of the population of the state, and probably much more than 1/2 of the money. For example, the <a href=\"https://en.wikipedia.org/wiki/Metropolitan_Transportation_Authority\">MTA</a>, which runs the buses and subway, is run by the state, not the city.",
|
||||
"created": "Mon, 26 Jun 2017 18:10:04 GMT",
|
||||
"type": "outline",
|
||||
"image": "http://scripting.com/images/2017/06/26/quimby.png",
|
||||
"permalink": "http://scripting.com/2017/06/26.html#a020604"
|
||||
}
|
||||
},
|
||||
{
|
||||
"link": "http://scripting.com/2017/06/26.html#a020602",
|
||||
"description": "<a href=\"https://github.com/scripting/Scripting-News/issues/12\">Brent asks</a> if the <i>length</i> in enclosures in <a href=\"https://github.com/scripting/Scripting-News/blob/master/rss-in-json/README.md\">RSS-in-JSON</a> is a number or string. That's what the test podcast <a href=\"http://scripting.com/2017/06/26.html#a010633\">below</a> is for. ",
|
||||
"pubDate": "Mon, 26 Jun 2017 18:05:02 GMT",
|
||||
"guid": "http://scripting.com/2017/06/26.html#a020602",
|
||||
"source:outline": {
|
||||
"text": "<a href=\"https://github.com/scripting/Scripting-News/issues/12\">Brent asks</a> if the <i>length</i> in enclosures in \"RSS-in-JSON\" is a number or string. That's what the test podcast <a href=\"http://scripting.com/2017/06/26.html#a010633\">below</a> is for. ",
|
||||
"created": "Mon, 26 Jun 2017 18:05:02 GMT",
|
||||
"type": "outline",
|
||||
"permalink": "http://scripting.com/2017/06/26.html#a020602"
|
||||
}
|
||||
},
|
||||
{
|
||||
"link": "http://scripting.com/2017/06/26.html#a010633",
|
||||
"description": "From time to time I have to do a podcast to test things out. This is one of those times. Let's see what happens. ",
|
||||
"pubDate": "Mon, 26 Jun 2017 17:29:33 GMT",
|
||||
"guid": "http://scripting.com/2017/06/26.html#a010633",
|
||||
"enclosure": {
|
||||
"url": "http://scripting.com/2017/06/26/yetAnotherTestPodcast.m4a",
|
||||
"type": "audio/mpeg",
|
||||
"length": 277413
|
||||
},
|
||||
"source:outline": {
|
||||
"text": "From time to time I have to do a podcast to test things out. This is one of those times. Let's see what happens. ",
|
||||
"created": "Mon, 26 Jun 2017 17:29:33 GMT",
|
||||
"type": "outline",
|
||||
"enclosure": "http://scripting.com/2017/06/26/yetAnotherTestPodcast.m4a",
|
||||
"enclosureType": "audio/mpeg",
|
||||
"enclosureLength": "277413",
|
||||
"permalink": "http://scripting.com/2017/06/26.html#a010633"
|
||||
}
|
||||
},
|
||||
{
|
||||
"link": "http://scripting.com/2017/06/26.html#a110603",
|
||||
"description": "Body shaming is wrong no matter who you're using as the example. Someone is being hurt by <a href=\"https://twitter.com/xeni/status/879354857374732288\">this</a>. No, I don't care how much you have suffered.",
|
||||
"pubDate": "Mon, 26 Jun 2017 15:26:03 GMT",
|
||||
"guid": "http://scripting.com/2017/06/26.html#a110603",
|
||||
"source:outline": {
|
||||
"text": "Body shaming is wrong no matter who you're using as the example. Someone is being hurt by <a href=\"https://twitter.com/xeni/status/879354857374732288\">this</a>. No, I don't care how much you have suffered.",
|
||||
"created": "Mon, 26 Jun 2017 15:26:03 GMT",
|
||||
"type": "outline",
|
||||
"permalink": "http://scripting.com/2017/06/26.html#a110603"
|
||||
}
|
||||
},
|
||||
{
|
||||
"link": "http://scripting.com/2017/06/26.html#a090616",
|
||||
"description": "I need <a href=\"https://github.com/scripting/xmlViewer/blob/master/xmlviewer.js\">an app</a> to <a href=\"http://xmlviewer.scripting.com/?url=http://scripting.com/rss.xml\">view</a> RSS feeds in the browser because Chrome and Safari refuse to let me do that. I'd love to hear the reason why. ",
|
||||
"pubDate": "Mon, 26 Jun 2017 13:24:16 GMT",
|
||||
"guid": "http://scripting.com/2017/06/26.html#a090616",
|
||||
"source:outline": {
|
||||
"text": "I need <a href=\"https://github.com/scripting/xmlViewer/blob/master/xmlviewer.js\">an app</a> to <a href=\"http://xmlviewer.scripting.com/?url=http://scripting.com/rss.xml\">view</a> RSS feeds in the browser because Chrome and Safari refuse to let me do that. I'd love to hear the reason why. ",
|
||||
"created": "Mon, 26 Jun 2017 13:24:16 GMT",
|
||||
"type": "outline",
|
||||
"permalink": "http://scripting.com/2017/06/26.html#a090616"
|
||||
}
|
||||
},
|
||||
{
|
||||
"title": "Subscribable feed lists give power to users",
|
||||
"link": "http://scripting.com/2017/06/26.html#a080636",
|
||||
"description": "<p>An interesting <a href=\"https://github.com/kylewm/woodwind/issues/7#issuecomment-311000922\">comment</a> from <a href=\"https://github.com/chrisaldrich\">Chris Aldrich</a> about subscribing to lists of feeds in a thread on the <a href=\"https://github.com/kylewm/woodwind\">Woodwind</a> app site on GitHub. </p>\n<p>Here's the basic idea. There's a difference between importing OPML into a reader and subscribing to it. The latter is very powerful, for the user, but a lot of RSS reader devs may not want their users to have that much power. It's not a very hard feature to implement. </p>\n<p>The idea has been <a href=\"https://duckduckgo.com/?q=site%3Ascripting.com+%22reading+list%22&t=hz&ia=web\">much-discussed</a> here. We call them reading lists. Michael Arrington even wrote a <a href=\"https://techcrunch.com/2005/10/16/my-thoughts-on-reading-lists/\">TechCrunch piece</a> about it in 2005. </p>\n<p>Subscribable OPML is something all my readers have been able to do through an OPML feature called <a href=\"http://dev.opml.org/spec2.html#inclusion\">inclusion</a>. I wrote a <a href=\"https://github.com/scripting/river5/blob/master/docs/DROPBOXSUBSCRIPTIONLISTS.md\">howto</a> for a <a href=\"https://github.com/scripting/river5\">River5</a> user re inclusion just last week.</p>\n<p><a href=\"https://techcrunch.com/2006/05/07/share-your-opml/\">Share Your OPML</a> was a service I operated for a while. It made it possible to manage your OPML separate from the reader you used. It was meant to encourage readers to support subscribable OPML. I'm looking for an excuse to bring it back, but first we need a base of shared feed lists. </p>\n<p>A lot of good stuff can be done if feed readers are willing to delegate list management to other services. IMHO the only reason a reader developer <i>wouldn't</i> do it is because they want to lock users in. If I let you edit your feed list elsewhere that means you could give the list to another vendor and have a choice which to use. It's really something users should demand, esp if you're paying for the service. </p>\n",
|
||||
"pubDate": "Mon, 26 Jun 2017 12:24:36 GMT",
|
||||
"guid": "http://scripting.com/2017/06/26.html#a080636",
|
||||
"source:outline": {
|
||||
"text": "Subscribable feed lists give power to users",
|
||||
"created": "Mon, 26 Jun 2017 12:24:36 GMT",
|
||||
"type": "outline",
|
||||
"subs": [
|
||||
{
|
||||
"text": "An interesting <a href=\"https://github.com/kylewm/woodwind/issues/7#issuecomment-311000922\">comment</a> from <a href=\"https://github.com/chrisaldrich\">Chris Aldrich</a> about subscribing to lists of feeds in a thread on the <a href=\"https://github.com/kylewm/woodwind\">Woodwind</a> app site on GitHub. ",
|
||||
"created": "Mon, 26 Jun 2017 12:24:49 GMT",
|
||||
"image": "http://static.scripting.com/larryKing/images/2014/05/25/goodHumor.gif",
|
||||
"permalink": "http://scripting.com/2017/06/26.html#a080649"
|
||||
},
|
||||
{
|
||||
"text": "Here's the basic idea. There's a difference between importing OPML into a reader and subscribing to it. The latter is very powerful, for the user, but a lot of RSS reader devs may not want their users to have that much power. It's not a very hard feature to implement. ",
|
||||
"created": "Mon, 26 Jun 2017 12:40:32 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/26.html#a080632"
|
||||
},
|
||||
{
|
||||
"text": "The idea has been <a href=\"https://duckduckgo.com/?q=site%3Ascripting.com+%22reading+list%22&t=hz&ia=web\">much-discussed</a> here. We call them reading lists. Michael Arrington even wrote a <a href=\"https://techcrunch.com/2005/10/16/my-thoughts-on-reading-lists/\">TechCrunch piece</a> about it in 2005. ",
|
||||
"created": "Mon, 26 Jun 2017 12:26:01 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/26.html#a080601"
|
||||
},
|
||||
{
|
||||
"text": "Subscribable OPML is something all my readers have been able to do through an OPML feature called <a href=\"http://dev.opml.org/spec2.html#inclusion\">inclusion</a>. I wrote a <a href=\"https://github.com/scripting/river5/blob/master/docs/DROPBOXSUBSCRIPTIONLISTS.md\">howto</a> for a \"River5\" user re inclusion just last week.",
|
||||
"created": "Mon, 26 Jun 2017 12:27:15 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/26.html#a080615"
|
||||
},
|
||||
{
|
||||
"text": "<a href=\"https://techcrunch.com/2006/05/07/share-your-opml/\">Share Your OPML</a> was a service I operated for a while. It made it possible to manage your OPML separate from the reader you used. It was meant to encourage readers to support subscribable OPML. I'm looking for an excuse to bring it back, but first we need a base of shared feed lists. ",
|
||||
"created": "Mon, 26 Jun 2017 12:33:10 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/26.html#a080610"
|
||||
},
|
||||
{
|
||||
"text": "A lot of good stuff can be done if feed readers are willing to delegate list management to other services. IMHO the only reason a reader developer <i>wouldn't</i> do it is because they want to lock users in. If I let you edit your feed list elsewhere that means you could give the list to another vendor and have a choice which to use. It's really something users should demand, esp if you're paying for the service. ",
|
||||
"created": "Mon, 26 Jun 2017 12:47:13 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/26.html#a080613"
|
||||
}
|
||||
],
|
||||
"permalink": "http://scripting.com/2017/06/26.html#a080636"
|
||||
}
|
||||
},
|
||||
{
|
||||
"link": "http://scripting.com/2017/06/25.html#a080631",
|
||||
"description": "Good morning Internet guzzlers! 🍺",
|
||||
"pubDate": "Sun, 25 Jun 2017 12:27:31 GMT",
|
||||
"guid": "http://scripting.com/2017/06/25.html#a080631",
|
||||
"source:outline": {
|
||||
"text": "Good morning Internet guzzlers! :beer:",
|
||||
"created": "Sun, 25 Jun 2017 12:27:31 GMT",
|
||||
"type": "outline",
|
||||
"permalink": "http://scripting.com/2017/06/25.html#a080631"
|
||||
}
|
||||
},
|
||||
{
|
||||
"link": "http://scripting.com/2017/06/25.html#a080606",
|
||||
"description": "So glad I stopped worrying <a href=\"https://duckduckgo.com/?q=site%3Ascripting.com+facebook&t=hz&ia=web\">about</a> Facebook and am now blogging <i>Old School</i> style on <a href=\"http://scripting.com/\">scripting.com</a>. I've found my <a href=\"https://en.wikipedia.org/wiki/Sea_legs\">sea legs</a> once again. ",
|
||||
"pubDate": "Sun, 25 Jun 2017 12:43:06 GMT",
|
||||
"guid": "http://scripting.com/2017/06/25.html#a080606",
|
||||
"source:outline": {
|
||||
"text": "So glad I stopped worrying <a href=\"https://duckduckgo.com/?q=site%3Ascripting.com+facebook&t=hz&ia=web\">about</a> Facebook and am now blogging <i>Old School</i> style on <a href=\"http://scripting.com/\">scripting.com</a>. I've found my <a href=\"https://en.wikipedia.org/wiki/Sea_legs\">sea legs</a> once again. ",
|
||||
"created": "Sun, 25 Jun 2017 12:43:06 GMT",
|
||||
"type": "tweet",
|
||||
"tweetId": "878956761302147072",
|
||||
"tweetUserName": "davewiner",
|
||||
"permalink": "http://scripting.com/2017/06/25.html#a080606"
|
||||
}
|
||||
},
|
||||
{
|
||||
"link": "http://scripting.com/2017/06/25.html#a080623",
|
||||
"description": "Dan Shafer <a href=\"https://www.facebook.com/vicky.elder.77/posts/10211645108716478?pnref=story\">died</a>. I knew Dan from the Mac developer community in the 80s, hired <a href=\"https://en.wikipedia.org/wiki/Dan_Shafer\">him</a> to write the first docs for <a href=\"http://en.wikipedia.org/wiki/UserLand_Software\">Frontier</a>. Bon voyage mi amigo! 💥",
|
||||
"pubDate": "Sun, 25 Jun 2017 12:56:23 GMT",
|
||||
"guid": "http://scripting.com/2017/06/25.html#a080623",
|
||||
"source:outline": {
|
||||
"text": "Dan Shafer <a href=\"https://www.facebook.com/vicky.elder.77/posts/10211645108716478?pnref=story\">died</a>. I knew Dan from the Mac developer community in the 80s, hired <a href=\"https://en.wikipedia.org/wiki/Dan_Shafer\">him</a> to write the first docs for \"Frontier\". Bon voyage mi amigo! :boom:",
|
||||
"created": "Sun, 25 Jun 2017 12:56:23 GMT",
|
||||
"type": "outline",
|
||||
"permalink": "http://scripting.com/2017/06/25.html#a080623"
|
||||
}
|
||||
},
|
||||
{
|
||||
"link": "http://scripting.com/2017/06/25.html#a080624",
|
||||
"description": "Money was a big issue yesterday in the nascent tech blogosphere. First, you do this because you love it, not because it pays well. (It doesn't pay at all.) Now I'd like to take you back to a discsussion that was had many years ago that resulted in this conclusion. You don't make money from this work, but it leads to opportunities where you can make money. Ideas and information make their way to you and if you are so-inclined you can make money by investing in those ideas. No sure things, but some bloggers have made billions, and others have made millions. And others have made a decent living. Not <i>from</i> their blog but <i>because</i> they blog. ",
|
||||
"pubDate": "Sun, 25 Jun 2017 12:29:24 GMT",
|
||||
"guid": "http://scripting.com/2017/06/25.html#a080624",
|
||||
"source:outline": {
|
||||
"text": "Money was a big issue yesterday in the nascent tech blogosphere. First, you do this because you love it, not because it pays well. (It doesn't pay at all.) Now I'd like to take you back to a discsussion that was had many years ago that resulted in this conclusion. You don't make money from this work, but it leads to opportunities where you can make money. Ideas and information make their way to you and if you are so-inclined you can make money by investing in those ideas. No sure things, but some bloggers have made billions, and others have made millions. And others have made a decent living. Not <i>from</i> their blog but <i>because</i> they blog. ",
|
||||
"created": "Sun, 25 Jun 2017 12:29:24 GMT",
|
||||
"type": "outline",
|
||||
"permalink": "http://scripting.com/2017/06/25.html#a080624"
|
||||
}
|
||||
},
|
||||
{
|
||||
"link": "http://scripting.com/2017/06/25.html#a080631",
|
||||
"description": "In 2015 I <a href=\"http://scripting.com/2015/06/25/dropboxCouldBeKingOfTheOnepageApp.html\">wrote</a> that Dropbox could be the king of the one-page app. Because storage is the thing the web doesn't, on its own, do, and storage is the thing Dropbox does best. And they have an API, and they understood the connection to one-page-apps earlier than anyone. But it didn't happen. I've emailed with people at Dropbox from time to time and the best explanation I can come up with is that they are focused in different areas. It seems to me, from my outside perch, that they are trying to become a competitor to <a href=\"https://www.google.com/docs/about/\">Google's</a> and <a href=\"https://en.wikipedia.org/wiki/Microsoft_Office\">Microsoft's</a> Office products. I was hoping they'd become a platform, focusing on distribution and investment in startups.",
|
||||
"pubDate": "Sun, 25 Jun 2017 12:32:31 GMT",
|
||||
"guid": "http://scripting.com/2017/06/25.html#a080631",
|
||||
"source:outline": {
|
||||
"text": "In 2015 I <a href=\"http://scripting.com/2015/06/25/dropboxCouldBeKingOfTheOnepageApp.html\">wrote</a> that Dropbox could be the king of the one-page app. Because storage is the thing the web doesn't, on its own, do, and storage is the thing Dropbox does best. And they have an API, and they understood the connection to one-page-apps earlier than anyone. But it didn't happen. I've emailed with people at Dropbox from time to time and the best explanation I can come up with is that they are focused in different areas. It seems to me, from my outside perch, that they are trying to become a competitor to <a href=\"https://www.google.com/docs/about/\">Google's</a> and <a href=\"https://en.wikipedia.org/wiki/Microsoft_Office\">Microsoft's</a> Office products. I was hoping they'd become a platform, focusing on distribution and investment in startups.",
|
||||
"created": "Sun, 25 Jun 2017 12:32:31 GMT",
|
||||
"type": "outline",
|
||||
"image": "http://radio3.io/icons/clarus.gif",
|
||||
"permalink": "http://scripting.com/2017/06/25.html#a080631"
|
||||
}
|
||||
},
|
||||
{
|
||||
"title": "Code mode is for real",
|
||||
"link": "http://scripting.com/2017/06/25.html#a110613",
|
||||
"description": "<p><a href=\"http://donthitsave.com/comic/2016/03/25/code-mode\"><img src=\"http://scripting.com/images/2017/06/25/humor.png\" width=\"300\" height=\"285\" border=\"0\" alt=\"Code mode is a real thing.\"></a></p>\n",
|
||||
"pubDate": "Sun, 25 Jun 2017 15:53:13 GMT",
|
||||
"guid": "http://scripting.com/2017/06/25.html#a110613",
|
||||
"source:outline": {
|
||||
"text": "Code mode is for real",
|
||||
"created": "Sun, 25 Jun 2017 15:53:13 GMT",
|
||||
"type": "outline",
|
||||
"subs": [
|
||||
{
|
||||
"text": "<a href=\"http://donthitsave.com/comic/2016/03/25/code-mode\"><img src=\"http://scripting.com/images/2017/06/25/humor.png\" width=\"300\" height=\"285\" border=\"0\" alt=\"Code mode is a real thing.\"></a>",
|
||||
"created": "Sun, 25 Jun 2017 15:53:18 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/25.html#a110618"
|
||||
}
|
||||
],
|
||||
"permalink": "http://scripting.com/2017/06/25.html#a110613"
|
||||
}
|
||||
},
|
||||
{
|
||||
"link": "http://scripting.com/2017/06/24.html#a100601",
|
||||
"description": "Good morning sports fans! 🏈",
|
||||
"pubDate": "Sat, 24 Jun 2017 14:57:01 GMT",
|
||||
"guid": "http://scripting.com/2017/06/24.html#a100601",
|
||||
"source:outline": {
|
||||
"text": "Good morning sports fans! :football:",
|
||||
"created": "Sat, 24 Jun 2017 14:57:01 GMT",
|
||||
"type": "outline",
|
||||
"permalink": "http://scripting.com/2017/06/24.html#a100601"
|
||||
}
|
||||
},
|
||||
{
|
||||
"link": "http://scripting.com/2017/06/24.html#a040606",
|
||||
"description": "<a href=\"http://scripting.com/2017/03/08/theWorldIsSocialistPartIi.html\">Health care is socialist</a> is getting a bunch of new reads today thanks to some powerful RTs.",
|
||||
"pubDate": "Sat, 24 Jun 2017 20:50:06 GMT",
|
||||
"guid": "http://scripting.com/2017/06/24.html#a040606",
|
||||
"source:outline": {
|
||||
"text": "<a href=\"http://scripting.com/2017/03/08/theWorldIsSocialistPartIi.html\">Health care is socialist</a> is getting a bunch of new reads today thanks to some powerful RTs.",
|
||||
"created": "Sat, 24 Jun 2017 20:50:06 GMT",
|
||||
"type": "outline",
|
||||
"permalink": "http://scripting.com/2017/06/24.html#a040606"
|
||||
}
|
||||
},
|
||||
{
|
||||
"link": "http://scripting.com/2017/06/24.html#a020644",
|
||||
"description": "Today is emoji day ⭐️ on Scripting News. We have all the ⭐️ best emoji. And they're free, for you, the best ⭐️ people in the universe, the readers of ⭐️ this humble blog. ⭐️ ",
|
||||
"pubDate": "Sat, 24 Jun 2017 18:34:44 GMT",
|
||||
"guid": "http://scripting.com/2017/06/24.html#a020644",
|
||||
"source:outline": {
|
||||
"text": "Today is emoji day :star: on Scripting News. We have all the :star: best emoji. And they're free, for you, the best :star: people in the universe, the readers of :star: this humble blog. :star: ",
|
||||
"created": "Sat, 24 Jun 2017 18:34:44 GMT",
|
||||
"type": "outline",
|
||||
"permalink": "http://scripting.com/2017/06/24.html#a020644"
|
||||
}
|
||||
},
|
||||
{
|
||||
"link": "http://scripting.com/2017/06/24.html#a020620",
|
||||
"description": "It makes sense that because of <a href=\"https://en.wikipedia.org/wiki/Reconciliation_(United_States_Congress)\">reconcilliation</a> Repubs have a hard time repealing ObamaCare. It seems fair that you should have to have 60 votes to repeal something that required 60 votes to pass. How will they explain it to the voters they've been lying to about \"repeal and replace.\" Double-talk. Swamp-talk. 👍",
|
||||
"pubDate": "Sat, 24 Jun 2017 18:20:20 GMT",
|
||||
"guid": "http://scripting.com/2017/06/24.html#a020620",
|
||||
"source:outline": {
|
||||
"text": "It makes sense that because of <a href=\"https://en.wikipedia.org/wiki/Reconciliation_(United_States_Congress)\">reconcilliation</a> Repubs have a hard time repealing ObamaCare. It seems fair that you should have to have 60 votes to repeal something that required 60 votes to pass. How will they explain it to the voters they've been lying to about \"repeal and replace.\" Double-talk. Swamp-talk. :+1:",
|
||||
"created": "Sat, 24 Jun 2017 18:20:20 GMT",
|
||||
"type": "outline",
|
||||
"permalink": "http://scripting.com/2017/06/24.html#a020620"
|
||||
}
|
||||
},
|
||||
{
|
||||
"link": "http://scripting.com/2017/06/24.html#a020649",
|
||||
"description": "I've started a <a href=\"https://gitter.im/scriptingnews/Lobby\">chatroom</a> on Gitter. Not sure what I'll use it for. Also not sure if it's open for anyone to join. I want it to be. The community <a href=\"http://guidelines.scripting.com/\">guidelines</a> apply. Keep it short, respectful and on-topic, and <i>no spam. </i>⚾️",
|
||||
"pubDate": "Sat, 24 Jun 2017 18:05:49 GMT",
|
||||
"guid": "http://scripting.com/2017/06/24.html#a020649",
|
||||
"source:outline": {
|
||||
"text": "I've started a <a href=\"https://gitter.im/scriptingnews/Lobby\">chatroom</a> on Gitter. Not sure what I'll use it for. Also not sure if it's open for anyone to join. I want it to be. The community <a href=\"http://guidelines.scripting.com/\">guidelines</a> apply. Keep it short, respectful and on-topic, and <i>no spam. </i>:baseball:",
|
||||
"created": "Sat, 24 Jun 2017 18:05:49 GMT",
|
||||
"type": "outline",
|
||||
"permalink": "http://scripting.com/2017/06/24.html#a020649"
|
||||
}
|
||||
},
|
||||
{
|
||||
"link": "http://scripting.com/2017/06/24.html#a110617",
|
||||
"description": "BTW, don't ask me to pitch RSS, I won't do it, because the request is based on a misunderstanding. RSS is not a product, it's a format. I have never made a dime from it. You have as much at stake in its success as I do. So I always turn it around and ask the person who asked me for a pitch to instead pitch <i>me</i> on it. I don't budge on this. Ever. 🏀",
|
||||
"pubDate": "Sat, 24 Jun 2017 15:19:17 GMT",
|
||||
"guid": "http://scripting.com/2017/06/24.html#a110617",
|
||||
"source:outline": {
|
||||
"text": "BTW, don't ask me to pitch RSS, I won't do it, because the request is based on a misunderstanding. RSS is not a product, it's a format. I have never made a dime from it. You have as much at stake in its success as I do. So I always turn it around and ask the person who asked me for a pitch to instead pitch <i>me</i> on it. I don't budge on this. Ever. :basketball:",
|
||||
"created": "Sat, 24 Jun 2017 15:19:17 GMT",
|
||||
"type": "outline",
|
||||
"image": "http://scripting.com/images/2017/06/24/rssTShirt.png",
|
||||
"permalink": "http://scripting.com/2017/06/24.html#a110617"
|
||||
}
|
||||
},
|
||||
{
|
||||
"link": "http://scripting.com/2017/06/24.html#a110610",
|
||||
"description": "Is anyone using the <a href=\"http://scripting.com/rss.json\">JSON version</a> of the Scripting News feed in their feed reader? It's a bit of a trick question, in a way, because as far as I know, only <a href=\"https://github.com/scripting/river5\">River5</a> and <a href=\"http://this.how/electricRiver\">Electric River</a> support this format. If so, send me an email at my address, on the About page <a href=\"http://scripting.com/about.html\">here</a>. 🍰",
|
||||
"pubDate": "Sat, 24 Jun 2017 15:01:10 GMT",
|
||||
"guid": "http://scripting.com/2017/06/24.html#a110610",
|
||||
"source:outline": {
|
||||
"text": "Is anyone using the <a href=\"http://scripting.com/rss.json\">JSON version</a> of the Scripting News feed in their feed reader? It's a bit of a trick question, in a way, because as far as I know, only \"River5\" and \"Electric River\" support this format. If so, send me an email at my address, on the About page <a href=\"http://scripting.com/about.html\">here</a>. :cake:",
|
||||
"created": "Sat, 24 Jun 2017 15:01:10 GMT",
|
||||
"type": "outline",
|
||||
"permalink": "http://scripting.com/2017/06/24.html#a110610"
|
||||
}
|
||||
},
|
||||
{
|
||||
"link": "http://scripting.com/2017/06/24.html#a010650",
|
||||
"description": "Journalists keep making a serious technology error -- assuming the only damage Russia can do to our government is during elections. 🇺🇸 ",
|
||||
"pubDate": "Sat, 24 Jun 2017 05:50:50 GMT",
|
||||
"guid": "http://scripting.com/2017/06/24.html#a010650",
|
||||
"source:outline": {
|
||||
"text": "Journalists keep making a serious technology error -- assuming the only damage Russia can do to our government is during elections. :us: ",
|
||||
"created": "Sat, 24 Jun 2017 05:50:50 GMT",
|
||||
"type": "outline",
|
||||
"permalink": "http://scripting.com/2017/06/24.html#a010650"
|
||||
}
|
||||
},
|
||||
{
|
||||
"link": "http://scripting.com/2017/06/24.html#a100632",
|
||||
"description": "I get my health insurance through the <a href=\"https://en.wikipedia.org/wiki/Patient_Protection_and_Affordable_Care_Act\">ACA</a>. It's very much alive, <a href=\"http://www.politico.com/story/2017/06/23/sean-spicer-obamacare-repeal-bill-239895\">Spicer</a>. Without it I would not have health insurance. 🍋 ",
|
||||
"pubDate": "Sat, 24 Jun 2017 14:26:32 GMT",
|
||||
"guid": "http://scripting.com/2017/06/24.html#a100632",
|
||||
"source:outline": {
|
||||
"text": "I get my health insurance through the <a href=\"https://en.wikipedia.org/wiki/Patient_Protection_and_Affordable_Care_Act\">ACA</a>. It's very much alive, <a href=\"http://www.politico.com/story/2017/06/23/sean-spicer-obamacare-repeal-bill-239895\">Spicer</a>. Without it I would not have health insurance. :lemon: ",
|
||||
"created": "Sat, 24 Jun 2017 14:26:32 GMT",
|
||||
"type": "outline",
|
||||
"permalink": "http://scripting.com/2017/06/24.html#a100632"
|
||||
}
|
||||
},
|
||||
{
|
||||
"title": "The sad state of tech news in 2017",
|
||||
"link": "http://scripting.com/2017/06/24.html#a090648",
|
||||
"description": "<p>It won't take much to reboot the tech blogosphere, just a few bloggers with ideas who listen to each other and want to work with each other. That was the <a href=\"http://scripting.com/davenet/1996/02/08/holdinghandsincyberspace.html\">idea</a> behind blogrolls, to visibly show the relationships. </p>\n<ul>\n\t<li>I'm still thinking about how to integrate a blogroll with the new design of <a href=\"http://scripting.com/\">Scripting News</a>. I pushed everything aside to get a clean look for the new site. I want to avoid bringing it all back. </li>\n\t</ul>\n<p>So, we have a few people who are writing and listening. That's a needed first step. Next we need a way to announce and hear about new tech products. Not just ones that get VC backing or come from big companies. We already hear about those products through <a href=\"http://techmeme.com/\">TechMeme</a> and the pubs that contribute to it. We also have platform-specific news about tech products, it's more limited, but it's there.</p>\n<p>It will likely start with word of mouth among the bloggers. If <a href=\"http://altplatform.org/2017/06/20/building-a-blogroll-in-2017/\">Richard</a> is using a product and speaks highly of it, I'm likely to take a look. Especially if he says it fits into what I'm doing through the open formats my software already supports. </p>\n<p>Then I want a river, a place where I can go to find out quickly what's new, in the way of products, not BigCo bluster or another $250 million VC deal. I want to know what my peers are doing. So I can learn from them, and so we can make our products work with theirs. </p>\n<p><i>Work together</i> is a phrase you'll hear me use a lot. It's the potential of tech, but it often isn't the attitude of tech. Even the smallest most independent developers dream of dominating. You can't work with people who dominate, even if they win. </p>\n<p>I want to hear about products that are open to connecting to mine. </p>\n<p>There have been times, often defined by news sources, that have created huge swells of compatible technology. To name a few: InfoWorld, PC WEEK, MacWEEK, TechCrunch. Very fond memories of the communities that gathered around each of those. </p>\n<p>It's time for another. The opportunity is there. It's been a long time since we had an open development community that worked to create great new user experience without lockin. It's like riding a bicycle or swimming, you don't forget how to do it. And like tennis or baseball, you can't play without partners and competition. </p>\n",
|
||||
"pubDate": "Sat, 24 Jun 2017 13:43:48 GMT",
|
||||
"guid": "http://scripting.com/2017/06/24.html#a090648",
|
||||
"source:outline": {
|
||||
"text": "The sad state of tech news in 2017",
|
||||
"created": "Sat, 24 Jun 2017 13:43:48 GMT",
|
||||
"type": "outline",
|
||||
"subs": [
|
||||
{
|
||||
"text": "It won't take much to reboot the tech blogosphere, just a few bloggers with ideas who listen to each other and want to work with each other. That was the <a href=\"http://scripting.com/davenet/1996/02/08/holdinghandsincyberspace.html\">idea</a> behind blogrolls, to visibly show the relationships. ",
|
||||
"created": "Sat, 24 Jun 2017 13:43:55 GMT",
|
||||
"subs": [
|
||||
{
|
||||
"text": "I'm still thinking about how to integrate a blogroll with the new design of \"Scripting News\". I pushed everything aside to get a clean look for the new site. I want to avoid bringing it all back. ",
|
||||
"created": "Sat, 24 Jun 2017 14:32:17 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/24.html#a100617"
|
||||
}
|
||||
],
|
||||
"permalink": "http://scripting.com/2017/06/24.html#a090655"
|
||||
},
|
||||
{
|
||||
"text": "So, we have a few people who are writing and listening. That's a needed first step. Next we need a way to announce and hear about new tech products. Not just ones that get VC backing or come from big companies. We already hear about those products through \"TechMeme\" and the pubs that contribute to it. We also have platform-specific news about tech products, it's more limited, but it's there.",
|
||||
"created": "Sat, 24 Jun 2017 13:44:09 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/24.html#a090609"
|
||||
},
|
||||
{
|
||||
"text": "It will likely start with word of mouth among the bloggers. If <a href=\"http://altplatform.org/2017/06/20/building-a-blogroll-in-2017/\">Richard</a> is using a product and speaks highly of it, I'm likely to take a look. Especially if he says it fits into what I'm doing through the open formats my software already supports. ",
|
||||
"created": "Sat, 24 Jun 2017 13:52:04 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/24.html#a090604"
|
||||
},
|
||||
{
|
||||
"text": "Then I want a river, a place where I can go to find out quickly what's new, in the way of products, not BigCo bluster or another $250 million VC deal. I want to know what my peers are doing. So I can learn from them, and so we can make our products work with theirs. ",
|
||||
"created": "Sat, 24 Jun 2017 13:52:04 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/24.html#a090604"
|
||||
},
|
||||
{
|
||||
"text": "<i>Work together</i> is a phrase you'll hear me use a lot. It's the potential of tech, but it often isn't the attitude of tech. Even the smallest most independent developers dream of dominating. You can't work with people who dominate, even if they win. ",
|
||||
"created": "Sat, 24 Jun 2017 13:54:33 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/24.html#a090633"
|
||||
},
|
||||
{
|
||||
"text": "I want to hear about products that are open to connecting to mine. ",
|
||||
"created": "Sat, 24 Jun 2017 20:53:41 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/24.html#a040641"
|
||||
},
|
||||
{
|
||||
"text": "There have been times, often defined by news sources, that have created huge swells of compatible technology. To name a few: InfoWorld, PC WEEK, MacWEEK, TechCrunch. Very fond memories of the communities that gathered around each of those. ",
|
||||
"created": "Sat, 24 Jun 2017 13:48:02 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/24.html#a090602"
|
||||
},
|
||||
{
|
||||
"text": "It's time for another. The opportunity is there. It's been a long time since we had an open development community that worked to create great new user experience without lockin. It's like riding a bicycle or swimming, you don't forget how to do it. And like tennis or baseball, you can't play without partners and competition. ",
|
||||
"created": "Sat, 24 Jun 2017 13:57:02 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/24.html#a090602"
|
||||
}
|
||||
],
|
||||
"permalink": "http://scripting.com/2017/06/24.html#a090648"
|
||||
}
|
||||
},
|
||||
{
|
||||
"title": "Republican-inspired art",
|
||||
"link": "http://scripting.com/2017/06/24.html#a100632",
|
||||
"description": "<p><a href=\"http://boingboing.net/2017/06/23/the-white-house-is-having-off.html\"><img src=\"http://scripting.com/images/2017/06/24/spicer.png\" width=\"502\" height=\"339\" border=\"0\" alt=\"A picture named spicer.png\"></a></p>\n",
|
||||
"pubDate": "Sat, 24 Jun 2017 14:52:32 GMT",
|
||||
"guid": "http://scripting.com/2017/06/24.html#a100632",
|
||||
"source:outline": {
|
||||
"text": "Republican-inspired art",
|
||||
"created": "Sat, 24 Jun 2017 14:52:32 GMT",
|
||||
"type": "outline",
|
||||
"subs": [
|
||||
{
|
||||
"text": "<a href=\"http://boingboing.net/2017/06/23/the-white-house-is-having-off.html\"><img src=\"http://scripting.com/images/2017/06/24/spicer.png\" width=\"502\" height=\"339\" border=\"0\" alt=\"A picture named spicer.png\"></a>",
|
||||
"created": "Sat, 24 Jun 2017 14:52:37 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/24.html#a100637"
|
||||
}
|
||||
],
|
||||
"permalink": "http://scripting.com/2017/06/24.html#a100632"
|
||||
}
|
||||
},
|
||||
{
|
||||
"link": "http://scripting.com/2017/06/23.html#a070648",
|
||||
"description": "Thank you <a href=\"https://twitter.com/om/status/878075081204711424\">Om</a> for the tweet-love. ❤️ ",
|
||||
"pubDate": "Fri, 23 Jun 2017 11:50:48 GMT",
|
||||
"guid": "http://scripting.com/2017/06/23.html#a070648",
|
||||
"source:outline": {
|
||||
"text": "Thank you <a href=\"https://twitter.com/om/status/878075081204711424\">Om</a> for the tweet-love. :heart: ",
|
||||
"created": "Fri, 23 Jun 2017 11:50:48 GMT",
|
||||
"type": "outline",
|
||||
"permalink": "http://scripting.com/2017/06/23.html#a070648"
|
||||
}
|
||||
},
|
||||
{
|
||||
"link": "http://scripting.com/2017/06/23.html#a120634",
|
||||
"description": "<a href=\"https://twitter.com/davewiner/status/878279505453826049\">An idea worth RT'ing</a>: \"A site people could go to, fill in some info about themselves, and find out how much they would lose under the Repub plan.\"",
|
||||
"pubDate": "Fri, 23 Jun 2017 16:02:34 GMT",
|
||||
"guid": "http://scripting.com/2017/06/23.html#a120634",
|
||||
"source:outline": {
|
||||
"text": "<a href=\"https://twitter.com/davewiner/status/878279505453826049\">An idea worth RT'ing</a>: \"A site people could go to, fill in some info about themselves, and find out how much they would lose under the Repub plan.\"",
|
||||
"created": "Fri, 23 Jun 2017 16:02:34 GMT",
|
||||
"type": "outline",
|
||||
"permalink": "http://scripting.com/2017/06/23.html#a120634"
|
||||
}
|
||||
},
|
||||
{
|
||||
"link": "http://scripting.com/2017/06/23.html#a090638",
|
||||
"description": "<a href=\"https://github.com/scripting/githubpub/blob/master/README.md\">githubpub</a> is a Node app that serves from GitHub repositories.",
|
||||
"pubDate": "Fri, 23 Jun 2017 13:52:38 GMT",
|
||||
"guid": "http://scripting.com/2017/06/23.html#a090638",
|
||||
"source:outline": {
|
||||
"text": "\"githubpub\" is a Node app that serves from GitHub repositories.",
|
||||
"created": "Fri, 23 Jun 2017 13:52:38 GMT",
|
||||
"type": "outline",
|
||||
"permalink": "http://scripting.com/2017/06/23.html#a090638"
|
||||
}
|
||||
},
|
||||
{
|
||||
"link": "http://scripting.com/2017/06/23.html#a100602",
|
||||
"description": "Fix for the Scripting News <a href=\"http://scripting.com/rss.xml\">RSS</a> <a href=\"http://scripting.com/rss.json\">feed</a>: we now process glossary entries and emoji short codes. The net effect is that text shortcuts like <a href=\"http://cyber.law.harvard.edu/rss/rss.html\">RSS</a> will be expanded as well as 👏 emoji 👏, in the feeds. As they say, <i>still diggin!</i>",
|
||||
"pubDate": "Fri, 23 Jun 2017 14:52:02 GMT",
|
||||
"guid": "http://scripting.com/2017/06/23.html#a100602",
|
||||
"source:outline": {
|
||||
"text": "Fix for the Scripting News <a href=\"http://scripting.com/rss.xml\">RSS</a> <a href=\"http://scripting.com/rss.json\">feed</a>: we now process glossary entries and emoji short codes. The net effect is that text shortcuts like \"rss\" will be expanded as well as :clap: emoji :clap:, in the feeds. As they say, <i>still diggin!</i>",
|
||||
"created": "Fri, 23 Jun 2017 14:52:02 GMT",
|
||||
"type": "outline",
|
||||
"permalink": "http://scripting.com/2017/06/23.html#a100602"
|
||||
}
|
||||
},
|
||||
{
|
||||
"link": "http://scripting.com/2017/06/23.html#a070659",
|
||||
"description": "So many thoughts today begin with -- If the Dems only had their shit together. ",
|
||||
"pubDate": "Fri, 23 Jun 2017 11:52:59 GMT",
|
||||
"guid": "http://scripting.com/2017/06/23.html#a070659",
|
||||
"source:outline": {
|
||||
"text": "So many thoughts today begin with -- If the Dems only had their shit together. ",
|
||||
"created": "Fri, 23 Jun 2017 11:52:59 GMT",
|
||||
"type": "tweet",
|
||||
"tweetId": "878220762343133184",
|
||||
"tweetUserName": "davewiner",
|
||||
"permalink": "http://scripting.com/2017/06/23.html#a070659"
|
||||
}
|
||||
},
|
||||
{
|
||||
"link": "http://scripting.com/2017/06/23.html#a070624",
|
||||
"description": "If the Dems only had their shit together, we would be mobleizable to knock on neighbor's doors this weekend with pre-written talking points. \"Did you know that you <s>could</s> will lose your health insurance if the Republicans have their way?\"",
|
||||
"pubDate": "Fri, 23 Jun 2017 11:53:24 GMT",
|
||||
"guid": "http://scripting.com/2017/06/23.html#a070624",
|
||||
"source:outline": {
|
||||
"text": "If the Dems only had their shit together, we would be mobleizable to knock on neighbor's doors this weekend with pre-written talking points. \"Did you know that you <s>could</s> will lose your health insurance if the Republicans have their way?\"",
|
||||
"created": "Fri, 23 Jun 2017 11:53:24 GMT",
|
||||
"type": "outline",
|
||||
"permalink": "http://scripting.com/2017/06/23.html#a070624"
|
||||
}
|
||||
},
|
||||
{
|
||||
"link": "http://scripting.com/2017/06/23.html#a070633",
|
||||
"description": "Repubs who consider voting for the repeal of Medicaid and the ACA should fear the <a href=\"https://en.wikipedia.org/wiki/Hell\">hellfire</a> they will face when they run for re-election. <i>This weekend</i> is the time to make your feelings felt. ",
|
||||
"pubDate": "Fri, 23 Jun 2017 11:47:33 GMT",
|
||||
"guid": "http://scripting.com/2017/06/23.html#a070633",
|
||||
"source:outline": {
|
||||
"text": "Repubs who consider voting for the repeal of Medicaid and the ACA should fear the <a href=\"https://en.wikipedia.org/wiki/Hell\">hellfire</a> they will face when they run for re-election. <i>This weekend</i> is the time to make your feelings felt. ",
|
||||
"created": "Fri, 23 Jun 2017 11:47:33 GMT",
|
||||
"type": "outline",
|
||||
"permalink": "http://scripting.com/2017/06/23.html#a070633"
|
||||
}
|
||||
},
|
||||
{
|
||||
"link": "http://scripting.com/2017/06/23.html#a070641",
|
||||
"description": "BTW, if someone expresses frustration it doesn't follow that they blame you, esp on Twitter which is a length-impaired medium. ",
|
||||
"pubDate": "Fri, 23 Jun 2017 11:45:41 GMT",
|
||||
"guid": "http://scripting.com/2017/06/23.html#a070641",
|
||||
"source:outline": {
|
||||
"text": "BTW, if someone expresses frustration it doesn't follow that they blame you, esp on Twitter which is a length-impaired medium. ",
|
||||
"created": "Fri, 23 Jun 2017 11:45:41 GMT",
|
||||
"type": "outline",
|
||||
"permalink": "http://scripting.com/2017/06/23.html#a070641"
|
||||
}
|
||||
},
|
||||
{
|
||||
"title": "Thin servers",
|
||||
"link": "http://scripting.com/2017/06/23.html#a100620",
|
||||
"description": "<p>Two friends, <a href=\"https://twitter.com/judell\">Jon Udell</a> and <a href=\"https://twitter.com/holden\">Mike Caulfield</a>, are talking about \"dumb\" servers. I call the same things \"thin.\" Also fractional-horsepower servers. They go by a bunch of names, but the idea and motivation is the same. </p>\n<p>The idea: We move functionality from the server to the edge (desktop, mobile device), repeating until someday there's nothing left on the server. We could go all the way, but it needs a strong operational backend, something a big company is good at, not so much individuals. (With the caveat that some think this problem is distributable, notably the fictional <a href=\"https://www.crunchbase.com/person/richard-hendriks#/entity\">CEO</a> of <a href=\"http://www.piedpiper.com/\">Pied Piper</a>.)</p>\n<p>The key thing is identity. Once you have that solved, it all becomes relatively easy. I've factored out identity into a layer I call <a href=\"https://github.com/scripting/nodeStorage\">nodeStorage</a>. It associates storage with a user's Twitter identity. Twitter is a good service to use, unlike some others, because they have a liberal policy of who gets to <a href=\"https://apps.twitter.com/app/new\">create</a> apps. Faceook has an extensive vetting process. Twitter <a href=\"https://apps.twitter.com/app/new\">is</a> \"let a thousand flowers bloom.\" I know some people have problems with Twitter, but I've learned over many years that all corporate vendors are imperfect. If you're waiting for <a href=\"http://this.how/standards#1497798834000\">perfection</a> you'll wait forever. And you build the software so that if Twitter should again become draconian, a new service can be filled in with as little disruption as possible.</p>\n<p>Another place I've looked is Dropbox. There, with one simple feature, the ability to associate a domain with a folder, they would solve the problem. I know there are external services that provide something \"like\" this, but fundamentally Dropbox doesn't provide enough flexibility in the API to do this in a reasonable way. (Lack of granularity in permissions, an app gets access to one folder or everything.)</p>\n<p>Or Amazon, if their identity system for AWS were simpler for end users, or if their end-user storage system could be accessed through the S3 API. I'm sure they've thought of it. There must be a reason they don't do it. </p>\n<p>And Twitter could completely eliminate the need for nodeStorage, by offering users a few gigabytes of storage attached to their Twitter account, accessible through the API. The first person who described the feature to me was Jack Dorsey, about eight years ago, when we met for coffee in SF. So he understands why this idea is so powerful. I'm not sure what the holdup is. </p>\n<p>In the meantime, <a href=\"https://github.com/scripting/nodeStorage\">nodeStorage</a> works. I build the kind of apps I want. Open the sidebar on Scripting News (left margin) and have a look at the apps. Some even have <a href=\"https://github.com/scripting/macwrite/blob/master/macwrite.js\">source code</a> so you can see for yourself. </p>\n",
|
||||
"pubDate": "Fri, 23 Jun 2017 14:03:20 GMT",
|
||||
"guid": "http://scripting.com/2017/06/23.html#a100620",
|
||||
"source:outline": {
|
||||
"text": "Thin servers",
|
||||
"created": "Fri, 23 Jun 2017 14:03:20 GMT",
|
||||
"type": "outline",
|
||||
"subs": [
|
||||
{
|
||||
"text": "Two friends, <a href=\"https://twitter.com/judell\">Jon Udell</a> and <a href=\"https://twitter.com/holden\">Mike Caulfield</a>, are talking about \"dumb\" servers. I call the same things \"thin.\" Also fractional-horsepower servers. They go by a bunch of names, but the idea and motivation is the same. ",
|
||||
"created": "Fri, 23 Jun 2017 14:05:30 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/23.html#a100630"
|
||||
},
|
||||
{
|
||||
"text": "The idea: We move functionality from the server to the edge (desktop, mobile device), repeating until someday there's nothing left on the server. We could go all the way, but it needs a strong operational backend, something a big company is good at, not so much individuals. (With the caveat that some think this problem is distributable, notably the fictional <a href=\"https://www.crunchbase.com/person/richard-hendriks#/entity\">CEO</a> of <a href=\"http://www.piedpiper.com/\">Pied Piper</a>.)",
|
||||
"created": "Fri, 23 Jun 2017 14:24:35 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/23.html#a100635"
|
||||
},
|
||||
{
|
||||
"text": "The key thing is identity. Once you have that solved, it all becomes relatively easy. I've factored out identity into a layer I call \"nodeStorage\". It associates storage with a user's Twitter identity. Twitter is a good service to use, unlike some others, because they have a liberal policy of who gets to <a href=\"https://apps.twitter.com/app/new\">create</a> apps. Faceook has an extensive vetting process. Twitter <a href=\"https://apps.twitter.com/app/new\">is</a> \"let a thousand flowers bloom.\" I know some people have problems with Twitter, but I've learned over many years that all corporate vendors are imperfect. If you're waiting for <a href=\"http://this.how/standards#1497798834000\">perfection</a> you'll wait forever. And you build the software so that if Twitter should again become draconian, a new service can be filled in with as little disruption as possible.",
|
||||
"created": "Fri, 23 Jun 2017 14:05:43 GMT",
|
||||
"image": "http://scripting.com/images/2017/06/17/bowling.png",
|
||||
"permalink": "http://scripting.com/2017/06/23.html#a100643"
|
||||
},
|
||||
{
|
||||
"text": "Another place I've looked is Dropbox. There, with one simple feature, the ability to associate a domain with a folder, they would solve the problem. I know there are external services that provide something \"like\" this, but fundamentally Dropbox doesn't provide enough flexibility in the API to do this in a reasonable way. (Lack of granularity in permissions, an app gets access to one folder or everything.)",
|
||||
"created": "Fri, 23 Jun 2017 14:08:41 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/23.html#a100641"
|
||||
},
|
||||
{
|
||||
"text": "Or Amazon, if their identity system for AWS were simpler for end users, or if their end-user storage system could be accessed through the S3 API. I'm sure they've thought of it. There must be a reason they don't do it. ",
|
||||
"created": "Fri, 23 Jun 2017 14:09:10 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/23.html#a100610"
|
||||
},
|
||||
{
|
||||
"text": "And Twitter could completely eliminate the need for nodeStorage, by offering users a few gigabytes of storage attached to their Twitter account, accessible through the API. The first person who described the feature to me was Jack Dorsey, about eight years ago, when we met for coffee in SF. So he understands why this idea is so powerful. I'm not sure what the holdup is. ",
|
||||
"created": "Fri, 23 Jun 2017 14:09:55 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/23.html#a100655"
|
||||
},
|
||||
{
|
||||
"text": "In the meantime, \"nodeStorage\" works. I build the kind of apps I want. Open the sidebar on Scripting News (left margin) and have a look at the apps. Some even have <a href=\"https://github.com/scripting/macwrite/blob/master/macwrite.js\">source code</a> so you can see for yourself. ",
|
||||
"created": "Fri, 23 Jun 2017 14:33:10 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/23.html#a100610"
|
||||
}
|
||||
],
|
||||
"permalink": "http://scripting.com/2017/06/23.html#a100620"
|
||||
}
|
||||
},
|
||||
{
|
||||
"title": "RicMac, part II",
|
||||
"link": "http://scripting.com/2017/06/23.html#a070643",
|
||||
"description": "<p><a href=\"https://twitter.com/ricmac\">Richard MacManus</a> keeps on truckin. There's nothing more powerful than a persistent and curious user who's relatively fearless. </p>\n<p>In a follow-up <a href=\"https://richardmacmanus.com/2017/06/22/openness-rivers-indieweb/\">post</a> I learned that there is an IndieWeb-approved feed reader called <a href=\"https://github.com/kylewm/woodwind\">Woodwind</a>. That's good news. <a href=\"http://cyber.law.harvard.edu/rss/rss.html\">RSS</a> and related technolgies, <a href=\"https://github.com/kylewm/woodwind/issues/66\">including</a> <a href=\"https://github.com/kylewm/woodwind/issues/7\">OPML</a> import and export, are essential components of the open web. </p>\n<p>BTW, to Richard, I wrote up my <a href=\"http://this.how/standards\">rules for standards-makers</a>, based on experience re what (imho) is important and what works and doesn't. Another item for your consideration. </p>\n",
|
||||
"pubDate": "Fri, 23 Jun 2017 11:14:43 GMT",
|
||||
"guid": "http://scripting.com/2017/06/23.html#a070643",
|
||||
"source:outline": {
|
||||
"text": "RicMac, part II",
|
||||
"created": "Fri, 23 Jun 2017 11:14:43 GMT",
|
||||
"type": "outline",
|
||||
"subs": [
|
||||
{
|
||||
"text": "<a href=\"https://twitter.com/ricmac\">Richard MacManus</a> keeps on truckin. There's nothing more powerful than a persistent and curious user who's relatively fearless. ",
|
||||
"created": "Fri, 23 Jun 2017 11:20:38 GMT",
|
||||
"image": "http://scripting.com/images/2017/06/23/mrNatural.png",
|
||||
"permalink": "http://scripting.com/2017/06/23.html#a070638"
|
||||
},
|
||||
{
|
||||
"text": "In a follow-up <a href=\"https://richardmacmanus.com/2017/06/22/openness-rivers-indieweb/\">post</a> I learned that there is an IndieWeb-approved feed reader called <a href=\"https://github.com/kylewm/woodwind\">Woodwind</a>. That's good news. \"RSS\" and related technolgies, <a href=\"https://github.com/kylewm/woodwind/issues/66\">including</a> <a href=\"https://github.com/kylewm/woodwind/issues/7\">OPML</a> import and export, are essential components of the open web. ",
|
||||
"created": "Fri, 23 Jun 2017 11:15:54 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/23.html#a070654"
|
||||
},
|
||||
{
|
||||
"text": "BTW, to Richard, I wrote up my <a href=\"http://this.how/standards\">rules for standards-makers</a>, based on experience re what (imho) is important and what works and doesn't. Another item for your consideration. ",
|
||||
"created": "Fri, 23 Jun 2017 11:19:38 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/23.html#a070638"
|
||||
}
|
||||
],
|
||||
"permalink": "http://scripting.com/2017/06/23.html#a070643"
|
||||
}
|
||||
},
|
||||
{
|
||||
"title": "Test post",
|
||||
"link": "http://scripting.com/2017/06/23.html#a030621",
|
||||
"description": "<p>Here's a list with four items</p>\n<ul>\n\t<li>one</li>\n\t<li>two</li>\n\t<li>three</li>\n\t<li>four</li>\n\t</ul>\n",
|
||||
"pubDate": "Fri, 23 Jun 2017 19:48:21 GMT",
|
||||
"guid": "http://scripting.com/2017/06/23.html#a030621",
|
||||
"source:outline": {
|
||||
"text": "Test post",
|
||||
"created": "Fri, 23 Jun 2017 19:48:21 GMT",
|
||||
"type": "outline",
|
||||
"subs": [
|
||||
{
|
||||
"text": "Here's a list with four items",
|
||||
"created": "Fri, 23 Jun 2017 19:49:21 GMT",
|
||||
"flNumberedSubs": "true",
|
||||
"subs": [
|
||||
{
|
||||
"text": "one",
|
||||
"created": "Fri, 23 Jun 2017 19:48:43 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/23.html#a030643"
|
||||
},
|
||||
{
|
||||
"text": "two",
|
||||
"created": "Fri, 23 Jun 2017 19:48:44 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/23.html#a030644"
|
||||
},
|
||||
{
|
||||
"text": "three",
|
||||
"created": "Fri, 23 Jun 2017 19:48:45 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/23.html#a030645"
|
||||
},
|
||||
{
|
||||
"text": "four",
|
||||
"created": "Fri, 23 Jun 2017 19:48:46 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/23.html#a030646"
|
||||
}
|
||||
],
|
||||
"permalink": "http://scripting.com/2017/06/23.html#a030621"
|
||||
}
|
||||
],
|
||||
"permalink": "http://scripting.com/2017/06/23.html#a030621"
|
||||
}
|
||||
},
|
||||
{
|
||||
"link": "http://scripting.com/2017/06/22.html#a120633",
|
||||
"description": "I'm working on a new Node web server that serves out of GitHub repos. It's a very sweet very small piece of software. ",
|
||||
"pubDate": "Thu, 22 Jun 2017 16:28:33 GMT",
|
||||
"guid": "http://scripting.com/2017/06/22.html#a120633",
|
||||
"source:outline": {
|
||||
"text": "I'm working on a new Node web server that serves out of GitHub repos. It's a very sweet very small piece of software. ",
|
||||
"created": "Thu, 22 Jun 2017 16:28:33 GMT",
|
||||
"type": "tweet",
|
||||
"tweetId": "877926320822464512",
|
||||
"tweetUserName": "davewiner",
|
||||
"permalink": "http://scripting.com/2017/06/22.html#a120633"
|
||||
}
|
||||
},
|
||||
{
|
||||
"link": "http://scripting.com/2017/06/22.html#a090616",
|
||||
"description": "An epiphany. Mark Zuckerberg is his generation's <a href=\"https://en.wikipedia.org/wiki/Ray_Kroc\">Ray Kroc</a>, and Facebook is <a href=\"https://www.mcdonalds.com/us/en-us.html\">McDonald's</a>. I aspire to be <a href=\"https://en.wikipedia.org/wiki/Alice_Waters\">Alice Waters</a>.",
|
||||
"pubDate": "Thu, 22 Jun 2017 13:29:16 GMT",
|
||||
"guid": "http://scripting.com/2017/06/22.html#a090616",
|
||||
"source:outline": {
|
||||
"text": "An epiphany. Mark Zuckerberg is his generation's <a href=\"https://en.wikipedia.org/wiki/Ray_Kroc\">Ray Kroc</a>, and Facebook is <a href=\"https://www.mcdonalds.com/us/en-us.html\">McDonald's</a>. I aspire to be <a href=\"https://en.wikipedia.org/wiki/Alice_Waters\">Alice Waters</a>.",
|
||||
"created": "Thu, 22 Jun 2017 13:29:16 GMT",
|
||||
"type": "tweet",
|
||||
"tweetId": "877881227298000896",
|
||||
"tweetUserName": "davewiner",
|
||||
"permalink": "http://scripting.com/2017/06/22.html#a090616"
|
||||
}
|
||||
},
|
||||
{
|
||||
"link": "http://scripting.com/2017/06/22.html#a090644",
|
||||
"description": "Future-of-journalism conferences that ignore blogging are not about the future of journalism.",
|
||||
"pubDate": "Thu, 22 Jun 2017 13:29:44 GMT",
|
||||
"guid": "http://scripting.com/2017/06/22.html#a090644",
|
||||
"source:outline": {
|
||||
"text": "Future-of-journalism conferences that ignore blogging are not about the future of journalism.",
|
||||
"created": "Thu, 22 Jun 2017 13:29:44 GMT",
|
||||
"type": "outline",
|
||||
"permalink": "http://scripting.com/2017/06/22.html#a090644"
|
||||
}
|
||||
},
|
||||
{
|
||||
"link": "http://scripting.com/2017/06/22.html#a120629",
|
||||
"description": "News will be interesting tonight. They've got the Repub health care <a href=\"https://www.axios.com/on-health-care-moderates-quiet-while-conservatives-put-their-foot-down-2446375738.html\">bill</a> to rip apart, and it's also <a href=\"http://nbariver.com/\">NBA Draft</a> night. ",
|
||||
"pubDate": "Thu, 22 Jun 2017 16:27:29 GMT",
|
||||
"guid": "http://scripting.com/2017/06/22.html#a120629",
|
||||
"source:outline": {
|
||||
"text": "News will be interesting tonight. They've got the Repub health care <a href=\"https://www.axios.com/on-health-care-moderates-quiet-while-conservatives-put-their-foot-down-2446375738.html\">bill</a> to rip apart, and it's also <a href=\"http://nbariver.com/\">NBA Draft</a> night. ",
|
||||
"created": "Thu, 22 Jun 2017 16:27:29 GMT",
|
||||
"type": "tweet",
|
||||
"tweetId": "877926057260728320",
|
||||
"tweetUserName": "davewiner",
|
||||
"permalink": "http://scripting.com/2017/06/22.html#a120629"
|
||||
}
|
||||
},
|
||||
{
|
||||
"title": "Fargo puzzler",
|
||||
"link": "http://scripting.com/2017/06/22.html#a030610",
|
||||
"description": "<p>The last two episodes of <a href=\"https://en.wikipedia.org/wiki/Fargo_(season_3)\">season 3</a> of Fargo were fantastic. But, the opening scene of episode 1, which takes place in a police office in East Germany during the Cold War, is without explanation. </p>\n<p>All through the season, I was wondering how it was going to be connected up with the story that takes place in Minnesota in 2011, but as far as I know it never was.</p>\n<p>Maybe that was VM Varga as the accused? Or the police guy?</p>\n<p>This is kind of bothering me! :-)</p>\n<p>Okay then...</p>\n<p>Update: In the <a href=\"https://en.wikipedia.org/wiki/Fargo_(season_3)#Episodes\">episode guide</a> on Wikipedia they describe the opening scene as follows: \"In 1988 East Berlin, Jacob Ungerleider is questioned in the death of a woman, which he claims is a case of mistaken identity.\" So it's not VM Varga in the hot seat. Who is Jacob Ungerleider? I have no idea! ;-)</p>\n",
|
||||
"pubDate": "Thu, 22 Jun 2017 19:26:10 GMT",
|
||||
"guid": "http://scripting.com/2017/06/22.html#a030610",
|
||||
"source:outline": {
|
||||
"text": "Fargo puzzler",
|
||||
"created": "Thu, 22 Jun 2017 19:26:10 GMT",
|
||||
"type": "outline",
|
||||
"subs": [
|
||||
{
|
||||
"text": "The last two episodes of <a href=\"https://en.wikipedia.org/wiki/Fargo_(season_3)\">season 3</a> of Fargo were fantastic. But, the opening scene of episode 1, which takes place in a police office in East Germany during the Cold War, is without explanation. ",
|
||||
"created": "Thu, 22 Jun 2017 19:26:18 GMT",
|
||||
"image": "http://scripting.com/images/2017/06/22/paulBunyan.png",
|
||||
"permalink": "http://scripting.com/2017/06/22.html#a030618"
|
||||
},
|
||||
{
|
||||
"text": "All through the season, I was wondering how it was going to be connected up with the story that takes place in Minnesota in 2011, but as far as I know it never was.",
|
||||
"created": "Thu, 22 Jun 2017 19:27:20 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/22.html#a030620"
|
||||
},
|
||||
{
|
||||
"text": "Maybe that was VM Varga as the accused? Or the police guy?",
|
||||
"created": "Thu, 22 Jun 2017 19:27:54 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/22.html#a030654"
|
||||
},
|
||||
{
|
||||
"text": "This is kind of bothering me! :-)",
|
||||
"created": "Thu, 22 Jun 2017 19:28:15 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/22.html#a030615"
|
||||
},
|
||||
{
|
||||
"text": "Okay then...",
|
||||
"created": "Thu, 22 Jun 2017 19:28:27 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/22.html#a030627"
|
||||
},
|
||||
{
|
||||
"text": "Update: In the <a href=\"https://en.wikipedia.org/wiki/Fargo_(season_3)#Episodes\">episode guide</a> on Wikipedia they describe the opening scene as follows: \"In 1988 East Berlin, Jacob Ungerleider is questioned in the death of a woman, which he claims is a case of mistaken identity.\" So it's not VM Varga in the hot seat. Who is Jacob Ungerleider? I have no idea! ;-)",
|
||||
"created": "Thu, 22 Jun 2017 19:38:25 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/22.html#a030625"
|
||||
}
|
||||
],
|
||||
"permalink": "http://scripting.com/2017/06/22.html#a030610"
|
||||
}
|
||||
},
|
||||
{
|
||||
"link": "http://scripting.com/2017/06/21.html#a060647",
|
||||
"description": "Good morning summer solstice fans!",
|
||||
"pubDate": "Wed, 21 Jun 2017 10:21:47 GMT",
|
||||
"guid": "http://scripting.com/2017/06/21.html#a060647",
|
||||
"source:outline": {
|
||||
"text": "Good morning summer solstice fans!",
|
||||
"created": "Wed, 21 Jun 2017 10:21:47 GMT",
|
||||
"type": "outline",
|
||||
"permalink": "http://scripting.com/2017/06/21.html#a060647"
|
||||
}
|
||||
},
|
||||
{
|
||||
"link": "http://scripting.com/2017/06/21.html#a060611",
|
||||
"description": "It was a boring NBA postseason, for the most. But the excitement of next season is already starting, with the draft tomorrow, and deal season in full swing. The place to find all the news is <a href=\"http://nbariver.com/\">nbariver.com</a>. It's one of many rivers maintained by my <a href=\"https://github.com/scripting/river5\">River5</a> installation. ",
|
||||
"pubDate": "Wed, 21 Jun 2017 10:22:11 GMT",
|
||||
"guid": "http://scripting.com/2017/06/21.html#a060611",
|
||||
"source:outline": {
|
||||
"text": "It was a boring NBA postseason, for the most. But the excitement of next season is already starting, with the draft tomorrow, and deal season in full swing. The place to find all the news is <a href=\"http://nbariver.com/\">nbariver.com</a>. It's one of many rivers maintained by my \"River5\" installation. ",
|
||||
"created": "Wed, 21 Jun 2017 10:22:11 GMT",
|
||||
"type": "outline",
|
||||
"permalink": "http://scripting.com/2017/06/21.html#a060611"
|
||||
}
|
||||
},
|
||||
{
|
||||
"link": "http://scripting.com/2017/06/21.html#a060632",
|
||||
"description": "BTW, I hate the term \"eating the dogfood.\" As much as I love dogs, it says that our users are pets, not sentient human beings, our equals. It also says our software is dog food. I think as a kid, as an experiment, a few of us kids actually ate dog food. It's a vague memory, that must have some basis in reality. It makes me nauseous to think about it. And that's what I think about when I hear the term. Please, let's find another way of saying \"My software is good because I use it, and vice versa.\"",
|
||||
"pubDate": "Wed, 21 Jun 2017 10:57:32 GMT",
|
||||
"guid": "http://scripting.com/2017/06/21.html#a060632",
|
||||
"source:outline": {
|
||||
"text": "BTW, I hate the term \"eating the dogfood.\" As much as I love dogs, it says that our users are pets, not sentient human beings, our equals. It also says our software is dog food. I think as a kid, as an experiment, a few of us kids actually ate dog food. It's a vague memory, that must have some basis in reality. It makes me nauseous to think about it. And that's what I think about when I hear the term. Please, let's find another way of saying \"My software is good because I use it, and vice versa.\"",
|
||||
"created": "Wed, 21 Jun 2017 10:57:32 GMT",
|
||||
"type": "outline",
|
||||
"permalink": "http://scripting.com/2017/06/21.html#a060632"
|
||||
}
|
||||
},
|
||||
{
|
||||
"link": "http://scripting.com/2017/06/21.html#a070633",
|
||||
"description": "Yesterday I posted a <a href=\"http://scripting.com/images/2017/06/21/frozenBlogPost.png\">screen shot</a> of one of my posts on Facebook, to accolades from friends on Facebook. I deleted the post. I won't be doing it again. Facebook is not a place for blog posts. Not as long as they disable linking, styles, titles and podcasts. If you want to help Facebook destroy the open web, go for it. But I will not participate in that awful adventure.",
|
||||
"pubDate": "Wed, 21 Jun 2017 11:01:33 GMT",
|
||||
"guid": "http://scripting.com/2017/06/21.html#a070633",
|
||||
"source:outline": {
|
||||
"text": "Yesterday I posted a <a href=\"http://scripting.com/images/2017/06/21/frozenBlogPost.png\">screen shot</a> of one of my posts on Facebook, to accolades from friends on Facebook. I deleted the post. I won't be doing it again. Facebook is not a place for blog posts. Not as long as they disable linking, styles, titles and podcasts. If you want to help Facebook destroy the open web, go for it. But I will not participate in that awful adventure.",
|
||||
"created": "Wed, 21 Jun 2017 11:01:33 GMT",
|
||||
"type": "outline",
|
||||
"permalink": "http://scripting.com/2017/06/21.html#a070633"
|
||||
}
|
||||
},
|
||||
{
|
||||
"link": "http://scripting.com/2017/06/21.html#a060600",
|
||||
"description": "On Facebook you are who the algorithm says you are. ",
|
||||
"pubDate": "Wed, 21 Jun 2017 10:53:00 GMT",
|
||||
"guid": "http://scripting.com/2017/06/21.html#a060600",
|
||||
"source:outline": {
|
||||
"text": "On Facebook you are who the algorithm says you are. ",
|
||||
"created": "Wed, 21 Jun 2017 10:53:00 GMT",
|
||||
"type": "outline",
|
||||
"permalink": "http://scripting.com/2017/06/21.html#a060600"
|
||||
}
|
||||
},
|
||||
{
|
||||
"title": "GitHub API example app",
|
||||
"link": "http://scripting.com/2017/06/21.html#a110614",
|
||||
"description": "<p>A simple <a href=\"http://scripting.com/misc/code/githubapi/directory.html\">web app</a> that travels through the <a href=\"https://github.com/scripting/river5\">River5 repository</a> in my GitHub account, producing a directory that reflects the structure of the repo.</p>\n<p>I couldn't <a href=\"https://duckduckgo.com/?q=github+api+example+app+directory+repository&t=h_&ia=web\">find</a> sample code that does this simple thing. Now I won't have to hunt for it, and neither will you. ;-) </p>\n<p>Here's the <a href=\"https://gist.github.com/scripting/f5e5b3a175265f47fda098cb5bddca2f\">source code</a>. </p>\n",
|
||||
"pubDate": "Wed, 21 Jun 2017 15:18:14 GMT",
|
||||
"guid": "http://scripting.com/2017/06/21.html#a110614",
|
||||
"source:outline": {
|
||||
"text": "GitHub API example app",
|
||||
"created": "Wed, 21 Jun 2017 15:18:14 GMT",
|
||||
"type": "outline",
|
||||
"subs": [
|
||||
{
|
||||
"text": "A simple <a href=\"http://scripting.com/misc/code/githubapi/directory.html\">web app</a> that travels through the <a href=\"https://github.com/scripting/river5\">River5 repository</a> in my GitHub account, producing a directory that reflects the structure of the repo.",
|
||||
"created": "Wed, 21 Jun 2017 15:18:24 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/21.html#a110624"
|
||||
},
|
||||
{
|
||||
"text": "I couldn't <a href=\"https://duckduckgo.com/?q=github+api+example+app+directory+repository&t=h_&ia=web\">find</a> sample code that does this simple thing. Now I won't have to hunt for it, and neither will you. ;-) ",
|
||||
"created": "Wed, 21 Jun 2017 15:18:36 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/21.html#a110636"
|
||||
},
|
||||
{
|
||||
"text": "Here's the <a href=\"https://gist.github.com/scripting/f5e5b3a175265f47fda098cb5bddca2f\">source code</a>. ",
|
||||
"created": "Wed, 21 Jun 2017 15:19:39 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/21.html#a110639"
|
||||
}
|
||||
],
|
||||
"permalink": "http://scripting.com/2017/06/21.html#a110614"
|
||||
}
|
||||
},
|
||||
{
|
||||
"title": "Bike video from two years ago",
|
||||
"link": "http://scripting.com/2017/06/21.html#a020637",
|
||||
"description": "<p><iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/iWvdXdW7GiI\" frameborder=\"0\" allowfullscreen></iframe></p>\n",
|
||||
"pubDate": "Wed, 21 Jun 2017 18:47:37 GMT",
|
||||
"guid": "http://scripting.com/2017/06/21.html#a020637",
|
||||
"source:outline": {
|
||||
"text": "Bike video from two years ago",
|
||||
"created": "Wed, 21 Jun 2017 18:47:37 GMT",
|
||||
"type": "outline",
|
||||
"subs": [
|
||||
{
|
||||
"text": "<iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/iWvdXdW7GiI\" frameborder=\"0\" allowfullscreen></iframe>",
|
||||
"created": "Wed, 21 Jun 2017 18:47:50 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/21.html#a020650"
|
||||
}
|
||||
],
|
||||
"permalink": "http://scripting.com/2017/06/21.html#a020637"
|
||||
}
|
||||
},
|
||||
{
|
||||
"title": "An old friend: Richard MacManus",
|
||||
"link": "http://scripting.com/2017/06/21.html#a060651",
|
||||
"description": "<p>Richard is one of the old school bloggers. He started <a href=\"https://web.archive.org/web/20031014183603/http://readwriteweb.com\">ReadWriteWeb</a> in 2003. It started as a Radio UserLand project and grew into a leading tech publication, something which I'm personally proud of. </p>\n<p>He has a <a href=\"http://altplatform.org/2017/06/20/building-a-blogroll-in-2017/\">new blog</a> up and running. I've added it to my <a href=\"http://scripting.com/river.html\">personal river</a> here on Scripting News. He asks about where the blogrolls have gone, a topic I <a href=\"http://scripting.com/2017/06/18.html#a110612\">wrote about</a> a couple of days ago. Richard would certainly be in my blogroll.</p>\n<p>Maybe the subscription list <a href=\"http://scripting.com/2016/09/23/otherBlogsLikeScriptingNews.html\">for</a> my <a href=\"http://bloggers.scripting.com/\">blogger's river</a> would make a good start for my blogroll, or vice versa? Something we didn't do in the first iteration is make our rivers public. Nowadays I'm doing that routinely. A few examples are in the left sidebar here on <a href=\"http://scripting.com/\">Scripting News</a>. </p>\n<p>Richard has turned to <a href=\"https://indieweb.org/\">IndieWeb</a> for the latest on open web tech. That's fine, but you have to look elsewhere too, because as he's discovered, they only embrace part of the open web. It's too bad they chose such an inclusive name, but have an exclusive approach. For example, they have avoided <a href=\"http://cyber.law.harvard.edu/rss/rss.html\">RSS</a>, for reasons I'm sure I don't understand (I've listened, so no need to repeat the reasoning). We need all the advantages we can get because there are <a href=\"http://scripting.com/2017/06/18.html#a090658\">serious</a> <a href=\"http://scripting.com/2016/10/03/turnsOutLessFacebookIsOk.html\">headwinds</a> these days for blogging. RSS is serious open web technology. To not build on it is unthinkable, for me at least. </p>\n<p>Re integration between writing and reading, another topic of interest to Richard, all my rivers <a href=\"http://scripting.com/images/2017/06/21/postingFromARiver.png\">hook</a> into <a href=\"http://radio3.io/\">Radio3</a>, which is my latest <a href=\"http://scripting.com/links.html\">linkblogging</a> tool. For reading, I encouraged Richard to look at <a href=\"http://this.how/electricRiver\">Electric River</a>, it's the closest to what Radio UserLand did with aggregation in 2002. It runs on your Mac desktop, as the original did. When he wants to go all-in with rivers, nothing can take the place of <a href=\"https://github.com/scripting/river5\">River5</a>, which is getting both modular and deep. I'm doing more work on that. Rivers have not finished evolving as far as I'm concerned. </p>\n",
|
||||
"pubDate": "Wed, 21 Jun 2017 10:29:51 GMT",
|
||||
"guid": "http://scripting.com/2017/06/21.html#a060651",
|
||||
"source:outline": {
|
||||
"text": "An old friend: Richard MacManus",
|
||||
"created": "Wed, 21 Jun 2017 10:29:51 GMT",
|
||||
"type": "outline",
|
||||
"subs": [
|
||||
{
|
||||
"text": "Richard is one of the old school bloggers. He started <a href=\"https://web.archive.org/web/20031014183603/http://readwriteweb.com\">ReadWriteWeb</a> in 2003. It started as a Radio UserLand project and grew into a leading tech publication, something which I'm personally proud of. ",
|
||||
"created": "Wed, 21 Jun 2017 10:33:59 GMT",
|
||||
"image": "http://scripting.com/2016/03/10/clown.png",
|
||||
"permalink": "http://scripting.com/2017/06/21.html#a060659"
|
||||
},
|
||||
{
|
||||
"text": "He has a <a href=\"http://altplatform.org/2017/06/20/building-a-blogroll-in-2017/\">new blog</a> up and running. I've added it to my <a href=\"http://scripting.com/river.html\">personal river</a> here on Scripting News. He asks about where the blogrolls have gone, a topic I <a href=\"http://scripting.com/2017/06/18.html#a110612\">wrote about</a> a couple of days ago. Richard would certainly be in my blogroll.",
|
||||
"created": "Wed, 21 Jun 2017 10:25:16 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/21.html#a060616"
|
||||
},
|
||||
{
|
||||
"text": "Maybe the subscription list <a href=\"http://scripting.com/2016/09/23/otherBlogsLikeScriptingNews.html\">for</a> my <a href=\"http://bloggers.scripting.com/\">blogger's river</a> would make a good start for my blogroll, or vice versa? Something we didn't do in the first iteration is make our rivers public. Nowadays I'm doing that routinely. A few examples are in the left sidebar here on \"Scripting News\". ",
|
||||
"created": "Wed, 21 Jun 2017 10:40:31 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/21.html#a060631"
|
||||
},
|
||||
{
|
||||
"text": "Richard has turned to <a href=\"https://indieweb.org/\">IndieWeb</a> for the latest on open web tech. That's fine, but you have to look elsewhere too, because as he's discovered, they only embrace part of the open web. It's too bad they chose such an inclusive name, but have an exclusive approach. For example, they have avoided \"RSS\", for reasons I'm sure I don't understand (I've listened, so no need to repeat the reasoning). We need all the advantages we can get because there are <a href=\"http://scripting.com/2017/06/18.html#a090658\">serious</a> <a href=\"http://scripting.com/2016/10/03/turnsOutLessFacebookIsOk.html\">headwinds</a> these days for blogging. RSS is serious open web technology. To not build on it is unthinkable, for me at least. ",
|
||||
"created": "Wed, 21 Jun 2017 10:30:33 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/21.html#a060633"
|
||||
},
|
||||
{
|
||||
"text": "Re integration between writing and reading, another topic of interest to Richard, all my rivers <a href=\"http://scripting.com/images/2017/06/21/postingFromARiver.png\">hook</a> into \"Radio3\", which is my latest <a href=\"http://scripting.com/links.html\">linkblogging</a> tool. For reading, I encouraged Richard to look at \"Electric River\", it's the closest to what Radio UserLand did with aggregation in 2002. It runs on your Mac desktop, as the original did. When he wants to go all-in with rivers, nothing can take the place of \"River5\", which is getting both modular and deep. I'm doing more work on that. Rivers have not finished evolving as far as I'm concerned. ",
|
||||
"created": "Wed, 21 Jun 2017 10:32:27 GMT",
|
||||
"permalink": "http://scripting.com/2017/06/21.html#a060627"
|
||||
}
|
||||
],
|
||||
"permalink": "http://scripting.com/2017/06/21.html#a060651"
|
||||
}
|
||||
},
|
||||
{
|
||||
"link": "http://scripting.com/2017/06/20.html#a100647",
|
||||
"description": "Anyone want to blog-debate about XML vs JSON? I've spent years using both, I think I have an objective view of the strengths of each. Imho, they are almost the same thing. XML has attributes and values, and that does make it more complex. Slightly. But you don't have to use the extra features. Look at <a href=\"http://dev.opml.org/spec2.html\">OPML</a> for an idea of a simple very JSON-like application of XML. Beyond that, there's really no difference. If you disagree, write a post, link to this and send me the link. I will read what you wrote, and respond, on <a href=\"http://scripting.com/\">my blog</a>, if I have something to say. There's been so much bullshit flying around. I'd like to cut through that. ",
|
||||
"pubDate": "Wed, 21 Jun 2017 02:56:47 GMT",
|
||||
"guid": "http://scripting.com/2017/06/20.html#a100647",
|
||||
"source:outline": {
|
||||
"text": "Anyone want to blog-debate about XML vs JSON? I've spent years using both, I think I have an objective view of the strengths of each. Imho, they are almost the same thing. XML has attributes and values, and that does make it more complex. Slightly. But you don't have to use the extra features. Look at \"OPML\" for an idea of a simple very JSON-like application of XML. Beyond that, there's really no difference. If you disagree, write a post, link to this and send me the link. I will read what you wrote, and respond, on <a href=\"http://scripting.com/\">my blog</a>, if I have something to say. There's been so much bullshit flying around. I'd like to cut through that. ",
|
||||
"created": "Wed, 21 Jun 2017 02:56:47 GMT",
|
||||
"type": "outline",
|
||||
"image": "http://scripting.com/images/2017/06/20/penny.png",
|
||||
"permalink": "http://scripting.com/2017/06/20.html#a100647"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue