Welcome to TiddlyWiki created by Jeremy Ruston, Copyright © 2007 UnaMesa Association
/***
|''Name:''|ccCreateWorkspace|
|''Description:''|Allows users to create workspaces in ccTiddly|
|''Version:''|2.1.5|
|''Date:''|Nov 27, 2007|
|''Source:''||
|''Author:''|SimonMcManus|
|''License:''|[[BSD open source license]]|
|''~CoreVersion:''|2.1.6|
|''Browser:''| Firefox |
***/
//{{{
var url = "http://mikaellanger.groundmotion.com/";
var workspace = "";
var workspacePermission = {};
config.backstageTasks.push("create");
merge(config.tasks,{
create: {text: "create", tooltip: "Create new workspace", content:'<<ccCreateWorkspace>>'}});
config.macros.ccCreateWorkspace = {
handler: function(place,macroName,params,wikifier,paramString,tiddler, errorMsg) {
// When we server this tiddler it need to know the URL of the server to post back to
//this value is currently set in index.php, should be index.php?action=createWorkspace to prepare for modulation
//form heading
if (workspacePermission.create != 1)
{
createTiddlyElement(place,"div", null, "annotation", "You do not have permissions to create a workspace. ");
return null;
}
var frm = createTiddlyElement(place,"form",null,"wizard");
frm.onsubmit = this.createWorkspaceOnSubmit;
createTiddlyElement(frm,"h1", null, null, "Create new workspace ");
createTiddlyElement(frm,"br");
createTiddlyText(frm, "You can get your own TiddlyWiki workspace by filling in the form below.");
createTiddlyElement(frm,"br");
createTiddlyElement(frm,"br");
var body = createTiddlyElement(frm,"div",null, "wizardBody");
//form content
var step = createTiddlyElement(body,"div",null, "wizardStep");
//form workspace name/url
createTiddlyText(step,url);
var workspaceName = createTiddlyElement(step,"input","ccWorkspaceName", "ccWorkspaceName")
workspaceName.value = workspace;
workspaceName.size = 15;
workspaceName.name = 'ccWorkspaceName';
createTiddlyElement(step,"br");
//privilege form
createTiddlyElement(step,"h4", null, null, "Anonymous Users Can : ");
// var anC = createTiddlyCheckbox(null, "Create Tiddlers", 0);
var anC = createTiddlyElement(null,"input", "anC","anC");
anC.setAttribute("type","checkbox");
step.appendChild(anC);
createTiddlyText(step, "Create Tiddlers");
createTiddlyElement(step,"br");
var anR = createTiddlyElement(null,"input", "anR","anR");
anR.setAttribute("type","checkbox");
anR.setAttribute("checked","checked");
step.appendChild(anR);
createTiddlyText(step, "Read Tiddlers");
createTiddlyElement(step,"br");
var anU = createTiddlyElement(null,"input", "anU","anU");
anU.setAttribute("type","checkbox");
step.appendChild(anU);
createTiddlyText(step, "Update Tiddlers");
createTiddlyElement(step,"br");
var anD = createTiddlyElement(null,"input", "anD","anD");
anD.setAttribute("type","checkbox");
step.appendChild(anD);
createTiddlyText(step, "Delete Tiddlers");
createTiddlyElement(step,"br");
// anC.id='anC';
// frm.appendChild(anC);
// createTiddlyElement(step,"br");
// var anR = createTiddlyCheckbox(step, "Read Tiddler", 1);
// anR.id = 'anR';
// createTiddlyElement(step,"br");
// var anU = createTiddlyCheckbox(step, "Updates Tiddlers ", 0);
// anU.id = 'anU';
// createTiddlyElement(step,"br");
// var anD = createTiddlyCheckbox(step, "Delete Tiddlers", 0);
// anD.id = 'anD';
createTiddlyElement(step,"br");
createTiddlyElement(frm,"br");
var btn = createTiddlyElement(null,"input",this.prompt,"button");
btn.setAttribute("type","submit");
btn.value = "Create workspace"
step.appendChild(btn);
//createTiddlyElement(frm,"br");
//createTiddlyElement(frm,"br");
//createTiddlyElement(step,"h2", null, null, "Registered Users Can: ");
//var usC = createTiddlyCheckbox(frm, "Create Tiddlers", 1);
//usC.id = 'usC';
//createTiddlyElement(frm,"br");
//var usR = createTiddlyCheckbox(frm, "Read Tiddler", 1);
//usR.id = 'usR';
//createTiddlyElement(frm,"br");
//var usU = createTiddlyCheckbox(frm, "Updates Tiddlers ", 1);
//usU.id = 'usU';
//createTiddlyElement(frm,"br");
//var usD = createTiddlyCheckbox(frm, "Delete Tiddlers", 1);
//usD.id='usD';
//createTiddlyElement(frm,"br");
//createTiddlyElement(frm,"hr");
//createTiddlyText(frm,"As the Workspace owner you will have all the above permissions");
//createTiddlyElement(frm,"br");
},
createWorkspaceOnSubmit: function() {
var trueStr = "A";
var falseStr = "D";
// build up string with permissions values
var anon=(this.anR.checked?trueStr:falseStr);
anon+=(this.anC.checked?trueStr:falseStr);
anon+=(this.anU.checked?trueStr:falseStr);
anon+=(this.anD.checked?trueStr:falseStr);
//var user=(this.usC.checked?trueStr:falseStr);
//user+=(this.usR.checked?trueStr:falseStr);
//user+=(this.usU.checked?trueStr:falseStr);
//user+=(this.usD.checked?trueStr:falseStr);
var params = {};
params.url = url+this.ccWorkspaceName.value;
var loginResp = doHttp('POST', url+this.ccWorkspaceName.value, "ccCreateWorkspace=" + encodeURIComponent(this.ccWorkspaceName.value)+"&ccAnonPerm="+encodeURIComponent(anon),null,null,null, config.macros.ccCreateWorkspace.createWorkspaceCallback,params);
return false;
},
createWorkspaceCallback: function(status,params,responseText,uri,xhr) {
// displayMessage(xhr.status);
if(xhr.status==201) {
window.location = params.url;
//displayMessage('workspace crated');
} else if (xhr.status == 200) {
displayMessage("Workspace name is already in use.");
} else if (xhr.status == 403) {
displayMessage("Permission denied, the ability to create new workspaces may have been disabled by you systems administrator.");
} else {
displayMessage(responseText);
}
}
}
config.macros.ccEditWorkspace = {
handler: function(place,macroName,params,wikifier,paramString,tiddler, errorMsg) {
// When we server this tiddler it need to know the URL of the server to post back to, this value is currently set in index.php
var frm = createTiddlyElement(place,"form",null,"wizard");
frm.onsubmit = this.editWorkspaceOnSubmit;
createTiddlyElement(frm,"h1", null, null, "Edit Workspace Permissions : ");
var body = createTiddlyElement(frm,"div",null, "wizardBody");
var step = createTiddlyElement(body,"div",null, "wizardStep");
createTiddlyElement(step,"h4", null, null, "Anonymous Users Can : ");
var anC = createTiddlyCheckbox(step, "Create Tiddlers", 0);
anC.id='anC';
createTiddlyElement(step,"br");
var anR = createTiddlyCheckbox(step, "Read Tiddler", 1);
anR.id = 'anR';
createTiddlyElement(step,"br");
var anU = createTiddlyCheckbox(step, "Updates Tiddlers ", 0);
anU.id = 'anU';
createTiddlyElement(step,"br");
var anD = createTiddlyCheckbox(step, "Delete Tiddlers", 0);
anD.id = 'anD';
createTiddlyElement(step,"br");
createTiddlyElement(frm,"br");
var btn = createTiddlyElement(frm,"input",this.prompt,"button", "button");
btn.setAttribute("type","submit");
btn.value = "edit workspace permissions"
createTiddlyElement(frm,"br");
createTiddlyElement(frm,"br");
},
editWorkspaceOnSubmit: function() {
var trueStr = "A";
var falseStr = "D";
// build up string with permissions values
var anon=(this.anR.checked?trueStr:falseStr);
anon+=(this.anC.checked?trueStr:falseStr);
anon+=(this.anU.checked?trueStr:falseStr);
anon+=(this.anD.checked?trueStr:falseStr);
displayMessage(anon);
doHttp('POST', url+'handle/update_workspace.php', "ccCreateWorkspace=" + encodeURIComponent(this.ccWorkspaceName.value)+"&ccAnonPerm="+encodeURIComponent(anon),null,null,null, config.macros.ccEditWorkspace.editWorkspaceCallback,params);
return false;
},
editWorkspaceCallback: function(status,params,responseText,uri,xhr) {
// displayMessage(xhr.status);
displayMessage('lalalal');
if (xhr.status == 200) {
displayMessage(responseText);
}
}
}
config.macros.ccListWorkspaces = {
handler: function(place,macroName,params,wikifier,paramString,tiddler, errorMsg) {
// When we server this tiddler it need to know the URL of the server to post back to, this value is currently set in index.php
var item = createTiddlyElement(place, 'A', null, null, "");
item.href= url+'?workspace=';
createTiddlyElement(place,"br"); createTiddlyText(place, "\n Total Number of workspaces : 0");
}
}
config.macros.ccListMyWorkspaces = {
handler: function(place,macroName,params,wikifier,paramString,tiddler, errorMsg) {
// When we server this tiddler it need to know the URL of the server to post back to, this value is currently set in index.php
//miklo:
// createTiddlyText(place, "\n Your workspaces : 1");
}
}
//}}}
/***
|''Name:''|ccLoadRemoteFileThroughProxy (previous LoadRemoteFileHijack)|
|''Description:''|When the TiddlyWiki file is located on the web (view over http) the content of [[SiteProxy]] tiddler is added in front of the file url. If [[SiteProxy]] does not exist "/proxy/" is added. |
|''Version:''|1.1.0|
|''Date:''|mar 17, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#LoadRemoteFileHijack|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0|
***/
//{{{
version.extensions.LoadRemoteFileThroughProxy = {
major: 1, minor: 1, revision: 0,
date: new Date("mar 17, 2007"),
source: "http://tiddlywiki.bidix.info/#LoadRemoteFileThroughProxy"};
if (!window.bidix) window.bidix = {}; // bidix namespace
if (!bidix.core) bidix.core = {};
bidix.core.loadRemoteFile = loadRemoteFile;
loadRemoteFile = function(url,callback,params)
{
if ((document.location.toString().substr(0,4) == "http") && (url.substr(0,4) == "http")){
url = store.getTiddlerText("SiteProxy", "/proxy/") + url;
}
return bidix.core.loadRemoteFile(url,callback,params);
}
//}}}
/***
|''Name:''|ccAbout|
|''Description:''|Allows you to find out about your ccTiddly installation|
|''Version:''|2.1.5|
|''Date:''|Nov 27, 2007|
|''Source:''||
|''Author:''|SimonMcManus|
|''License:''|[[BSD open source license]]|
|''~CoreVersion:''|2.1.6|
|''Browser:''| Firefox |
***/
//{{{
config.backstageTasks.push("about");
// remove the save button from backstage
if(config.backstageTasks[0] == 'save');
config.backstageTasks.shift();
merge(config.tasks,{
about: {text: "about", tooltip: "Find out more about ccTiddly ", content: '<<ccAbout>>'}
});
config.macros.ccAbout = {
handler: function(place,macroName,params,wikifier,paramString,tiddler, errorMsg) {
createTiddlyElement(place, "h1","","","About ccTiddly");
createTiddlyElement(place, "br");
var str = "You are running ccTiddly 1.5.3";
createTiddlyText(place, str);
createTiddlyElement(place, "br");
createTiddlyElement(place, "br");
var str = "more info about ccTiddly can be found at " ;
createTiddlyText(place, str);
var link = createExternalLink(place, 'http://tiddlywiki.org/wiki/CcTiddly');
link.textContent= 'http://tiddlywiki.org/wiki/CcTiddly';
}
}
//}}}
/***
|''Name:''|ccUpload|
|''Description:''|Allows users to upload files in ccTiddly|
|''Version:''|2.1.5|
|''Date:''|Nov 27, 2007|
|''Source:''||
|''Author:''|SimonMcManus|
|''License:''|[[BSD open source license]]|
|''~CoreVersion:''|2.1.6|
|''Browser:''| Firefox |
***/
//{{{
var url = "httpmikaellanger.groundmotion.com";
var workspace = "";
config.macros.ccUpload = {
handler: function(place,macroName,params,wikifier,paramString,tiddler, errorMsg) {
// When we server this tiddler it need to know the URL of the server to post back to, this value is currently set in index.php
var frm = createTiddlyElement(place,"form",null,null);
frm.enctype="multipart/form-data";
frm.action ="handle/upload.php?workspace=simonmcmanus";
frm.method ="POST";
var file = createTiddlyElement(frm,"input","ccfile", "ccfile");
file.type = "file";
file.name="userfile";
createTiddlyElement(frm,"br");
createTiddlyText(frm, "Save the file to :");
createTiddlyElement(frm,"br");
var RDuser = createTiddlyElement(frm,"input","user", "user") ;
RDuser.type = "radio";
RDuser.name="saveTo";
RDuser.value="user";
createTiddlyText(frm, "My User Area");
createTiddlyElement(frm,"br");
var RDworkspace = createTiddlyElement(frm,"input","workspace", "workspace");
RDworkspace.type = "radio";
RDworkspace.name="saveTo";
RDworkspace.value="user";
createTiddlyText(frm, "Workspace Area ");
createTiddlyElement(frm,"br");
createTiddlyElement(frm,"br");
var btn = createTiddlyElement(frm,"input",this.prompt);
btn.setAttribute("type","submit");
btn.value = "Upload File ";
}
}
//}}}
/***
|''Name:''|ccLogin|
|''Description:''|Login Plugin for ccTiddly|
|''Version:''|2.1.5|
|''Date:''|Nov 27, 2007|
|''Source:''||
|''Author:''|SimonMcManus|
|''License:''|[[BSD open source license]]|
|''~CoreVersion:''|2.1.6|
|''Browser:''| Firefox |
***/
//{{{
config.backstageTasks.push("login");
merge(config.tasks,{
login: {text: "login", tooltip: "Login to your TiddlyWiki", content: '<<ccLogin>>'}
});
config.macros.saveChanges.handler=function(place,macroName,params,wikifier,paramString,tiddler){};
// hide new journal
config.macros.newJournal.handler=function(place,macroName,params,wikifier,paramString,tiddler){};
// hide new tiddler
config.macros.newTiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler){};
config.macros.toolbar.isCommandEnabled = function(command,tiddler)
{
var title = tiddler.title;
if (command.text=='delete')
return false;
if (command.text=='edit')
return false;
if (command.text=='new here')
return false;
var ro = tiddler.isReadOnly();
var shadow = store.isShadowTiddler(title) && !store.tiddlerExists(title);
return (!ro || (ro && !command.hideReadOnly)) && !(shadow && command.hideShadow);
}
var url = "http://mikaellanger.groundmotion.com/";
// Returns output var with output.txtUsername and output.sessionToken
function findToken(cookieStash) {
var output = {};
var cookies =cookieStash.split("\n");
for(var c=0; c< cookies.length ; c++) {
var cl = cookies[c].split(";");
for(var e=0; e<cl.length; e++) {
var p = cl[e].indexOf("=");
if(p != -1) {
var name = cl[e].substr(0,p).trim();
var value = cl[e].substr(p+1).trim();
if (name== 'txtUserName') {
output.txtUserName = value;
}
if (name== 'sessionToken') {
output.sessionToken = value;
}
}
}
}
return output;
}
config.macros.ccLoginStatus = {
handler: function(place,macroName,params,wikifier,paramString,tiddler) {
var loginDiv = createTiddlyElement(place,"div",null,"loginDiv",null);
this.refresh(loginDiv);
},
refresh: function(place, errorMsg) {
var loginDivRef = document.getElementById ("LoginDiv");
removeChildren(loginDivRef);
var wrapper = createTiddlyElement(place,"div");
var cookieValues = findToken(document.cookie);
if ( cookieValues.sessionToken && cookieValues.sessionToken!== 'invalid' && cookieValues.txtUserName) {
createTiddlyElement(wrapper,"br");
var name = decodeURIComponent(decodeURIComponent(cookieValues.txtUserName));
var frm = createTiddlyElement(n,"form",null);
frm.action = "";
frm.method = "get";
//frm.onsubmit = config.macros.ccLogin.logoutOnSubmit;
wrapper.appendChild(frm);
var str = wikify("You are logged in as : " + name , frm);
var logout = createTiddlyElement(null,"input", logout, logout);
logout.setAttribute("type","hidden");
logout.value = "1";
logout.name = "logout";
frm.appendChild(logout);
var btn = createTiddlyElement(null,"input", null);
btn.setAttribute("type","submit");
btn.value = "Logout";
frm.appendChild(btn);
} else {
var str = wikify("[[Please Login]]", wrapper);
}
}
}
config.macros.ccLogin = {
handler: function(place,macroName,params,wikifier,paramString,tiddler) {
// var img = createTiddlyElement(place,"img");
// img.src = 'http://www.cot.org.uk/designforliving/companies/logos/bt.jpg ';
var loginDiv = createTiddlyElement(place,"div",null,"loginDiv",null);
this.refresh(loginDiv);
},
refresh: function(place, errorMsg) {
var loginDivRef = document.getElementById ("LoginDiv");
removeChildren(loginDivRef);
var wrapper = createTiddlyElement(place,"div");
var cookieValues = findToken(document.cookie);
if ( cookieValues.sessionToken && cookieValues.sessionToken!== 'invalid' && cookieValues.txtUserName) {
// user is logged in
var msg = createTiddlyElement(wrapper,"div");
wikify("You are logged in as " + decodeURIComponent(decodeURIComponent(cookieValues.txtUserName)), msg);
var frm = createTiddlyElement(n,"form",null);
frm.action = "";
frm.method = "get";
// TODO need to decide which method we are going to be using for login, form get, or on submit
frm.onsubmit = config.macros.ccLogin.logoutOnSubmit;
wrapper.appendChild(frm);
var logout = createTiddlyElement(null,"input", logout, logout);
logout.setAttribute("type","hidden");
logout.value = "1";
logout.name = "logout";
frm.appendChild(logout);
var btn = createTiddlyElement(null,"input", null);
btn.setAttribute("type","submit");
btn.value = "Logout";
frm.appendChild(btn);
} else {
//user not logged in.
var frm = createTiddlyElement(wrapper,"form",null, "wizard");
frm.onsubmit = this.loginOnSubmit;
var body = createTiddlyElement(frm,"h1",null,null, "");
createTiddlyElement(frm,"br");
createTiddlyElement(frm,"br");
var body = createTiddlyElement(frm,"div",null, "wizardBody");
var step = createTiddlyElement(body,"div",null, "wizardStep");
//createTiddlyElement(frm,"h1", null, null, "Login is Required");
if (errorMsg!= null)
{
createTiddlyElement(step,"span", null, null, errorMsg);
createTiddlyElement(step,"br");
}
var oidfrm = createTiddlyElement(step,"form",null, null);
oidfrm.method = 'get';
oidfrm.action='includes/openid/try_auth.php';
createTiddlyText(step, "username/password should get you in.");
createTiddlyElement(step,"br");
createTiddlyText(step,"Username: ");
var txtuser = createTiddlyElement(step,"input","cctuser", "cctuser")
if (cookieValues.txtUserName !=null) {
txtuser.value =cookieValues.txtUserName ;
}
createTiddlyElement(step,"br");
createTiddlyText(step,"Password : ");
var txtpass = createTiddlyElement(null, "input", "cctpass", "cctpass", null, {"type":"password"});
// var txtpass = createTiddlyElement(step,"input", "cctpass","cctpass");
txtpass.setAttribute("type","password");
step.appendChild(txtpass);
createTiddlyElement(frm,"br");
var btn = createTiddlyElement(null,"input",this.prompt, "button");
btn.setAttribute("type","submit");
btn.value = "Login"
frm.appendChild(btn);
createTiddlyElement(frm,"br");
createTiddlyElement(frm,"br");
}
},
killLoginCookie: function() {
var c = 'sessionToken=invalid';
c+= "; expires=Fri, 1 Jan 1811 12:00:00 UTC; path=/";
document.cookie = c;
},
logoutOnSubmit: function() {
var loginDivRef = findRelated(this,"loginDiv","className","parentNode");
removeChildren(loginDivRef);
document.cookie = "sessionToken=invalid; expires=15/02/2009 00:00:00";
//config.macros.ccLogin.refresh(loginDivRef);
doHttp('POST', url+'msghandle.php', "logout=1");
window.location = window.location;
return false;
},
logoutCallback: function(status,params,responseText,uri,xhr) {
//return true;
},
loginOnSubmit: function() {
var user = document.getElementById('cctuser').value;
var pass = document.getElementById('cctpass').value;
var params = {};
params.origin = this;
var loginResp = doHttp('POST', url+'/msghandle.php', "cctuser=" + encodeURIComponent(user)+"&cctpass="+encodeURIComponent(pass),null,null,null, config.macros.ccLogin.loginCallback,params);
return false;
},
loginCallback: function(status,params,responseText,uri,xhr) {
if (status==true) {
//displayMessage('CONECTION was ok ');
}
var cookie;
cookie = xhr.getResponseHeader("Set-Cookie");
var cookieValues = findToken(cookie);
config.macros.ccLogin.saveCookie(cookieValues);
if(xhr.status != 401) {
window.location = window.location;
} else {
if (xhr.responseText != "")
displayMessage(xhr.responseText);
var loginDivRef = findRelated( params.origin,"loginDiv","className","parentNode");
removeChildren(loginDivRef);
config.macros.ccLogin.refresh(loginDivRef, 'Login Failed ');
}
return true;
},
saveCookie: function(cookieValues) {
// Save the session token in cookie.
var c = 'sessionToken' + "=" + cookieValues.sessionToken;
c+= "; expires=Fri, 1 Jan 2811 12:00:00 UTC; path=";
document.cookie = c;
// Save the txtUserName in the normal tiddlywiki format
if (cookieValues.txtUserName !=null) {
config.options.txtUserName = cookieValues.txtUserName;
saveOptionCookie("txtUserName");
}
}
}
//}}}
includes = 0.018s\nget all tiddlers = 0.022s\nbefore print tiddly = 0.104s\nafter print tiddly = 0.129s\nend of script = 0.129s\n
Mikael Langer
Blog&Wiki
[[Welcome!]]
Type the text for 'ProxyService'
Various social events hosted by us.
[[Blog]]\n[[Tastes]]\n[[Cooking]]\n[[Travel]]\n[[Tech]]\n[[Web]]\n\n[img[feed-icon-14x14.png][http://feeds.feedburner.com/MikaelLanger]]\n<<tiddler MyWorkspaces>>\n<<tiddler Smilies>>\n\n\n\n<<tiddler VerticalBannerAd>>
Don't have the beans at hand now, so can't write a full review.\n\nMy expectations on this blend were quite high since I've had fantastic Ionia coffee both at K&Co in Helsingborg and an this super cool small place in Ulricehamn where they surprisingly had an ECM Giotto.\n\nIn comparison, not as good results with this blend for me as the [[Kimbo]] beans. Rather similar quiality as [[Sosta's beans]].\n
<<tabs txtMoreTab "M" "Missing tiddlers" TabMoreMissing "O" "Orphaned tiddlers" TabMoreOrphans "S" "Shadowed tiddlers" TabMoreShadowed "A" "All tags for real" TabMoreAll>>
Don't have the beans at hand when writing, so no detailed description.\n\nActually slightly better than [[Ionia Miscela Oro]], but still not as good as [[Kimbo]] on my Grinder and Machine combo.\n
merge(config.views.wikified,{\n defaultText: "The entry '%0' doesn't exist yet."\n});
Made full use of my garden leave today to perform some really homely tasks:\nI descaled the espresso machine, cleaned up the kitchen, made homemade [[cereal bars|Cereal Bars]](!) and (I'm not kidding) baked [[cookies|Wholemeal Biscuits]]!\n\nI //did// manage to do some //manly// (<<;)>>) hardcore tech stuff as well though - hacked some TiddlyWiki bits and pieces, and [[set up the iBook|NAT Routing in Ubuntu]] to act as a NAT router and DHCP server so the XBOX can share the wireless bridge (Netgear ~WGE111, only supports one MAC at a time <<:/>>)and stream music off the net. As a reward XBMC surprised me by supporting asx playlists, which it didn't last time I checked (long time ago), so I could stream archives from P3. Nice++!
Har inte bönorna här för tillfälet, så ingen konkret smakbeskrivning möjlig.\n\nBäst resultat hittils med min maskin.
window.restart_lewcid_menuedit = restart;\nwindow.restart = function () {\n window.restart_lewcid_menuedit();\nvar menus = new Array("topMenu","sidebarOptions","sidebarTabs","contentFooter","mainMenu");\nfor(var t=0; t<menus.length; t++){\n if (document.getElementById(menus[t]))\n {var menu = document.getElementById(menus[t]);\n menu.ondblclick = window.onMenuDblClick;}}\n}\n\n\n\nwindow.onMenuDblClick = function(e){\nif (!e) var e = window.event;\nstory.displayTiddler(null,this.getAttribute("tiddler"),2,false,null)\ne.cancelBubble = true;\nif (e.stopPropagation) e.stopPropagation();\nreturn false;\n}
[<img[http://photos-936.ll.facebook.com/photos-ll-sf2p/v199/83/62/669759936/s669759936_744593_5814.jpg]][>img[http://photos-f.ak.facebook.com/photos-ak-sf2p/v195/83/62/669759936/s669759936_749141_4829.jpg]]This is the Blog and general knowledge dump of anything that happens to be of interest to the owners, Mikael and Linda.
The one and only
|URL:|http://www.tailorstore.com|\n|Description:|Good quality custom shirts! I've bought three shirts now, and the measurements are really starting to get perfect. Can't knock perfect fit shirts that come cheaper than regular non-custom shirts from bricks&mortar stores.|
[>img[http://photos-d.ak.facebook.com/photos-ak-sf2p/v241/83/62/669759936/s669759936_792587_9522.jpg]]Had some wonderful italian wholemeal biscuits [[last time in Grenoble|Grenoble March 2008]].\nFound this recipe that looks like something similar:\nhttp://www.francescav.com/2008/03/biscotti-integrali/\n\n<<<\nIngredients for about 35 biscuits:180 gr. wholemeal flour, 1/2 teaspoon of baking powder (or cream of tartar), 2 tablespoons of honey, 6 tablespoons of olive oil, 1 egg, pinch of salt.\n\nIn a bowl sift flour with baking powder and salt. In another bigger bowl mix honey with olive oil, add egg and then pour flour.Mix to have a soft mixture. Use your favourite shape biscuits to make cookies (piping bag with medium star tip or cookie press or another). Then you bake biscuits in a hot 170°oven (a medium 325 or 350 degree Fahrenheit oven temperature in US) for about 10-12 minutes. \n<<<\nTried them and they were lovely indeed.\nTo make them a bit more like the italian biscuits I had in Grenoble, I'll try to add some whole or shredded dinkel or oat flakes and dried fruit or chocolate.
Thick, full, hazel crema.\nPretty big element of hay in the aroma that wasn't very pleasant.\nFairly high amount of acidity and bitterness despite a quite good draw.\nReally good in cappas and lattes. \nA beatiful brew, but not as tasty in a straight espresso; the machine may have been running a bit too hot though.
\n<html><a class="button">goto</a></html><<gotoTiddler>><<search>><<slider 'chkLoginStatus' 'LoginStatus' ' Login Status »' 'Login to make changes'>><<closeAll>><<permaview>><<newTiddler>><<newJournal "DD MMM YYYY" "Blog">><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel "options »" "Change TiddlyWiki advanced options">>
<<ccLogin>>
<<ccLoginStatus>>\n
Background: #fff\nForeground: #000\nPrimaryPale: #ccd\nPrimaryLight: #667\nPrimaryMid: #001\nPrimaryDark: #334\nSecondaryPale: #cdf\nSecondaryLight: #89b\nSecondaryMid: #568\nSecondaryDark: #235\nTertiaryPale: #eee\nTertiaryLight: #ccc\nTertiaryMid: #999\nTertiaryDark: #666\nError: #f88
<<tiddler [[TemplateShowColor]] with:{{store.getTiddlerSlice('ColorPalette','Background')}} Background>>\n<<tiddler [[TemplateShowColor]] with:{{store.getTiddlerSlice('ColorPalette','Foreground')}} Foreground>>\n<<tiddler [[TemplateShowColor]] with:{{store.getTiddlerSlice('ColorPalette','PrimaryPale')}} PrimaryPale>>\n<<tiddler [[TemplateShowColor]] with:{{store.getTiddlerSlice('ColorPalette','PrimaryLight')}} PrimaryLight>>\n<<tiddler [[TemplateShowColor]] with:{{store.getTiddlerSlice('ColorPalette','PrimaryMid')}} PrimaryMid>>\n<<tiddler [[TemplateShowColor]] with:{{store.getTiddlerSlice('ColorPalette','PrimaryDark')}} PrimaryDark>>\n<<tiddler [[TemplateShowColor]] with:{{store.getTiddlerSlice('ColorPalette','SecondaryPale')}} SecondaryPale>>\n<<tiddler [[TemplateShowColor]] with:{{store.getTiddlerSlice('ColorPalette','SecondaryLight')}} SecondaryLight>>\n<<tiddler [[TemplateShowColor]] with:{{store.getTiddlerSlice('ColorPalette','SecondaryMid')}} SecondaryMid>>\n<<tiddler [[TemplateShowColor]] with:{{store.getTiddlerSlice('ColorPalette','SecondaryDark')}} SecondaryDark>>\n<<tiddler [[TemplateShowColor]] with:{{store.getTiddlerSlice('ColorPalette','TertiaryPale')}} TertiaryPale>>\n<<tiddler [[TemplateShowColor]] with:{{store.getTiddlerSlice('ColorPalette','TertiaryLight')}} TertiaryLight>>\n<<tiddler [[TemplateShowColor]] with:{{store.getTiddlerSlice('ColorPalette','TertiaryMid')}} TertiaryMid>>\n<<tiddler [[TemplateShowColor]] with:{{store.getTiddlerSlice('ColorPalette','TertiaryDark')}} TertiaryDark>>\n<<tiddler [[TemplateShowColor]] with:{{store.getTiddlerSlice('ColorPalette','Error')}} Error>>
@@background-color:$1;padding:0 4em;width:20em;border:1px solid #ddd; @@ - [[$2|ColorPalette]]
<<timeline created>>
Type the text for 'debug'
/***\n|''Name:''|CommentPlugin|\n|''Source:''|http://sourceforge.net/project/showfiles.php?group_id=150646|\n|''Author:''|Tim Morgan (modified by Bram Chen|\n|''Version:''|1.0.0|\n|''Date:''|Aug 25, 2007|\n|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|\n|''~CoreVersion:''|2.0.11|\n|''Description:''|Adds "comments" to any TiddlyWiki or adaptation.|\n|~|Used in conjunction with the RecentPlugin, one can have a decent forum environment.|\n\n''Translation sample 1:''\n{{{\nconfig.CommentPlugin.CPlingo = {\n dateFormat: "YYYY?0MM?0DD? 0hh:0mm:0ss",\n CommentInTitle: " ?? ",\n comments:"??",\n add:"?? »",\n edit:"??",\n tooltips:"???????????",\n Title: "%0 ?? %1",\n CommenteditTemplate: {yourName: "????", nickName: "(?????)", comments: "?????"}\n};\n}}}\n''Translation sample 2:''\n{{{\nconfig.CommentPlugin = {\n CPlingo:{\n dateFormat: "DD MMM YYYY 0hh:0mm:0ss",\n CommentInTitle: " Comment ",\n comments: "comments",\n add: "Add comment...",\n edit: "Edit",\n tooltips:" Create a new comment tiddler associated with this tiddler",\n Title: "%0 Comment %1",\n CommenteditTemplate: {yourName: "Your Name: ", nickName: "(nick name)", comments: "Comment: "}\n };\n}}}\n\n''Revision history:''\n* v1.0.0\n** Fixed bug, those tiddlers tagging with some other tiddlers and not tagged with only_on_tags would also be created a comment links with count 0.\n* v0.8.0 (Jan 17, 2007)\n** Some minor changes and bugs fixed (Bram)\n* v0.7.0 (Nov 09, 2006)\n** Minor changes, more easier to be translated (Bram)\n* v0.6.0 (Nov 09, 2006)\n** Runs compatibly with TW 2.1.0+ (Bram)\n* v0.5.0 (Jun 15, 2006)\n** Fixed bug for feature of CommentEditTemplate (bug reported by MilchFlasche, fixed by Bram)\n** Fixed bug in redefined TiddlyWiki.prototype.saveTiddler (Bram)\n* v0.4.0 (Jun 03, 2006) Added CommentEditTemplate (Bram)\n* v0.3.0 (Jun 01, 2006) Some minor changes for readOnly mode (Bram)\n* v0.2.0 (Apr 04, 2006) Fixed bug for only_on_tags (Bram)\n* v0.1.0 (Mar 13, 2006) Modified by Bram Chen.\n***/\n// //''Code section:''\n//{{{\nconfig.CommentPlugin = {\n CPlingo:{\n dateFormat: "DD MMM YYYY 0hh:0mm:0ss",\n CommentInTitle: " Comment ",\n comments: "comments",\n add: "Add comment...",\n edit: "Edit",\n tooltips: "Create a new comment tiddler associated with this tiddler",\n Title: "%0 Comment %1",\n CommenteditTemplate: {yourName: "Your Name: ", nickName: "(nick name)", comments: "Comment: "}\n },\n only_on_tags: [],\n not_on_tags: ['excludeLists'],\n // "true" or "false"...\n fold_comments: true,\n default_fold: false,\n max_comment_count: 500\n};\n\nvar CPlingo = config.CommentPlugin.CPlingo;\nconfig.CommentPlugin.only_on_tags.push(CPlingo.comments);\n\nfunction get_parent(tiddler){\n while(tiddler.isTagged(CPlingo.comments)){\n tiddler=store.fetchTiddler(tiddler.tags[0]);\n }\n return tiddler\n};\n\nfunction count_comments(title){\n var tagged=store.getTaggedTiddlers(title);\n var count=0;\n for(var i=0;i<tagged.length;i++){\n if(tagged[i].tags.contains(CPlingo.comments)){\n count+=count_comments(tagged[i].title)+1;\n }\n }\n return count\n};\nconfig.shadowTiddlers.ViewTemplate += "\sn<div class='comments' macro='comments'></div>";\n\nconfig.shadowTiddlers.CommentEditTemplate="<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler deleteTiddler wikibar'></div><div class='title' macro='view title'></div><div class='editor' macro='edit tags' style='display:none;'></div><div class='GuestSign' >" + CPlingo.CommenteditTemplate.yourName + "<span macro='option txtUserName'></span>" + CPlingo.CommenteditTemplate.nickName + "<br />" + CPlingo.CommenteditTemplate.comments + "</div><div class='editor' macro='edit text'></div>";\nconfig.tiddlerTemplates[3]="CommentEditTemplate"; \nvar COMMENT_EDIT_TEMPLATE = 3;\n\nconfig.shadowTiddlers.CommentPluginStyle = '\sn/*{{{*/\sn.commentTags ul {list-style:none; padding-left:0px; margin: 0 0 3px 0;}\sn.commentTags li {display:inline; color:#999;}\sn.commentTags li a.button {color:#999;}\sn.comment {border-left:1px solid #ccc; margin-top:10px; margin-left:10px; padding:5px;}\sn.newCommentLink {padding-top:10px}\sn.tagging, .selected .tagging, .tiddler .tagging {display:none;}\sn.comment a.button {padding:0px; font-size:smaller; background-color:lightgray;}\sn.comments a.button {background-color:lightgray;}\sn/*}}}*/';\nconfig.shadowTiddlers.StyleSheet += '\sn[[CommentPluginStyle]]';\nconfig.macros.newCommentLink = {\n label: CPlingo.add,\n prompt: CPlingo.tooltips,\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n if(tiddler && store.tiddlerExists(tiddler.title) && !readOnly && (!window.zw || zw.loggedIn || zw.anonEdit)) {\n if(tiddler.tags.containsAny(config.CommentPlugin.not_on_tags) /*|| !tiddler.tags.containsAny(config.CommentPlugin.only_on_tags)*/)\n return;\n var onclick = function(e) {\n var e = (e)?e:window.event;\n var theTarget = resolveTarget(e);\n var tagxs = tiddler.title.split(CPlingo.CommentInTitle);\n var title = (tiddler.title.indexOf(CPlingo.CommentInTitle)!=-1)? tagxs[0] : tiddler.title;\n title = CPlingo.Title.format([title,(new Date()).formatString(CPlingo.dateFormat)]);\n var comment = store.createTiddler(title);\n comment.text = '';\n comment.tags = [tiddler.title, CPlingo.comments,'excludeLists'];\n readOnly = false;\n story.displayTiddler(theTarget, title, COMMENT_EDIT_TEMPLATE);\n readOnly = (window.location.protocol == "file:") ? false : config.options.chkHttpReadOnly;\n story.focusTiddler(title,"text");\n return false;\n }\n createTiddlyButton(place, this.label, this.prompt, onclick);\n }\n }\n};\nconfig.macros.comments = {\n dateFormat: CPlingo.dateFormat,\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n if(tiddler.title==CPlingo.comments) return;\n var comments = store.getTaggedTiddlers(tiddler.title, 'created');\n var count = count_comments(tiddler.title);\n if(count>0 && !tiddler.tags.contains(CPlingo.comments) && config.CommentPlugin.fold_comments) {\n var show = createTiddlyElement(place, 'p');\n show.innerHTML = '<a href="#" onclick="var e=document.getElementById(\s'comments'+tiddler.title+'\s');e.style.display=e.style.display==\s'block\s'?\s'none\s':\s'block\s';return false;">' + CPlingo.comments +'('+count+') »</a>';\n }\n var place = createTiddlyElement(place, 'div', 'comments'+tiddler.title, 'comments');\n if(count>0 && !tiddler.tags.contains(CPlingo.comments) && config.CommentPlugin.fold_comments && config.CommentPlugin.default_fold)\n place.style.display = 'none';\n else\n place.style.display = 'block';\n for(var i=0; i<comments.length; i++) {\n if(!comments[i].tags.contains(CPlingo.comments))continue;\n var container = createTiddlyElement(place, 'div', null, 'comment');\n var title = createTiddlyElement(container, 'strong');\n var link = createTiddlyLink(title, comments[i].modifier, true);\n createTiddlyElement(title, 'span', null, null, ', '+comments[i].created.formatString(this.dateFormat));\n/* ## remove editable option for security concern\n if(comments[i].modifier == config.options.txtUserName) {\n createTiddlyElement(title, 'span', null, null, ' (');\n var edit = createTiddlyLink(title, comments[i].title);\n edit.innerHTML = CPlingo.edit;\n createTiddlyElement(title, 'span', null, null, ')');\n }\n*/\n wikify('\sn'+comments[i].text+'\sn',container);\n config.macros.comments.handler(container,null,null,null,null,comments[i]);\n }\n readOnly = false;\n config.macros.newCommentLink.handler(place,null,null,null,null,tiddler);\n// wikify('<'+'<newCommentLink>>',place);\n readOnly = (window.location.protocol == "file:") ? false : config.options.chkHttpReadOnly;\n }\n};\nvar CPCloseTiddlers = [];\nTiddlyWiki.prototype.CommentPlugin_saveTiddler = TiddlyWiki.prototype.saveTiddler;\nTiddlyWiki.prototype.saveTiddler = function(title,newTitle,newBody,modifier,modified,tags) {\n tags=(!window.zw && typeof tags == "string") ? tags.readBracketedList() : tags;\n if(tags.contains(CPlingo.comments)){\n newBody=newBody.htmlDecode(); // comment this line, for working with HTMLAreaPackage\n newBody=newBody.substr(0,config.CommentPlugin.max_comment_count);\n newBody=newBody.htmlEncode(); // comment this line, for working with HTMLAreaPackage\n }\n var t = this.CommentPlugin_saveTiddler(title,newTitle,newBody,modifier,modified,tags);\n if(tags.contains(CPlingo.comments)) {\n var original = config.CommentPlugin.default_fold;\n config.CommentPlugin.default_fold = false;\n// story.refreshTiddler(get_parent(t).title, DEFAULT_VIEW_TEMPLATE, true);\n story.refreshTiddler(t.tags[0].split(CPlingo.CommentInTitle)[0], DEFAULT_VIEW_TEMPLATE, true);\n config.CommentPlugin.default_fold = original;\n CPCloseTiddlers.push(newTitle);\n setTimeout("story.closeTiddler(CPCloseTiddlers.pop(), true)", 500);\n }\n return t;\n};\nStory.prototype.chooseTemplateForTiddler = function(title,template)\n{\n if(!template)\n template = DEFAULT_VIEW_TEMPLATE;\n if(template == DEFAULT_VIEW_TEMPLATE\n || template == DEFAULT_EDIT_TEMPLATE\n || template == COMMENT_EDIT_TEMPLATE)\n template = config.tiddlerTemplates[template];\n return template;\n};\n//}}}
Type the text for 'excludeLists'
Type the text for 'excludeSearch'
\n/*{{{*/\n.commentTags ul {list-style:none; padding-left:0px; margin: 0 0 3px 0;}\n.commentTags li {display:inline; color:#999;}\n.commentTags li a.button {color:#999;}\n.comment {border-left:1px solid #ccc; margin-top:10px; margin-left:10px; padding:5px;}\n.newCommentLink {padding-top:10px}\n.tagging, .selected .tagging, .tiddler .tagging {display:none;}\n.comment a.button {padding:0px; font-size:smaller; background-color:lightgray;}\n.comments a.button {background-color:lightgray;}\n#displayArea .commentsOnly .tagging { display: none; }\n/*}}}*/
/*{{{*/\n#verticalBannerAd, #skyscraperAd { /*position: fixed; bottom: 1em; left: 1em;*/ display: none; }\n#linkUnitAd { display: none; }\n#displayArea .tagging {margin:0.5em 0.5em 0.5em 0; display:none; float: left; }\n#displayArea .isTag .tagging {display:block; }\n#displayArea .comments {margin-top:1em;}\n.viewer img { padding: 0.5ex; margin-top: 0.5ex; margin-right:0.5em; border: 1px solid [[ColorPalette::TertiaryLight]]; }\n.viewer .smiley img { border: none; padding:0; margin:0; margin-bottom:-3px;}\n.viewer hr { clear: both; border: none; border-bottom: 1px dotted [[ColorPalette::TertiaryLight]]; height: 0px; padding-top: 1ex; }\n#mainMenu { z-index: 1; background: white; }\n/*}}}*/\n[[CommentPluginStyle]]
<<allTags>>
Type the text for 'systemConfig'
Type the text for 'systemTiddler'
Type the text for 'UI'
Left at 29 March and stayed for a week.\nHad a great time, especially when skiing and randonnéeing.
Flew with Ryanair to Grenoble. It was pretty decent besides having to wait in the plane for an hour before takeoff and my seat giving off whiffs of vomit at times.\nHad a snack when we got to Max' place that included these really nice whole-grain chocolate crackers that I need to find out some more about.\nAfterwards we went out shopping some food at an asian supermarket and had a beer with Alex, and just finished a really nice sri lankan curry for dinner.\n(Or more like "brinner" since we hardly had anything to eat for the whole day.)\n\nWaiting for some coffee and apple crumble to finish off a really nice first evening in Grenoble.
Left early for Val Thorens, but it turned out the station was closed due to "Vent Violent". \n(Buncha prissys, the winds were nothing compared to what you would experience a normal day in Åre <<;)>> )\nAfter som asking around for open stations nearby we ended up in [[Les Karellis|http://www.karellis.com]], a totally unknown place to everyone in the group, which proved to be really quite nice with lots of open accessible off-pist space and great snow conditions. Nice!\nHadn't skied for over four years (<<:O>>) but it really is like riding a bike - I was back on form in no time - and got compliments afterwards that it didn't show at all that I'd been away from skiing for so long. Nice!\n\nAs usual, finished the night of with a nice dinner at home with Max&Tuss- had massive raclette this time - after a couple of beers at the pub of course.
[<img[http://photos-e.ak.facebook.com/photos-ak-sf2p/v195/83/62/669759936/s669759936_749116_6717.jpg][http://www.facebook.com/album.php?aid=33610&id=669759936]] Went skiing with Max and Alex in La Grave, which in many ways was like a dream come true for me.\nThe first run down was probably the best skiing experience of my life so far.\nSadly, my knee couldn't take the traversing for better runs and the increasingly heavy melting fresh snow on the sunny slopes and I had to call it a day quite early - such a disappointment!\nStill, it was a good day. Snapped some photos - [[Facebook album here|http://www.facebook.com/album.php?aid=33610&id=669759936]].\n\nAfter we got back we went to IKEA and I got to drive Max' car, an old 1992-ish VW Golf that turned out to be quite an interesting drive. Took some getting used to the pretty worn clutch, which caused a bit of OTT revving on my part, much to the amusement of passers by when I was leaving the parking space.\nEspecially one guy stared at us so much when he walked by that he walked into a signpost so hard you could hear the sound even in the car and his cigarette got mashed into his ear (<<:O>>), much to OUR amusement. <<:D>>
We don't travel a lot (yet), but you will find reports here when we do.
[<img[http://photos-f.ak.facebook.com/photos-ak-sf2p/v195/83/62/669759936/s669759936_749141_4829.jpg][http://www.facebook.com/album.php?aid=33611&id=669759936]]Went up the stairs to the Bastille with Linda.\nThe second attempt turned out to be a lot more successful for Linda than the first - we tried it once before two days ago, but had to abort the mission just a quarter of the way up after Linda nearly passed out. \nThat will probably teach her not to take on too tough walks //before// breakfast. <<;]>>\n\nHad a chocolate croissant as a reward for scaling all of the 1200+ steps a walk around the Bastille and then took a walk around the Bastille grounds and through the cave/tunnel there - really cool! \n[[Photos here.|http://www.facebook.com/album.php?aid=33611&id=669759936]]
<!--{{{-->\n<div class='toolbar' macro='toolbar closeTiddler closeOthers +editTiddler newHere > fields syncing permalink references revisions jump'></div>\n<div class='tagglyTagged' macro='tags'></div>\n<div class='title' macro='view title'></div>\n<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>\n<div class='viewer' macro='view text wikified'></div>\n<div class='tagglyTagging' macro='tagglyTagging'></div>\n<div class='tagClear'></div>\n<!--}}}-->\n<div class='comments' macro='comments'></div>
Went to the Grenoble museum with Therese and Linda, which was nice.\nNotable event of the day though:\nhad tea at a place called //Jardin du thé// (sp?) which had a quite big selection of teas available for tasting. I tried a [[Darjeeling (second flush, Jungpanna estate)|http://en.wikipedia.org/wiki/Darjeeling_tea]] that turned out to be a bit of a revelation - I've never really understood the people geeking out on tea in the same way as I would on coffee. \nNow I know. <<:)>>\n
[<img[http://photos-a.ak.facebook.com/photos-ak-sf2p/v195/83/62/669759936/s669759936_749152_7688.jpg][http://www.facebook.com/album.php?aid=33613&id=669759936]]Time to check another item on the "things I'd like to try sometime" list:\nWent on [[Ski de Randonnée|http://en.wikipedia.org/wiki/Ski_touring#Alpine_Touring_.28randonn.C3.A9e.29]] tour with Max.\nIt was decided that [[Le Tabor|http://www.skitour.fr/topos/le-tabor,183.html]] (900m vertical) wold be a suitable introduction - quite easy both ascent and descent.\nTurned out to be a really nice day!\n\nStarted out in St Honoré 1500, a weird half-finished ski resort with ghostly empty uncompleted hotel husks with gaping black window holes slowly decaying on the mountainside.\nThe 3.5 hour ascent from there didn't pose much of a problem for me - had half expected my endurance wouldn't be sufficient - though I'll admit I got a bit shaky at the steepest section, mostly because I started feeling that my knee couldn't take the strain. Fortunately Max resourcefully suggested taking off the skis and climbing straight up which turned out to be much easier on the knee than traversing. Also, being swiftly passed by a group of ~50 year old ladies at that point helped a lot <<;]>>.\n[>img[http://photos-f.ak.facebook.com/photos-ak-sf2p/v195/83/62/669759936/s669759936_749165_1155.jpg][http://www.facebook.com/album.php?aid=33613&id=669759936]]\nFrom there the summit was reached handily. What a spectacular view!\nAfter a nice lunch consisting of reblochon, saucisson sec, bread and chocolate it was time for the descent.\nWe were expecting nice and soft spring snow, but the weather turned out to be a lot colder and windier than anticipated, so the top part of the run was on quite hard snow, but still very skiable and fun!\nThe lower part of the run had more time to warm up and was on nice buttery soft spring snow.\n\n[<img[http://photos-c.ak.facebook.com/photos-ak-sf2p/v195/83/62/669759936/s669759936_749162_298.jpg][http://www.facebook.com/album.php?aid=33613&id=669759936]]Once again I'll have to admit that I was a bit malky about the steepest section, but the entire run turned out to be very very easy for me. \nIn retrospect I guess we could have taken one of the couloirs from the summit to make the descent a bit more interesting, but on the other hand it was probably for the better anyway - still not too confident about my skiing skills after such a long hiatus, though I'm very satisfied with the way it's felt like I could ski like nothing ever happened. <<:D>>\nI'm also very pleased that my knee could take the abuse, though on the way to grab a beer at the bar just next to the parking in S:t Honoré 1500 (nice!) it was cracking and popping like crazy.\n\nI will be back for more of the //free ride// (french accent required), no doubt, and before that time I //will// get physio for my knee. <<=)>>\n\nManaged to snap a few photos, full album [[HERE|http://www.facebook.com/album.php?aid=33613&id=669759936]].
Went shopping for some home decoration stuff.\nTurned out most of the stuff we wanted was out of stock. Typical! <<:(>>\n\nEnded up getting a cheap [[kit of Nexa wireless light switches|http://www.nexa.se/PA33300Fjarrstrombrytarset3pack.htm]] plus two [[built-in type dimmers|http://www.nexa.se/LCMR300Dimmermottagare.htm]] of the same brand at Bauhaus, and an ultra-cheap rice lampshade at IKEA.\n\nAlso found an interesting storage box at IKEA called [[Strikt|http://www.ikea.com/se/sv/catalog/products/40113038]] that might work well as vinyl "crates" in the Expedit shelf we have.\n\n
Feeling the need to organize my life better.\nThus, I'm planning on creating a [[HipsterPDA|http://www.43folders.com/2004/09/03/introducing-the-hipster-pda]] for myself and start implementing some kind of [[GTD|http://www.43folders.com/2004/09/08/getting-started-with-getting-things-done]]-like system.\n\nProbably will set up a [[GTDTiddlyWiki|http://nathanbowers.com/gtdtw/]]-like workspace in this TiddlyWiki to maintain my lists and do weekly review.\n\nThinking of having the following folders/buckets/spheres:\n* PROJECTS - current open projects\n* @~NextActions - next actions this week for all open projects/spheres(?)\n* @Inbox - unprocessed items, just to jot down new things\n* @Home - stuff to do at home\n* @Work - stuff to do at work\n* @Waiting - stuff I'm waiting for others to do\n* @~SomeDay - stuff I'd like to do/get someday in the future\n* @Agenda - "should" be one for every important person. Probably can keep just one with sections like on the GTDTiddlyWiki site\n* @Groceries - needed groceries\n* @Food - planned cooking?\n* @Tech - sort of combo of an @computer/@someday\n* @Music - stuff to do relating to music\n* @<project> - subtasking of individual projects?\n* @<day> - daily "ticklers" plus agenda\n* Linear agenda for next 4 weeks or something\n* @Economy - or something similar? Stuff related to managing private economy
|URL:|http://www.43folders.com|\n|Description:|Personal productivity and life hacks - //extremely useful stuff//|
I'm running the following as a service in windows, and use it for tunneling most of my traffic encrypted offsite (tinfoil hat!):\n\n{{{\ncygrunsrv -I autossh_lysator -p /bin/autossh \n -a "-N -i /etc/id_rsa user@server.com -D localhost:1080" \n -e _LOGLEVEL=7 -e AUTOSSH_NTSERVICE=true \n -e AUTOSSH_PORT=0 -e AUTOSSH_GATETIME=0\n}}}
/***\n|Name:|TagglyTaggingPlugin|\n|Description:|tagglyTagging macro is a replacement for the builtin tagging macro in your ViewTemplate|\n|Version:|3.1 ($Rev: 4092 $)|\n|Date:|$Date: 2008-03-24 12:32:33 +1000 (Mon, 24 Mar 2008) $|\n|Source:|http://mptw.tiddlyspot.com/#TagglyTaggingPlugin|\n|Author:|Simon Baird <simon.baird@gmail.com>|\n|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|\n!Notes\nSee http://mptw.tiddlyspot.com/#TagglyTagging\n***/\n//{{{\nconfig.taggly = {\n\n // for translations\n lingo: {\n labels: {\n asc: "\su2191", // down arrow\n desc: "\su2193", // up arrow\n title: "title",\n modified: "modified",\n created: "created",\n show: "+",\n hide: "-",\n normal: "normal",\n group: "group",\n commas: "commas",\n sitemap: "sitemap",\n numCols: "cols\su00b1", // plus minus sign\n label: "Tagged as '%0':",\n excerpts: "excerpts",\n descr: "descr",\n slices: "slices",\n contents: "contents",\n sliders: "sliders",\n noexcerpts: "title only"\n },\n\n tooltips: {\n title: "Click to sort by title",\n modified: "Click to sort by modified date",\n created: "Click to sort by created date",\n show: "Click to show tagging list",\n hide: "Click to hide tagging list",\n normal: "Click to show a normal ungrouped list",\n group: "Click to show list grouped by tag",\n sitemap: "Click to show a sitemap style list",\n commas: "Click to show a comma separated list",\n numCols: "Click to change number of columns",\n excerpts: "Click to show excerpts",\n descr: "Click to show the description slice",\n slices: "Click to show all slices",\n contents: "Click to show entire tiddler contents",\n sliders: "Click to show tiddler contents in sliders",\n noexcerpts: "Click to show entire title only"\n }\n },\n\n config: {\n showTaggingCounts: true,\n listOpts: {\n // the first one will be the default\n sortBy: ["title","modified","created"],\n sortOrder: ["asc","desc"],\n hideState: ["show","hide"],\n listMode: ["normal","group","sitemap","commas"],\n numCols: ["1","2","3","4","5","6"],\n excerpts: ["noexcerpts","excerpts","descr","slices","contents","sliders"]\n },\n valuePrefix: "taggly.",\n excludeTags: ["excludeLists","excludeTagging"],\n excerptSize: 50,\n excerptMarker: "/%"+"%/"\n },\n\n getTagglyOpt: function(title,opt) {\n var val = store.getValue(title,this.config.valuePrefix+opt);\n return val ? val : this.config.listOpts[opt][0];\n },\n\n setTagglyOpt: function(title,opt,value) {\n if (!store.tiddlerExists(title))\n // create it silently\n store.saveTiddler(title,title,config.views.editor.defaultText.format([title]),config.options.txtUserName,new Date(),"");\n // if value is default then remove it to save space\n return store.setValue(title,\n this.config.valuePrefix+opt,\n value == this.config.listOpts[opt][0] ? null : value);\n },\n\n getNextValue: function(title,opt) {\n var current = this.getTagglyOpt(title,opt);\n var pos = this.config.listOpts[opt].indexOf(current);\n // a little usability enhancement. actually it doesn't work right for grouped or sitemap\n var limit = (opt == "numCols" ? store.getTaggedTiddlers(title).length : this.config.listOpts[opt].length);\n var newPos = (pos + 1) % limit;\n return this.config.listOpts[opt][newPos];\n },\n\n toggleTagglyOpt: function(title,opt) {\n var newVal = this.getNextValue(title,opt);\n this.setTagglyOpt(title,opt,newVal);\n }, \n\n createListControl: function(place,title,type) {\n var lingo = config.taggly.lingo;\n var label;\n var tooltip;\n var onclick;\n\n if ((type == "title" || type == "modified" || type == "created")) {\n // "special" controls. a little tricky. derived from sortOrder and sortBy\n label = lingo.labels[type];\n tooltip = lingo.tooltips[type];\n\n if (this.getTagglyOpt(title,"sortBy") == type) {\n label += lingo.labels[this.getTagglyOpt(title,"sortOrder")];\n onclick = function() {\n config.taggly.toggleTagglyOpt(title,"sortOrder");\n return false;\n }\n }\n else {\n onclick = function() {\n config.taggly.setTagglyOpt(title,"sortBy",type);\n config.taggly.setTagglyOpt(title,"sortOrder",config.taggly.config.listOpts.sortOrder[0]);\n return false;\n }\n }\n }\n else {\n // "regular" controls, nice and simple\n label = lingo.labels[type == "numCols" ? type : this.getNextValue(title,type)];\n tooltip = lingo.tooltips[type == "numCols" ? type : this.getNextValue(title,type)];\n onclick = function() {\n config.taggly.toggleTagglyOpt(title,type);\n return false;\n }\n }\n\n // hide button because commas don't have columns\n if (!(this.getTagglyOpt(title,"listMode") == "commas" && type == "numCols"))\n createTiddlyButton(place,label,tooltip,onclick,type == "hideState" ? "hidebutton" : "button");\n },\n\n makeColumns: function(orig,numCols) {\n var listSize = orig.length;\n var colSize = listSize/numCols;\n var remainder = listSize % numCols;\n\n var upperColsize = colSize;\n var lowerColsize = colSize;\n\n if (colSize != Math.floor(colSize)) {\n // it's not an exact fit so..\n upperColsize = Math.floor(colSize) + 1;\n lowerColsize = Math.floor(colSize);\n }\n\n var output = [];\n var c = 0;\n for (var j=0;j<numCols;j++) {\n var singleCol = [];\n var thisSize = j < remainder ? upperColsize : lowerColsize;\n for (var i=0;i<thisSize;i++) \n singleCol.push(orig[c++]);\n output.push(singleCol);\n }\n\n return output;\n },\n\n drawTable: function(place,columns,theClass) {\n var newTable = createTiddlyElement(place,"table",null,theClass);\n var newTbody = createTiddlyElement(newTable,"tbody");\n var newTr = createTiddlyElement(newTbody,"tr");\n for (var j=0;j<columns.length;j++) {\n var colOutput = "";\n for (var i=0;i<columns[j].length;i++) \n colOutput += columns[j][i];\n var newTd = createTiddlyElement(newTr,"td",null,"tagglyTagging"); // todo should not need this class\n wikify(colOutput,newTd);\n }\n return newTable;\n },\n\n createTagglyList: function(place,title) {\n switch(this.getTagglyOpt(title,"listMode")) {\n case "group": return this.createTagglyListGrouped(place,title); break;\n case "normal": return this.createTagglyListNormal(place,title,false); break;\n case "commas": return this.createTagglyListNormal(place,title,true); break;\n case "sitemap":return this.createTagglyListSiteMap(place,title); break;\n }\n },\n\n getTaggingCount: function(title) {\n // thanks to Doug Edmunds\n if (this.config.showTaggingCounts) {\n var tagCount = store.getTaggedTiddlers(title).length;\n if (tagCount > 0)\n return " ("+tagCount+")";\n }\n return "";\n },\n\n getExcerpt: function(inTiddlerTitle,title,indent) {\n if (!indent)\n indent = 1;\n\n var displayMode = this.getTagglyOpt(inTiddlerTitle,"excerpts");\n var t = store.getTiddler(title);\n\n if (t && displayMode == "excerpts") {\n var text = t.text.replace(/\sn/," ");\n var marker = text.indexOf(this.config.excerptMarker);\n if (marker != -1) {\n return " {{excerpt{<nowiki>" + text.substr(0,marker) + "</nowiki>}}}";\n }\n else if (text.length < this.config.excerptSize) {\n return " {{excerpt{<nowiki>" + t.text + "</nowiki>}}}";\n }\n else {\n return " {{excerpt{<nowiki>" + t.text.substr(0,this.config.excerptSize) + "..." + "</nowiki>}}}";\n }\n }\n else if (t && displayMode == "contents") {\n return "\sn{{contents indent"+indent+"{\sn" + t.text + "\sn}}}";\n }\n else if (t && displayMode == "sliders") {\n return "<slider slide>\sn{{contents{\sn" + t.text + "\sn}}}\sn</slider>";\n }\n else if (t && displayMode == "descr") {\n var descr = store.getTiddlerSlice(title,'Description');\n return descr ? " {{excerpt{" + descr + "}}}" : "";\n }\n else if (t && displayMode == "slices") {\n var result = "";\n var slices = store.calcAllSlices(title);\n for (var s in slices)\n result += "|%0|<nowiki>%1</nowiki>|\sn".format([s,slices[s]]);\n return result ? "\sn{{excerpt excerptIndent{\sn" + result + "}}}" : "";\n }\n return "";\n },\n\n notHidden: function(t,inTiddler) {\n if (typeof t == "string") \n t = store.getTiddler(t);\n return (!t || !t.tags.containsAny(this.config.excludeTags) ||\n (inTiddler && this.config.excludeTags.contains(inTiddler)));\n },\n\n // this is for normal and commas mode\n createTagglyListNormal: function(place,title,useCommas) {\n\n var list = store.getTaggedTiddlers(title,this.getTagglyOpt(title,"sortBy"));\n\n if (this.getTagglyOpt(title,"sortOrder") == "desc")\n list = list.reverse();\n\n var output = [];\n var first = true;\n for (var i=0;i<list.length;i++) {\n if (this.notHidden(list[i],title)) {\n var countString = this.getTaggingCount(list[i].title);\n var excerpt = this.getExcerpt(title,list[i].title);\n if (useCommas)\n output.push((first ? "" : ", ") + "[[" + list[i].title + "]]" + countString + excerpt);\n else\n output.push("*[[" + list[i].title + "]]" + countString + excerpt + "\sn");\n\n first = false;\n }\n }\n\n return this.drawTable(place,\n this.makeColumns(output,useCommas ? 1 : parseInt(this.getTagglyOpt(title,"numCols"))),\n useCommas ? "commas" : "normal");\n },\n\n // this is for the "grouped" mode\n createTagglyListGrouped: function(place,title) \n {\n var sortBy = this.getTagglyOpt(title,"sortBy");\n var sortOrder = this.getTagglyOpt(title,"sortOrder");\n\n var list = store.getTaggedTiddlers(title,sortBy);\n if (sortOrder == "desc") list = list.reverse();\n\n var leftOvers = []\n for (var i=0;i<list.length;i++) leftOvers.push(list[i].title);\n\n var allTagsHolder = {};\n for (var i=0;i<list.length;i++) \n {\n for (var j=0;j<list[i].tags.length;j++) \n {\n if (list[i].tags[j] != title) \n { // not this tiddler\n if (this.notHidden(list[i].tags[j],title)) \n {\n if (!allTagsHolder[list[i].tags[j]]) allTagsHolder[list[i].tags[j]] = "";\n\n if (this.notHidden(list[i],title)) \n {\n allTagsHolder[list[i].tags[j]] += "**[["+list[i].title+"]]"\n + this.getTaggingCount(list[i].title) + this.getExcerpt(title,list[i].title) + "\sn";\n leftOvers.setItem(list[i].title,-1); // remove from leftovers. at the end it will contain the leftovers\n }\n }\n }\n }\n }\n\n var allTags = [];\n for (var t in allTagsHolder) \n {\n allTags.push(t);\n //miklo:\n leftOvers.setItem(t, -1); // remove from leftovers. at the end it will contain the leftovers\n }\n allTags = allTags.concat(leftOvers);\n\n var sortHelper = function(a,b) {\n if (a == b) return 0;\n if (a < b) return -1;\n return 1;\n };\n\n allTags.sort(function(a,b) {\n var tidA = store.getTiddler(a);\n var tidB = store.getTiddler(b);\n if (sortBy == "title") return sortHelper(a,b);\n else if (!tidA && !tidB) return 0;\n else if (!tidA) return -1;\n else if (!tidB) return +1;\n else return sortHelper(tidA[sortBy],tidB[sortBy]);\n });\n\n /* var leftOverOutput = "";\n for (var i=0;i<leftOvers.length;i++)\n {\n if (this.notHidden(leftOvers[i],title)) \n {\n leftOverOutput += "*[["+leftOvers[i]+"]]" + this.getTaggingCount(leftOvers[i]) + this.getExcerpt(title,leftOvers[i]) + "\sn";\n }\n }*/\n var output = [];\n if (sortOrder == "desc")\n { \n allTags.reverse();\n }\n //miklo: \n // else if (leftOverOutput != "") // leftovers first...\n // {\n // output.push(leftOverOutput);\n // }\n\n for (var i=0;i<allTags.length;i++)\n {\n if (allTagsHolder[allTags[i]] != "")\n {\n output.push("*[["+allTags[i]+"]]" + this.getTaggingCount(allTags[i]) + this.getExcerpt(title,allTags[i]) + "\sn"); \n if (allTagsHolder[allTags[i]]) output.push(allTagsHolder[allTags[i]]);\n }\n }\n\n //miklo:\n // if (sortOrder == "desc" && leftOverOutput != "")\n // {\n // // leftovers last...\n // output.push(leftOverOutput);\n // }\n\n return this.drawTable(place, \n this.makeColumns(output,parseInt(this.getTagglyOpt(title,"numCols"))),\n "grouped");\n\n },\n\n // used to build site map\n treeTraverse: function(title,depth,sortBy,sortOrder) {\n\n var list = store.getTaggedTiddlers(title,sortBy);\n if (sortOrder == "desc")\n list.reverse();\n\n var indent = "";\n for (var j=0;j<depth;j++)\n indent += "*"\n\n var childOutput = "";\n for (var i=0;i<list.length;i++)\n if (list[i].title != title)\n if (this.notHidden(list[i].title,this.config.inTiddler))\n childOutput += this.treeTraverse(list[i].title,depth+1,sortBy,sortOrder);\n\n if (depth == 0)\n return childOutput;\n else\n return indent + "[["+title+"]]" + this.getTaggingCount(title) + this.getExcerpt(this.config.inTiddler,title,depth) + "\sn" + childOutput;\n },\n\n // this if for the site map mode\n createTagglyListSiteMap: function(place,title) {\n this.config.inTiddler = title; // nasty. should pass it in to traverse probably\n var output = this.treeTraverse(title,0,this.getTagglyOpt(title,"sortBy"),this.getTagglyOpt(title,"sortOrder"));\n return this.drawTable(place,\n this.makeColumns(output.split(/(?=^\s*\s[)/m),parseInt(this.getTagglyOpt(title,"numCols"))), // regexp magic\n "sitemap"\n );\n },\n\n macros: {\n tagglyTagging: {\n handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n var refreshContainer = createTiddlyElement(place,"div");\n // do some refresh magic to make it keep the list fresh - thanks Saq\n refreshContainer.setAttribute("refresh","macro");\n refreshContainer.setAttribute("macroName",macroName);\n if (params[0])\n refreshContainer.setAttribute("title",params[0]);\n else {\n refreshContainer.setAttribute("title",tiddler.title);\n }\n this.refresh(refreshContainer);\n },\n\n refresh: function(place) {\n var title = place.getAttribute("title");\n removeChildren(place);\n addClass(place,"tagglyTagging");\n\n//miklo: don't count comments\nvar tagged = store.getTaggedTiddlers(title);\nfor (var i = tagged.length; i-- > 0;) if (tagged[i].isTagged("comments")) tagged.splice(i,1);\n// if (store.getTaggedTiddlers(title).length > 0) {\n if (tagged.length > 0) {\n var lingo = config.taggly.lingo;\n config.taggly.createListControl(place,title,"hideState");\n if (config.taggly.getTagglyOpt(title,"hideState") == "show") {\n//miklo: createTiddlyElement(place,"span",null,"tagglyLabel",lingo.labels.label.format([title]));\nvar onclick = function() { \nvar tagged = store.getTaggedTiddlers(title,config.taggly.getTagglyOpt(title,"sortBy"));\nif (config.taggly.getTagglyOpt(title,"sortOrder") == "desc") tagged = tagged.reverse();\nfor (var i = tagged.length; i-- > 0;) if (tagged[i].isTagged("comments")) tagged.splice(i,1);\nstory.displayTiddlers(this, tagged);\n}\ncreateTiddlyButton(place,lingo.labels.label.format([title]),"Open all",onclick, "button");\n////////\n\n config.taggly.createListControl(place,title,"title");\n config.taggly.createListControl(place,title,"modified");\n config.taggly.createListControl(place,title,"created");\n config.taggly.createListControl(place,title,"listMode");\n config.taggly.createListControl(place,title,"excerpts");\n config.taggly.createListControl(place,title,"numCols");\n config.taggly.createTagglyList(place,title);\n }\n }\n }\n }\n },\n\n // todo fix these up a bit\n styles: [\n"/*{{{*/",\n"/* created by TagglyTaggingPlugin */",\n".tagglyTagging { padding-top:0.5em; }",\n".tagglyTagging li.listTitle { display:none; }",\n".tagglyTagging ul {",\n" margin-top:0px; padding-top:0.5em; padding-left:2em;",\n" margin-bottom:0px; padding-bottom:0px;",\n"}",\n".tagglyTagging { vertical-align: top; margin:0px; padding:0px; }",\n".tagglyTagging table { margin:0px; padding:0px; }",\n".tagglyTagging .button { visibility:hidden; margin-left:3px; margin-right:3px; }",\n".tagglyTagging .button, .tagglyTagging .hidebutton {",\n" color:[[ColorPalette::TertiaryLight]]; font-size:90%;",\n" border:0px; padding-left:0.3em;padding-right:0.3em;",\n"}",\n".tagglyTagging .button:hover, .hidebutton:hover, ",\n".tagglyTagging .button:active, .hidebutton:active {",\n" border:0px; background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]];",\n"}",\n".selected .tagglyTagging .button { visibility:visible; }",\n".tagglyTagging .hidebutton { color:[[ColorPalette::Background]]; }",\n".selected .tagglyTagging .hidebutton { color:[[ColorPalette::TertiaryLight]] }",\n".tagglyLabel { color:[[ColorPalette::TertiaryMid]]; font-size:90%; }",\n".tagglyTagging ul {padding-top:0px; padding-bottom:0.5em; margin-left:1em; }",\n".tagglyTagging ul ul {list-style-type:disc; margin-left:-1em;}",\n".tagglyTagging ul ul li {margin-left:0.5em; }",\n".editLabel { font-size:90%; padding-top:0.5em; }",\n".tagglyTagging .commas { padding-left:1.8em; }",\n"/* not technically tagglytagging but will put them here anyway */",\n".tagglyTagged li.listTitle { display:none; }",\n".tagglyTagged li { display: inline; font-size:90%; }",\n".tagglyTagged ul { margin:0px; padding:0px; }",\n".excerpt { color:[[ColorPalette::TertiaryDark]]; }",\n".excerptIndent { margin-left:4em; }",\n"div.tagglyTagging table,",\n"div.tagglyTagging table tr,",\n"td.tagglyTagging",\n" {border-style:none!important; }",\n".tagglyTagging .contents { border-bottom:2px solid [[ColorPalette::TertiaryPale]]; padding:0 1em 1em 0.5em;",\n" margin-bottom:0.5em; }",\n".tagglyTagging .indent1 { margin-left:3em; }",\n".tagglyTagging .indent2 { margin-left:4em; }",\n".tagglyTagging .indent3 { margin-left:5em; }",\n".tagglyTagging .indent4 { margin-left:6em; }",\n".tagglyTagging .indent5 { margin-left:7em; }",\n".tagglyTagging .indent6 { margin-left:8em; }",\n".tagglyTagging .indent7 { margin-left:9em; }",\n".tagglyTagging .indent8 { margin-left:10em; }",\n".tagglyTagging .indent9 { margin-left:11em; }",\n".tagglyTagging .indent10 { margin-left:12em; }",\n"/*}}}*/",\n ""].join("\sn"),\n\n init: function() {\n merge(config.macros,this.macros);\n config.shadowTiddlers["TagglyTaggingStyles"] = this.styles;\n store.addNotification("TagglyTaggingStyles",refreshStyles);\n }\n};\n\nconfig.taggly.init();\n\n//}}}\n\n/***\nInlineSlidersPlugin\nBy Saq Imtiaz\nhttp://tw.lewcid.org/sandbox/#InlineSlidersPlugin\n\n// syntax adjusted to not clash with NestedSlidersPlugin\n// added + syntax to start open instead of closed\n\n***/\n//{{{\nconfig.formatters.unshift( {\n name: "inlinesliders",\n // match: "\s\s+\s\s+\s\s+\s\s+|\s\s<slider",\n match: "\s\s<slider",\n // lookaheadRegExp: /(?:\s+\s+\s+\s+|<slider) (.*?)(?:>?)\sn((?:.|\sn)*?)\sn(?:====|<\s/slider>)/mg,\n lookaheadRegExp: /(?:<slider)(\s+?) (.*?)(?:>)\sn((?:.|\sn)*?)\sn(?:<\s/slider>)/mg,\n handler: function(w) {\n this.lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = this.lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart ) {\n var btn = createTiddlyButton(w.output,lookaheadMatch[2] + " "+"\su00BB",lookaheadMatch[2],this.onClickSlider,"button sliderButton");\n var panel = createTiddlyElement(w.output,"div",null,"sliderPanel");\n panel.style.display = (lookaheadMatch[1] == '+' ? "block" : "none");\n wikify(lookaheadMatch[3],panel);\n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n }\n },\n onClickSlider : function(e) {\n if(!e) var e = window.event;\n var n = this.nextSibling;\n n.style.display = (n.style.display=="none") ? "block" : "none";\n return false;\n }\n});\n\n//}}}\n\n
/***\n|Name:|QuickOpenTagPlugin|\n|Description:|Changes tag links to make it easier to open tags as tiddlers|\n|Version:|3.0.1 ($Rev: 3861 $)|\n|Date:|$Date: 2008-03-08 10:53:09 +1000 (Sat, 08 Mar 2008) $|\n|Source:|http://mptw.tiddlyspot.com/#QuickOpenTagPlugin|\n|Author:|Simon Baird <simon.baird@gmail.com>|\n|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|\n***/\n//{{{\nconfig.quickOpenTag = {\n\n dropdownChar: (document.all ? "\su25bc" : "\su25be"), // the little one doesn't work in IE?\n\n createTagButton: function(place,tag,excludeTiddler) {\n // little hack so we can do this: <<tag PrettyTagName|RealTagName>>\n var splitTag = tag.split("|");\n var pretty = tag;\n if (splitTag.length == 2) {\n tag = splitTag[1];\n pretty = splitTag[0];\n }\n \n var sp = createTiddlyElement(place,"span",null,"quickopentag");\n createTiddlyText(createTiddlyLink(sp,tag,false),pretty);\n \n var theTag = createTiddlyButton(sp,config.quickOpenTag.dropdownChar,\n config.views.wikified.tag.tooltip.format([tag]),onClickTag);\n theTag.setAttribute("tag",tag);\n if (excludeTiddler)\n theTag.setAttribute("tiddler",excludeTiddler);\n return(theTag);\n },\n\n miniTagHandler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var tagged = store.getTaggedTiddlers(tiddler.title);\n if (tagged.length > 0) {\n var theTag = createTiddlyButton(place,config.quickOpenTag.dropdownChar,\n config.views.wikified.tag.tooltip.format([tiddler.title]),onClickTag);\n theTag.setAttribute("tag",tiddler.title);\n theTag.className = "miniTag";\n }\n },\n\n allTagsHandler: function(place,macroName,params) {\n var tags = store.getTags(params[0]);\n var filter = params[1]; // new feature\n var ul = createTiddlyElement(place,"ul");\n if(tags.length == 0)\n createTiddlyElement(ul,"li",null,"listTitle",this.noTags);\n for(var t=0; t<tags.length; t++) {\n var title = tags[t][0];\n if (!filter || (title.match(new RegExp('^'+filter)))) {\n\n//miklo:\n var tagged = store.getTaggedTiddlers(title); \n var commentsOnly = true; //todo: generalize with param?!\n for(var r=0;r<tagged.length;r++) { \n if(!tagged[r].isTagged("comments")) {\n commentsOnly = false;\n break;\n }\n }\n if (commentsOnly) continue;\n//--------\n\n var info = getTiddlyLinkInfo(title);\n var theListItem =createTiddlyElement(ul,"li");\n var theLink = createTiddlyLink(theListItem,tags[t][0],true);\n var theCount = " (" + tags[t][1] + ")";\n theLink.appendChild(document.createTextNode(theCount));\n var theDropDownBtn = createTiddlyButton(theListItem," " +\n config.quickOpenTag.dropdownChar,this.tooltip.format([tags[t][0]]),onClickTag);\n theDropDownBtn.setAttribute("tag",tags[t][0]);\n }\n }\n },\n\n // todo fix these up a bit\n styles: [\n"/*{{{*/",\n"/* created by QuickOpenTagPlugin */",\n".tagglyTagged .quickopentag, .tagged .quickopentag ",\n" { margin-right:1.2em; border:1px solid #eee; padding:2px; padding-right:0px; padding-left:1px; }",\n".quickopentag .tiddlyLink { padding:2px; padding-left:3px; }",\n".quickopentag a.button { padding:1px; padding-left:2px; padding-right:2px;}",\n"/* extra specificity to make it work right */",\n"#displayArea .viewer .quickopentag a.button, ",\n"#displayArea .viewer .quickopentag a.tiddyLink, ",\n"#mainMenu .quickopentag a.tiddyLink, ",\n"#mainMenu .quickopentag a.tiddyLink ",\n" { border:0px solid black; }",\n"#displayArea .viewer .quickopentag a.button, ",\n"#mainMenu .quickopentag a.button ",\n" { margin-left:0px; padding-left:2px; }",\n"#displayArea .viewer .quickopentag a.tiddlyLink, ",\n"#mainMenu .quickopentag a.tiddlyLink ",\n" { margin-right:0px; padding-right:0px; padding-left:0px; margin-left:0px; }",\n"a.miniTag {font-size:150%;} ",\n"#mainMenu .quickopentag a.button ",\n" /* looks better in right justified main menus */",\n" { margin-left:0px; padding-left:2px; margin-right:0px; padding-right:0px; }", \n"#topMenu .quickopentag { padding:0px; margin:0px; border:0px; }",\n"#topMenu .quickopentag .tiddlyLink { padding-right:1px; margin-right:0px; }",\n"#topMenu .quickopentag .button { padding-left:1px; margin-left:0px; border:0px; }",\n"/*}}}*/",\n ""].join("\sn"),\n\n init: function() {\n // we fully replace these builtins. can't hijack them easily\n window.createTagButton = this.createTagButton;\n config.macros.allTags.handler = this.allTagsHandler;\n config.macros.miniTag = { handler: this.miniTagHandler };\n config.shadowTiddlers["QuickOpenTagStyles"] = this.styles;\n store.addNotification("QuickOpenTagStyles",refreshStyles);\n }\n}\n\nconfig.quickOpenTag.init();\n\n//}}}\n\n
|URL:|http://www.iranmania.com/travel/eating/|\n|Description:|Was looking for recipes with Zereshk berries and found this site with very interesting persian cuisine!|
/***\n| Name:|RenameTagsPlugin|\n| Description:|Allows you to easily rename or delete tags across multiple tiddlers|\n| Version:|$$version$$|\n| Date:|$$date$$|\n| Source:|http://mptw.tiddlyspot.com/#RenameTagsPlugin|\n| Author:|Simon Baird <simon.baird@gmail.com>, modified by Mikael Langer|\n| CoreVersion:|2.1.x|\nRename a tag and you will be prompted to rename it in all its tagged tiddlers.\n***/\n//{{{\nconfig.renameTags = {\n\n prompts: {\n rename: "Rename the tag '%0' to '%1' in %2 tidder%3?",\n remove: "Remove the tag '%0' from %1 tidder%2?"\n },\n\n removeTag: function(tag,tiddlers) {\n store.suspendNotifications();\n for (var i=0;i<tiddlers.length;i++) {\n store.setTiddlerTag(tiddlers[i].title,false,tag);\n //miklo: need to save modified tiddlers so changes propagate to server storage\n var tiddler = tiddlers[i];\n store.saveTiddler(tiddler.title, tiddler.title, tiddler.text, tiddler.modifier, tiddler.modified, tiddler.tags, tiddler.fields, false, tiddler.created);\n }\n store.resumeNotifications();\n store.notifyAll();\n //miklo: update visible tiddlers\n story.refreshAllTiddlers();\n },\n\n renameTag: function(oldTag,newTag,tiddlers) {\n store.suspendNotifications();\n for (var i=0;i<tiddlers.length;i++) {\n store.setTiddlerTag(tiddlers[i].title,false,oldTag); // remove old\n store.setTiddlerTag(tiddlers[i].title,true,newTag); // add new\n //miklo: need to save modified tiddlers so changes propagate to server storage\n var tiddler = tiddlers[i];\n store.saveTiddler(tiddler.title, tiddler.title, tiddler.text, tiddler.modifier, tiddler.modified, tiddler.tags, tiddler.fields, false, tiddler.created);\n }\n store.resumeNotifications();\n store.notifyAll();\n //miklo: update visible tiddlers\n story.refreshAllTiddlers();\n },\n\n storeMethods: {\n\n saveTiddler_orig_renameTags: TiddlyWiki.prototype.saveTiddler,\n\n saveTiddler: function(title,newTitle,newBody,modifier,modified,tags,fields) {\n if (title != newTitle) {\n var tagged = this.getTaggedTiddlers(title);\n if (tagged.length > 0) {\n // then we are renaming a tag\n if (confirm(config.renameTags.prompts.rename.format([title,newTitle,tagged.length,tagged.length>1?"s":""])))\n config.renameTags.renameTag(title,newTitle,tagged);\n\n if (!this.tiddlerExists(title) && newBody == "")\n // dont create unwanted tiddler\n return null;\n }\n }\n return this.saveTiddler_orig_renameTags(title,newTitle,newBody,modifier,modified,tags,fields);\n },\n\n removeTiddler_orig_renameTags: TiddlyWiki.prototype.removeTiddler,\n\n removeTiddler: function(title) {\n var tagged = this.getTaggedTiddlers(title);\n if (tagged.length > 0)\n if (confirm(config.renameTags.prompts.remove.format([title,tagged.length,tagged.length>1?"s":""])))\n config.renameTags.removeTag(title,tagged);\n return this.removeTiddler_orig_renameTags(title);\n }\n\n },\n\n init: function() {\n merge(TiddlyWiki.prototype,this.storeMethods);\n }\n}\n\nconfig.renameTags.init();\n\n//}}}\n\n
//{{{\n// to use these you must add them to the tool bar in EditTemplate\n\nmerge(config.commands,{\n\n saveCloseTiddler: {\n text: 'done/close',\n tooltip: 'Undo changes to this tiddler and close it',\n handler: function(e,src,title) {\n config.commands.saveTiddler.handler(e,src,title);\n config.commands.closeTiddler.handler(e,src,title);\n return false;\n }\n },\n\n cancelCloseTiddler: {\n text: 'cancel/close',\n tooltip: 'Save changes to this tiddler and close it',\n handler: function(e,src,title) {\n config.commands.cancelTiddler.handler(e,src,title);\n config.commands.closeTiddler.handler(e,src,title);\n return false;\n }\n }\n\n});\n//}}}
<div class='toolbar' macro='toolbar +saveTiddler -cancelCloseTiddler deleteTiddler wikibar'></div><div class='title' macro='view title'></div><div class='editor' macro='edit tags' style='display:none;'></div><div class='GuestSign' >Your Name: <span macro='option txtUserName'></span>(nick name)<br />Comment: </div><div class='editor' macro='edit text'></div>
[<img[http://photos-936.ll.facebook.com/photos-ll-sf2p/v199/83/62/669759936/s669759936_744593_5814.jpg]]This is the Blog and general knowledge dump of anything that happens to be of interest to me, Mikael Langer.\n\nBelow, you should find the five most recently modified entries.
Sauvignon Blanc\nDomaines Francois Lurton\nBag in Box\n\nOne of the nicer white bag in boxes available.\nSmooth crystal spring watery mineral taste with a relatively low acidity and a slight fruityness.\nVery enjoyable, would be very good as a social wine as well as to compiment most foods where a wite wine is called for.\nMade Linda call me up to compliment on the choice of wine. <<;)>>\n
I've modified OpenTaggedTiddlers from http://www.tiddlytools.com/ to support tag exclusion and opening of extra tiddlers with one link.\nSource:\n{{{\n/%\n|Name|OpenTaggedTiddlers++|\n|Source||\n|Version|1.0.0|\n|Author|Eric Shulman - ELS Design Studios, Mikael Langer|\n|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|~CoreVersion|2.1|\n|Type|script|\n|Requires|InlineJavascriptPlugin|\n|Overrides||\n|Description|open multiple tagged tiddlers with a single click. Now with excludeTag and extraTiddlers options|\n\nUsage: <<tiddler OpenTaggedTiddlers with: "label" "tagToMatch" "sortBy" "reverse" "close" "excludeTag" "extraTiddlers">>\n\n"sortBy" is an optional tiddler fieldname, and defaults to "title" (use "modified" or "created" for dates)\n"reverse" is an optional KEYWORD, and reverses the order of display of the matched tiddler (i.e., descending vs. ascending)\n"close" is an optional KEYWORD, that closes all open tiddlers before opening the tagged tiddlers\n\n%/<script label="$1">\n var list=[];\n var sortBy="$3"; if ((sortBy=="$"+"3")||(sortBy=="")) sortBy="title";\n\n var tags = "$2".split("|");\n var tids=[];\n for (var t=0;t<tags.length;t++) tids = tids.concat(store.getTaggedTiddlers(tags[t],sortBy));\n \n var extraTitles = "$7".split("|");\n\n for (var t=0;t<extraTitles.length;t++) {\n var extraTiddler = store.getTiddler(extraTitles[t]);\n if (extraTiddler != null) tids.push(extraTiddler);\n }\n\n if ("$4"=="reverse") tids=tids.reverse();\n var excludeTag = "$6";\n for (var t=0;t<tids.length;t++) {\n if (!tids[t].isTagged(excludeTag)) list.push(tids[t].title);\n }\n\n if ("$5"=="close") story.closeAllTiddlers();\n\n story.displayTiddlers(story.findContainingTiddler(place),list);\n return false;\n</script>\n}}}
Type the text for 'TiddlyWiki'
/***\n|Name|GotoPlugin|\n|Source|http://www.TiddlyTools.com/#GotoPlugin|\n|Documentation|http://www.TiddlyTools.com/#GotoPluginInfo|\n|Version|1.5.0|\n|Author|Eric Shulman - ELS Design Studios|\n|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides||\n|Description|view any tiddler by entering it's title - displays list of possible matches|\n''View a tiddler by typing its title and pressing //enter//.'' As you type, a list of possible matches is displayed. You can scroll-and-click (or use arrows+enter) to select/view a tiddler, or press //escape// to close the listbox to resume typing. When the listbox is ''//not//'' being displayed, press //escape// to clear the current text input and start over.\n!!!!!Documentation\n>see [[GotoPluginInfo]]\n!!!!!Revisions\n<<<\n2008.02.17 [1.5.0] ENTER key always displays tiddler based on current input regardless of whether input matches any existing tiddler\n|please see [[GotoPluginInfo]] for additional revision details|\n2006.05.05 [0.0.0] started\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.gotoTiddler = {major: 1, minor: 5, revision: 0, date: new Date(200,2,17)};\n\n// automatically tweak shadow SideBarOptions to add <<gotoTiddler>> macro above <<search>>\nconfig.shadowTiddlers.SideBarOptions=config.shadowTiddlers.SideBarOptions.replace(/<<search>>/,"{{button{goto}}}\sn<<gotoTiddler>><<search>>");\n\nconfig.macros.gotoTiddler= { \n handler:\n function(place,macroName,params) {\n var quiet=(params[0] && params[0]=="quiet"); if (quiet) params.shift();\n var insert=(params[0] && params[0]=="insert"); if (insert) params.shift();\n var instyle=params.shift(); if (!instyle) instyle="";\n var liststyle=params.shift(); if (!liststyle) liststyle="";\n var keyevent=window.event?"onkeydown":"onkeypress";\n createTiddlyElement(place,"span").innerHTML\n =this.html.replace(/%keyevent%/g,keyevent).replace(/%insert%/g,insert).replace(/%quiet%/g,quiet).replace(/%instyle%/g,instyle).replace(/%liststyle%/g,liststyle);\n },\n\n html:\n '<form onsubmit="return false" style="display:inline;margin:0;padding:0">\s\n <input class="txtOptionInput" name=gotoTiddler type=text autocomplete="off" accesskey="G" style="%instyle%"\s\n title="enter a tiddler title"\s\n onclick="this.form.list.style.display=\s'none\s';"\s\n onfocus="this.select(); this.setAttribute(\s'accesskey\s',\s'G\s');"\s\n %keyevent%="return config.macros.gotoTiddler.inputEscKeyHandler(event,this,this.form.list);"\s\n onkeyup="return config.macros.gotoTiddler.inputKeyHandler(event,this,this.form.list,%quiet%,%insert%);">\s\n <select name=list style="%liststyle%;display:none;position:absolute"\s\n onchange="if (!this.selectedIndex) this.selectedIndex=1;"\s\n onblur="this.style.display=\s'none\s';"\s\n %keyevent%="return config.macros.gotoTiddler.selectKeyHandler(event,this,this.form.gotoTiddler,%insert%);"\s\n onclick="return config.macros.gotoTiddler.processItem(this.value,this.form.gotoTiddler,this,%insert%);">\s\n </select>\s\n </form>',\n\n getItems:\n function(val) {\n if (!this.items.length || val.length<2) { // starting new search, refresh cached list of tiddlers/shadows/tags\n this.items=new Array();\n var tiddlers=store.getTiddlers("title","excludeLists");\n for(var t=0; t<tiddlers.length; t++) this.items.push(tiddlers[t].title);\n for (var t in config.shadowTiddlers) this.items.pushUnique(t);\n var tags=store.getTags();\n for(var t=0; t<tags.length; t++) this.items.pushUnique(tags[t][0]);\n }\n var found = [];\n var match=val.toLowerCase();\n for(var i=0; i<this.items.length; i++)\n if (this.items[i].toLowerCase().indexOf(match)!=-1) found.push(this.items[i]);\n return found;\n },\n items: [], // cached list of tiddlers/shadows/tags\n\n getItemSuffix:\n function(t) {\n if (store.tiddlerExists(t)) return ""; // tiddler\n if (store.isShadowTiddler(t)) return " (shadow)"; // shadow\n return " (tag)"; // tag \n },\n\n keyProcessed:\n function(ev) { // utility function: exits handler and prevents browser from processing the keystroke\n ev.cancelBubble=true; // IE4+\n try{event.keyCode=0;}catch(e){}; // IE5\n if (window.event) ev.returnValue=false; // IE6\n if (ev.preventDefault) ev.preventDefault(); // moz/opera/konqueror\n if (ev.stopPropagation) ev.stopPropagation(); // all\n return false;\n },\n\n inputEscKeyHandler:\n function(event,here,list) {\n var key=event.keyCode;\n // escape... hide list (2nd esc=clears input)\n if (key==27) {\n if (list.style.display=="none")\n here.value=here.defaultValue;\n list.style.display="none";\n return this.keyProcessed(event);\n }\n return true; // key bubbles up\n },\n\n inputKeyHandler:\n function(event,here,list,quiet,insert) {\n var key=event.keyCode;\n // non-printing chars... bubble up, except: backspace=8, enter=13, space=32, down=40, delete=46\n if (key<48) switch(key) { case 8: case 13: case 32: case 40: case 46: break; default: return true; }\n // blank input... if down/enter... fall through (list all)... else, and hide list\n if (!here.value.length && !(key==40 || key==13))\n { list.style.display="none"; return this.keyProcessed(event); }\n // find matching items...\n var found = this.getItems(here.value);\n // non-blank input... enter key... show/create tiddler\n if (key==13) return this.processItem(here.value,here,list,insert);\n // make sure list is shown/hidden\n list.style.display=(!quiet && found.length)?"block":"none";\n // no matches, key bubbles up\n if (!found.length) return true;\n // down key... shows/moves to list...\n if (key==40) { list.style.display="block"; list.focus(); }\n // finally, if list is showing, fill it with found results...\n if (list.style.display!="none") {\n while (list.length > 0) list.options[0]=null; // clear list\n found.sort(); // alpha by title\n var hdr=this.listHeading.format([found.length,found.length==1?"":"s"]);\n list.options[0]=new Option(hdr,"",false,false);\n for (var t=0; t<found.length; t++) // fill list...\n list.options[list.length]=new Option(found[t]+this.getItemSuffix(found[t]),found[t],false,false);\n list.size=(found.length<this.listMaxSize?found.length:this.listMaxSize)+1; // resize list...\n list.selectedIndex=(key==40 || key==13)?1:0;\n }\n return true; // key bubbles up\n },\n listMaxSize: 10,\n listHeading: 'Found %0 matching title%1:',\n\n selectKeyHandler:\n function(event,list,editfield,insert) {\n if (event.keyCode==27) // escape... hide list, move to edit field\n { editfield.focus(); list.style.display="none"; return this.keyProcessed(event); }\n if (event.keyCode==13 && list.value.length) // enter... view selected item\n { this.processItem(list.value,editfield,list,insert); return this.keyProcessed(event); }\n return true; // key bubbles up\n },\n\n processItem:\n function(title,here,list,insert) {\n if (!title.length) return; here.value=title; list.style.display='none';\n if (insert) {\n var tidElem=story.findContainingTiddler(here); if (!tidElem) { here.focus(); return false; }\n var e=story.getTiddlerField(tidElem.getAttribute("tiddler"),"text");\n if (!e||e.getAttribute("edit")!="text") return false;\n var txt=prompt(this.askForText,title); if (!txt||!txt.length) { here.focus(); return false; }\n e.focus(); // put focus on target field before setting selection\n replaceSelection(e,"[["+txt+"|"+title+"]]"); // insert selected tiddler as a PrettyLink\n }\n else\n story.displayTiddler(null,title); // show selected tiddler\n return false;\n },\n askForText: "Enter the text to display for this link"\n}\n//}}}
Stuff I've been fiddling with.
/***\n|Name|AutoOpenTiddlersPlugin|\n|Created by|SaqImtiaz, modified by miklo|\n|Location|http://tw.lewcid.org/#AutoOpenTiddlersPlugin|\n|Version|0.21|\n|Requires|~TW2.x|\n!!!Description:\nOpen a user defined number of recent tiddlers automatically when the TW loads.\nYou can also specify a tag and only load tiddlers that have that tag.\nTo change the number of tiddlers automatically opened, or define a tag to use, ed the config.autoOpenTiddlers part of the code below.\n\n!!!Code\n***/\n//{{{\n//edit this section to change the default settings\nconfig.autoOpenTiddlers = \n{\n count: 5, //number of tiddlers opened.\n tag: undefined, //"Blog", //change if you want to open tiddlers with a specific tag, eg: 'DefaultTiddlers'\n excludeTag: "excludeLists", // tag to exclude\n sort: "modified" // sort order\n}\n\n\nconfig.autoOpenTiddlers.handler = function()\n{\n if (this.tag == undefined)\n var newTiddlers = store.getTiddlers(this.sort);\n else\n var newTiddlers = store.getTaggedTiddlers(this.tag,this.sort);\n\n for (var t=newTiddlers.length; t-- > 0;) if (newTiddlers[t].isTagged(this.excludeTag)) newTiddlers.splice(t,1);\n\n var newTiddlers = newTiddlers.reverse();\n var max = Math.min(this.count,newTiddlers.length-1);\n for (var i=0; i<max; i++)\n { story.displayTiddler("bottom",newTiddlers[i].title);} \n}\n\nwindow.old_lewcid_autoOpenTiddlers_restart = restart;\nrestart = function ()\n{\n// window.old_lewcid_autoOpenTiddlers_restart();\n\n invokeParamifier(params,"onstart");\n if(story.isEmpty()) {\n var tiddlers = store.filterTiddlers(store.getTiddlerText("DefaultTiddlers"));\n story.displayTiddlers(null,tiddlers);\n config.autoOpenTiddlers.handler();\n }\n window.scrollTo(0,0);\n}\n//}}}
/***\n| Name:|NewHerePlugin|\n| Description:|Creates the new here and new journal toolbar commands|\n| Version:|$$version$$|\n| Date:|$$date$$|\n| Source:|http://mptw.tiddlyspot.com/#NewHerePlugin|\n| Author:|Simon Baird <simon.baird@gmail.com>|\n| CoreVersion:|2.1.x|\nTo use edit your ViewTemplate and add newHere to the toolbar div, eg\n{{{<div class='toolbar' macro='toolbar ... newHere'></div>}}}\nNote: would be good if we could do this instead some day\n{{{<<newTiddler tag:{{tiddler.title}} label:'new here'>>}}}\n***/\n//{{{\nmerge(config.commands,{\n\n newHere: {\n text: 'new here',\n tooltip: 'Create a new tiddler tagged as this tiddler',\n hideReadOnly: true,\n handler: function(e,src,title) {\n if (!readOnly) {\n clearMessage();\n var t=document.getElementById('tiddler'+title);\n story.displayTiddler(t,config.macros.newTiddler.title,DEFAULT_EDIT_TEMPLATE);\n story.setTiddlerTag(config.macros.newTiddler.title, title, 0);\n story.focusTiddler(config.macros.newTiddler.title,"title"); // doesn't work??\n return false;\n }\n }\n },\n\n newJournalHere: {\n //text: 'new journal here', // too long\n text: 'new journal',\n hideReadOnly: true,\n dataFormat: 'DD MMM YYYY', // adjust to your preference\n //dataFormat: 'YYYY-0MM-0DD', \n tooltip: 'Create a new journal tiddler tagged as this tiddler',\n handler: function(e,src,title) {\n if (!readOnly) {\n clearMessage();\n var now = new Date();\n var t=document.getElementById('tiddler'+title);\n var newtitle = now.formatString(this.dataFormat)\n story.displayTiddler(t,newtitle,DEFAULT_EDIT_TEMPLATE);\n story.setTiddlerTag(newtitle, title, 0);\n story.focusTiddler(newtitle,"title");\n return false;\n }\n }\n }\n\n});\n//}}}\n
I love good coffee!\nI will try to post up my tasting of different beans here, as well as bits about my "hardware".\n(And maybe som latte art pics!)
Adapted RenameTagsPlugin to ccTiddly by calling store.saveTiddler on all touched tiddlers.\nAlso refreshes the story so changes on shown tiddlers are visible instantly.
[>img[http://photos-e.ak.facebook.com/photos-ak-sf2p/v241/83/62/669759936/s669759936_792588_199.jpg]]After having some quite nice chocolatey cereal bars in Grenoble, I decided to cook up my own.\nApproximate recipe that I made up as I went along:\n* 100g dark chocolate (75% in this case)\n* 1 big tbsp of chunky peanut butter\n* 2 tbsp muscovado sugar\n* 1.5 dl quinoa muesli\n\nI first melted the sugar in a saucepan and added the peanut butter.\nThen I removed the pan from the stove and just put the chocolate on top of the peanut butter and sugar to let it melt.\nFinally I stirred in the muesli, about 1.5dl, until it felt like it would make a good bar once set.\nTurned out quite nice, though next time I should put in more muesli, to make it a bit more chunky and less chocolatey.\n
I currently have an XBOX and an old iBook G3 that need to share a Netgear ~WGE111 wireless gateway, which only supports a single device at a time.\nThe solution is to set up the Ubuntu install running on the iBook to act as a NAT router and DHCP server in the way described here: http://ubuntuforums.org/showthread.php?t=713874 for example.\nThe main ingredients are something like\n{{{\nsudo iptables --table nat -A POSTROUTING -o eth0 -j MASQUERADE\n}}}\nenabling packet forwarding in the kernel by setting\n{{{\nnet.ipv4.conf.default.forwarding=1\n}}}\nin sysctl.conf\nAnd finally setting up an interface alias eg eth0:0 in /etc/network/interfaces with a static ip on the same subnet acting as a gateway for the XBOX.\n\nWorks great!
Modified the TagglyTaggingPlugin grouped mode to include group headings in the sort order instead of showing ungrouped entries first or last.\n\nAlso changed so clicking the tag name in the controls opens all tagged tiddlers.
Changed so nothing is opened if tiddlers are already opened by url params, just like the original restart function.
<<ccListMyWorkspaces>>
http://www.mikaellanger.net
Reverted ccTiddly 1.5.3 rss functionality to the older(?) one that uploads the feed created by tiddlywiki instead of generating on the fly on the server side, since the server side generator doesn't handle the wiki formatting which looks really bad.
I'm no wine expert by any means, but I try to write something up about wines I've tried, as I always tend to forget which were good and which were not-so-good.
According to a former colleague of mine, I like anything that coats the inside of my mouth with sticky flavor, which actuially isn't that bad of a summary <<;]>> - I do tend to like stuff like cigars, bitters (wormwood!), malt whiskey and such.\nMy biggest trouble is remembering what I thought of various products I've tried, so I will try to remedy this flawed memory of mine by keeping track of my experiences with little reviews in this section.
Eventful day:\nStarted off with breakfast at the classic [[Tintarella di Luna]] and then wen to Tyresö(!) to get a facial treatment at a place Linda found that use Nuxe products, which we've found to be quite nice.\n\nThen went for lunch at [[Libanesiska Köket]] on Kungsholmen (a place run by the husband of a colleague of Linda's) which turned out to be a very good place for cheap and tasty lebanese fast food.\n\nOn our way for a coffee at [[Mellqvists]], another classic espresso bar, we stumbled across this small shop on St Eriksgatan that had exactly the kind of oriental style lamps we've been looking all over for (even brought one with us on the [[plane from France|Grenoble March 2008]])! And cheap! \nWe bought one on the spot (after some minor discussion about color, I wanted a green one, Linda chose a pink one). We ended up with an Orange one. \n\n[img[http://photos-g.ak.facebook.com/photos-ak-sf2p/v241/83/62/669759936/s669759936_792590_6213.jpg][http://photos-g.ak.facebook.com/photos-ak-sf2p/v241/83/62/669759936/n669759936_792590_6213.jpg]][img[http://photos-h.ak.facebook.com/photos-ak-sf2p/v241/83/62/669759936/s669759936_792591_2127.jpg][http://photos-h.ak.facebook.com/photos-ak-sf2p/v241/83/62/669759936/n669759936_792591_2127.jpg]]\nStockholm one on the left, Grenoble one on the right.
Cooked up a little Pad Thai-influenced noodle wok today consisting of about:\n*1 clove of garlic\n*1 chicken breast fillet\n*25g tofu\n*1,5 tbsp each of vinegar, fish sauce and sugar\n*some water spinach\n*a handful of bean sprouts\n*200g bean thread noodles\n*crushed peanuts\n*coriander\n\nScrambling in an egg and adding a couple of prawns would have been nice. \nAlso forgot to pick up spring onion at the Thai supermarket, which I would've added normally.\n\nA quite mild dish that really comes to life with some extra chili flakes and fish sauce on the side.\nGreat room for variation on the choice of meats and vegetables.
Cooking, and food in general, is a major interest of mine (not forgetting the eating part of course <<;)>>).
Bought this organic 72% chocolate at the excellent ICA Flygfyren in Norrtälje.\nNever heard of the Blanxart brand before.\n\nFairly light aroma with hints of smoke and tobacco.\nTaste-wise quite smooth and slightly sweet, but way too cocoa powdery and dry aftertaste.\nSomewhat pasty in texture.\n\nA decent organic chocolate, but not a favorite by any means.
Dark quality chocolate is probably my number one drug.
Cooking eggs in the microwave can be convenient, especially when poaching since that can be quite a hassle.\n(There are lots of recipes and howtos around, grabbed from http://whatscookingamerica.net/Eggs/MicrowaveEggs.htm that just happens to be the current google winner.)\n!!Fried Eggs\nBreak and slip one (1) egg into each of two lightly-greased 10-ounce custard cups or a pie plate. Gently prick yolks with tip of knife or wooden pick. Cover with plastic wrap. Cook on 50% power just until eggs are almost desired doneness, about 2 to 3 minutes. Let stand, covered until whites are completely set and yolks begin to thicken but are not hard.\n!!Poached Eggs\nPour 1/3 cup water into 10-ounce custard cup or small deep bowl. Break and slip in two eggs. Gently prick yolks with tip of knife or wooden pick. Cover with plastic wrap. Cook on full power about 1 1/2 to 2 minutes. If necessary, let stand, covered, until whites are completely set and yolks begin to thicken but are not hard, about 1 to 2 minutes. Pour off water to serve in custard cup or lift out with slotted spoon. NOTE: For 4 eggs, use 2/3 cup water in 1-quart bowl or baking dish. Cook 1 1/2 to 3 minutes and let stand as above.\n!!Scrambled Eggs\nIn 10-ounce custard cup, beat together 2 eggs, and 2 tablespoons milk with salt and pepper to taste, if desired, until blended. Cook on full power, stirring once or twice, until almost set, about 1 to 1 1/2 minutes. Stir. If necessary, cover with plastic wrap and let stand until eggs are thickened and no visible liquid egg remains, about 1 minute. NOTE: All microwave cooking times are based on a full power output of 600 to 700 watts. For a lower wattage oven, allow more time.\n*1 egg: 30 to 45 seconds\n*2 eggs: 1 to 1-1/2 minutes\n*4 eggs: 2-1/2 to 3 minutes\n*6 eggs: 3-1/2 to 4-1/2 minutes\n*8 eggs: 4-1/2 to 5-1/2 minutes
/***\n|Name|AliasPlugin|\n|Source|http://www.TiddlyTools.com/#AliasPlugin|\n|Documentation|http://www.TiddlyTools.com/#AliasPluginInfo|\n|Version|1.1.0|\n|Author|Eric Shulman - ELS Design Studios|\n|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides||\n|Description|Create text-substitution macros|\nDefine macros for abbreviations and other "aliases", and then embed them in the rest of your tiddler content to quickly insert common terms, phrases and links without a lot of repetitive typing.\n!!!!!Documentation\n> see [[AliasPluginInfo]]\n!!!!!Revisions\n<<<\n2008.03.11 [*.*.*] plugin size reduction - documentation moved to [[AliasPluginInfo]]\n2007.03.21 [1.1.0] added support for parameter substitution into alias macros, using format() method and%0..%9 markers\n| Please see [[AliasPluginInfo]] for previous revision details |\n2005.08.12 [1.0.0] initial release\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.alias= {major: 1, minor: 1, revision: 0, date: new Date(2007,3,21)};\nconfig.macros.alias= { };\nconfig.macros.alias.handler = function(place,macroName,params) {\n var alias=params.shift(); if (!alias) return; alias=alias.replace(/ /g,"_"); // don't allow spaces in alias\n if (config.macros[alias]==undefined) // create new macro (as needed)\n { \n config.macros[alias] = { };\n config.macros[alias].handler =\n function (place,macroName,params)\n { wikify(config.macros[macroName].text.format(params),place,null,null); }\n }\n config.macros[alias].text = params[0]?params.join(' '):alias; // set alias text\n}\n//}}}
@@display: none;\n<<alias :D "{{smiley{[img[http://forum.groundmotion.com/images/smiles/icon_biggrin.gif]]}}}">>\n<<alias ;) "{{smiley{[img[http://forum.groundmotion.com/images/smiles/icon_wink.gif]]}}}">>\n<<alias :/ "{{smiley{[img[http://forum.groundmotion.com/images/smiles/icon_mad.gif]]}}}">>\n<<alias :( "{{smiley{[img[http://forum.groundmotion.com/images/smiles/icon_sad.gif]]}}}">>\n<<alias ;] "{{smiley{[img[http://forum.groundmotion.com/images/smiles/badthumbs.gif]]}}}">>\n<<alias =) "{{smiley{[img[http://forum.groundmotion.com/images/smiles/happysad.gif]]}}}">>\n<<alias :) "{{smiley{[img[http://forum.groundmotion.com/images/smiles/icon_smile.gif]]}}}">>\n<<alias :O "{{smiley{[img[http://forum.groundmotion.com/images/smiles/eek.gif]]}}}">>\n@@
New favorite quick snack.\nStack:\n*Dark rye bread\n*Scrambled eggs\n*Saurkraut\nDone!\n\nSauerkraut and eggs go very well together.\nSome bacon, salami, sausage etc would make a fine topping also.
Fresh smell of raisins and prunes.\nVery nice, deep flavors of dried fruit reflecting the smell. Great balance of sweetness and bitterness.\nSlightly powdery texture, and a bit on the dry side in the aftertaste, but on the whole very very enjoyable, like one would expext of the brand.\n
Did another batch of these today with 20g of whole oats included in the 180g of flour, which turned out nearly perfect!
[>img[http://photos-f.ak.facebook.com/photos-ak-sf2p/v241/83/62/669759936/s669759936_792589_831.jpg]]Found these excellent rum-lime-mint (aka Mojito <<;]>>) flavoured cigarillos the first time at a restaurant/deli in Norrtälje a couple of years ago, and we were totally sold on them instantly. To be honest though, the last couple of times I tried these, I couldn't really recall that same enthusiasm - they've leaned towards overly dry and bitter.\n\nBUT: we were in Norrtälje last weekend, where I picked up a pack, and suddenly the memories were revived - opening a fresh pack is pure bliss! Your nose is overwhelmed by a very pleasant combination of good tobacco and fresh mint. The rum and lime are tangible as well, but not as prominent.\nFrom a fresh pack, the tase is a very pleasant, full, almost bready flavor with delicious pure hints of mint, lime and rum (it was so good I had to smoke another one right away <<;)>>). These flavorings seem to be extremely volatile though - literally the day after they were back to a lot more dry and bitter with the added flavors barely tangible.\n\nStore these well and they are truly awesome!
I'm really not a smoker - I //despise// cigarettes.\nBut I ''do'' enjoy good tobacco as well as any chocolate or cognac or what have you, purely for the great taste experience.\n
[>img[http://miklo.groundmotion.com/ccTiddly/uploads/Studio-weird-stitch.jpg]]Today the bostadsrättsförening had spring cleaning day - which for me mostly meant driving a truck (first time!) full of junk to the junkyard.\nMost interestingly, I salvaged a really nice computer desk that someone wanted to throw away, and immediately afterwards went at changing desks and rewiring my home (closet) [[studio]].\nThe picture on the right is a weird stitch of several photos just to give an idea of how it looks. I think it's really clean, and the new desk really enabled me to free up a lot of space by having better dimensions than the old one plus the pull-out keyboard shelf that I've put external soundcards and a clav on.
Went to this classic espresso bar on Rörstrandsgatan just next to S:t Eriksplan twice recently.\nOn both occasions, the espresso has been very very ristretto. A bit too much so for my tastes, their double espresso is only about 4cl with a dark, nearly black crema and a very bitter taste. This makes it very enjoyable for lattes & cappas though. Linda dubbed the latte one of the best in town.\nA very nice touch is that you get a piece of Valrhona chocolate to go with your espresso, which still only cost 15kr for a double! Normally they offer a selection of Valrhona pralines also, but they had melted (!) last time we were there.\nOn the negative side, the attention to detail is a bit poor - my cup wasn't properly heated so the coffee cooled off too quickly.
Tucked away out in Kallhäll is an unexpectedly good vietnamese.\nLooks //very// "modest" on the outside but is really nice and clean inside with relatively tasteful interior.\n\nWhen I was there with Rasmus, the sign on the door said it was closed, but just as we were about to leave a very friendly waitress stuck her head out and told us they were open anyway. <<:)>> She then proceeded to start us off with a big basket of shrimp chips while we pored over the menu.\n\nI had chicken with ginger, mango, and bell pepper that was really good. The mango, as well as the other ingredients, was fresh. Also, a big plus for garnishing with a big sprig of coriander. A selection of Chinese, Japanese, Thai, and Vietnamese beer is also a nice touch.
/***\n\n''Inspired by [[TiddlyPom|http://www.warwick.ac.uk/~tuspam/tiddlypom.html]]''\n\n|Name|SplashScreenPlugin|\n|Created by|SaqImtiaz|\n|Location|http://tw.lewcid.org/#SplashScreenPlugin|\n|Version|0.21 |\n|Requires|~TW2.08+|\n!Description:\nProvides a simple splash screen that is visible while the TW is loading.\n\n!Installation\nCopy the source text of this tiddler to your TW in a new tiddler, tag it with systemConfig and save and reload. The SplashScreen will now be installed and will be visible the next time you reload your TW.\n\n!Customizing\nOnce the SplashScreen has been installed and you have reloaded your TW, the splash screen html will be present in the MarkupPreHead tiddler. You can edit it and customize to your needs.\n\n!History\n* 20-07-06 : version 0.21, modified to hide contentWrapper while SplashScreen is displayed.\n* 26-06-06 : version 0.2, first release\n\n!Code\n***/\n//{{{\nwindow.old_lewcid_splash_restart=window.restart;\n\nwindow.restart = function()\n{ if (document.getElementById("SplashScreen"))\n document.getElementById("SplashScreen").style.display = "none";\n if (document.getElementById("contentWrapper"))\n document.getElementById("contentWrapper").style.display = "block";\n \n window.old_lewcid_splash_restart();\n \n if (splashScreenInstall)\n {if(config.options.chkAutoSave)\n {saveChanges();}\n displayMessage("TW SplashScreen has been installed, please save and refresh your TW.");\n }\n}\n\n\nvar oldText = store.getTiddlerText("MarkupPreHead");\nif (oldText.indexOf("SplashScreen")==-1)\n {var siteTitle = store.getTiddlerText("SiteTitle");\n var splasher='\sn\sn<style type="text/css">#contentWrapper {display:none;}</style><div id="SplashScreen" style="border: 3px solid #ccc; display: block; text-align: center; width: 320px; margin: 100px auto; padding: 50px; color:#000; font-size: 28px; font-family:Tahoma; background-color:#eee;"><b>'+siteTitle +'</b> is loading<blink> ...</blink><br><br><span style="font-size: 14px; color:red;">Requires Javascript.</span></div>';\n if (! store.tiddlerExists("MarkupPreHead"))\n {var myTiddler = store.createTiddler("MarkupPreHead");}\n else\n {var myTiddler = store.getTiddler("MarkupPreHead");}\n myTiddler.set(myTiddler.title,oldText+splasher,config.options.txtUserName,null,null);\n store.setDirty(true);\n var splashScreenInstall = true;\n}\n//}}}
<!--{{{-->\n<div id="SplashScreen" style="-moz-border-radius:1ex; font-size:.75em; font-family:arial,helvetica; text-align: center; position: absolute; left: 50%; margin-left: -110px; color: #aaa; margin-top: 15%; border: 1px solid #aaa"><p>Loading...</p><img style="margin:1ex; margin-top: 0;" src="ajax-loader.gif" /></div>\n<title>Mikael Langer - Blog&Wiki</title>\n<link rel='alternate' type='application/rss+xml' title='RSS' href='http://feeds.feedburner.com/MikaelLanger'/>\n<meta name='Description' content="Writing about anything that happens to interest me. Expect anything from adventures in coding to coffee bean reviews. ">\n<meta name='Keywords' content="Mikael Langer, Programming, Personal, Blog, Tastes, Food, Travel, Technology, Wiki, PHP, javascript, java, linux, coffee, espresso, chocolate, tobacco, wine, dining, tiddlywiki, cctiddly, cooking, latte art." />\n<!--}}}-->
<!--{{{-->\n<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>\n<div class='headerShadow'>\n<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span> \n<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n</div>\n<div class='headerForeground'>\n<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span> \n<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n</div>\n</div>\n<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>\n<div id='sidebar'>\n<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>\n<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>\n</div>\n<div id='displayArea'>\n<div id='messageArea'></div>\n<div id='tiddlerDisplay'></div>\n</div>\n<!--}}}-->
<!--{{{-->\n<div id="verticalBannerAd">\n<script type="text/javascript"><!--\ngoogle_ad_client = "pub-5552848923049012";\n/* 120x240, created 5/4/08 */\ngoogle_ad_slot = "7325939451";\ngoogle_ad_width = 120;\ngoogle_ad_height = 240;\n//-->\n</script>\n<script type="text/javascript"\nsrc="http://pagead2.googlesyndication.com/pagead/show_ads.js">\n</script>\n</div>\n<!--}}}-->
/***\n|Name|InlineJavascriptPlugin|\n|Source|http://www.TiddlyTools.com/#InlineJavascriptPlugin|\n|Documentation|http://www.TiddlyTools.com/#InlineJavascriptPluginInfo|\n|Version|1.9.2|\n|Author|Eric Shulman - ELS Design Studios|\n|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides||\n|Description|Insert Javascript executable code directly into your tiddler content.|\n''Call directly into TW core utility routines, define new functions, calculate values, add dynamically-generated TiddlyWiki-formatted output'' into tiddler content, or perform any other programmatic actions each time the tiddler is rendered.\n!!!!!Documentation\n>see [[InlineJavascriptPluginInfo]]\n!!!!!Revisions\n<<<\n2008.03.03 [1.9.2] corrected declaration of wikifyPlainText() for 'TW 2.1.x compatibility fallback' (fixes Safari "parse error")\n2008.02.23 [1.9.1] in onclick function, use string instead of array for 'bufferedHTML' attribute on link element (fixes IE errors)\n2008.02.21 [1.9.0] 'onclick' scripts now allow returned text (or document.write() calls) to be wikified into a span that immediately follows the onclick link. Also, added default 'return false' handling if no return value provided (prevents HREF from being triggered -- return TRUE to allow HREF to be processed). Thanks to Xavier Verges for suggestion and preliminary code.\n|please see [[InlineJavascriptPluginInfo]] for additional revision details|\n2005.11.08 [1.0.0] initial release\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.inlineJavascript= {major: 1, minor: 9, revision: 2, date: new Date(2008,3,3)};\n\nconfig.formatters.push( {\n name: "inlineJavascript",\n match: "\s\s<script",\n lookahead: "\s\s<script(?: src=\s\s\s"((?:.|\s\sn)*?)\s\s\s")?(?: label=\s\s\s"((?:.|\s\sn)*?)\s\s\s")?(?: title=\s\s\s"((?:.|\s\sn)*?)\s\s\s")?(?: key=\s\s\s"((?:.|\s\sn)*?)\s\s\s")?( show)?\s\s>((?:.|\s\sn)*?)\s\s</script\s\s>",\n\n handler: function(w) {\n var lookaheadRegExp = new RegExp(this.lookahead,"mg");\n lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {\n var src=lookaheadMatch[1];\n var label=lookaheadMatch[2];\n var tip=lookaheadMatch[3];\n var key=lookaheadMatch[4];\n var show=lookaheadMatch[5];\n var code=lookaheadMatch[6];\n if (src) { // load a script library\n // make script tag, set src, add to body to execute, then remove for cleanup\n var script = document.createElement("script"); script.src = src;\n document.body.appendChild(script); document.body.removeChild(script);\n }\n if (code) { // there is script code\n if (show) // show inline script code in tiddler output\n wikify("{{{\sn"+lookaheadMatch[0]+"\sn}}}\sn",w.output);\n if (label) { // create a link to an 'onclick' script\n // add a link, define click handler, save code in link (pass 'place'), set link attributes\n var link=createTiddlyElement(w.output,"a",null,"tiddlyLinkExisting",wikifyPlainText(label));\n var fixup=code.replace(/document.write\ss*\s(/gi,'place.bufferedHTML+=(');\n link.code="function _out(place){"+fixup+"\sn};_out(this);"\n link.tiddler=w.tiddler;\n link.onclick=function(){\n this.bufferedHTML="";\n try{ var r=eval(this.code);\n if(this.bufferedHTML.length || (typeof(r)==="string")&&r.length)\n var s=this.parentNode.insertBefore(document.createElement("span"),this.nextSibling);\n if(this.bufferedHTML.length)\n s.innerHTML=this.bufferedHTML;\n if((typeof(r)==="string")&&r.length) {\n wikify(r,s,null,this.tiddler);\n return false;\n } else return r!==undefined?r:false;\n } catch(e){alert(e.description||e.toString());return false;}\n };\n link.setAttribute("title",tip||"");\n var URIcode='javascript:void(eval(decodeURIComponent("(function(){try{';\n URIcode+=encodeURIComponent(encodeURIComponent(code.replace(/\sn/g,' ')));\n URIcode+='}catch(e){alert(e.description||e.toString())}})()")))';\n link.setAttribute("href",URIcode);\n link.style.cursor="pointer";\n if (key) link.accessKey=key.substr(0,1); // single character only\n }\n else { // run inline script code\n var fixup=code.replace(/document.write\ss*\s(/gi,'place.innerHTML+=(');\n var code="function _out(place){"+fixup+"\sn};_out(w.output);"\n try { var out=eval(code); } catch(e) { out=e.description?e.description:e.toString(); }\n if (out && out.length) wikify(out,w.output,w.highlightRegExp,w.tiddler);\n }\n }\n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n }\n }\n} )\n//}}}\n\n// // Backward-compatibility for TW2.1.x and earlier\n//{{{\nif (typeof(wikifyPlainText)=="undefined") window.wikifyPlainText=function(text,limit,tiddler) {\n if(limit > 0) text = text.substr(0,limit);\n var wikifier = new Wikifier(text,formatter,null,tiddler);\n return wikifier.wikifyPlain();\n}\n//}}}
<script>\nvar ad = document.getElementById('verticalBannerAd');\ndocument.write(ad.innerHTML);\n</script>
Yes, that has crossed my mind, but I'm not sure it would stick together. I'm relying on the chocolate for that so I won't need so much sugar.
//{{{\nconfig.trackback = {\ninit: function init()\n{\n//TODO: ugly dependency on serverside.js code?! Would be nice to get away from this, possibly by making serverside.fn.uploadRSS synchronous.\nconfig.trackback.oldUploadRSSCallback = serverside.fn.uploadRSSCallback;\nserverside.fn.uploadRSSCallback = this.saveChanges;\n},\n\nsaveChanges: function pingerSaveChanges(h)\n{\nconfig.trackback.oldUploadRSSCallback(h);\nconfig.trackback.ping();\nconfig.trackback.ping2();\ndisplayMessage("pinged");\n},\n\n//TODO: Refactor. Generalize!\nping2: function ping2()\n{\nvar iframe = document.createElement('iframe');\niframe.setAttribute('name', 'poster2');\niframe.style.display = "none";\n\nvar form = document.createElement('form');\nform.method = 'get';\nform.action = 'http://flog.jkwiens.com/ping.php';\nform.target = 'poster2';\n\nvar i0 = document.createElement('input');\ni0.type = 'hidden';\ni0.name = 'flog_key';\ni0.value = '4d5291ee7e0fe05999ef8cee39e5116a';\nform.appendChild(i0);\n\niframe.appendChild(form);\ndocument.body.appendChild(iframe);\nform.submit();\n},\n\nping: function ping()\n{\nvar iframe = document.createElement('iframe');\niframe.setAttribute('name', 'poster');\niframe.style.display = "none";\n\nvar form = document.createElement('form');\nform.method = 'post';\nform.action = 'http://rpc.weblogs.com/pingSiteForm';\nform.target = 'poster';\n\nvar i0 = document.createElement('input');\ni0.type = 'hidden';\ni0.name = 'name';\ni0.value = document.title;\nform.appendChild(i0);\n\nvar i1 = document.createElement('input');\ni1.type = 'hidden';\ni1.name = 'url';\ni1.value = document.URL;\nform.appendChild(i1);\n\nvar i2 = document.createElement('input');\ni2.type = 'hidden';\ni2.name = 'changesURL';\ni2.value = 'http://www.mikaellanger.net/uploads/index.xml';\nform.appendChild(i2);\n\niframe.appendChild(form);\ndocument.body.appendChild(iframe);\nform.submit();\n}\n};\nconfig.trackback.init();\n//}}}
Mabye put the chocolate in last so you get more chunks?
My mom has been making these all the time lately.\n\n* Vegetables\n* Eggs\n* Cream\n* Cheese\n\nUsed 2 eggs and about 2 dl of cream for 1/2 cauliflower and 1 stand of broccoli, which only half-covered the vegetables, so I guess 3-4 eggs and 3-4dl of cream would be best.
|URL:|http://www.boingboing.net|\n|Description:|I think it was Andreas, a former colleague at A2B who first gave me the linkage. Quickly became my favorite, if not only source of wonderful things, as the slogan goes.|
http://www.boingboing.net/2008/04/24/shoes-are-bad-for-yo.html\n\n<<<\nAdam Sternbergh's long investigative New York Magazine piece, "You Walk Wrong," makes a compelling case for shoes as inherently damaging to your feet and spine. I have very flat feet, which has always meant problems with my hips, knees and back, and I've work custom orthotic inserts since I was a teenage. Last year, I picked up a pair of Vibram Fivefingers "barefoot shoes" that do a pretty good job of simulating the experience of going barefoot without the tetanus and laceration risk, and I've done a lot of city and country walking in them, and I have to say, my back and knees and feet feel pretty damned good after a couple days in them.\n<<<\n\nI have very flat feet too, and I've started to get problems with my knees, and possible indications of back problems as well - at my latest yoga class, the teacher commented on my lower back being "asymmetric" (dunno how to describe it properly).\n\nPosting this for Linda as well. She's having some feet problems too, and immediately wanted the link when I mentioned this to her.\n
<script>\nvar ad = document.getElementById('skyscraperAd');\ndocument.write(ad.innerHTML);\n</script>
Always nice to see new eco-friendly or fair trade chocolates in the market, especially if they are good.\nAccording to the packaging this is made of Forastero beans originating from Ghana and has a "surprisingly mild yet intense flavour - and bound to linger in your mouth".\n\nThe aroma is very neutral, hardly discernible.\nThe first taste impression is overly sweet, almost like cocoa flavored sugar. \nThe aftertaste is short and neutral, doesn't "linger" very much at all.\n\nQuite uninteresting, and definitely //not// a good chocolate in my book.\n
<html>\n<a href="http://technorati.com/claim/wptm738irg" rel="me">Technorati Profile</a>\n</html>
I've always been fascinated by classic cocktails. I've worked as a bartender in the past and even passed the entry exam into SBG, the swedish section of IBA.
My new boss just invented this after I noted the following piquant combo for some unknown reason standing on the countertop in the office kitchen:\n* 1 bottle of Ketchup\n* 1 bottle of Explorer Vodka\n* 1 bottle of Baccardi Limon\n\nI guess it should be garnished with a green straw. <<;]>>
On Sveavägen not far from Hötorget lies [[Dolcetto|http://dolcetto.gastrogate.com]].\nIn an area being increasingly hogged by a bunch of Espresso House cafés (that are not bad at all, mind you) it's nice to find a good independent espresso bar. The place usually looks quite unassuming, but now they have their outdoors furniture out on the sidewwalk it looks really cozy and inviting. The interior is quite nice and cozy as well, with a pretty typical italian espresso bar styling, brown leather seats and in general a gentle earthtoned palette.\n\nThe place was run by two friendly italian guys. Despite me coming in just before closing time, they had absolutely no problem with me ordering a meal and an espresso afterwards. I had a really nice, well balanced and rich lasagna. The meal also included a fresh salad with borlotti beans and a couple of slices of bread with a bit of good ollive oil on top - great for the price of 89 sek.\n\nFinished off with a well made, very good looking doppio - the taste was a bit too much on the acidic tip though. I believe the beans were Lavazza, which tends to be good but not great in my opinion.\n\nAll in all a great option in the area if you don't feel like taking the walk to [[Tintarella di Luna]] or [[Sosta]] for the better coffee. A little minus for the slightly to loud "worst of the 80s" music though.\n\n
test comment
Went to this nice little tapas bar on Döbelnsgatan near Kammakargatan with Linda a couple of weeks ago.\nLa Bodega offers generous servings at relatively low prices - on average 55 sek per dish - and good too! We had chorizo, shrimps, chicken and Manchego cheese and everything was delicious. Nice and friendly service also adds to the positive experience.\n\n
Unusually, had to choose between two highly interesting club nights: Re:Publik at Stockholm University featuring D'n'B acts such as Dkay and Resound or techno great Ellen Allien at Esque. After some debate me, Janne and HG went for the big name techno act.\n\nWe came to Esque pretty early, as we suspected getting in might be a problem later. The first warmup set was actually really good with an at times Poker Flat-ish, Svek-ish selection. After that the next DJ brought some more standard techno fare, but with pretty weak mixing at times.\n\nNext up, Ellen - but hey, is she on yet? Oh? She's been on for 15 minutes? \nNot being able to tell when the main act of the night is on isn't a very good thing in my opinion. (Just as a comparison, when Aril Brikha played Esque a couple of weeks ago, the first couple of seconds of his first track had everyone stop dead in awe, to moments later be launched into an epic dance frenzy.) Some of the opening tracks had a pretty raw unfinished feel to them, and overall the selection felt quite static and not very interesting, with just the occasional gem. This reflected on the crowd that showed only a mild enthusiasm. Sadly, Ellen's mixing wasn't very tight at times either, which I hate getting from established big name DJs.\n\nAs an aside, the night ended for me with a little interesting twist:\nOn the bus home, some scally types got into a loud argument with the driver as they got on, and then proceeded to press the stop button before every stop. After a couple of stops like that, the driver just snapped and had everyone get off the bus (I've ridden my share of night busses to the suburbs, but I've never had a bus driver single handedly forcing everyone off his bus.) Didn't catch exactly what happened next, but somehow he managed to get rid of the assholes (possibly with the help of someone on the other bus that pulled up just behind ours) after which he let everyone on again and then apologized to everyone, which actually brought a round of applause. At first it felt like he made an unecessarily big deal out of the situation, but in the end he handled it commendably, you could clearly feel the change in atmosphere on the bus once the scum had been scraped off the pool, so to speak. <<;)>>\n\n
Upon entering this little sushi bar on Sveavägen not far from Odengatan, one can't help noticing the rather dull and uninspired decor consisting of a bunch of IKEA "Ögla" chairs and a weird mix of the usual tacky pseudo-Japanese stuff and weird espresso posters.\n\nThe staff looked like a mother and daughter, perhaps of middle-eastern origin - not a good sign either (being non-Japanese/far eastern that is).\n\nI ordered a Bento box at a decent 100 sek, which started off with a lukewarm, overly salty powder Miso soup. The actual box consisted of Sushi, Yakitori and Gyoza. The maki rolls were nothing but atrocious, with the nori all stale and chewy. The nigiri were slighly better, especially the salmon was OK, but the rice was dry, tasteless and falling apart. The Yakitori proved to also be quite bland and tough - an impressive feat. Fortunately he Gyoza were actually rather good, the highlight of the meal.\n\nConclusion: not even the fairly decent prices are reason enough not to avoid this place. Might actually be the worst sushi I've had in Stockholm so far.
It has to be said right from the start: Non Solo comes close to the optimal café/bar for me. Great coffee - the sign says Passalacqua, although I believe they normally serve a Swedish blend that I don't remember the name of - and great food in the shape of a couple of pastas (the porcini pasta is lovely) and a risotto with salsiccia that looks absolutely delicious. But you can just as well drop by (it's located about halfway up Odengatan from Odenplan) for just a glass of wine and enjoy the atmosphere.\n\nThe prices are perfect too, only 10 sek for an espresso (the way it should be!) and 55 sek for a glass of wine. I just can't recommend this place enough!\n
55 sek for a glass of wine?! Rehabilitation will be difficult ;)
Hehe, spoiled bastards.
Played a golf greensome tournament with my mother and wouldn't you know - we won! Yay! Got a handy dandy 500 sek each in the club pro shop for the trouble. <<:D>>\n\nAlso, yesterday me and Linda celebrated our 8th anniversary by having a fantastic dinner at [[Mården]] (Review coming up shortly).
I remember my mother used to cook something like this in the times before she got a wok and destroyed her cooking. <<;)>>\n\nIngredients, serves 4:\n* Butter. Lots.\n* 1-2 tbsp flour\n* 2 leeks\n* 1/2 litre of milk, or however much feels right. <<;)>>\n* 1kg white fish, (I used cheap alaska pollock this time)\n* 3-4 boiled eggs\n* Parsley\n\nThat's about it.\nChop the leeks and fry them lightly in butter.\nSprinkle the flour in the pan and stir.\nPour in the milk, and let simmer until it thickens.\nPut in the fish and let cook just until you can easily divide the fish with a spatula.\nGarnish with halved boiled eggs and parsley.\nDone!\n\nIn the distant past, I might have put some potatoes in, but I no longer care for such carb-bombs.\nNowadays, like this time, I might for example serve this with a little quinoa salad with sauteed fennel and bell peppers.
I'd call it fish in egg sauce. While potatoes are generally overrated, for dishes like this one, it's hard to think of a side that goes as well as boiled potatoes. You kind of need the stodge to soak up all that yummy sauce. Maybe just boil one potato and save it to the end for the sauce? ;)
I think I would fry an onion as the base also!
An easy and fresh sicilian soup.\n\n!!Soup\n3,5 dl whole wheat grains, soaked overnight\n1 (silver) onion, chopped\n3 stalks celery\n3 cloves garlic\n~1kg tomatoes, peeled and chopped\n1.5 l chicken stock\n2,5 dl dry white wine\n6 dl pre-boiled white beans\n\nChop the vegetables and put in a pan with everything but the beans.\nBring to a boil and then let simmer for 30 minutes.\nPut in the beans and simmer for another 10 minutes.\nServe with Battuto Crudo on the side.\n\n!!Battuto Crudo\n0.5 dl parsley\n0.5 dl basil\n2 cloves garlic\n0.75 dl grated pecorino\n\nChop everything finely and blend in a bowl.
I find an onion can be a bit overpowering in the general mildness of this dish.\nYou are right to note however that it's a great option to turn it into an egg sauce by chopping up the boiled eggs. I just like the way it looks with the eggs halved on top.
However, Mariana confirmed yesterday that she indeed used to chop in an onion. So I guess that's settled then. ;)
Spent the whole day helping out with Linda and my Mother's grand new opening of the shop on Västerlånggatan in Gamla Stan that they've taken over from my grandmother, who ran it for 68 years.\nIt turned out to be a quite interesting crowd with friends of all three involved generations of my family invited. \n\nThe funniest moment of the day has to be getting asked whether open source alternatives are better than, say, MS Outlook, and if this "Firefox" program is any good. By an 80+ fellow. <<:D>> \nTurns out he knows his stuff quite well. According to my mother he used to be an IT consultant and is some kind of advisor for the Polish government. How cool is that?
Yesterday marked a dark day in Swedish democracy as the Swedish government accepted the new [["Lex Orwell"|http://www.stoppafralagen.nu]], allowing the military intelligence service nearly total freedom to eavesdrop on all digital communications over cable in Sweden - a level of surveillance hitherto unseen since DDR. Way to go!\n\nWhat particularly bugs me (no pun intended <<;]>>) in this is that the law was strongly backed by the so-called "Liberal" party. This is the absolute opposite of liberalism. Shame on you!
This Helsingborg espresso bar has achieved top places in the Swedish Barista Cup and has been one of Sweden's best.\nThe Coffee perhaps isn't as good as it used to be, but it's they still manage to churn out some excellent espressos, cappas and lattes from their wonderful La Marzocco machine.\nThe offering of cakes and assorted sweets feels a bit dull, the cakes don't look all that delicious and the cornetti tends to be a bit too dry, but the fair trade chocolate is perfect.\nAnother thing that brings K&Co down a notch in my book is the oftentimes very bored and uninterested staff.\nBut really the negatives are quite small for this nicely designed and discreetely queer (check out the magazines on display <<;)>>), that still has to be at least among the best coffee shops in southern Sweden.
|URL:|http://www.optical4less.com|\n|Description:|Custom prescription glasses online. From Hong Kong. Around 10% of Swedish prices. Quality is great and shipping is free if you order two pairs. Just choose frames and enter your prescription, et voila! I've bought three pairs to date and I'm very pleased with quality and service.|
Got to remember this one next time I'm in town...
I've been on vacation for two weeks and have been mad busy since then.\nI'll be posting up some notes from the last month or so shortly, right after finishing my Espresso-Cointreau-Mojito Cigarillo combo on the balcony.
With very little room for doubt, Sweden's finest //patisserie// is //En Liten Smula// in Norrtälje northeast of Stockholm. The list of top mentions in "Sveriges Bästa Bord" listed on the front door is pretty impressive by itself, but then approaching the counter is just overwhelming. Everything looks absolutely amazing, and there are //lots// to choose from. Classic cookies, macarons, pastries, chocolates, breads, lovely little Italian meringue pies, the super awesome mousse cakes, you name it, it just goes on and on.\n\nThe place has expanded quite a bit since our first visit and is now starting to show some signs of wear especially on the second floor where some of the furniture is really looking battered, which is kind of sad, although they did make a great job of freshening up the entrance area.\n\nIn the past, the coffee has been a bit of a weak spot, which I guess is fine as it hasn't really been what they've been focusing on, but the last time we were there the latte was actually pretty good with even a bit of etching going on on top - bonus! One point to remember though is that the big size latte is ''HUGE'', so don't order it unless you're ready for massive amounts of coffee flavored milk <<;)>>.\n\nSo to conclude, the place where the absolute best pastries and sweets in all of Sweden can be had has stepped up yet another little notch by adding better coffee to their repertoire.
[<img[http://farm4.static.flickr.com/3203/2702329244_f76cc5348b_t.jpg][http://www.flickr.com/photos/13322694@N03/2702329244/]]I'll say it right away: Wow, just wow! I never thought I'd actually get to see Leonard Cohen perform live, and now that it came true, I never expected him to put on such a good show - the man IS 74 years old after all. But he did deliver an excellent performance!\n\nLet's take it from the beginning: The concert at Sofiero was the grand finale of our little one week mini vacation in Skåne. We decided to get there early and did manage to grab pretty good spots at the head of the queues that after just a little while stretched out to hundreds (if not thousand(s) at most :O) of metres behind us. After a nice little picnic in the gardens we got ourselves some great spots right in the front row.\n\n[>img[Christian Kjellvander|http://farm4.static.flickr.com/3175/2701515037_c2872a7704_t.jpg][http://www.flickr.com/photos/13322694@N03/2701515037/]]Turns out Christian Kjellvander was the opening act, which I didn't know beforehand. He did a very good and humble set together with his wife out on the left corner on the stage. Very nice and very worthy!\n\nAfter a minor delay the show got under way with a very vital Cohen jogging onto the stage after the musicians made their entrance. I pretty much expected the show to be quite slow and toned down but not so at all.\nAfter opening with dance me to the end of love the man covered pretty much every well-known song in his catalog, except completely leaving out the darker material of Songs of Love and Hate.\n\nHighlights of the show for me were Anthem and Halelujah - big big moments where nary an eye was dry, the smoky jazz treatment of Boogie Street with a really nice solid beat with not a trace of the unfortunate Casio keyboard sound that's on the album, and the absolutely flawless performance of Suzanne.\n\nManaged to record two short clips and snap a couple of photos with my phone before the battery died.\nFirst one is from the opening track Dance Me To the End of Love and the other is from Ain't No Cure for Love:\n<html>\n<object width="283" height="233"> <param name="movie" value="http://www.youtube.com/v/lo3wOuCNEB4"> </param> <embed src="http://www.youtube.com/v/lo3wOuCNEB4" type="application/x-shockwave-flash" width="283" height="233"> </embed> </object><object width="283" height="233"> <param name="movie" value="http://www.youtube.com/v/0CYaBgjoIrc"> </param> <embed src="http://www.youtube.com/v/0CYaBgjoIrc" type="application/x-shockwave-flash" width="283" height="233"> </embed> </object>\n</html>\n\nThe show lasted for a full three hours(!), and all of the time there was this amazing feeling that this was a very special unique event (despite being just a stop on a major tour), all thanks to Leonard's sincere thankfullness and humility.\n\n[img[http://farm4.static.flickr.com/3194/2701514345_09bbcc277d_t.jpg][http://www.flickr.com/photos/13322694@N03/2702329244/]]\n\nMore photos [[here|http://www.flickr.com/photos/13322694@N03/sets/72157606371361315/]].
[>img[http://static.flickr.com/3224/2894927283_14a319c798_m.jpg]]\nBeen spending most of my spare time lately setting up a tiny little server.\nIt all started with me wanting to share my 320GB USB harddrive on the network so I could get back to streaming music over the wlan to my old XBOX running XBMC like i used to do before getting the new apartment. To do this I wanted a little a cheap NAS unit with USB ports and wireless or an ethernet port. After a bit of searching I found the Linksys NSLU2 that has two USB ports and an Ethernet port, and runs a simple web UI to set up shares. I thought it seemed to be great value for money at about €70, but little did I know just how much this little box could deliver...\n\nWhile I was doing the initial setup I noticed that on the CD there was a bunch of open source license notes, which got me thinking "soo, this little beast runs linux, eh?". A quick look on the net immediately led to http://www.nslu2-linux.org where there actually are a couple of distros that can be run on the Slug.\nI picked the SlugOS/BE distro, flashed the firmware (the flash tool was available as a package in Ubuntu! Couldn't be simpler) and then got to it.\n\nA lot of package installation, a bit of compiling from source and a some configuration later, I now have a teeny weeny little server running with:\n* Web Server:\n** Lighttpd\n** PHP-fcgi\n** Sqlite\n** WebDAV (module recompiled with prop support)\n* Mail Server:\n** UW IMAPd\n** Sendmail (recompiled with SASL auth support) \n** Roundcube Webmail\n** Signed Certificate from StartSSL\n* SAMBA server\n* Bittorrent client with web GUI\n\nEverything runs smoothly, except Roundcube is very slow and seems to use up 100% of the (very limited) CPU on page loads for some reason. What's probably the best part though, is that the Slug, two USB drives //and// a wireless router only eats 16W of power on idle!\n\nSome stuff that I still would like to get running is:\n* Always on hack - out of the box, if the power goes out, the unit will stay off\n* Print server - it is possible to connect other stuff than harddrives with a USB hub\n* Try to use the Slug to somehow get our IP telephony box to work from behind a router/firewall. Not sure if it's even possible, or how to do it, but it would be great.\n\nAll in all, this tiny little machine, only 21x91x13 mm, that runs linux and only pulls about 14W idle is insanely cost-effective at about €70 here in Sweden. Hell, if the 266MHz processor and 32MB of RAM can't cope with the load anymore, it should be possible to just get another one and make a cluster!
Interesting to see a Fair Trade //and// Organic coffee from local microroastery Johan&Nyström.\nSadly, I find most "high flavor" products such as coffee and chocolate that are Fair Trade/Organic tend to be sub par really.\nAs we will find out, this coffee is not an exception to the rule.\n\nThe beans have a toasted sort of aroma, actually quite like burnt rubber, and not very pleasant.\nPulled shots look nice, and the aroma - without a doubt the highlight of this blend - is deep, chocolatey with tones of dried fruit.\nThe brew tastes a bit disappointing after the nice aroma, with a pretty "flat" bitterness and not much else.\n\nWorks best in lattes. The produced espresso isn't all that enjoyable.
Häftigt!
Rekommenderas! Betydligt roligare än att bara ha en dum NAS.
Just saw this cool cooking trick on the Discovery Travel & Living channel:\nTo add a distinct vanilla flavor when barbequeing, put bits of wood soaked in water on top of the embers. This will slowly release the vanillin present in most woods (the very same that adds vanilla tones to wine and spirits aged in roasted oak) instead of incinerating it by quickly burning the wood.\nProbably works best for fruits or any kind of dessert dishes that can be prepared on the grill; in the show they did this with peaches. \nMust be tried on occasion.
Another cool trick I just saw on the Discovery Travel & Living channel:\nputting caperberries in salt will remove the typical caperberry flavour and bring out hidden flavorings that can also be found in violas and rasbperries!\nSounds like treating the giant variety of caperberries like this could make a very cool cocktail garnish.
Another roast from the local south of Stockholm coffee makers Johan&Nyström, one that I've seen a lot of cafés around town started using in the last year or so.\nUnfortunately I find the beans have the same quite unpleasant burnt rubbery aroma that is present in their [[Fair Trade Organic|Johan&Nyström Espresso Fair Trade Organic]] blend as well.\nThe brew has a very nice almond aroma, with just a slight note of hay and maybe just a hint of that unpleasantness way in the background.\nSadly, the flavor is permeated by that rubbery, earthy, burnt and bitter taste that is apparent when smelling the beans.\nDefinitely not working well for me, at least not with my grinder and machine. I'm not even finding it all that tasty in a latte or cappuccino either.\n
Here's a sweet little emacs hack for showing a notification bubble when compilation is finished. Very handy for projects with very long compile times.\nScreenshot:\n[img[http://www.mikaellanger.net/uploads/emacs-compile-notification.png]]\n\nStick the following in your .emacs:\n{{{\n;;Compilation notifcations\n(defun notify-compilation-result(buffer msg)\n (if (string-match "^finished" msg)\n (progn\n (status-post-message status-icon "Compilation Successful"))\n (status-post-message status-icon "Compilation Failed"))\n )\n\n(add-to-list 'compilation-finish-functions\n 'notify-compilation-result)\n\n(defun status-new ()\n (let ((result (start-process "status-icon"\n (generate-new-buffer-name " *status-icon*")\n "/usr/bin/zenity"\n "--notification"\n "--listen")))\n (process-send-string result "icon: /usr/share/icons/emacs22/emacs.xpm\sn")\n (process-kill-without-query result nil)\n result))\n\n(defun status-post-message (status-icon text)\n (process-send-string status-icon (concat "message:" text "\sn")))\n\n(setq status-icon (status-new))\n}}}
includes = 0.213s\nget all tiddlers = 0.269s\nbefore print tiddly = 0.424s\nafter print tiddly = 1.1s\nend of script = 1.1s\n