Welcome to TiddlyWiki created by Jeremy Ruston, Copyright © 2007 UnaMesa Association
> If there’s an ecosystem where things are free (such as, say, the internet) your currency becomes enthusiasm. Quality is important because it gives people a legitimate reason to become excited. Sincerity is what creates the line between real enthusiasm and empty hype.
- [[Frank Chimero|http://blog.frankchimero.com/]] at [[monoscope|http://www.monoscope.com/2010/04/frank_chimero_quote.html]]
Man oh man, how time flies. I was at QCon yesterday and wanted to write down some notes. I've come back to update this lil' wiki - still the best place to put up random thoughts, like what's up with [[Blender]] and who's your favorite [[Server]].. Time's flown again, as they say, and I must leave this page alone.
It's been a year since the last update to this personal wiki, and here I am back again. After checking out excellent services like [[Posterous|http://www.posterous.com]], [[Wordpress|http://wordpress.com]] and [[LiveJournal|http://livejournal.com]], I'm still convinced that for my needs and preferences the best way to get ideas, thoughts, links, and other nonsense online is through my favorite open source personal wiki - TiddlyWiki. One other reason it still works great for me is because of the easy uploading and feed-generation which allows me to write a custom widget for my home page on http://oleg.utou.ch in just a few minutes. Anyway, gotta love your open source. Stay tuned :)
Paul Emsley, http://www.ysbl.york.ac.uk/~emsley/coot/
http://strucbio.biologie.uni-konstanz.de/ccp4wiki/index.php/COOT
* Crystallographic Object - Oriented Toolkit
* One of the most widely used structural visualization tools in biochemistry
* Started in the 90's when a new generation of scientists started to rely on GUIs (such as NEXT OS)
* Developed in Python, with most/all analysis code still in C for performance
* GNU license, contributions from scientific teams all over the world, but managed by one person
* Agile process, source repository and unit testing essential to keep the project going
** although having to write academic papers sure flattens out the commit curve ..
* Interesting to see the similarities and differences between academic and consumer OSS
* Paul also showed screenshot of a cool distributed build system, updating hundreds of workstations through csch scripts
Steve Lee, http://fullmeasure.co.uk
* WCAG checklist - Web 2 Access at Southampton http://web2access.org.uk/
* Mozilla Accessibility Community
* Firefox is the most accessible browser and has great plugins
** [[Accessibility extension|https://addons.mozilla.org/en-US/firefox/addon/5809]]
** [[Contrast checker|https://addons.mozilla.org/en-US/firefox/addon/7391]]
* Windows UIE has a different focus / Gnome ATSPI / Linux Foundation IA2 (for Windows ..)
** Control the application and test it
* Open standard: WARIA
** Million ways of making a widget, but a screen reader doesn't know it
** A way of marking up specific elements
* Make sure the unit tests are fast to run
** e.g. An HttpUnitTest done right should take less than a second
* The sooner you find the bugs, the cheaper they are to fix
* Unit testing means you never have to say sorry
* CI provides a good indicator of progress, opens the door on a range of opportunities
* Performance testing
** Running scenarios against a live data structure
!! Tools
* Selenium
** [[Speclenium|http://monotonous.org/2008/09/19/speclenium-easy-setup/]]
** Very slow compared to unit tests, runs at human speed
* [[Windmill Testing Framework|http://www.getwindmill.com]]
* [[mozmill|http://code.google.com/p/mozmill/]] - Functional UI testing for Mozilla Applications
* From JUnit - I can test my code - to Selenium - I can test the experience
** How much of this spectrum does accessibility testing actually cover?
* Python accessibility framework: http://live.gnome.org/Accessibility/PythonPoweredAccessibility
Business innovation in the context of a world shifting from cathedral/control style to a bazaar/collaborative approach
Open (collaborative) innovation
iTunes
* the ''business process'' is the real innovation behind the iPod
Nintendo
* Market share: create demand and value for the consumer
* Instead of competing on gfx/cpu/speed/xtras > ''simple, fun, friendly'' (aggregate demand from non-customers!)
! Creating Value (Not Technology)
Five step process of identifying niches/innovation strategies
# Alignment
# Creativity
# Validation/Selection
# Enablement Planning
# Ecosystem Construction
Goal: find new customers, target non-customer-types
Organizations tend to ''think'' like their target market
Look for Alternatives:
* Alternative products
* Strategic groups
* Functional/emotional appeal
* Value choice
* Trends
* Complimentary offerings
! PERA/iNet
A collaborative approach
Innovation network
Input from '000s of people in academia
Lawyer specialising in IP and commercial law, especially open source.
http://www.moorcrofts.com
''[[Presentation slides|http://www.transfersummit.com/sites/default/files/materials/svanderwaal/AndrewKatz.pdf]]''
! Open licensing: cars, cartography, content and cola
<<<
The idea of the digital commons is proving disruptive to many industries. Each has its own quirks and foibles. Andrew Katz, a lawyer specializing in open source software, who also advises on other 'opens', investigates the interplay between licensing and community in a number of non-software open projects. In particular, he has been advising the 40Fires foundation on licensing issues arising out of its development of an open source hydrogen/fuel cell car.
<<<
! Open what...?
* Open source
* Open knowledge (* e.g. free & open law review)
* Open content
* Open data
* Open electronics
* Open cola
* Open car (* see [[Hyrban|http://www.40fires.org/Wiki.jsp?page=The%20hyrban]] hydrogen car)
! The development cycle
Design - Code - Make - Test - Release
Rinse & repeat.
!! What makes an OSS project successful?
* Low barrier to entry for contributions
* Minimal commitment
! Licensing
* To support all aspects of the dev cycle
* Prevent free riders? License to use? Copyright? Access to the source?
* Conditions on the exercise of rights: e.g. no rights to products made with OpenCola recipe
!! Copyleft
Terry Hancock concluded that copyleft does not affect projects activity (non-copyleft: FreeBSD, Apache, Postegres)
Easy vs Hard way from an IPR perspective
3D items have design right of about 15 years
Patents are expensive and the secrecy is not OSS friendly
Can copyright be hacked?
The economics of innovation in mobile technologies
Open Source Manager, [[LiMo Foundation|http://www.limofoundation.org/]] (Linux-based operating system for mobile devices)
! What customers want
* ++ features
* -- price
TMobile offers £20/month smartphone with unlimited Internet
Vodaphone 360 is a cloud sync service
!! Investment far exceeds market potential
3 mobile OSS drivers:
* < cost of acquisition
* < cost of access to innovation
* < cost of ownership
Projects
* ofono
* GeoClue
* Funambol
* Telepath
* Tracker
!! Maintenance is the biggest part of OSS TCO
Nokia process of working with upstream community projects
(release soon, release often)
most of the industry just forks the code
!! The cost of forking OSS
Forking is seen as a cost-saving opportunity
In reality, there is no free beer or free lunch
''Unleveraged potential''
The difference between the fork and the current release
!! Better approach
* Merge downstream
* Contribute upstream
Interesting stats of costs of never/early/late merging in mobile OSS
OSS becomes a ''supply chain management problem''
Meego is 1-6 months behind
Any components they use should be fed upstream first
(the best way to stay ahead is to run faster)
''Meritocracy'' is not well understood in the industry
! Mobile trends
* Competition is hot!
* Convergence e.g. Meego
* Platforms focus on evolution
* For developers, visibility is a real benefit
!! Q: Reliability?
RIM Founder: [[phones will crash|http://www.informationweek.com/blog/main/archives/2007/04/take_5_how_to_p.html]]
Industry playing catch-up to Apple in releasing features
everything and the kitchen sink
My favorite Linux distro. From the website:
//Arch is lightweight, flexible and simple. Its design philosophy and implementation make it easy to extend and mold into whatever kind of system you're building- from a minimalist console machine to the most grandiose and feature rich desktop environments available. Rather than tearing out unneeded and unwanted packages, Arch offers the power user the ability to build up from a minimal foundation without any defaults chosen for them. It is the user who decides what Arch Linux will be.//
http://www.archlinux.org
It's easy and fun to contribute to the [[Arch Linux Wiki|http://wiki.archlinux.org]], which is the center for discussion about the system.
Current machines on which I have Arch installed:
* Sony Vaio VGN-FE48E - Core 2 Duo - NVidia 7400
* Shuttle XPC SB83G5 - Pentium 4 HT - ATI X800 XL
* Compaq desktop - Pentium 4
* Various VMs for Virtual PC and VMWare
Inigo Surguy, http://surguy.net
* Developed own tool to reduce the amount of things that needed to be tested manually
* Testing with real people - labs at Shaw Trust
* Knowing the scale of the problem, so we can fix it at the end
* Looked at lots of existing tools
** Interactive desktop apps
** Testing existing rules w/o possibility of adding new ones
* [[Schematron]]
* XProc
* Reports list out the problems, but currently no good way of seeing where the problems are in context
* Authentication is a bit of a problem - uses Apache HttpClient, but might need a backdoor
Download: http://github.com/inigo
http://barcamp.org/BarCampApacheOxford
This was the first unconference of its kind in Oxford, put together by volunteers from Apache projects and members of the local geek community on April 5, 2009 at the University Club.
My notes from the talks can be found in the timeline to the right. They are neither complete nor likely to be useful to anyone but myself, but here they are. I had a great time interacting with all the people, and found the BarCamp a huge boost intellectually and emotionally. Not to say that traditional conferences have value, but loose interactive workshops are to deep-dive technical talks like the left brain is to the right - one can't live without the other.
Other (and better) writeups are here:
* [[Andrew Luke|http://wikiworldbook.com/component/option,com_myblog/category,barcampoxford/Itemid,201/]]
* [[Ben Werdmuller|http://benwerd.com/2009/04/notes-from-barcamp-oxford/]]
* [[Marcus Povey|http://www.marcus-povey.co.uk/2009/04/06/barcamp-apache-oxford/]]
* [[Sylwia Presley|http://sylwiapresley.wordpress.com/2009/04/05/first-impressions-of-barcampoxford/]] took [[photos|http://www.flickr.com/photos/sylwiapresleyart/?saved=1]]
* [[Marco Abis|http://blog.hubdirector.com/barcamp-apache-oxford-agile-open-source-development/]]
The new BarCampTransparency wiki:
http://barcamptransparency.pbwiki.com
! Sessions
RepRap
EclipseTigerstripe
OpenSource101
ReleaseManagement
OxfordGeekJam
TestingInRubyLand
CodeSense
SemanticApps
BreathingEasy
! Links
Web: http://barcamp.org/BarCampOxford
Blog: http://oxfordbarcamp.posterous.com/?page=2
Group photo: http://ht.ly/23M4o
Some photos: http://oxfordbarcamp.posterous.com/lunch-and-afternoon-sessions
More photos: http://www.flickr.com/photos/adrianhoward/sets/72157624369754210/
! Tweets
@ni: here are some urls relating to my ecoduino #barcampoxford talk... http://homecamp.org.uk/ http://pachube.com/ http://www.currentcost.com/
@adrianh: The Apache Way #barcampoxford http://post.ly/kqTs
@matatk: #barcampoxford "accessibility as machine-readability" as a way to see the potential of #a11y in "other" areas (e.g. automated GUI testing).
@tdobson at session about Women in Technology. Surprisingly laid back and insightful... #barcampoxford
@noirins: Check out "Unlocking the Clubhouse" for some great ideas on opening up tech opportunities to more people #barcampoxford
@OUCS_events_Mel: #barcampoxford Don't forget to rehydrate. It's a toasty 26 c in Oxford today.
@amcguire62: With Brent using his eye tracker early alpha - must have applicatipn in gaming / disability. #barcampoxford http://twitpic.com/203u9s
@amcguire62: #barcampoxford women in technology -work time directive - had a good impact on women becoming doctors. Girl Geek Dinners
@interlinux: Free CD ebook by snacks, Walking With the Elephants, not real ones! recent OSS collab dev/HE/business http://bit.ly/6wgg1E #barcampoxford
@matatk interested in accessibility for a OSS space invaders clone, have set up a forum for this project http://bit.ly/cxQIPE
@adrianh: Notes from Human Internet Interaction for e-inclusion #barcampoxford https://twitter.com/adrianh/status/17085930895
@adrianh: Bridging the gap between developers/research and users #barcampoxford http://post.ly/kpnh
@MsNice: Smart phones in the classroom, the fast food of the Modern Foreign Languages?
@chrisjdavis: in the talk for Oxford Geek Jam. An interesting response to Oxford Geek Night.
@mapkyca: Very interesting conversation about project community building at #barcampoxford
@hyrumwright: Great discussion about open economic data at #barcampoxford
@rgardler: Community leadership is about leading by example. Signpost the way through action.
@mberry: Advice for online community development: don't provide mechanisms for sending private messages. [Moodle forums vs messages]
@barcampoxford: Session Notes: Cloud for high availability - Matt Wood http://ht.ly/23zh2
@ajsutton: With most sessions just 30mins, time management and overflowing to breakout areas is already becoming a key skill.
@rgardler: Less of a hunt for power at #barcampoxford and #TS10 mainly because of the number of ipads
This is free and open source modelling and rendering software, which in the right hands can be used to create more detailed, organic or otherwise interesting 3D visualisations or animations than professional programs costing 1'000s if not 10'000s of dollars. Visit this site for all the details (and check out the galleries):
http://www.blender.org/
I've used Blender on a number of still images and animations, and right now I've got a spare-time (hah) project to help a model of a real-world factory become interactive, thanks to Blender's easy to use [[Python]] based game engine.
[[Yo Frankie!|http://www.yofrankie.org/]] is the first production quality Blender game - hot off the press!
Respiration Coach from VeRSI
https://www.versi.edu.au/versi-projects/life-science-projects/respiration-coach
Interesting discussion about this software/hardware project and some of its challenges
Nasir Jamal @_nasj
http://lcn.com (ISP)
[[Presentation slides|http://www.slideshare.net/nasirj/code-sense]]
! Writing better code
* Understanding easily when coming back later
* Mostly using Ruby
* don't always write perfect code, sometimes slip to the dark side
! How to measure code quality
* it's all relative..
* there are different tools available to measure complexity, structure
* the only valid measurement of code quality: [[WTFs per minute|http://digg.com/programming/The_only_valid_measurement_of_code_quality:_WTF_minute]]
! Practical example of a class
* 244 lines of code .. too many!
* collapse and see that just one method has 141 lines
* Run is too long, doing too many things
* difficult to test, reuse
* redundant comments
* not "Don't Repeat Yourself" (DRY)
* instead of refactoring, people kept adding stuff (or copying the class and changing it)
* "Don't Be A D***" (DBAD).. refactor
! Teams
* Having the courage to take actions
* More benefits from general code ownership than from individual blame
* Instill a sense for code quality in every team member by leading through example
* Code review process? Peer review leads to controversy
* Deliver comments in a constructive way - tell people their code is **** but.. be nice
* Always have some positive input as well as criticism
! Refactoring
(see slides)
metric_fu is a tool for getting automatic reports in Ruby to measure improvements
Perlcritic for Perl, lots of Java and .NET
Biggest aim is an improvement in release/deployment cycles
Background: #ACC4C1
Foreground: #000
PrimaryPale: #FFD4AE
PrimaryLight: #DAD992
PrimaryMid: #87593E
PrimaryDark: #4F3424
SecondaryPale: #E8B8AC
SecondaryLight: #D1A69B
SecondaryMid: #8B6F67
SecondaryDark: #5C4944
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
Confluence was a simple, practical web application that made it easy for teammates to collaborate and manage knowledge. These days it can still do that (and do it well), but it has grown much and learned plenty of new tricks. If you are planning to use it, try to keep it simple, keep it light. ([[Why?|WikiPatterns]])
http://www.atlassian.com/software/confluence
There are many remarkable things about Confluence and the people who have created and contributed to it. The only thing here for now is a bit of code that sits between two open source communities - the Confluence plugin ecosystem and TiddlyWiki - see [[Confluence TiddlyWiki plugin]].
It is plugin allows downloading a TiddlyWiki pre-filled with content from Atlassian [[Confluence]], a popular wiki system.
A TiddlyWiki is a single, self-contained HTML file that contains data organised in linked sections called tiddlers, which in this case correspond to Confluence pages. It also has script to allow easy viewing, editing, and saving - all on the desktop, no network connection required. This makes TiddlyWiki useful for people who need to go on the road with their wikis, or simply for the comfort and assurance of having a private copy to work with.
http://code.google.com/p/confluence-tiddlywiki-plugin/
!! How does it work?
The TiddlyWiki is generated on the server and sent back to the browser as an HTML page. The wiki includes a plugin which allows the Confluence formatting to be preserved, even while you edit the pages locally on your computer.
You can then sync the content back up to your server using the included ConfluenceAdaptorPlugin. This is still experimental, and I cannot vouch for the safety of any of your data - however, it is a Wiki, so you should always be able to Undo.
!! Notes
* users still need to rename tiddlywiki.action to .html
* currently there is no way to select certain pages for the export - only the whole space can be reliably downloaded. Try creating a special space for pages you want to move out to a TiddlyWiki as an alternative. Extending Confluence's space export function is possible, but as it is not a standard approach making it stable enough for the rest of us is too much work for now.
* TiddlyWiki can update itself - in case you're worried that you're downloading an outdated version of the code (you probably are!). Click on the ''backstage'' link at the top and use the ''upgrade'' feature.
This plugin by MartinBudden allows TiddlyWiki to connect to Confluence servers via XML-RPC to exchange Wiki content. It's helpful to have the [[ConfluenceFormatterPlugin]] so that tiddler contents can be made in standard Confluence syntax.
This system works well, and is actually more reliable than my Confluence plugin. It's also a closed loop where your work is preserved. For more information, visit Martin's site: http://www.martinswiki.com/
* Note: it seems to have disappeared at time of writing.
This plugin by MartinBudden allows TiddlyWiki to seamlessly work with Confluence formatting in the tiddler contents. It uses some custom JavaScript magic and works superbly well.
Of course, Confluence being a system that generates lots of dynamic code (and thus requires very beefy servers to run), this plugin will only handle the main formatting and not all of the dynamic markup. However, your macros and markup will be preserved for when you put the content back into Confluence.
For more info, please visit Martin's site:
http://www.martinswiki.com/#ConfluenceFormatterPlugin
Copyleft licenses require that you share any modifications that you make to the original code. Usually, these licenses also require that you share these modifications under the exact same open source software license as the source code.
Different open source licenses have different levels of copyleft:
!! “Permissive,” “attribution,” or “BSD-like” licenses
contain no copyleft requirement at all. These licenses essentially give the licensee complete discretion on how to distribute improvements and derivatives, or whether to distribute them at all. The licensee is permitted to re-license these derivatives in any manner, including under a royalty-bearing license.
e.g. BSD, MIT
!! “[[Weak copyleft]]”
licenses usually require only that you share modifications to the original software. These licenses usually require that you share these modifications under the same license as the original code.
e.g. Mozilla, CPL, CDDL, EPL
!! “Strong copyleft” or “viral” licenses
require that you share modifications, but they also require more. These licenses require that you share any source code of software that you distribute as part of the same software program as the open source software. The precise method of determining whether something is part of the same program often requires complex analysis and is sometimes subject to controversy and debate. For purposes here it is enough to know that if you bring code into Cisco under a “strong copyleft” or “viral” license, Cisco may become obligated to release some of our proprietary source code under the terms of that same license.
e.g. [[GPL]]
Craig Gallen
http://www.eclipse.org/tigerstripe/
! Tigerstripe
Model Driven Engineering
Apache License, Eclipse incubator project
Why Tigerstripe?
* Users of MDE frameworks may not be UML experts...
* Enterprise Models are BIG...
* Smaller pieces of Enterprise Models are owned by various Teams...
* MDE involves multiple roles...
Telcos and other industries have very complex models for enterprise software - create an open source way of connecting the different models together
Acquired by Cisco, but we worked together to improve it and widen its use
The model is stored as a combination of descriptive XML and normal Java classes
Start with UML and apply to any target language
Parse the model and generate code
Based on Eclipse, so is completely multiplatform
Most of the work is done internal at Cisco
Potential for wider use
Positioned against EMF - working to align with them
When you have a large enterprise model
! OpenOSS
Craig is leading the OpenOSS project (includes Nortel, Sienna, HP, BT, ..)
OpenOSS/J was a forerunner (a Java set of interfaces for Telcos, based on Java 1.4)
http://openoss.sourceforge.net/
http://www.tmforum.org/browse.aspx
Prem Ghinde, http://prem.ghin.de
* http://nearlydone.co.uk/
* [[Emotional intelligence| http://harvardbusinessonline.hbsp.harvard.edu/b02/en/common/item_detail.jhtml?id=1849]]
The main thing that I captured was that emotional intelligence, comprised of several key attributes of leadership (Salovey's [[Five Main Domains of Emotional Intelligence|http://books.google.com/books?id=afiX1y7OC4kC&pg=PA44&lpg=PA44&dq=Salovey%27s+Five+Main+Domains+of+Emotional+Intelligence&source=bl&ots=8eqWt0YT6C&sig=Ia7a_wqSPR_7bzUVxwFUAMrYfJM]]) is here to stay, replacing the militaristic qualities of the past. We unfortunately didn't have enough time to go much more deeply into all the areas of this, although questions from the audience did spark a few discussions about sociology and psychology of the workspace.
According to Fast Company, [[we live in a world that's resource-constrained but ingenuity-rich|http://www.fastcompany.com/blog/noah-robischon/editors-desk/what-ethonomics]]. Through a reasoned approach to [[mapping and prioritizing values|http://en.wikipedia.org/wiki/Ethonomics]] Ethonomics is about matching business needs of people around the world to appropriate economic systems. Instead of using one's own inherent sociopolitical lens, in this new business paradigm we start with an anthropological study of the consumer, producer and investor, differentiating between their diverse ethical and cultural norms in order to achieve a higher level of agreement and understanding.
According to my friends in California, this has my name written all over it - I'll follow their advice over the next while and see where this takes me. Ground zero: [[Wikipedia|http://en.wikipedia.org/wiki/Ethonomics]] [[Fast Company|http://www.fastcompany.com/topics/ethonomics]] [[Ethonomics.org|http://www.ethonomics.org/]]
''Wiki'' (n) - A collaborative site where users can edit content and have fun.
----
Welcome to my web scrapbook. Notable scraps include:
* BarcampOxford 2010
* TransferSummit 2010
* BarCampApacheOxford 2009
* QConLondon 2009
If you're bored already, how about [[a little game of jsTetris|jsTetris]] - just for fun? ([[send a msg|http://oleg.utou.ch]] if you beat the high score of 288933).
Other areas of interest should be floating about in the cloud .. Questions? Comments? Missing tiddlers? Get in [[touch|http://oleg.utou.ch]] :)
----
<<cloud limit:60 systemConfig excludeMissing script>>
HttpUnit emulates the relevant portions of browser behavior, including form submission, JavaScript, basic http authentication, cookies and automatic page redirection, and allows Java test code to examine returned pages either as text, an XML DOM, or containers of forms, tables, and links. When combined with a framework such as JUnit, it is fairly easy to write tests that very quickly verify the functioning of a web site.
http://httpunit.sourceforge.net/
Question: to look, but not touch? How to keep objectivity and stay original while being aware of all the progress and changes? How to avoid duplicating the established paradigms, and instead provoke, challenge and build on them?
The process is simple. Start with a pencil sketch on a rough piece of paper, and go from there.
My Wacom tablet found an excellent companion in the flawless [[ArtRage 2|http://www.artrage.com]] program.
[[Balsamiq Mockups|http://www.balsamiq.com/products/mockups]] is another one to try.
There are all kinds of interfaces in the programming business, but I'm even more interested in opportunities to envision, design, or develop ''user interfaces''. There are so many ways we reach out and connect as information users, that this becomes a completely boundless field for expression and experiment.
Concerning techniques: jQuery (for the root of this site), pure JavaScript (that runs this TiddlyWiki), CSS (that styles and envelops both), Adobe Flash / Flex / Air (the established name in RIA), Microsoft SilverLight (the nascent challenger), WebStandards and WAP for every platform and every device.
InterfaceInspiration
InterfaceProcess
PastInterfaces
@jerenkrantz
Contributing to httpd since 2001
70+ projects (TLPs)
''[[Presentation slides|http://www.transfersummit.com/sites/default/files/materials/svanderwaal/Justin_Erenkrantz_-_Open_Innovation.pdf]]''
!! Apache is a ''community'' of developers and users
* aims to provide a pragmatic non-technical framework to projects
* ''open development'' vs open source
* all development is made in public in a very transparent way
To each his own motivations..support..fun/technical challenge
!! Not "a patchy web server" ...
''Whomever has the best idea leads'' .. until a better idea is presented
http://incubator.apache.org/learn/rules-for-revolutionaries.html
Earn karma independently in each project
Break patches up into small chunks to ''make sure they are reviewed'' (contributor responsibility!)
Code can be vetoed, releases can not - Vetoes... judiciously used
3 votes minimum (ensures diversity & true community)
72 hours minimum time frame for votes (accomodate long weekends, err on caution)
!! Trolls exist.. don't feed them
(and don't become a poisonous person)
ASL2 can be used in GPL3, but no GPL in ASF projects
Umbrellas are bad - agreed on flat organizational structure and spun-off the projects
Once new projects get a mentor they are put into labs - shared mailing list, no non-committers, no releases
!! Meritocracy
government by merit
http://www.apache.org/foundation/how-it-works.html#meritocracy
!! Links
http://producingoss.com/
http://www.hawthornlandings.org/2009/03/getting-started-in-open-source-you-dont.html
http://www.bsdcan.org/2009/schedule/events/149.en.html
~SCALE_Final_allman_lhawthorn.pdf
http://theapacheway.com/
CEO, [[Sirius Corporation Plc|http://www.siriusit.co.uk/]]
!! Open Source business models, there are a few..
Proprietary business model: give me some money & we'll go away. (Don writes on oss issues)
Academic licenses (MIT): free to do anything with the code as long as you don't sue me
How do we engage the community?
Is services the ultimate model?
Prime examples of taking open source code and reissuing as closed source: Apple
(* whatever happened to OpenModo?)
Dual Licensing: MySQL, many others - because some purchasers prefer the commercial license
Subscription is a kind of licensing model
!! The primary benefit is to the consumer, not the producer
''Figure out how to make money''
Mark Taylor of @SiriusCorp distills it down to: open source is doing a damn good job of benefitting the consumer: producers still need to figure out ways of generating revenue
!! IT is a cost: it is not the *value*
FOSS *decosts markets*: for every $1 they earn, they take $10 out of the market (therefore reducing the market cap!)
<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
<meta http-equiv="cache-control" content="no-cache" />
<META HTTP-EQUIV="Pragma" CONTENT="no-cache" />
<META HTTP-EQUIV="Expires" CONTENT="-1" />
<!--}}}-->
Martin Budden is one of the code wizards who lives in Osmosoft towers, a very nice guy who helps people survive and thrive in their encounters with various fire-breathing serverside wikis. Pay a visit to his online wardrobe to get a TiddlyWiki adaptor and take charge of your magical pest. He can be reached through any of these portals:
http://martinswiki.com
http://twitter.com/buddenisms
Corporate world <-> Open Source world
http://www.indiginox.com/experience/
@silentpenguin
FOSS use is not reported by IT execs
OS doesn't have a lobby - no guidelines, no 'enterprise architecture principles', not included in the IT bill
-> level the gap?
From Guidance (help move from opportunistic use of FOSS to strategic/architecturally-driven use) to Procurement, Usage, Rules of Engagement
http://twitter.com/gklyne/statuses/16932025514
http://twitter.com/gklyne/statuses/16931743887
! Open Source Community of Interest
wikis, etc. generating and sharing interest
voices from the outside
educate, guide and engage
*if you do it right, it will eventually make itself obsolete* (towards IT for the people, by the people - a self service model)
@maemst
started helping Nokia test Linux and open source 10 years ago
good story of how someone from the community proved the Nokia 770 engineers wrong on the flash RAM as cache
Nokia bringing Z500 running Meego to market in 4Q10 http://mynokiablog.com/2010/06/21/arm-based-meego-nokia-tablet-z500-is-out-to-the-world/ ?
Motivations of contributing to open source: [[Georg von Krogh, S. Haefliger, S.Spaeth, M.Wallin|http://www.smi.ethz.ch/publications/conferenceslectures]], "Motivations andincentives in open source software development". 6th Annual International Open and User Innovation Workshop. Harvard Business School and Massachusetts Institute of Technology. Boston, August 4-6, 2008
Plus findings concerning FOSS from Nokia:
* Low knowledge protection costs
* Learning effects
* Reputation gain
* Adoption and lower costs of innovation
* Lower manufacturing costs
* Faster time to market
Costs:
* Difficulty to differentiate
* Loss of business secrets
* Giving up control and network entry barriers
* Organizational barriers
Interesting way to contrast factors of Control vs. Openness in OSS, plus open source adoption matrix for diverse international and Swiss companies
> "This network becomes more important than trade secrets"
- Ari Jaaksi, head of OSS at Nokia
Presentation from 1997 with more [[background on the Nokia work|http://www.openexpo.ch/fileadmin/documents/2007Bern/13_MatthiasStuermer.pdf]]
This wiki home catalogues random stuff, like [[Interfaces]]. For more random stuff check out the Delicious feed on my [[index.html|http://oleg.utou.ch]]. Oh, and once this wiki gets over, say, a MB in size, I'll bundle it up for joy and move it into the attic to start anew.
Gianugo Rabellino and Marco Abis
"No decisions are made on synchronous media"
- Golden rule of Agile at Apache
!! Thoughts
* If you're always revisiting the project - set deadlines, set product - risk of not delivering?
** Open source projects are never done: waterfall becomes irrelevant
* Sleep on a problem and get the answer in the morning
* Park questions to the customer and get back to it when you can
** but what happens when different customers want separate solutions?
* Pair programming:
** caveat: the two people need to know each other and have worked together before
** it is a way of doing peer review - if we agree peer review is good, do it real time
* Confluence projects
** ApacheCocoon
*** frustrated by not having knowledge of 'what's in my backyard'
** CouchDB
*** developers loved to hang out on IRC, compatible time zones
*** LivePaste - "let me show you"
*** peering / paring fit together closely
* Debate on Twitter [[#agile|http://search.twitter.com/search?q=%23agile]]
* Software craftmanship
Noirin Shirley
Technical Writer Google
> Noirin Shirley is a jack of all trades, and a master of several. A technical writer by day, Noirin loves her job in Google Zurich, and gets to spend 20% ofher time helping out with Open Source projects - small wonder then that she'son the Project Management Committees for the famous httpd and the newerCommunity Development projects at Apache, as well as being a member of theInfrastructure team, and the Vice President responsible for events!
! Values
* Be polite.. ask if it's OK!
* Everything I learned for Open Source, I learned in kindergarden
* When you start to play with others, you can build some pretty cool stuff
* It's not as simple as slapping an OSS license...
! Best practices
* Start releasing early and releasing often
* Let people see the pieces and reviewing the small patch
* Don't succumb to not-invented-here syndrome
* Sometimes you need to sit quietly/lurk/watch, the path is not spelled out
* Some projects have alot more documentation (how to contribute, etc.), than others
* Sometimes the project documentation is out of date
* Neat and tidy: leave things better than the way you found them
* Don't be afraid to ask for help!
! Communicate
* the worst thing that happens is a flame? sometimes there's some valuable content .. read between the lines
* try not to send out those emails yourself .. ''critique the code, not the coder''.. excersize some self control
* where possible, include positive comments - thank people for the contribution
* test your email client (to make sure the email goes to the list or individual)... double check !
* United Nations: important to remember that we're from different cultures (and what you perceive to be good manners might not be the same for someone else)
* admit your mistakes, be up front
! Trust
* until you get to the step where you're building trust, you can't be part of the community
* review other people's contributions (you can do this before you're making contributions yourself!) .. another pair of eyes is always a good thing
* try to get high-bandwidth-interaction with other people (meet in the same room, make 1:1 connections)
! Theory to practice
* Where do you get started? Often it's not a straight paved road and can be a bit of a maze
* Have a greeter for the project, and when a new contribution comes in welcome people (common problem for first timers is nothing happens when they patch in) - not necessarily appointing someone, but encourage everyone to take 5 minutes to be nice to new people in the morning...
* Code of conduct - warnings if you step out of line (private mailing list for this purpose...), one of the requirements is to initiate new members
* Not having a mailing list can be a disaster (e.g. GitHub, where people throw something on or email the author)
* At Apache, we can't figure out how to make the cultural walls work on Git, the lists are essential for communicating and keeping up
* At Wikipedia, if you don't create a way of DM'ing people will use mailing lists for that purpose - those personal messages will be out in the open
* Ross: you don't get a community going by herding cats - if you want to change the process, better to show by example
* Nick: it just took one person to write the 15 do's and dont's on an Apache mailing list that helped everyone
! What would make open source communities more attractive
* Finding a role: specific activities to start contributing - Kiraly spoke at Apachecon last year about including non-bugs in the bugtracker (e.g. logos for website)
* Markus: it can be very intimidating to get started, but the community ''does'' have to be very accepting of new people - e.g. contributions valued even if they are not immediately used - in larger projects there is an emphasis on 'core code' that requires in-depth knowledge - a simple 'thank you' suffices
* Legion of Bastion Castle - no matter how big or small the contribution, they had a credits page with everybody's name
* Eclipse Labs - things that are not part of core Eclipse (bits and pieces, non-core plugins and features) are collected on a Google Code project - association with the core project
* The author doesn't always want to maintain the patch, just wants the product to work - try to recognize the interest of the contributor
* We don't always recognize or remember the fact that not everyone wants or needs to follow the path (there is room for once or twice off contributors, people have different needs)
* Start a community development project to help people get past the initial steps
! Tweets
@Gagravarr: @noirins is giving her talk on community development at #barcampoxford - come along if you missed it at #ts10 as it's a great talk!
@mberry: @noirins at #barcampoxford "Everything you need to know about open source development, you learnt in kindergarten"
@mberry: @noirins at #barcampoxford: cooperate, follow directions, communicate, mind your manners, develop trust
@chrisjdavis: nugget of wisdom from @noirins "Make sure your email client works the way you think it does. To the person, not the list."
@jerenkrantz: Hard to hear @noirins talk about kindergarten & community when the real munchkins outside playing soccer are screaming...
a collaborative project to create a free editable map of the world
http://en.wikipedia.org/wiki/OpenStreetMap
[[Presentation 280slides|http://280slides.com/Viewer/?user=46465&name=Coffee%20Code%20Creativity%20Oxford%20Geek%20Jam&fullscreen]]
* History, motivations, experience
* Demo projects
* How to run a freestyle collaborative coding event
! Questions
* marketing the event - what's in a name? [[define:geek|http://www.google.co.uk/search?q=define%3Ageek&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:en-GB:official&client=firefox-a]]
* how to we make sure we don't use up too much time brainstorming
* ensure that laptops come out not too early to give enough space for design
* subversion repository as a key way to gauge progress and so on
* continuation of projects - is everything just throwaway material?
* maybe different ways of scheduling would fit better, e.g. every first Thursday or whatever
! Tweets/links
http://twitter.com/chrisjdavis/statuses/17084999307
http://www.oxfordgeekjam.net
/***
|''Name:''|PasswordOptionPlugin|
|''Description:''|Extends TiddlyWiki options with non encrypted password option.|
|''Version:''|1.0.2|
|''Date:''|Apr 19, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#PasswordOptionPlugin|
|''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 (Beta 5)|
***/
//{{{
version.extensions.PasswordOptionPlugin = {
major: 1, minor: 0, revision: 2,
date: new Date("Apr 19, 2007"),
source: 'http://tiddlywiki.bidix.info/#PasswordOptionPlugin',
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 (Beta 5)'
};
config.macros.option.passwordCheckboxLabel = "Save this password on this computer";
config.macros.option.passwordInputType = "password"; // password | text
setStylesheet(".pasOptionInput {width: 11em;}\n","passwordInputTypeStyle");
merge(config.macros.option.types, {
'pas': {
elementType: "input",
valueField: "value",
eventName: "onkeyup",
className: "pasOptionInput",
typeValue: config.macros.option.passwordInputType,
create: function(place,type,opt,className,desc) {
// password field
config.macros.option.genericCreate(place,'pas',opt,className,desc);
// checkbox linked with this password "save this password on this computer"
config.macros.option.genericCreate(place,'chk','chk'+opt,className,desc);
// text savePasswordCheckboxLabel
place.appendChild(document.createTextNode(config.macros.option.passwordCheckboxLabel));
},
onChange: config.macros.option.genericOnChange
}
});
merge(config.optionHandlers['chk'], {
get: function(name) {
// is there an option linked with this chk ?
var opt = name.substr(3);
if (config.options[opt])
saveOptionCookie(opt);
return config.options[name] ? "true" : "false";
}
});
merge(config.optionHandlers, {
'pas': {
get: function(name) {
if (config.options["chk"+name]) {
return encodeCookie(config.options[name].toString());
} else {
return "";
}
},
set: function(name,value) {config.options[name] = decodeCookie(value);}
}
});
// need to reload options to load passwordOptions
loadOptionsCookie();
/*
if (!config.options['pasPassword'])
config.options['pasPassword'] = '';
merge(config.optionsDesc,{
pasPassword: "Test password"
});
*/
//}}}
I've pulled them off the main page, but they can land in here soon.
WSO2: Enterprise ESB
http://wso2.com/
''[[Presentation slides|http://www.transfersummit.com/sites/default/files/materials/svanderwaal/PaulFremantle.pdf]]''
To be ''open'', live it to the core
* be involved in the community
* it's not just about the license
* learn from every aspect of OSS
Encourage contributions from people who live & breathe
* Apache: a great model for partnership
Usability - can people use my software for their project?
* Not just about the UI, also about API / services / data access / portability etc.
* Use your own software everywhere you can
Run our teams in a very multifunctional way
* Put your dev's next to a customer for a week to get them to experience usability issues
!! Being challenged protects you from being disrupted by something else
Have to disrupt our own technology
Europe Regional Director, Red Hat
Challenges of open source for commercial use and making OSS enterprise consumable
Do you know what Oracle's operating margins are? (Cost of proprietary ..)
Alternatives to a range of commercial software
[[Alfresco]], [[INGRES]], [[Jaspersoft]], SugarCRM, EnterpriseDB
Very difficult to sell licenses to companies that produce commercial software on one side and adopt open source on the other
EU is very pro-OSS
Drive the OSS market and represent highest value for money
'@J_JKMi: Discussing the delicate balance of keeping the customer, the community and the shareholder happy #red hat #ts10'
Apparently, when pythons lay eggs they tend to put them into a pile. I don't think this interesting fact from animal behavior has any relevance to the programming language, athough laying eggs and putting them into neat piles could be one poetic way to describe the pragmatic programmer.
''Python is a dynamic object-oriented programming language that can be used for many kinds of software development. It offers strong support for integration with other languages and tools, comes with extensive standard libraries, and can be learned in a few days. Many Python programmers report substantial productivity gains and feel the language encourages the development of higher quality, more maintainable code.''
http://www.python.org/
At the moment I tweak interactive physics in Blender and make runnable build scripts with Python. It could be a [[great|http://pylonshq.com]] [[way|http://www.twistedmatrix.com/]] to [[write|http://www.djangoproject.com]] Web apps, but I haven't really found the right host yet. [[Lousy|http://www.goeldi.com]] [[excuse|http://www.webfaction.com/]], I know.
QCon is an annual international software development conference that takes place in London (spring) and San Francisco (autumn). Move along to QConLondon.
On Thursday I went down to the fab-80's style Queen Elizabeth II conference hall where QCon took up two floors with a couple of hundred attendees going back and forth between the two bar areas and the ''seven'' parallel tracks. The sessions were all very high quality, the excitement level was high, and in a single day I could get to know at least a dozen other people and catch up with a couple of friends. During some of the sessions I was busy scribbling down on my pad, and in others there was a very active Twitter channel (#qcon) where I posted some feedback and interacted with folks sitting around through this new form of IRC.
!! Sessions of interest:
* [[Transforming Software Architecture with Web as Platform]] by [[Dion Hinchcliffe]]
* [[The evolving Guardian.co.uk architecture]] with [[Matthew Wall]]
* [[Open Standards Development: Opportunity or Constraint]] with a panel including [[Stephen Colebourne]], [[Patrick Curran]], [[Paul Downey]] and [[Rod Johnson]]
* [[OSGi and Java Modularization]] interviewing [[Neil Bartlett]]
* [[Spring Today and Tomorrow]] with [[Rod Johnson]]
* [[Adobe Flash Platform and SpringSource]] with [[Christophe Coenraets]]
!! Other notes
* [[Twist and Mingle]] from ThoughtWorks Studios
If one is wondering exactly what the difference is between this and REST and anything else is, it's probably because of the fact that it's already 2 AM by the time you can start to get any.
Representational state transfer (REST) is a style of software architecture ... The World Wide Web is the key example of a RESTful design.
http://java.sun.com/developer/technicalArticles/WebServices/restful
[[Hyrun Wright|http://www.hyrumwright.org]]
Working on release management as a ~PhD topic and looking for people to interview
[[Photo|http://adrianh.posterous.com/release-management-war-stories-barcampoxford]]
! Release history of Subversion
* Maintained svn for years
* People don't talk across organizations, lessons learned are hard to apply
* Little best-practice knowledge in most projects - how can we learn from each other?
* Internal release testing process
! Long time between releases
* Shoehorn too much stuff into the release
* Testing and validation took a lot longer than expected
* The bigger the product, the more bugs - and developers don't want to shift bugs
* But at some point, you've got to ask if it's worth it ...
* The design of merge tracking evolved during 1.5, in a non-modular way with major scope creep making the complexity involved (and there was a massive bottleneck because of the specialist knowledge required to get near the feature)
* Takes a lot of discipline on the development team (few developers are willing to back out on work to get a release out)
* Disable access to half-baked features which most users are not going to get to
* What are developers used to, talk to people about their preferred conventions
! Perspectives
* Even a small company has to be very careful about each release
* Platforms make release processes important if other development depends on you
* Releases are a labor intensive process
* BUT release process is (usually) not the product differentiator
* Large shops that deploy SVN are happy with once a year upgrades - more conservative release schedule
* Regression testing, test driven development, agile - the usual suspects
* Policies of releasing unfinished code to an appropriate channel
* Is it a problem of accurately estimating the time it takes to do the work (very common, very difficult problem)
! Balancing the Interest
* Sometimes it can be a real battle to get a project out the door
* Convincing the other side that it has values is hard (meeting the needs of many actors)
* Keeping track of the process and issue
* Breaking features up in the right way: when we tried to ship SVN 1.5, we couldn't until a particular feature was dones
* Certain cost to creating releases to track of: dev teams shut down for 2-3 days, testing and reviewing, customers have to upgrade the platform
* Find someone with thick skin who understands the situation, you can trust and let them break the alpha copies
* Tell people to stop making hard core changes in trunk
* Needs dedicated resources to manage releases (and commonly these are business and not technical people that have 2nd-degree experience of the challenge)
* Tried time-based release cycles - calendar of fixed periods for different release types (fails once you get past the low hanging fruit and there is a degree of uncertainty)
* Ticketing/tracking systems really help to keep balancing the interest
! Questions
* When do we make the release?
* What type of release is it (bug fix, feature)?
* Mechanics of distribution involved?
* Keeping services running smoothly through upgrades?
* Product or platform? (e.g. Subversion is both)
* Trunk or branch?
! Tweets/links
http://twitter.com/hyrumwright/statuses/17089331531
http://twitter.com/adrianh/statuses/17091330681
RT @ni: Ooo... they have a RepRap set up at BarcampOxford :) http://reprap.org/wiki/Main_Page #barcampoxford #repr... http://bit.ly/cSJ9ug
http://twitter.com/barcampoxford/statuses/17084170767
£300-400 of materials
check out http://omg3d.com voodoo digilab voocat
IETF mime type for matter transportation? :)
Humans and machine in a similar symbiosis to plants and animals
http://oxfordbarcamp.posterous.com/the-rapman
! Responsibilities of HW/SW Engineers, PLMs, and Release Program Managers
For Hardware/Software (HW/SW) Engineers, Product Line Marketing (PLM), and Release Program Managers, it is important to be aware of the following responsibilities when working with commercial and open source software. Please note that the mapping of specific job roles to these responsibilities may vary from Business Unit to Business Unit (BU).
!! All use of commercial and open source software integrated in products (or distributed outside the company) must be registered, and approved.
* Details are available on the COSI Registration and Approval page. http://wwwin.cisco.com/ops/sw-ops/cosi/message.shtml
* Trends and metrics are available on the Open Source Metrics Dashboard. http://wwwin.cisco.com/cgi-bin/ops/metrics/foss/index.cgi
!! All use of third party software must be reviewed and approved at the appropriate Great Engineering Methodology (GEM)/Cisco Product Development Methodology (CPDM) milestones.
* GEM and CPDM have always had references to 3rd party software components. Now more than ever, it is important to work with your BU legal representative to ensure components are approved, and that obligations are being met. CPDM now adds the BU Legal representative as an approver at the First Customer Ship (FCS) Readiness Review gate.
* More information about GEM and CPDM are located here: http://wwwin.cisco.com/ops/gem/ and http://wwwin.cisco.com/ops/hw-ops/cpdm/
* BU legal representatives are listed here: http://wwwin.cisco.com/legal/licensing/contact.html
!! Third party license obligations must be reviewed and met.
* Documentation - Many open source packages require inclusion of licenses and acknowledgements. Requirements for common licenses are documented in the OSRB's Documentation Policy, EDCS-639175. For other license requirements, contact your BU representative.
* Software Publication - OSRB Publication Policy EDCS-660825. Some licenses, such as the GPL, require an offer of any modified open source to be made available to the public upon request.
* Coordinated Givebacks - Cisco software projects that are to be Open Sourced must comply with the Open Source Contribution Policy for IP, EDCS-632317.
http://www.nesta.org.uk/
http://www.100open.com/what-we-do/
''[[Presentation slides|http://www.slideshare.net/rolandharwood/partnering-for-innovationppt]]''
'There are two ways of making innovation happen: start with what or start with who.' @mberry
'@rolandharwood from Nesta explaining what's difficult about open innovation' ~@SaraAllison
Innovation 'jams' with Virgin, IBM,...
'Roland Harwood: In open innovation you're not buying a product, you're buying a process, a potential...' @jamiedsmith
What happened to http://www.openalchemy.co.uk/page/about/index.html ??
Innovators }RISK INERTIA DISTRUST{ Corporates
Learning to scale
http://meta.wikimedia.org/wiki/User:Sj
Wikitime
Simplest way to edit...
500 servers, 200K editors, 6 Gbps
Most traffic is through mirrors and forks
Find network effects, classify
Eliminate bottlenecks, give ownership
Deletion patrol
All the stats are public.. server outages are usually not reported by admins
Share passionately: maximize reach, not margins
Give people a sense of collaboration and participation
Invest in APIs (* not rate limited, corporate accounts boost connection) and models (!)
Varied, friendly core community (!)
WikiBrowse
1.5 million people have an XO http://laptop.org/en/laptop/
Anyone who develops something useful gets one for free contributors@laptop.org
Reproduce nearly every part of the XO through an open design
8yr old girls in Nigeria were running a laptop hospital making their own hardware repairs
Testing schema on XML documents by XPath expression
http://www.schematron.com/
Assistant Director, CETIS
<<<
Scott Wilson is Assistant Director of CETIS, the JISC's innovation support centre for interoperability and standards in the UK higher and further education sectors. As well as working on Apache Wookie (Incubating), Scott is a contributor to W3C, the Open Web Foundation, CEN and other standards organisations. Prior to working in CETIS, Scott worked in the commercial software sector, in areas such as CRM, business intelligence and criminal intelligence.
<<<
''[[Presentation slides|http://www.transfersummit.com/sites/default/files/materials/svanderwaal/barriers2community.pdf]]''
!! Summary
<<<
Building community is not easy. All communities start off small; initial participants often find themselves talking to themselves, but failure to communicate internal thoughts to newcomers looking for an opportunity to contribute is, in itself, a barrier to entry for those newcomers. Who wants to be the first at the party?
Conversely, once a community has developed, everyone seems to know each other already. Who wants to be the only one nobody knows at the party? Of course, there is a whole host of barriers between these two points. In this presentation, we'll look at some of the most common barriers to community.
<<<
Sander @sandervdwaal
http://simal.oss-watch.ac.uk - 1500 GIST funded projects, interfaces with ohloh.net
Main application is to match projects by theme, geographically, finding connections
Ross has public fingerprint, geo info, current projects and contacts in his [[FOAF|http://people.apache.org/~rgardler/foaf.rdf.xml]].. but does Ross have any friends?
FOAF address book [[developed by Henry Story|http://blogs.sun.com/bblfish/entry/bof_5911_building_a_web]], works on foaf+ssl and distributed auth mechanisms
If you have your own FOAF RDF file, it is accessible to anyone but controlled completely by you
To maintain a certain level of privacy, you need to have a way of restricting public access
Lots of recent buzz around Semantic Web, Facebook's Open Graph, Public/Open Data
Archives Hub in Manchester aims to open up and connect lots of public data
Difficult to work in this area - creating the data is easy, but making sure the data is clean/appropriate, building flexible enough UI's
Distributed Flickr - finding people to add to your social circle, get a snippet on my page of everyone I follow
FOAF is not the only way forward.. any alternatives?? Room for competitive approaches
The concept of ontologies is a very useful one
Cool applications: find some data sets and merge them (see Economics talk from this morning..)
If I have to run a server, I try to be sure it's as familar and stable as possible. ArchLinux has been a favorite for the past few years, but there's also SlaxLinux and UbuntuLinux which can be great in a pitch.
http://forgerock.com/
!! Information Guilds
Instead of hub and spoke, we have a connected society
This is natural effect of peer-to-peer communications where every individual is connected to everyone else
!! Open Source Ecosystem
Artisans sharing and publishing for mutual benefit
Not contributing out of socialist paranoia: but to avoid becoming a slave to refactoring: and that is how the open source have come about
Richard Stallman's (accidental revolutionary) four freedoms are at the heart of OSS business success
OSI projects pragmatic constraints in order to ensure software freedom, not undermine it
Businesses are like reptiles: cold blooded
Cloud computing: the first time the industry was honest about vapourware :)
Eucalyptus, Zenoss, SugarCRM - open core: just enough to associate yourself with it, but not enough to give your customers any freedom (VC strategy to go big...)
IBM Websphere (built on lots of great OSS): your freedoms have already been banked
NB: http://forgerock.com/openportal.html is the successor to Sun Portal http://en.wikipedia.org/wiki/OpenPortal
because the server-side //c'est passe´//
! Static Linking
Static linking is the process of combining a program with the parts of various library routines that it uses, resulting in an executable that contains all the code necessary for the program to run. The linker takes one or more object files and parses them for any unresolved symbolic references to function calls, and for each one finds the appropriate library containing the object code that implements that function, extracts the code from the library and adds it to the executable. This process continues until all symbolic references have been resolved.
In UNIX and Linux, object files are binary files that have a ".o" extension. Libraries that are designed for static linking will also have a .o extension, or .a extension if the file is an archive.
Static linking results in an executable file that contains all the machine-executable code necessary to run the program. This means that any library functions that are called by the program are included in the executable itself. Although there may be a small increase in performance over dynamic linking because everything is in the same executable, static linking suffers from some serious problems. For example, subsequent versions of the operating system which update, fix, or enhance a library function will not be used by an application that has been statically linked unless the application is re-linked. Furthermore, statically linked programs cannot make use of many internationalization, localization, and networking features that vary from device to device. Also, RAM can be wasted due to multiple copies of the same library function being loaded for each application in which it is used. For these and other reasons, dynamic linking is preferred to static linking in most instances. However, static linking may be required for security-related applications, where the application must be certain that the library functions it uses are what it expects.
! Dynamic Linking
In dynamic linking, the linker does not copy library code for functions called by the program into the program's executable. Instead, the linker resolves all symbolic references to library routines and adds startup code to load the required libraries at runtime, with each library call being made through a jump table. The first time an application calls a library function, the jump table is initialized to point to the library routine; additional calls then incur only a very small overhead.
Dynamic linking makes use of shared object libraries. On UNIX and Linux systems, these libraries will have a ".so" extension often followed by a version number, for example: /usr/lib/libc.so.1
CWI/W3C Amsterdam
http://homepages.cwi.nl/~steven/
! A bit of history
[[New Amsterdam|http://en.wikipedia.org/wiki/New_Amsterdam]] (New York, Dutch West India Company)
As steam powered ships improved in reliability, the new technology ate sailing's lunch
[[Disruptive Technology|http://en.wikipedia.org/wiki/Disruptive_technology#History_and_usage_of_the_term]]: the Innovator's Dilemma (Christensen)
Technological improvements meeting needs: sustainable progress
A ''disruptive'' technology does not meet all the needs and has initial disadvantages
A ''disruptive'' technology initially targets a niche
e.g. 5 1/4" disks vs 8"
!! Why don't major corporations shift?
* Thinner margins
* Happens too quickly
* See disadvantages more clearly
* Someone eating their lunch: don't want the new to succeed
!! E.g. Linux
(+) low cost, variety, open, fast, compatible
(-) different, install yourself, usability (more on that later)
Niche: router, NAS, satnavs, netbooks, ...
!! Do more than just imitate
! States of acceptance of a new tech
* Denial
* Anger
* Bargaining
* Acceptance
! Usability
Design things to be ''faster, less errors, enjoyment'' != learnability
The ''Web'' vs. ''Software'':
* Content -- Functionality
* Usability -- Usability
* Speed -- Speed
* Up-to-date -- Bug fixes
Eric S. Raymond called for systematic end-user testing of UI's
Different people have different psychologies: intuitives (programmer) vs. sensors (public) - see [[Myers-Briggs Types|http://en.wikipedia.org/wiki/Myers-Briggs_Type_Indicator]]
Sensors see the trees, while Intuitives see the forest
Programmers learn to scratch each other's itch ... find ''mediators'' which can encourage the programmers to scratch others' itch?
Ubuntu is the kind of big player that can organize this
! Robert Metcalfe
> v(n) = n^2
The value of a network is proportional to the square of its nodes
!! True cost of communication
Internet shows that distance != cost of communication
The web sharing information != cost of communication
e.g. Wikipedia is the product of 100'000 hours of work - OpenStreetMap
Ecosphere of Linux: ''gcc -> kernel -> apps''
"Piping" together information ([[linux pipe|http://en.wikipedia.org/wiki/Pipe_(Unix)]]): the capability has been lost in the age of GUI - ''apps have become islands''
!! New software architecture for non-monolithic apps
An app becomes just the meetingpoint of Data, Functionality, UI parts
The openness (to other uses) and transparency of each part erodes the monolith
! Putting it all together
Seamen used to sail (in awful conditions)
Now we are passengers on a cruise ship
- in the same way -
IT people used to run the show
the common public will be building the next wave
''Make programming less of a specialist activity''
Enablers: automation, reliability, access
OSS community has no place for the usability expert: strong sense of ownership, people don't take criticism easily
Projects with good usability will have the developers collectivized for a common purpose
One of Stewarts popular presentations on how to grow an enterprise wiki is floating on YouTube:
http://www.youtube.com/watch?v=32cXcdXqS4A
/*{{{*/
#displayArea {
background:#FFFFFF none repeat scroll 0 0;
border:40px solid #DFFFFB;
margin:0em 16em 0em 1em; /* left 15em for mainMenu */
}
#tiddlerDisplay {
border-right:1px solid #eee;
border-bottom:1px solid #eee;
}
.button {
border:none !important
}
div.header {
display:none
}
div#mainMenu {
background-color:#F2B84B;
font-size:2em;
width:143px;
display:none; /* turn it off */
}
div#sidebar {
background-color:#565651;
}
div#sidebar .button, div#sidebar .searchButton {
color:#fff;
}
.tabUnselected {
background:none;
}
/* jsTetris Stylesheet */
#tetris {
position: relative;
width: 300px;
height: 309px;
background: #fff;
border: #BE9E7C 1px solid;
}
#tetris .left {
background: #F5EDE3;
position: absolute;
width: 131px;
height: 100%;
left: 0px;
top: 0px;
}
.left-border { background: #E4BE95; position: absolute; z-index: 100; top: 0px; left: 130px; width: 1px; height: 100%; }
#tetris-area {
/* 168,308 +2px borders */
background: #fff;
position: absolute;
width: 167px;
height: 307px;
left: 132px;
top: 1px;
overflow: hidden;
}
.grid1, .grid2, .grid3, .grid4, .grid5, .grid6 { z-index: 10; position: absolute; top: 0px; width: 13px; height: 307px; background: #f4efe9; }
.grid1 { left: 14px; }
.grid2 { left: 42px; }
.grid3 { left: 70px; }
.grid4 { left: 98px; }
.grid5 { left: 126px; }
.grid6 { left: 154px; }
#tetris .block0,
#tetris .block1,
#tetris .block2,
#tetris .block3,
#tetris .block4,
#tetris .block5,
#tetris .block6 {
z-index: 1000;
font-size: 10px;
line-height: 1em;
font-family: arial;
position: absolute;
width: 13px;
height: 13px;
border: 0.5px solid #ffffff;
/* with margin 0.5px there were problems with offsetLeft and offsetTop */
}
#tetris .left h1 {
font-size: 11px;
font-family: "trebuchet ms", arial;
font-weight: bold;
text-align: center;
margin-top: 10px;
margin-bottom: 10px;
}
#tetris .left h1 a {
color: #3366CC;
text-decoration: none;
}
#tetris .left h1 a:hover {
color: #FF6600;
text-decoration: none;
}
/* menu */
#tetris .left .menu {
margin-top: 1em;
}
#tetris .menu a, #tetris .menu a:visited {
display: block;
text-decoration: none;
color: #333333;
background: #EAE0D1;
border-width: 1px;
margin-bottom: -1px;
border-style: solid;
border-color: #BE9E7C;
cursor: pointer;
text-align: left;
padding-left: 10px;
height: 19px;
line-height: 19px;
width: 78px;
padding-bottom: 1px;
margin-left: 20px;
}
#tetris .menu a:hover { background: #EFE8DE; }
/* game over */
#tetris-gameover {
position: absolute;
width: 100%;
top: 50%;
text-align: center;
font-weight: bold;
display: none;
}
/* next puzzle */
#tetris-nextpuzzle {
position: absolute;
top: 47%;
left: 35%;
background: #ffffff;
overflow: visible;
display: none;
}
#tetris-keys {
position: absolute;
left: 25px;
top: 135px;
}
#tetris div.h5 { margin-bottom: 0.5em; display: block; font-weight: bold; }
#tetris-keys td { padding-right: 1px; padding-bottom: 1px; }
#tetris-keys img { border-width: 0px; }
/* stats */
#tetris .left .stats {
position: absolute;
left: 25px;
bottom: 5px;
}
#tetris .stats td { padding-bottom: 1px; line-height: 1.25em; }
#tetris .stats .level { text-align: left; padding-right: 5px; }
#tetris-stats-level { font-weight: bold; }
#tetris .stats .time { text-align: left; padding-right: 5px; }
#tetris-stats-time { font-weight: bold; }
#tetris .stats .apm { text-align: left; padding-right: 5px; }
#tetris-stats-apm { font-weight: bold; }
#tetris .stats .lines { text-align: left; padding-right: 5px; }
#tetris-stats-lines { font-weight: bold; }
#tetris .stats .score { text-align: left; padding-right: 5px; }
#tetris-stats-score { font-weight: bold; }
/*
|
---
*/
#tetris .block1 { background: #32a4fa; }
/*
|
---
*/
#tetris .block0 { background: #38C44F; }
/*
--
--
*/
#tetris .block2 { background: #FFAC1C; }
/*
--
--
*/
#tetris .block3 { background: #FF6600; }
/*
|
---
*/
#tetris .block4 { background: #CC54C4; }
/*
--
--
*/
#tetris .block5 { background: #999; }
/*
----
*/
#tetris .block6 { background: #FF0000; }
/*** window ***/
#tetris .window {
background: #EFE8DE;
position: absolute;
width: 167px;
height: 307px;
left: 132px;
top: 1px;
z-index: 50000;
display: none;
}
#tetris .window .top {
position: relative;
background: #EAE0D1;
color: #666666;
letter-spacing: +1px;
height: 20px;
line-height: 20px;
vertical-align: middle;
border-bottom: 1px solid #ffffff;
text-indent: 10px;
}
#tetris .window .top .close {
position: absolute;
background: #EAE0D1;
font-family: verdana;
font-weight: bold;
right: 0px;
top: 0px;
height: 20px;
line-height: 19px;
text-indent: 7px;
width: 21px;
border-left: 1px solid #ffffff;
cursor: pointer;
}
#tetris .window .top .close:hover {
background: #EFE8DE;
}
#tetris .window .content {
margin: 10px;
}
#tetris .window .content table {
}
/*}}}*/
/***
|Name|TagCloudPlugin|
|Source|http://www.TiddlyTools.com/#TagCloudPlugin|
|Version|1.6.0|
|Author|Eric Shulman|
|Original Author|Clint Checketts|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|present a 'cloud' of tags (or links) using proportional font display|
!Usage
<<<
{{{
<<cloud type action:... limit:... tag tag tag ...>>
<<cloud type action:... limit:... +TiddlerName>>
<<cloud type action:... limit:... =tagvalue>>
}}}
where:
* //type// is a keyword, one of:
** ''tags'' (default) - displays a cloud of tags, based on frequency of use
** ''links'' - displays a cloud of tiddlers, based on number of links //from// each tiddler
** ''references'' - displays a cloud of tiddlers, based on number of links //to// each tiddler
* ''action:popup'' (default) - clicking a cloud item shows a popup with links to related tiddlers<br>//or//<br> ''action:goto'' - clicking a cloud item immediately opens the tiddler corresponding to that item
* ''limit:N'' (optional) - restricts the cloud display to only show the N most popular tags/links
* ''tag tag tag...'' (or ''title title title'' if ''links''/''references'' is used)<br>shows all tags/links in the document //except// for those listed as macro parameters
* ''+TiddlerName''<br>shows tags/links read from a space-separated, bracketed list stored in a separate tiddler.
* ''=tagvalue'' (//only if type=''tags''//)<br>shows only tags that are themselves tagged with the indicated tag value (i.e., ~TagglyTagging usage)
//note: for backward-compatibility, you can also use the macro {{{<<tagCloud ...>>}}} in place of {{{<<cloud ...>>}}}//
<<<
!Examples
<<<
//all tags excluding<<tag systemConfig>>, <<tag excludeMissing>> and <<tag script>>//
{{{<<cloud systemConfig excludeMissing script>>}}}
{{groupbox{<<cloud systemConfig excludeMissing script>>}}}
//top 10 tags excluding<<tag systemConfig>>, <<tag excludeMissing>> and <<tag script>>//
{{{<<cloud limit:10 systemConfig excludeMissing script>>}}}
{{groupbox{<<cloud limit:10 systemConfig excludeMissing script>>}}}
//tags listed in// [[FavoriteTags]]
{{{<<cloud +FavoriteTags>>}}}
{{groupbox{<<cloud +FavoriteTags>>}}}
//links to tiddlers tagged with 'package'//
{{{<<cloud action:goto =package>>}}}
{{groupbox{<<cloud action:goto =package>>}}}
//top 20 most referenced tiddlers//
{{{<<cloud references limit:20>>}}}
{{groupbox{<<cloud references limit:20>>}}}
//top 20 tiddlers that contain the most links//
{{{<<cloud links limit:20>>}}}
{{groupbox{<<cloud links limit:20>>}}}
<<<
!Revisions
<<<
2009.02.26 [1.6.0] added {{{action:...}}} parameter to apply popup vs. goto action when clicking cloud items
2009.02.05 [1.5.0] added ability to show links or back-links (references) instead of tags and renamed macro to {{{<<cloud>>}}} to reflect more generalized usage.
2008.12.16 [1.4.2] corrected group calculation to prevent 'group=0' error
2008.12.16 [1.4.1] revised tag filtering so excluded tags don't affect calculations
2008.12.15 [1.4.0] added {{{limit:...}}} parameter to restrict the number of tags displayed to the top N most popular
2008.11.15 [1.3.0] added {{{+TiddlerName}}} parameter to include only tags that are listed in the indicated tiddler
2008.09.05 [1.2.0] added '=tagname' parameter to include only tags that are themselves tagged with the specified value (i.e., ~TagglyTagging usage)
2008.07.03 [1.1.0] added 'segments' property to macro object. Extensive code cleanup
<<<
!Code
***/
//{{{
version.extensions.TagCloudPlugin= {major: 1, minor: 6 , revision: 0, date: new Date(2009,2,26)};
//Originally created by Clint Checketts, contributions by Jonny Leroy and Eric Shulman
//Currently maintained and enhanced by Eric Shulman
//}}}
//{{{
config.macros.cloud = {
tagstip: "%1 tiddlers tagged with '%0'",
refslabel: " (%0 references)",
refstip: "%1 tiddlers have links to '%0'",
linkslabel: " (%0 links)",
linkstip: "'%0' has links to %1 other tiddlers",
groups: 9,
init: function() {
config.macros.tagCloud=config.macros.cloud; // for backward-compatibility
config.shadowTiddlers.TagCloud='<<cloud>>';
config.shadowTiddlers.StyleSheetTagCloud=
'/*{{{*/\n'
+'.tagCloud span {line-height: 3.5em; margin:3px;}\n'
+'.tagCloud1{font-size: 80%;}\n'
+'.tagCloud2{font-size: 100%;}\n'
+'.tagCloud3{font-size: 120%;}\n'
+'.tagCloud4{font-size: 140%;}\n'
+'.tagCloud5{font-size: 160%;}\n'
+'.tagCloud6{font-size: 180%;}\n'
+'.tagCloud7{font-size: 200%;}\n'
+'.tagCloud8{font-size: 220%;}\n'
+'.tagCloud9{font-size: 240%;}\n'
+'/*}}}*/\n';
setStylesheet(store.getTiddlerText('StyleSheetTagCloud'),'tagCloudsStyles');
},
getLinks: function(tiddler) { // get list of links to existing tiddlers and shadows
if (!tiddler.linksUpdated) tiddler.changed();
var list=[]; for (var i=0; i<tiddler.links.length; i++) {
var title=tiddler.links[i];
if (store.isShadowTiddler(title)||store.tiddlerExists(title))
list.push(title);
}
return list;
},
handler: function(place,macroName,params) {
// unpack params
var inc=[]; var ex=[]; var limit=0; var action='popup';
var links=(params[0]&¶ms[0].toLowerCase()=='links'); if (links) params.shift();
var refs=(params[0]&¶ms[0].toLowerCase()=='references'); if (refs) params.shift();
if (params[0]&¶ms[0].substr(0,7).toLowerCase()=='action:')
action=params.shift().substr(7).toLowerCase();
if (params[0]&¶ms[0].substr(0,6).toLowerCase()=='limit:')
limit=parseInt(params.shift().substr(6));
if (params.length) {
if (params[0].substr(0,1)=='+') { // get tag list from tiddler
var inc=store.getTiddlerText(params[0].substr(1),'').readBracketedList();
} else if (params[0].substr(0,1)=='=') { // get tag list using tagged tags
var tagged=store.getTaggedTiddlers(params[0].substr(1));
for (var t=0; t<tagged.length; t++) inc.push(tagged[t].title);
} else ex=params; // exclude params
}
// get all items, include/exclude specific items
var items=[];
var list=(links||refs)?store.getTiddlers('title','excludeLists'):store.getTags();
for (var t=0; t<list.length; t++) {
var title=(links||refs)?list[t].title:list[t][0];
if (links) var count=this.getLinks(list[t]).length;
else if (refs) var count=store.getReferringTiddlers(title).length;
else var count=list[t][1];
if ((!inc.length||inc.contains(title))&&(!ex.length||!ex.contains(title)))
items.push({ title:title, count:count });
}
if(!items.length) return;
// sort by decending count, limit results (optional)
items=items.sort(function(a,b){return(a.count==b.count)?0:(a.count>b.count?-1:1);});
while (limit && items.length>limit) items.pop();
// find min/max and group size
var most=items[0].count;
var least=items[items.length-1].count;
var groupSize=(most-least+1)/this.groups;
// sort by title and draw the cloud of items
items=items.sort(function(a,b){return(a.title==b.title)?0:(a.title>b.title?1:-1);});
var cloudWrapper = createTiddlyElement(place,'div',null,'tagCloud',null);
for (var t=0; t<items.length; t++) {
cloudWrapper.appendChild(document.createTextNode(' '));
var group=Math.ceil((items[t].count-least)/groupSize)||1;
var className='tagCloudtag tagCloud'+group;
var tip=refs?this.refstip:links?this.linkstip:this.tagstip;
tip=tip.format([items[t].title,items[t].count]);
if (action=='goto') { // TAG/LINK/REFERENCES GOTO
var btn=createTiddlyLink(cloudWrapper,items[t].title,true,className);
btn.title=tip;
btn.style.fontWeight='normal';
} else if (!links&&!refs) { // TAG POPUP
var btn=createTiddlyButton(cloudWrapper,items[t].title,tip,onClickTag,className);
btn.setAttribute('tag',items[t].title);
} else { // LINK/REFERENCES POPUP
var btn=createTiddlyButton(cloudWrapper,items[t].title,tip,
function(ev) { var e=ev||window.event; var cmt=config.macros.cloud;
var popup = Popup.create(this);
var title = this.getAttribute('tiddler');
var count = this.getAttribute('count');
var refs = this.getAttribute('refs')=='T';
var links = this.getAttribute('links')=='T';
var label = (refs?cmt.refslabel:cmt.linkslabel).format([count]);
createTiddlyLink(popup,title,true);
createTiddlyText(popup,label);
createTiddlyElement(popup,'hr');
if (refs) {
popup.setAttribute('tiddler',title);
config.commands.references.handlePopup(popup,title);
}
if (links) {
var tiddler = store.fetchTiddler(title);
var links=config.macros.cloud.getLinks(tiddler);
for(var i=0;i<links.length;i++)
createTiddlyLink(createTiddlyElement(popup,'li'),
links[i],true);
}
Popup.show();
e.cancelBubble=true; if(e.stopPropagation) e.stopPropagation();
return false;
}, className);
btn.setAttribute('tiddler',items[t].title);
btn.setAttribute('count',items[t].count);
btn.setAttribute('refs',refs?'T':'F');
btn.setAttribute('links',links?'T':'F');
btn.title=tip;
}
}
}
};
//}}}
Notes from @timblair http://tim.bla.ir/ are here: http://oxfordbarcamp.posterous.com/session-notes-testing-your-little-heart-out-i
[img[http://ecx.images-amazon.com/images/I/51nhWI2md8L._SL500_AA300_.jpg]]
[[Amazon|http://bit.ly/9HUerb]]
//Neel Burton//
Feeding: Make it hard for your customers to fail http://bit.ly/cs3CaP
Reading: The Art of Failure by Neel Burton http://bit.ly/9HUerb
Watching: The Art of Failure, Chip defect imagery for fevered imaginations http://bit.ly/9lkjdp (IEEE)
[img[http://bks6.books.google.co.uk/books?id=j6z-MiUKgosC&printsec=frontcover&img=1&zoom=5&edge=curl&sig=ACfU3U2P5yzb4rFewJQvnw6Ng23I0Kp21Q]] [[Google Books|http://books.google.co.uk/books?id=j6z-MiUKgosC&printsec=frontcover]]
//Thomas H. Davenport, John C. Beck - 2001 - Harvard University Press//
Since picking this up at the bookshop in Stanford last week this book hasn't been far from mind. After reading a chapter or two I find two things:
a) It's densely written, packed full of ideas - and badly in need of an update
b) I have a really hard time concentrating on reading - ideas generate thoughts which I immediately want to put into motion, as they neatly fit into the crossing of my career goals (collaboration tools) and personal aims (mindfulness).
! Links
http://en.wikipedia.org/wiki/Attention_economy
http://www.readwriteweb.com/archives/attention_economy_overview.php
http://ihatemornings.com
* Couldn't register for his own concert.. web site offline as long as a real person was not sitting at the till (!)
* Broadcasting a concert live on the Internet? Let's stay at home then. NOT!
* How to reach out to the community? North Oxford moms: disposable capital, would go down to the theatre, ...
* How do we find music? http://last.fm - radio - [[YouTube|http://www.youtube.com]] - [[the perceptron|http://theperceptron.com/]]
* The music industry is selling nostalgia -- everything new is streamed?
* [[We-Think|http://www.wethinkthebook.net]] - a book on the power of mass creativity
!! Thoughts
* Imposing into the physical space, bridging the gap, helping the traditional space make the leap
* Ben is very much on the line between geek space and real world, and not only makes astute observations of the size of the gap - he is looking for musical ways to cross barrier (with much humor and wit)!
[[Osmosoft|http://www.osmosoft.com]]'s innovative open source Wiki runs in almost any Web browser with servers optional. You're looking at one now!
For more info and to get your own, visit http://www.tiddlywiki.com
If you happen to run Confluence, check out my [[Confluence TiddlyWiki plugin]].
http://transfersummit.com/programme (some keynotes have slides attached)
http://transfersummit.com/live
!Day 1
StevenPemberton
AndrewFennell
MarkTaylor
MatthewLangham
PaulFremantle
SimonPhipps
!Day 2
RolandHarwood
AndrewSavory
MatthiasStuermer
PhilAndrews
ScottWilson
JustinErenkrantz
AndrewKatz
SamuelKlein
!Tweets
SteveALee: RT @webmink @doclorraine #TS10 had excellent atmosphere, great delegates and a fine lineup of speakers.Ross has a success on his hands
[[@ShamalFaily|http://twitter.com/ShamalFaily/statuses/16917830497]] [product] design thinking is nice, but how does this scale to Open Source development? Aren't these values potentially unknown? #ts10
[[@J_JKMi|http://twitter.com/J_JKMi/statuses/17000531925]] "If you want to go fast, go alone, if you want to go far, go together" #ts10 #kmiou communication & collaboration are key!
[[@osswatch|http://twitter.com/osswatch/statuses/17021533298]] Samuel Klein has one of the new OLPC XO's that also run #GNOME - http://is.gd/d3FAX #opensource #TS10
@silentpenguin: Good to see mobile topics at #TS10, showing how well it fits with open source. Good space to be in @indiginox :)
@Open_Sourcing: #TS10 RT @OSBR @michaelweissca Benefits of open sourcing most of ur code @bdelacretaz Why we open source most of our code http://ht.ly/23roO
@rgardler: RT @noirins FF #TS10: @TransferSummit (news), @gagravarr (BarCamp), @hyrumwright/@scottbw/@bdelacretaz (commentary), @9600/@honline (press)
@sandervdwaal: The slides are online from a very interesting presentation of David Woollard of NASA http://transfersummit.com/programme/62
@matatk: Just learnt about the community empowerment afforded by Wikipedia and met an XO (OLPC) :-). Curious wrt its #a11y @TransferSummit
@interlinux: TransferSummit/UK 2010 – a blogged impression http://bit.ly/cBxXhX
@loleg: Stoked that @metasj made it here today to talk about the human and tech sides of Wikimedia
@osswatch: Samuel Klein has one of the new OLPC XO's that also run #GNOME - http://is.gd/d3FAX
@TransferSummit: samuel klein: finesse bottlenecks - give to people who care
@mberry: In my final session at the excellent #ts10, hearing about Sakai and the joys of having academic computer scientists as developers
@sandervdwaal: The slides from @mza 's session on Amazon are online now http://transfersummit.com/node/74
@AlanF_KMi: #TS10 find licenses in your source code with FOSSology at http://bit.ly/9UaWOF
@9600 You can't protect cola or cake recipes with copyleft, because making cola or cake doesn't require rights, says @andrewjskatz
@TransferSummit: Andrew Katz kicking off on the disruptive effect of open source on many industries
@TransferSummit: open source engagement - not a fee lunch - do mobile operators understand the cost of just using and forking compared to engagement?
@mberry: Matt Wood of Amazon at #ts10: Animoto scaled from 30 to 3000 EC2 'servers' in 24 hours.
@J_JKMi: Discussing the delicate balance of keeping the customer, the community and the shareholder happy #red hat #ts10
@gklyne Maslo's hierarchy for developers: code - idea - wifi - AC power - food/caffein
@loleg: Phil Andrews gives detailed insight into how #RedHat takes #FOSS from R&D idea to enterprise ready
@heiseonlineuk: Nokia N-series devices to drop Symbian in favour of MeeGo http://h-online.com/-1029099
@J_JKMi ..."network becomes more important then trade secrets" Ari Jaaksi /via talk by @maemst
@gklyne: many core skills for productivity in collaborative s/w dev environment are not taught in (many) software courses
@mberry: @scottbw at #ts10 says computing courses don't generally cover writing developer documentation, or providing mentoring and peer support.
@matthewlee11 @TransferSummit sucsessful innovation is related to freedom of staff to investigate new technology #TS10
@honlinenews: TechDis Accessibility Toolbar demoed at TransferSummit http://h-online.com/-1028981
@matthewlee11 @TransferSummit open source is about buying into a process
@rolandhardwood - talking about Virgin customers knowing more about the business than company staff
@gklyne: Diversity in an organization, necessary for survival in a connected world?
@SaraAllison: Great quote #TS10 "You don't own your reputation. It lives and breathes in those that interact with you" (Ron Burt)
@RusNewman "If you're planning on limiting your customer's freedoms, you can't go open source". Nice one-liner for those who don't understand it.
@gklyne: For the second time today, I'm hearing about how "doing open source" is similar to participating in open standards dev, esp. IETF
@TransferSummit Usability is not the theme; dismissing the canard that open source fails at usability is the theme. #TS10
@storming "You can't get usability right if you don't use the product yourself." -@pzfreo >> is usability a #TS10 meme
@loleg: Rowan Wilson leads a poignant discussion and takes on many uncomfortable questions on © and patents http://twitpic.com/1zi9kj #TS10
@maemst "It's important that devs are aware of the licenses of in-bound assets within their OSS project - code, icons, design..." @rtsrowan at #ts10
@gklyne: For me the subtext of Mark Taylor's talk is not "we don't know", but "anything you want it to be (if you're creative enough)"
@honline: Apache mentoring is a broader approach for dev/docs etc, but narrower (apache projects only) #ts10
@jamiedsmith: "...the point of opensource is that it benefits the consumer, (not the producer)..." @Mark_Antony at #TS10
@gklyne: "Community is distinct from business purpose" in some models - echos of discussion from previous session? Cathedral and bazaar? #ts10
@savs @stormy "try to make default smart choices for the user": nice counterpoint to pemberton's keynote. OS usability bad rep needs to die.
@honline: Now at the community development session at #ts10 "developing open source is like building a sandcastle"
@gklyne: exploring spectrum of openness in business around hardware, software and services. So what is being charged for?
@TransferSummit: Mark Taylor kicks off his OS business models talk in the innovation track in usual relax and entertaining style
@loleg: @stevenpemberton takes us from the Age of Sail to the disruptive future of FOSS, the urgency for usability and pluggability #TS10
@maemst: to Andrew Fennel at #ts10: Note that open innovation is about using (=free-riding) of external knowledge, not about knowledge revealing
@gklyne: Steven asks: Is open source a disruptive technology? I ask: is open source a *technology*? #ts10
@heiseonlineuk: TransferSummit - How open changes everything http://h-online.com/-1026089
@osswatch: New Blog: Why TransferSummit appeals to a broad audience http://ow.ly/17PAlz
!Links
http://www.flickr.com/photos/webmink/4732715052/
http://jroller.com/TedHusted/entry/prim
http://www.opencastproject.org/project/matterhorn
http://www.educause.edu/Community/MemDir/Profiles/OlafASchulte/62738
http://www.guykawasaki.com/books/rules.shtml
http://incubator.apache.org/learn/rules-for-revolutionaries.html
http://jroller.com/TedHusted/entry/prim
http://en.wikipedia.org/wiki/Apache_License
http://mail-archives.apache.org/mod_mbox/roller-dev/201005.mbox/browser
http://producingoss.com/
http://www.hawthornlandings.org/2009/03/getting-started-in-open-source-you-dont.html
http://wiki.laptop.org/go/WikiBrowse
http://www.mediawiki.org/wiki/Dedicated_Wikipedia_editor
http://wiki.semantifi.com/index.php/App_Ideas
http://www.liip.ch/
http://carrierdetect.com/
http://www.ch-open.ch/
http://reprap.org/wiki/Main_Page
http://groups.google.com/group/barcamp-oxford/browse_thread/thread/92b540c047c089bd?pli=1
https://mozillalabs.com/raindrop
I sat down with [[Andy Yates]] from ThoughtWorks (one of the main sponsors of QCon) who was kind enough to give me an in-depth tour of their latest products for collaboration in development projects. This being the company that defines Agile and creates universally acclaimed software like CruiseControl, their sleek new apps drew my attention and I was not disappointed.
Twist is "//the// next generation of software test automation tools" (my emphasis). It allows business members of the project to add user stories and functional documentation directly into the project through an Eclipse plugin which packages a surprisingly intuitive UI with a powerful Domain Specific Language (DSL) processor. By integrating this with Selenium's testing framework, they're demonstrating a fast, interactive process whereby product testing can be developed and refactored in a very powerful way.
DSL's have already become a sturdy bridge between design and development on big projects, but this brings test driven analysis and development very close together that may just "twist" projects in a whole new way.
Twist is still in beta and can be trialled here: http://studios.thoughtworks.com/twist
Since I haven't seen Mingle 2 yet, Andy also gave me a tour of this project management app for software teams. It is incredibly flexible and can be tailored not only to any kind of project, but to almost any kind of project management style. It seemed like a powerful, slick, and mature product, but for me it just wasn't of that much interest since I simply don't have that much interest in project management. He couldn't show me the Subversion integration, so maybe I'll have to come back to this later and check out the developer tools: http://studios.thoughtworks.com/mingle-project-intelligence
/***
|''Name:''|UploadPlugin|
|''Description:''|Save to web a TiddlyWiki|
|''Version:''|4.1.4|
|''Date:''|2008-08-11|
|''Source:''|http://tiddlywiki.bidix.info/#UploadPlugin|
|''Documentation:''|http://tiddlywiki.bidix.info/#UploadPluginDoc|
|''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|
|''Requires:''|PasswordOptionPlugin|
***/
//{{{
version.extensions.UploadPlugin = {
major: 4, minor: 1, revision: 4,
date: new Date("2008-08-11"),
source: 'http://tiddlywiki.bidix.info/#UploadPlugin',
author: 'BidiX (BidiX (at) bidix (dot) info',
coreVersion: '2.2.0'
};
//
// Environment
//
if (!window.bidix) window.bidix = {}; // bidix namespace
bidix.debugMode = false; // true to activate both in Plugin and UploadService
//
// Upload Macro
//
config.macros.upload = {
// default values
defaultBackupDir: '', //no backup
defaultStoreScript: "store.php",
defaultToFilename: "index.html",
defaultUploadDir: ".",
authenticateUser: true // UploadService Authenticate User
};
config.macros.upload.label = {
promptOption: "Save and Upload this TiddlyWiki with UploadOptions",
promptParamMacro: "Save and Upload this TiddlyWiki in %0",
saveLabel: "save to web",
saveToDisk: "save to disk",
uploadLabel: "upload"
};
config.macros.upload.messages = {
noStoreUrl: "No store URL in parmeters or options",
usernameOrPasswordMissing: "Username or password missing"
};
config.macros.upload.handler = function(place,macroName,params) {
if (readOnly)
return;
var label;
if (document.location.toString().substr(0,4) == "http")
label = this.label.saveLabel;
else
label = this.label.uploadLabel;
var prompt;
if (params[0]) {
prompt = this.label.promptParamMacro.toString().format([this.destFile(params[0],
(params[1] ? params[1]:bidix.basename(window.location.toString())), params[3])]);
} else {
prompt = this.label.promptOption;
}
createTiddlyButton(place, label, prompt, function() {config.macros.upload.action(params);}, null, null, this.accessKey);
};
config.macros.upload.action = function(params)
{
// for missing macro parameter set value from options
if (!params) params = {};
var storeUrl = params[0] ? params[0] : config.options.txtUploadStoreUrl;
var toFilename = params[1] ? params[1] : config.options.txtUploadFilename;
var backupDir = params[2] ? params[2] : config.options.txtUploadBackupDir;
var uploadDir = params[3] ? params[3] : config.options.txtUploadDir;
var username = params[4] ? params[4] : config.options.txtUploadUserName;
var password = config.options.pasUploadPassword; // for security reason no password as macro parameter
// for still missing parameter set default value
if ((!storeUrl) && (document.location.toString().substr(0,4) == "http"))
storeUrl = bidix.dirname(document.location.toString())+'/'+config.macros.upload.defaultStoreScript;
if (storeUrl.substr(0,4) != "http")
storeUrl = bidix.dirname(document.location.toString()) +'/'+ storeUrl;
if (!toFilename)
toFilename = bidix.basename(window.location.toString());
if (!toFilename)
toFilename = config.macros.upload.defaultToFilename;
if (!uploadDir)
uploadDir = config.macros.upload.defaultUploadDir;
if (!backupDir)
backupDir = config.macros.upload.defaultBackupDir;
// report error if still missing
if (!storeUrl) {
alert(config.macros.upload.messages.noStoreUrl);
clearMessage();
return false;
}
if (config.macros.upload.authenticateUser && (!username || !password)) {
alert(config.macros.upload.messages.usernameOrPasswordMissing);
clearMessage();
return false;
}
bidix.upload.uploadChanges(false,null,storeUrl, toFilename, uploadDir, backupDir, username, password);
return false;
};
config.macros.upload.destFile = function(storeUrl, toFilename, uploadDir)
{
if (!storeUrl)
return null;
var dest = bidix.dirname(storeUrl);
if (uploadDir && uploadDir != '.')
dest = dest + '/' + uploadDir;
dest = dest + '/' + toFilename;
return dest;
};
//
// uploadOptions Macro
//
config.macros.uploadOptions = {
handler: function(place,macroName,params) {
var wizard = new Wizard();
wizard.createWizard(place,this.wizardTitle);
wizard.addStep(this.step1Title,this.step1Html);
var markList = wizard.getElement("markList");
var listWrapper = document.createElement("div");
markList.parentNode.insertBefore(listWrapper,markList);
wizard.setValue("listWrapper",listWrapper);
this.refreshOptions(listWrapper,false);
var uploadCaption;
if (document.location.toString().substr(0,4) == "http")
uploadCaption = config.macros.upload.label.saveLabel;
else
uploadCaption = config.macros.upload.label.uploadLabel;
wizard.setButtons([
{caption: uploadCaption, tooltip: config.macros.upload.label.promptOption,
onClick: config.macros.upload.action},
{caption: this.cancelButton, tooltip: this.cancelButtonPrompt, onClick: this.onCancel}
]);
},
options: [
"txtUploadUserName",
"pasUploadPassword",
"txtUploadStoreUrl",
"txtUploadDir",
"txtUploadFilename",
"txtUploadBackupDir",
"chkUploadLog",
"txtUploadLogMaxLine"
],
refreshOptions: function(listWrapper) {
var opts = [];
for(i=0; i<this.options.length; i++) {
var opt = {};
opts.push();
opt.option = "";
n = this.options[i];
opt.name = n;
opt.lowlight = !config.optionsDesc[n];
opt.description = opt.lowlight ? this.unknownDescription : config.optionsDesc[n];
opts.push(opt);
}
var listview = ListView.create(listWrapper,opts,this.listViewTemplate);
for(n=0; n<opts.length; n++) {
var type = opts[n].name.substr(0,3);
var h = config.macros.option.types[type];
if (h && h.create) {
h.create(opts[n].colElements['option'],type,opts[n].name,opts[n].name,"no");
}
}
},
onCancel: function(e)
{
backstage.switchTab(null);
return false;
},
wizardTitle: "Upload with options",
step1Title: "These options are saved in cookies in your browser",
step1Html: "<input type='hidden' name='markList'></input><br>",
cancelButton: "Cancel",
cancelButtonPrompt: "Cancel prompt",
listViewTemplate: {
columns: [
{name: 'Description', field: 'description', title: "Description", type: 'WikiText'},
{name: 'Option', field: 'option', title: "Option", type: 'String'},
{name: 'Name', field: 'name', title: "Name", type: 'String'}
],
rowClasses: [
{className: 'lowlight', field: 'lowlight'}
]}
};
//
// upload functions
//
if (!bidix.upload) bidix.upload = {};
if (!bidix.upload.messages) bidix.upload.messages = {
//from saving
invalidFileError: "The original file '%0' does not appear to be a valid TiddlyWiki",
backupSaved: "Backup saved",
backupFailed: "Failed to upload backup file",
rssSaved: "RSS feed uploaded",
rssFailed: "Failed to upload RSS feed file",
emptySaved: "Empty template uploaded",
emptyFailed: "Failed to upload empty template file",
mainSaved: "Main TiddlyWiki file uploaded",
mainFailed: "Failed to upload main TiddlyWiki file. Your changes have not been saved",
//specific upload
loadOriginalHttpPostError: "Can't get original file",
aboutToSaveOnHttpPost: 'About to upload on %0 ...',
storePhpNotFound: "The store script '%0' was not found."
};
bidix.upload.uploadChanges = function(onlyIfDirty,tiddlers,storeUrl,toFilename,uploadDir,backupDir,username,password)
{
var callback = function(status,uploadParams,original,url,xhr) {
if (!status) {
displayMessage(bidix.upload.messages.loadOriginalHttpPostError);
return;
}
if (bidix.debugMode)
alert(original.substr(0,500)+"\n...");
// Locate the storeArea div's
var posDiv = locateStoreArea(original);
if((posDiv[0] == -1) || (posDiv[1] == -1)) {
alert(config.messages.invalidFileError.format([localPath]));
return;
}
bidix.upload.uploadRss(uploadParams,original,posDiv);
};
if(onlyIfDirty && !store.isDirty())
return;
clearMessage();
// save on localdisk ?
if (document.location.toString().substr(0,4) == "file") {
var path = document.location.toString();
var localPath = getLocalPath(path);
saveChanges();
}
// get original
var uploadParams = new Array(storeUrl,toFilename,uploadDir,backupDir,username,password);
var originalPath = document.location.toString();
// If url is a directory : add index.html
if (originalPath.charAt(originalPath.length-1) == "/")
originalPath = originalPath + "index.html";
var dest = config.macros.upload.destFile(storeUrl,toFilename,uploadDir);
var log = new bidix.UploadLog();
log.startUpload(storeUrl, dest, uploadDir, backupDir);
displayMessage(bidix.upload.messages.aboutToSaveOnHttpPost.format([dest]));
if (bidix.debugMode)
alert("about to execute Http - GET on "+originalPath);
var r = doHttp("GET",originalPath,null,null,username,password,callback,uploadParams,null);
if (typeof r == "string")
displayMessage(r);
return r;
};
bidix.upload.uploadRss = function(uploadParams,original,posDiv)
{
var callback = function(status,params,responseText,url,xhr) {
if(status) {
var destfile = responseText.substring(responseText.indexOf("destfile:")+9,responseText.indexOf("\n", responseText.indexOf("destfile:")));
displayMessage(bidix.upload.messages.rssSaved,bidix.dirname(url)+'/'+destfile);
bidix.upload.uploadMain(params[0],params[1],params[2]);
} else {
displayMessage(bidix.upload.messages.rssFailed);
}
};
// do uploadRss
if(config.options.chkGenerateAnRssFeed) {
var rssPath = uploadParams[1].substr(0,uploadParams[1].lastIndexOf(".")) + ".xml";
var rssUploadParams = new Array(uploadParams[0],rssPath,uploadParams[2],'',uploadParams[4],uploadParams[5]);
var rssString = generateRss();
// no UnicodeToUTF8 conversion needed when location is "file" !!!
if (document.location.toString().substr(0,4) != "file")
rssString = convertUnicodeToUTF8(rssString);
bidix.upload.httpUpload(rssUploadParams,rssString,callback,Array(uploadParams,original,posDiv));
} else {
bidix.upload.uploadMain(uploadParams,original,posDiv);
}
};
bidix.upload.uploadMain = function(uploadParams,original,posDiv)
{
var callback = function(status,params,responseText,url,xhr) {
var log = new bidix.UploadLog();
if(status) {
// if backupDir specified
if ((params[3]) && (responseText.indexOf("backupfile:") > -1)) {
var backupfile = responseText.substring(responseText.indexOf("backupfile:")+11,responseText.indexOf("\n", responseText.indexOf("backupfile:")));
displayMessage(bidix.upload.messages.backupSaved,bidix.dirname(url)+'/'+backupfile);
}
var destfile = responseText.substring(responseText.indexOf("destfile:")+9,responseText.indexOf("\n", responseText.indexOf("destfile:")));
displayMessage(bidix.upload.messages.mainSaved,bidix.dirname(url)+'/'+destfile);
store.setDirty(false);
log.endUpload("ok");
} else {
alert(bidix.upload.messages.mainFailed);
displayMessage(bidix.upload.messages.mainFailed);
log.endUpload("failed");
}
};
// do uploadMain
var revised = bidix.upload.updateOriginal(original,posDiv);
bidix.upload.httpUpload(uploadParams,revised,callback,uploadParams);
};
bidix.upload.httpUpload = function(uploadParams,data,callback,params)
{
var localCallback = function(status,params,responseText,url,xhr) {
url = (url.indexOf("nocache=") < 0 ? url : url.substring(0,url.indexOf("nocache=")-1));
if (xhr.status == 404)
alert(bidix.upload.messages.storePhpNotFound.format([url]));
if ((bidix.debugMode) || (responseText.indexOf("Debug mode") >= 0 )) {
alert(responseText);
if (responseText.indexOf("Debug mode") >= 0 )
responseText = responseText.substring(responseText.indexOf("\n\n")+2);
} else if (responseText.charAt(0) != '0')
alert(responseText);
if (responseText.charAt(0) != '0')
status = null;
callback(status,params,responseText,url,xhr);
};
// do httpUpload
var boundary = "---------------------------"+"AaB03x";
var uploadFormName = "UploadPlugin";
// compose headers data
var sheader = "";
sheader += "--" + boundary + "\r\nContent-disposition: form-data; name=\"";
sheader += uploadFormName +"\"\r\n\r\n";
sheader += "backupDir="+uploadParams[3] +
";user=" + uploadParams[4] +
";password=" + uploadParams[5] +
";uploaddir=" + uploadParams[2];
if (bidix.debugMode)
sheader += ";debug=1";
sheader += ";;\r\n";
sheader += "\r\n" + "--" + boundary + "\r\n";
sheader += "Content-disposition: form-data; name=\"userfile\"; filename=\""+uploadParams[1]+"\"\r\n";
sheader += "Content-Type: text/html;charset=UTF-8" + "\r\n";
sheader += "Content-Length: " + data.length + "\r\n\r\n";
// compose trailer data
var strailer = new String();
strailer = "\r\n--" + boundary + "--\r\n";
data = sheader + data + strailer;
if (bidix.debugMode) alert("about to execute Http - POST on "+uploadParams[0]+"\n with \n"+data.substr(0,500)+ " ... ");
var r = doHttp("POST",uploadParams[0],data,"multipart/form-data; ;charset=UTF-8; boundary="+boundary,uploadParams[4],uploadParams[5],localCallback,params,null);
if (typeof r == "string")
displayMessage(r);
return r;
};
// same as Saving's updateOriginal but without convertUnicodeToUTF8 calls
bidix.upload.updateOriginal = function(original, posDiv)
{
if (!posDiv)
posDiv = locateStoreArea(original);
if((posDiv[0] == -1) || (posDiv[1] == -1)) {
alert(config.messages.invalidFileError.format([localPath]));
return;
}
var revised = original.substr(0,posDiv[0] + startSaveArea.length) + "\n" +
store.allTiddlersAsHtml() + "\n" +
original.substr(posDiv[1]);
var newSiteTitle = getPageTitle().htmlEncode();
revised = revised.replaceChunk("<title"+">","</title"+">"," " + newSiteTitle + " ");
revised = updateMarkupBlock(revised,"PRE-HEAD","MarkupPreHead");
revised = updateMarkupBlock(revised,"POST-HEAD","MarkupPostHead");
revised = updateMarkupBlock(revised,"PRE-BODY","MarkupPreBody");
revised = updateMarkupBlock(revised,"POST-SCRIPT","MarkupPostBody");
return revised;
};
//
// UploadLog
//
// config.options.chkUploadLog :
// false : no logging
// true : logging
// config.options.txtUploadLogMaxLine :
// -1 : no limit
// 0 : no Log lines but UploadLog is still in place
// n : the last n lines are only kept
// NaN : no limit (-1)
bidix.UploadLog = function() {
if (!config.options.chkUploadLog)
return; // this.tiddler = null
this.tiddler = store.getTiddler("UploadLog");
if (!this.tiddler) {
this.tiddler = new Tiddler();
this.tiddler.title = "UploadLog";
this.tiddler.text = "| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |";
this.tiddler.created = new Date();
this.tiddler.modifier = config.options.txtUserName;
this.tiddler.modified = new Date();
store.addTiddler(this.tiddler);
}
return this;
};
bidix.UploadLog.prototype.addText = function(text) {
if (!this.tiddler)
return;
// retrieve maxLine when we need it
var maxLine = parseInt(config.options.txtUploadLogMaxLine,10);
if (isNaN(maxLine))
maxLine = -1;
// add text
if (maxLine != 0)
this.tiddler.text = this.tiddler.text + text;
// Trunck to maxLine
if (maxLine >= 0) {
var textArray = this.tiddler.text.split('\n');
if (textArray.length > maxLine + 1)
textArray.splice(1,textArray.length-1-maxLine);
this.tiddler.text = textArray.join('\n');
}
// update tiddler fields
this.tiddler.modifier = config.options.txtUserName;
this.tiddler.modified = new Date();
store.addTiddler(this.tiddler);
// refresh and notifiy for immediate update
story.refreshTiddler(this.tiddler.title);
store.notify(this.tiddler.title, true);
};
bidix.UploadLog.prototype.startUpload = function(storeUrl, toFilename, uploadDir, backupDir) {
if (!this.tiddler)
return;
var now = new Date();
var text = "\n| ";
var filename = bidix.basename(document.location.toString());
if (!filename) filename = '/';
text += now.formatString("0DD/0MM/YYYY 0hh:0mm:0ss") +" | ";
text += config.options.txtUserName + " | ";
text += "[["+filename+"|"+location + "]] |";
text += " [[" + bidix.basename(storeUrl) + "|" + storeUrl + "]] | ";
text += uploadDir + " | ";
text += "[[" + bidix.basename(toFilename) + " | " +toFilename + "]] | ";
text += backupDir + " |";
this.addText(text);
};
bidix.UploadLog.prototype.endUpload = function(status) {
if (!this.tiddler)
return;
this.addText(" "+status+" |");
};
//
// Utilities
//
bidix.checkPlugin = function(plugin, major, minor, revision) {
var ext = version.extensions[plugin];
if (!
(ext &&
((ext.major > major) ||
((ext.major == major) && (ext.minor > minor)) ||
((ext.major == major) && (ext.minor == minor) && (ext.revision >= revision))))) {
// write error in PluginManager
if (pluginInfo)
pluginInfo.log.push("Requires " + plugin + " " + major + "." + minor + "." + revision);
eval(plugin); // generate an error : "Error: ReferenceError: xxxx is not defined"
}
};
bidix.dirname = function(filePath) {
if (!filePath)
return;
var lastpos;
if ((lastpos = filePath.lastIndexOf("/")) != -1) {
return filePath.substring(0, lastpos);
} else {
return filePath.substring(0, filePath.lastIndexOf("\\"));
}
};
bidix.basename = function(filePath) {
if (!filePath)
return;
var lastpos;
if ((lastpos = filePath.lastIndexOf("#")) != -1)
filePath = filePath.substring(0, lastpos);
if ((lastpos = filePath.lastIndexOf("/")) != -1) {
return filePath.substring(lastpos + 1);
} else
return filePath.substring(filePath.lastIndexOf("\\")+1);
};
bidix.initOption = function(name,value) {
if (!config.options[name])
config.options[name] = value;
};
//
// Initializations
//
// require PasswordOptionPlugin 1.0.1 or better
bidix.checkPlugin("PasswordOptionPlugin", 1, 0, 1);
// styleSheet
setStylesheet('.txtUploadStoreUrl, .txtUploadBackupDir, .txtUploadDir {width: 22em;}',"uploadPluginStyles");
//optionsDesc
merge(config.optionsDesc,{
txtUploadStoreUrl: "Url of the UploadService script (default: store.php)",
txtUploadFilename: "Filename of the uploaded file (default: in index.html)",
txtUploadDir: "Relative Directory where to store the file (default: . (downloadService directory))",
txtUploadBackupDir: "Relative Directory where to backup the file. If empty no backup. (default: ''(empty))",
txtUploadUserName: "Upload Username",
pasUploadPassword: "Upload Password",
chkUploadLog: "do Logging in UploadLog (default: true)",
txtUploadLogMaxLine: "Maximum of lines in UploadLog (default: 10)"
});
// Options Initializations
bidix.initOption('txtUploadStoreUrl','');
bidix.initOption('txtUploadFilename','');
bidix.initOption('txtUploadDir','');
bidix.initOption('txtUploadBackupDir','');
bidix.initOption('txtUploadUserName','');
bidix.initOption('pasUploadPassword','');
bidix.initOption('chkUploadLog',true);
bidix.initOption('txtUploadLogMaxLine','10');
// Backstage
merge(config.tasks,{
uploadOptions: {text: "upload", tooltip: "Change UploadOptions and Upload", content: '<<uploadOptions>>'}
});
config.backstageTasks.push("uploadOptions");
//}}}
http://wiki.laptop.org/go/WikiBrowse
Developed by a commercial company
One laptop per child
100'000 families using Wikipedia offline in Peruvian Amazon
Parsers API were available and ''mwlib'' was created
Offline editor
OpenMoko Wiki reader (open hardware + software + content!)
Some think that grassroots is best - especially when it comes to such a flexible and addictive tool as the wiki. Started by StewartMader as a collection of patterns and anti-patterns (borrowed from software design), it has grown into a community of adopters, and was recently published as a book.
Visit their site if you are using wikis in any way, and still wish to keep your sanity for years to come.
http://www.wikipatterns.com
The Wiki Patterns book:
http://www.amazon.com/Wikipatterns-Stewart-Mader/dp/0470223626/ref=bxgy_cc_b_img_b
This is a standard for data exchange. It's somewhat inferior to SOAP, or so [[they|http://weblog.masukomi.org/writings/xml-rpc_vs_soap.htm]] [[claim|http://effbot.org/zone/rest-vs-rpc.htm]]. Many wish to delight in RESTful abandon. Others proclaim JSON as the new King.
Frankly, it's all just packages of data sent to-and-fro, and I don't expect to have to spend too much time worrying about the wrapping. If you want to take it to a whole new level and call it an art? Please do. Go get inspired: http://furoshiki.com/
A language designed for describing operations to be performed on XML documents
http://xproc.org/
Very wikiable name.
Now where is my built-in spell checker to tell me off?
<html>
<!--
Author: Cezary Tomczak
Adapted as TiddlyWiki plugin by Oleg Lavrovsky
Installation:
- copy this tiddler, jsTetris, and the bottom
part of the StyleSheet into your TiddlyWiki
-->
<div id="tetris">
<div class="left">
<h1><a href="http://www.gosu.pl/tetris/">Js Tetris 1.17</a></h1>
<div class="menu">
<div><a href="javascript:void(0)" id="tetris-menu-start">New Game</a></div>
<div><a href="javascript:void(0)" id="tetris-menu-reset">Reset</a></div>
<div><a href="javascript:void(0)" id="tetris-menu-highscores">Highscores</a></div>
<div><a href="javascript:void(0)" id="tetris-menu-help">About</a></div>
</div>
<div id="tetris-keys"></div>
<div id="tetris-nextpuzzle"></div>
<div id="tetris-gameover">Game Over</div>
<div class="stats">
<table cellspacing="0" cellpadding="0">
<tr>
<td class="level">Level:</td>
<td><span id="tetris-stats-level">1</span></td>
</tr>
<tr>
<td class="score">Score:</td>
<td><span id="tetris-stats-score">0</span></td>
</tr>
<tr>
<td class="lines">Lines:</td>
<td><span id="tetris-stats-lines">0</span></td>
</tr>
<tr>
<td class="apm">APM:</td>
<td><span id="tetris-stats-apm">0</span></td>
</tr>
<tr>
<td class="time">Time:</td>
<td><span id="tetris-stats-time">0</span></td>
</tr>
</table>
</div>
</div>
<div class="left-border"></div>
<div id="tetris-area">
<div class="grid1"></div>
<div class="grid2"></div>
<div class="grid3"></div>
<div class="grid4"></div>
<div class="grid5"></div>
<div class="grid6"></div>
</div>
<div id="tetris-help" class="window">
<div class="top">
About <span id="tetris-help-close" class="close">x</span>
</div>
<div class="content" style="margin-top: 1em;">
<div style="margin-top: 1em;">
<div>JsTetris is a highly customizable tetris game written in javascript,
full sources available, it is free to modify.
</div>
<br>
<div>Author: Cezary Tomczak</div>
<div>Site: <a href="http://www.gosu.pl/tetris/">www.gosu.pl/tetris/</a></div>
<br>
<div>License: BSD revised (free for any use)</div>
</div>
</div>
</div>
<div id="tetris-highscores" class="window">
<div class="top">
Highscores <span id="tetris-highscores-close" class="close">x</span>
</div>
<div class="content">
<div id="tetris-highscores-content"></div>
<br>
Note: these scores are kept in cookies, they are only visible to your computer.
</div>
</div>
</div>
</html>
<<jsTetris>>
//{{{
config.macros.jsTetris = {
handler: function (place, macroName, params, wikifier, paramString, tiddler)
{
var tetris = new Tetris();
tetris.unit = 14;
tetris.areaX = 12;
tetris.areaY = 22;
// minified with Rhino shrinksafe (from 60 KB to 15 KB)
function Tetris() {
var self=this;
this.stats=new Stats();
this.puzzle=null;
this.area=null;
this.unit=20;
this.areaX=20;
this.areaY=20;
this.highscores=new Highscores(10);
this.start=function(){
self.reset();
self.stats.start();
document.getElementById("tetris-nextpuzzle").style.display="block";
document.getElementById("tetris-keys").style.display="none";
self.area=new Area(self.unit,self.areaX,self.areaY,"tetris-area");
self.puzzle=new Puzzle(self,self.area);
if(self.puzzle.mayPlace()){
self.puzzle.place();
}else{
self.gameOver();
}
};
this.reset=function(){
if(self.puzzle){
self.puzzle.destroy();
self.puzzle=null;
}
if(self.area){
self.area.destroy();
self.area=null;
}
document.getElementById("tetris-gameover").style.display="none";
document.getElementById("tetris-nextpuzzle").style.display="none";
document.getElementById("tetris-keys").style.display="block";
self.stats.reset();
};
this.gameOver=function(){
self.stats.stop();
self.puzzle.stop();
document.getElementById("tetris-nextpuzzle").style.display="none";
document.getElementById("tetris-gameover").style.display="block";
if(this.highscores.mayAdd(this.stats.getScore())){
var _1=prompt("Game Over !\nEnter your name:","");
if(_1&&_1.trim().length){
this.highscores.add(_1,this.stats.getScore());
}
}
};
this.up=function(){
if(self.puzzle&&self.puzzle.isRunning()&&!self.puzzle.isStopped()){
if(self.puzzle.mayRotate()){
self.puzzle.rotate();
self.stats.setActions(self.stats.getActions()+1);
}
}
};
this.down=function(){
if(self.puzzle&&self.puzzle.isRunning()&&!self.puzzle.isStopped()){
if(self.puzzle.mayMoveDown()){
self.stats.setScore(self.stats.getScore()+5+self.stats.getLevel());
self.puzzle.moveDown();
self.stats.setActions(self.stats.getActions()+1);
}
}
};
this.left=function(){
if(self.puzzle&&self.puzzle.isRunning()&&!self.puzzle.isStopped()){
if(self.puzzle.mayMoveLeft()){
self.puzzle.moveLeft();
self.stats.setActions(self.stats.getActions()+1);
}
}
};
this.right=function(){
if(self.puzzle&&self.puzzle.isRunning()&&!self.puzzle.isStopped()){
if(self.puzzle.mayMoveRight()){
self.puzzle.moveRight();
self.stats.setActions(self.stats.getActions()+1);
}
}
};
this.space=function(){
if(self.puzzle&&self.puzzle.isRunning()&&!self.puzzle.isStopped()){
self.puzzle.stop();
self.puzzle.forceMoveDown();
}
};
var helpwindow=new Window("tetris-help");
var highscores=new Window("tetris-highscores");
document.getElementById("tetris-menu-start").onclick=function(){
helpwindow.close();
highscores.close();
self.start();
this.blur();
};
document.getElementById("tetris-menu-reset").onclick=function(){
helpwindow.close();
highscores.close();
self.reset();
this.blur();
};
document.getElementById("tetris-menu-help").onclick=function(){
highscores.close();
helpwindow.activate();
this.blur();
};
document.getElementById("tetris-help-close").onclick=helpwindow.close;
document.getElementById("tetris-menu-highscores").onclick=function(){
helpwindow.close();
document.getElementById("tetris-highscores-content").innerHTML=self.highscores.toHtml();
highscores.activate();
this.blur();
};
document.getElementById("tetris-highscores-close").onclick=highscores.close;
var keyboard=new Keyboard();
keyboard.set(keyboard.n,this.start);
keyboard.set(keyboard.r,this.reset);
keyboard.set(keyboard.up,this.up);
keyboard.set(keyboard.down,this.down);
keyboard.set(keyboard.left,this.left);
keyboard.set(keyboard.right,this.right);
keyboard.set(keyboard.space,this.space);
document.onkeydown=keyboard.event;
function Window(id){
this.id=id;
this.el=document.getElementById(this.id);
var _3=this;
this.activate=function(){
_3.el.style.display=(_3.el.style.display=="block"?"none":"block");
};
this.close=function(){
_3.el.style.display="none";
};
this.isActive=function(){
return (_3.el.style.display=="block");
};
};
function Keyboard(){
this.up=38;
this.down=40;
this.left=37;
this.right=39;
this.n=78;
this.r=82;
this.space=32;
this.f12=123;
this.escape=27;
this.keys=[];
this.funcs=[];
var _4=this;
this.set=function(_5,_6){
this.keys.push(_5);
this.funcs.push(_6);
};
this.event=function(e){
if(!e){
e=window.event;
}
for(var i=0;i<_4.keys.length;i++){
if(e.keyCode==_4.keys[i]){
_4.funcs[i]();
}
}
};
};
function Stats(){
this.level;
this.time;
this.apm;
this.lines;
this.score;
this.puzzles;
this.actions;
this.el={"level":document.getElementById("tetris-stats-level"),"time":document.getElementById("tetris-stats-time"),"apm":document.getElementById("tetris-stats-apm"),"lines":document.getElementById("tetris-stats-lines"),"score":document.getElementById("tetris-stats-score")};
this.timerId=null;
var _9=this;
this.start=function(){
story.closeAllTiddlers('jsTetris');/* close other tiddlers */
this.reset();
this.timerId=setInterval(this.incTime,1000);
};
this.stop=function(){
if(this.timerId){
clearInterval(this.timerId);
}
};
this.reset=function(){
this.stop();
this.level=1;
this.time=0;
this.apm=0;
this.lines=0;
this.score=0;
this.puzzles=0;
this.actions=0;
this.el.level.innerHTML=this.level;
this.el.time.innerHTML=this.time;
this.el.apm.innerHTML=this.apm;
this.el.lines.innerHTML=this.lines;
this.el.score.innerHTML=this.score;
};
this.incTime=function(){
_9.time++;
_9.el.time.innerHTML=_9.time;
_9.apm=parseInt((_9.actions/_9.time)*60);
_9.el.apm.innerHTML=_9.apm;
};
this.setScore=function(i){
this.score=i;
this.el.score.innerHTML=this.score;
};
this.setLevel=function(i){
this.level=i;
this.el.level.innerHTML=this.level;
};
this.setLines=function(i){
this.lines=i;
this.el.lines.innerHTML=this.lines;
};
this.setPuzzles=function(i){
this.puzzles=i;
};
this.setActions=function(i){
this.actions=i;
};
this.getScore=function(){
return this.score;
};
this.getLevel=function(){
return this.level;
};
this.getLines=function(){
return this.lines;
};
this.getPuzzles=function(){
return this.puzzles;
};
this.getActions=function(){
return this.actions;
};
};
function Area(_f,x,y,id){
this.unit=_f;
this.x=x;
this.y=y;
this.el=document.getElementById(id);
this.board=[];
for(var y=0;y<this.y;y++){
this.board.push(new Array());
for(var x=0;x<this.x;x++){
this.board[y].push(0);
}
}
this.destroy=function(){
for(var y=0;y<this.board.length;y++){
for(var x=0;x<this.board[y].length;x++){
if(this.board[y][x]){
this.el.removeChild(this.board[y][x]);
this.board[y][x]=0;
}
}
}
};
this.removeFullLines=function(){
var _15=0;
for(var y=this.y-1;y>0;y--){
if(this.isLineFull(y)){
this.removeLine(y);
_15++;
y++;
}
}
return _15;
};
this.isLineFull=function(y){
for(var x=0;x<this.x;x++){
if(!this.board[y][x]){
return false;
}
}
return true;
};
this.removeLine=function(y){
for(var x=0;x<this.x;x++){
this.el.removeChild(this.board[y][x]);
this.board[y][x]=0;
}
y--;
for(;y>0;y--){
for(var x=0;x<this.x;x++){
if(this.board[y][x]){
var el=this.board[y][x];
el.style.top=el.offsetTop+this.unit+"px";
this.board[y+1][x]=el;
this.board[y][x]=0;
}
}
}
};
this.getBlock=function(y,x){
if(y<0){
return 0;
}
if(y<this.y&&x<this.x){
return this.board[y][x];
}else{
throw "Area.getBlock("+y+",\t"+x+") failed";
}
};
this.addElement=function(el){
var x=parseInt(el.offsetLeft/this.unit);
var y=parseInt(el.offsetTop/this.unit);
if(y>=0&&y<this.y&&x>=0&&x<this.x){
this.board[y][x]=el;
}else{
}
};
};
function Puzzle(_21,_22){
var _23=this;
this.tetris=_21;
this.area=_22;
this.fallDownID=null;
this.forceMoveDownID=null;
this.type=null;
this.nextType=null;
this.position=null;
this.speed=null;
this.running=null;
this.stopped=null;
this.board=[];
this.elements=[];
this.nextElements=[];
this.x=null;
this.y=null;
this.puzzles=[[[0,0,1],[1,1,1],[0,0,0]],[[1,0,0],[1,1,1],[0,0,0]],[[0,1,1],[1,1,0],[0,0,0]],[[1,1,0],[0,1,1],[0,0,0]],[[0,1,0],[1,1,1],[0,0,0]],[[1,1],[1,1]],[[0,0,0,0],[1,1,1,1],[0,0,0,0],[0,0,0,0]]];
this.reset=function(){
if(this.fallDownID){
clearTimeout(this.fallDownID);
}
if(this.forceMoveDownID){
clearTimeout(this.forceMoveDownID);
}
this.type=this.nextType;
this.nextType=random(this.puzzles.length);
this.position=0;
this.speed=80+(700/this.tetris.stats.getLevel());
this.running=false;
this.stopped=false;
this.board=[];
this.elements=[];
for(var i=0;i<this.nextElements.length;i++){
document.getElementById("tetris-nextpuzzle").removeChild(this.nextElements[i]);
}
this.nextElements=[];
this.x=null;
this.y=null;
};
this.nextType=random(this.puzzles.length);
this.reset();
this.isRunning=function(){
return this.running;
};
this.isStopped=function(){
return this.stopped;
};
this.getX=function(){
return this.x;
};
this.getY=function(){
return this.y;
};
this.mayPlace=function(){
var _25=this.puzzles[this.type];
var _26=parseInt((this.area.x-_25[0].length)/2);
var _27=1;
var _28=false;
var _29=0;
for(var y=_25.length-1;y>=0;y--){
for(var x=0;x<_25[y].length;x++){
if(_25[y][x]){
_28=true;
if(this.area.getBlock(_27,_26+x)){
return false;
}
}
}
if(_28){
_29++;
}
if(_27-_29<0){
break;
}
}
return true;
};
this.place=function(){
this.tetris.stats.setPuzzles(this.tetris.stats.getPuzzles()+1);
if(this.tetris.stats.getPuzzles()>=(10+this.tetris.stats.getLevel()*2)){
this.tetris.stats.setLevel(this.tetris.stats.getLevel()+1);
this.tetris.stats.setPuzzles(0);
}
var _2c=this.puzzles[this.type];
var _2d=parseInt((this.area.x-_2c[0].length)/2);
var _2e=1;
var _2f=false;
var _30=0;
this.x=_2d;
this.y=1;
this.board=this.createEmptyPuzzle(_2c.length,_2c[0].length);
for(var y=_2c.length-1;y>=0;y--){
for(var x=0;x<_2c[y].length;x++){
if(_2c[y][x]){
_2f=true;
var el=document.createElement("div");
el.className="block"+this.type;
el.style.left=(_2d+x)*this.area.unit+"px";
el.style.top=(_2e-_30)*this.area.unit+"px";
this.area.el.appendChild(el);
this.board[y][x]=el;
this.elements.push(el);
}
}
if(_30){
this.y--;
}
if(_2f){
_30++;
}
}
this.running=true;
this.fallDownID=setTimeout(this.fallDown,this.speed);
var _34=this.puzzles[this.nextType];
for(var y=0;y<_34.length;y++){
for(var x=0;x<_34[y].length;x++){
if(_34[y][x]){
var el=document.createElement("div");
el.className="block"+this.nextType;
el.style.left=(x*this.area.unit)+"px";
el.style.top=(y*this.area.unit)+"px";
document.getElementById("tetris-nextpuzzle").appendChild(el);
this.nextElements.push(el);
}
}
}
};
this.destroy=function(){
for(var i=0;i<this.elements.length;i++){
this.area.el.removeChild(this.elements[i]);
}
this.elements=[];
this.board=[];
this.reset();
};
this.createEmptyPuzzle=function(y,x){
var _38=[];
for(var y2=0;y2<y;y2++){
_38.push(new Array());
for(var x2=0;x2<x;x2++){
_38[y2].push(0);
}
}
return _38;
};
this.fallDown=function(){
if(_23.isRunning()){
if(_23.mayMoveDown()){
_23.moveDown();
_23.fallDownID=setTimeout(_23.fallDown,_23.speed);
}else{
for(var i=0;i<_23.elements.length;i++){
_23.area.addElement(_23.elements[i]);
}
var _3c=_23.area.removeFullLines();
if(_3c){
_23.tetris.stats.setLines(_23.tetris.stats.getLines()+_3c);
_23.tetris.stats.setScore(_23.tetris.stats.getScore()+(1000*_23.tetris.stats.getLevel()*_3c));
}
_23.reset();
if(_23.mayPlace()){
_23.place();
}else{
_23.tetris.gameOver();
}
}
}
};
this.forceMoveDown=function(){
if(!_23.isRunning()&&!_23.isStopped()){
if(_23.mayMoveDown()){
_23.tetris.stats.setScore(_23.tetris.stats.getScore()+5+_23.tetris.stats.getLevel());
_23.tetris.stats.setActions(_23.tetris.stats.getActions()+1);
_23.moveDown();
_23.forceMoveDownID=setTimeout(_23.forceMoveDown,30);
}else{
for(var i=0;i<_23.elements.length;i++){
_23.area.addElement(_23.elements[i]);
}
var _3e=_23.area.removeFullLines();
if(_3e){
_23.tetris.stats.setLines(_23.tetris.stats.getLines()+_3e);
_23.tetris.stats.setScore(_23.tetris.stats.getScore()+(1000*_23.tetris.stats.getLevel()*_3e));
}
_23.reset();
if(_23.mayPlace()){
_23.place();
}else{
_23.tetris.gameOver();
}
}
}
};
this.stop=function(){
this.running=false;
};
this.mayRotate=function(){
for(var y=0;y<this.board.length;y++){
for(var x=0;x<this.board[y].length;x++){
if(this.board[y][x]){
var _41=this.getY()+this.board.length-1-x;
var _42=this.getX()+y;
if(_41>=this.area.y){
return false;
}
if(_42<0){
return false;
}
if(_42>=this.area.x){
return false;
}
if(this.area.getBlock(_41,_42)){
return false;
}
}
}
}
return true;
};
this.rotate=function(){
var _43=this.createEmptyPuzzle(this.board.length,this.board[0].length);
for(var y=0;y<this.board.length;y++){
for(var x=0;x<this.board[y].length;x++){
if(this.board[y][x]){
var _46=_43.length-1-x;
var _47=y;
var el=this.board[y][x];
var _49=_46-y;
var _4a=_47-x;
el.style.left=el.offsetLeft+(_4a*this.area.unit)+"px";
el.style.top=el.offsetTop+(_49*this.area.unit)+"px";
_43[_46][_47]=el;
}
}
}
this.board=_43;
};
this.mayMoveDown=function(){
for(var y=0;y<this.board.length;y++){
for(var x=0;x<this.board[y].length;x++){
if(this.board[y][x]){
if(this.getY()+y+1>=this.area.y){
this.stopped=true;
return false;
}
if(this.area.getBlock(this.getY()+y+1,this.getX()+x)){
this.stopped=true;
return false;
}
}
}
}
return true;
};
this.moveDown=function(){
for(var i=0;i<this.elements.length;i++){
this.elements[i].style.top=this.elements[i].offsetTop+this.area.unit+"px";
}
this.y++;
};
this.mayMoveLeft=function(){
for(var y=0;y<this.board.length;y++){
for(var x=0;x<this.board[y].length;x++){
if(this.board[y][x]){
if(this.getX()+x-1<0){
return false;
}
if(this.area.getBlock(this.getY()+y,this.getX()+x-1)){
return false;
}
}
}
}
return true;
};
this.moveLeft=function(){
for(var i=0;i<this.elements.length;i++){
this.elements[i].style.left=this.elements[i].offsetLeft-this.area.unit+"px";
}
this.x--;
};
this.mayMoveRight=function(){
for(var y=0;y<this.board.length;y++){
for(var x=0;x<this.board[y].length;x++){
if(this.board[y][x]){
if(this.getX()+x+1>=this.area.x){
return false;
}
if(this.area.getBlock(this.getY()+y,this.getX()+x+1)){
return false;
}
}
}
}
return true;
};
this.moveRight=function(){
for(var i=0;i<this.elements.length;i++){
this.elements[i].style.left=this.elements[i].offsetLeft+this.area.unit+"px";
}
this.x++;
};
};
function random(i){
return Math.floor(Math.random()*i);
};
function Highscores(_55){
this.maxscores=_55;
this.scores=[];
this.load=function(){
var _56=new Cookie();
var s=_56.get("tetris-highscores");
this.scores=[];
if(s.length){
var _58=s.split("|");
for(var i=0;i<_58.length;++i){
var a=_58[i].split(":");
this.scores.push(new _5b(a[0],Number(a[1])));
}
}
};
this.save=function(){
var _5c=new Cookie();
var a=[];
for(var i=0;i<this.scores.length;++i){
a.push(this.scores[i].name+":"+this.scores[i].score);
}
var s=a.join("|");
_5c.set("tetris-highscores",s,3600*24*1000);
};
this.mayAdd=function(_60){
if(this.scores.length<this.maxscores){
return true;
}
for(var i=this.scores.length-1;i>=0;--i){
if(this.scores[i].score<_60){
return true;
}
}
return false;
};
this.add=function(_62,_63){
_62=_62.replace(/[;=:|]/g,"?");
_62=_62.replace(/</g,"<").replace(/>/g,">");
if(this.scores.length<this.maxscores){
this.scores.push(new _5b(_62,_63));
}else{
for(var i=this.scores.length-1;i>=0;--i){
if(this.scores[i].score<_63){
this.scores.removeByIndex(i);
this.scores.push(new _5b(_62,_63));
break;
}
}
}
this.sort();
this.save();
};
this.getScores=function(){
return this.scores;
};
this.toHtml=function(){
var s="<table\tcellspacing=\"0\"\tcellpadding=\"2\"><tr><th></th><th>Name</th><th>Score</th></tr>";
for(var i=0;i<this.scores.length;++i){
s+="<tr><td>?.</td><td>?</td><td>?</td></tr>".format(i+1,this.scores[i].name,this.scores[i].score);
}
s+="</table>";
return s;
};
this.sort=function(){
var _67=this.scores;
var len=_67.length;
this.scores=[];
for(var i=0;i<len;++i){
var el=null,_6b=null;
for(var j=0;j<_67.length;++j){
if(!el||(_67[j].score>el.score)){
el=_67[j];
_6b=j;
}
}
_67.removeByIndex(_6b);
this.scores.push(el);
}
};
function _5b(_6d,_6e){
this.name=_6d;
this.score=_6e;
};
this.load();
};
function Cookie(){
this.get=function(_6f){
var _70=document.cookie.split(";");
for(var i=0;i<_70.length;++i){
var a=_70[i].split("=");
if(a.length==2){
a[0]=a[0].trim();
a[1]=a[1].trim();
if(a[0]==_6f){
return unescape(a[1]);
}
}
}
return "";
};
this.set=function(_73,_74,_75,_76,_77,_78){
this.del(_73);
if(!_76){
_76="/";
}
var _79=(_73+"="+escape(_74));
if(_75){
var _7a=new Date(new Date().getTime()+_75*1000);
_79+=("; expires="+_7a.toGMTString());
}
_79+=(_76?";\tpath="+_76:"");
_79+=(_77?";\tdomain="+_77:"");
_79+=(_78?";\tsecure":"");
document.cookie=_79;
};
this.del=function(_7b){
document.cookie=_7b+"=; expires=Thu, 01-Jan-70\t00:00:01 GMT";
};
};
}
// end function Tetris()
if (!String.prototype.trim) {
String.prototype.trim = function() {
return this.replace(/^\s*|\s*$/g, "");
};
}
if (!Array.prototype.removeByIndex) {
Array.prototype.removeByIndex = function(index) {
this.splice(index, 1);
};
}
if (!String.prototype.format) {
String.prototype.format = function() {
if (!arguments.length) { throw "String.format() failed, no arguments passed, this = "+this; }
var tokens = this.split("?");
if (arguments.length != (tokens.length - 1)) { throw "String.format() failed, tokens != arguments, this = "+this; }
var s = tokens[0];
for (var i = 0; i < arguments.length; ++i) {
s += (arguments[i] + tokens[i + 1]);
}
return s;
};
}
}
};
//}}}