Welcome to TiddlyWiki created by Jeremy Ruston, Copyright © 2007 UnaMesa Association
mmmm. Buffet!
Buffet, I say.
Peppermint Pattie to the rescue
Fingers crossed for Garibaldi
Back @ work in Limerick after Blogtalk, must do slides for CreativeCamp on Sat
A big overly dramatic high-five for @johnbreslin, and all the guys who organized #blogtalk2008 My brain needs a couple of days off.
@mathemagenic missed you at #blogtalk2008 http://2008.blogtalk.net
#blogtalk taught me as much in the hallways and around lunch tables as in the Tuesday session yesterday.
FasterFuture BlogTalk 2008 impressions and takeaways: I was lucky enough to have my pape.. http://tinyurl.com/2slx9r
#blogtalk "A lot of the people at the workshop were intimidated by the stuff in your backpack. Then you have that American accent."
@SabrinaDent Do. It would be in keeping with a talk Mark Bernstein gave at BlogTalk: "Neo victorian values in blogging" - a steam punk vibe.
@SabrinaDent It was the highlight of blogtalk to be honest. I would love to hear that talk again. The slides he used were beautiful...
Recomendaba en la BlogTalk la conferencia de Guy Kawasaki en el Xerox Parc. http://tinyurl.com/2vv63e
food for #BlogTalk. Windows and antibiotics for games...I burn case .us/bg4rn
I wish I had mentioned StumbleUpon at BlogTalk. My fave social media site. Sent me 383 hits to one url this morning ..
Still telling everyone about blogtalk2008
uploaded blogtalk photos on pix.ie http://url.ie/9yd and flickr http://url.ie/9yc look for the mac air boys
Ben Ward's WebCampSNP video: http://www.viddler.com/steph/videos/37 #blogtalk2008
@ccmehil It threw an error for me when I tried to view BlogTalk 2008 posts on my iPod
BlogTalk... need a new how to sew Wild your interesting nap and continuing back from urplecar this:
@Jestertunes - Holy crap... you've got a show too? I really AM the only one without a BlogTalk Radio Show! When are you on?
@Jestertunes - Wednesday?! Well then... looks like I am going to have to just leave my computer on BlogTalk Radio all week then!
Both of today's BlogTalk & TalkShoe shows are on the players. Go to http://www.wdslibrary.com and clink the WhatsNewToday link.
Dust settling after BlogTalk / RippleRap excitement; now planning the big move down to the first floor. Much doodling.
Setting a password ensures that you are the only person able to [[share notes|Share notes]] under [[your username|About your username]].
Whether or not you choose to [[share your notes|Share notes]] with others, all of the content you create will have your username marked against it. If you do choose to [[share your notes|Share notes]], your username will be used to let people know who your notes came from.
We recommend that you use CamelCase and the convention {{{FirstnameLastname}}}. That way your name becomes a link to a tiddler that can contain information about you.
{{layoutTable{
|''Name'' |''Password''|
|<<option txtUserName>> |<<ripplerapAccountPassword>> |
|<<MakeNotesControl sharing>> Share my notes|
|>|<<ripplerapAccountButton signup>>|
}}}
/***
|''Name:''|AccountManagerPlugin|
|''Description:''|Create a tiddlylink pragramtically|
|''Author:''|PhilHawksworth|
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/contributors/PhilHawksworth/plugins/AccountManagerPlugin.js |
|''Version:''|0.0.1|
|''Date:''|Dec 03, 2007|
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]] |
|''~CoreVersion:''|2.2|
Usage:
<<accountManager TiddlerToDisplayIfSignedIn TiddlerToDisplayIfNotSignedIn>>
***/
//{{{
if(!version.extensions.AccountManagerPlugin) {
version.extensions.AccountManagerPlugin = {installed:true};
config.macros.accountManager = {};
config.macros.accountManager.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
if(params.length < 2) {
return;
}
var ps = [];
var ready = config.options['chkRipplerapReadyToUse'+config.options.txtUserName];
if(ready) {
ps.push(params[0]);
config.macros.tiddler.handler(place,'tiddler',ps,wikifier,ps.join(','),tiddler);
if(rssSynchronizer && config.options.chkRipplerapShare) {
rssSynchronizer.makeRequest();
}
}
else {
ps.push(params[1]);
config.macros.tiddler.handler(place,'tiddler',ps,wikifier,ps.join(','),tiddler);
}
};
} //# end of 'install only once'
//}}}
{{vevent{{{time{<<dtstart rr_session_starttime '0hh:0mm'>> - <<dtend rr_session_endtime '0hh:0mm'>> }}} {{title summary{<<view title link>>}}}}}}
<<LinkMaker type:text display:modifier linkto:title >>
/***
|''Name:''|AgendaTrackPlugin|
|''Description:''|Helpers for RippleRap Agenda Track Items|
|''Author:''|PaulDowney (psd (at) osmosoft (dot) com)|
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/verticals/ripplerap/plugins/AgendaTrackPlugin.js |
|''Version:''|0.1|
|''License:''|[[BSD open source license]]|
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''~CoreVersion:''|2.2|
List related sessions for a track:
{{{
<<agendaTrackSessions>>
}}}
List tracks as tabs:
{{{
<<agendaTrackTabs>>
}}}
***/
//{{{
if(!version.extensions.AgendaTrack) {
version.extensions.AgendaTrack = {installed:true};
config.macros.AgendaTrackTabs = {};
config.macros.AgendaTrackTabs.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
var tracks = store.filterTiddlers("[tag[track]]");
var text = '<<tabs txtAgendaTab ';
for (var i=0;i<tracks.length;i++) {
s = ' "' + tracks[i].title + '"';
text = text + s + s + s;
}
text = text + '>>';
wikify(text,place);
};
config.macros.AgendaTrackSessions= {};
config.macros.AgendaTrackSessions.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
var track = store.getValue(tiddler,'rr_session_tag');
var text = "<<listRelated tag:" + track
+ " filter:[tag[" + track + "]][sort[+rr_session_starttime]]"
+ " hrel:raps template:AgendaItemsTemplate"
+ " subtemplate:AgendaSubItemsTemplate>>";
wikify(text,place);
};
config.macros.Speaker= {};
config.macros.Speaker.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
var co = store.getValue(tiddler,'speaker_co');
var text = "[img["+ store.getValue(tiddler,'speaker_img') + "]]"
+ "<html><a class='fn url' href='" + store.getValue(tiddler,'speaker_uri') + "'>"
+ tiddler.title
+ "</a></html>"
+ " " + (co?co:"");
wikify(text,place);
};
config.macros.SpeakerSession= {};
config.macros.SpeakerSession.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
var tagged = store.getTaggedTiddlers("session");
// search for sessions where speaker list contains speaker
// TBD: there must be a better way of doing this!
var sess = [];
for(var t=0; t<tagged.length; t++) {
var speakers = store.getValue(tagged[t],'rr_session_speaker');
if (speakers) {
var slist = speakers.split(/\s*,\s*/);
for(var s=0; s<slist.length; s++) {
if (slist[s].trim() == tiddler.title) {
sess.push(tagged[t].title);
}
}
}
}
var text = (sess.length ? "*[[" + sess.join("]]\n*[[") + "]]" : "")
+ "\n<html><i>Taken from: <a href='" + store.getValue(tiddler,'speaker_bio', '') + "'>"
+ store.getValue(tiddler,'speaker_bio', '') + "</a></i></html>";
wikify(text,place);
};
} //# end of 'install only once'
//}}}
<<Speaker>> is a mobile web pioneer and a researcher on identity and reputation in social networks at University College London. Ajit is founder and CEO of Futuretext publishing, and his latest book was entitled "Mobile Web 2.0". Ajit is also a member of the RSA and of the web2.0 workgroup. Currently, he plays an advisory role to a number of mobile startups in the UK and in Scandinavia.
<<SpeakerSession>>
<<Speaker>> Consumer Insights are the most important factors associated with effective product development in the packaged goods industry today. Qualitative research methods are well suited to understand the consumer, most importantly needs, dreams, desires and the feelings and provides the inspiration to drive marketers to develop relevant products. This paper explains a new approach to qualitative online research, where consumers and clients come together in a co-creation process online. A total of 4 dimensions of co-creation between clients, agencies and consumers will be shown. The foundation of this study is a recent collaborative project conducted by Moët Hennessy and Dialego: Understanding cocktail drinking in France.
<<SpeakerSession>>
<<Speaker>>
<<SpeakerSession>>
<<Speaker>> The aim of my research is to examine the construction of self in weblogs devoted to dieting as emerging through body regimes. The rhythm of dieting and the rhythm of blogging overlap with each other as everyday life organizing and self maintaining routines. Self-monitoring is combined with self-branding (presenting oneself as an attractive author) within shared practices of the community of dieting women.
The material used in the research will be a selection of Polish weblogs about dieting existing as a part of a very popular thematic portal Dieta.pl. They will be looked upon within a framework of theories on autobiography, the everyday, construction of identity, body in culture and feminist cultural studies of science and technology.
The focus of my research will not be weblogs as text, but rather blogging as cultural practice entangled in its media, technology and society context. The main questions concern the functions of dieting women's blogging: what are the social benefits of running a weblog in this particular space? By what means is the self constructed on these weblogs? How weblogs as internet environment shape dieting practices as compared to discussion fora and how is their engine appropriated to fit their users' needs? How these practices fit into the everyday? On the methodological level, I want to argue that close reading of online text in the context of cultural practices can be itself a form of participatory observation and therefore can be concerned a valid form of research within the anthropology of the internet.
<<SpeakerSession>>
<<Speaker>> Nowadays, we are experiencing the commoditisation of social networking platforms. There are trends towards integrating both content- and contact-oriented platforms. However, social networks remain as data silos in relation to each other. This contribution proposes an architecture for distributed social networking. Based on the notion of distributed user-centric identity, our proposal extends this by attaching profile information. It also bridges the gap between distributed identity and distributed publishing capabilities.
<<SpeakerSession>>
//{{{
backstage.init_old = backstage.init;
backstage.init = function() {
var s = '<<newTiddler label:"new track" template:TrackEditTemplate tag:"track" text:{{store.getTiddlerText("TrackText")}} title:"New Track">>'
+ '<<newTiddler label:"new session" template:SessionEditTemplate tag:"session" text:"" title:"New Session">>';
this.init_old.apply(this, arguments);
wikify(s, document.getElementById("backstageToolbar"));
};
//}}}
/***
|''Name:''|BackstageTiddlersPlugin|
|''Description:''|Adds a backstage panel allowing easy access to all tiddlers|
|''Author:''|JeremyRuston|
|''Source:''|http://www.osmosoft.com/#BackstageTiddlersPlugin |
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/contributors/JeremyRuston/plugins/BackstageTiddlersPlugin.js |
|''Version:''|0.0.1|
|''Date:''|Feb 28, 2008|
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''License:''|[[BSD License|http://www.opensource.org/licenses/bsd-license.php]] |
|''~CoreVersion:''|2.3|
***/
//{{{
if(!version.extensions.BackstageTiddlersPlugin) {
version.extensions.BackstageTiddlersPlugin = {installed:true};
config.tasks.tiddlers = {
text: "tiddlers",
tooltip: "Access the raw tiddlers",
content: "<<tabs txtMainTab 'Timeline' 'Timeline' TabTimeline 'All' 'All tiddlers' TabAll 'Tags' 'All tags' TabTags 'More' 'More lists' TabMore>>"};
config.backstageTasks.push("tiddlers");
} //# end of 'install only once'
//}}}
<<Speaker>> In modern electoral campaigns all over the world, Internet has turned into one more tool for the parties and candidates. After the consolidation of weblogs as interactive narratives and producers, audiovisual formats are gaining ground on the Web. Videos are spreading all over the Internet and establishing themselves as a new medium for political propaganda inside social media, with tools so powerful like YouTube. This article demonstrates how video is emerging as a vehicle for promoting the political process into the Spanish blogosphere, and how political videos have a special way of travelling around the blogs.
This investigation proceeds in two stages: on one hand we are going to examine how this audiovisual formats have enjoyed an enormous amount of attention in blogs during the Spanish pre-electoral campaing for the elections of March 2008. On the other hand, this article tries to investigate the social impact of this phenomenon using data from a content analysis of the blog discussion related to this videos centered on the most popular Spanish political blogs. Also, we study when the audiovisual political messages (made by politicians or by users) "born" and "die" on the Web and with what kind of rules they do.
Since the beginning of 2007, Spanish parties are using video on their pages or on YouTube, not only to create states of opinion to a sector of the population that surfs the Internet, but to gain and maintain political and media attention and to wake up the political apathy of the young people. Sometimes popular contests had been the source of inspiration for creating videos that pretend to ridiculize the adversary. For instance, we can see the video of the Socialistic Youth to promote the subject of Education for the Citizenship. Paradoxically, the slogan of this polemic video is: "For the equality, for the coexistence: Education for the Citizenship YES".
We can also see audiovisual formats used to sell proper merits of the candidates like "Zapatero" last video distributed on Internet called "Con Z de Zapatero" and the engraving for Rajoy owing to the National Holiday. Both parties have started a war of videos that will take place up to the general elections of March. Both know that traditional rallies keep on being necessary, nevertheless, every time they give more importance to the new technologies, that's why videos are playing an essential role in this electoral campaign.
Our methodology to describe that role begins with a selection of ones of the most important Spanish politicians blogs. According several ranking tools, we collect web sites like Escolar, Periodistas21, Eurogaceta, Internet Política and others. In our sample we gathered different kind of blogs, made by journalists, teachers, politicians and just users of the Web. With this sample of blogs, we get the most popular tags in the political conversations around the audiovisual messages selected.
After that, we choose too a sample of videos made by the most important Spanish parties (PSOE and PP), we tagged their contents and we start to follow how people (social media) use these messages. In addition, the conversations are studied with tools designed for tracking the buzz, like Technorati, Google Trends, Meneame (the Spanish version of Digg) or YouTube. Our aim is not to value the efficiency of the audiovisual political campaigns in the Web, but we want to track the type of tour that realize the political messages in the blogs. And to obtain this kind of data could be a very interesting information for people which are working designing political campaigns for the social media in Internet.
Since Joe Trippi started a "political campaign 2.0" for Howard Dean in USA, we have a lot of examples about how politicians want to make profit in the social networks. Virtual worlds like Second Life or networks like Facebook are just one of the platforms which politicians want to explore. And in a World Live Web everytime more "visual", the audiovisual political wars are an evident reality, in Spain too.
Often, the aim of these messages is to obtain more visibility in the mass media, but at the same time the result in the social media might be of unexpected consequences and even, it might turn in opposition to the own politicians which designed the message. Political parties begin to measure the potential of the social nets, but these "audiovisual wars" in the Web are still a part of a phase of experimentation.
What kind of criteria follow the success for the visibility of the political messages in the Web? We are talking about a kind of collective social credibility? Are the social media able to identify the aims of some political messages? Are the users "trained" to make good spaces for the political debate? Do the institutional political messages arrive to these political spaces? Spanish blogosphere can show us the answers to these questions if we observe its behavior during a political campaign.
<<SpeakerSession>>
<<Speaker>> is a web developer at [[Yahoo!|http://uk.yahoo.com/]] in London and an administrator in the [[microformats|http://microformats.org/]] community. By day he evangelises microformats adoption to any team who will listen and is responsible for adding a gigantic deployment of the [[hListing|http://microformats.org/wiki/hlisting]] format to price comparison site [[Kelkoo|http://www.kelkoo.com/]]. Ben took an active interest in microformats whilst studying Computation at the University of Manchester, and became a community admin last year. He is involved in the development of new formats, liaison between communities to improve the accessibility of microformats, and is an active editor of the microformats documentation.
<<SpeakerSession>>
<<Speaker>> grew up in Lancaster County, PA. He graduated with a BS in international affairs from the USAF Academy, and instructed in both the Northrup T-38 Talon and Lockheed C-141 Starlifter before spending several years as an air staff planner. He now lives in Cashel, County Tipperary and he delivers third-level computing and multimedia"" coursey to students enrolled at the [[Tipperary Institute|http://www.tippinst.ie/]]. Bernie writes the "Inside View" column for the [[Irish Examiner|http://www.examiner.ie/]] every Friday and blogs at [[irish.typepad.com|http://irish.typepad.com]]. He likes running long distances when fit and reading history more than watching television. His single largest expense involves feeding his telecommunications providers.
<<SpeakerSession>>
<<Speaker>> works as an engineer and product developer with [[NewBay|http://www.newbay.com/]] in the area of Mobile Web 2.0. He is co-editor of the [[Atom Publishing Protocol|http://bitworking.org/projects/atom/]], and is editor of the [[HTTPLR|http://www.dehora.net/journal/2005/03/httplr_draft01_published_some_background_some_futures.html]] reliable messaging specification. Bill has a strong interest in using Internet standards, open source and open formats like [[Atom|http://en.wikipedia.org/wiki/Atom_%28standard%29]], [[Atom Protocol|http://bitworking.org/projects/atom/]], [[REST|http://en.wikipedia.org/wiki/REST]], [[XML|http://www.w3.org/XML/]], [[ODF|http://en.wikipedia.org/wiki/OpenDocument]], [[Microformats|http://www.mircroformats.org/]], [[RDF|http://www.w3.org/RDF/]], [[XMPP|http://www.jabber.org/]], [[HTTP|http://www.w3.org/Protocols/]], and platforms and languages like [[LAMP|http://en.wikipedia.org/wiki/LAMP]], [[Java|http://java.sun.com/]], [[Python|http://www.python.org/]] and [[Ruby|http://www.ruby-lang.org/]] to economically solve both large- and small-scale integration and content management problems. In the past, he has worked on messaging systems, document management, legislative systems, web servers, ~CMSes, n-way integrations, technology research, client apps, event based systems, and company evaluation for both the government and private sectors. Bill also served on the [[W3C RDF Working Group|http://www.w3.org/2001/sw/RDFCore/]], and he has a long standing interest in applied artificial intelligence, mainly around the topics of machine learning, software agents and the semantic web.
<<SpeakerSession>>
{{blog_item{
{{title{
<<LinkMaker type:text display:modifier linkto:url>>}}}{{date{
<<view created date 'MMM DD, 0hh:0mm'>>}}}{{text{
<<view text>>}}}}}}
<html><a href="http://2008.blogtalk.net/" title="BlogTalk 2008 - The 5th International Conference on Social Software - Cork, Ireland - 2nd to 4th March 2008"><img src="http://2008.blogtalk.net/files/blogtalk2008_big.png" title="I'm going to BlogTalk 2008 in Cork!" alt="I'm going to BlogTalk 2008 in Cork!" border="0" width="400" height="134"/></a></html> [[BlogTalk 2008|http://2008.blogtalk.net]] is the 5th in a series of international conferences on social software.
{{description{These are all the [[Twitter|http://www.twitter.com]] updates mentioning ~BlogTalk we found using the rather nifty [[Terraminds|http://terraminds.com/]] Twitter Search tool. Terraminds updates its database every 15 minutes, so that's how often we refreshed this page. Now that the conference is over, we have frozen this page.}}}
{{twitterStream{<<Microblog Terraminds_BlogTalk reflect all avatars makeTiddlers TwitterItemsTemplate>>}}}
{{description{These are what we've found searching [[Technorati|http://search.technorati.com]] for blog posts tagged with the word "~BlogTalk". We're filtering for blogs with "a little" [[authority|http://technorati.com/weblog/2007/05/354.html]] (at least one link to them). We refreshed this page every 15 minutes, but now theat the conferenc is finished we have frozen the page.}}}
{{twitterStream{<<Microblog Technorati_BlogTalk reflect all null makeTiddlers BlogItemsTemplate>>}}}
|''Description:''|Blogtalk RippleRap RSS download session root uri|
|''Type:''|rss|
|''URL:''|http://ripplerap.com/BlogTalk/feeds |
|''Description:''|Blogtalk RippleRap RSS agenda updates feed|
|''Type:''|rss|
|''URL:''|http://www.ripplerap.com/BlogTalk/feeds/updates.xml |
|''Description:''|Blogtalk RippleRap RSS user upload root uri|
|''Type:''|rss|
|''URL:''|https://www.ripplerap.com/BlogTalk/users |
<<Speaker>> The use of social software in enterprise (business) contexts - the so-called "Enterprise 2.0" (~McAfee) is an emerging phenomenon. Inspired by the various uses of social software tools "out in the wild", companies are now building social software tools for customers (and for their own use), addressing the main concerns (confidentiality, security) and harvesting the benefits.
The current paper proposal is aimed at uncovering some of the social practices constructed around social software tools built and used internally by IBM - a company with a long lived collaboration culture and extensive experience in building collaboration tools.
<<SpeakerSession>>
/***
|''Name:''|BrowserPlugin|
|''Description:''|Displays text conditionally depending on browser characteristics|
|''Author:''|JeremyRuston|
|''Source:''|http://www.osmosoft.com/#BrowserPlugin |
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/contributors/JeremyRuston/plugins/BrowserPlugin.js |
|''Version:''|0.0.1|
|''Date:''|Dec 3, 2006|
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''License:''|[[BSD License|http://www.opensource.org/licenses/bsd-license.php]] |
|''~CoreVersion:''|2.2|
BrowserPlugin allows a chunk of text to be displayed depending on the current browser:
{{{
<<browser is Gecko>>
Some text that is only displayed if the current browser is Firefox
>>
<<browser not IE>>
Meanwhile this is only displayed if the browser is not Internet Explorer
>>
}}}
The complete list of browser identifiers is:
|!Identifier |!Description |
|IE |Internet Explorer |
|Gecko |Gecko-based browser like Firefox or Camino |
|Safari |Apple's webkit browser |
|Opera |Opera |
|Linux |Any browser running on Linux |
|Unix |Any browser running on Unix |
|Mac |Any browser running on the Mac |
|Windows |Any browser running on Windows |
***/
//{{{
if(!version.extensions.BrowserPlugin) {
version.extensions.BrowserPlugin = {installed:true};
config.macros.browser = {
};
config.macros.browser.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
var matchState = true;
switch(params[0]) {
case "is":
matchState = true;
break;
case "not":
matchState = false;
break;
}
var browser = params[1];
var browserField = "is" + browser;
var isVisible = (browserField in config.browser) && (config.browser[browserField] == matchState);
var wrapper = isVisible ? place : createTiddlyElement(document.body,"div");
if(wikifier)
wikifier.subWikify(wrapper,">>");
if(!isVisible)
removeNode(wrapper)
};
} //# end of 'install only once'
//}}}
Demo of Microsoft Live Spaces, with a showcase of a bike ride against a map. Video showing the ride updates the map to show the position.
notes scraped from the [[backchannel|irc://irc.freenode.net/%23blogtalk]] [[archive|http://tuukka.iki.fi/tmp/blogtalk-2008-03-04]]:
15:42:38 apparebtly psd is not a fan of popfly. Who knew? :-)
15:43:49 Microsoft question "who's heard of popfly?" my hand goes up "wow! Popfly fans!" er NO!
15:44:29 is there openid bridge to liveID?
15:45:27 the mentioned blog: http://blogs.msdn.com/martharotter/
15:46:39 very slow to load ... must be all those controls Martha has on there ;)
15:46:46 btw .. it doesn't work in Safari 3
15:46:53 the widgets thingies..
15:47:12 http://dev.live.com/
15:49:44 so .. it's a really cool CMS?
15:52:54 I'll be asking about standards and interoperability :P
15:53:14 which is of course the first horifying gut feeling whenever you see MS hype a product
15:53:46 Is Contoso the new Northwind?
16:02:27 anyone here familiar with widet customization in wordpress?
16:02:46 need to adapt the names of "standard" widgets and am not sure where they are stored
16:02:59 JanSchmidt: oh...
16:03:15 many of the my ou can simply change the name that is displayed in the sidebar by clicking on the blue box top right
16:03:21 is that the name you want to adapt?
16:03:40 jep, but there are a couple of widgets that don't hagve the blue box :)
16:03:57 aha
16:04:00 that is: the name is "hardcoded" somewhere.. :)
16:04:03 pester those who have written them?
16:04:06 yeah
16:04:14 donncha should be able to help you ;-)
16:04:21 ok cool :)
CamelCase describes a word containing an upper case letter. The first word in this paragraph is written in camel case. If you write a word in camel case in a TiddlyWiki, it creates a link. Click on the link, and you'll find an empty tiddler ready to populate with content. It's a quick way of writing linked content. The other way of creating links is by using [[Double square brackets]].
Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #fdb
/* Magenta */
SecondaryBrightest: #FD85AF
SecondaryBright: #d71f85
SecondaryDark: #BA005F
SecondaryDarkest:#850055
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
<!--{{{-->
<div class="VanillaView Speaker">
<div class='toolbar' macro='toolbar closeTiddler closeOthers +editTiddler > fields syncing permalink references jump'></div>
<div class='title' macro='view title'></div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<span class="vcard">
<div class='viewer' macro='view text wikified'></div>
</span>
<div class='tagClear'></div>
</div>
<!--}}}-->
/***
|''Name:''|ConditionalDisplayPlugin|
|''Description:''|Display the contents of different tiddlers depending on the value of a given variable |
|''Author:''|PhilHawksworth|
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/contributors/PhilHawksworth/plugins/ConditionalDisplayPlugin.js |
|''Version:''|0.0.1|
|''Date:''|Feb 28, 2008|
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]] |
|''~CoreVersion:''|2.3|
Usage:
<<conditionalDisplay testSubject testValue ifTrueDisplayThisTiddler ifFalseDisplayThisTiddler>>
***/
//{{{
if(!version.extensions.ConditionalDisplayPlugin) {
version.extensions.ConditionalDisplayPlugin = {installed:true};
config.macros.conditionalDisplay = {};
config.macros.conditionalDisplay.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
if(params.length < 3) {
return;
}
var testSubject = params[0];
var testValue = params[1];
var ifTrueDisplay = params[2];
var ifFalseDisplay = params[3];
var ps = [];
if(testSubject && eval(testSubject) == testValue ) {
ps.push(ifTrueDisplay);
config.macros.tiddler.handler(place,'tiddler',ps,wikifier,ps.join(','),tiddler);
}
else {
ps.push(ifFalseDisplay);
config.macros.tiddler.handler(place,'tiddler',ps,wikifier,ps.join(','),tiddler);
}
};
} //# end of 'install only once'
//}}}
http://2008.blogtalk.net/conferencedinner
<<Speaker>>
<<SpeakerSession>>
<<Speaker>> has been providing IT consultancy and outsourcing services since the early 1990s. As founder of [[Argolon Solutions|http://www.argolon.com/]], he advises in the areas of web for ~SMEs, blogging, social networking for business, and mobile technology adoption. In 2006, Conor and his team built a blog review service called [[LouderVoice|http://www.loudervoice.com/]]. ~LouderVoice provides tools to publish and aggregate reviews (using the hReview microformat) to and from blogs, microblogs, social networks, video sharing sites and mobile phones. Conor was one of the main driving forces behind the recent [[Paddy's Valley|http://www.paddysvalley.org/]] initiative, and he also established the local series of [[Cork OpenCoffee|http://corkopencoffee.org/]] meetups. In 2007, he served as editor for the Irish technology section of the [[blognation|http://www.blognation.com/]] site. Conor is a prolific blogger, authoring and contributing to [[a host of blogs|http://conoroneill.com/about/]].
<<SpeakerSession>>
<<Speaker>>
<<SpeakerSession>>
/***
|''Name:''|CryptoFunctionsPlugin|
|''Description:''|Support for cryptographic functions|
***/
//{{{
if(!version.extensions.CryptoFunctionsPlugin) {
version.extensions.CryptoFunctionsPlugin = {installed:true};
//--
//-- Crypto functions and associated conversion routines
//--
// Crypto 'namespace'
function Crypto() {}
// Convert a string to an array of big-endian 32-bit words
Crypto.strToBe32s = function(str)
{
var be=Array();
var len=Math.floor(str.length/4);
var i, j;
for(i=0, j=0; i<len; i++, j+=4) {
be[i]=((str.charCodeAt(j)&0xff) << 24)|((str.charCodeAt(j+1)&0xff) << 16)|((str.charCodeAt(j+2)&0xff) << 8)|(str.charCodeAt(j+3)&0xff);
}
while (j<str.length) {
be[j>>2] |= (str.charCodeAt(j)&0xff)<<(24-(j*8)%32);
j++;
}
return be;
};
// Convert an array of big-endian 32-bit words to a string
Crypto.be32sToStr = function(be)
{
var str='';
for(var i=0;i<be.length*32;i+=8)
str += String.fromCharCode((be[i>>5]>>>(24-i%32)) & 0xff);
return str;
};
// Convert an array of big-endian 32-bit words to a hex string
Crypto.be32sToHex = function(be)
{
var hex='0123456789ABCDEF';
var str='';
for(var i=0;i<be.length*4;i++)
str += hex.charAt((be[i>>2]>>((3-i%4)*8+4))&0xF) + hex.charAt((be[i>>2]>>((3-i%4)*8))&0xF);
return str;
};
// Return, in hex, the SHA-1 hash of a string
Crypto.hexSha1Str = function(str)
{
return Crypto.be32sToHex(Crypto.sha1Str(str));
};
// Return the SHA-1 hash of a string
Crypto.sha1Str = function(str)
{
return Crypto.sha1(Crypto.strToBe32s(str),str.length);
};
// Calculate the SHA-1 hash of an array of blen bytes of big-endian 32-bit words
Crypto.sha1 = function(x,blen)
{
// Add 32-bit integers, wrapping at 32 bits
function add32(a,b)
{
var lsw=(a&0xFFFF)+(b&0xFFFF);
var msw=(a>>16)+(b>>16)+(lsw>>16);
return (msw<<16)|(lsw&0xFFFF);
}
function AA(a,b,c,d,e)
{
b=(b>>>27)|(b<<5);
var lsw=(a&0xFFFF)+(b&0xFFFF)+(c&0xFFFF)+(d&0xFFFF)+(e&0xFFFF);
var msw=(a>>16)+(b>>16)+(c>>16)+(d>>16)+(e>>16)+(lsw>>16);
return (msw<<16)|(lsw&0xFFFF);
}
function RR(w,j)
{
var n=w[j-3]^w[j-8]^w[j-14]^w[j-16];
return (n>>>31)|(n<<1);
}
var len=blen*8;
x[len>>5] |= 0x80 << (24-len%32);
x[((len+64>>9)<<4)+15]=len;
var w=Array(80);
var k1=0x5A827999;
var k2=0x6ED9EBA1;
var k3=0x8F1BBCDC;
var k4=0xCA62C1D6;
var h0=0x67452301;
var h1=0xEFCDAB89;
var h2=0x98BADCFE;
var h3=0x10325476;
var h4=0xC3D2E1F0;
for(var i=0;i<x.length;i+=16) {
var j=0;
var t;
var a=h0;
var b=h1;
var c=h2;
var d=h3;
var e=h4;
while(j<16) {
w[j]=x[i+j];
t=AA(e,a,d^(b&(c^d)),w[j],k1);
e=d; d=c; c=(b>>>2)|(b<<30); b=a; a=t; j++;
}
while(j<20) {
w[j]=RR(w,j);
t=AA(e,a,d^(b&(c^d)),w[j],k1);
e=d; d=c; c=(b>>>2)|(b<<30); b=a; a=t; j++;
}
while(j<40) {
w[j]=RR(w,j);
t=AA(e,a,b^c^d,w[j],k2);
e=d; d=c; c=(b>>>2)|(b<<30); b=a; a=t; j++;
}
while(j<60) {
w[j]=RR(w,j);
t=AA(e,a,(b&c)|(d&(b|c)),w[j],k3);
e=d; d=c; c=(b>>>2)|(b<<30); b=a; a=t; j++;
}
while(j<80) {
w[j]=RR(w,j);
t=AA(e,a,b^c^d,w[j],k4);
e=d; d=c; c=(b>>>2)|(b<<30); b=a; a=t; j++;
}
h0=add32(h0,a);
h1=add32(h1,b);
h2=add32(h2,c);
h3=add32(h3,d);
h4=add32(h4,e);
}
return [h0,h1,h2,h3,h4];
};
}
//}}}
<<Speaker>> is a researcher, advocate and developer of Semantic Web technologies. He currently combines commercial work (through his own tiny company Semantic Web Vapourware Ltd., aka SpyPixel, and at Asemantics S.R.L.) with ongoing involvement in Web standards as a Visiting Fellow at the University of Bristol. Dan served for six years as a member of the W3C Technical Staff, and now brings over twelve years' experience of knowledge sharing technologies to his work on practical Semantic Web deployment.
Dan founded the Bristol University ILRT Semantic Web group in 1997, exploring RDF-based knowledge engineering issues from a digital library, Social Science and elearning perspective. Dan was a PI on the HARMONY multimedia metadata project, and played a leading role in IST-funded research at ILRT including early work on RDF quality labelling, thesaurus, query and rules in the DESIRE project. Dan was Technical Director of the MedCertain (EU Safer Internet) project, applying W3C RDF technology to problems of quality and trust in consumer-facing health/medical Web content.
<<SpeakerSession>>
<<Speaker>>
<<SpeakerSession>>
<<Speaker>> Reed's Law or Group Forming Network Theory as Dr David P Reed originally and rather modestly called it, is the mathematical explanation for the power of the network. As with all great ideas it's breathtakingly simple, easy to understand and enormously enlightening. This paper sets out to explain what Reed's Law describes and includes more recent understandings of the collaborative power of networks which I hope helps make sense of and gives context to the exponential. It also suggests that the multiple complex identities we are adopting in multiple communities are not necessarily a "Bad Thing". My contention is that the different modes of thought these actively encourage are to be welcomed when viewed in the context of unleashing the power of self-forming collaborative communities of interest and purpose.
<<SpeakerSession>>
<<Speaker>>
<<SpeakerSession>>
/***
|''Name:''|DeprecatedFunctionsPlugin|
|''Description:''|Support for deprecated functions removed from core|
***/
//{{{
if(!version.extensions.DeprecatedFunctionsPlugin) {
version.extensions.DeprecatedFunctionsPlugin = {installed:true};
//--
//-- Deprecated code
//--
// @Deprecated: Use createElementAndWikify and this.termRegExp instead
config.formatterHelpers.charFormatHelper = function(w)
{
w.subWikify(createTiddlyElement(w.output,this.element),this.terminator);
};
// @Deprecated: Use enclosedTextHelper and this.lookaheadRegExp instead
config.formatterHelpers.monospacedByLineHelper = function(w)
{
var lookaheadRegExp = new RegExp(this.lookahead,"mg");
lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = lookaheadRegExp.exec(w.source);
if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
var text = lookaheadMatch[1];
if(config.browser.isIE)
text = text.replace(/\n/g,"\r");
createTiddlyElement(w.output,"pre",null,null,text);
w.nextMatch = lookaheadRegExp.lastIndex;
}
};
// @Deprecated: Use <br> or <br /> instead of <<br>>
config.macros.br = {};
config.macros.br.handler = function(place)
{
createTiddlyElement(place,"br");
};
// Find an entry in an array. Returns the array index or null
// @Deprecated: Use indexOf instead
Array.prototype.find = function(item)
{
var i = this.indexOf(item);
return i == -1 ? null : i;
};
// Load a tiddler from an HTML DIV. The caller should make sure to later call Tiddler.changed()
// @Deprecated: Use store.getLoader().internalizeTiddler instead
Tiddler.prototype.loadFromDiv = function(divRef,title)
{
return store.getLoader().internalizeTiddler(store,this,title,divRef);
};
// Format the text for storage in an HTML DIV
// @Deprecated Use store.getSaver().externalizeTiddler instead.
Tiddler.prototype.saveToDiv = function()
{
return store.getSaver().externalizeTiddler(store,this);
};
// @Deprecated: Use store.allTiddlersAsHtml() instead
function allTiddlersAsHtml()
{
return store.allTiddlersAsHtml();
}
// @Deprecated: Use refreshPageTemplate instead
function applyPageTemplate(title)
{
refreshPageTemplate(title);
}
// @Deprecated: Use story.displayTiddlers instead
function displayTiddlers(srcElement,titles,template,unused1,unused2,animate,unused3)
{
story.displayTiddlers(srcElement,titles,template,animate);
}
// @Deprecated: Use story.displayTiddler instead
function displayTiddler(srcElement,title,template,unused1,unused2,animate,unused3)
{
story.displayTiddler(srcElement,title,template,animate);
}
// @Deprecated: Use functions on right hand side directly instead
var createTiddlerPopup = Popup.create;
var scrollToTiddlerPopup = Popup.show;
var hideTiddlerPopup = Popup.remove;
// @Deprecated: Use right hand side directly instead
var regexpBackSlashEn = new RegExp("\\\\n","mg");
var regexpBackSlash = new RegExp("\\\\","mg");
var regexpBackSlashEss = new RegExp("\\\\s","mg");
var regexpNewLine = new RegExp("\n","mg");
var regexpCarriageReturn = new RegExp("\r","mg");
}
//}}}
<!--{{{-->
<div class='discoveredNotes'>
<div class='toolbar' macro='toolbar +cancelTiddler'></div>
<div class='editor' macro='edit text'></div>
</div>
<!--}}}-->
<!--{{{-->
<div class='discoveredNotes'>
<div class='toolbar' macro='toolbar closeTiddler +editTiddler'></div>
<div class='title'>notes from <span macro='view modifier'></span></div>
<div class='viewer' macro='view text wikified'></div>
</div>
<!--}}}-->
<<Speaker>> is a software developer with [[Automattic Inc.|http://www.automattic.com/]], and he is one of the team behind the weblog site [[Wordpress.com|http://www.wordpress.com/]]. He is also lead programmer for the multi-user version of ~WordPress, "[[WordPress mu||http://mu.wordpress.org/]]". Donncha is originally from Cork City, and he is currently living with his family in the scenic town of Blarney, Co. Cork. He blogs regularly at both [[ocaoimh.ie|http://ocaoimh.ie/]] and [[blog.donncha.net|http://blog.donncha.net/]]. He is also a passionate photographer, and has a popular photo blog at [[inphotos.org|http://inphotos.org/]].
<<SpeakerSession>>
If you write words or sentences in TiddlyWiki that are surrounded by [[Double square brackets]], TiddlyWiki turns it into a link. If you double click this paragraph, you'll see how this has worked.
Once you've created the link, and then clicked 'done' to close the tiddler, you can click on the link, and you'll find an empty tiddler ready to populate with content. It's a quick way of writing linked content. The other way of creating links is by using CamelCase.
<!--{{{-->
<div class="VanillaEdit">
<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler deleteTiddler'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>
</div>
<!--}}}-->
<<Speaker>>
<<SpeakerSession>>
Three main aspects of writing the self as a cultural practice:
*Technology
*Means of identity construction
*Social context
Compares this to dieting, the daily regimes and public description of internal events. The site is "reflexive, counting, and constantly on watch", the sharing of updates is sufficient pressure to maintain the diet.
Identity of a diet blogger:
*Constructed through personal uses of technology at hand
*Built around specific subject set in a context of everyday life - temporary?
*Refers to other users but ti lesser extent than BBs - narcisistic?
*Refers to other online identities that may also be staged within the same thematic context
Gender and Race play in the Blogosphere
Research points people's preference of virtual identities many centuries old
Your notes... notes scraped from the [[backchannel|irc://irc.freenode.net/%23blogtalk]] [[archive|http://tuukka.iki.fi/tmp/blogtalk-2008-03-04]]:
10:44:39 this is hilarious - I am in Flickr tagging my 'profane' screenshots
10:44:55 ok
10:45:13 do what on the form?
10:45:22 sign lunch preferences
10:45:27 ACTION infers the rest of tommorris's photos are sacred...
10:45:52 my profane screenshots - http://www.flickr.com/photos/tommorris/tags/crashreport/
10:51:21 "Tom Morris doesn't have any photos tagged with crashreport."
10:53:22 hmm, does danbri know of Darth Vader or vice versa? either way, are they scared? http://www.flickr.com/photos/tommorris/2271647774/
10:53:50 danja: you need to change your safety settings - they are all profane, remember
10:54:53 ah
10:54:59 :darthVader :usedToBeKnownAs :anakinSkywalker .
10:55:21 :darthVader :fatherOf :lukeSkywalker
10:56:24 { ?f :usedToBeKnownAs :anakinSkywalker . ?f :fatherOf ?s . } => { [] :bestMovieQuoteEver "Luke, I am your father."@en . }
10:57:01 I think it loses something in the translation into N3 rules.
10:58:32 @tommorris: no one here, all out for coffee break :)
11:02:39 bunny_cork: just looking at ur flickr screenshots - you need http://del.icio.us/tommorris/stopirritatingme+facebook
11:24:03 will Nova Spivack's slides be available on slideshare?
11:24:51 @miladka: we try to get a copy to upload
11:25:13 Jan: great, thx
11:48:47 meta what?
11:57:57 Hello everybody!
11:58:13 hello andre
11:59:06 Hi Andre
11:59:16 hi there
11:59:21 <-- slightly stressed
11:59:52 dont worry bunny cloud is here
11:59:59 :-)
12:00:14 my main worry is "is the topic panel-worthy"
12:00:32 we can take very open questions on how social media is changing
12:00:45 we dont hvae to be limited if we find it too limiting
12:00:49 I've prepared 5-6 questions for the panel to play ball with :-)
12:00:57 okay excellent
12:01:48 topgold can talk about anything ;) he can handle any curveballs
12:02:15 hehe
''I'm having problems getting started, can you help?''
Sure, click [[here|Help]]!
''Who created ~RippleRap?''
A company called [[Osmosoft|http://www.osmosoft.com]] created ~RippleRap. Osmosoft is a small open source innovation company owned by [[BT|http://www.bt.com]].
''What's the relationship between BT and Osmosoft?''
If you're attending the conference, you might have seen that BT and Osmosoft are sharing a stand. We're very friendly, so come and say hi! Osmosoft was bought by BT in May 2007, and our remit is to support BT in understanding and adopting open source solutions in a sensible, responsible fashion. BT decided that the best way to go about doing this was to hire people who already had experience of running a successful open source project, and they therefore hired Jeremy Ruston (through the acquisition of his company, Osmosoft) because of his experience creating and running the open source ~TiddlyWiki project.
''What's ~RippleRap based on?''
~RippleRap is based on the popular open source product, TiddlyWiki. ~TiddlyWiki is a wiki packaged within a single html file, complete with all the content, the editing and saving functionality, search and tagging capabilities and much more. It can run locally from your hard drive (so it's great for taking notes or organising personal information) or on a server. It's very extensible; there are over 400 plugins developed by the ~TiddlyWiki community. Several new ~TiddlyWiki plugins have been developed and combined to create ~RippleRap.
~TiddlyWiki is a very well established and stable piece of software. However the new code that was created to support the development of ~RippleRap is relatively new and untested. It is released under a BSD licence, which means we cannot provide the software with any warranties. The full text of the BSD licence can be found on the [[Open Source Initiative web site|http://www.opensource.org/licenses/bsd-license.php]].
''How does ~RippleRap work?''
*The product at the heart of ~RippleRap is ~TiddlyWiki. This product includes all the functionality required to create, edit and save notes locally. ~TiddlyWiki can run on a server, but ~RippleRap isn't intended to be used in this way at ~BlogTalk.
*The sharing of notes with other delegates is done via RSS. When you've [[authorised sharing|Share notes]], ~TiddlyWiki creates an RSS feed that sends your notes to our server. The notes are combined with everyone else's notes on the server, and the aggregated notes are re-published as an RSS feed for your local copy of ~RippleRap. Once they're downloaded, they're stored locally and can be searched within your copy of ~RippleRap.
''Why are you doing this?''
BT recognises the importance of being a good citizen in the open source arena, and wants to play their part in sustaining and growing the ~TiddlyWiki community as a whole. The more people who take an interest in ~TiddlyWiki, the better it is for everyone involved, which is why the product is being showcased by BT at ~BlogTalk.
All the rights to the ~TiddlyWiki code have been passed to a not-for-profit foundation called [[UnaMesa|http://www.uamesa.org]], these rights are not owned by BT.
''Do you plan to do something similar at future conferences?''
~BlogTalk is the second conference where we're showcasing ~RippleRap; the first one was at [[Le Web 3|http://www.ripplerap.com/LeWeb3/]] in Paris in December 2007. We're continuing to develop the product, and are hoping that we'll also get some useful feedback and possibly code contributions from the open source community. The code and process are all open source anyway; anyone can take the product and improve it, and use it at future conferences if they wish.
It is likely that ~RippleRap will be showcased at future events, although none are planned at the time of writing.
''Can we learn more?''
More information is available on the Osmosoft website at [[http://www.osmosoft.com|http://www.osmosoft.com]] and the product page at [[http://www.ripplerap.com|http://www.ripplerap.com]].
And if you have any more questions while you're at the conference, just drop into the stall and we'll help you out!
{{description{These are what we've found searching [[Flickr|http://www.flickr.com/photos/tags/blogtalk]] for photos posts tagged with the word "~BlogTalk". We refreshed this page every 15 minutes, but it is now frozen}}}
{{FlickrStream{<<Microblog Flickr_BlogTalk reflect all null makeTiddlers FlickrItemsTemplate>>}}}
{{blog_item{<<view text raw>>}}}
TiddlyWiki supports all kinds of formatting options:
*You can create ''Bold'' text by enclosing it in pairs of single quotes:
{{{
''bold text''
}}}
*You can create ==Strikethrough== text by enclosing it in pairs of hyphens:
{{{
--strikethrough text--
}}}
*You can __Underline__ text by enclosing it in pairs of underscores:
{{{
__underlined text__
}}}
*You can create //Italic// text by enclosing it in pairs of forward slashes:
{{{
//italic text//
}}}
*You can create ^^superscript^^ text by enclosing it in pairs of carets:
{{{
^^superscript text^^
}}}
*You can create ~~subscript~~ text by enclosing it in pairs of tildes:
{{{
~~subscript text~~
}}}
*You can @@highlight text@@ by enclosing it in pairs of at-signs.
{{{
@@highlighted text@@
}}}
*You can also change many other CSS attributes by adding arguments to the highlight command. For example, you can change the text color to @@color:red;red@@ or give it a background-color of @@background-color:#0000FF;color:white;blue@@.
{{{
@@CSS attributes separated by semicolons;text@@
}}}
You can find out more about CSS from the excellent [[w3schools tutorial|http://w3schools.com/css/default.asp]].
*Finally, you can add new CSS classes to the Tiddlywiki so that you can style a number of items with the same CSS formatting. Simply add the new class to the StyleSheet [[ShadowTiddler|ShadowTiddlers]], such as:
{{{
.moveover{
margin-left:120px;
}
}}}
Then, when you want to use that CSS class, use the following formatting:
{{{
{{classname{text to be formatted}}}
}}}
{{moveover{So, for example, this paragraph has been formatted using the moveover CSS class.}}}
<<Speaker>>
<<SpeakerSession>>
<<Speaker>> Social bookmarking and tagging systems currently do not provide a uniform way to share and reuse tag data amongst users or communities. Although most popular Web 2.0 sites such as del.icio.us, ~Flickr or ~YouTube provide XML or ~JSON-based data using open ~APIs, there is no uniform structure or semantics to represent tag data.
We present a semantic model (called SCOT) which can be used to represent the structure of and relations between the tag data created in social tagging spaces. The SCOT model can provide a comprehensive set of information related to the process of social tagging. An associated website called int.ere.st helps users to enhance the sharing and exchange of tag data among people or between various online communities. int.ere.st provides interlinked semantic data using SCOT and the popular Semantic Web vocabularies FOAF, SIOC and SKOS. Also, the results of user contributions in the site provide a means to build social networks based on social tag data and their associated semantic relations.
<<SpeakerSession>>
sharing <<MakeNotesControl sharing>>
There are two ways to get help:
*You can and visit the BT / Osmosoft stall at ~BlogTalk - we'll be happy to help.
*We've tried to anticipate the main problems people will have; see if yours is addressed below.
!!Common problems
''I'm having trouble saving!''
The top tips are:
*When [[setup correctly|Setup_Instructions]] ~RippleRap will save your changes automatically. You should never use your browser's //File > Save As...// function.
*When saving for the first time, you may receive a warning saying that ~TiddlyWiki is trying to access your file system. This is necessary in order for the browser to save changes to the local file.
*If you wish to rename the file, save your changes first, then close the file, rename the file (but keep the .HTML extension) and re-open the file.
*We suggest you create a folder called backup in the same directory as your file, and then enable the backup functionality in the [[Advanced Options|AdvancedOptions]].
''I'm still having problems''
Certain browsers misbehave when running ~TiddlyWiki files. You can find a list of them (including fixes) on the [[TiddlyWiki website|http://tiddlywiki.com/#SaveChanges]]. Unfortunately these problems cannot be fixed by changing ~TiddlyWiki, but they can often be overcome with some simple browser configuration. ~TiddlyWiki generally works best on Firefox.
If you're still having problems, drop by our stall at ~Osmosoft and we'll help get you sorted.
''Note sharing isn't working''
When ~RippleRap is [[setup correctly|Setup_Instructions]], notes will be pulled down automatically and this process can take a few minutes depending on the content.
Alternatively, it might be that the conference wi-fi is down.
If you've checked the box, and you're sure the conference wi-fi is working, please come and visit us at the stall and we'll help get things moving for you.
''What happens if the conference wi-fi is down?''
If the conference wi-fi is down, the functionality that will still work is the ability to take notes and save these to your hard drive. When the connection comes back up, notes will be shared automatically (assuming you've enabled this functionality).
''How can I format my text?''
~RippleRap uses TiddlyWiki, which provides a [[simple convention for formatting|Formatting TiddlyWikis]].
Jon's notes explaining how sharing works appears here, together with links to the relevant code.
<<Speaker>> In the intersection between mobile Internet, social software and educational environments, Campus Móvil is the consequence of a piece of research more a business idea. The Campus Móvil startup project is a prototype of an on-line application via mobile devices for Spanish university community, with exclusive and transparent access with institutional email account. The staff is working at Stanford Human Computer Interaction Group (August / December 2007) and the launching in beta version has been planned for September 2008.
Campus Móvil is proposed to cover unsolved necessities in university community related with the lack of ubiquitous services and network access for numerous specific activities that those produced on campus and lecture rooms with personal computers.
The presentation will include the main ideas of the Campus Móvil business plan: the concept of the product, the virtues and faults of mobile Internet Spanish market; marketing plan, bibliography, and the architecture and the prototype of interface design in both mobile and regular websites.
<<SpeakerSession>>
/***
json.js
2008-02-14
Public Domain
No warranty expressed or implied. Use at your own risk.
This file has been superceded by http://www.JSON.org/json2.js
See http://www.JSON.org/js.html
This file adds these methods to JavaScript:
array.toJSONString(whitelist)
boolean.toJSONString()
date.toJSONString()
number.toJSONString()
object.toJSONString(whitelist)
string.toJSONString()
These methods produce a JSON text from a JavaScript value.
It must not contain any cyclical references. Illegal values
will be excluded.
The default conversion for dates is to an ISO string. You can
add a toJSONString method to any date object to get a different
representation.
The object and array methods can take an optional whitelist
argument. A whitelist is an array of strings. If it is provided,
keys in objects not found in the whitelist are excluded.
string.parseJSON(filter)
This method parses a JSON text to produce an object or
array. It can throw a SyntaxError exception.
The optional filter parameter is a function which can filter and
transform the results. It receives each of the keys and values, and
its return value is used instead of the original value. If it
returns what it received, then structure is not modified. If it
returns undefined then the member is deleted.
Example:
// Parse the text. If a key contains the string 'date' then
// convert the value to a date.
myData = text.parseJSON(function (key, value) {
return key.indexOf('date') >= 0 ? new Date(value) : value;
});
It is expected that these methods will formally become part of the
JavaScript Programming Language in the Fourth Edition of the
ECMAScript standard in 2008.
This file will break programs with improper for..in loops. See
http://yuiblog.com/blog/2006/09/26/for-in-intrigue/
This is a reference implementation. You are free to copy, modify, or
redistribute.
Use your own copy. It is extremely unwise to load untrusted third party
code into your pages.
***/
/*jslint evil: true */
/*members "\b", "\t", "\n", "\f", "\r", "\"", "\\", apply, charCodeAt,
floor, getUTCDate, getUTCFullYear, getUTCHours, getUTCMinutes,
getUTCMonth, getUTCSeconds, hasOwnProperty, join, length, parseJSON,
prototype, push, replace, test, toJSONString, toString
*/
// Augment the basic prototypes if they have not already been augmented.
if (!Object.prototype.toJSONString) {
Array.prototype.toJSONString = function (w) {
var a = [], // The array holding the partial texts.
i, // Loop counter.
l = this.length,
v; // The value to be stringified.
// For each value in this array...
for (i = 0; i < l; i += 1) {
v = this[i];
switch (typeof v) {
case 'object':
// Serialize a JavaScript object value. Treat objects thats lack the
// toJSONString method as null. Due to a specification error in ECMAScript,
// typeof null is 'object', so watch out for that case.
if (v !== null) {
a.push(ObjectToJSONString(v,w));
} else {
a.push('null');
}
break;
case 'string':
case 'number':
case 'boolean':
a.push(v.toJSONString());
break;
default:
a.push('null');
}
}
// Join all of the member texts together and wrap them in brackets.
return '[' + a.join(',') + ']';
};
Boolean.prototype.toJSONString = function () {
return String(this);
};
Date.prototype.toJSONString = function () {
// Eventually, this method will be based on the date.toISOString method.
function f(n) {
// Format integers to have at least two digits.
return n < 10 ? '0' + n : n;
}
return '"' + this.getUTCFullYear() + '-' +
f(this.getUTCMonth() + 1) + '-' +
f(this.getUTCDate()) + 'T' +
f(this.getUTCHours()) + ':' +
f(this.getUTCMinutes()) + ':' +
f(this.getUTCSeconds()) + 'Z"';
};
Number.prototype.toJSONString = function () {
// JSON numbers must be finite. Encode non-finite numbers as null.
return isFinite(this) ? String(this) : 'null';
};
function ObjectToJSONString(o,w) {
var a = [], // The array holding the partial texts.
k, // The current key.
i, // The loop counter.
v; // The current value.
// If a whitelist (array of keys) is provided, use it assemble the components
// of the object.
if (w) {
for (i = 0; i < w.length; i += 1) {
k = w[i];
if (typeof k === 'string') {
v = o[k];
switch (typeof v) {
case 'object':
// Serialize a JavaScript object value. Ignore objects that lack the
// toJSONString method. Due to a specification error in ECMAScript,
// typeof null is 'object', so watch out for that case.
if (v) {
if (v !== null) {
a.push(k.toJSONString() + ':' +
ObjectToJSONString(v,w));
}
} else {
a.push(k.toJSONString() + ':null');
}
break;
case 'string':
case 'number':
case 'boolean':
a.push(k.toJSONString() + ':' + v.toJSONString());
// Values without a JSON representation are ignored.
}
}
}
} else {
// Iterate through all of the keys in the object, ignoring the proto chain
// and keys that are not strings.
for (k in o) {
if (typeof k === 'string' &&
Object.prototype.hasOwnProperty.apply(o, [k])) {
v = o[k];
switch (typeof v) {
case 'object':
// Serialize a JavaScript object value. Ignore objects that lack the
// toJSONString method. Due to a specification error in ECMAScript,
// typeof null is 'object', so watch out for that case.
if (v) {
if (v !== null) {
a.push(k.toJSONString() + ':' +
ObjectToJSONString(v));
}
} else {
a.push(k.toJSONString() + ':null');
}
break;
case 'string':
case 'number':
case 'boolean':
a.push(k.toJSONString() + ':' + v.toJSONString());
// Values without a JSON representation are ignored.
}
}
}
}
// Join all of the member texts together and wrap them in braces.
return '{' + a.join(',') + '}';
};
}
<<Speaker>> A commonly-highlighted problem encountered when performing relatively straightforward tasks on the Web is the repetition of information required and the lack of understanding that exists between various systems, especially in the travel domain. For example, if one is organising a trip, the full details of a person's trip are distributed across various disconnected sites, and some manual means of gathering this information is usually required. A number of technologies are beginning to converge which can provide viable solutions to such problems. The first is online social networking and social media sites that allow a user to create and maintain an online network of close friends or business associates, obtaining recommendations from peers for social and professional reasons. The second technology of interest is the Semantic Web, which provides a means of both linking identifiable things together and of describing the meaning of these links. In the travel domain, resources can be connected by links describing the type of relationships involved. In this presentation, we will describe work being undertaken by Tourist Republic and DERI, building on the partner's existing TouristR destination review platform and semantic social software expertise, to create a semantic recommender network for trip planning (called TripPlanr).
<<SpeakerSession>>
<<Speaker>> is a senior researcher in digital interactive media and political communications at the Hans Bredow Institute for Media Research in Hamburg, Germany. Since 2004, he has conducted various research projects in the area of social software, with a particular focus on the emerging practices of online-based identity and relationship management. As a "[[hard blogging scientist|http://www.hardbloggingscientists.de/]]", he not only gives frequent lectures and presentations on recent online developments, but he also blogs at [[schmidtmitdete.de|http://www.schmidtmitdete.de/]]. (While this blog is mainly in German, there is [[some English content|http://www.schmidtmitdete.de/english-content]] available).
<<SpeakerSession>>
<<Speaker>>
<<SpeakerSession>>
<<Speaker>> TiddlyWiki is a technical marvel, and since bursting onto the scene three years ago it has made quite an impression. It is unlike any other wiki, mainly because it can be used in so many different ways - many of which do not even look like a wiki. And it now forms the cornerstone of [[BT|http://www.bt.com]]'s open source innovation lab.
Jeremy Ruston, the original creator of TiddlyWiki (and the head of open source innovation for BT), will give a quick demo of the product for those who were not at BlogTalk last time, before showcasing some of the unique features being exploited in the latest products from the TiddlyWiki community.
<<SpeakerSession>>
<<Speaker>>, [[Keane|http://www.keane.com/]]
Broad cultural and technological shifts are rapidly erasing the distinctions that separate the creators and users of social media. In this DIY future, when everyone is a designer, greater ethical challenges arise for all involved.
These ethical dilemmas come increasingly from three directions. First, from conflicts between ever larger and more diverse groups of social media stakeholders. Second, from new hybrids of product, service, and information blended into new forms such as smart objects and the SPIME, constructs which bridge the physical and virtual environments into transmedia contexts for creation and use. Third, the from the emergence of broadly available DIY (Do It Yourself) tools, infrastructure, and methods which hint at changes in the basic economic and production models underlying the origins of social media, software, and content.
In addition to throwing open the gates of the design citadel, these shifts change the role of designers from authors of point solutions to the creators of broad systems and frameworks used by others for their own expressive and functional goals. Both traditional design professionals, and the growing ranks of DIY designers, must be prepared to address the increased ethical complexity of the integrated experiences of the future.
This presentation will share practical suggestions for supporting the design and architecture of ethically sound social media by using familiar experience design methods and techniques.
<<SpeakerSession>>
<<Speaker>>
<<SpeakerSession>>
<<Speaker>>
<<SpeakerSession>>
<<Speaker>> I would like to present a tool developed at Bergen University College by a team I have supervised. The tool, called Memoz, is built on top of the weblog software Lifetype and enables what I call "spatial publishing". I would like to present some of the conceptual thoughts, some theoretical background, and the tool in practical use. My presentation will also reflect my role as head of development and examples from practical use.
Experiences from several projects testing the use of weblogs in schools have emphasized the importance of publicists being able to see and respond to each other's work. In this respect weblogs have many benefits when compared to other tools, e.g. most Learning Management Systems.
I believe it is time to discuss whether the weblog definition emphasizing chronology as a key feature should be revised. Even though pictures and videos are widely used, weblogs present information in ways that have a close relationship to how weblogs were presented close to ten years ago. If we look at some of the most popular personal publishing tools that youngsters use we find some qualities that differ from the ordinary weblog. The webpages are frequently updated and other users are often able to respond, but the chronological structure of the weblog does not seem to be a feature. Instead some popular systems let their users publish information spatially.
Memoz is a publishing environmet that let the users publish spatially on a "sceeen-surface" that is not restricted by the physical screen size. On this surface different meda can be published, and media objects can be placed in a specific position chosen individually by the author. In Memoz videos, pictures, maps (using Google maps), and texts can be published literally side by side. Each publishing surface can be shared among several contributors giving Memoz some basic wiki-like features. Each object can be linked to, either internally or from an external webpage, and commented if the author allows this. Memoz is probably best compared to a "living billboard".
<<SpeakerSession>>
<<Speaker>>
<<SpeakerSession>>
<<Speaker>>
<<SpeakerSession>>
<<Speaker>>
<<SpeakerSession>>
<<Speaker>>
<<SpeakerSession>>
Introduced by [[Jan Schmidt]].
Matt admits Windows Mobile phone shame!
How do we know who to believe on the web? In the real world we know more about the people we interact with and we can look people in the face to figure out if they can be trusted.
People can say whatever they want on the web. The major concern for may publishers taking their brand online is that their users might offend their advertisers with what they say on the site.
Salim has worked on several start ups, including starting in Cork.
Yahoo Pipes was the first thing to come out of the Brickhouse.
His description of Web 2.0: User Generated Content + XML.
Numbers in 01/04, 10m in 01/05, 50m in 2006, 100m today
Salim described Web 2.0 (!), Internet 3.0 (!), RSS (!), Publish / subscribe
Very basic guide to starting an internet business...."You have to do everything right and then get very lucky". Timing is important, focus then execute, never give up. If your company doesn't fold, somewhere along the line someone will buy it.
*Steps for building a business:
*Pick a domain you're interested in
*Pick a type of data that can be leveraged on the web
*Select one of the drivers of value creation
*Position yourself for risk
*Jump in with both feet.
Well-known Brickhouse launched Yahoo products:
- Yahoo Live
- Fire-eagle
- Yahoo Pipes
Web 2.0 - User generated content with increased use of xml
Enablement of consumer to consumer interaction
Web 2.0 started by blogs
Web 2.0
- XML
- Syndication
- Low Latency
- Great UI
- Focused on the user experience
Tensions to be navigated:
- How dodgy
- When to take in revenue
- When to launch
People are social. Take advantage of it in the consumer space
Looking forward to [[FireEagle|http://fireeagle.research.yahoo.com/]].
Hidden Web is a cool idea, seems like a lot of opportunity for companies like Dapper.net.
http://en.wikipedia.org/wiki/Hidden_Web
wondering who has trademarked internet 3.0
Introduction by [[John G. Breslin]].
Social graph just connects people.
Semantic graph connects everything: People, Emails, Products, Services, Web pages, Documents, Multimedia, groups events, Projects, Activities, Interests, Places, companies
And it uses richer semantics to enable: better search, more targeted ads, smarter cllaboration, deeper integration, richer content, better personalization
Semantic web is about transforming the web from a fileserver to a database.
Gothic cathedral of our time is about building all the information on the web in machine readable / understandable form. Might look more like a coral reef. But ultimately it will lead to an evolution in human consiousness, because for the first time machines will be able to do some of our "thinking" for us.
The web is the database.
The web is becoming the OS. The PC becomes a thin client for accessing the web. He refers to Web 3.0 as simply a decade (2010-2020), so more and more information will be created semantically in the years to come, and the tools to process this new machine readable information will be created alongside (and will evolve alongside).
We are reaching the limits of Keyword Search. It now often takes us longer to find what we're looking for, even when we use operators.
Evolution of the web from social web to semantic web will, in order help as follows:
*Tagging
*Natural Language Search
*Semantic Search
*Reasoning
2030s The Body is the Platform???
Talked about the Tagging Approach (helps, but pushes the problem out a little further), the Linguistic Approach, the Semantic Approach, the Artificial Intelligence Approach - the Holy Grail! Not a near time goal. Will talk a lot of work.
Two paths to adding semantics; bottom up (apply to all websites, needs people to learn and use RDF/OWL) or top down (automatically create semantic metadata for vertical domains. Create services that provide this as an overlay to non-semantic web)
He talks about RDF triples. Eg "Sue" "Has Friend" "Jane" - each one has a URI. Subject, predicate, object. It's a list, and you can merge lists. But these lists don't scale very well. There are solutions being worked on right now that will make this scalable (new frontier).
The semantic web is a web of semantic webs. Each of us may have our own semantic web.
Doesn't like Web 3.0, prefers Web 3G (Giant Global Graph).
Why has it taken so long? The original focus was on A.I. Now more focused on more practical things.
Twine.com. Helps individuals and groups to organise, share and discover information about themselves on the web. Learns about your interests and makes recommendations to individuals and groups.
I really, really want to believe in the semantic web. It's a seductive idea, right up there with having your own pet dragon.
Nova does seem to like making random projections a few decades in advance. I'd call it wishful thinking.
Oh lawks. Now we're learning about the problems with tagging vs an automated, semantic approach. Cheerfully extrapolating from the limitations of present day Google.
*Putting human knowledge onto the Web in Machine readable ways is the great Gothic cathedral of our time.
*The Web IS the Database!
*The Intelligence is in the Connections
Oh, it's a shame they didn't call it "Data Web" rather than "Semantic Web"
http://www.twine.com/ looks sweet
hoping the "cut and paste" from Wikipedia is an example, not the only way.
No support for RSS, yet. Hmm. Early days, I guess.
Not a technical talk.
http://novaspivack.typepad.com/nova_spivacks_weblog/2007/02/steps_towards_a.html
The social graph connects people to people.
The semantic graph connects everything.
More precision in the UX. We can be more productive.
Transferring the web from fileserver to db model
''Approaches''
*Tagging
*Statistics
*Linguistics
*Semantic Web
*Artiuficial Intrlligence
http://www.twine.com
Your notes... notes scraped from the [[backchannel|irc://irc.freenode.net/%23blogtalk]] [[archive|http://tuukka.iki.fi/tmp/blogtalk-2008-03-04]]:
09:29:08 morning
09:29:49 Hello all ...
09:30:25 morning
09:30:30 Trying ustream again .... Semantic web is all nice n'all ... but can't we fix wireless first? ;)
09:30:48 TomRaftery informs me over Twitter that Nova is banging on about the 'semantic graph'. Please, someone pick him up by his ankles and shake him until all the jargon comes out...
09:31:39 tommorris: what's wrong with the jargon?
09:31:51 it carries very little information content.
09:31:52 might it be that people are better at understanding such a jargon?
09:32:11 "can haz web 4.0" ..
09:32:17 robachan, it makes more sense in the context of his talk, slides, diagrams...
09:32:42 well, I don't have any idea what it means - it's mixing technical language (graphs and semantics) with consumer/VC-friendly language, and serves only to confuse both
09:33:04 hi folks
09:33:19 robachan: are you ok with streaming my panel at noon?
09:33:23 it's a nice overview of the ideology behind I think
09:33:25 Hello :)
09:34:05 heh - Firefox wanted to correct 'reificiation' into 'deification' - slightly different meanings there...
09:34:24 tommorris: indeed
09:36:28 tommorris, Radar Networks raises $13 million - San Francisco Business Times: ... :)
09:37:45 Gandalfar: sure. I hope they pulled out as much jargon as necessary when talking to their VCs. Not sure that language used to convince VCs is the best language to use when either talking to the general public or developers (the former won't really understand it and the latter tend to oppose needless complexity).
09:38:20 blogtalk isn't super nerdy, but it also isn't plain old general public
09:38:34 politics of the english language- http://www.mtholyoke.edu/acad/intrel/orwell46.htm
09:40:10 ACTION bluescreens
09:40:28 nova: 5 approaches to semantics
09:40:39 ...tagging, stats, linguistics, semantic web, AI
09:40:50 sw is a class of semantic technology
09:40:53 tagging ...
09:41:04 ... adding little keywords to data, providing a little more info about what it means or is
09:41:06 isn't this called folksonomy?
09:41:08 pros: easy, cons: easy
09:41:17 tags not intrinsically meaningful
09:41:32 pushes problem out a little further, you have to figure out what tags mean
09:41:40 it's easy to do .. so no technology evolved?
09:41:52 statistical approach: google, autonomy, lucene etc
09:42:07 ...pure mathematical algos, massively scalable, often language independent
09:42:13 ...but doesnt really touch what the content means
09:42:18 cons .. good mostly for crowdsourcing
09:42:20 ... or certain query forms
09:42:27 google: favours the popular
09:42:34 ...good with highly hyperlinked content
09:42:46 ...autonomy a bit better with nonlinked data
09:42:56 ..approach doesn't require anyone to udnerstand or model the data
09:43:03 nova: Linguistic approach
09:43:12 ... systems that can read like a human
09:43:15 ...detect the entitites
09:43:22 ...nouns, verbs ... structure within a document
09:43:33 eg. powerset, hakia, inxight, attensity etc
09:43:38 ... great as true language understanding
09:43:45 ...good at searching for facts or relationships
09:43:54 ...lang dependent
09:43:57 SW approach, ...
09:44:06 basically has a lot of the benefits of the others
09:44:13 smart apps with less work
09:44:26 not as computationally intensive
09:44:28 tool maturity issues
09:44:31 can be hard to get started
09:44:34 hard to scale the data
09:44:38 q of who makes the metadata
09:45:05 ...
09:45:21 AI. ... also big projcts eg .cycorp's giant expert system
09:45:26 ...really works only in narrow domains
09:45:32 hard to make a general intelligence
09:45:45 also SW provides some limited reasoning
09:45:49 but this isn't nearterm goal
09:45:54 we just want linked shareable data
09:46:05 AI - also covered in the FT today... in a piece that also quotes Nova... http://blogs.zdnet.com/semantic-web/?p=109
09:46:07 ...tho there are probably some researchers here working on reasoning
09:46:14 some approaches make the software smarter
09:46:18 some make the data smarter
09:46:21 tagging: data gets smarter
09:46:29 stats: doesn't change data, software a bit smarter
09:46:39 linguistics: software much smarter, data a little smarter
09:46:43 ai: extreme of both
09:46:50 sw: right in the middle, a compromise
09:46:58 ACTION likes this analysis btw
09:47:05 nova: we encode back into the data
09:47:13 ... people can republish conclusions
09:47:20 ...make their metadata visible to each other
09:47:35 software can be smarter
09:47:46 classic approach was bottom up
09:47:47 posted a rather silly post about jargon (namechecks iand, nova and Paul_Miller_) - http://tommorris.org/blog/2008/03/04#When:09:35:30
09:47:53 everyone would put rdf and owl into content
09:48:03 ACTION thinks that's a little strawmanly
09:48:12 "bottom-up" approach
09:48:29 top-down approach by contrast: making metadata automatically in crtain domains
09:48:41 larger apps, services are automatically transforming it, or in participation with users
09:48:44 why not feed the technology from top-down into bottom-up and do it ground up?
09:48:51 in practice, metadata is being created largely automatic
09:49:02 in a distributed fashion as the web was built ..
09:49:08 nova: feeling that vast majority in future will be machine generate
09:49:09 d
09:49:34 ..what we do: tagging, semweb, top down, stats, linguistics, bottom up, tiny bit of AI
09:49:40 ACTION chuckles at tommorris's post
09:49:42 emphasis on Tagging and SW and top down, then stats
09:50:33 (OK i'm taking a typing break, rsi, anyone care to scribe?)
09:50:49 - nova gives a basic rdf overview -
09:50:59 "bottom up" was somewhat down on the list (but they are using both)
09:51:02 you guys need www.codingmonkeys.de/subethaedit/
09:51:19 tommorris, that won't solve that problem
09:51:19 triples which point to things described in onotologies
09:51:27 RDBMS vs. triplestore
09:51:45 nice thing about using triples - it's basically a simple list
09:51:46 triples are just a big list and you jjust add stuff to te end of list
09:51:52 nice slides here
09:52:06 lists don't scale..
09:52:07 it's easier to make semantic database, but the downside - it is hard to scale such a list
09:52:16 such a database
09:52:38 there are triplestores - databaass for semantic data which perform better
09:53:06 there are solutions that make semweb databases more scalable, but that is stil a frontier
09:53:16 we want trillions of triples in a datastore
09:53:23 "One SemWeb or many?"
09:53:30 hey, cpus are cheap and Moore's Law isn't slowing down any time soon
09:53:41 answer - both
09:53:49 The SemWeb s a web of semantic webs
09:54:02 if you have that .. how can you do "top-down then"..
09:54:11 same as the web - we each have a website which is a web of its own
09:54:24 "Why has it taken so long"
09:54:28 future outlook
09:54:29 hmm... ponders whether to purchase a .org or a .info
09:54:38 tommorris: http://www.engadget.com/2007/09/19/gordon-moore-predicts-end-to-moores-law-in-10-years/
09:54:40 tommorris, .org
09:54:43 next 2 years - early adoption phase
09:54:45 silicon is cheap, carbon isn't
09:54:57 2010-2020 mainstream adoption
09:55:04 now, let' s look at Twine
09:55:48 robachan: can't remember if I asked already, but would you be ok with streaming my panel at 12h00?
09:56:09 this talk is recorded .. right?
09:56:43 demoes twne
09:56:54 groups you can join - called twines
09:57:04 twine! cool!
09:57:10 can see different types of information, types of content, people, ...
09:57:34 sorry, a bit sleepy still, if someone wants to scribe some more detail of this demo
09:57:44 now demoes creating a twine
09:58:03 ACTION reads http://tommorris.org/blog/2008/03/04#When:09:35:30 ... thinks tom is on drugs
09:58:11 i don't know any real people who talk about 'social network data'
09:58:17 I am, to some extent
09:58:53 I'm not saying normal people use it - but if someone says "the data you put in to Facebook", they understand it better than "your social graph"
09:58:57 types in "john breslin", pulls in some content from the web
09:59:00 nice javascript!
09:59:11 in this case - John's data portability video
09:59:21 Twine looks pretty good
10:00:07 needs tags: http://flickr.com/photos/bunny/sets/72157604037341717/
10:00:18 ooh
10:00:27 ACTION watches the social graph vs. network debate :-D
10:00:27 how do I tag your photos?
10:00:35 ah, add tag
10:00:40 Gandalfar: do you have a flickr account? if you do, you just go on the photo page
10:00:45 exactly
10:00:45 tommorris: isn't that the point though? don't we want people to stop thinking about "the data they put into facebook" and "the data they put into myspace"
10:00:58 when found some info (eg, a video or a book on the web), a sidebar shows some rich data about the object found
10:01:01 ACTION crowdsources tagging though she hates that word (crowdsourcing)
10:01:09 can then add this object to a twine
10:01:22 "twine It"
10:01:30 ACTION makes a mandatory reference to http://bingo.adactio.com/
10:01:34 let's look at what's going on under the hood
10:01:35 why can't it pull in ireland automatically from the web?
10:02:03 twine looks nice, but not seeing much "semantics", yet
10:02:07 did jeremy add an interface so we can suggest new words for the bingo?
10:02:16 pauld: you shouldn't
10:02:17 bunny_cork: e-mail?
10:02:37 semantics are for geeks, like valves in a car
10:02:41 pauld: in pulling richer data from the web is a part of semantics
10:02:48 yeah, but I talked with him about making the text file availalbe so we can check it out
10:03:00 but really users do not have to see anything different. apart from better ways for finding information
10:03:02 I'm sure he probably wouldn't mind if you cloned the page and JS and added your own words
10:03:07 (iand, our car is transistorised)
10:03:20 will the person with the BEEPING MOBILE please turn it OFF?
10:03:26 some RDF/XML wasvisible on the screen
10:03:57 data about the object are turned into RDF and put into the datastore
10:04:25 I always hated the word 'semantics'
10:04:55 'graph' to me evokes diagrams, charts, connections, analysis,... ie. something technical
10:05:07 yep
10:05:27 and i'm happy with 'social graph' etc in that it gives a technical word for technical data structures that describe the world; i think it encourages us not to confuse the world with its description
10:05:30 none of our customers users are asking for more semantics in their applications
10:05:47 we can keep 'social network' and 'social networking' as names for things in the world
10:05:49 danbri: can understand hating the word. what would you use instead?
10:05:52 no semantification of my thesis?
10:06:21 ACTION semantificates Gandalfar's thesis
10:06:29 CaptSolo: it's a good descriptive word but really it focusses on the how, not the what
10:06:43 danbri - yep, but tommorris has a point about 'social network data' being the same as the graph
10:06:49 shows data about a book pulled into twine
10:07:10 in the next version (out tomorrow) there will be recommendations for related content
10:07:12 i still think graph is too technical for most people... in the sense we use it for anyway
10:07:22 I talk about the Web and the World. In my world there is a Web, there are people, documents, groups, ... some documents make claims about ... people, documents, groups. And the patterns of connection in the world, as described in those connected Web documents, form a weird distributed data structure ... that is so weird it deserves a technical name.
10:07:51 twine added some more tags and relations to the data
10:08:11 so some data come from the web and some are figured out by twine
10:08:24 it's like a wiki too - everything is editable if you have permission
10:08:39 discussion attached to the bottom of every item
10:08:46 tiddlywiki approach would seem good in this interface
10:08:48 (has anyone got beta access to twine yet?)
10:08:50 every twine is also an email address
10:08:57 or has email
10:09:02 danja, he promised it for after the talk
10:09:06 you can mail information to a twine and add them
10:09:06 is twine somewhat like that service (with an S, can't remember name) which has "lenses"?
10:09:10 from a mobile phone, etc.
10:09:35 squidoo
10:09:45 http://www.squidoo.com/ -- is twine related to that?
10:09:46 danbri: who, other than us geeks, cares about the weird distributed data structure
10:10:03 here's a blog post from a petrolhead friend: http://blog.jsdi.co.uk/?p=24
10:10:29 step 1 - good bookmarking, group information management
10:10:32 do you understand what he's talking about? do you need to to go visit your family?
10:10:45 everyone, ian. they just call it the Web. and that's fine too. they just don't realise how weird it is yet. which is ok. but they don't understand how it'll affect their privacy etc., which is not ok.
10:10:53 what was the next step?
10:11:17 can use twine in a number of different ways - as a blog, a wiki, a listserv, ...
10:11:21 ACTION quite happy to use the term graph, but only with folks that aren't expecting barcharts
10:11:34 are we running late?
10:11:36 Gandalfar, ta
10:11:45 can create new ontologies, classificaion
10:11:48 just so I know how many danish scones to eat during the break so that I'm functional during my panel
10:12:43 GRDDL mention
10:13:07 what is GRDDL?
10:13:09 so that people can teach twine to bring their info into twine
10:13:28 can it bring in raw RDF[/XML]?
10:13:44 the frontend is web2.0, we just add richer data
10:13:53 the part that is hard to replicate is the intelligence
10:14:07 bunny_cork: GRDDL is a way of attaching a 'profile' to a web page which describes the underlying semantic meaning
10:14:08 GRDDL is related to the microformats idea; it gives a way for a page to include a link to ways of extracting structured data
10:14:08 (don't know but Nova said it'd be exposing a lot more RDF in the future)
10:14:30 bunny_cork: here's an example of a GRDDL profile I created a while back - http://tommorris.org/profiles/nsfw
10:14:35 ACTION is willing to knock twine about if she gets a beta invite
10:14:46 so, how do we get invited in?
10:14:57 i think he said we'll all get an invite
10:15:01 nsfw, really?
10:15:09 ah ok, cool
10:15:11 business cards!
10:15:20 invite cards :-)
10:15:27 bunny_cork: it's a really simple use case that I put up to show how simple GRDDL can be
10:16:09 was going to ask the SPAM question
10:16:40 wants a twine invite!
10:17:04 is robachan there now?
10:17:08 ACTION pokes robachan
10:17:20 ACTION prepares to poke robachan again if he doesn't react
10:17:40 danbri asks: are you using it internally
10:17:43 yes
10:17:53 using it for information management in the company
10:18:11 tommorris: do you list the URI used for the nsw predicate on that profile page anywhere? I can't see it (in my quick scan)
10:18:45 iand: it's http://rdf.opiumfield.com/nsfw/nsfw
10:18:56 cheers
10:19:14 you''l be able to import your blog into twine and have a semantic version of your blog automatically
10:19:16 anybody know where janschmidt is?
10:19:33 sounds like SIOC
10:19:57 can get data out in RSS, SPARQL endpoint, REST interface, ...
10:20:05 currently these interfaces are not exposed to the public
Predictions of what happens with technology more than 10 years in the future are wild speculation.
The human body as platform (2030+)? Does this refer to the combination of augmented reality and using the unused portion of our brains for distributed algorithm processing? See Hyperion http://en.wikipedia.org/wiki/Hyperion_(novel)
Highlighting the issues with two stories:
German company (Studiverzeichnis, or ~StudiVZ - http://www.studivz.net/) went to the States, found whatever was working there, and created a German version (mostly consisting of students), just sold for €100m. Company which bought it wanted the traffic there to move to their portal, they used ads. No-one followed them. All the traffic was still coming from Google.
Facebook. Created News Feed, which Michael calls "Attention data", which is similar to ~LastFM. Better form of advertising, more branding.
For Last FM, they felt like they were too rock and roll to do ads. But they were forced to come up with a business model to obtain funding. So they decided to do ads for music....and the best advert for music is the music itself = mp3. When people had an mp3 they wanted to advertise, they were asked what bands their music sounded like, so the track could be matched accordingly. This system is still in ~LastFM.
Re using ads as a reveue stream on Last.fm: "We were all rock 'n' roll, so we were like 'No way!'"
"Ads are the product of a web 2.0 application."
"The music is the best advert for the artist possible."
notes scraped from the [[backchannel|irc://irc.freenode.net/%23blogtalk]] [[archive|http://tuukka.iki.fi/tmp/blogtalk-2008-03-04]]:
14:44:38 oops accidently logged into #bogtalk
14:44:43 LOL
14:44:48 much going on there?
/***
|''Name:''|LinkMakerPlugin|
|''Description:''|Create a link from a Template, accessing a tiddlers properties|
|''Author:''|PhilHawksworth|
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/contributors/PhilHawksworth/plugins/LinkMakerPlugin.js |
|''Version:''|0.0.2|
|''Date:''|Feb 29, 2008|
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]] |
|''~CoreVersion:''|2.3|
Usage:
<<LinkMaker type:'text|image|img' display:'tiddler field|image path' linkto:'href|TiddlerTitle' [classname:'classname'] >>
***/
//{{{
if(!version.extensions.LinkMakerPlugin) {
version.extensions.LinkMakerPlugin = {installed:true};
config.macros.LinkMaker = {};
config.macros.LinkMaker.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
params = paramString.parseParams("anon",null,true,false,false);
var linktype = getParam(params,"type",'text');
var linkto = store.getValue(tiddler,getParam(params,"linkto",""));
// var title = getParam(params,"title","");
// var alt = getParam(params,"alt","");
var display = store.getValue(tiddler,getParam(params,"display",""));
var classname = getParam(params,"classname",null);
var dateformat = getParam(params,'dateformat',null);
if(dateformat) {
var handler = config.macros.view.views['date'];
var fakeParams = [null,null,dateformat];
}
if(linktype == 'image' || linktype == 'img') {
var a = createTiddlyElement(place,'a',null,classname);
a.setAttribute('href',linkto);
var i = createTiddlyElement(a,'img');
i.setAttribute('src',display);
}
else if (config.formatterHelpers.isExternalLink(linkto)) {
var a = createTiddlyElement(place,'a',null,classname,null);
if (handler)
handler(display,a,fakeParams);
else
createTiddlyText(a,display);
a.setAttribute('href',linkto);
}
else {
var e = createTiddlyLink(place,linkto,false,classname);
if (handler)
handler(display,e,fakeParams);
else
createTiddlyText(e,display);
}
};
} //# end of 'install only once'
//}}}
/***
|''Name:''|ListRelatedPlugin|
|''Description:''|Displays a filtered list of tiddlers along with links to related tiddlers|
|''Author:''|JeremyRuston|
|''Source:''|http://www.osmosoft.com/#ListRelatedPlugin |
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/contributors/JeremyRuston/plugins/ListRelatedPlugin.js |
|''Version:''|0.0.5|
|''Date:''|Feb 19, 2006|
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''License:''|[[BSD License|http://www.opensource.org/licenses/bsd-license.php]] |
|''~CoreVersion:''|2.2|
ListRelatedPlugin displays a list of tiddlers, each of which is followed by a sublist of related tiddlers. What
constitutes a "related tiddler" is customisable, as is the template used to display the list and sublist items.
This version ships with handlers for relationships to support RippleRap's convention that a tiddler called
"<title> from <author>" is taken to be a comment by "<author>" on a tiddler called "<title>".
- "raps": returns all tiddlers that are comments on the specified one
- "rapped": if the specified tiddler is a comment, returns the tiddler that it applies to
Usage:
{{{
<<listRelated filter:"[tag[note]]" rel:"raps" template:"MyTemplate" subtemplate:"MySubTemplate">>>
}}}
The parameters are as follows:
|Parameter |Description |Default |
|filter |A tiddler filter expression that filters and sorts the tiddlers to be listed |(none) |
|rel |The relationship of the sublist |raps |
|template |A template to determine how each tiddler in the list is laid out |"<<view title>>" |
|subtemplate |A template to determine how each tiddler in the sublist is laid out |"<<view title>> by <<view modifier>>" |
The optional template parameters specify the name of a tiddler that contains the template to be used. The template is specified
in TiddlyWiki format (not HTML), and can use the <<view>> macro to extract particular fields. For example:
{{{
Item ''<<view title>>'' by <<view modifier>>
^^last saved on <<view modified date>>^^
}}}
***/
//{{{
if(!version.extensions.ListRelatedPlugin) {
version.extensions.ListRelatedPlugin = {installed:true};
config.relationships = {
raps: {
text: "raps",
prompt: "Tiddlers that are comments on this one",
getRelatedTiddlers: function(store,title) {
var match = title.trim() + " from ";
var matchLen = match.length;
var tiddlers = [];
store.forEachTiddler(function(title,tiddler) {
if(title.trim().substr(0,matchLen) === match)
tiddlers.push(title);
});
return tiddlers;
}
},
rapped: {
text: "rapped",
prompt: "Tiddlers that are commented on by this one",
getRelatedTiddlers: function(store,title) {
var tiddlers = [];
var re = "^(.+) from (.+)$";
var regexp = new RegExp(re,"mg");
regexp.lastIndex = 0;
var match = regexp.exec(title);
if(match)
tiddlers.push(match[1]);
return tiddlers;
}
}
};
config.macros.listRelated = {
defaultRelationship: "raps",
defaultTemplate: "<<view title>>",
defaultSubTemplate: "<<view title>> by <<view modifier>>"
};
config.macros.listRelated.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
params = paramString.parseParams("anon",null,true,false,false);
var filter = getParam(params,"filter","");
var relationship = getParam(params,"rel",this.defaultRelationship);
var template = getParam(params,"template",null);
if(template)
template = store.getTiddlerText(template,this.defaultTemplate);
else
template = this.defaultTemplate;
var subTemplate = getParam(params,"subtemplate",null);
if(subTemplate)
subTemplate = store.getTiddlerText(subTemplate,this.defaultSubTemplate);
else
subTemplate = this.defaultSubTemplate;
var tiddlers = store.filterTiddlers(filter);
for(var t=0; t<tiddlers.length; t++) {
var tiddler = tiddlers[t];
var wrapper = createTiddlyElement(place,"div",null,"listRelatedTiddler");
var wikifier = new Wikifier(template,formatter,null,tiddler);
wikifier.subWikifyUnterm(wrapper);
var rel = config.relationships[relationship].getRelatedTiddlers(store,tiddler.title);
for(var r=0; r<rel.length; r++) {
var sub = createTiddlyElement(wrapper,"div",null,"listRelatedSubTiddler");
wikifier = new Wikifier(subTemplate,formatter,null,store.fetchTiddler(rel[r]));
wikifier.subWikifyUnterm(sub);
}
}
};
} //# end of 'install only once'
//}}}
/***
|''Name:''|ListTemplateMacro|
|''Description:''|Renders a set of tiddler through a template|
|''Author:''|JonathanLister (based on ListRelatedPlugin by JeremyRuston)|
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/contributors/JonathanLister/components/ListTemplateMacro.js |
|''Version:''|0.0.1|
|''Date:''|Jan 21, 2008|
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''License:''|[[BSD License|http://www.opensource.org/licenses/bsd-license.php]] |
|''~CoreVersion:''|2.3|
ListTemplateMacro finds a set of tiddlers and renders them once each through a template. The template can contain additional calls to the macro to allow for e.g. looping inside a template (think RSS items).
It needs to be able to support recursion, so that sub-templates make sense. The content is passed in either through a filter for tiddlers, a tag to get tiddlers, or a space-separated list. We'll support more as we go along, but this is what we need for RSS.
Usage example:
{{{
<<ListTemplate filter:"[tag[!excludeLists]]" template:"RssTemplate">>
}}}
Parameters can be:
filter - a tiddler filter
data - the part of a tiddler to use in the subTemplate
NOTE: FOR NOW, THIS PLUGIN ALSO OVERRIDES THE RSS SAVING AND PRODVIDES A MACRO CALLED TIDDLYTEMPLATING TO SAVE AN EXTERNAL FILE
***/
//{{{
if(!version.extensions.ListTemplateMacro) {
version.extensions.ListTemplateMacro = {installed:true};
config.macros.ListTemplate = {
defaultTemplate: "<<view text>>"
};
config.macros.ListTemplate.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
params = paramString.parseParams("anon",null,true,false,false);
var filter = getParam(params,"filter","");
var template = getParam(params,"template",null);
template = template ? store.getTiddlerText(template,this.defaultTemplate) : this.defaultTemplate;
var list = getParam(params,"list","");
var data = getParam(params,"data","");
var tiddlers = [];
/* METHOD4 - 24/1/08 - using these calls:
<<ListTemplate filter:"[tag[docs]]" template:"RssItemTemplate">>
<<ListTemplate data:"tags" template:"RssItemCategoryTemplate">>
<<view text>> (for the tags)
This method for passing data through to subTemplates works by creating "pseudo-tiddlers" (Tiddler objects not in the store) that each carry a part of the data array we want iterating through. We do this to keep the unit of data as the tiddler. */
if(filter) {
tiddlers = store.filterTiddlers(filter);
} else if(data) {
switch(data) {
case "tags":
// creates a new tiddler for each tag and has that tag as its tags
for(var i=0;i<tiddler.tags.length;i++) {
var t = new Tiddler(tiddler.title);
t.tags = new Array(tiddler.tags[i]);
tiddlers.push(t);
}
break;
default:
tiddlers.push(tiddler);
break;
}
} else {
// no data provided, so inherit
tiddlers.push(tiddler);
}
for(i=0; i<tiddlers.length; i++) {
// NOTE: Saq suggested using WikifyStatic here, which returns html and then I could output it batch later
new Wikifier(template,formatter,null,tiddlers[i]).subWikify(place);
}
};
} //# end of 'install only once'
//}}}
/***
!permalink macro
Usage: <<permalink>>
***/
config.macros.permalink = {};
config.macros.permalink.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
var t = encodeURIComponent(String.encodeTiddlyLink(tiddler.title));
createTiddlyText(place,window.location+"#"+t);
};
/***
Experimental override of saveRSS using templating
***/
var saveRssOld = saveRss;
function saveRss(localPath)
{
if (!config.macros.ListTemplate) {
saveRssOld(localPath);
return;
}
if(config.options.chkGenerateAnRssFeed) {
var rssPath = localPath.substr(0,localPath.lastIndexOf(".")) + ".xml";
// START hack
var e = document.createElement("div");
var paramString = 'template:"RssTemplate"';
config.macros.ListTemplate.handler(e,"ListTemplate",null,null,paramString);
var rssSave = saveFile(rssPath,convertUnicodeToUTF8(e.textContent));
// END hack
// OLD var rssSave = saveFile(rssPath,convertUnicodeToUTF8(generateRss()));
if(rssSave)
displayMessage(config.messages.rssSaved,"file://" + rssPath);
else
alert(config.messages.rssFailed);
}
}
/***
Experimental TiddlyTemplating save macro
usage: <<TiddlyTemplating template path>>
***/
config.macros.TiddlyTemplating = {};
config.macros.TiddlyTemplating.handler = function(place,macroName,params) {
config.messages.fileSaved = "file successfully saved";
config.messages.fileFailed = "file save failed";
var saveName = params[0];
var template = params[1];
if (!template) {
// Change to use a default template when one exists, maybe to backup the whole TW?
displayMessage("TiddlyTemplating: usage <<TiddlyTemplating filename template>>");
return;
}
var localPath = getLocalPath(document.location.toString());
var savePath;
if((p = localPath.lastIndexOf("/")) != -1)
savePath = localPath.substr(0,p) + "/" + saveName;
else if((p = localPath.lastIndexOf("\\")) != -1)
savePath = localPath.substr(0,p) + "\\" + saveName;
else
savePath = localPath + "." + saveName;
var e = document.createElement("div");
var paramString = 'template:"'+template+'"';
createTiddlyText(place,"generating...");
config.macros.ListTemplate.handler(e,"ListTemplate",null,null,paramString,null);
createTiddlyText(place,"saving...");
var fileSave = saveFile(savePath,convertUnicodeToUTF8(e.textContent));
if(fileSave) {
createTiddlyText(place,"saved...");
// would rather use displayMessage, but doesn't work when opening tiddler
// displayMessage(config.messages.fileSaved,"file://" + savePath);
}
else
alert(config.messages.fileFailed,"file://"+savePath);
};
[[Welcome]][[Share notes]][[Tweets]][[Blogs]][[Flickr]][[Speakers|speaker]][[Help]][[FAQs]]{{search{<<search>>}}}
/***
|''Name:''|MakeNotesControlPlugin|
|''Description:''|RippleRap control for creating a new note|
|''Author:''|Osmosoft|
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/verticals/ripplerap/plugins/MakeNotesControlPlugin.js |
|''Version:''|0.0.2|
|''Date:''|Nov 30, 2007|
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''License''|[[BSD License|http://www.opensource.org/licenses/bsd-license.php]] |
|''~CoreVersion:''|2.2.6|
***/
//{{{
if(!version.extensions.MakeNotesControlPlugin) {
version.extensions.MakeNotesControlPlugin = {installed:true};
config.macros.MakeNotesControl = {};
config.macros.MakeNotesControl.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
if(params[0] == "create") createTiddlyButton(place,"make notes","Make notes on this session",config.macros.MakeNotesControl.onClick);
//else if(params[0] == "sharethis") createTiddlyCheckbox(place,'private',false,config.macros.MakeNotesControl.togglePrivate);
else if(params[0] == "sharing") {
var cb = createTiddlyCheckbox(place,null,config.options.chkRipplerapShare,config.macros.MakeNotesControl.globalSharing);
cb.setAttribute("option","chkRipplerapShare");
}
};
config.macros.MakeNotesControl.onClick = function(ev) {
var e = ev ? ev : window.event;
var target = resolveTarget(e);
var after = story.findContainingTiddler(target);
var sessionTitle = after.id.substr(7);
var title = sessionTitle + " from " + config.options.txtUserName;
var template = "NoteEditTemplate";
if(!store.tiddlerExists(title))
var text = "Your notes... ";
else
var text = store.getTiddler(title).text;
story.displayTiddler(after,title,template,false,null,null);
story.getTiddlerField(title,"text").value = text.format([title]);
story.setTiddlerTag(title,config.macros.TiddlerDisplayDependencies.myNoteTag,+1);
story.setTiddlerTag(title,config.macros.TiddlerDisplayDependencies.sharingTag,+1);
return false;
};
/*
config.macros.MakeNotesControl.togglePrivate = function(ev) {
var e = ev ? ev : window.event;
var target = resolveTarget(e);
};
*/
config.macros.MakeNotesControl.globalSharing = function(ev) {
var e = ev ? ev : window.event;
var target = resolveTarget(e);
config.options.chkRipplerapShare = target.checked;
var opt = "chkRipplerapShare";
var optType = opt.substr(0,3);
var handler = config.macros.option.types[optType];
if (handler.elementType && handler.valueField)
config.macros.option.propagateOption(opt,handler.valueField,this[handler.valueField],handler.elementType);
if(rssSynchronizer && config.options.chkRipplerapShare)
rssSynchronizer.makeRequest();
return true;
};
/*
Ripplerap account creation helpers
*/
config.macros.ripplerapAccountButton = {};
config.macros.ripplerapAccountButton.eventName = "BlogTalk";
config.macros.ripplerapAccountButton.serverBaseURL = "https://www.ripplerap.com/BlogTalk/";
config.macros.ripplerapAccountButton.userNameNotSet = "Please choose another username.";
config.macros.ripplerapAccountButton.contactingServerMessage = "Contacting the server...";
config.macros.ripplerapAccountButton.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
var buttonType = {
signup : {
btnLabel : "Set up my RippleRap account for %0",
btnAction : config.macros.ripplerapAccountButton.onSignup
},
signin : {
btnLabel : "Sign in to my RippleRap account for %0",
btnAction : config.macros.ripplerapAccountButton.onSignin
}
};
var btnCase = createTiddlyElement(place,'span','ripplerapAccountButton','chunkyButton');
createTiddlyButton(btnCase,buttonType[params[0]].btnLabel.format([config.macros.ripplerapAccountButton.eventName]),null,buttonType[params[0]].btnAction);
var msg = createTiddlyElement(place,'span','ripplerapAccountMessage');
config.macros.ripplerapAccountButton.clearfeedback();
};
config.macros.ripplerapAccountButton.onSignup = function(ev) {
if(config.options.txtUserName=='YourName' || config.options.txtUserName=='') {
config.macros.ripplerapAccountButton.showFeedback(config.macros.ripplerapAccountButton.userNameNotSet);
return false;
}
config.options.txtRipplerapAccountPassword = document.getElementById('rr_account_password').value;
saveOptionCookie('txtRipplerapAccountPassword');
config.macros.ripplerapAccountButton.showFeedback(config.macros.ripplerapAccountButton.contactingServerMessage);
var url = config.macros.ripplerapAccountButton.serverBaseURL + "reg/";
var params = {};
params.username = config.options.txtUserName;
params.purpose = 'signup';
var data = "username=" + params.username + "&password=" + config.options.txtRipplerapAccountPassword;
doHttp("POST",url,data,null,config.options.txtRippleRapUser,config.options.txtRippleRapPass,config.macros.ripplerapAccountButton.accountRequestCallback,params);
return false;
};
/*
config.macros.ripplerapAccountButton.onSignin = function(ev) {
config.macros.ripplerapAccountButton.clearfeedback();
//attempt to put a file.
var payload = 'test post for signin.';
var un = config.options.txtUserName;
var pw = config.options.txtRipplerapAccountPassword;
var uri = "http://" + config.macros.ripplerapAccountButton.serverBaseURL + 'users/' + un + '/signup.txt';
var callback = config.macros.ripplerapAccountButton.accountRequestCallback;
context = [];
context.purpose = 'signin';
displayMessage("signing in.. " + uri);
DAV.safeput(uri,callback,context,payload,null,un,pw);
return false;
};
*/
config.macros.ripplerapAccountButton.accountRequestCallback = function(status,params,responseText,url,xhr) {
var responseTypes = {
400 : {
signupMessage: "Please check the username that you provided. It cannot contain any special characters or spaces.",
signinMessage: "Signin. http 400"
},
409 : {
signupMessage: "The " + config.options.txtUserName + " account is ready to use.",
signinMessage: "This username already exists. Either sign in to that account or choose another username."
},
200 : {
signupMessage: "The " + config.options.txtUserName + " account is ready to use.",
signinMessage: "Thanks for signing in. You can now share yor notes with others."
},
0 : {
signupMessage: "There was a problem reaching the server to create your account. You can still save your changes locally.",
signinMessage: "There was a problem reaching the server to sign in. Your work will continue to be saved locally ."
},
'conferenceFinished' : {
signupMessage: "Sorry, the conference is now over. Ripplerap is no longer accepting updates for this conference",
signinMessage: "Sorry, the conference is now over. Ripplerap is no longer accepting updates for this conference"
}
};
try {
var xhrStatus = xhr.status;
if(!responseTypes[xhrStatus])
xhrStatus = 'conferenceFinished';
} catch(ex) {
xhrStatus = 'conferenceFinished';
}
config.macros.ripplerapAccountButton.showFeedback(responseTypes['conferenceFinished'].signupMessage);
// if(xhrStatus != 0) {
// config.options['chkRipplerapReadyToUse'+config.options.txtUserName] = true;
// saveOptionCookie('chkRipplerapReadyToUse'+config.options.txtUserName);
// if(status && rssSynchronizer && config.options.chkRipplerapShare) {
// rssSynchronizer.makeRequest();
// }
// }
};
config.macros.ripplerapAccountButton.showFeedback = function(str) {
var msg = document.getElementById('ripplerapAccountMessage');
removeChildren(msg);
document.createElement("div");
msg.appendChild(document.createTextNode(str));
msg.style.display = "block";
};
config.macros.ripplerapAccountButton.clearfeedback = function() {
var msg = document.getElementById('ripplerapAccountMessage');
if(msg)
msg.style.display = "none";
};
config.macros.ripplerapAccountPassword = {};
config.macros.ripplerapAccountPassword.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
var p = createTiddlyElement(place,'input','rr_account_password','txtOptionInput',null,{'type':'password'});
p.setAttribute('option','txtRipplerapAccountPassword');
p.value = config.options.txtRipplerapAccountPassword;
};
}
//}}}
<<Speaker>> What makes a good weblog, a superb wiki, or an exceptional contribution to a social networking site? Though excellence is a frequence source of anxiety amongst weblog writers, it has not been a concern of weblog scholarship. In contemporary social software, we encounter once more the deep controversies of 19th century art, reinterpreted to meet the exigencies of time and technology.
<<SpeakerSession>>
<<Speaker>> Learn how to use Windows Live Services to quickly build next generation web applications and blogs that attract more users! See how leading web sites are using Windows Live for free to create compelling user experiences faster, better and at a lower cost. You'll also learn how easy it is to enhance your blog and web applications with mashups created with Popfly, a set of visual tools for building user-friendly mashups.
<<SpeakerSession>>
<<Speaker>> is CEO of [[coComment|http://www.cocomment.com/]]. He joined coComment from ~LunarStorm, the largest Scandinavian social networking provider, where he was ~CEO and oversaw the successful launch of the company in the ~UK. Matt has over twenty years experience managing companies and overseeing strategy and growth. He has a decade of experience in the Internet which started when he was one of the founding team of [[DoubleClick|http://www.doubleclick.com]] Technology International. As ~DoubleClick's Senior Vice President (International), he ran all of ~DoubleClick's non-US operations worldwide. Matt was, prior to his time at LunarStorm, the Senior Vice President and General Manager of Espotting (now MIVA) where he oversaw the turnaround of the company to profitability and its sale to ~FindWhat Inc. in 2004. He has an honours degree in Computing Science from Imperial College and is an associate of the City and Guild Institute.
<<SpeakerSession>>
<<Speaker>> is co-founder of [[Loverly Systems|http://www.lovelysystems.com/]] and was also co-founder and director of [[Last.fm|http://last.fm/]]. He has been actively involved in interactive digital media since 1999 and is widely recognised for his expertise in the areas of interaction design and product development. Lovely Systems is a web technologies company providing localised video portals serving hundreds of gigabytes of video each day, powered by Zope / Plone-based systems and REST services. Their latest service is [[Zoomer.de|http://www.zoomer.de/]], which was launched in February 2008. Last.fm was incorporated in 2002 as an internet radio station and music community website, and the related Audioscrobbler music recommendation system was fully merged into Last.fm in 2005. Last.fm's unique approach to integrating the areas of music distribution, online radio and social software won it many awards in Europe and the USA, and soon brought the company to the attention of the global media. The company was acquired by CBS Interactive in May 2007. Michael also has close links to academia. He headed the Masters program in Interactive Digital Media at Ravensbourne College of Design and Communication in London and is still connected with several research projects. Michael lives with his family in Dornbirn, a city in Vorarlberg, Austria.
<<SpeakerSession>>
|''Description:''|Resources for microblogging with Flickr|
|''RootURI:''|http://flickr.com|
|''LoginURI:''||
|''LogoutURI:''||
|''ListenURI:''|http://api.flickr.com/services/feeds/photos_public.gne?tags=blogtalk&lang=en-us&format=rss_200|
|''PostURI:''||
|''CharacterLimit:''||
|''Period:''|900|
|''authenticated:''|true|
|''Description:''|Resources for microbloggin with Technorati, a blog search engine|
|''RootURI:''|http://technorati.com|
|''LoginURI:''||
|''LogoutURI:''||
|''ListenURI:''|http://feeds.technorati.com/search/%22BlogTalk%22+-%22BlogTalk+Radio%22?authority=a1|
|''PostURI:''||
|''CharacterLimit:''||
|''Period:''|900|
|''authenticated:''|true|
|''Description:''|Resources for microbloggin with Terraminds, a Twitter search engine|
|''RootURI:''|http://twitter.com|
|''LoginURI:''||
|''LogoutURI:''||
|''ListenURI:''|http://terraminds.com/twitter/json?query=blogtalk2008|
|''PostURI:''||
|''CharacterLimit:''|140|
|''Period:''|900|
|''authenticated:''|true|
|''Description:''|Resources for microbloggin with Twitter|
|''RootURI:''|http://twitter.com|
|''LoginURI:''|http://twitter.com/account/verify_credentials.json|
|''LogoutURI:''|http://twitter.com/account/end_session|
|''ListenURI:''|http://twitter.com/statuses/friends_timeline.json|
|''PostURI:''|http://twitter.com/statuses/update.json|
|''Period:''|120|
|''CharacterLimit:''|140|
/***
|''Name:''|MicroblogPlugin|
|''Description:''|Add some simple Microblog functionality to a Tiddlywiki|
|''Author:''|PhilHawksworth|
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/contributors/PhilHawksworth/plugins/MicroblogPlugin.js |
|''Version:''|0.0.1|
|''Date:''|Jan 23, 2008|
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]] |
|''~CoreVersion:''|2.2|
Usage:
Display the login interface:
<identifier> corresponds to the name of the microblogging platfom and requires an associated MicroblogConfig_identifier tiddler
{{{
<<microblog identifier signin>>
}}}
Display the interface to allow posting of an update.
{{{
<<microblog identifier postform>>
}}}
Display a stream of updates from the microblogging platform.
count: INT : the number of updtes to display | 'all' displays all available from the feed.
avatars: Boolean: display the avatar corresponding to the update.
makeTiddler: Boolean: create and save a tiddler for each update or simply display the updates (transient).
{{{
<<microblog identifier listen [count] [avatars] [makeTiddlers]>>
}}}
***/
//{{{
if(!version.extensions.MicroblogPlugin) {
version.extensions.MicroblogPlugin = {installed:true};
var log = function(str) {
if(window.console) {
console.log(str);
return;
}
};
// var refreshDisplay_original = refreshDisplay;
// var refreshDisplay = function() {
//
// var tempTweet = document.getElementById('twitter_post_input');
// if(tempTweet){
// var tweetValue = tempTweet.value;
// log("TT:" + tweetValue);
// }
//
// refreshDisplay_original();
//
// if(tweetValue && tweetValue != "")
// tempTweet.value = tweetValue;
//
// };
config.macros.Microblog = {};
var microblogs = config.macros.Microblog.microblogs = [];
config.macros.Microblog.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
if(params.length < 2) {
log('Not enough arguments in the call to the Microblog plugin');
return;
}
var platform = params[0];
var action = params[1];
//get the settings for this Microblog platform.
if(!microblogs[platform])
this.settings(platform);
switch(action) {
case 'signin':
this.signin(place,platform);
break;
case 'postform':
this.postform(place,platform);
break;
case 'listen':
var count = params[2] ? params[2] : false;
var avatars = params[3] =='avatars' ? true : false;
var makeTiddlers = params[4] =='makeTiddlers' ? true : false;
var template = params[5] ? params[5] : null;
microblogs[platform].poll = true;
this.listen(place, platform, count, avatars, makeTiddlers, template);
break;
case 'refreshButton':
this.refreshBtn(place);
break;
case 'reflect':
var template = params[5] ? params[5] : null;
this.reflect(place, platform, template);
default:
log('ERROR. '+ action+ ' is not a valid parameter for the Microblog plugin.');
break;
}
};
// gather the config data from the config tiddler for use when required.
config.macros.Microblog.settings = function(platform){
//Get the existing data object or create a new one.
var mb = microblogs[platform] ? microblogs[platform] : {};
//Gather the data from the tiddler.
var configTiddlerTitle = "MicroblogConfig_" + platform;
var slices = store.calcAllSlices(configTiddlerTitle);
mb['authenticated'] = false;
for(var s in slices) {
mb[s] = store.getTiddlerSlice(configTiddlerTitle, s);
}
microblogs[platform] = mb;
};
//create signin UI.
config.macros.Microblog.signin = function(place, platform){
// The user details to gather.
var userDetails = [];
userDetails.push(['username','Username']);
userDetails.push(['password','Password']);
//Build the UI for the conifg
var f = createTiddlyElement(place,"form","user_form_"+platform);
// createTiddlyElement(f,"span",null,null,"Signin for " + platform + " microblog.");
for(var d=0; d<userDetails.length; d++){
createTiddlyElement(f,"span",null,null,userDetails[d][1]);
if(userDetails[d][0] == "password") {
var input = createTiddlyElement(f,'input',null,null,null,{'type':'password'});
}
else {
var input = createTiddlyElement(f,"input",null);
}
input.setAttribute('name',userDetails[d][0]);
}
var btn = createTiddlyButton(f,"Sign in to " + platform,"Store these settings and start using the microblog",config.macros.Microblog.signinClick);
btn.setAttribute("platform",platform);
btn.setAttribute("place",place);
var t = story.findContainingTiddler(place);
btn.setAttribute("tiddlerTitle",t.getAttribute('tiddler'));
// var loggedin = createTiddlyElement(place,"span",'microblog_loggedin_' + platform,'hidden',"Logged in to " + platform);
// var logoutbtn = createTiddlyButton(loggedin,"Signout of " + platform,"Signout of " + platform,config.macros.Microblog.logout);
// logoutbtn.setAttribute("platform",platform);
};
// update the config details for this micoroblog with the user details and then try to authenticate.
config.macros.Microblog.signinClick = function(ev){
var e = ev ? ev : window.event;
var btn = this;
var platform = btn.getAttribute("platform");
var place = btn.getAttribute("place");
var tiddlerTitle = btn.getAttribute("tiddlerTitle");
var mb = microblogs[platform];
//record the details.
var form = btn.parentNode;
var inputs = form.getElementsByTagName('input');
var f;
for (var i=0; i < inputs.length; i++) {
f = inputs[i];
mb[f.name] = f.value;
};
config.macros.Microblog.auth(tiddlerTitle, platform, btn);
};
//Attempt to authenticate the user.
config.macros.Microblog.auth = function(tiddlerTitle, platform, btn)
{
var uri = microblogs[platform].LoginURI;
var usr = microblogs[platform].username;
var pwd = microblogs[platform].password;
if(uri && usr && pwd) {
//get the update and post it.
log("logging in to "+ platform);
var params = {};
params.platform = platform;
params.tiddlerTitle = tiddlerTitle;
doHttp("POST",uri,null,null,usr,pwd,config.macros.Microblog.authCalback,params);
}
else {
log("Ooops. We don't have all the details we need to post this comment.");
}
};
config.macros.Microblog.authCalback = function(status,params,responseText,url,xhr){
if(xhr.status == 200){
microblogs[params.platform].authenticated = true;
config.options.txtTwitterSignedIn = 'true';
story.refreshTiddler(params.tiddlerTitle, null, true);
// var p = document.getElementById('microblog_loggedin_'+params.platform);
// p.style.display = "block";
/*
TODO Decide what feedback mechanisim is best to signify a successful login.
*/
}
};
//Attempt to authenticate the user.
config.macros.Microblog.logout = function(ev) {
var e = ev ? ev : window.event;
var platform = this.getAttribute("platform");
var uri = microblogs[platform].LogoutURI;
if(uri) {
var params = {};
params.platform = platform;
doHttp("POST",uri,null,null,null,null,config.macros.Microblog.logoutCalback,params);
}
else {
log("Ooops. We don't have the details we need logout from " + platform);
}
};
config.macros.Microblog.logoutCalback = function(status,params,responseText,url,xhr){
microblogs[params.platform].authenticated = false;
config.options.txtTwitterSignedIn = 'false';
var p = document.getElementById('microblog_loggedin_'+params.platform);
p.style.display = "none";
};
//create listener.
config.macros.Microblog.listen = function(place, platform, count, avatars, makeTiddlers, template) {
//display the signin form if user not authenticated.
if(!microblogs[platform].authenticated) {
createTiddlyElement(place,"span",null,null,"Please log in to " + platform );
return;
}
var uri = microblogs[platform].ListenURI;
var context = {
host:uri,
place:place,
platform:platform,
count:count,
avatars:avatars,
makeTiddlers:makeTiddlers,
template:template
};
if(place.childNodes.length==0)
wikify("{{loadingIndicator{\n\nloading...}}}",place);
log("Getting updates from " + platform);
doHttp("GET",uri,null,null,null,null,config.macros.Microblog.listenHandler,context);
};
//parse incoming feed
config.macros.Microblog.listenHandler = function(status,params,responseText,url,xhr){
if(!status) {
log("We couldn't get a response from " + params.platform + ". Please check your settings and ensure that all is well with " + params.platform);
return;
}
var rootURI = microblogs[params.platform].RootURI;
/*
TODO Replace this nasty JSON eval. Create a smart TW JSON parsing helper?
*/
var updates = eval(responseText);
var count = params.count ? params.count : updates.length;
if (count == 'all')
count = updates.length;
store.suspendNotifications();
/*
TODO Cleaning out the display this way seems to kill future images. Fix me!
*/
removeChildren(params.place);
var msg, m, a, i;
var id, text, creator, timestamp, d;
for(var u=0; u<count; u++) {
msg = updates[u];
id = msg.id.toString();
text = msg.text.htmlDecode();
/*
TODO Format date string nicely.
*/
timestamp = msg.created_at;
d = new Date(timestamp);
creator = msg.user.name;
screenname = msg.user.screen_name;
image = msg.user.profile_image_url;
status_link = rootURI + "/" + screenname + "/statuses/" + id;
user_link = rootURI + "/" + screenname;
/*
TODO move this test to be somewhere more efficient?
*/
if(params.makeTiddlers) {
//create a tiddler for each tweet.
var t = store.fetchTiddler(id);
//if the notes tiddler doesn't exist, then create and save it
if(!t) {
t = new Tiddler(id);
t.text = text;
t.created = d;
t.modifier = creator;
if(msg.url)
t.fields.url = msg.url;
t.fields.screen_name = screenname;
t.fields.profile_image_url = image;
t.fields.status_link = status_link;
t.fields.user_link = user_link;
t.tags.pushUnique(params.platform);
t.tags.pushUnique("Microblog_update");
store.saveTiddler(t.title,t.title,t.text,t.modifier,null,t.tags,t.fields,true,t.created);
}
}
else {
//render the tweets inline.
m = createTiddlyElement(params.place,"div",null,"microblog_update",null);
if(params.avatars){
a = createTiddlyElement(m,"a",null,null,null);
a.href = status_link;
i = createTiddlyElement(a,"img",null,null,null);
i.src = image;
}
createTiddlyElement(m,"span",null,'user',creator);
createTiddlyElement(m,"span",null,'date',timestamp);
createTiddlyElement(m,"span",null,'text',text);
}
}
// Render the tiddlers if they were created.
//var notDrawn = params.place.childNodes;
if(params.makeTiddlers) {
var filter = 'filter:"[tag['+ params.platform+ ']]" template:' + params.template;
// config.macros.ListTemplate.handler(params.place,null,null,null,paramString,null);
config.macros.Microblog.renderTemplate(params.place,filter);
}
/*
TODO Prevent the refresh from clearing the posting form.
*/
refreshDisplay();
store.resumeNotifications();
if(microblogs[params.platform].poll) {
var period = config.macros.Microblog.getInterval(params.platform);
microblogs[params.platform].timer = window.setTimeout(function() {config.macros.Microblog.listen(params.place, params.platform, params.count, params.avatars, params.makeTiddlers, params.template);}, period);
}
else {
microblogs[params.platform].timer = null;
}
};
config.macros.Microblog.reflect = function(place, platform, template) {
var filter = 'filter:"[tag['+ platform+ ']]" template:' + template;
config.macros.Microblog.renderTemplate(place,filter);
};
config.macros.Microblog.renderTemplate = function(place, filter) {
config.macros.ListTemplate.handler(place,null,null,null,filter,null);
};
//refresh this display
config.macros.Microblog.refreshBtn = function(place){
var btn = createTiddlyButton(place, "refresh","refresh",config.macros.Microblog.doRefresh);
var t = story.findContainingTiddler(place);
btn.setAttribute("tiddlerTitle",t.getAttribute('tiddler'));
};
config.macros.Microblog.doRefresh = function(ev){
var e = ev ? ev : window.event;
var t = this.getAttribute("tiddlerTitle");
story.refreshTiddler(t, null, true);
};
//create input UI.
config.macros.Microblog.postform = function(place,platform){
//display the signin form if user not authenticated.
if(!microblogs[platform].authenticated) {
log('authentication needed for ' + platform);
createTiddlyElement(place,"span",null,null,"Please log in to " + platform + " before posting an update." );
}
else {
var f = createTiddlyElement(place,"form");
f.id = platform + "_postform";
// createTiddlyElement(f,"span",null,null,"post an update");
var input = createTiddlyElement(f,"textarea",'twitter_post_input','twitter_post_input');
input.setAttribute('name','update');
var btn = createTiddlyButton(f,"Update " + platform,"post an update to" + platform,config.macros.Microblog.postUpdate);
btn.setAttribute("platform",platform);
}
};
//Post an upate to the microblog platform.
config.macros.Microblog.postUpdate = function(ev){
var e = ev ? ev : window.event;
var platform = this.getAttribute("platform");
var uri = microblogs[platform].PostURI;
//not required if we let the browser session take care of the authentication.
var usr = microblogs[platform].username;
var pwd = microblogs[platform].password;
if(uri) {
//get the update and post it.
var form = this.parentNode;
var update = "status=" + form['update'].value;
var params = {};
params.platform = platform;
params.field = form['update'];
doHttp("POST",uri,update,null,null,null,config.macros.Microblog.postUpdateCalback,params);
}
else {
log("Ooops. We don't have all the details we need to post this comment.");
}
};
config.macros.Microblog.postUpdateCalback = function(status,params,responseText,url,xhr){
if(xhr.status == 200)
log("posted");
if(params.field)
params.field.value="";
/*
TODO refresh any listings that would show this update.
*/
else
log('There was a problem posting your update to ' + params.platform);
};
config.macros.Microblog.getInterval = function(platform) {
var t = microblogs[platform].Period ? parseInt(microblogs[platform].Period) * 1000 : 60000;
if(isNaN(t))
t = 60000;
return t;
};
} //# end of 'install only once'
//}}}
/***
|''Name:''|MicroformatPlugin|
|''Description:''|Assist constructing Microformats in a TiddlyWiki|
|''Author:''|PaulDowney (psd (at) osmosoft (dot) com)|
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/contributors/PaulDowney/Plugins/MicroformatPlugin.js |
|''Version:''|0.1|
|''License:''|[[BSD open source license]]|
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''~CoreVersion:''|2.2|
Create hCalendar abbr:
<<dtstart [storeName|'YYYYMMDDHHMM'] [dateFormatString]>>
<<dtend [storeName|'YYYYMMDDHHMM'] [dateFormatSting]>>
***/
//{{{
if(!version.extensions.Microformat) {
version.extensions.Microformat = {installed:true};
config.options.timeFormat = "0hh:0mm";
config.macros.dtstart = {};
config.macros.dtstart.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
Microformat_abbr(place,macroName,params,wikifier,paramString,tiddler);
}
config.macros.dtend = {};
config.macros.dtend.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
Microformat_abbr(place,macroName,params,wikifier,paramString,tiddler);
}
Microformat_abbr = function(place,macroName,params,wikifier,paramString,tiddler) {
className = macroName;
format = config.options.timeFormat;
// date is in TiddlyWiki YYYYMMMDDHHMM format
if(params[0]) {
if(params[0].match(/^\d/)) {
value = params[0];
}else{
value = store.getValue(tiddler,params[0]);
}
}
// formatDateString
if(params[1]) {
format = params[1];
}
d = Date.convertFromYYYYMMDDHHMM(value);
var text = d.formatString(format);
// microformats is ISO YYYY-MM-DDTHH:MM:SS format
var iso = value.substr(0,4) + "-" + value.substr(4,2) + "-" + value.substr(6,2)
+ "T" + value.substr(8,2) + ":" + value.substr(10,2) + ":00";
var e = createTiddlyElement(place,'abbr',null,null);
e.setAttribute('title',iso);
e.setAttribute('class',className);
createTiddlyText(e,text);
};
} //# end of 'install only once'
//}}}
Using social networks for market research. Close to consumers, own panels, technology-driven, company only has 35 people.
*Idea generation
*Idea screening
*Concept generation / refinement
*Concept screening
*Market testing
*Launch
They let consumers comment on potential products.
Research 2.0 > "Now listening to every opinion ever expressed"
Process:
*Consumers invited through the Dialego panel
*Screening process for the target group
*Discussion and tagging among the respondents
*Analysis, management summary
UK URL: http://www2.dialego.de/72.0.html?&size;=0&L;=3
notes scraped from the [[backchannel|irc://irc.freenode.net/%23blogtalk]] [[archive|http://tuukka.iki.fi/tmp/blogtalk-2008-03-04]]:
15:19:14 Andera Gadeib: "understanding our customer - taking the escallator to the fitness centre"
15:21:42 how was this slide cretead?
15:22:06 Gandalfar: sent you a tweet
15:22:21 Gandalfar: basically my xmpp tag is small because of a CSS error :)
15:22:25 my tag cloud isn't particularly intellegent
15:25:05 that should be interesting :-D
15:25:54 let me figure out how to securily do updates, I think it's just an sha1 thing
15:27:03 do you have the updates url set in the xpi settings file?
15:29:58 Gabriela: thanks for the notes http://coniecto.blogspot.com/2008_03_01_archive.html#9170266738138326141
15:32:16 pretty graphics :)
15:32:23 i like swooshy things
15:33:28 I don't believe in idea that consumers know how to self-reflect
15:33:42 infact over and over it's been shown that they don't
15:34:10 they are usually pretty good the product that they like more than other options, but even that is suspect to the testing parameters
15:34:39 at picking the product
15:34:39 heh
15:34:52 in that context .. this whole presentation .. it's a lot of pretty pictures .. but for more in-depth analysis ..
15:36:09 kind of sounds that they are in similiar market that coComment
15:39:37 Casablanca: Wisdom of Crowds talks about independent views and influence between participants. How do you stop active members skewing the outcome?
"Blogging is often about teaching us how we ought to feel"
Argument: Weblogs are not consumer to consumer
Weblogs want:
- to be the first
- to be in the know
- to be independent
Blogging is often about teaching us 'how we ought to feel' (sentimental)
Why do we write blogs (diaries)?
"Links are the most significant punctuation in 350 years".
Yay, I love Mark. I'm 100% with him on the idea that blogs and wikis elevate linking to be part of the punctuation of writing.
<!--{{{-->
<div class='myNotes'>
<div class='toolbar' macro='toolbar -cancelTiddler +saveTiddler'></div>
<div class='editor' macro='edit text'></div>
<div class="editor tags" macro="edit tags"></div>
</div>
<!--}}}-->
<!--{{{-->
<div class='myNotes'>
<div class='toolbar' macro='toolbar closeTiddler +editTiddler'></div>
<div class="noteOptions" macro="MakeNotesControl sharing"></div>
<div class='viewer' macro='view text wikified'></div>
</div>
<!--}}}-->
<<Speaker>>, founder and CEO of [[Radar Networks|http://www.radarnetworks.com/]], is one of the leading voices of the emerging Semantic Web, often referred to as Web 3.0. Nova founded Radar Networks to develop the next evolution of social software, based on the Semantic Web. In 1994, Nova co-founded ~EarthWeb, one of the first Internet companies. ~EarthWeb went public in 1998 and resulted in the Nasdaq's largest ~IPO single-day percentage point gain up to that point, spawning a wave of techology IPOs. Prior to ~EarthWeb, Nova worked at artificial intelligence and supercomputing ventures including Individual Inc., Xerox/Kurzweil and Thinking Machines. Nova is also the founder of Lucid Ventures, an early-stage incubator that originated the technologies that are now part of Radar Networks. Nova is a co-founder of the San Francisco Web Innovators Network (SFWIN), a network of several hundred technology innovators and business leaders who meet monthly in the Bay Area. Nova also worked with SRI and Sarnoff Laboratories at the end of the 90s to helped to co-found nVention, SRI's in-house technology incubator. Nova's weblog, [[Minding the Planet|http://novaspivack.typepad.com/]], focuses on Web 3.0 and other emerging science and technology topics.
<<SpeakerSession>>
You must sign up to indicate your attendance and to ensure a seat, the wiki invite key is "Cork": http://bloggersdinnercork08.pbwiki.com/
<!--{{{-->
<div id='messageArea'></div>
<div class='header' >
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerControls' refresh='content' tiddler='HeaderControls'></div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
</div>
<div id='agendaMenu' refresh='content' force='true' tiddler='AgendaMenu'></div>
<div id='displayArea'>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
<html>Blogging has mainly been used for commentary on a particular topic, for publishing news items of interest, and for personal thoughts and ideas. However, many new social media services - text and video microblogging (<a href="http://www.twitter.com/">Twitter</a>, <a href="http://www.seesmic.com/">Seesmic</a>), social network whiteboards or walls, and so on - are focusing on conversations via social networks, with replies often having equal status to the original messages. The nature of these new services is also somewhat different from blogging, focussing on spontaneous (shorter) messages and more random chat topics. We will discuss what distinguishes blogging from other social media discussion systems, and see if blogging habits are changing in the face of these new social media services (e.g., see <a href="http://wordpress.com/blog/2008/01/28/introducing-prologue/">Prologue</a>).</html>
Blogging habits have changed with microblogging. Barriers to entry have gone up; we used to just write a title
Large number of people in the room use Twitter, large number have a blog, but not all that many believe their blogging behaviour has changed since Twitter.
Tom Raftery has gone from 2-3 blog posts per day to 2-3 blog posts per week, due to Twitter's "attention sink".
Writing insignificant things on twitter has made one of the panelists think more about the type of blog posts that might make people unsubscribe (leading to less posts on trivial subjects).
Panelist compares Twitter to IRC...says that Twitter has effectively bought a lite form of IRC functionality to the masses. Especially to those who wouldn't know how to run an IRC client. Hear hear!
Your notes... notes scraped from the [[backchannel|irc://irc.freenode.net/blogtalk]]
12:15:18 cjb_ie, do you got a neo though?
12:17:45 wow, irish broadband penetration kinda sucks
12:18:00 q: 3 tags for our interests in social media...
12:18:02 bring them on!
12:18:25 tommorris, what i hear they work on it a lot in this sparsely populated country
12:18:28 collaboration
12:18:34 mine would be: archival, decentralisation, integration
12:18:49 synergy
12:19:12 academic, sociology, practice
12:20:05 conversation
12:20:29 (can anyone take the edge off of the microphone echo? it seems almost a feedback noise, but not quite)
12:20:41 tags: cheese, sex, monkeys
12:21:47 ACTION echo .. echo .. echo
12:23:15 danbri: will turn it down - is that better
12:23:32 Cloud_: :-)
12:26:16 Cloud_, much better yeah
12:27:01 Paragraphs are so 20th century
12:27:06 thumblers then?
12:27:39 txts
12:29:01 did i hear prolog?
12:29:18 http://wordpress.com/blog/2008/01/28/introducing-prologue/
12:29:48 if you like prolog check out http://www.w3.org/1999/11/11-WWWProposal/rdfqdemo.html
12:30:03 :)
12:30:07 (prolog in javascript by Jan Grant)
12:30:18 so prologue as i understand it is basically a skin for wordpress
12:30:26 that is on the front end of a group blog
12:30:37 that restricts the length of blog posts
12:30:51 and makes it "twitter"-like by forcing microblog entries
12:32:14 reminds me, we used to have a channel #foaf where thou must only use four char word text...
12:33:50 I prefer #idle where you can't talk at all
12:34:51 ok times change... thanks danbri and Cloud_
12:40:19 and there was me thinking "prolog in javascript" meant "a js implementation of the declarative language" :/ guess i'm stuck in the 20th century
12:41:24 cjb_ie, precisely
12:42:45 cjb_ie, it is exactly that. take a look.
12:43:08 the panel prologue is http://wordpress.com/blog/2008/01/28/introducing-prologue/
12:43:16 we're just hypertexting :)
12:46:48 four word text: just shat atop thee
12:48:16 question from audience (me :) .... have these new services changed the way you use IM/IRC chat?
12:48:25 ah yeah, guy standing up said same thing more or less
12:48:51 twitter didn't change my blogging, but i think i've moved some behaviour out of more private im/irc into twitter
12:49:25 twitter has made IM more universal for me - I can do it from my phone, computer, API etc
12:52:28 the reply structure in twitter leaves a lot to be desired as well as that issue donncha mentioned wrt private updates
12:54:32 I just signed up for jaiku (as 'danbri') to see if its better in that regard, ... but it doesn't seem to have much fancyness for re-finding one's buddies
12:57:12 depressed by "bloggers" talking about twitter
12:57:24 twerps the lot of them
12:57:31 ACTION reminded of psd's twitter/twerp post, http://blog.whatfettle.com/2008/01/05/are-you-a-twitter-twit-or-a-twerp/
12:58:00 ACTION is still trying to figure out what web 2.0 is ;)
13:03:19 danbri: just added you on jaiku ;)
13:06:02 i'd add you back if i could see how :)
13:07:07 danbri: http://jaiku.com/contacts/followers
13:07:28 hey tom, is the twitter-to-foaf thingy yours?
13:07:45 yep
13:07:50 opiumfield.com is my non-egocentric URI
13:08:19 is there already a utility in twitter scene for finding which contacts some people have in common?
13:08:28 Hmmm Hey Tom and Co... Just checking out the #blogtalk slides http://www.slideshare.net/CaptSolo/foaf-for-social-network-portability
13:08:30 if not a sparql thingy would be cool
13:09:13 "I always google for 'thing problem'" before I buy 'thing'"
13:09:21 danbri; not as far as I know
13:09:41 i tried loading a couple feeds into sparqlpress, but hit a sysadmin snag so am falling back on lazyness
13:09:42 I've written a SPARQL-based one in Python though - http://tommorris.org/blog/2007/09/24
13:09:53 ah cool
13:10:28 Are there any live feeds audio or video?
13:12:05 Stephen, andreavascellari: I am trying to stream, but it is just totally unreliable
13:12:46 no problem ;) Do you have any link?
13:13:10 tuukkah: drop it here on the chat!
13:13:25 I'm interested in tuning in somehow to Michael Breidenbrücker (Lovely Systems, Last.fm) at 2pm GMT
13:14:24 I'm interesting in the difference between "are blogs a social network" vs "is blogging social networking?"
13:14:52 i think latter form generally encourages more clarity
13:16:14 heheh: tweet from TextMate - http://muffinresearch.co.uk/archives/2007/03/20/twitter-from-textmate/
13:16:30 thanks
13:16:30 :)
13:18:37 danbri: good point!
13:19:29 @danbri Is IRC Social networking? I just added you on twitter....
13:22:30 danbri: added you on Twitter too
*Is the phrase "reliable mashup application" an oxymoron?
*Will we ever see one syndication format emerge to dominate or is babelisation inevitable? Desirable?
*Do microformats need governance in order to work?
*Is the mobile web a technological superset subset or mutation of the "original" web?
*Can MMS be equated with WAP. Would that be a category error?
*Has blogging run its course as a phenomenon?
*Are microformats running out of steam or gathering steam?
*How many forms of digital identity will I need to use the Web in 2010?
Conor O'Neill - Runs a consumer news website, uses an html microformat
Ben Ward - Web developer at Yahoo!, administrator of microformats community
Bill de hÓra - Director of Engineering at company which creates blogging software
Sean McGrath - Moderator
''Is the phrase "Reliable mashup" an oxymoron?''
Yes! A whole range of dependables when it comes to integrating services e.g. Twitter 50% uptime! But people are sympathetic when it comes to these.
This is data that wouldn't have been there in the first place, acceptable risk to take.
<<Speaker>>
<<SpeakerSession>>
<<Speaker>> There has been much talk about the 'social graph' recently, given current enthusiasm for social networking sites such as Facebook. The connections between individuals in networks such as these are laden with implicit value and meaning, if only effective means can be found to capture and understand them. Within specific communities, such as that for research and education, the focus around shared interests and common goals can further enhance the potential of the network and the relevance of connections that exist between its members.
Ideas and technologies from the Semantic Web community offer a powerful means by which existing inter-personal networks can be mapped, understood, and put to work in enhancing the flow of ideas and discourse, whether between pupil and teacher, within groups of students, or out beyond the boundaries of a single institution to the less tangible but potentially far stronger peer relationships of collaborating researchers on the global stage.
The [[Talis Platform|http://www.talis.com/platform/]] offers a sound foundation, optimised to harness the potential of mass collaboration in powering a new generation of sophisticated human-centric and information-rich applications. The open standards and specifications-based capabilities of this Semantic Web Platform will be used to illustrate the wider points with regard to leveraging the potential of understanding and utilising the network of relationships that already exist, and that are poorly represented on today's Web.
<<SpeakerSession>>
<<Speaker>>
<<SpeakerSession>>
Put simply, REST gives direct access to data and services in a way that doesn't require an additional messaging layer. This is great for our customers (and the web in general), because it gives developers the flexibility to use these services in whatever way they like. Other claimed benefits include improved response times and server scalability.
The alternative way of exposing these services is over a messaging service such as SOAP. This service is also available if needed.
For a technical description of REST, along with a list of benefits, check out the [[Wikipedia entry|http://en.wikipedia.org/wiki/Representational_State_Transfer]].
/***
|''Name:''|RSSAdaptor|
|''Description:''|Adaptor for talking to RSS 2.0 files|
|''Author''|Jon Lister|
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/contributors/JonathanLister/adaptors/RSSAdaptor.js |
|''Version:''|0.1.7|
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''License''|[[BSD License|http://www.opensource.org/licenses/bsd-license.php]] |
|''~CoreVersion:''|2.2.6|
***/
//{{{
if(!version.extensions.RSSAdaptor) {
version.extensions.RSSAdaptor = {installed:true};
function RSSAdaptor()
{
this.host = null;
this.workspace = null;
return this;
}
RSSAdaptor.NotLoadedError = "RSS file has not been loaded";
RSSAdaptor.serverType = 'rss';
RSSAdaptor.prototype.setContext = function(context,userParams,callback)
{
if(!context) context = {};
context.userParams = userParams;
if(callback) context.callback = callback;
context.adaptor = this;
if(!context.host)
context.host = this.host;
context.host = RSSAdaptor.fullHostName(context.host);
if(!context.workspace)
context.workspace = this.workspace;
return context;
};
RSSAdaptor.fullHostName = function(host)
{
if(!host)
return '';
if(!host.match(/:\/\//))
host = 'http://' + host;
//if(host.substr(-1) != '/')
// host = host + '/';
return host;
};
RSSAdaptor.prototype.openHost = function(host,context,userParams,callback)
{
this.host = RSSAdaptor.fullHostName(host);
context = this.setContext(context,userParams,callback);
context.status = true;
if(callback)
window.setTimeout(function() {callback(context,userParams);},10);
return true;
};
RSSAdaptor.loadRssCallback = function(status,context,responseText,url,xhr)
{
context.status = status;
if(!status) {
context.statusText = "Error reading RSS file:" + context.host;// + xhr.statusText;
} else {
try {
context.tiddlers = RSSAdaptor.rssToTiddlers(responseText,context.rssUseRawDescription);
/*if(context.filter) {
var tw = new TiddlyWiki();
tw.tiddlers = tiddlers;
tiddlers = tw.filterTiddlers(filter);
}*/
} catch (ex) {
displayMessage("Error parsing RSS:"+context.host);
}
}
context.complete(context,context.userParams);
};
// Gets the list of workspaces on a given server
RSSAdaptor.prototype.getWorkspaceList = function(context,userParams,callback)
{
context = this.setContext(context,userParams,callback);
context.workspaces = [{title:"(default)"}];
context.status = true;
if(callback)
window.setTimeout(function() {callback(context,userParams);},10);
return true;
};
// Open the specified workspace
RSSAdaptor.prototype.openWorkspace = function(workspace,context,userParams,callback)
{
this.workspace = workspace;
context = this.setContext(context,userParams,callback);
context.status = true;
if(callback)
window.setTimeout(function() {callback(context,userParams);},10);
return true;
};
// Gets the list of tiddlers within a given workspace
RSSAdaptor.prototype.getTiddlerList = function(context,userParams,callback,filter,username,password)
{
context = this.setContext(context,userParams,callback);
if(!context.filter)
context.filter = filter;
context.complete = RSSAdaptor.getTiddlerListComplete;
if(context.tiddlers) {
var ret = context.complete(context,context.userParams);
} else {
ret = loadRemoteFile(context.host,RSSAdaptor.loadRssCallback,context);
// config.macros.Console.log("loading "+ context.host +" with the credentials: "+username+":"+password);
// ret = doHttp("POST",context.host,null,null,username,password,RSSAdaptor.loadRssCallbackk,context,null);
if(typeof ret != "string")
ret = true;
}
return ret;
};
RSSAdaptor.getTiddlerListComplete = function(context,userParams)
{
context.status = true;
if(context.callback)
window.setTimeout(function() {context.callback(context,userParams);},10);
return true;
};
RSSAdaptor.prototype.generateTiddlerInfo = function(tiddler)
{
var info = {};
info.uri = tiddler.fields['server.host'] + "#" + tiddler.title;
return info;
};
RSSAdaptor.prototype.getTiddler = function(title,context,userParams,callback)
{
context = this.setContext(context,userParams,callback);
context.title = title;
context.complete = RSSAdaptor.getTiddlerComplete;
return context.tiddlers ?
context.complete(context,context.userParams) :
loadRemoteFile(context.host,RSSAdaptor.loadRssCallback,context);
};
RSSAdaptor.getTiddlerComplete = function(context,userParams)
{
for(var i=0; i<context.tiddlers.length; i++) {
if(context.tiddlers[i].title == context.title) {
context.tiddler = context.tiddlers[i];
break;
}
}
if(context.tiddler) {
context.status = true;
} else {
context.status = false;
context.statusText = "error retrieving tiddler: " + title;
return context.statusText;
}
if(context.allowSynchronous) {
context.isSynchronous = true;
context.callback(context,userParams);
} else {
window.setTimeout(function() {context.callback(context,userParams);},10);
}
return true;
};
RSSAdaptor.prototype.close = function()
{
};
RSSAdaptor.rssToTiddlers = function(rss,useRawDescription)
{
var tiddlers = [];
rss = rss.replace(/\r+/mg,"");
// regex_item matches on the items
var regex_item = /<item>(.|\n)*?<\/item>/mg;
// regex_title matches for the titles
var regex_title = /<title>(.|\n)*?<\/title>/mg;
var regex_guid = /<guid>(.|\n)*?<\/guid>/mg;
var regex_wiki = /<tw:wikitext>(.|\n)*?<\/tw:wikitext>/mg;
var regex_desc = /<description>(.|\n)*?<\/description>/mg;
var regex_category = /<category>(.|\n)*?<\/category>/mg;
var regex_link = /<link>(\S|\n)*?<\/link>/mg;
var regex_pubDate = /<pubDate>(.|\n)*?<\/pubDate>/mg;
var regex_author = /<author>(.|\n)*?<\/author>/mg;
var regex_source = /<source([^>]*)>([^<]*)<\/source>/m;
var item_match = rss.match(regex_item);
var length = item_match ? item_match.length : 0;
for(var i=0;i<length;i++) {
// create a new Tiddler in context.tiddlers with the finished item object
// grab a title
var item = {};
var title = item_match[i].match(regex_title);
if(title) {
item.title = title[0].replace(/^<title>|<\/title>$/mg,"");
} else {
// something went wrong grabbing the title, grab the guid instead
title = item_match[i].match(regex_guid);
// TEMP FIX FOR DEMO 21/11/07
if(title) {
item.title = title[0].replace(/^<guid>|<\/guid>$/mg,"");
} else {
item.title = new Date();
displayMessage("problem with getting title AND guid: " + item_match[i]);
}
}
// This line makes sure any html-encoding in the title is reversed
item.title = item.title.htmlDecode();
// There is a problem with the title, which is that it is not formatted, so characters like ' are not converted at render time
// renderHtmlText() extends String and sorts out the problem
item.title = item.title.renderHtmlText();
var t = new Tiddler(item.title);
// grab original wikitext if it is there as an extended field
var wikitext = item_match[i].match(regex_wiki);
if(wikitext) {
item.text = wikitext[0].replace(/^<tw:wikitext>|<\/tw:wikitext>$/mg,"");
item.text = item.text.htmlDecode();
t.text = item.text;
} else {
// use the description as the tiddler text
var desc = item_match[i].match(regex_desc);
if(desc) {
item.text = desc[0].replace(/^<description>|<\/description>$/mg,"");
} else {
item.text = "empty, something seriously wrong with this item";
}
t.text = useRawDescription ? item.text.renderHtmlText() : "<html>" + item.text.renderHtmlText() + "</html>";
}
// grab the categories
var category = item_match[i].match(regex_category);
if(category) {
item.categories = [];
for(var j=0;j<category.length;j++) {
item.categories[j] = category[j].replace(/^<category>|<\/category>$/mg,"");
}
t.tags = item.categories;
}
// grab the link and put it in a custom field (assumes this is sensible)
// regex_link assumes you can never have whitespace in a link
var link = item_match[i].match(regex_link);
if(link) {
item.link = link[0].replace(/^<link>|<\/link>$/mg,"");
} else {
item.link = "#";
}
t.fields["linktooriginal"] = item.link;
// grab date created
var pubDate = item_match[i].match(regex_pubDate);
if(pubDate) {
pubDate = pubDate[0].replace(/^<pubDate>|<\/pubDate>$/mg,"");
item.pubDate = new Date(pubDate);
} else {
item.pubDate = new Date();
}
t.created = item.pubDate;
// grab author
var author = item_match[i].match(regex_author);
if(author) {
author = author[0].replace(/^<author>|<\/author>$/mg,"");
item.author = author;
} else {
item.author = "anonymous";
}
t.modifier = item.author;
// grab source url and name
source = item_match[i].match(regex_source);
if (source) {
source_url = source[1].replace(/ url="|"$/mg,"");
source_name = source[2];
t.fields.source_url = source_url;
t.fields.source_name = source_name;
} else {
// No source field is ok
}
tiddlers.push(t);
}
return tiddlers;
};
config.adaptors[RSSAdaptor.serverType] = RSSAdaptor;
// renderHtmlText puts a string through the browser render process and then extracts the text
// useful to turn HTML entities into literals such as ' to '
// this method has two passes at the string - the first to convert it to html and the second
// to selectively catch the ASCII-encoded characters without losing the rest of the html
String.prototype.renderHtmlText = function() {
var text = this;
var regex_cdata = /<!\[CDATA\[((?:.| )*?)\]\]>/mg;
regex_cdata.lastIndex = 0;
var match = regex_cdata.exec(this);
if(match) {
text = match[1];
}
var e = createTiddlyElement(document.body,"div");
e.innerHTML = text;
text = getPlainText(e);
text = text.replace(/&#[\w]+?;/g,function(word) {
var ee = createTiddlyElement(e,"div");
ee.innerHTML = word;
return getPlainText(ee);
});
removeNode(e);
return text;
};
} //# end of 'install only once'
//}}}
<<Speaker>>
<<SpeakerSession>>
/***
|''Name:''|RawViewMacroPlugin|
|''Description:''|Add extra view to the view macro for raw HTML||
|''Version:''|0.0.1|
|''Date:''|Mar 2, 2008|
|''Source:''|http://svn.tiddlywiki.org/Trunk/contributors/PaulDowney/Plugins/RawViewMacroPlugin|
|''Author:''|PaulDowney (psd (at) osmosoft (dot) com)|
|''License:''|[[BSD open source license]]|
|''~CoreVersion:''|2.1.0|
|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|
Include raw HTML in a template, etc:
<<view text raw>>
***/
//{{{
config.macros.view.views.raw = function(value,place,params,wikifier,paramString,tiddler) {
createTiddlyElement(place,"span",null,null).innerHTML = value;
};
//}}}
// Requires config.macros.Microblog
config.macros.RippleTech = {};
config.macros.RippleTech.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
var platform = params[0];
config.macros.Microblog.settings(platform);
var uri = microblogs[platform].ListenURI;
var count = params[2];
var avatars = params[3] =='avatars' ? true : false;
var makeTiddlers = params[4] =='makeTiddlers' ? true : false;
var template = params[5];
var context = {
host:uri,
place:place,
platform:platform,
count:count,
avatars:avatars,
makeTiddlers:makeTiddlers,
rssUseRawDescription:true,
template:template
};
var adaptor = new RSSAdaptor();
wikify("{{loadingIndicator{\n\nloading...}}}",place);
var ret = adaptor.openHost(context.host,context,params,config.macros.RippleTech.onOpenHost);
if (typeof(ret) == "string") {
displayMessage("problem opening host: " + ret);
return false;
}
else if (ret) {
return true;
}
};
config.macros.RippleTech.onOpenHost = function(context,params) {
var ret = context.adaptor.getTiddlerList(context,params,config.macros.RippleTech.convertItemsToJSON);
if (typeof(ret) == "string") {
displayMessage("problem opening tiddlers: " + ret);
return false;
}
else if (ret) {
return true;
}
};
config.macros.RippleTech.convertItemsToJSON = function(context,params) {
// Requirement: convert Tiddlers to the minimal twitter format needed:
// [{created_at:modified,text:text,user:{name:modifier}},...]
var items = context.tiddlers;
var JSONarray = [];
for (var i in items) {
var item = items[i];
if (item instanceof Tiddler) {
var itemObject = {};
itemObject.url = item.fields.linktooriginal;
itemObject.id = "post from "+itemObject.url;
itemObject.created_at = item.created.formatString("ddd, DD MMM YYYY 0hh:0hh:0ss TZD");
itemObject.text = item.text;
itemObject.user = {};
// this isn't really the name, but the first field that gets displayed by the Microblog listenHandler
itemObject.user.name = item.title;
if(item.modifier == "anonymous" && item.fields.source_name)
// itemObject.user.name += " by <a href="+item.fields.linktooriginal+">"+item.fields.source_name+"</a>";
itemObject.user.name += " by "+item.fields.source_name;
else if(item.modifier)
// itemObject.user.name += " by <a href="+item.fields.linktooriginal+">"+item.modifier+"</a>";
itemObject.user.name += " by "+item.modifier;
else
itemObject.user.name += " by anonymous";
JSONarray.push(itemObject);
}
}
var JSONstring = JSONarray.toJSONString();
config.macros.Microblog.listenHandler(true,context,JSONstring,context.host,null,context.template);
};
<<Speaker>> Social networking has become one of the most important types of Internet service. However, today's social networks suffer from a lack of openness and portability. Users are becoming bored with having to be involved in too many similar but separate networks. In this presentation, we discuss a decentralised architecture that can turn a user's blog into a social network based on open standards. With this approach, users will be able to create, store, and manage their profile and social graph on their own site, as well as being able to share data among different sites. A prototype is being developed as a proof of concept and also to test the acceptance and the usability of this approach.
<<SpeakerSession>>
Safari and Opera can save changes using the ~TiddlySaver Java applet.
The ~TiddlySaver Java applet allows TiddlyWiki from a {{{file://}}} URL to save changes with Safari, Opera and other browsers.
It is a small file named [["TiddlySaver.jar"|http://www.tiddlywiki.com/TiddlySaver.jar]] that must be placed in the same directory as your TiddlyWiki file. Before you can use it, you need to give it the necessary privileges by editting your {{{.java.policy}}} file.
For Windows, the file will be at {{{C:\Documents and Settings\your-user-name\.java.policy}}}. Add the following lines (substituting the directory of your TiddlyWiki file as appropriate):
{{{
grant codeBase "file:${user.home}/My Documents/tiddlywiki-folder/*" {
permission java.io.FilePermission "${user.home}${/}My Documents${/}tiddlywiki-folder${/}*", "read,write";
};
}}}
On Mac OS X, the file is found at {{{/Users/your-user-name/.java.policy}}}:
{{{
grant codeBase "file:${user.home}/Documents/tiddlywiki-folder/*" {
permission java.io.FilePermission "${user.home}${/}Documents${/}tiddlywiki-folder${/}*", "read,write";
};
}}}
It can be tricky creating files whose name starts with a period, so you can use this [[pre-built .java.policy file|.java.policy]]. The same file is suitable for Macs too, just edit it and delete the "My " bit, leaving just "Documents". Make sure you save it in the right place for each operating system!
If you have trouble setting up the permissions correctly, you can try granting broader permissions to the applet like this:
{{{
grant codeBase "file://localhost/home/users/Desktop/
TiddlySaver.jar"
{ permission java.security.AllPermission; };
}}}
Note that there is currently [[a bug|http://trac.tiddlywiki.org/ticket/172]] that prevents TiddlySaver from working if you have specified a backup directory in AdvancedOptions.
<<Speaker>> is currently the head of Brickhouse, [[Yahoo!|http://www.yahoo.com/]]'s internal "ideas factory" where game-changing ideas are brought in, built and launched. He is also a successful angel investor and entrepreneur, and has operated seven early-stage companies. Salim serves as chairman of [[Confabb.com|http://www.confabb.com/]], the world's largest directory of conferences, and he also co-founded and built [[PubSub Concepts|http://www.pubsub.com/]], a prominent New York-based startup which built internet-scale publish / subscribe systems. He started his career as a software engineer with CSC Europe, and then worked with ITIM Associates as a business and technology strategy consultant for five years. After building and operating two other early-stage companies, Salim founded the New York Grant Company in 2002, which in its first year attracted over 400 clients and delivered over $12 million of federal grants to the local economy. In 2001, Salim was presented with a New York City Award of Recognition by the Giuliani administration, and in 2003 he was nominated by Crain's Magazine as one of New York City's "Top 40 under 40" businesspeople. Salim has an honors degree in theoretical physics and computing from the University of Waterloo near Toronto, Canada.
<<SpeakerSession>>
<<Speaker>> graduated in Computer Science from [[Trinity College Dublin|http://www.tcd.ie/]] in 1987. He has worked for 20 years in the IT industry, and is a vocal proponent of the power of mashups, microformats, syndication formats and dynamically-typed programming environments. He is ~CTO with legislative software specialists [[Propylon|http://www.propylon.com/]]. Sean served as an invited expert to the [[W3C Special Interest Group|http://www.w3.org/XML/SIG/#w3c-xml-sig]] that created XML in 1997. He is an early innovator in the mobile web: he was using [[RSS and WAP in 1999|http://static.userland.com/userLandDiscussArchive/msg013301.html]]; he was the architect of [[Mission Control|http://www.onlinepressreleases.com/onlinepr/128lst/045612.shtml]], an early mobile portal; and he was also involved in the foundation of Irish mobile social networking company [[New Bay|http://www.newbay.com/]]. Sean is the author of three books on markup languages (two on XML and one on SGML). He has been running an [[Irish technology blog since 2002|http://seanmcgrath.blogspot.com/2002_09_08_seanmcgrath_archive.html]]. Sean has also been a columnist for ITWorld for the past six years ([[1|http://www.itworld.com/nl/ebiz_ent/]], [[2|http://www.itworld.com/nl/xml_prac/]]).
<<SpeakerSession>>
<!--{{{-->
<div class='session_edit'>
<div class='toolbar' macro='toolbar -cancelTiddler +saveTiddler'></div>
<div class="label">Session title</div><div class="title editor" macro="edit title"></div>
<div class="label">Speaker (one or more names, separated by commas)</div><div class="speaker editor" macro="edit rr_session_speaker"></div>
<div class="label">Start time (YYYYMMDDHHMM)</div><div class="start editor" macro="edit rr_session_starttime"></div>
<div class="label">End time (YYYYMMDDHHMM)</div><div class="end editor" macro="edit rr_session_endtime"></div>
<div class="label">Tags (include "session" and a track tag)</div><div class="track editor" macro="edit tags"></div>
<div class="label">Synopsis</div><div class='synopsis editor' macro='edit text'></div>
</div>
<!--}}}-->
<!--{{{-->
<div class='session'>
<div class='toolbar' macro='toolbar closeTiddler editTiddler'></div>
<div class="title" macro="view title"></div>
<span class="time"><span macro="dtstart rr_session_starttime '0hh:0mm'"></span>-<span macro="dtend rr_session_endtime '0hh:0mm'"></span></span>
<div class="speaker" macro="TiddlifyList rr_session_speaker"></div>
<div class="noteOptions" macro="MakeNotesControl create"></div>
<div class='viewer' macro='view text wikified'></div>
</div>
<!--}}}-->
1. Copy the ~RippleRap file to your desktop and open it in your browser from there. <<browser is Gecko>>
''Note:'' If you see dialog boxes asking your permission for the local file operations, allow these for ~RippleRap to work properly. You can select the //Remember this decision// option to avoid seeing the dialogs in future.
>><<browser is IE>>
//''Note:'' Because you are using Internet Explorer, you may see dialog boxes asking your permission for the local file operations, allow these for ~RippleRap to work properly.//
>><<browser is Opera>>
//''Note:'' Because you are using Opera, you will also need to install the TiddlySaver java applet.//
>><<browser is Safari>>
//''Note:'' Because you are using Safari, you will also need to install the TiddlySaver java applet.//
>>
2. Enter a name and password, and then click the big pink button. At this point, ~RippleRap will save your settings - refresh the file in your browser if you want to make sure. If they were saved, you're ready to go! If not, come on by the Osmosoft stall and we'll help you out, or [[click here for support|Help]].
<<tiddler AccountDetails>>
Note: Don't use the browser's //File > Save As...// function. Since ~RippleRap saves your changes automatically, there's no need.
If you're connected to the web, you can share your notes with others and receive theirs in return, all saved to your local ~RippleRap file, and all fully searchable!
To share your notes, just [[provide a username and password|AccountDetails]], keeping the Share Notes checkbox checked. Your username and password will ensure that your notes are attributed to you in other people's version of ~RippleRap.
Once you've enabled sharing, other people's notes will gradually appear under the items in the agenda on the left.
You can find out more about how ~RippleRap works in the FAQs
You are signed in and ready to use Ripplerap. You can [[login in as a different user|AccountDetails]] if you wish.
the social conferencing tool
[img[RippleRap|./ripplerap_logo.png]]
http://www.tiddlywiki.com/
Introducing OPSN (Open Portable Social Network), allowing Robert to pull in blog data to a social network.
Interesting stuff. Robert kicked off with some nicely self-deprecating remarks; he knows his audience well.
His idea is to use common-or-garden websites/homepages/blogs as nodes in a social network. Some more details here http://www.opsn.net/
Turns out that this is a personal project, and not an "official" Microsoft sponsored project. All to the good, I'd have thought...
notes scraped from the [[backchannel|irc://irc.freenode.net/%23blogtalk]] [[archive|http://tuukka.iki.fi/tmp/blogtalk-2008-03-04]]:
16:23:14 mmm looks like domain grabbers got opsn.com
16:27:52 Rober Mao, Microsoft, cites http://microformats.org/wiki/data-portability
16:28:09 s/Rober/Robert/
16:43:44 As the NorthAm Pacific Coast wakes up, Cork goes to supper
16:46:04 ACTION looks around for supper
16:48:01 ACTION looks around for supper too
/***
|''Name:''|SparklinePlugin|
|''Description:''|Sparklines macro|
***/
//{{{
if(!version.extensions.SparklinePlugin) {
version.extensions.SparklinePlugin = {installed:true};
//--
//-- Sparklines
//--
config.macros.sparkline = {};
config.macros.sparkline.handler = function(place,macroName,params)
{
var data = [];
var min = 0;
var max = 0;
var v;
for(var t=0; t<params.length; t++) {
v = parseInt(params[t]);
if(v < min)
min = v;
if(v > max)
max = v;
data.push(v);
}
if(data.length < 1)
return;
var box = createTiddlyElement(place,"span",null,"sparkline",String.fromCharCode(160));
box.title = data.join(",");
var w = box.offsetWidth;
var h = box.offsetHeight;
box.style.paddingRight = (data.length * 2 - w) + "px";
box.style.position = "relative";
for(var d=0; d<data.length; d++) {
var tick = document.createElement("img");
tick.border = 0;
tick.className = "sparktick";
tick.style.position = "absolute";
tick.src = "data:image/gif,GIF89a%01%00%01%00%91%FF%00%FF%FF%FF%00%00%00%C0%C0%C0%00%00%00!%F9%04%01%00%00%02%00%2C%00%00%00%00%01%00%01%00%40%02%02T%01%00%3B";
tick.style.left = d*2 + "px";
tick.style.width = "2px";
v = Math.floor(((data[d] - min)/(max-min)) * h);
tick.style.top = (h-v) + "px";
tick.style.height = v + "px";
box.appendChild(tick);
}
};
}
//}}}
<!--{{{-->
<div class="VanillaView Speaker">
<div class='toolbar' macro='toolbar closeTiddler closeOthers +editTiddler > fields syncing permalink references jump'></div>
<div class='title' macro='view title'></div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<span class="vcard">
<div class='viewer' macro='view text wikified'></div>
</span>
<div class='tagClear'></div>
</div>
<!--}}}-->
<<Speaker>> is a blogging and social media consultant. Over the last few years, she has consulted and given talks on social tools to a wide range of clients, including schools, businesses large and small (Intel, Romandie Formation), media companies (Femina, Vibrations Magazine), and various non-profits (ciao.ch, FMEL). She combines direct experience online with solid theoretical knowledge of the Internet to explain its complexities, both technical and cultural. Stephanie studied philosophy, Indian religions and French language and literature at the University of Lausanne, where she lives. She has been blogging in French and English since she came back from a year in India in 2000. Her blog [[Climb to the Stars|http://climbtothestars.org]] was one of the first French language blogs, and is today amongst the most popular blogs in Switzerland.
<<SpeakerSession>>
<<Speaker>>
<<SpeakerSession>>
/* page framework */
#agendaMenu { position: static; float: left; width: auto; }
#displayArea { display: inline-block; /* IE bugfix: give layout (hasLayout = true) */ }
#displayArea { display: block; /* restore proper behavior (see IE bugfix above) */ overflow: hidden; margin: 1em 1em 0;}
#tiddlerDisplay { margin:0 1em 2em 1em;}
/* Header */
div.header { background-color:#000; height:96px; position:relative; clear:left;}
#backstageArea,
#backstageToolbar {background-color:#000;}
#backstageToolbar a{background-color:#000;}
div.headerShadow,
div.headerForeground { padding:1px; }
div.headerShadow {color:#fff; height:80px;}
div.headerForeground {display:none; }
span.siteTitle {top:2px;}
span.siteSubtitle {bottom:25px; left:245px; font-size:1em; position:absolute; width:200px;}
div.headerControls { position:absolute; bottom:20px; right:10px; color:[[ColorPalette::SecondaryDark]]; font-size:1.2em;}
div.headerControls input.txtOptionInput { font-size:0.9em; padding: 0.2em; background-color:#222; border:solid 1px #666; color:#eee; margin-right:2em;}
div.headerControls a.button {border-style:none; background-color:#000; color:[[ColorPalette::SecondaryDark]]; margin-right:0.5em;}
/* Primary Nav Buttons */
#mainMenu { display:block; position:relative; width:100%; margin:0; background-color:#ccc; border-top:solid 1px #eee; border-bottom:solid 1px #999; padding:0; line-height:1em; text-align:left;}
#mainMenu a.button { border-style:none; border-right:solid 1px #999; float:left;}
#mainMenu a,
#mainMenu a.tiddlyLink { border-right:solid 1px #999; font-size:1em; margin:0; color:#333; padding:0.3em 1em; line-height:1.8em; }
#mainMenu a:hover,
#mainMenu a.tiddlyLink:hover { background-color:#aaa;}
#mainMenu span.search {position:absolute; right:3px;}
#mainMenu span.search a { border-style:none;}
#mainMenu span.search .txtOptionInput {padding:1px 4px; font-size:1em;}
/* Buttons */
span.chunkyButton { border:solid 1px [[ColorPalette::SecondaryDarkest]]; display:block; padding:0; margin:0 0 0 0;}
span.chunkyButton a.button,
span.chunkyButton a:active.button { white-space:nowrap; font-weight:bold; color:#fff; background-color:[[ColorPalette::SecondaryDark]]; text-align:center; padding:0.4em 2em; margin:0; border-style:none; border-top:solid 1px [[ColorPalette::SecondaryBrightest]]; display:block;}
span.chunkyButton a.button:hover { background-color:[[ColorPalette::SecondaryBright]]; border-style:none; color:#fff; border-top:solid 1px [[ColorPalette::SecondaryBrightest]];}
.small {width:20em;}
/* Agenda */
#agendaMenu { width:260px; float:left; padding:0; margin-top:2.2em; background-color:#f6f6f6; }
#agendaMenu div.tabset { width:100%; overflow:none; display:block; margin:0; padding:0 0 1em 0; background-color:#f9f9f9;}
#agendaMenu div.tabset a.tab { display:block; padding:2px 4px; margin:2px; line-height:1.7em; background-color:#ccc; color:#333; font-weight:bold; font-size:0.9em; margin-right:1px; border-top-style:none; border-bottom:solid 1px #777; border-left:solid 1px #777; }
#agendaMenu div.tabset a.tab:hover { background-color:#aaa; color:#000; border-top-style:none; border-bottom:solid 1px #777; border-left:solid 1px #777;}
#agendaMenu div.tabset a.tabSelected,
#agendaMenu div.tabset a.tabSelected:hover {background-color:#888; color:#000;border-style:none; border-top-style:none; border-bottom:solid 1px #555; border-left:solid 1px #555;}
#agendaMenu div.tabContents { border-style:none; margin:0; padding:0; clear:left;}
/*#agendaMenu div.tabset { margin:1em; padding:0; float:left; overflow:none;}
#agendaMenu div.tabset a.tab { padding:2px 4px; margin:0; line-height:1.7em; background-color:#ddd; color:#333; font-weight:bold; font-size:0.9em; margin-right:1px; border-style:none; }
#agendaMenu div.tabset a.tab:hover { background-color:#ccc; color:#000; }
#agendaMenu div.tabset a.tabSelected,
#agendaMenu div.tabset a.tabSelected:hover {background-color:#bbb; color:#000;border-style:none; }
*/
#agendaMenu { border-right:solid 1px #999; border-bottom:solid 1px #999; background-color:#f0f0f0; font-family:arial; font-size:12px; }
#agendaMenu div.listRelatedTiddler { display: inline-block; ; /* IE bugfix: give layout (hasLayout = true) */ }
#agendaMenu div.listRelatedTiddler { display: block; /* restore proper behavior (see IE bugfix above) */ }
#agendaMenu div.listRelatedTiddler { padding:8px; border-top:solid 1px #ccc; border-right:solid 1px #fff; border-left:solid 10px #ccc; position:relative;}
#agendaMenu div.listRelatedTiddler span.time { font-weight:bold; color:#888; font-size:0.9em; letter-spacing:-0.1em; position:absolute; top:8px; left:8px;}
#agendaMenu div.listRelatedTiddler span.title a { color:#444; display:block; font-weight:bold; text-decoration:none; margin-left:5em; font-size:12px; }
#agendaMenu div.listRelatedTiddler span.speaker { color:#666; display:block; margin:0.2em 0 0 5em; }
#agendaMenu div.listRelatedTiddler div.listRelatedSubTiddler { text-align:right; }
#agendaMenu div.listRelatedTiddler div.listRelatedSubTiddler a { color:#55c; font-size:0.9em; line-height:1.4em; text-decoration:none; }
#agendaMenu div.listRelatedTiddler div.listRelatedSubTiddler a.tiddlyLink:hover,
#agendaMenu div.listRelatedTiddler span.title a:hover { color:#000; text-decoration:underline; background-color:#f0f0f0; }
/*#agendaMenu div.inProgress { border-left:solid 10px #933; background-color:#fff; }*/
/*#agendaMenu div.inProgress a.tiddlyLink:hover { background-color:#fff; }*/
div.tiddler {padding:0; margin:0;}
/* Vanilla tiddlers */
div.tiddler div.VanillaView,
div.tiddler div.VanillaEdit {margin:30px 0 0 0; font-size:1.3em; }
div.layoutTable {margin-bottom:0.5em;}
div.layoutTable table, div.layoutTable table tr, div.layoutTable table td {margin:0; border-style:none;}
input.txtOptionInput { font-size:1.2em; padding: 0.4em; border-top:solid 1px #999; border-right:solid 1px #ccc; border-bottom:solid 1px #ccc; border-left:solid 1px #999; background-color:#f6f6f6;}
div.tiddler sup {font-size:0.7em;}
div.tiddler pre {font-size:0.em;}
/* Session and Notes tiddlers */
div.session .toolbar,
div.session_edit .toolbar,
div.myNotes .toolbar,
div.discoveredNotes .toolbar { text-align:right; padding:0.2em 0;}
div.session .viewer,
div.myNotes .viewer,
div.discoveredNotes .viewer { padding:10px;}
div.session .toolbar a,
div.session_edit .toolbar a,
div.myNotes .toolbar a,
div.discoveredNotes .toolbar a {border-style: none; color:#333;}
div.session .toolbar a:hover,
div.session_edit .toolbar a:hover,
div.myNotes .toolbar a:hover,
div.discoveredNotes .toolbar a:hover {border-style: none; color:#fff; background-color:#333;}
div.session {margin:30px 0 0 0; position:relative;}
div.session,
div.session_edit { background-color:#999; border:solid 2px #333; border-bottom-width:1px; border-right-width:1px; margin:3em 0 0 0; }
div.session .toolbar,
div.session_edit .toolbar {background-color:#aaa; }
div.session .title { margin:0.2em 0 0 10px; font-size:1.5em; font-weight:bold; color:#000;}
div.session .time {margin:0 0.2em 0 10px; font-size:1.2em; font-weight:bold; color:#ddd; display:inline;}
div.session .speaker {margin:0.2em 0 0 0; font-size:1.2em; font-weight:bold; color:#333;display:inline;}
div.session .viewer {margin:0; font-size:1em; color:#222; padding:0.5em 5px 0.5em 10px;}
div.session_edit
div.session_edit .editor .fieldsetFix {margin:0; padding:0.5em;}
div.session_edit .label {margin:1em 0 0.2em 10px;font-size::0.8em; font-weight:normal; color:#fff;}
div.session_edit input {font-size:1em; font-weight:normal; color:#000; padding:2px; margin:0 1em; width:auto; border:solid 1px #555}
div.session_edit .fieldsetFix {margin:0; padding:0.5em;}
div.session_edit textarea { border:solid 1px #555; border-top-color:#444; border-bottom-color:#fff; background-color:#fff;}
/*div.session .editor * {margin:0; padding:0.5em;}*/
div.myNotes { background-color:#ddd; border:solid 1px #333; border-top-style:none; border-left-width:2px; margin:0;}
div.myNotes .toolbar {background-color:#eee; }
div.myNotes .editor {width:90%;}
div.myNotes .editor .fieldsetFix {margin:0; padding:0.5em;}
div.myNotes .editor .fieldsetFix textarea { border:solid 1px #555; border-top-color:#444; border-bottom-color:#fff; background-color:#fff;overflow:auto;}
div.myNotes .tags {display:none;}
div.discoveredNotes { background-color:#ddd; border:solid 1px #333; border-left-width:2px; border-top-style:none; margin:0;}
div.discoveredNotes .toolbar {background-color:#eee;border-left:solid 40px #ccc;}
div.discoveredNotes .title,
div.discoveredNotes .viewer,
div.discoveredNotes .editor {border-left:solid 40px #bbb;}
div.discoveredNotes .editor .fieldsetFix {margin:0; padding:0.5em;}
div.discoveredNotes .editor .fieldsetFix textarea { border:solid 1px #bbb; border-top-color:#aaa; border-bottom-color:#fff; background-color:#eee; }
div.discoveredNotes .title { margin:0; padding:0.5em 10px 0 10px; font-size:1.2em; font-weight:bold; color:#666; }
div.noteOptions { position:absolute; top:2em; right:8px;}
div.noteOptions a.button,
div.noteOptions a:active.button {color:#eee; background-color:#666; border-style:none; border-top:1px solid #bbb; }
div.noteOptions a.button:hover {color:#fff; background-color:#444; border-style:none; border-top:1px solid #ddd;}
/* Twittering */
.twitterStream div.microblog_update {font-size:1em; margin:0; padding:0.4em 0; border-top:solid 1px #ddd; position:relative; }
.twitterStream div.microblog_update img {width:2em; height:2em; border:solid 1px #ccc; padding:1px; position:absolute}
.twitterStream div.microblog_update span.user {color:#669; margin-left:3em;}
.twitterStream div.microblog_update span.date {color:#ccc; margin-left:1em; font-size:0.8em;}
.twitterStream div.microblog_update span.text {color:#333; clear:left; margin-left:3em; display:block;}
#user_form_Twitter span,
#Twitter_postform span {font-size:0.8em; margin-right:1em;}
#user_form_Twitter input,
#Twitter_postform textarea {margin-right:2em; font-size:1em; padding: 0.4em; border-top:solid 1px #999; border-right:solid 1px #ccc; border-bottom:solid 1px #ccc; border-left:solid 1px #999; background-color:#f6f6f6;}
#Twitter_postform textarea {width:30em; height:4em; font-family:arial; font-size:1em;}
#user_form_Twitter a.button,
#Twitter_postform a.button { font-size:0.8em; padding:0.4em; background-color:#444; border-style:none; color:#fff; white-space:nowrap;}
#user_form_Twitter a.button:hover,
#Twitter_postform a.button:hover { background-color:#000; border-style:none; color:#fff;}
/* Blogs */
.blog_item { font-size:1em; margin:0; padding:0.4em 0; border-top:solid 1px #ddd; position:relative; }
.blog_item div.title {color:#669; margin:0; font-size:1em;}
.blog_item div.date {color:#888; font-size:0.8em; margin:0;}
.blog_item div.text {color:#333; margin-bottom:0.6em; clear:left; display:block;}
span.description {font-size:0.8em; color:#555; font-weight:normal; display:block;}
.subtleTabs div.tabset { height:1.4em;}
.subtleTabs div.tabset a.tab {border-style:none; background-color:transparent; color:#999; padding:0.2em 0.6em 0.1em 0.6em;}
.subtleTabs div.tabset a.tabSelected {border:solid 1px #ccc; border-bottom:solid 3px #fff; background-color:#fff; color:#777;}
.subtleTabs div.tabset a.tabUnselected:hover {color:#444;}
.subtleTabs div.tabContents {background-color:transparent; border-style:none; border-top:solid 1px #ccc;}
#messageArea { position: fixed; background-color: #000000; border-color: #CCCCCC; color: #CCCCCC;}
#messageArea a {color:#CCCCCC;}
#messageArea a.button {background-color:#000000; color:#CCCCCC;}
.Speaker img { float: right; }
/***
|Name|TaggedTemplateTweak|
|Source|http://www.TiddlyTools.com/#TaggedTemplateTweak|
|Version|1.1.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Story.prototype.chooseTemplateForTiddler()|
|Description|use alternative ViewTemplate/EditTemplate for tiddler's tagged with specific tag values|
The core function, "story.chooseTemplateForTiddler(title,template)" is essentially a "pass-thru" that returns the same template it was given, and is provided by the core so that plugins can customize the template selection logic to select alternative templates, based on whatever programmatic criteria is appropriate. This tweak extends story.chooseTemplateForTiddler() so that ''whenever a tiddler is marked with a specific tag value, it can be viewed and/or edited using alternatives to the standard tiddler templates.''
!!!!!Usage
<<<
Each alternative template is associated with a specific tiddler tag value by using that tag value as a prefix added to the standard TiddlyWiki template titles, [[ViewTemplate]] and [[EditTemplate]].
For example, any tiddlers that are tagged with ''<<tag media>>'' will look for alternative templates named [[mediaViewTemplate]] and [[mediaEditTemplate]]. Additionally, in order to find templates that have proper WikiWord tiddler titles (e.g., [[MediaViewTemplate]] and [[MediaEditTemplate]]), the plugin will also attempt to use a capitalized form of the tag value (e.g., ''Media'') as a prefix. //This capitalization is for comparison purposes only and will not alter the actual tag values that are stored in the tiddler.//
If no matching alternative template can be found by using //any// of the tiddler's tags (either "as-is" or capitalized), the tiddler defaults to using the appropriate standard [[ViewTemplate]] or [[EditTemplate]] definition.
''To add your own custom templates:''
>First, decide upon a suitable tag keyword to uniquely identify your custom templates and create custom view and/or edit templates using that keyword as a prefix (e.g., "KeywordViewTemplate" and "KeywordEditTemplate"). Then, simply create a tiddler and tag it with your chosen keyword... that's it! As long as the tiddler is tagged with your keyword, it will be displayed using the corresponding alternative templates. If you remove the tag or rename/delete the alternative templates, the tiddler will revert to using the standard viewing and editing templates.
<<<
!!!!!Examples
<<<
|Sample tiddler| tag | view template | edit template |
|[[MediaSample - QuickTime]]| <<tag media>> | [[MediaViewTemplate]] | [[MediaEditTemplate]] |
|[[MediaSample - Windows]]| <<tag media>> | [[MediaViewTemplate]] | [[MediaEditTemplate]] |
|[[CDSample]]| <<tag CD>> | [[CDViewTemplate]] | [[CDEditTemplate]] |
|<<newTiddler label:"create new task..." title:SampleTask tag:task text:"Type some text and then press DONE to view the task controls">> | <<tag task>> | [[TaskViewTemplate]] | [[EditTemplate]] |
//(note: if these samples are not present in your document, please visit// http://www.TiddlyTools.com/ //to view these sample tiddlers on-line)//
<<<
!!!!!Installation
<<<
import (or copy/paste) the following tiddlers into your document:
[[TaggedTemplateTweak]]
<<<
!!!!!Revision History
<<<
''2007.06.23 [1.1.0]'' re-written to use automatic 'tag prefix' search instead of hard coded check for each tag. Allows new custom tags to be used without requiring code changes to this plugin.
''2007.06.11 [1.0.0]'' initial release
<<<
!!!!!Credits
<<<
This feature was developed by Eric L Shulman / ELS Design Studios
<<<
!!!!!Code
***/
//{{{
version.extensions.taggedTemplate= {major: 1, minor: 1, revision: 0, date: new Date(2007,6,18)};
Story.prototype.taggedTemplate_chooseTemplateForTiddler = Story.prototype.chooseTemplateForTiddler;
Story.prototype.chooseTemplateForTiddler = function(title,template)
{
// get default template from core
var template=this.taggedTemplate_chooseTemplateForTiddler.apply(this,arguments);
// if the tiddler to be rendered doesn't exist yet, just return core result
var tiddler=store.getTiddler(title); if (!tiddler) return template;
// look for template whose prefix matches a tag on this tiddler
for (t=0; t<tiddler.tags.length; t++) {
var tag=tiddler.tags[t];
if (store.tiddlerExists(tag+template)) { template=tag+template; break; }
// try capitalized tag (to match WikiWord template titles)
var cap=tag.substr(0,1).toUpperCase()+tag.substr(1);
if (store.tiddlerExists(cap+template)) { template=cap+template; break; }
}
return template;
};
//}}}
Created leading card sorting software.
Very odd start to his presentation, started by asking people what they'd like him to talk about!
Ethical conflict created by social networking. Refers to email sent by Tagged.com, purportedly from a friend, but not sent intentionally. It was a scam.
Emails were sent to old girlfriends, prospective employers, professional colleagues...not very ethical design. Yet Michael Arrington referred to it as very successful. Quechup did the same.
But what if I have to choose between doing the wrong thing by breaking the spirit of the open web, and going out of business because someone else is willing to do so?
Examples
*Spam your contacts
*Enter your other site login
*Join to fix your profile
*One unified social network
*I heard you the first time
*Won't take no for an answer
Spamming the friend network is a poor user experience
- Example: Tagged.com
- Ethical user design
3 shifts driving us: Permeation, Integration, Conflict
Multi-lateral Conflict
DIY Shift
- Web 2.0
- Mash-ups
Co-creation=Consumers are also Designers
Integration = Conflict
Ethical Designer Kit:
- Strategy
- Clear Goals
- Simple Process
- Neutral Framework
-
Treat confict as a natural part of integrated experiences
Joe defines "design" broadly (which I like), and suggests that it's basically deciding what's good and what's bad, with some moral respnsibility sprinkled in. Cool bananas, agrees with my theory that I hire people for their taste, then their experience, and then their skills.
I sadly missed this session. Fingers crossed that other make some notes for me!
Your notes... notes scraped from the [[backchannel|irc://irc.freenode.net/%23blogtalk]]
12:02:43 I need to trust my panelists, simply :-)
12:03:30 sorry I arrived late, but does 'spanish political blogs' mean political blogs in spanish language, or in Spain?
12:03:40 in spain
12:03:55 thanks
12:04:04 there's an election soon
12:04:48 is there any live video stream?
12:05:57 danbri: next weekend is the general elections there
12:07:00 andreavascellari: I am trying to stream, but it is just totally unreliable
12:07:45 cjb_ie, are you here in cork?
12:08:06 Cloud_: I finish at 13:00 anyhow, right?
12:08:19 tuukkah: i'm in cork but not at blogtalk
12:08:28 robachan: ok! What are you using to stream?
12:08:28 ACTION realises she doesn't ahve a wathch
12:08:46 robachan: ok for streaming my session after?
12:08:56 mornin cjb
12:08:56 cjb_ie, oh, are you located in cork more permanently?
12:09:00 unlikely
12:09:05 bunny_cork: anything running irc should be able to tell you the time :p
12:09:35 yes
12:09:36 tuukkah: yup, lived in and around cork since 1981 or thereabouts :)
12:09:54 but I won't be in front iof IRC when I'm moderating my panel
12:09:58 robachan: oh :-(
12:10:02 bother
12:10:31 unless you have some kind of computer that "just works"? ;)
12:10:35 cjb_ie, i'm chatting on an olpc and the logs are generated in haskell :-) my neo is in galway though
12:10:38 ugh
12:10:52 robachan: what about filming? that an option?
12:11:12 Will get what I can on my digital camera
12:11:17 cool
12:11:25 nice!
12:11:44 Hey anybody using QIK there?
12:11:48 robachan: should I leave you mind as a backup?
12:11:57 or ustream?
12:12:07 ACTION finds weirdly ironic article about blogging in ireland: http://www.news.com/8301-10784_3-9884266-7.html
12:12:11 tuukkah: haskell? i looked at it once, made my brain hurt
12:12:15 sure! the more the merrier
12:12:19 robachan: mine, I meant
12:12:38 so when yours dies you can switch
12:12:44 ok, going offline
12:13:15 cjb_ie, so cjb is not your alias but an alter ego ;-)
12:13:32 tuukkah: it's my initials
http://2008.blogtalk.net/programme/davidcushman
Talks about Metcalfe's law - number of people joining a network increase the value of that network.
Then talks about Reed's law - exponential increase because you're making multiple connections.
"I am part of a community, therefore I am"
Hits aren't as important as they used to be. Old broadcast style, add one person and the community increases by one. Metcalfe's law, one to one communications, slight exponential increase. Reed's law, multiple memberships in multiple communities results in a long tail effect. Memberships and sign-ups more important than pure hits.
Turned his slide upside down to create his long tail...
* [[Sarnoff's Law|http://en.wikipedia.org/wiki/Stanley_J._Sarnoff]]
* [[Metcalfe's Law|http://en.wikipedia.org/wiki/Metcalfe's_law]]
* [[Reed's Law|http://en.wikipedia.org/wiki/Reed's_law]]
quote from [[JP|http://confusedofcalcutta.com/]]
your identity is context dependent: "I am part of a community, therefore I am". Even a blacksmith may have other personas, no?
Your notes... notes scraped from the [[backchannel|irc://irc.freenode.net/%23blogtalk]] [[archive|http://tuukka.iki.fi/tmp/blogtalk-2008-03-04]]:
10:21:09 echo?
10:22:26 perfect storm slide
10:22:54 2^n-n-1 where n is the number of participants
10:23:50 @bunny_cork: at the back of the room :)
10:23:52 power law heaven: reed's law, sarnoff's law
10:23:56 ah, cool :-)
10:23:58 broadcast media - the value of network grows in proportion to the number of viewers
10:24:03 n
10:24:13 JanSchmidt: was going to ask you if you were willing to keep a (distracted) eye on the backchannel during the panel?
10:24:24 so that tommorris can ask questions ;-) hehe
10:24:33 @bunny_cork: sure :)
10:24:45 the value of the network grows with the number of people in the network, up to a certain point
10:24:48 thanks JanSchmidt :-)
10:24:50 http://en.wikipedia.org/wiki/Stanley_J._Sarnoff
10:24:58 so we'll have a panel with a door open on the backchannel
10:25:01 :-)
10:25:42 Metcalfe's law
10:25:57 Reed's law
10:26:53 "I am made greater by the sum of my connections - so are my connections" - Stowe Boyd
10:27:09 "Blogging boosts your social life" - http://www.abc.net.au/news/stories/2008/03/03/2178512.htm
10:27:13 cool!
10:27:14 :)
10:27:37 yay! the boss get's a namecheck: http://confusedofcalcutta.com/
10:28:46 pauld: well deserved! :-)
10:30:10 Reed's law: http://en.wikipedia.org/wiki/Reed's_law
10:30:35 nice sandcastle slide
10:34:58 nice photo of David Bowie, in the context of multiple identities of us
10:35:26 a namecheck?
10:36:33 this photo: http://captsolo.net/info/my-img/2007/01/david_bowie_1.jpg
10:38:02 who's on at the moment? (sorry, been distracted with relabelling my flickr photos with the right safety level and content types)
10:38:36 http://2008.blogtalk.net/programme/davidcushman
10:39:36 my current favourite identity - http://github.com/tommorris - like Twitter but for code commits
10:40:00 github sounds interesting
10:42:14 it's the best thing since sliced bread... in fact, better
10:42:50 can soembody explain me what a namecheck is?
10:43:04 the act of mentioning a name?
10:43:33 bunny_cork: when you mention someone's name.
10:44:10 bunny_cork, "to mention the name of a product, brand, or performer publicly, especially in a song, a broadcast, or the press"
10:44:16 it's kinda like a not-so-bad version of name-dropping
10:44:27 Biscuit time! :-)
<<Speaker>>
<<SpeakerSession>>
/***
|''Name:''|TiddlerDisplayDependenciesPlugin|
|''Description:''|Extends the opening and closing of tiddler in the story to ensure that associated tiddlers are correctly displayed|
|''Dependencies|http://www.osmosoft.com/#ListRelatedPlugin |
|''Author:''|PhilHawksworth|
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/contributors/PhilHawksworth/plugins/TiddlerDisplayDependenciesPlugin.js |
|''Version:''|0.0.1|
|''Date:''|Nov 29, 2006|
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]] |
|''~CoreVersion:''|2.2|
Usage:
Including this plugin will simply extend the existing Story.displayTiddler and Story.closeTiddler functions
***/
//{{{
if(!version.extensions.TiddlerDisplayDependenciesPlugin) {
version.extensions.TiddlerDisplayDependenciesPlugin = {installed:true};
config.macros.TiddlerDisplayDependencies = {};
config.macros.TiddlerDisplayDependencies.sharingTag = "shared";
config.macros.TiddlerDisplayDependencies.discoveredNoteTag = "DiscoveredNotes";
config.macros.TiddlerDisplayDependencies.myNoteTag = "note";
config.macros.TiddlerDisplayDependencies.sessionTag = "session";
//store the existing displayTiddler function for use later.
config.macros.TiddlerDisplayDependencies.displayTiddler = Story.prototype.displayTiddler;
//replace the displayTiddler function.
Story.prototype.displayTiddler = function(srcElement,tiddler,template,animate,unused,customFields,toggle) {
var t = typeof(tiddler) == 'string' ? store.getTiddler(tiddler) : tiddler;
var editmode = false;
if(template){
if(template == 2) {editmode = true;}
else if((typeof(template) == 'string') && (template.indexOf("Edit") != -1)) {editmode = true;}
}
if( !editmode && t && (t.isTagged(config.macros.TiddlerDisplayDependencies.myNoteTag) || t.isTagged(config.macros.TiddlerDisplayDependencies.discoveredNoteTag))) {
var s = config.relationships['rapped'].getRelatedTiddlers(store,t.title);
// display the appropriate session tiddler.
var s = config.relationships['rapped'].getRelatedTiddlers(store,t.title);
if(s.length < 1) {
//displayMessage("No related session tiddler found");
return;
}
var sessionTiddler = store.getTiddler(s[0]);
if(!sessionTiddler) {
//displayMessage("No session tiddler found in the store");
return;
}
// display the session tiddler
tiddler = sessionTiddler;
config.macros.TiddlerDisplayDependencies.displayTiddler.apply(this,arguments);
// examine the displayed tiddlers that rap this session tiddler
var r = config.relationships['raps'].getRelatedTiddlers(story,sessionTiddler.title);
var topRelated = store.getTiddler(r[0]);
if(topRelated && topRelated.isTagged(config.macros.TiddlerDisplayDependencies.myNoteTag)) {
//display after topRelated
srcElement = document.getElementById(story.idPrefix + topRelated.title);
tiddler = t;
animate = false;
}
else {
//display after sessionTiddler
srcElement = document.getElementById(story.idPrefix + sessionTiddler.title);
tiddler = t;
animate = false;
}
config.macros.TiddlerDisplayDependencies.displayTiddler.apply(this,arguments);
}
else {
config.macros.TiddlerDisplayDependencies.displayTiddler.apply(this,arguments);
}
};
//store the existing closeTiddler function for use later.
config.macros.TiddlerDisplayDependencies.closeTiddler = story.closeTiddler;
//replace the displayTiddler function.
story.closeTiddler = function(title,animate,unused){
var intentedTitle = title;
var t = store.getTiddler(title);
if(t && t.isTagged(config.macros.TiddlerDisplayDependencies.sessionTag)) {
//close all the tiddlers that rap about this session tiddler.
var r = config.relationships['raps'].getRelatedTiddlers(store,title);
for (var i=0; i < r.length; i++) {
title = r[i];
config.macros.TiddlerDisplayDependencies.closeTiddler.apply(this,arguments);
};
}
//close the tiddler
title = intentedTitle;
config.macros.TiddlerDisplayDependencies.closeTiddler.apply(this,arguments);
};
} //# end of 'install only once'
//}}}
/***
|''Name:''|TiddlifyListPlugin|
|''Description:''|Assist constructing TiddlifyLists in a TiddlyWiki|
|''Author:''|PaulDowney (psd (at) osmosoft (dot) com)|
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/contributors/PaulDowney/Plugins/TiddlifyListPlugin.js |
|''Version:''|0.1|
|''License:''|[[BSD open source license]]|
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''~CoreVersion:''|2.2|
turns a comma-separated list into a series of links to tiddlers
<<tiddlyfyList storeName>>
***/
//{{{
if(!version.extensions.TiddlifyList) {
version.extensions.TiddlifyList = {installed:true};
config.macros.TiddlifyList= {};
config.macros.TiddlifyList.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
var value = store.getValue(tiddler,params[0]);
var tokens = value.split(/\s*,\s*/);
var text = "[[" + tokens.join("]], [[") + "]]";
wikify(text,place);
};
} //# end of 'install only once'
//}}}
The ~TiddlySaver Java applet allows a locally saved ~TiddlyWiki to save changes on Safari, Opera and other browsers. This is slightly complicated, and you might well find it more straightforward using ~RippleRap in Firefox.
The ~TiddlySaver Java applet is a small file named [["TiddlySaver.jar"|http://www.tiddlywiki.com/TiddlySaver.jar]] that must be placed in the same directory as your TiddlyWiki file. Before you can use it, you need to give it the necessary privileges by editting your {{{.java.policy}}} file.
For Windows, the file will be at {{{C:\Documents and Settings\your-user-name\.java.policy}}}. Add the following lines (substituting the directory of your TiddlyWiki file as appropriate):
{{{
grant codeBase "file:${user.home}/My Documents/tiddlywiki-folder/*" {
permission java.io.FilePermission "${user.home}${/}My Documents${/}tiddlywiki-folder${/}*", "read,write";
};
}}}
On Mac OS X, the file is found at {{{/Users/your-user-name/.java.policy}}}:
{{{
grant codeBase "file:${user.home}/Documents/tiddlywiki-folder/*" {
permission java.io.FilePermission "${user.home}${/}Documents${/}tiddlywiki-folder${/}*", "read,write";
};
}}}
It can be tricky creating files whose name starts with a period, so you can use this [[pre-built .java.policy file|.java.policy]]. The same file is suitable for Macs too, just edit it and delete the "My " bit, leaving just "Documents". Make sure you save it in the right place for each operating system!
If you have trouble setting up the permissions correctly, you can try granting broader permissions to the applet like this:
{{{
grant codeBase "file://localhost/home/users/Desktop/
TiddlySaver.jar"
{ permission java.security.AllPermission; };
}}}
Note that there is currently [[a bug|http://trac.tiddlywiki.org/ticket/172]] that prevents TiddlySaver from working if you have specified a backup directory in AdvancedOptions.
~RippleRap is based on the hugely popular TiddlyWiki product; an entire wiki product packaged into a single html file! TiddlyWiki is free, open source, and already has a loyal community of developers and enthusiasts helping to develop it and support new users. There are over 400+ plugins which can be used to configure ~TiddlyWiki in a multitude of ways. It can be used as a task management tool, a de-centralised collaboration tool, a platform for writing and de-bugging software, simply for organising notes or in many other ways.
The entire TiddlyWiki is made up of microcontent called tiddlers, including all the content and the code required to make it function. You're reading a tiddler right now - try double clicking on this text to send it into edit mode. If you have a working knowledge of javascript or css, you can immediately get under the hood, configuring it in any way you like! If you have questions, the TiddlyWiki community is incredibly helpful - there's a [[developer's group|http://groups.google.com/group/TiddlyWikiDev]] and a [[user's group|http://groups.google.com/group/TiddlyWiki]] on Google Groups.
~RippleRap was created by [[Osmosoft|http://www.osmosoft.com]], a small company owned by BT. Osmosoft is run by the original creator of TiddlyWiki, Jeremy Ruston. You can find out more by looking in our [[FAQs]], or alternatively, if you're online, here are some relevant links:
Official ~TiddlyWiki website: http://www.tiddlywiki.com
~TiddlyWiki community: http://groups.google.com/group/TiddlyWiki
~TiddlyWiki developer community: http://groups.google.com/group/TiddlyWikiDev
Osmosoft website: http://www.osmosoft.com
~RippleRap: http://www.ripplerap.com
<<Speaker>>
<<SpeakerSession>>
<!--{{{-->
<div class='session_edit'>
<div class='toolbar' macro='toolbar -cancelTiddler +saveTiddler'></div>
<div class="label">Track title</div><div class="title editor" macro="edit title"></div>
<div class="label">Session tag</div><div class="track editor" macro="edit rr_session_tag"></div>
<div class="label">Tags (include "track")</div><div class="track editor" macro="edit tags"></div>
<div class="label"></div><div style="display:none" macro="edit text"></div>
</div>
<!--}}}-->
<<conditionalDisplay config.options.txtTwitterSignedIn true TwitterPost TwitterLogin>>
{{subtleTabs{<<tabs txtMainTab
"BlogTalk buzz" "Tweets about Blogtalk" BlogTalkTweets
"Your Twitter stream" "You and your friends" TwitterStream
"hide tweets" "hide the twitter streams" Blank >>
{{microblog_update{
<<LinkMaker type:img display:profile_image_url linkto:user_link >> {{user{<<LinkMaker type:text display:modifier linkto:user_link>>}}}{{date{<<LinkMaker type:text display:created linkto:status_link dateformat:'MMM DD at 0hh:0mm'>>}}} {{text{<<view text>>}}}}}}
{{description{In order to post 'tweets' and to access your 'with friends' timeline, you will need to login to [[Twitter|http://twitter.com]] first}}}
<<Microblog Twitter signin>>
Send an update to Twitter:
<<Microblog Twitter postform>>
{{description{These are the [[Twitter|http://www.twitter.com]] updates from you and your friends timelines. This content is updated every 2 minutes. You can also <<Microblog Twitter refreshButton>> the display right now.}}}
{{twitterStream{<<Microblog Twitter listen all avatars makeTiddlers TwitterItemsTemplate>>}}}
<<Speaker>>
<<SpeakerSession>>
<!--{{{-->
<div class="VanillaView">
<div class='toolbar' macro='toolbar closeTiddler closeOthers +editTiddler > fields syncing permalink references jump'></div>
<div class='title' macro='view title'></div>
<!-- <div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>-->
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
</div>
<!--}}}-->
http://webcamp.org/SocialNetworkPortability
http://webcamp.org/SocialNetworkPortability
http://webcamp.org/SocialNetworkPortability
I'm finding increasingly that the flavours of Wasabi flavoured nuts is doing my tiny nut in.
[img[http://farm3.static.flickr.com/2190/2070809570_a8872f797d.jpg]]
Update: Internet folklore gives us [[wasabi doughnuts|http://www.strangenewproducts.com/2005/09/wasabi-flavored-donuts.html]].
http://webcamp.org/SocialNetworkPortability
/***
|''Name:''|WebDavLib|
|''Description:''|WebDav utility functions|
|''Author:''|Saq Imtiaz ( lewcid@gmail.com )|
|''Version:''|0.1.1|
|''Date:''|23/11/2007|
|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''~CoreVersion:''|2.2.3|
***/
// /%
//!BEGIN-PLUGIN-CODE
if (!window.DAV){
DAV = {
run : function(type,u,data,cb,params,headers,contentType,username,password){
var callback = function(status,params,responseText,url,xhr) {
url = url.indexOf("nocache=") < 0 ? url : url.substring(0,url.indexOf("nocache=")-1);
if(params.length){
params.shift().apply(this,[status,params,responseText,url,xhr]);
}
};
params = params||[];
params.unshift(cb);
var r = doHttp.apply(this,[type,u,data,contentType,username,password,callback,params,headers]);
if (typeof r == "string")
alert(r);
return r;
},
get : function(url,cb,params){
return DAV.run("GET",url,null,cb,params,null);
},
put : function(url,cb,params,data,contentType,username,password) {
return DAV.run("PUT",url,data,cb,params,null,contentType,username,password);
},
move : function(url,cb,params,destination,contentType,username,password) {
return DAV.run("MOVE",url,null,cb,params,{"Destination":destination,"Overwrite":"T"},contentType,username,password);
},
copy : function(url,cb,params,destination) {
return DAV.run("COPY",url,null,cb,params,{"Destination":destination,"Overwrite":"T","Depth":0});
},
propfind : function(url,cb,params,prop,depth){ // !!!
var xml = '<?xml version="1.0" encoding="UTF-8" ?>' +
'<D:propfind xmlns:D="DAV:">' +
'<D:prop>'+
'<D:'+prop+'/>'+
'</D:prop>'+
'</D:propfind>';
return DAV.run("PROPFIND",url,xml,cb,params,{"Content-type":"text/xml","Depth":depth?depth:0});
},
makeDir : function(url,cb,params){
return DAV.run("MKCOL",url,null,cb,params,null);
},
options : function(url,cb,params){
return DAV.run("OPTIONS",url,null,cb,params,null);
},
safeput : function(url,cb,params,data,contentType,username,password){
firstcb = function(status,p,responseText,u,xhr){
if(status)
DAV.move(u,cb,p,u.replace("-davsavingtemp",""),contentType,username,password);
else
cb.apply(firstcb,arguments);
};
return DAV.put(url+"-davsavingtemp",firstcb,params,data,contentType,username,password);
}
};
}
~RippleRap is your one-stop event dossier!
*Have easy access to the ''~BlogTalk agenda''
*Manage your conference notes ''offline''
*''Share your notes'' with other delegates
*''See what's said'' - read notes from sessions you may have missed
*''Follow the buzz!'' - see what ~BlogTalk attendees are twittering about
*''Hold the front page!'' - read blog posts about ~BlogTalk
!!Setup instructions
This version of ~RippleRap is a static archive, which means you can't log in and create notes. However, you can see the notes taken at the event by clicking on the links on the left hand side.
John made us all feel welcome!
Aula Maxima, University College Cork
http://2008.blogtalk.net/welcomingreception
IBM presenting Instant Messaging as a technical marvel...are they from the past?
Sub-text: Making the semantic web real.
Talks about Open Tagging as being something very close to semantic web technologies.
proposes an Open Tagging Platform
http://opentagging.org
notes scraped from the [[backchannel|irc://irc.freenode.net/%23blogtalk]] [[archive|http://tuukka.iki.fi/tmp/blogtalk-2008-03-04]]:
17:19:31 interesting q re 'your' tags
17:19:47 in flickr, if you add tags to another persons photos, it seems more part of their data than yours
17:23:13 tommorris: thanks SO much for all the tags
17:23:28 bunny_cork: no problem
Today's verbal delight features Semantic Web hacker (and philosopher) Tom Morris, initially talking about using XML to describe real-world things, mentioning the advantages of RDF. He then describes his experiences with the Ruby programming language, and offers thoughts on practical aspects of working in the distributed environment of the Web. Tom tells of ideas he has around using Bluetooth with RDF, before giving his opinion of platforms like Facebook, and related novel aspects of online gami
Thomas Burg is chairing the afternoon session. Keynote talk: Michael Breidenbrücker (Lovely Systems, Last.fm) Let's face it: Web 2.0 is all about advertising The Germans copy everything; StudiVZ is probably a localised version of Facebook. Another company bought them because they had a lot of traffic. How do we send this traffic to other sites? They put on ads, but they looked like old 1.0 banners- "extraterrestrial beings that happened to be on that site". In Facebook, you have newsfeeds. The
John Breslin, after being a perfect host at the conference dinner last night, is introducing the first speaker of the morning: Keynote talk: Nova Spivack Semantic social software: the Semantic Web for consumers - the 3rd decade of the web - is a period in time, not a technology - a higher resolution web - the web IS the database! - web 3G - the Giant Global Graph instead web 3.0 (2010-2020) OWL SPARQL OpenID Ajax - semantic search, semantic databases, widgets - web 4.0 (2020-2030) (2030's the
I’m in Cork, mainly for the excellent Social Network Portability event on Sunday, but am also staying through Blogtalk’08 which has been great. I’ve uploaded my slides from my talk (slideshare in Flash, included inline here, or a pdf). I have some rough speaking notes too, maybe I’ll get those online. I have no idea how they relate to whatever actually came out of my mouth during the talk :) Apologies to those without PDF or Flash. I haven’t tried Keynote’s HTML output yet. Basically much of
I was lucky enough to have my paper 'Reed's Law and how multiple identities make the long tail just a little longer' selected to be presented at BlogTalk 2008, in Cork, Ireland. So while I could quite happily repeat to you what I had to say (though there's little need while there's that link to the paper itself) I thought it might be better to share a little of what I heard and learned. I was only there for the Tuesday, March 4, the final day of the event - so apologies for those I missed. Twin
Bhí an-oíche Dé Sathairn ag Gradam na mBlaganna i mBaile Átha Cliath. Bhí breis agus 400 duine a bhailigh le chéile i lárionad spioradálta na blagadóireachta in Éirinn, Óstán an Alexander. Táimse ag gabháilt don chraic seo anois le tamall, agus aithne mhaith curtha agam ar chuid mhaith blagadóirí aitheanta faoin am seo. Agus ní ríomh-aithne atá i gceist agam ach oiread. Do b’é seo an 3ú Irish Blog Awards ach, ní h-é sin an t-aon ócáid ag a mbíonn na blagadóirí ag cruinniú. Go deimhin, le bli
Vandaag togen de meeste ambassadeurs naar Wolvega, AOC Terra was onze zeer gastvrije gasheer.Met name de vriendelijkheid en openheid van de leerlingen was heel opvallend. Echt een VMBO school, daar kom ik niet vaak. De week ervoor had ik al positief gereageerd op de oproep of we als we met de auto kwamen even langs het station wilden gaan om de OV-gangers mee te nemen. Waarom wilde er nu niemand in mijn Seicento?De verslagen en presentaties van de workshops met hoofdzakelijk het thema Communi
Quick pointer: the pdf of my BlogTalk slides is here. It's huge (40M) and a better version will be available presently. But, if you need it right away, here it is!
BlogTalk remains a very interesting conference, but one unmoored from its roots in the academe and, indeed, from weblogs. Pretty much gone, now, are the papers on the characteristics of national blogospheres, on effective blogging practice, or on the scholastic uses of weblogs. Instead, there's a lot of interest in social networks, in new standards for exporting lists of friends, in OpenID and mashup plumbing. Several talks showed the same slide, diagramming a succession of Web 2.0, Web 3.0, a
Martha Rotter (Microsoft) has an excellent trip report from BlogTalk. I spent the most of the day walking the windy shores of Kinsale, poking around ruined fortifications, cottages, and a nifty High Modern glass box whose architect I can't seem to find. Then the wind kicked up, and I ducked into a wonderful little pub with a sunny window, a warm fireplace, a pint of the local lager and a William Styron novel.
I’ve insulted the Mac Brigade. I am so sorry. I didn’t realise that putting stickers on an Apple Macbook was such a heinous crime. HOW COULD I HAVE BEEN SO STUPID? Well, that’s how Bernie puts it anyway. Sort of. He posted a photo of my Macbook at BlogTalk and the response surprised me. Hahahaha. Thud! (Laughing my head off) For those who missed the original shot, here’s one I took moments ago. There are stickers from Laughing Squid (and a button too), getfirefox.com (Thanks Nikolay), Zooomr
We attended BlogTalk in Cork earlier this week, and it wasn't half bad. We were running a stall again, handing out copies of RippleRap, and were pleased this time to get a chance to demo it on stage (along with TiddlyWiki). This time the demo Gods were kind and benevolent, and the demo worked throughout, including the one which showcased the BT SDK! The sessions were a mixed bunch. Some (such as Nova Spivack's semantic web talk) were brilliant, and others (such as Mark Bernstein's talk on "Neov
刚刚结束了为期3天的Blog Talk 2008和Web Camp. 我在会议上的关于OPSN幻灯片在这里:http://www.slideshare.net/BlogTalk2008/mao-blogtalk-2008 BlogTalk 2008的全部演讲胶片: http://www.slideshare.net/event/blogtalk-2008 Flickr上的照片在这里: http://www.flickr.com/search/?q=blogtalk2008 不知道是否现在不那么流行当场upload flickr 照片了?照片并不多… Related PostsOPSN的一些小进展我的OPSN的想法被BlogTalk 2008会议接受了,因此3月要去Cork做报告介绍OPSN的想...London day #1WiFi Network in hotel is so limited... only small thumbnails this time... GTD 1个月多小结:效果很明显,工具很缺乏据说30天可以养成一个好习惯,使用GTD
Originally uploaded by alexander.kirk Today is one of the happiest days I’ve had in a long time. Why? Well, Fire Eagle launched. I was in London at the Yahoo UK office for the big moment, and had a couple of pints in the local pub with Tom Croucher-Hughes to celebrate. I mentioned it in my opening keynote at BlogTalk 2008 in Cork on Monday and I’m now heading to Austin to celebrate with Tom and the crew. It’ll be a hell of a party. Fire Eagle is a truly game-changing platform tha
This is officially conference insanity. I just came from Ireland, where I gave the opening keynote address at BlogTalk 2008. Awesome conference and I met some great folks for the first time. Cork, of course, is an old haunt and I love Murphy’s. Pat Phelan again saved my bacon (more about that in another post) Now I’m in Austin at South by SouthWest (SxSW). It’s my first time here… total zoo, and I’m loving it. SxSW is Twitter central and you can’t do anything if you’re not using it. We had a F
and 1 more Fetched from Climb to the Stars (Stephanie Booth) 3 days, 8 hours ago. Add Comment Blogtalk 2008 004
and 8 more Fetched from Twitter / Stephanie Booth 3 days, 5 hours ago. Add Comment Anna Rogozinska: Everyday body regimes: the construction of self in weblogs about dieting (BlogTalk 2008, Cork)
BlogTalk 2008 발표자료 March 6th, 2008 그제 Cork에서 있었던 BlogTalk 2008 발표자료입니다. http://www.slideshare.net/sonagi/interest-scotbased-tag-sharing-services 다른 발표 자료도 참고 하세요. http://www.slideshare.net/event/blogtalk-2008 Tags:blogtalk2008 slide Posted in Semantic Web
Robert Mao works in Microsoft in Europe. Prior to it, he was founder of UUZone, one of the first social network websites in China but entered into dead pool in last year. He is now working on a hobby project called OPSN, which stands for Open Portable Social Networks. In last week, he made a presentation about this project on BlogTalk 2008. We recently conducted a short interview with him to talk about his OPSN project. Disclaimer by Robert Mao: The views expressed here are mine alone and not
<p><a href="http://www.flickr.com/people/psd/">psd</a> posted a photo:</p>
<p><a href="http://www.flickr.com/photos/psd/2314250435/" title="Twitter T"><img src="http://farm4.static.flickr.com/3213/2314250435_c0d6a1644c_m.jpg" width="180" height="240" alt="Twitter T" /></a></p>
<p><a href="http://www.flickr.com/people/psd/">psd</a> posted a photo:</p>
<p><a href="http://www.flickr.com/photos/psd/2315059992/" title="Passes"><img src="http://farm4.static.flickr.com/3241/2315059992_1381061308_m.jpg" width="118" height="240" alt="Passes" /></a></p>
<p><a href="http://www.flickr.com/people/psd/">psd</a> posted a photo:</p>
<p><a href="http://www.flickr.com/photos/psd/2315060806/" title="Phil and The Web is Agreement"><img src="http://farm4.static.flickr.com/3091/2315060806_cf3d587c27_m.jpg" width="240" height="133" alt="Phil and The Web is Agreement" /></a></p>
<p><a href="http://www.flickr.com/people/psd/">psd</a> posted a photo:</p>
<p><a href="http://www.flickr.com/photos/psd/2315061684/" title="OsmoStand"><img src="http://farm3.static.flickr.com/2141/2315061684_6a0714d73b_m.jpg" width="240" height="120" alt="OsmoStand" /></a></p>
<p><a href="http://www.flickr.com/people/psd/">psd</a> posted a photo:</p>
<p><a href="http://www.flickr.com/photos/psd/2315062172/" title="At the Stand"><img src="http://farm4.static.flickr.com/3224/2315062172_0a3bcd7eab_m.jpg" width="222" height="240" alt="At the Stand" /></a></p>
<p><a href="http://www.flickr.com/people/psd/">psd</a> posted a photo:</p>
<p><a href="http://www.flickr.com/photos/psd/2315063224/" title="Michael Breidenbrücker"><img src="http://farm3.static.flickr.com/2413/2315063224_8e353911b2_m.jpg" width="147" height="240" alt="Michael Breidenbrücker" /></a></p>
<p><a href="http://www.flickr.com/people/touristr/">Tourist Republic</a> posted a photo:</p>
<p><a href="http://www.flickr.com/photos/touristr/2314088705/" title="Lunch 5"><img src="http://farm3.static.flickr.com/2335/2314088705_4be29628bb_m.jpg" width="240" height="160" alt="Lunch 5" /></a></p>
<p><a href="http://www.flickr.com/people/touristr/">Tourist Republic</a> posted a photo:</p>
<p><a href="http://www.flickr.com/photos/touristr/2314090263/" title="Lonely Mac Book"><img src="http://farm4.static.flickr.com/3062/2314090263_5dcc72917a_m.jpg" width="240" height="160" alt="Lonely Mac Book" /></a></p>
<p><a href="http://www.flickr.com/people/touristr/">Tourist Republic</a> posted a photo:</p>
<p><a href="http://www.flickr.com/photos/touristr/2314090839/" title="Tom Raftery and Salim Ismael"><img src="http://farm4.static.flickr.com/3264/2314090839_77b6992777_m.jpg" width="240" height="160" alt="Tom Raftery and Salim Ismael" /></a></p>
<p><a href="http://www.flickr.com/people/touristr/">Tourist Republic</a> posted a photo:</p>
<p><a href="http://www.flickr.com/photos/touristr/2314091121/" title="The DERI team"><img src="http://farm4.static.flickr.com/3141/2314091121_8edf99111d_m.jpg" width="240" height="160" alt="The DERI team" /></a></p>
<p><a href="http://www.flickr.com/people/touristr/">Tourist Republic</a> posted a photo:</p>
<p><a href="http://www.flickr.com/photos/touristr/2314091891/" title="DSC_0060.jpg"><img src="http://farm3.static.flickr.com/2327/2314091891_d17beb4623_m.jpg" width="240" height="160" alt="DSC_0060.jpg" /></a></p>
<p><a href="http://www.flickr.com/people/touristr/">Tourist Republic</a> posted a photo:</p>
<p><a href="http://www.flickr.com/photos/touristr/2314094593/" title="Jan from touristr"><img src="http://farm3.static.flickr.com/2020/2314094593_8a083fe434_m.jpg" width="240" height="160" alt="Jan from touristr" /></a></p>
<p><a href="http://www.flickr.com/people/touristr/">Tourist Republic</a> posted a photo:</p>
<p><a href="http://www.flickr.com/photos/touristr/2314095069/" title="It's the way of the future"><img src="http://farm3.static.flickr.com/2327/2314095069_e5ace6947d_m.jpg" width="160" height="240" alt="It's the way of the future" /></a></p>
<p><a href="http://www.flickr.com/people/touristr/">Tourist Republic</a> posted a photo:</p>
<p><a href="http://www.flickr.com/photos/touristr/2314096711/" title="DSC_0075.jpg"><img src="http://farm3.static.flickr.com/2030/2314096711_a94914ce14_m.jpg" width="240" height="160" alt="DSC_0075.jpg" /></a></p>
<p><a href="http://www.flickr.com/people/touristr/">Tourist Republic</a> posted a photo:</p>
<p><a href="http://www.flickr.com/photos/touristr/2314899676/" title="Niall larking with Nova Spivac"><img src="http://farm3.static.flickr.com/2220/2314899676_8fe0c85d31_m.jpg" width="240" height="160" alt="Niall larking with Nova Spivac" /></a></p>
<p><a href="http://www.flickr.com/people/touristr/">Tourist Republic</a> posted a photo:</p>
<p><a href="http://www.flickr.com/photos/touristr/2314906054/" title="Michael Breidenbrücker"><img src="http://farm3.static.flickr.com/2360/2314906054_d45ff2a049_m.jpg" width="240" height="160" alt="Michael Breidenbrücker" /></a></p>
<p><a href="http://www.flickr.com/people/touristr/">Tourist Republic</a> posted a photo:</p>
<p><a href="http://www.flickr.com/photos/touristr/2314907104/" title="DSC_0066.jpg"><img src="http://farm3.static.flickr.com/2340/2314907104_6070b728fc_m.jpg" width="240" height="160" alt="DSC_0066.jpg" /></a></p>
<p><a href="http://www.flickr.com/people/touristr/">Tourist Republic</a> posted a photo:</p>
<p><a href="http://www.flickr.com/photos/touristr/2314907944/" title="DSC_0069.jpg"><img src="http://farm3.static.flickr.com/2263/2314907944_33b676b60d_m.jpg" width="240" height="160" alt="DSC_0069.jpg" /></a></p>
<p><a href="http://www.flickr.com/people/touristr/">Tourist Republic</a> posted a photo:</p>
<p><a href="http://www.flickr.com/photos/touristr/2314908746/" title="DSC_0072.jpg"><img src="http://farm4.static.flickr.com/3100/2314908746_680f3dbe37_m.jpg" width="240" height="160" alt="DSC_0072.jpg" /></a></p>
<p><a href="http://www.flickr.com/people/touristr/">Tourist Republic</a> posted a photo:</p>
<p><a href="http://www.flickr.com/photos/touristr/2314910466/" title="DSC_0076.jpg"><img src="http://farm3.static.flickr.com/2314/2314910466_f0dfe9391d_m.jpg" width="240" height="160" alt="DSC_0076.jpg" /></a></p>
Networking in: Life Experiences, Daily life, blog talk Since I moved in with my computer the boy has been trying to network our computers and get the laptop to work (like it used to) with the wireless router. Neither of these things has occurred yet and he got so frustrated he kinda gave up. The laptop used to work fine, but since we added my computer into the mix, it refuses to connect to the Internet, which is a tad annoying as both our computers are upstairs it was nice to be able to also
Irgendwie hat es diesmal mit dem Konferenzblogging von der BlogTalk 2008 nicht geklappt - obwohl das WLAN im Konferenzhotel anstandslos funktionierte1 und es jede Menge interessante Vorträge zu hören gab. Aber mal war ich mit kleineren organisatorischen Dingen vor Ort befasst, mal mit dem Beantworten anderer E-Mails, die eintrudelten, mal einfach zu sehr in die Diskussionen vertieft, um gleichzeitig auch noch Zusammenfassungen o.ä. bloggen zu können. Je nun, dann also ein kurzer Rückblick auf
Ho appena letto una cosa molto divertente nella dashboard di wordpress, uno dei fondatori del suddetto popolare software di blogging è andato a una conferenza (BlogTalk) dove qualcuno ha fatto la foto del suo portatile macbook pieno di adesivi commentando inorridito su come lo avesse ridotto, rovinandone la preziosa e distinta estetica. Al di là del fatto in se, che è indicativo di un certo “mindset”, l’ultimo commento (al momento) alla foto è *meraviglioso*, e riassume bene la tristezza immen
/***
|''Name:''|RssSynchronizerPlugin|
|''Description:''|Synchronizes TiddlyWikis with RSS feeds|
|''Author:''|Osmosoft|
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/verticals/ripplerap/plugins/RssSynchronizerPlugin.js |
|''Version:''|0.0.16|
|''Date:''|Nov 27, 2007|
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''License''|[[BSD License|http://www.opensource.org/licenses/bsd-license.php]] |
|''~CoreVersion:''|2.2.6|
!!Description
This plugin uses the RSSAdaptor and WebDavLib to periodically:
# download tiddlers from the specified download feed
# upload user notes to the speficied upload feed
The feeds are standard TiddlyWiki feeds (that is tiddlers tagged "systemServer) that are additionally tagged with "ripplerap"
and either "notes" "upload" or "updates". "notes" specifies the root uri of where from which other are downloaded. "upload" speficies
the uri where the user's notes are uploaded. "updates" specifies the uri of the conference agenda, this feed is used to make any
last minute changes to the conference agenda.
!!Usage
Set up the "note", "upload" and "updates" feeds.
Requires the RSS Adaptor: http://svn.tiddlywiki.org/Trunk/contributors/JonathanLister/adaptors/RSSAdaptor.js
Requires WebDavLib: http://svn.tiddlywiki.org/Trunk/contributors/SaqImtiaz/plugins/WebDavLib.js
If required, set config.options.txtRippleRapInterval (in seconds). Default is 60 seconds.
***/
//{{{
if(!version.extensions.RssSynchronizerPlugin) {
version.extensions.RssSynchronizerPlugin = {installed:true};
if(!config.options.txtRippleRapInterval)
{config.options.txtRippleRapInterval = 60;}
config.optionsDesc.txtRippleRapInterval = "~RippleRap synchronization interval (in seconds)";
merge(config.messages,{
polling:"Polling server...",
updateCheck:"Checking for new notes",
xhrTimeout:"No web connection available - trying again shortly",
xhrFirebugError:"Problem with sending the XMLHttpRequest (if you are using Firebug, turn off network monitoring",
xhrError:"Problem with sending the XMLHttpRequest",
updateComplete:"Download complete!",
noUpdate:"No new notes"
});
function RssSynchronizer()
{
this.sessionDownload = {titles:[],syncIndex:0,getMostRecent:true,mostRecentTitle:'latest',requestPending:false};
this.userUpload = {requestPending:false};
this.userUpload.time = new Date();
this.userUpload.time.setFullYear(2000); // to force first time put
this.updates = {};
this.timerID = null;
this.nextIsGet = true;
this.discoveredNoteTag = config.macros.TiddlerDisplayDependencies.discoveredNoteTag;
this.myNoteTag = config.macros.TiddlerDisplayDependencies.myNoteTag;
this.sessionTag = config.macros.TiddlerDisplayDependencies.sessionTag;
this.sharedTag = 'shared';
}
RssSynchronizer.userNameNotSet = "You have not set your username";
// logging function, for debug
RssSynchronizer.log = function(x)
{
if(!config.options.chkDisplayStartupTime)// reuse this flag for now
return;
if(window.console)
console.log(x);
else
displayMessage(x);
};
RssSynchronizer.prototype.init = function()
{
var me = this;
store.forEachTiddler(function(title,t) {
if(t.isTagged('session') && t.fields.rr_session_starttime) {
var s = title.replace(/[^\w]/g,'_');
me.sessionDownload.titles.push(s);
}
if(t.isTagged('systemServer') && t.isTagged('ripplerap')) {
if(t.isTagged('notes')) {
var type = store.getTiddlerSlice(t.title,'Type');
var uri = store.getTiddlerSlice(t.title,'URL');
if(uri && type=='rss') {
if(uri.substr(uri.length-1) != '/')
uri = uri + '/';
me.sessionDownload.rootUri = uri;
}
} else if(t.isTagged('upload')) {
type = store.getTiddlerSlice(t.title,'Type');
uri = store.getTiddlerSlice(t.title,'URL');
if(uri && type=='rss') {
if(uri.substr(uri.length-1) != '/')
uri = uri + '/';
me.userUpload.rootUri = uri;
}
} else if(t.isTagged('updates')) {
type = store.getTiddlerSlice(t.title,'Type');
uri = store.getTiddlerSlice(t.title,'URL');
if(uri && type=='rss') {
me.updates.uri = uri;
}
}
}
});
// if(config.options.chkRipplerapShare) {
// this.makeRequest();
// }
};
RssSynchronizer.prototype.getInterval = function()
{
var t = config.options.txtRippleRapInterval ? parseInt(config.options.txtRippleRapInterval)*1000 : 60000;
if(isNaN(t))
t = 60000;
return t;
};
// If no sync requests are outstanding then queue a sync request on a timer.
// Alternates between upload and download requests.
RssSynchronizer.prototype.makeRequest = function()
{
return;
if(!config.options.chkRipplerapShare)
return;
if(this.userUpload.requestPending) {
RssSynchronizer.log("put request is pending");
return;
}
if(this.sessionDownload.requestPending) {
RssSynchronizer.log("get request is pending");
return;
}
RssSynchronizer.log(this.nextIsGet ? "makeRequest:get" : "makeRequest:put");
this.nextIsGet = !this.nextIsGet;
var me = this;
if(this.nextIsGet) {
this.userUpload.requestPending = true;
window.setTimeout(function() {me.doPut.call(me);},this.getInterval());
} else {
this.sessionDownload.requestPending = true;
window.setTimeout(function() {me.doGet.call(me);},this.getInterval());
}
};
RssSynchronizer.prototype.doSync = function()
{
this.doGet();
this.doPut();
};
RssSynchronizer.prototype.doGet = function()
{
if(this.sessionDownload.getMostRecent) {
this.sessionDownload.getMostRecent = false;
var sessionTitle = this.sessionDownload.mostRecentTitle;
var uri = this.sessionDownload.rootUri + sessionTitle + '.xml';
} else {
this.sessionDownload.getMostRecent = true;
if(this.sessionDownload.syncIndex==-1) {
uri = this.updates.uri;
}else {
sessionTitle = this.sessionDownload.titles[this.sessionDownload.syncIndex];
uri = this.sessionDownload.rootUri + sessionTitle + '.xml';
}
this.sessionDownload.syncIndex++;
if(this.sessionDownload.syncIndex>=this.sessionDownload.titles.length)
this.sessionDownload.syncIndex = this.updates.uri ? -1 : 0; // set to -1 for the updates uri, if it exists
}
var ret = this.getNotesTiddlersFromRss(uri);
if(typeof ret == "string") {
if(ret == "timeout") {
displayMessage(config.messages.xhrTimeout);
} else if (window.console) {
displayMessage(config.messages.xhrFirebugError);
} else
displayMessage(config.messages.xhrError);
} else {
displayMessage(config.messages.updateCheck);
}
};
RssSynchronizer.prototype.getNotesTiddlersFromRss = function(uri)
{
RssSynchronizer.log("getNotesTiddlersFromRss:"+uri);
var adaptor = new RSSAdaptor();
var context = {synchronizer:this,host:uri,adaptor:adaptor,rssUseRawDescription:true};
clearMessage();
displayMessage(config.messages.polling);
var ret = adaptor.getTiddlerList(context,null,RssSynchronizer.getNotesTiddlerListCallback);
RssSynchronizer.log("getTiddlerList:"+ret);
return ret;
};
RssSynchronizer.getNotesTiddlerListCallback = function(context,userParams)
{
RssSynchronizer.log("getNotesTiddlerListCallback:"+context.status);
//context.synchronizer.sessionDownload.requestPending = false;
var tiddlers = context.tiddlers;
var length = tiddlers ? tiddlers.length : 0;
// log("Downloaded:" + length);
var me = context.synchronizer;
store.suspendNotifications();
var newContent = false;
for(var i=0; i<length; i++) {
tiddler = tiddlers[i];
var t = store.fetchTiddler(tiddler.title);
if(!t || tiddler.modifier!=config.options.txtUserName) {
if(tiddler.modifier!=config.options.txtUserName) {
tiddler.tags.pushUnique(me.discoveredNoteTag);
tiddler.tags.remove(me.myNoteTag);
tiddler.tags.remove(me.sharedTag);
}
store.saveTiddler(tiddler.title,tiddler.title,tiddler.text,tiddler.modifier,tiddler.modified,tiddler.tags,tiddler.fields,true,tiddler.created);
// JRL: I don't this should be neccessary and I think the OR logic above is flawed
if(!t)
newContent = true;
}
}
if(newContent) {
displayMessage(config.messages.updateComplete);
window.setTimeout("clearMessage()",2000);
}
else {
displayMessage(config.messages.noUpdate);
window.setTimeout("clearMessage()",2000);
}
store.resumeNotifications();
refreshDisplay();
me.sessionDownload.requestPending = false;
me.makeRequest.call(me);
};
// If the user has written any notes since the last put, then put them
RssSynchronizer.prototype.doPut = function()
{
RssSynchronizer.log("doPut");
if(config.options.txtUserName=='YourName') {
this.userUpload.requestPending = false;
displayMessage(RssSynchronizer.userNameNotSet);
return false;
}
var putRequired = false;
var tiddlers = [];
var me = this;
store.forEachTiddler(function(title,t) {
if(t.isTagged(me.myNoteTag) && t.isTagged(me.sharedTag)) {
tiddlers.push(t);
if(t.modified > me.userUpload.time)
putRequired = true;
}
});
if(putRequired) {
RssSynchronizer.log("putRequired");
uri = this.userUpload.rootUri + config.options.txtUserName+ '/index.xml';
this.putTiddlersToRss(uri,tiddlers);
} else {
RssSynchronizer.log("putNotRequired");
this.userUpload.requestPending = false;
this.makeRequest();
}
return putRequired;
};
RssSynchronizer.prototype.putTiddlersToRss = function(uri,tiddlers)
{
RssSynchronizer.log("putTiddlersToRss:"+uri);
this.userUpload.startTime = new Date();
var rss = RssSynchronizer.generateRss(tiddlers);
var callback = function(status,params,responseText,uri,xhr) {
RssSynchronizer.log("putTiddlersToRssCallback:"+status);
var context = params[0];
var me = context.synchronizer;
me.userUpload.requestPending = false;
if(status) {
// PUT is successful, reset the time
me.userUpload.time = me.userUpload.startTime;
//displayMessage("successfully PUT");
//Collection.clear();
} else {
// displayMessage("PUT failed");
// PUT failed, deal with it here
// leave item in queue and take no action?
}
me.makeRequest.call(me);
};
var context = {};
context.synchronizer = this;
DAV.safeput(uri,callback,[context],rss,null,config.options.txtUserName,config.options.txtRipplerapAccountPassword);
};
RssSynchronizer.generateRss = function(tiddlers)
{
var s = [];
var d = new Date();
var u = store.getTiddlerText('SiteUrl');
s.push('<' + '?xml version="1.0"?' + '>');
s.push('<rss version="2.0">');
s.push('<channel>');
s.push('<title' + '>' + wikifyPlain('SiteTitle').htmlEncode() + '</title' + '>');
if(u)
s.push('<link>' + u.htmlEncode() + '</link>');
s.push('<description>' + wikifyPlain('SiteSubtitle').htmlEncode() + '</description>');
s.push('<language>en-us</language>');
s.push('<copyright>Copyright ' + d.getFullYear() + ' ' + config.options.txtUserName.htmlEncode() + '</copyright>');
s.push('<pubDate>' + d.toGMTString() + '</pubDate>');
s.push('<lastBuildDate>' + d.toGMTString() + '</lastBuildDate>');
s.push('<docs>http://blogs.law.harvard.edu/tech/rss</docs>');
s.push('<generator>TiddlyWiki ' + version.major + '.' + version.minor + '.' + version.revision + ' (RSS Synchronizer)</generator>');
for (var i=0;i<tiddlers.length;i++) {
var t = tiddlers[i];
s.push('<item>');
s.push('<title' + '>' + t.title.htmlEncode() + '</title' + '>');
s.push('<description>' + t.text.htmlEncode() + '</description>');
for(var j=0; j<t.tags.length; j++)
s.push('<category>' + t.tags[j] + '</category>');
s.push('<link>' + uri + '#' + encodeURIComponent(String.encodeTiddlyLink(t.title)) + '</link>');
s.push('<pubDate>' + t.modified.toGMTString() + '</pubDate>');
s.push('<author>' + t.modifier + '</author>');
s.push('</item>');
/*var item = t.toRssItem(u);
if(t.modifier)
item += '\n<author>' + t.modifier + '</author>\n';
item += '<tw:wikitext>\n' + t.text..htmlEncode() + '\n</tw:wikitext>';
s.push('<item>\n' + item + '\n</item>');*/
}
s.push('</channel>');
s.push('</rss>');
return s.join('\n');
};
rssSynchronizer = new RssSynchronizer();
rssSynchronizer.init();
} //# end of 'install only once'
//}}}
//{{{
config.options.txtMainTab = "AgendaDay2";
config.options.txtMojoTelno = "+3368...";
config.options.txtRippleRapUser = "BlogTalk";
config.options.txtRippleRapPass = "E1r3";
config.options.chkAutoSave = true;
config.options.chkAnimate = true;
config.options.chkSaveBackups = false;
config.options.txtAgendaTab = '3rd March 2008';
config.options.chkRipplerapShare = true;
config.options.chkRipplerapReadyToUse = false;
config.options.txtTwitterSignedIn = false;
//}}}
// Overrides core doHttp function to allow timeout parameter
var defaultXhrTimeout = 5000;
function doHttp(type,url,data,contentType,username,password,callback,params,headers,timeout)
{
var x = getXMLHttpRequest();
if(!x)
return "Can't create XMLHttpRequest object";
x.onreadystatechange = function() {
try {
var status = x.status;
} catch(ex) {
status = false;
}
if (x.readyState == 4)
clearTimeout(requestTimer);
if (x.readyState == 4 && callback && (status !== undefined)) {
if([0, httpStatus.OK, httpStatus.ContentCreated, httpStatus.NoContent, httpStatus.MultiStatus].contains(status))
callback(true,params,x.responseText,url,x);
else
callback(false,params,null,url,x);
x.onreadystatechange = function(){};
x = null;
}
};
if(window.Components && window.netscape && window.netscape.security && document.location.protocol.indexOf("http") == -1)
window.netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
try {
url = url + (url.indexOf("?") < 0 ? "?" : "&") + "nocache=" + Math.random();
x.open(type,url,true,username,password);
if(data)
x.setRequestHeader("Content-Type", contentType ? contentType : "application/x-www-form-urlencoded");
if(x.overrideMimeType)
x.setRequestHeader("Connection", "close");
if(headers) {
for(var n in headers)
x.setRequestHeader(n,headers[n]);
}
x.setRequestHeader("X-Requested-With", "TiddlyWiki " + version.major + "." + version.minor + "." + version.revision + (version.beta ? " (beta " + version.beta + ")" : ""));
x.send(data);
var requestTimer = setTimeout(function() {
x.abort();
// Handle timeout situation, e.g. Retry or inform user.
return "timeout";
}, (timeout ? timeout : defaultXhrTimeout));
} catch(ex) {
return exceptionText(ex);
}
return x;
}