<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
<!--}}}-->
Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
/*{{{*/
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

a {color:[[ColorPalette::PrimaryMid]];}
a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
a img {border:0;}

h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}

.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}

.header {background:[[ColorPalette::PrimaryMid]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}

.tabSelected{color:[[ColorPalette::PrimaryDark]];
	background:[[ColorPalette::TertiaryPale]];
	border-left:1px solid [[ColorPalette::TertiaryLight]];
	border-top:1px solid [[ColorPalette::TertiaryLight]];
	border-right:1px solid [[ColorPalette::TertiaryLight]];
}
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0;}

#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}

.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
	border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}

.wizard .notChanged {background:transparent;}
.wizard .changedLocally {background:#80ff80;}
.wizard .changedServer {background:#8080ff;}
.wizard .changedBoth {background:#ff8080;}
.wizard .notFound {background:#ffff80;}
.wizard .putToServer {background:#ff80ff;}
.wizard .gotFromServer {background:#80ffff;}

#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}

.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}

.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}

.tiddler .defaultCommand {font-weight:bold;}

.shadow .title {color:[[ColorPalette::TertiaryDark]];}

.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}

.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}

.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}

.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}

.sparkline {background:[[ColorPalette::PrimaryPale]]; border:0;}
.sparktick {background:[[ColorPalette::PrimaryDark]];}

.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}

.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}

.imageLink, #displayArea .imageLink {background:transparent;}

.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}

.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}

.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}

.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}

.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}

.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}

#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:'alpha(opacity:60)';}
/*}}}*/
/*{{{*/
* html .tiddler {height:1%;}

body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}

h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}

.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}

/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}

#mainMenu .tiddlyLinkExisting,
	#mainMenu .tiddlyLinkNonExisting,
	#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}

.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0em 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0em 1em 1em; left:0px; top:0px;}

.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}

#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}

#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0em 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 .3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

.wizard {padding:0.1em 1em 0em 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0em 0em 0em; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0em;}
.wizardFooter .status {padding:0em 0.4em 0em 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em 0.1em 0.2em;}

#messageArea {position:fixed; top:2em; right:0em; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
.messageToolbar {display:block; text-align:right; padding:0.2em 0.2em 0.2em 0.2em;}
#messageArea a {text-decoration:underline;}

.tiddlerPopupButton {padding:0.2em 0.2em 0.2em 0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em 1em 1em 1em; margin:0;}

.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0em;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}

.tabset {padding:1em 0em 0em 0.5em;}
.tab {margin:0em 0em 0em 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}

#contentWrapper {display:block;}
#splashScreen {display:none;}

#displayArea {margin:1em 17em 0em 14em;}

.toolbar {text-align:right; font-size:.9em;}

.tiddler {padding:1em 1em 0em 1em;}

.missing .viewer,.missing .title {font-style:italic;}

.title {font-size:1.6em; font-weight:bold;}

.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}

.tiddler .button {padding:0.2em 0.4em;}

.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}

.footer {font-size:.9em;}
.footer li {display:inline;}

.annotation {padding:0.5em; margin:0.5em;}

* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0em 0.25em; padding:0em 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}

.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0px 3px 0px 3px;}

.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}

.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0em; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

.fieldsetFix {border:0; padding:0; margin:1px 0px 1px 0px;}

.sparkline {line-height:1em;}
.sparktick {outline:0;}

.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}

* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0em; right:0em;}
#backstageButton a {padding:0.1em 0.4em 0.1em 0.4em; margin:0.1em 0.1em 0.1em 0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin:0em 3em 0em 3em; padding:1em 1em 1em 1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em 0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/***
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
***/
/*{{{*/
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none ! important;}
#displayArea {margin: 1em 1em 0em 1em;}
/* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
noscript {display:none;}
}
/*}}}*/
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser excludeLists'></span></div>
<!--}}}-->
To get started with this blank TiddlyWiki, you'll need to modify the following tiddlers:
* SiteTitle & SiteSubtitle: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* MainMenu: The menu (usually on the left)
* DefaultTiddlers: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
These InterfaceOptions for customising TiddlyWiki are saved in your browser

Your username for signing your edits. Write it as a WikiWord (eg JoeBloggs)

<<option txtUserName>>
<<option chkSaveBackups>> SaveBackups
<<option chkAutoSave>> AutoSave
<<option chkRegExpSearch>> RegExpSearch
<<option chkCaseSensitiveSearch>> CaseSensitiveSearch
<<option chkAnimate>> EnableAnimations

----
Also see [[AdvancedOptions]]
<<importTiddlers>>
#[[RepRap wiki|http://ru.wikipedia.org/wiki/RepRap]]
#[[RepRap 3D принтер Gen X|http://skb-kiparis.ru/products]]
#[[3D принтер Люмен|http://cnc.maket-city.ru/index.php/shop/oborudovanie]]
#[[3DPrintoPedia|http://wiki.livelyminds.ru/w/Заглавная_страница]]
#[[MakerBot wiki|http://en.wikipedia.org/wiki/MakerBot_Industries]]
#[[RepRap Хамелеон|http://reprap-russia.org/]]
#[[Makerbot Replicator|http://www.thingprint.ru/models.php]]
#[[Народный 3D принтер|http://habrahabr.ru/company/materialise/blog/94193/]]
#[[fabathome.org|http://www.fabathome.org/]]
#[[printandplay.ru|http://printandplay.ru/]]
#[[open3dprinter.ru|http://www.open3dprinter.ru/]]
#[[sexshop3d.com|http://sexshop3d.com/store/]]
#[[Подвешиваем CD-диск, или практический пример моделирования на базе OpenSCAD для 3д печати|http://habrahabr.ru/company/makeitlab/blog/219601/]]
#[[OpenSCAD - Введение |http://www.lugrap.com/2013/11/openscad-beginning.html]]
#[[OpenSCAD/Преобразования|https://ru.wikibooks.org/wiki/%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE_%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F_%D0%BF%D0%BE_OpenSCAD/%D0%9F%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F]]
#[[OpenSCAD/Примитивы|https://ru.wikibooks.org/wiki/%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE_%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F_%D0%BF%D0%BE_OpenSCAD/%D0%9F%D1%80%D0%B8%D0%BC%D0%B8%D1%82%D0%B8%D0%B2%D1%8B_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BC%D0%BD%D1%8B%D1%85_%D1%82%D0%B5%D0%BB#.D0.9C.D0.BD.D0.BE.D0.B3.D0.BE.D0.B3.D1.80.D0.B0.D0.BD.D0.BD.D0.B8.D0.BA]]
{{{
          (o_
(o_  (o_  //\
(/)_ (/)_ V_/_
}}}
{{{
(o_
//\
V_/_
}}}
{{{
(o_
(/)_
}}}
{{{
(\__/) 
(='.'=) 
(")_(")
}}}
{{{
(\ /)
(•.•)
(")(")
}}}
{{{
(\(\
(='.')
(,(")(")
}}}
{{{
 (\ /)
 ( . .)
C('')('')
}}}
{{{
(\_/)
(o.O)
(> <)
}}}
{{{
(\_/)
(О.о)
(> <)
() ()
}}}
{{{
 _ " _ 
(_\|/_) 
 (/|\)
}}}
{{{
(.\\//.)
 \ () /
 (_/\_)
}}}
{{{
 o___o
 (^o^)
o/( )\o
O_.^._O
}}}
{{{
  @..@        
 (\--/)      
(.>__<.)
^^^  ^^^
}}}
{{{
  /\ /\
 (‘• •’)
   =*=
 (\| |/)~~**
}}}
{{{
  /|、
 (゚、 。7
 ︱ ︶ヽ 
 _U U c )ノ
}}}
{{{
(¯)„(¯)
 ( ړײ)
  /█\
(„)♥(”)
}}}
{{{
  /|、
 (゚、。7
 ︱︶ヽ 
 _UUc)ノ
}}}
{{{
 ()()
 (ړײ) ♥
c(")(")
}}}
{{{
()"()
('o')
(„)(„)
}}}
{{{
()""()
( 'o' )
(‚‚)(‚‚)
}}}
{{{
 ()() 
=(';')= 
 (")(")
}}}
{{{
 /\_/\ ♥
 >^,^<
  / \
’(___)__
}}}
{{{
()''""()
(. 'o'.)
==")=")<-@
("),,,(")
}}}
{{{
  ()"""()
("(,'o',)")
 (")   (")
}}}
{{{
/\__/\
| O_O |
\___ /
}}}
{{{
()_()_.-""-.,/)
; . . `; -._ , `)_
( o_ )` __,) `-._)
}}}
{{{
./|_ /|
.>^,^<
(_(__)
}}}
{{{
/\___/\
(_*+*_)
()<$>()
(_____)
}}}
{{{
../'´'´'\
.//^ ^\\ 
(/(_♥_)\) 
._/''*''\_
(/_)^(_\)
}}}
{{{
◤------◥
|  ● ▄ ◉ | 
|  ‿/ʊ\‿ |
|  ══o══ |
︳ ︳  ︳ |⊃
}}}
{{{
/╲ ︵ ╱\
| (◉)(◉) |
\ ︶ V︶ /
/  ↺↺↺↺  \
}}}

{{{
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░║░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░║░╬▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░▓░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒▒▒▒▒▒▒▒▒▒╬░░▓░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒ 
▒▒▒▒▒▒▒▒▒▒▒▒▒░░▐▓▌░░▒▒▒▒▒▒▒▒▒▒▒▒▒ 
▒▒▒▒▒▒▒▒▒▒▒▒▒░░▐▓▌░░▒▒▒▒▒▒▒▒▒▒▒▒▒ 
▒▒▒▒▒▒▒▒▒▒▒▒▒░░▐▓▌░░▒▒▒▒▒▒▒▒▒▒▒▒▒ 
▒▒▒▒▒▒▒▒▒░░░░░░▄▓▄░░░╬░░▒▒▒▒▒▒▒▒▒ 
▒▒▒▒▒╬░░░░░░▄▄█████▄▄░░░░░░░▒▒▒▒▒ 
▒▒▒▒░░▄▄▄███████████████▄▄▄░░▒▒▒▒ 
▒▒▒▒░░▐░░░▀▓▓▒▓▓▒▓▓▒▓▓▀░░░▌░░▒▒▒▒
▒▒▒▒░░░░░▄█████████████▄░░░╬░▒▒▒▒ 
▒▒▒░░▄▄███████████████████▄▄░░▒▒▒ 
▒▒▒░░▐░░░▀▓▓▒▓▓▓▒▓▓▓▒▓▓▀░░░▌░░▒▒▒ 
▒▒▒▒░░░▒░░▓▓▓▓▓▓▓▓▓▓▓▓▓░░▒░░░▒▒▒▒ 
▒▒▒░╬░░░▄███████████████▄░░░░░▒▒▒ 
▒▒░░▄▄█████████████████████▄▄░░▒▒ 
▒▒░░▐░░░▀▓▓▒▓▓▓▓▒▓▓▓▓▒▓▓▀░░░▌░░▒▒ 
▒▒▒░░░▒░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░▒░░░▒▒▒ 
▒▒░░░░░▄█████████████████▄░░░░╬▒▒ 
▒░░▄▄███████████████████████▄▄░░▒ 
▒░░▐░░░▀▓▓▒▓▓▓▓▓▒▓▓▓▓▓▒▓▓▀░░░▌░░▒ 
▒▒░░░▒░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░▒░░░▒▒ 
▒░╬░░░▄███████████████████▄░░░░░▒ 
░░▄▄█████████████████████████▄▄░░ 
░░▐░░░▀▓▓▒▓▓▓▓▓▓▒▓▓▓▓▓▓▒▓▓▀░░░▌░░ 
▒░░▄▄███████████████████████▄▄░░▒ 
▒▒░░░▓║║▓║║▓║║▓█▓█▓║║▓║║▓║║▓░░░╬▒ 
▒╬░░▄▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▄░░▒▒ 
░░▄██████████▓▄▄▄▄▄▓██████████▄░░ 
▄████████████▓▄▄▄▄▄▓████████████▄
}}}

{{{
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 
░░▐▀▄▐▀█▐█▐▌▌▀█▀░▐▀▄▐▀█▐█▐▌█▐▀░ 
░░▐░█▐░█▐▐█▌░░█░░▐▄█▐▀█▐▐█▌█▐░░ 
░░▐█▀▐██▐▐█▌░░█░░▐░░▐░█▐▐█▌█▐█░ 
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 
░░░░░░░░░░░▄▀▀▀▀▀▀▀▄░░░░░░░░░░░ 
░░░░░░░░░▄▀░░░░░░░░░▀▄░░░░░░░░░ 
░░░░░░░░▄██▄██▄░▄██▄██▄░░░░░░░░ 
░░░░░░░░██████▀░▀██████░░░░░░░░ 
░░░░░░░░█▀███▀░░░▀███▀█░░░░░░░░ 
░░░░░░░░▀▄░▀░░░░░░░▀░▄▀░░░░░░░░ 
░░░░░░░░░░▀▄░░▀▀▀░░▄▀░░░░░░░░░░ 
░░░░░░░░░░░░▀▀▀▀▀▀▀░░░░░░░░░░░░
}}}

{{{
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 
░░▐▀▄▐▀█▐█▐▌▌▀█▀░▐▀▄▐▀█▐█▐▌█▐▀░ 
░░▐░█▐░█▐▐█▌░░█░░▐▄█▐▀█▐▐█▌█▐░░ 
░░▐█▀▐██▐▐█▌░░█░░▐░░▐░█▐▐█▌█▐█░ 
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 
░░░░░░░░░░░▄▀▀▀▀▀▀▀▄░░░░░░░░░░░ 
░░░░░░░░░▄▀░░░░░░░░░▀▄░░░░░░░░░ 
░░░░░░░░▄██▄██▄░▄██▄██▄░░░░░░░░ 
░░░░░░░░██████▀░▀██████░░░░░░░░ 
░░░░░░░░█▀███▀░░░▀███▀█░░░░░░░░ 
░░░░░░░░▀▄░▀░░░░░░░▀░▄▀░░░░░░░░ 
░░░░░░░░░░▀▄░░▀▀▀░░▄▀░░░░░░░░░░ 
░░░░░░░░░░░░▀▀▀▀▀▀▀░░░░░░░░░░░░
}}}





/***
|Name|AliasPlugin|
|Source|http://www.TiddlyTools.com/#AliasPlugin|
|Documentation|http://www.TiddlyTools.com/#AliasPluginInfo|
|Version|1.1.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|Create text-substitution macros|
Define macros for abbreviations and other "aliases", and then embed them in the rest of your tiddler content to quickly insert common terms, phrases and links without a lot of repetitive typing.
!!!!!Documentation
> see [[AliasPluginInfo]]
!!!!!Revisions
<<<
2009.09.09 1.1.1 'tiddler' arg passed to wikify() so aliases containing macros render with correct context
| Please see [[AliasPluginInfo]] for previous revision details |
2005.08.12 1.0.0 initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.AliasPlugin= {major: 1, minor: 1, revision: 1, date: new Date(2009,9,9)};
config.macros.alias= { };
config.macros.alias.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
	var alias=params.shift(); if (!alias) return; alias=alias.replace(/ /g,"_"); // don't allow spaces in alias
	if (config.macros[alias]==undefined) { // create new macro (as needed)
		config.macros[alias] = { };
		config.macros[alias].handler =
			function (place,macroName,params,wikifier,paramString,tiddler)
				{ wikify(config.macros[macroName].text.format(params),place,null,tiddler); }
	}
	config.macros[alias].text = params[0]?params.join(' '):alias;	// set alias text
}
//}}}
<<miniBrowser noplayer http://www.amyeditor.com/api/embed/test_php.html>>
До тех пор, пока у меня есть [[HTC Tattoo]] и пока присутствует желание его улучшать, я обязуюсь выкладывать здесь различные интересные статьи и размышления о платформе [[Android]].

Как сделать снимок экрана:
{{{
adb pull /dev/graphics/fb0
convert -depth 8 -size 800x600 rgba:fb0 -separate -swap 0,2 -combine screen.png
}}}
или
{{{
adb pull /dev/graphics/fb0 fb0
ffmpeg -vframes 1 -vcodec rawvideo -f rawvideo -pix_fmt rgb32 -s 320x480 -i fb0 -f image2 -vcodec png image.png
}}}

дебаг нативных программ 
{{{
strace programname
}}}

дебаг нативных программ 
{{{
input tap x y
(also input text, swipe, keyevent are available) 
adb shell input tap x y 
adb shell input swipe x1 y1 x2 y2 
adb shell input text Hello! 
adb shell input keyevent ID 
}}}
 By this way you do not need to care about hardware implementation. Using events you will have to imeplemnt them for each device. All these commands could be executed on device or on PC via ADB. 

Happy testing! (: 


To send touch event you need to do:
1 Set coordinates:
{{{
adb shell sendevent /dev/input/event2 3 0 x
adb shell sendevent /dev/input/event2 3 1 y
}}}
2 Send touch event (must have 0 0 0 pair):
{{{
adb shell sendevent /dev/input/event2 1 330 1
adb shell sendevent /dev/input/event2 0 0 0
}}}
3 Send release finger event (must have 0 0 0 pair):
{{{
adb shell sendevent /dev/input/event2 1 330 0
adb shell sendevent /dev/input/event2 0 0 0
}}}
Please note:
1 You can record events:
{{{
adb shell getevent
}}}
How I did it:
1. Start dump motion event you need to reproduce:
{{{
~$ adb shell getevent | grep event2
}}}
grep is very useful to filter output.
2. Do motion event you want to reproduce;
3. Than just convert all values from hex in dump to decimal values! :)
To find what eventX is working for you do following:
1. Start terminal and type
{{{
~$ adb shell getevent
}}}
You will see quickly moving traces with for example /dev/input/event4 ......
2. Touch screen once
You must see between event4 few eventX and these eventX right in the moment of the touch
will be yours input interface for reproducing motion events! :)

enable wifi from svc
{{{
adb shell svc wifi enable
}}}

enable wifi from key events
{{{
adb shell am start -a android.intent.action.MAIN -n com.android.settings/.wifi.WifiSettings
adb shell input keyevent 20 & adb shell input keyevent 23
}}}


https://android-review.googlesource.com/#/

#[[start-stop-built-in-wi-fi-usb-tethering-from-code|http://stackoverflow.com/questions/3436280/start-stop-built-in-wi-fi-usb-tethering-from-code]]
#[[android-2-2-wifi-hotspot-api|http://stackoverflow.com/questions/3023226/android-2-2-wifi-hotspot-api]]
#[[can-i-emulate-a-wi-fi-connection-to-test-wi-fi-direct|http://stackoverflow.com/questions/13542531/can-i-emulate-a-wi-fi-connection-to-test-wi-fi-direct]]
#[[how-to-determine-wether-the-device-is-connecting-or-connected-to-a-wi-fi-hotspot|http://stackoverflow.com/questions/12329340/how-to-determine-wether-the-device-is-connecting-or-connected-to-a-wi-fi-hotspot]]
#[[via-wi-fi-hotspot-on-andr|http://stackoverflow.com/questions/8267207/how-to-start-a-local-network-connection-programmically-via-wi-fi-hotspot-on-andr]]
#[[how-to-turn-off-wifi-via-adb|http://stackoverflow.com/questions/10033757/how-to-turn-off-wifi-via-adb]]
#[[adb-shell-input-events|http://stackoverflow.com/questions/7789826/adb-shell-input-events]]
#[[screenshot-of-the-nexus-one-from-adb|http://stackoverflow.com/questions/2807070/screenshot-of-the-nexus-one-from-adb]]
#[[Автоматизация тестирования Android приложений|http://habrahabr.ru/company/intel/blog/152122/]]
{{{
ssh -D 4545 server
}}}

[[Хабра жжот|http://habrahabr.ru/post/158829/]]
# [[LOR|http://www.linux.org.ru/forum/talks/7722002]]
# [[chip-nn.ru|http://chip-nn.ru/30.php]]
# [[multion.ru|http://www.multion.ru/3d/index.html]]
# [[FreeDuino|http://www.freeduino.ru/arduino/dealers.html]]
# [[hobby-nn.ru|http://www.hobby-nn.ru/]]
<<attach inline>>
image/jpeg
image/gif
/***
|Name|AttachFilePlugin|
|Source|http://www.TiddlyTools.com/#AttachFilePlugin|
|Documentation|http://www.TiddlyTools.com/#AttachFilePluginInfo|
|Version|4.0.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Requires|AttachFilePluginFormatters, AttachFileMIMETypes|
|Description|Store binary files as base64-encoded tiddlers with fallback links for separate local and/or remote file storage|
Store or link binary files (such as jpg, gif, pdf or even mp3) within your TiddlyWiki document and then use them as images or links from within your tiddler content.
> Important note: As of version 3.6.0, in order to //render// images and other binary attachments created with this plugin, you must also install [[AttachFilePluginFormatters]], which extends the behavior of the TiddlyWiki core formatters for embedded images ({{{[img[tooltip|image]]}}}), linked embedded images ({{{[img[tooltip|image][link]]}}}), and external/"pretty" links ({{{[[label|link]]}}}), so that these formatter will process references to attachment tiddlers as if a normal file reference had been provided. |
!!!!!Documentation
>see [[AttachFilePluginInfo]]
!!!!!Inline interface (live)
>see [[AttachFile]] (shadow tiddler)
><<tiddler AttachFile>>
!!!!!Revisions
<<<
2009.06.04 [4.0.0] changed attachment storage format to use //sections// instead of embedded substring markers.
|please see [[AttachFilePluginInfo]] for additional revision details|
2005.07.20 [1.0.0] Initial Release
<<<
!!!!!Code
***/
// // version
//{{{
version.extensions.AttachFilePlugin= {major: 4, minor: 0, revision: 0, date: new Date(2009,6,4)};

// shadow tiddler
config.shadowTiddlers.AttachFile="<<attach inline>>";

// add 'attach' backstage task (insert before built-in 'importTask')
if (config.tasks) { // for TW2.2b or above
	config.tasks.attachTask = {
		text: "attach",
		tooltip: "Attach a binary file as a tiddler",
		content: "<<attach inline>>"
	}
	config.backstageTasks.splice(config.backstageTasks.indexOf("importTask"),0,"attachTask");
}

config.macros.attach = {
// // lingo
//{{{
	label: "attach file",
	tooltip: "Attach a file to this document",
	linkTooltip: "Attachment: ",

	typeList: "AttachFileMIMETypes",

	titlePrompt: " enter tiddler title...",
	MIMEPrompt: "<option value=''>select MIME type...</option><option value='editlist'>[edit list...]</option>",
	localPrompt: " enter local path/filename...",
	URLPrompt: " enter remote URL...",

	tiddlerErr: "Please enter a tiddler title",
	sourceErr: "Please enter a source path/filename",
	storageErr: "Please select a storage method: embedded, local or remote",
	MIMEErr: "Unrecognized file format.  Please select a MIME type",
	localErr: "Please enter a local path/filename",
	URLErr: "Please enter a remote URL",
	fileErr: "Invalid path/file or file not found",

	tiddlerFormat: '!usage\n{{{%0}}}\n%0\n!notes\n%1\n!type\n%2\n!file\n%3\n!url\n%4\n!data\n%5\n',

//}}}
// // macro definition
//{{{
	handler:
	function(place,macroName,params) {
		if (params && !params[0])
			{ createTiddlyButton(place,this.label,this.tooltip,this.toggleAttachPanel); return; }
		var id=params.shift();
		this.createAttachPanel(place,id+"_attachPanel",params);
		document.getElementById(id+"_attachPanel").style.position="static";
		document.getElementById(id+"_attachPanel").style.display="block";
	},
//}}}
//{{{
	createAttachPanel:
	function(place,panel_id,params) {
		if (!panel_id || !panel_id.length) var panel_id="_attachPanel";
		// remove existing panel (if any)
		var panel=document.getElementById(panel_id); if (panel) panel.parentNode.removeChild(panel);
		// set styles for this panel
		setStylesheet(this.css,"attachPanel");
		// create new panel
		var title=""; if (params && params[0]) title=params.shift();
		var types=this.MIMEPrompt+this.formatListOptions(store.getTiddlerText(this.typeList)); // get MIME types
		panel=createTiddlyElement(place,"span",panel_id,"attachPanel",null);
		var html=this.html.replace(/%id%/g,panel_id);
		html=html.replace(/%title%/g,title);
		html=html.replace(/%disabled%/g,title.length?"disabled":"");
		html=html.replace(/%IEdisabled%/g,config.browser.isIE?"disabled":"");
		html=html.replace(/%types%/g,types);
		panel.innerHTML=html;
		if (config.browser.isGecko) { // FF3 FIXUP
			document.getElementById("attachSource").style.display="none";
			document.getElementById("attachFixPanel").style.display="block";
		}
		return panel;
	},
//}}}
//{{{
	toggleAttachPanel:
	function (e) {
		if (!e) var e = window.event;
		var parent=resolveTarget(e).parentNode;
		var panel = document.getElementById("_attachPanel");
		if (panel==undefined || panel.parentNode!=parent)
			panel=config.macros.attach.createAttachPanel(parent,"_attachPanel");
		var isOpen = panel.style.display=="block";
		if(config.options.chkAnimate)
			anim.startAnimating(new Slider(panel,!isOpen,e.shiftKey || e.altKey,"none"));
		else
			panel.style.display = isOpen ? "none" : "block" ;
		e.cancelBubble = true;
		if (e.stopPropagation) e.stopPropagation();
		return(false);
	},
//}}}
//{{{
	formatListOptions:
	function(text) {
		if (!text || !text.trim().length) return "";
		// get MIME list content from text
		var parts=text.split("\n----\n");
		var out="";
		for (var p=0; p<parts.length; p++) {
			var lines=parts[p].split("\n");
			var label=lines.shift(); // 1st line=display text
			var value=lines.shift(); // 2nd line=item value
			out +='<option value="%1">%0</option>'.format([label,value]);
		}
		return out;
	},
//}}}
// // interface definition
//{{{
	css:
	".attachPanel { display: none; position:absolute; z-index:10; width:35em; right:105%; top:0em;\
		background-color: #eee; color:#000; font-size: 8pt; line-height:110%;\
		border:1px solid black; border-bottom-width: 3px; border-right-width: 3px;\
		padding: 0.5em; margin:0em; -moz-border-radius:1em;-webkit-border-radius:1em; text-align:left }\
	.attachPanel form { display:inline;border:0;padding:0;margin:0; }\
	.attachPanel select { width:99%;margin:0px;font-size:8pt;line-height:110%;}\
	.attachPanel input  { width:98%;padding:0px;margin:0px;font-size:8pt;line-height:110%}\
	.attachPanel textarea { width:98%;margin:0px;height:2em;font-size:8pt;line-height:110%}\
	.attachPanel table { width:100%;border:0;margin:0;padding:0;color:inherit; }\
	.attachPanel tbody, .attachPanel tr, .attachPanel td { border:0;margin:0;padding:0;color:#000; }\
	.attachPanel .box { border:1px solid black; padding:.3em; margin:.3em 0px; background:#f8f8f8; \
		-moz-border-radius:5px;-webkit-border-radius:5px; }\
	.attachPanel .chk { width:auto;border:0; }\
	.attachPanel .btn { width:auto; }\
	.attachPanel .btn2 { width:49%; }\
	",
//}}}
//{{{
	html:
	'<form>\
		attach from source file\
		<input type="file" id="attachSource" name="source" size="56"\
			onChange="config.macros.attach.onChangeSource(this)">\
		<div id="attachFixPanel" style="display:none"><!-- FF3 FIXUP -->\
			<input type="text" id="attachFixSource" style="width:90%"\
				title="Enter a path/file to attach"\
				onChange="config.macros.attach.onChangeSource(this);">\
			<input type="button" style="width:7%" value="..."\
				title="Enter a path/file to attach"\
				onClick="config.macros.attach.askForFilename(document.getElementById(\'attachFixSource\'));">\
		</div><!--end FF3 FIXUP-->\
		<div class="box">\
		<table style="border:0"><tr style="border:0"><td style="border:0;text-align:right;width:1%;white-space:nowrap">\
			embed data <input type=checkbox class=chk name="useData" %IEdisabled% \
				onclick="if (!this.form.MIMEType.value.length)\
					this.form.MIMEType.selectedIndex=this.checked?1:0; ">&nbsp;\
		</td><td style="border:0">\
			<select size=1 name="MIMEType" \
				onchange="this.title=this.value; if (this.value==\'editlist\')\
					{ this.selectedIndex=this.form.useData.checked?1:0; story.displayTiddler(null,config.macros.attach.typeList,2); return; }">\
				<option value=""></option>\
				%types%\
			</select>\
		</td></tr><tr style="border:0"><td style="border:0;text-align:right;width:1%;white-space:nowrap">\
			local link <input type=checkbox class=chk name="useLocal"\
				onclick="this.form.local.value=this.form.local.defaultValue=this.checked?config.macros.attach.localPrompt:\'\';">&nbsp;\
		</td><td style="border:0">\
			<input type=text name="local" size=15 autocomplete=off value=""\
				onchange="this.form.useLocal.checked=this.value.length" \
				onkeyup="this.form.useLocal.checked=this.value.length" \
				onfocus="if (!this.value.length) this.value=config.macros.attach.localPrompt; this.select()">\
		</td></tr><tr style="border:0"><td style="border:0;text-align:right;width:1%;white-space:nowrap">\
			remote link <input type=checkbox class=chk name="useURL"\
				onclick="this.form.URL.value=this.form.URL.defaultValue=this.checked?config.macros.attach.URLPrompt:\'\';\">&nbsp;\
		</td><td style="border:0">\
			<input type=text name="URL" size=15 autocomplete=off value=""\
				onfocus="if (!this.value.length) this.value=config.macros.attach.URLPrompt; this.select()"\
				onchange="this.form.useURL.checked=this.value.length;"\
				onkeyup="this.form.useURL.checked=this.value.length;">\
		</td></tr></table>\
		</div>\
		<table style="border:0"><tr style="border:0"><td style="border:0;text-align:right;vertical-align:top;width:1%;white-space:nowrap">\
			notes&nbsp;\
		</td><td style="border:0" colspan=2>\
			<textarea name="notes" style="width:98%;height:3.5em;margin-bottom:2px"></textarea>\
		</td><tr style="border:0"><td style="border:0;text-align:right;width:1%;white-space:nowrap">\
			attach as&nbsp;\
		</td><td style="border:0" colspan=2>\
			<input type=text name="tiddlertitle" size=15 autocomplete=off value="%title%"\
				onkeyup="if (!this.value.length) { this.value=config.macros.attach.titlePrompt; this.select(); }"\
				onfocus="if (!this.value.length) this.value=config.macros.attach.titlePrompt; this.select()" %disabled%>\
		</td></tr></tr><tr style="border:0"><td style="border:0;text-align:right;width:1%;white-space:nowrap">\
			add tags&nbsp;\
		</td><td style="border:0">\
			<input type=text name="tags" size=15 autocomplete=off value="" onfocus="this.select()">\
		</td><td style="width:40%;text-align:right;border:0">\
			<input type=button class=btn2 value="attach"\
				onclick="config.macros.attach.onClickAttach(this)"><!--\
			--><input type=button class=btn2 value="close"\
				onclick="var panel=document.getElementById(\'%id%\'); if (panel) panel.parentNode.removeChild(panel);">\
		</td></tr></table>\
	</form>',
//}}}
// // control processing
//{{{
	onChangeSource:
	function(here) {
		var form=here.form;
		var list=form.MIMEType;
		var theFilename  = here.value;
		var theExtension = theFilename.substr(theFilename.lastIndexOf('.')).toLowerCase();
		// if theFilename is in current document folder, remove path prefix and use relative reference
		var h=document.location.href; folder=getLocalPath(decodeURIComponent(h.substr(0,h.lastIndexOf("/")+1)));
		if (theFilename.substr(0,folder.length)==folder) theFilename='./'+theFilename.substr(folder.length);
		else theFilename='file:///'+theFilename; // otherwise, use absolute reference
		theFilename=theFilename.replace(/\\/g,"/"); // fixup: change \ to /
		form.useLocal.checked = true;
		form.local.value = theFilename;
		form.useData.checked = !form.useData.disabled;
		list.selectedIndex=1;
		for (var i=0; i<list.options.length; i++) // find matching MIME type
			if (list.options[i].value.indexOf(theExtension)!=-1) { list.selectedIndex = i; break; }
		if (!form.tiddlertitle.disabled)
			form.tiddlertitle.value=theFilename.substr(theFilename.lastIndexOf('/')+1); // get tiddlername from filename
	},
//}}}
//{{{
	onClickAttach:
	function (here) {
		clearMessage();
		// get input values
		var form=here.form;
		var src=form.source; if (config.browser.isGecko) src=document.getElementById("attachFixSource");
		src=src.value!=src.defaultValue?src.value:"";
		var when=(new Date()).formatString(config.macros.timeline.dateFormat);
		var title=form.tiddlertitle.value;
		var local = form.local.value!=form.local.defaultValue?form.local.value:"";
		var url = form.URL.value!=form.URL.defaultValue?form.URL.value:"";
		var notes = form.notes.value;
		var tags = "attachment excludeMissing "+form.tags.value;
		var useData=form.useData.checked;
		var useLocal=form.useLocal.checked;
		var useURL=form.useURL.checked;
		var mimetype = form.MIMEType.value.length?form.MIMEType.options[form.MIMEType.selectedIndex].text:"";
		// validate checkboxes and get filename
		if (useData) {
			if (src.length) { if (!theLocation) var theLocation=src; }
			else { alert(this.sourceErr); src.focus(); return false; }
		}
		if (useLocal) {
			if (local.length) { if (!theLocation) var theLocation = local; }
			else { alert(this.localErr); form.local.focus(); return false; }
		}
		if (useURL) {
			if (url.length) { if (!theLocation) var theLocation = url; }
			else { alert(this.URLErr); form.URL.focus(); return false; }
		}
		if (!(useData||useLocal||useURL))
			{ form.useData.focus(); alert(this.storageErr); return false; }
		if (!theLocation)
			{ src.focus(); alert(this.sourceErr); return false; }
		if (!title || !title.trim().length || title==this.titlePrompt)
			{ form.tiddlertitle.focus(); alert(this.tiddlerErr); return false; }
		// if not already selected, determine MIME type based on filename extension (if any)
		if (useData && !mimetype.length && theLocation.lastIndexOf('.')!=-1) {
			var theExt = theLocation.substr(theLocation.lastIndexOf('.')).toLowerCase();
			var theList=form.MIMEType;
			for (var i=0; i<theList.options.length; i++)
				if (theList.options[i].value.indexOf(theExt)!=-1)
					{ var mimetype=theList.options[i].text; theList.selectedIndex=i; break; }
		}
		// attach the file
		return this.createAttachmentTiddler(src, when, notes, tags, title,
			useData, useLocal, useURL, local, url, mimetype);
	},
	getMIMEType:
	function(src,def) {
		var ext = src.substr(src.lastIndexOf('.')).toLowerCase();
		var list=store.getTiddlerText(this.typeList);
		if (!list || !list.trim().length) return def;
		// get MIME list content from tiddler
		var parts=list.split("\n----\n");
		for (var p=0; p<parts.length; p++) {
			var lines=parts[p].split("\n");
			var mime=lines.shift(); // 1st line=MIME type
			var match=lines.shift(); // 2nd line=matching extensions
			if (match.indexOf(ext)!=-1) return mime;
		}
		return def;
	},
	createAttachmentTiddler:
	function (src, when, notes, tags, title, useData, useLocal, useURL, local, url, mimetype, noshow) {
		if (useData) { // encode the data
			if (!mimetype.length) {
				alert(this.MIMEErr);
				form.MIMEType.selectedIndex=1; form.MIMEType.focus();
				return false;
			}
			var d = this.readFile(src); if (!d) { return false; }
			displayMessage('encoding '+src);
			var encoded = this.encodeBase64(d);
			displayMessage('file size='+d.length+' bytes, encoded size='+encoded.length+' bytes');
		}
		var usage=(mimetype.substr(0,5)=="image"?'[img[%0]]':'[[%0|%0]]').format([title]);
		var theText=this.tiddlerFormat.format([
			usage, notes.length?notes:'//none//', mimetype,
			useLocal?local.replace(/\\/g,'/'):'', useURL?url:'',
			useData?('data:'+mimetype+';base64,'+encoded):'' ]);
		store.saveTiddler(title,title,theText,config.options.txtUserName,new Date(),tags);
		var panel=document.getElementById("attachPanel"); if (panel) panel.style.display="none";
		if (!noshow) { story.displayTiddler(null,title); story.refreshTiddler(title,null,true); }
		displayMessage('attached "'+title+'"');
		return true;
	},
//}}}
// // base64 conversion
//{{{
	encodeBase64:
	function (d) {
		if (!d) return null;
		// encode as base64
		var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
		var out="";
		var chr1,chr2,chr3="";
		var enc1,enc2,enc3,enc4="";
		for (var count=0,i=0; i<d.length; ) {
			chr1=d.charCodeAt(i++);
			chr2=d.charCodeAt(i++);
			chr3=d.charCodeAt(i++);
			enc1=chr1 >> 2;
			enc2=((chr1 & 3) << 4) | (chr2 >> 4);
			enc3=((chr2 & 15) << 2) | (chr3 >> 6);
			enc4=chr3 & 63;
			if (isNaN(chr2)) enc3=enc4=64;
			else if (isNaN(chr3)) enc4=64;
			out+=keyStr.charAt(enc1)+keyStr.charAt(enc2)+keyStr.charAt(enc3)+keyStr.charAt(enc4);
			chr1=chr2=chr3=enc1=enc2=enc3=enc4="";
		}
		return out;
	},
	decodeBase64: function(input) {
		var out="";
		var chr1,chr2,chr3;
		var enc1,enc2,enc3,enc4;
		var i = 0;
		// remove all characters that are not A-Z, a-z, 0-9, +, /, or =
		input=input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
		do {
			enc1=keyStr.indexOf(input.charAt(i++));
			enc2=keyStr.indexOf(input.charAt(i++));
			enc3=keyStr.indexOf(input.charAt(i++));
			enc4=keyStr.indexOf(input.charAt(i++));
			chr1=(enc1 << 2) | (enc2 >> 4);
			chr2=((enc2 & 15) << 4) | (enc3 >> 2);
			chr3=((enc3 & 3) << 6) | enc4;
			out=out+String.fromCharCode(chr1);
			if (enc3!=64) out=out+String.fromCharCode(chr2);
			if (enc4!=64) out=out+String.fromCharCode(chr3);
		} while (i<input.length);
		return out;
	},
//}}}
// // I/O functions
//{{{
	readFile: // read local BINARY file data
	function(filePath) {
		if(!window.Components) { return null; }
		try { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); }
		catch(e) { alert("access denied: "+filePath); return null; }
		var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
		try { file.initWithPath(filePath); } catch(e) { alert("cannot read file - invalid path: "+filePath); return null; }
		if (!file.exists()) { alert("cannot read file - not found: "+filePath); return null; }
		var inputStream = Components.classes["@mozilla.org/network/file-input-stream;1"].createInstance(Components.interfaces.nsIFileInputStream);
		inputStream.init(file, 0x01, 00004, null);
		var bInputStream = Components.classes["@mozilla.org/binaryinputstream;1"].createInstance(Components.interfaces.nsIBinaryInputStream);
		bInputStream.setInputStream(inputStream);
		return(bInputStream.readBytes(inputStream.available()));
	},
//}}}
//{{{
	writeFile:
	function(filepath,data) {
		// TBD: decode base64 and write BINARY data to specified local path/filename
		return(false);
	},
//}}}
//{{{
	askForFilename: // for FF3 fixup
	function(target) {
		var msg=config.messages.selectFile;
		if (target && target.title) msg=target.title; // use target field tooltip (if any) as dialog prompt text
		// get local path for current document
		var path=getLocalPath(document.location.href);
		var p=path.lastIndexOf("/"); if (p==-1) p=path.lastIndexOf("\\"); // Unix or Windows
		if (p!=-1) path=path.substr(0,p+1); // remove filename, leave trailing slash
		var file=""
		var result=window.mozAskForFilename(msg,path,file,true); // FF3 FIXUP ONLY
		if (target && result.length) // set target field and trigger handling
			{ target.value=result; target.onchange(); }
		return result; 
	}
};
//}}}
//{{{
if (window.mozAskForFilename===undefined) { // also defined by CoreTweaks (for ticket #604)
	window.mozAskForFilename=function(msg,path,file,mustExist) {
		if(!window.Components) return false;
		try {
			netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
			var nsIFilePicker = window.Components.interfaces.nsIFilePicker;
			var picker = Components.classes['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);
			picker.init(window, msg, mustExist?nsIFilePicker.modeOpen:nsIFilePicker.modeSave);
			var thispath = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
			thispath.initWithPath(path);
			picker.displayDirectory=thispath;
			picker.defaultExtension='';
			picker.defaultString=file;
			picker.appendFilters(nsIFilePicker.filterAll|nsIFilePicker.filterText|nsIFilePicker.filterHTML);
			if (picker.show()!=nsIFilePicker.returnCancel)
				var result=picker.file.persistentDescriptor;
		}
		catch(ex) { displayMessage(ex.toString()); }
		return result;
	}
}
//}}}
BXT ([[Big XML Table]] or Binary eXtending Table) - в будущем файловая система не имеющая никаких ограничений на уровне стандарта этой файловой системы.
Воплощение некоторых идей в виде некоторого C/C++ кода


//{{{
getSize(void * ret, uint32 size)
{
  byte b = get_byte();
  if ( b&0x80 == 0 )
  {
    // read next byte
    vector bytes;
    bytes.push_back(b);
    do {
      b = get_byte();
      bytes.push_back(b);
    } while(b&0x80 == 0);
    size = actual_size(bytes.size());
    ret = malloc(size);
    ret = copy_data(bytes);
  } 
  else if ( b&0x40 == 0 )
  {
   size = size_of(byte); 
   ret = malloc(size);
   *ret = b&0x3F;
  }
  else
  {
   *ret = 0;
   size = 0;
  }
}
//}}}

Системы умирают, системы возрождаются из пепла. В очередной раз пытаясь сделать бэкап моей любимой убунточки перед переустановкой я осознал простую вещь, единственное ценное что есть в системе это .bash_history, а всё остальное в бэкапе не нуждается. 
Посудите сами все фотки уже давно в фэйсбуке и на фликре, видео давно на ютьюбе, музыка в ластфм, документы двно уже в гуглодоксах, проекты на гитхабе, программы всегда доступны из репов, даже порнушка давно записана на диск и упрятана в коробку из под конфет под кроватью.
А хистори хранит в себе все взлёты и провалы, ошибки и озарения, повседневные рутинные действия и крупицы истинны в гениальных однострочниках. Для восстановления привычной среды ненужно ничего кроме того десятка заветных строк которые были нагуглены и введены год назад один раз и позабыты.
И вот система умерает и чтобы возродиться из пепла, из ста гигабайт /home раздела нужен всего один маленький файлик на десяток килобайт.
Хистори можно и нужно хранить, кто-то публикует хистори в твитере http://twitter.com/bash_history я же предлагаю сохранять хистори в системе контроля версий, например в [[Fossil|http://ru.wikipedia.org/wiki/Fossil]] для этого достаточно:
# скачать клиент системы например тут [[Download|http://www.fossil-scm.org/download.html]] 
# закинуть его например в ~/fossil
# почитать к нему справку и создать репозиторий 
# написать скрипт сохраняющий историю в репозитории например такой:
{{{
#!/bin/bash
rm -f ./bash_history
./fossil open ./bash-history.fossil "$(hostname)"
./fossil update "$(hostname)"
# The \cp and -f is to overwrite the file
cp -f "$HOME/.bash_history" ./bash_history
./fossil ci -f -m "Commiting the bash_history for $(hostname) as of $(date +%Y-%m-%d-%H:%M)" ./bash_history
./fossil close
rm -f ./bash_history
}}}
# и добавить запуск скрипта в cron каждый час например так:
{{{
#!/bin/bash
echo "1 * * * * cd $HOME/fossil/ && bash $HOME/fossil/bash_history_backup.sh" > ./cron.txt
crontab ./cron.txt
rm ./cron.txt
}}}
Идея нагло спёрта отсюда http://shlomif.livejournal.com/31980.html только переделана под другой репозиторий.

http://www.adminworld.ru/tag/bash_history

http://twitter.com/bash_history

http://www.gentoo-wiki.info/SECURITY_Bash_History_Functions

[[Inotify или автоматизация рутинных операций с помощью incron|http://habrahabr.ru/post/66569/]]
[[BXT]] (Big XML Table or Binary eXtending Table) - в будущем файловая система не имеющая никаких ограничений на уровне стандарта файловой системы.

[[BXT on GitHub|https://github.com/mm3/BXT]]
[[Небольшие наброски кода|BXT code]]

ссылки:
[[Reizer4fs]] - ФС Reizer4fs на основе которого буду писать свой код.
[[fuse-rofs|https://github.com/cognusion/fuse-rofs]] - примеры раоты с fuse
[[fuse-exfat|http://code.google.com/p/exfat/source/browse/]]
[[fuse-helloworld|http://sourceforge.net/apps/mediawiki/fuse/index.php?title=Hello_World]]
[[wiki fuse|http://sourceforge.net/apps/mediawiki/fuse/index.php?title=Option_parsing]]

object structure
//{{{
[                                           header                                           ][other object, raw data or free space]
[[size][                                    header_data                                     ]][other object, raw data or free space]
[[size][[   field_name     ][    field_data    ][    field_name     ][    field_data    ]...]][other object, raw data or free space]
[[size][[[size][field_name]][[size][field_data]][[size][[field_name]][[size][field_data]]...]][other object, raw data or free space]
//}}}

size field structure
//{{{
[           size bytes           ][data]
 0 xxxxxxx  0 xxxxxxx  1 xxxxxxx  [data]
 0[ size  ] 0[ bits  ] 1[ last  ] [data]
//}}}
or if size of data < 128 bytes
//{{{
[size byte][data]
10 xxxxxx  [data]
10[ size ] [data]
//}}}
or if size of data < 7 bit
//{{{
 11 xxxxxx
 11[ data ]
//}}}



Основные идеи и постулаты 
# В основе лежит бинарное представление XML 
# По сути файловая система представляет из себя один большой бинарный XML объект.
# Любой объект файловой системы состоит из двух основных частей: заголовка и тела.  
# Любой элемент заголовка  задаётся в виде размер - данные.
# Размер - это несколько байт элемента начиная от первого и  заканчивая  ближайшим большим 127 включительно. То есть если первый байт больше 127 то в нём хранится размер элемента. 
# Т.е. если старший бит первого байта равен 0 значит нужно найти  ближайший байт у которого он равен 1 и все эти байты будут содержать в себе размер элемента.
# А если старший бит первого байта равен 1 то тут надо проверить второй по старшинству бит и если он равен 0 то оставшиеся 6 бит содержат размер. иначе эти 6 бит содержат данные размер которых не превышает 6 бит - функция сжатия  размера.
# Сам заголовок также состоит из размера и собственно заголовка.
# Заголовок содержит набор обязательных полей (описаны ниже) и любое количество необязательных, порядок следования полей произвольный.
# Поле имеет формат имя - значение ( оба в виде размер - данные).
# Тело есть набор объектов, бинарные данные или пустое место.

Объекты ФС.
# Суперблок - объект включающий в себя все другие объекты ФС, в том числе и обьекты директорий и файлов в корне ФС.
# Копия суперблока - обьект дублирующий критически важные для работы ФС данные.
# Директория - содержит в себе обьекты директорий, файлов и ссылок.
# Файл - содержит в себе данные либо обьекты указывающие в каких блоках располагаются данные.
# Ссылка - обьект указывающий на один или несколько других обьектов.
# Карта свободных блоков - обьект упрощяющий поиск блоков в которые можно записть данные.
# Дерево файлов - обьект содержащий данные упрощающий навигацию по файловой структуре.
# Дерево обьектов - обьект упрощающий работу с обьектами ФС
# Журнал - обьект упрощяющий контроль целосности операций с данными
# Индекс - обьект упрощяющий поис по данным.
# Тэг - обьект обьект обеспечивающий механизм создания снапшотов, хранит структуру блоков актуальных на момент создания снапшота.
 
Обязательные поля для любого обьекта
# уникальный идентификатор (id), префиксный, тоесть состоит из идентификатора родителя и идентификатора самого обьекта.
# размер объекта(включая заголовок), 
# размер данных в теле, исключая заголовок и свободное место после 


Обязательные поля заголовка суперблока
# Сигнатура суперблока - поле имеет имя, заданное спецификацией, по которому можно определить, что данный блок данных содержит суперблок, в качестве значения выступает хэш-сумма заголовка суперблока, в котором значение поля сигнатуры установленно в нули. Если в некотором массиве байт обнаружена сигнатура, то можно можно востановить суперблок по следующему методу. Извесно, что сигнатура располагается внутри заголовка суперблока, так же извесно, что сразу после сигнатуры идёт хэш-сумма заголовка суперблока, следовательно необходимо итерративно читать байты до сигнатуры считая их началом заголовка суперблока, до тех пор пока не распарсится валидная структура суперблока, хэш-сумма заголовка которого совпадает с числом записанным после сигнатуры.
# версия спецификации



Дополнительные возможности которые может предоставлять драйвер ФС:
# В корне ФС располагается служебная директория обеспечивающяя доступ к дополнительным возможностям ФС, таким как: манипулирование файлами имена которых не поддерживаются данной операционной системой, поиск файлов по разным параметрам, балансировка, дефрагментация, востановление удалённых либо старых версий файлов, удаление старых версий файлов, зануление свободных блоков, оперирование снапшотами, конфигурирование ФС, задание директорий для временных файлов не имеющих представительства на диске, задание директорий для логов не ведущих журналирование и версионирование изменений, механизмы обеспечения атомарности операций.
[[CHAOS wiki|http://en.wikipedia.org/wiki/CHAOS_%28operating_system%29]]
/***
''Name:'' Calendar plugin
''Author:'' SteveRumsby

// // updated by Jeremy Sheeley to add cacheing for reminders
// // see http://www.geocities.com/allredfaq/reminderMacros.html

''Configuration:''

|''First day of week:''|<<option txtCalFirstDay>>|(Monday = 0, Sunday = 6)|
|''First day of weekend:''|<<option txtCalStartOfWeekend>>|(Monday = 0, Sunday = 6)|

''Syntax:'' 
|{{{<<calendar>>}}}|Produce a full-year calendar for the current year|
|{{{<<calendar year>>}}}|Produce a full-year calendar for the given year|
|{{{<<calendar year month>>}}}|Produce a one-month calendar for the given month and year|
|{{{<<calendar thismonth>>}}}|Produce a one-month calendar for the current month|
|{{{<<calendar lastmonth>>}}}|Produce a one-month calendar for last month|
|{{{<<calendar nextmonth>>}}}|Produce a one-month calendar for next month|

***/
// //Modify this section to change the text displayed for the month and day names, to a different language for example. You can also change the format of the tiddler names linked to from each date, and the colours used.

// // ''Changes by ELS 2005.10.30:''
// // config.macros.calendar.handler()
// // ^^use "tbody" element for IE compatibility^^
// // ^^IE returns 2005 for current year, FF returns 105... fix year adjustment accordingly^^
// // createCalendarDays()
// // ^^use showDate() function (if defined) to render autostyled date with linked popup^^
// // calendar stylesheet definition
// // ^^use .calendar class-specific selectors, add text centering and margin settings^^

//{{{
config.macros.calendar = {};

config.macros.calendar.monthnames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
config.macros.calendar.daynames = ["M", "T", "W", "T", "F", "S", "S"];

config.macros.calendar.weekendbg = "#c0c0c0";
config.macros.calendar.monthbg = "#e0e0e0";
config.macros.calendar.holidaybg = "#ffc0c0";

//}}}
// //''Code section:''
// (you should not need to alter anything below here)//
//{{{
if(config.options.txtCalFirstDay == undefined)
  config.options.txtCalFirstDay = 0;
if(config.options.txtCalStartOfWeekend == undefined)
  config.options.txtCalStartOfWeekend = 5;

config.macros.calendar.tiddlerformat = "0DD/0MM/YYYY";  // This used to be changeable - for now, it isn't// <<smiley :-(>> 

version.extensions.calendar = { major: 0, minor: 6, revision: 0, date: new Date(2006, 1, 22)};
config.macros.calendar.monthdays = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

config.macros.calendar.holidays = [ ]; // Not sure this is required anymore - use reminders instead
//}}}

// //Is the given date a holiday?
//{{{
function calendarIsHoliday(date)
{
 var longHoliday = date.formatString("0DD/0MM/YYYY");
 var shortHoliday = date.formatString("0DD/0MM");

 for(var i = 0; i < config.macros.calendar.holidays.length; i++) {
   if(config.macros.calendar.holidays[i] == longHoliday || config.macros.calendar.holidays[i] == shortHoliday) {
     return true;
   }
 }
 return false;
}
//}}}

// //The main entry point - the macro handler.
// //Decide what sort of calendar we are creating (month or year, and which month or year)
// // Create the main calendar container and pass that to sub-ordinate functions to create the structure.
// ELS 2005.10.30: added creation and use of "tbody" for IE compatibility and fixup for year >1900//
// ELS 2005.10.30: fix year calculation for IE's getYear() function (which returns '2005' instead of '105')//
//{{{
config.macros.calendar.handler = function(place,macroName,params)
{
   var calendar = createTiddlyElement(place, "table", null, "calendar", null);
   var tbody = createTiddlyElement(calendar, "tbody", null, null, null);
   var today = new Date();
   var year = today.getYear();
   if (year<1900) year+=1900;
   if (params[0] == "thismonth")
  {
      cacheReminders(new Date(year, today.getMonth(), 1, 0, 0), 31);
      createCalendarOneMonth(tbody, year, today.getMonth());
  } 
  else if (params[0] == "lastmonth") {
      var month = today.getMonth()-1; if (month==-1) { month=11; year--; }
      cacheReminders(new Date(year, month, 1, 0, 0), 31);
      createCalendarOneMonth(tbody, year, month);
   }
   else if (params[0] == "nextmonth") {
      var month = today.getMonth()+1; if (month>11) { month=0; year++; }
      cacheReminders(new Date(year, month, 1, 0, 0), 31);
      createCalendarOneMonth(tbody, year, month);
   }
   else {
      if (params[0]) year = params[0];
      if(params[1])
      {
         cacheReminders(new Date(year, params[1]-1, 1, 0, 0), 31);
         createCalendarOneMonth(tbody, year, params[1]-1);
      }
      else
      {
         cacheReminders(new Date(year, 0, 1, 0, 0), 366);
         createCalendarYear(tbody, year);
      }
   }
  window.reminderCacheForCalendar = null;
}
//}}}
//{{{
//This global variable is used to store reminders that have been cached
//while the calendar is being rendered.  It will be renulled after the calendar is fully rendered.
window.reminderCacheForCalendar = null;
//}}}
//{{{
function cacheReminders(date, leadtime)
{
  if (window.findTiddlersWithReminders == null)
    return;
  window.reminderCacheForCalendar = {};
  var leadtimeHash = [];
  leadtimeHash [0] = 0;
  leadtimeHash [1] = leadtime;
  var t = findTiddlersWithReminders(date, leadtimeHash, null, 1);
  for(var i = 0; i < t.length; i++) {
    //just tag it in the cache, so that when we're drawing days, we can bold this one.
     window.reminderCacheForCalendar[t[i]["matchedDate"]] = "reminder:" + t[i]["params"]["title"]; 
  }
}
//}}}
//{{{
function createCalendarOneMonth(calendar, year, mon)
{
  var row = createTiddlyElement(calendar, "tr", null, null, null);
  createCalendarMonthHeader(calendar, row, config.macros.calendar.monthnames[mon] + " " + year, true, year, mon);
  row = createTiddlyElement(calendar, "tr", null, null, null);
  createCalendarDayHeader(row, 1);
  createCalendarDayRowsSingle(calendar, year, mon);
}
//}}}

//{{{
function createCalendarMonth(calendar, year, mon)
{
  var row = createTiddlyElement(calendar, "tr", null, null, null);
  createCalendarMonthHeader(calendar, row, config.macros.calendar.monthnames[mon] + " " + year, false, year, mon);
  row = createTiddlyElement(calendar, "tr", null, null, null);
  createCalendarDayHeader(row, 1);
  createCalendarDayRowsSingle(calendar, year, mon);
}
//}}}

//{{{
function createCalendarYear(calendar, year)
{
  var row;
  row = createTiddlyElement(calendar, "tr", null, null, null);
  var back = createTiddlyElement(row, "td", null, null, null);
  var backHandler = function() {
      removeChildren(calendar);
      createCalendarYear(calendar, year-1);
    };
  createTiddlyButton(back, "<", "Previous year", backHandler);
  back.align = "center";

  var yearHeader = createTiddlyElement(row, "td", null, "calendarYear", year);
  yearHeader.align = "center";
  yearHeader.setAttribute("colSpan", 19);

  var fwd = createTiddlyElement(row, "td", null, null, null);
  var fwdHandler = function() {
    removeChildren(calendar);
    createCalendarYear(calendar, year+1);
  };
  createTiddlyButton(fwd, ">", "Next year", fwdHandler);
  fwd.align = "center";

  createCalendarMonthRow(calendar, year, 0);
  createCalendarMonthRow(calendar, year, 3);
  createCalendarMonthRow(calendar, year, 6);
  createCalendarMonthRow(calendar, year, 9);
}
//}}}

//{{{
function createCalendarMonthRow(cal, year, mon)
{
  var row = createTiddlyElement(cal, "tr", null, null, null);
  createCalendarMonthHeader(cal, row, config.macros.calendar.monthnames[mon], false, year, mon);
  createCalendarMonthHeader(cal, row, config.macros.calendar.monthnames[mon+1], false, year, mon);
  createCalendarMonthHeader(cal, row, config.macros.calendar.monthnames[mon+2], false, year, mon);
  row = createTiddlyElement(cal, "tr", null, null, null);
  createCalendarDayHeader(row, 3);
  createCalendarDayRows(cal, year, mon);
}
//}}}

//{{{
function createCalendarMonthHeader(cal, row, name, nav, year, mon)
{
  var month;
  if(nav) {
    var back = createTiddlyElement(row, "td", null, null, null);
    back.align = "center";
    back.style.background = config.macros.calendar.monthbg;

/*
    back.setAttribute("colSpan", 2);

    var backYearHandler = function() {
      var newyear = year-1;
      removeChildren(cal);
      cacheReminders(new Date(newyear, mon , 1, 0, 0), 31);
      createCalendarOneMonth(cal, newyear, mon);
    };
    createTiddlyButton(back, "<<", "Previous year", backYearHandler);
*/
    var backMonHandler = function() {
      var newyear = year;
      var newmon = mon-1;
      if(newmon == -1) { newmon = 11; newyear = newyear-1;}
      removeChildren(cal);
      cacheReminders(new Date(newyear, newmon , 1, 0, 0), 31);
      createCalendarOneMonth(cal, newyear, newmon);
    };
    createTiddlyButton(back, "<", "Previous month", backMonHandler);


    month = createTiddlyElement(row, "td", null, "calendarMonthname", name)
//    month.setAttribute("colSpan", 3);
    month.setAttribute("colSpan", 5);

    var fwd = createTiddlyElement(row, "td", null, null, null);
    fwd.align = "center";
    fwd.style.background = config.macros.calendar.monthbg; 

//    fwd.setAttribute("colSpan", 2);
    var fwdMonHandler = function() {
      var newyear = year;
      var newmon = mon+1;
      if(newmon == 12) { newmon = 0; newyear = newyear+1;}
      removeChildren(cal);
      cacheReminders(new Date(newyear, newmon , 1, 0, 0), 31);
      createCalendarOneMonth(cal, newyear, newmon);
    };
    createTiddlyButton(fwd, ">", "Next month", fwdMonHandler);
/*
    var fwdYear = createTiddlyElement(row, "td", null, null, null);
    var fwdYearHandler = function() {
      var newyear = year+1;
      removeChildren(cal);
      cacheReminders(new Date(newyear, mon , 1, 0, 0), 31);
      createCalendarOneMonth(cal, newyear, mon);
    };
    createTiddlyButton(fwd, ">>", "Next year", fwdYearHandler);
*/
  } else {
    month = createTiddlyElement(row, "td", null, "calendarMonthname", name)
    month.setAttribute("colSpan", 7);
  }
  month.align = "center";
  month.style.background = config.macros.calendar.monthbg;
}
//}}}

//{{{
function createCalendarDayHeader(row, num)
{
  var cell;
  for(var i = 0; i < num; i++) {
    for(var j = 0; j < 7; j++) {
      var d = j + (config.options.txtCalFirstDay - 0);
      if(d > 6) d = d - 7;
      cell = createTiddlyElement(row, "td", null, null, config.macros.calendar.daynames[d]);

      if(d == (config.options.txtCalStartOfWeekend-0) || d == (config.options.txtCalStartOfWeekend-0+1))
        cell.style.background = config.macros.calendar.weekendbg;
    }
  }
}
//}}}

//{{{
function createCalendarDays(row, col, first, max, year, mon)
{
  var i;
  for(i = 0; i < col; i++) {
    createTiddlyElement(row, "td", null, null, null);
  }
  var day = first;
  for(i = col; i < 7; i++) {
    var d = i + (config.options.txtCalFirstDay - 0);
    if(d > 6) d = d - 7;
    var daycell = createTiddlyElement(row, "td", null, null, null);
    var isaWeekend = ((d == (config.options.txtCalStartOfWeekend-0) || d == (config.options.txtCalStartOfWeekend-0+1))? true:false);

    if(day > 0 && day <= max) {
      var celldate = new Date(year, mon, day);
      // ELS 2005.10.30: use <<date>> macro's showDate() function to create popup
      if (window.showDate) {
        showDate(daycell,celldate,"popup","DD","DD-MMM-YYYY",true, isaWeekend); 
      } else {
        if(isaWeekend) daycell.style.background = config.macros.calendar.weekendbg;
        var title = celldate.formatString(config.macros.calendar.tiddlerformat);
        if(calendarIsHoliday(celldate)) {
          daycell.style.background = config.macros.calendar.holidaybg;
        }
        if(window.findTiddlersWithReminders == null) {
          var link = createTiddlyLink(daycell, title, false);
          link.appendChild(document.createTextNode(day));
        } else {
          var button = createTiddlyButton(daycell, day, title, onClickCalendarDate);
        }
      }
    }
    day++;
  }
}
//}}}

// //We've clicked on a day in a calendar - create a suitable pop-up of options.
// //The pop-up should contain:
// // * a link to create a new entry for that date
// // * a link to create a new reminder for that date
// // * an <hr>
// // * the list of reminders for that date
//{{{
function onClickCalendarDate(e)
{
  var button = this;
  var date = button.getAttribute("title");
  var dat = new Date(date.substr(6,4), date.substr(3,2)-1, date.substr(0, 2));

  date = dat.formatString(config.macros.calendar.tiddlerformat);
  var popup = createTiddlerPopup(this);
  popup.appendChild(document.createTextNode(date));
  var newReminder = function() {
    var t = store.getTiddlers(date);
    displayTiddler(null, date, 2, null, null, false, false);
    if(t) {
      document.getElementById("editorBody" + date).value += "\n<<reminder day:" + dat.getDate() +
                                                                                         " month:" + (dat.getMonth()+1) +
                                                                                         " year:" + (dat.getYear()+1900) + " title: >>";
    } else {
      document.getElementById("editorBody" + date).value = "<<reminder day:" + dat.getDate() +
                                                                                       " month:" + (dat.getMonth()+1) +
                                                                                       " year:" + (dat.getYear()+1900) + " title: >>";
    }
  };
  var link = createTiddlyButton(popup, "New reminder", null, newReminder); 
  popup.appendChild(document.createElement("hr"));

  var t = findTiddlersWithReminders(dat, [0,14], null, 1);
  for(var i = 0; i < t.length; i++) {
    link = createTiddlyLink(popup, t[i].tiddler, false);
    link.appendChild(document.createTextNode(t[i].tiddler));
  }
}
//}}}

//{{{
function calendarMaxDays(year, mon)
{
 var max = config.macros.calendar.monthdays[mon];
 if(mon == 1 && (year % 4) == 0 && ((year % 100) != 0 || (year % 400) == 0)) {
 max++;
 }
 return max;
}
//}}}

//{{{
function createCalendarDayRows(cal, year, mon)
{
 var row = createTiddlyElement(cal, "tr", null, null, null);

 var first1 = (new Date(year, mon, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);
 if(first1 < 0) first1 = first1 + 7;
 var day1 = -first1 + 1;
 var first2 = (new Date(year, mon+1, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);
 if(first2 < 0) first2 = first2 + 7;
 var day2 = -first2 + 1;
 var first3 = (new Date(year, mon+2, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);
 if(first3 < 0) first3 = first3 + 7;
 var day3 = -first3 + 1;

 var max1 = calendarMaxDays(year, mon);
 var max2 = calendarMaxDays(year, mon+1);
 var max3 = calendarMaxDays(year, mon+2);

 while(day1 <= max1 || day2 <= max2 || day3 <= max3) {
 row = createTiddlyElement(cal, "tr", null, null, null);
 createCalendarDays(row, 0, day1, max1, year, mon); day1 += 7;
 createCalendarDays(row, 0, day2, max2, year, mon+1); day2 += 7;
 createCalendarDays(row, 0, day3, max3, year, mon+2); day3 += 7;
 }
}
//}}}

//{{{
function createCalendarDayRowsSingle(cal, year, mon)
{
 var row = createTiddlyElement(cal, "tr", null, null, null);

 var first1 = (new Date(year, mon, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);
 if(first1 < 0) first1 = first1+ 7;
 var day1 = -first1 + 1;
 var max1 = calendarMaxDays(year, mon);

 while(day1 <= max1) {
 row = createTiddlyElement(cal, "tr", null, null, null);
 createCalendarDays(row, 0, day1, max1, year, mon); day1 += 7;
 }
}
//}}}

// //ELS 2005.10.30: added styles
//{{{
setStylesheet(".calendar, .calendar table, .calendar th, .calendar tr, .calendar td { text-align:center; } .calendar, .calendar a { margin:0px !important; padding:0px !important; }", "calendarStyles");
//}}}
//{{{
Intro
=====

This document is designed to provide a list of the minimum levels of
software necessary to run the 2.6 kernels, as well as provide brief
instructions regarding any other "Gotchas" users may encounter when
trying life on the Bleeding Edge.  If upgrading from a pre-2.4.x
kernel, please consult the Changes file included with 2.4.x kernels for
additional information; most of that information will not be repeated
here.  Basically, this document assumes that your system is already
functional and running at least 2.4.x kernels.

This document is originally based on my "Changes" file for 2.0.x kernels
and therefore owes credit to the same people as that file (Jared Mauch,
Axel Boldt, Alessandro Sigala, and countless other users all over the
'net).

Current Minimal Requirements
============================

Upgrade to at *least* these software revisions before thinking you've
encountered a bug!  If you're unsure what version you're currently
running, the suggested command should tell you.

Again, keep in mind that this list assumes you are already
functionally running a Linux 2.4 kernel.  Also, not all tools are
necessary on all systems; obviously, if you don't have any ISDN
hardware, for example, you probably needn't concern yourself with
isdn4k-utils.

o  Gnu C                  3.2                     # gcc --version
o  Gnu make               3.80                    # make --version
o  binutils               2.12                    # ld -v
o  util-linux             2.10o                   # fdformat --version
o  module-init-tools      0.9.10                  # depmod -V
o  e2fsprogs              1.41.4                  # e2fsck -V
o  jfsutils               1.1.3                   # fsck.jfs -V
o  reiserfsprogs          3.6.3                   # reiserfsck -V 2>&1|grep reiserfsprogs
o  xfsprogs               2.6.0                   # xfs_db -V
o  squashfs-tools         4.0                     # mksquashfs -version
o  btrfs-progs            0.18                    # btrfsck
o  pcmciautils            004                     # pccardctl -V
o  quota-tools            3.09                    # quota -V
o  PPP                    2.4.0                   # pppd --version
o  isdn4k-utils           3.1pre1                 # isdnctrl 2>&1|grep version
o  nfs-utils              1.0.5                   # showmount --version
o  procps                 3.2.0                   # ps --version
o  oprofile               0.9                     # oprofiled --version
o  udev                   081                     # udevinfo -V
o  grub                   0.93                    # grub --version
o  mcelog		  0.6
o  iptables               1.4.2                   # iptables -V


Kernel compilation
==================

GCC
---

The gcc version requirements may vary depending on the type of CPU in your
computer.

Make
----

You will need Gnu make 3.80 or later to build the kernel.

Binutils
--------

Linux on IA-32 has recently switched from using as86 to using gas for
assembling the 16-bit boot code, removing the need for as86 to compile
your kernel.  This change does, however, mean that you need a recent
release of binutils.

Perl
----

You will need perl 5 and the following modules: Getopt::Long, Getopt::Std,
File::Basename, and File::Find to build the kernel.


System utilities
================

Architectural changes
---------------------

DevFS has been obsoleted in favour of udev
(http://www.kernel.org/pub/linux/utils/kernel/hotplug/)

32-bit UID support is now in place.  Have fun!

Linux documentation for functions is transitioning to inline
documentation via specially-formatted comments near their
definitions in the source.  These comments can be combined with the
SGML templates in the Documentation/DocBook directory to make DocBook
files, which can then be converted by DocBook stylesheets to PostScript,
HTML, PDF files, and several other formats.  In order to convert from
DocBook format to a format of your choice, you'll need to install Jade as
well as the desired DocBook stylesheets.

Util-linux
----------

New versions of util-linux provide *fdisk support for larger disks,
support new options to mount, recognize more supported partition
types, have a fdformat which works with 2.4 kernels, and similar goodies.
You'll probably want to upgrade.

Ksymoops
--------

If the unthinkable happens and your kernel oopses, you may need the
ksymoops tool to decode it, but in most cases you don't.
In the 2.6 kernel it is generally preferred to build the kernel with
CONFIG_KALLSYMS so that it produces readable dumps that can be used as-is
(this also produces better output than ksymoops).
If for some reason your kernel is not build with CONFIG_KALLSYMS and
you have no way to rebuild and reproduce the Oops with that option, then
you can still decode that Oops with ksymoops.

Module-Init-Tools
-----------------

A new module loader is now in the kernel that requires module-init-tools
to use.  It is backward compatible with the 2.4.x series kernels.

Mkinitrd
--------

These changes to the /lib/modules file tree layout also require that
mkinitrd be upgraded.

E2fsprogs
---------

The latest version of e2fsprogs fixes several bugs in fsck and
debugfs.  Obviously, it's a good idea to upgrade.

JFSutils
--------

The jfsutils package contains the utilities for the file system.
The following utilities are available:
o fsck.jfs - initiate replay of the transaction log, and check
  and repair a JFS formatted partition.
o mkfs.jfs - create a JFS formatted partition.
o other file system utilities are also available in this package.

Reiserfsprogs
-------------

The reiserfsprogs package should be used for reiserfs-3.6.x
(Linux kernels 2.4.x). It is a combined package and contains working
versions of mkreiserfs, resize_reiserfs, debugreiserfs and
reiserfsck. These utils work on both i386 and alpha platforms.

Xfsprogs
--------

The latest version of xfsprogs contains mkfs.xfs, xfs_db, and the
xfs_repair utilities, among others, for the XFS filesystem.  It is
architecture independent and any version from 2.0.0 onward should
work correctly with this version of the XFS kernel code (2.6.0 or
later is recommended, due to some significant improvements).

PCMCIAutils
-----------

PCMCIAutils replaces pcmcia-cs (see below). It properly sets up
PCMCIA sockets at system startup and loads the appropriate modules
for 16-bit PCMCIA devices if the kernel is modularized and the hotplug
subsystem is used.

Pcmcia-cs
---------

PCMCIA (PC Card) support is now partially implemented in the main
kernel source. The "pcmciautils" package (see above) replaces pcmcia-cs
for newest kernels.

Quota-tools
-----------

Support for 32 bit uid's and gid's is required if you want to use
the newer version 2 quota format.  Quota-tools version 3.07 and
newer has this support.  Use the recommended version or newer
from the table above.

Intel IA32 microcode
--------------------

A driver has been added to allow updating of Intel IA32 microcode,
accessible as a normal (misc) character device.  If you are not using
udev you may need to:

mkdir /dev/cpu
mknod /dev/cpu/microcode c 10 184
chmod 0644 /dev/cpu/microcode

as root before you can use this.  You'll probably also want to
get the user-space microcode_ctl utility to use with this.

Powertweak
----------

If you are running v0.1.17 or earlier, you should upgrade to
version v0.99.0 or higher. Running old versions may cause problems
with programs using shared memory.

udev
----
udev is a userspace application for populating /dev dynamically with
only entries for devices actually present.  udev replaces the basic
functionality of devfs, while allowing persistent device naming for
devices.

FUSE
----

Needs libfuse 2.4.0 or later.  Absolute minimum is 2.3.0 but mount
options 'direct_io' and 'kernel_cache' won't work.

Networking
==========

General changes
---------------

If you have advanced network configuration needs, you should probably
consider using the network tools from ip-route2.

Packet Filter / NAT
-------------------
The packet filtering and NAT code uses the same tools like the previous 2.4.x
kernel series (iptables).  It still includes backwards-compatibility modules
for 2.2.x-style ipchains and 2.0.x-style ipfwadm.

PPP
---

The PPP driver has been restructured to support multilink and to
enable it to operate over diverse media layers.  If you use PPP,
upgrade pppd to at least 2.4.0.

If you are not using udev, you must have the device file /dev/ppp
which can be made by:

mknod /dev/ppp c 108 0

as root.

Isdn4k-utils
------------

Due to changes in the length of the phone number field, isdn4k-utils
needs to be recompiled or (preferably) upgraded.

NFS-utils
---------

In 2.4 and earlier kernels, the nfs server needed to know about any
client that expected to be able to access files via NFS.  This
information would be given to the kernel by "mountd" when the client
mounted the filesystem, or by "exportfs" at system startup.  exportfs
would take information about active clients from /var/lib/nfs/rmtab.

This approach is quite fragile as it depends on rmtab being correct
which is not always easy, particularly when trying to implement
fail-over.  Even when the system is working well, rmtab suffers from
getting lots of old entries that never get removed.

With 2.6 we have the option of having the kernel tell mountd when it
gets a request from an unknown host, and mountd can give appropriate
export information to the kernel.  This removes the dependency on
rmtab and means that the kernel only needs to know about currently
active clients.

To enable this new functionality, you need to:

  mount -t nfsd nfsd /proc/fs/nfsd

before running exportfs or mountd.  It is recommended that all NFS
services be protected from the internet-at-large by a firewall where
that is possible.

mcelog
------

In Linux 2.6.31+ the i386 kernel needs to run the mcelog utility
as a regular cronjob similar to the x86-64 kernel to process and log
machine check events when CONFIG_X86_NEW_MCE is enabled. Machine check
events are errors reported by the CPU. Processing them is strongly encouraged.
All x86-64 kernels since 2.6.4 require the mcelog utility to
process machine checks.

Getting updated software
========================

Kernel compilation
******************

gcc
---
o  <ftp://ftp.gnu.org/gnu/gcc/>

Make
----
o  <ftp://ftp.gnu.org/gnu/make/>

Binutils
--------
o  <ftp://ftp.kernel.org/pub/linux/devel/binutils/>

System utilities
****************

Util-linux
----------
o  <ftp://ftp.kernel.org/pub/linux/utils/util-linux/>

Ksymoops
--------
o  <ftp://ftp.kernel.org/pub/linux/utils/kernel/ksymoops/v2.4/>

Module-Init-Tools
-----------------
o  <ftp://ftp.kernel.org/pub/linux/kernel/people/rusty/modules/>

Mkinitrd
--------
o  <ftp://rawhide.redhat.com/pub/rawhide/SRPMS/SRPMS/>

E2fsprogs
---------
o  <http://prdownloads.sourceforge.net/e2fsprogs/e2fsprogs-1.29.tar.gz>

JFSutils
--------
o  <http://jfs.sourceforge.net/>

Reiserfsprogs
-------------
o  <http://www.namesys.com/pub/reiserfsprogs/reiserfsprogs-3.6.3.tar.gz>

Xfsprogs
--------
o  <ftp://oss.sgi.com/projects/xfs/download/>

Pcmciautils
-----------
o  <ftp://ftp.kernel.org/pub/linux/utils/kernel/pcmcia/>

Pcmcia-cs
---------
o  <http://pcmcia-cs.sourceforge.net/>

Quota-tools
----------
o  <http://sourceforge.net/projects/linuxquota/>

DocBook Stylesheets
-------------------
o  <http://nwalsh.com/docbook/dsssl/>

XMLTO XSLT Frontend
-------------------
o  <http://cyberelk.net/tim/xmlto/>

Intel P6 microcode
------------------
o  <http://www.urbanmyth.org/microcode/>

Powertweak
----------
o  <http://powertweak.sourceforge.net/>

udev
----
o <http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev.html>

FUSE
----
o <http://sourceforge.net/projects/fuse>

mcelog
------
o <ftp://ftp.kernel.org/pub/linux/utils/cpu/mce/mcelog/>

Networking
**********

PPP
---
o  <ftp://ftp.samba.org/pub/ppp/ppp-2.4.0.tar.gz>

Isdn4k-utils
------------
o  <ftp://ftp.isdn4linux.de/pub/isdn4linux/utils/isdn4k-utils.v3.1pre1.tar.gz>

NFS-utils
---------
o  <http://sourceforge.net/project/showfiles.php?group_id=14>

Iptables
--------
o  <http://www.iptables.org/downloads.html>

Ip-route2
---------
o  <ftp://ftp.tux.org/pub/net/ip-routing/iproute2-2.2.4-now-ss991023.tar.gz>

OProfile
--------
o  <http://oprofile.sf.net/download/>

NFS-Utils
---------
o  <http://nfs.sourceforge.net/>
//}}}
//{{{
Intro
=====

This document is designed to provide a list of the minimum levels of
software necessary to run the 2.6 kernels, as well as provide brief
instructions regarding any other "Gotchas" users may encounter when
trying life on the Bleeding Edge.  If upgrading from a pre-2.4.x
kernel, please consult the Changes file included with 2.4.x kernels for
additional information; most of that information will not be repeated
here.  Basically, this document assumes that your system is already
functional and running at least 2.4.x kernels.

This document is originally based on my "Changes" file for 2.0.x kernels
and therefore owes credit to the same people as that file (Jared Mauch,
Axel Boldt, Alessandro Sigala, and countless other users all over the
'net).

Current Minimal Requirements
============================

Upgrade to at *least* these software revisions before thinking you've
encountered a bug!  If you're unsure what version you're currently
running, the suggested command should tell you.

Again, keep in mind that this list assumes you are already
functionally running a Linux 2.4 kernel.  Also, not all tools are
necessary on all systems; obviously, if you don't have any ISDN
hardware, for example, you probably needn't concern yourself with
isdn4k-utils.

o  Gnu C                  3.2                     # gcc --version
o  Gnu make               3.80                    # make --version
o  binutils               2.12                    # ld -v
o  util-linux             2.10o                   # fdformat --version
o  module-init-tools      0.9.10                  # depmod -V
o  e2fsprogs              1.41.4                  # e2fsck -V
o  jfsutils               1.1.3                   # fsck.jfs -V
o  reiserfsprogs          3.6.3                   # reiserfsck -V 2>&1|grep reiserfsprogs
o  reiser4progs           1.0.0                   # fsck.reiser4 -V
o  xfsprogs               2.6.0                   # xfs_db -V
o  squashfs-tools         4.0                     # mksquashfs -version
o  btrfs-progs            0.18                    # btrfsck
o  pcmciautils            004                     # pccardctl -V
o  quota-tools            3.09                    # quota -V
o  PPP                    2.4.0                   # pppd --version
o  isdn4k-utils           3.1pre1                 # isdnctrl 2>&1|grep version
o  nfs-utils              1.0.5                   # showmount --version
o  procps                 3.2.0                   # ps --version
o  oprofile               0.9                     # oprofiled --version
o  udev                   081                     # udevinfo -V
o  grub                   0.93                    # grub --version
o  mcelog		  0.6
o  iptables               1.4.2                   # iptables -V


Kernel compilation
==================

GCC
---

The gcc version requirements may vary depending on the type of CPU in your
computer.

Make
----

You will need Gnu make 3.80 or later to build the kernel.

Binutils
--------

Linux on IA-32 has recently switched from using as86 to using gas for
assembling the 16-bit boot code, removing the need for as86 to compile
your kernel.  This change does, however, mean that you need a recent
release of binutils.

Perl
----

You will need perl 5 and the following modules: Getopt::Long, Getopt::Std,
File::Basename, and File::Find to build the kernel.


System utilities
================

Architectural changes
---------------------

DevFS has been obsoleted in favour of udev
(http://www.kernel.org/pub/linux/utils/kernel/hotplug/)

32-bit UID support is now in place.  Have fun!

Linux documentation for functions is transitioning to inline
documentation via specially-formatted comments near their
definitions in the source.  These comments can be combined with the
SGML templates in the Documentation/DocBook directory to make DocBook
files, which can then be converted by DocBook stylesheets to PostScript,
HTML, PDF files, and several other formats.  In order to convert from
DocBook format to a format of your choice, you'll need to install Jade as
well as the desired DocBook stylesheets.

Util-linux
----------

New versions of util-linux provide *fdisk support for larger disks,
support new options to mount, recognize more supported partition
types, have a fdformat which works with 2.4 kernels, and similar goodies.
You'll probably want to upgrade.

Ksymoops
--------

If the unthinkable happens and your kernel oopses, you may need the
ksymoops tool to decode it, but in most cases you don't.
In the 2.6 kernel it is generally preferred to build the kernel with
CONFIG_KALLSYMS so that it produces readable dumps that can be used as-is
(this also produces better output than ksymoops).
If for some reason your kernel is not build with CONFIG_KALLSYMS and
you have no way to rebuild and reproduce the Oops with that option, then
you can still decode that Oops with ksymoops.

Module-Init-Tools
-----------------

A new module loader is now in the kernel that requires module-init-tools
to use.  It is backward compatible with the 2.4.x series kernels.

Mkinitrd
--------

These changes to the /lib/modules file tree layout also require that
mkinitrd be upgraded.

E2fsprogs
---------

The latest version of e2fsprogs fixes several bugs in fsck and
debugfs.  Obviously, it's a good idea to upgrade.

JFSutils
--------

The jfsutils package contains the utilities for the file system.
The following utilities are available:
o fsck.jfs - initiate replay of the transaction log, and check
  and repair a JFS formatted partition.
o mkfs.jfs - create a JFS formatted partition.
o other file system utilities are also available in this package.

Reiserfsprogs
-------------

The reiserfsprogs package should be used for reiserfs-3.6.x
(Linux kernels 2.4.x). It is a combined package and contains working
versions of mkreiserfs, resize_reiserfs, debugreiserfs and
reiserfsck. These utils work on both i386 and alpha platforms.

Reiser4progs
------------

The reiser4progs package contains utilities for the reiser4 file system.
Detailed instructions are provided in the README file located at:
<ftp://ftp.namesys.com/pub/reiser4progs/README>.

Xfsprogs
--------

The latest version of xfsprogs contains mkfs.xfs, xfs_db, and the
xfs_repair utilities, among others, for the XFS filesystem.  It is
architecture independent and any version from 2.0.0 onward should
work correctly with this version of the XFS kernel code (2.6.0 or
later is recommended, due to some significant improvements).

PCMCIAutils
-----------

PCMCIAutils replaces pcmcia-cs (see below). It properly sets up
PCMCIA sockets at system startup and loads the appropriate modules
for 16-bit PCMCIA devices if the kernel is modularized and the hotplug
subsystem is used.

Pcmcia-cs
---------

PCMCIA (PC Card) support is now partially implemented in the main
kernel source. The "pcmciautils" package (see above) replaces pcmcia-cs
for newest kernels.

Quota-tools
-----------

Support for 32 bit uid's and gid's is required if you want to use
the newer version 2 quota format.  Quota-tools version 3.07 and
newer has this support.  Use the recommended version or newer
from the table above.

Intel IA32 microcode
--------------------

A driver has been added to allow updating of Intel IA32 microcode,
accessible as a normal (misc) character device.  If you are not using
udev you may need to:

mkdir /dev/cpu
mknod /dev/cpu/microcode c 10 184
chmod 0644 /dev/cpu/microcode

as root before you can use this.  You'll probably also want to
get the user-space microcode_ctl utility to use with this.

Powertweak
----------

If you are running v0.1.17 or earlier, you should upgrade to
version v0.99.0 or higher. Running old versions may cause problems
with programs using shared memory.

udev
----
udev is a userspace application for populating /dev dynamically with
only entries for devices actually present.  udev replaces the basic
functionality of devfs, while allowing persistent device naming for
devices.

FUSE
----

Needs libfuse 2.4.0 or later.  Absolute minimum is 2.3.0 but mount
options 'direct_io' and 'kernel_cache' won't work.

Networking
==========

General changes
---------------

If you have advanced network configuration needs, you should probably
consider using the network tools from ip-route2.

Packet Filter / NAT
-------------------
The packet filtering and NAT code uses the same tools like the previous 2.4.x
kernel series (iptables).  It still includes backwards-compatibility modules
for 2.2.x-style ipchains and 2.0.x-style ipfwadm.

PPP
---

The PPP driver has been restructured to support multilink and to
enable it to operate over diverse media layers.  If you use PPP,
upgrade pppd to at least 2.4.0.

If you are not using udev, you must have the device file /dev/ppp
which can be made by:

mknod /dev/ppp c 108 0

as root.

Isdn4k-utils
------------

Due to changes in the length of the phone number field, isdn4k-utils
needs to be recompiled or (preferably) upgraded.

NFS-utils
---------

In 2.4 and earlier kernels, the nfs server needed to know about any
client that expected to be able to access files via NFS.  This
information would be given to the kernel by "mountd" when the client
mounted the filesystem, or by "exportfs" at system startup.  exportfs
would take information about active clients from /var/lib/nfs/rmtab.

This approach is quite fragile as it depends on rmtab being correct
which is not always easy, particularly when trying to implement
fail-over.  Even when the system is working well, rmtab suffers from
getting lots of old entries that never get removed.

With 2.6 we have the option of having the kernel tell mountd when it
gets a request from an unknown host, and mountd can give appropriate
export information to the kernel.  This removes the dependency on
rmtab and means that the kernel only needs to know about currently
active clients.

To enable this new functionality, you need to:

  mount -t nfsd nfsd /proc/fs/nfsd

before running exportfs or mountd.  It is recommended that all NFS
services be protected from the internet-at-large by a firewall where
that is possible.

mcelog
------

In Linux 2.6.31+ the i386 kernel needs to run the mcelog utility
as a regular cronjob similar to the x86-64 kernel to process and log
machine check events when CONFIG_X86_NEW_MCE is enabled. Machine check
events are errors reported by the CPU. Processing them is strongly encouraged.
All x86-64 kernels since 2.6.4 require the mcelog utility to
process machine checks.

Getting updated software
========================

Kernel compilation
******************

gcc
---
o  <ftp://ftp.gnu.org/gnu/gcc/>

Make
----
o  <ftp://ftp.gnu.org/gnu/make/>

Binutils
--------
o  <ftp://ftp.kernel.org/pub/linux/devel/binutils/>

System utilities
****************

Util-linux
----------
o  <ftp://ftp.kernel.org/pub/linux/utils/util-linux/>

Ksymoops
--------
o  <ftp://ftp.kernel.org/pub/linux/utils/kernel/ksymoops/v2.4/>

Module-Init-Tools
-----------------
o  <ftp://ftp.kernel.org/pub/linux/kernel/people/rusty/modules/>

Mkinitrd
--------
o  <ftp://rawhide.redhat.com/pub/rawhide/SRPMS/SRPMS/>

E2fsprogs
---------
o  <http://prdownloads.sourceforge.net/e2fsprogs/e2fsprogs-1.29.tar.gz>

JFSutils
--------
o  <http://jfs.sourceforge.net/>

Reiserfsprogs
-------------
o  <http://www.namesys.com/pub/reiserfsprogs/reiserfsprogs-3.6.3.tar.gz>

Reiser4progs
------------
o  <ftp://ftp.namesys.com/pub/reiser4progs/>

Xfsprogs
--------
o  <ftp://oss.sgi.com/projects/xfs/download/>

Pcmciautils
-----------
o  <ftp://ftp.kernel.org/pub/linux/utils/kernel/pcmcia/>

Pcmcia-cs
---------
o  <http://pcmcia-cs.sourceforge.net/>

Quota-tools
----------
o  <http://sourceforge.net/projects/linuxquota/>

DocBook Stylesheets
-------------------
o  <http://nwalsh.com/docbook/dsssl/>

XMLTO XSLT Frontend
-------------------
o  <http://cyberelk.net/tim/xmlto/>

Intel P6 microcode
------------------
o  <http://www.urbanmyth.org/microcode/>

Powertweak
----------
o  <http://powertweak.sourceforge.net/>

udev
----
o <http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev.html>

FUSE
----
o <http://sourceforge.net/projects/fuse>

mcelog
------
o <ftp://ftp.kernel.org/pub/linux/utils/cpu/mce/mcelog/>

Networking
**********

PPP
---
o  <ftp://ftp.samba.org/pub/ppp/ppp-2.4.0.tar.gz>

Isdn4k-utils
------------
o  <ftp://ftp.isdn4linux.de/pub/isdn4linux/utils/isdn4k-utils.v3.1pre1.tar.gz>

NFS-utils
---------
o  <http://sourceforge.net/project/showfiles.php?group_id=14>

Iptables
--------
o  <http://www.iptables.org/downloads.html>

Ip-route2
---------
o  <ftp://ftp.tux.org/pub/net/ip-routing/iproute2-2.2.4-now-ss991023.tar.gz>

OProfile
--------
o  <http://oprofile.sf.net/download/>

NFS-Utils
---------
o  <http://nfs.sourceforge.net/>


//}}}

Для установки Chromium в Windows достаточно скачать установщик с сайта http://getchromium.org/
/***
|Name:|CloseOnCancelPlugin|
|Description:|Closes the tiddler if you click new tiddler then cancel. Default behaviour is to leave it open|
|Version:|3.0.1 Rev: 3861|
|Source:|http://mptw.tiddlyspot.com/#CloseOnCancelPlugin|
***/
//{{{
merge(config.commands.cancelTiddler,{
	handler_mptw_orig_closeUnsaved: config.commands.cancelTiddler.handler,
	handler: function(event,src,title) {
		this.handler_mptw_orig_closeUnsaved(event,src,title);
		if (!store.tiddlerExists(title) && !store.isShadowTiddler(title))
			story.closeTiddler(title,true);
	 	return false;
	}
});
//}}}

Name: MptwTeal
Background: #fff
Foreground: #000
PrimaryPale: #B5D1DF
PrimaryLight: #618FA9
PrimaryMid: #1a3844
PrimaryDark: #000
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #f8f8f8
TertiaryLight: #bbb
TertiaryMid: #999
TertiaryDark: #888
Error: #f88
#[[briar|http://briar.sourceforge.net/index.html]]
Распределённая система контроля версий написанная на JavaScript как фрондэнд к Fossil
<<miniBrowser noplayer http://darkcopy.com/fullscreen.html>>
/***
|''Name:''|DateFormatString|
|''Version:''||
|''Source:''|[[AiddlyWiki|http://aiddlywiki.sourceforge.net]]|
|''Author:''|[[Arphen Lin|mailto:arphenlin@gmail.com]]|
|''Type:''|WikiBar addon|
|''Required:''|WikiBar 2.0.0+|
!Description
Add date format string syntax.
!Installation
#Install WikiBar firstly.
#Create your addon as a tiddler and add 'wikibarAddons' tag.
!Code
***/
//{{{

//----------------------------------------------------------------------------
// addon install function: this is a must
//----------------------------------------------------------------------------
function wikibar_addonInstall(unused)
{
  // define tools
  var dateFormatString={
    TYPE:'MENU',
    CAPTION: 'date format string',
    TOOLTIP: 'often used with \"today\" macro',
    YYYY:
    {
      TOOLTIP:    'full year',
      syntax: 'YYYY',
      HANDLER: wikibar_editFormatByCursor
    },
    YY:
    {
      TOOLTIP:    '2-digit year',
      syntax: 'YY',
      HANDLER: wikibar_editFormatByCursor
    },
    MMM:
    {
      TOOLTIP:    'month name',
      syntax: 'MMM',
      HANDLER: wikibar_editFormatByCursor
    },
    MM:
    {
      TOOLTIP:    'month',
      syntax: 'MM',
      HANDLER: wikibar_editFormatByCursor
    },
    OMM:
    {
      TOOLTIP:    'zero-leading month',
      syntax: '0MM',
      HANDLER: wikibar_editFormatByCursor
    },
    DDD:
    {
      TOOLTIP:    'week day',
      syntax: 'DDD',
      HANDLER: wikibar_editFormatByCursor
    },
    DD:
    {
      TOOLTIP:    'day',
      syntax: 'DD',
      HANDLER: wikibar_editFormatByCursor
    },
    '0DD':
    {
      TOOLTIP:    'zero-leading day',
      syntax: '0DD',
      HANDLER: wikibar_editFormatByCursor
    },
    DDth:
    {
      TOOLTIP:    'day with trailing (English) suffix',
      syntax: 'DDth',
      HANDLER: wikibar_editFormatByCursor
    },
    hh:
    {
      TOOLTIP:    'hour',
      syntax: 'hh',
      HANDLER: wikibar_editFormatByCursor
    },
    '0hh':
    {
      TOOLTIP:    'zero-leading hour',
      syntax: '0hh',
      HANDLER: wikibar_editFormatByCursor
    },
    mm:
    {
      TOOLTIP:    'minute',
      syntax: 'mm',
      HANDLER: wikibar_editFormatByCursor
    },
    '0mm':
    {
      TOOLTIP:    'zero-leading minute',
      syntax: '0mm',
      HANDLER: wikibar_editFormatByCursor
    },
    ss:
    {
      TOOLTIP:    'second',
      syntax: 'ss',
      HANDLER: wikibar_editFormatByCursor
    },
    '0ss':
    {
      TOOLTIP:    'zero-leading second',
      syntax: '0ss',
      HANDLER: wikibar_editFormatByCursor
    }
  };

  // register tools
  wikibarStore.addon.dateFormatString = dateFormatString;
}

// for debugging: you can turn it off in final release ----------------------
wikibar_addonInstall();


//}}}
/***
|Name|[[DatePlugin]]|
|Source|http://www.TiddlyTools.com/#DatePlugin|
|Documentation|http://www.TiddlyTools.com/#DatePluginInfo|
|Version|2.7.2|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|formatted dates plus popup menu with 'journal' link, changes and (optional) reminders|
This plugin provides a general approach to displaying formatted dates and/or links and popups that permit easy navigation and management of tiddlers based on their creation/modification dates.
!!!!!Documentation
>see [[DatePluginInfo]]
!!!!!Configuration
<<<
<<option chkDatePopupHideCreated>> omit 'created' section from date popups
<<option chkDatePopupHideChanged>> omit 'changed' section from date popups
<<option chkDatePopupHideTagged>> omit 'tagged' section from date popups
<<option chkDatePopupHideReminders>> omit 'reminders' section from date popups
<<option chkShowJulianDate>> display Julian day number (1-365) below current date

see [[DatePluginConfig]] for additional configuration settings, for use in calendar displays, including:
*date formats
*color-coded backgrounds
*annual fixed-date holidays
*weekends
<<<
!!!!!Revisions
<<<
2010.12.15 2.7.2 omit date highlighting when hiding popup items (created/changed/tagged/reminders)
|please see [[DatePluginInfo]] for additional revision details|
2005.10.30 0.9.0 pre-release
<<<
!!!!!Code
***/
//{{{
version.extensions.DatePlugin= {major: 2, minor: 7, revision: 2, date: new Date(2010,12,15)};

config.macros.date = {
	format: 'YYYY.0MM.0DD', // default date display format
	linkformat: 'YYYY.0MM.0DD', // 'dated tiddler' link format
	linkedbg: '#babb1e',
	todaybg: '#ffab1e',
	weekendbg: '#c0c0c0',
	holidaybg: '#ffaace',
	createdbg: '#bbeeff',
	modifiedsbg: '#bbeeff',
	remindersbg: '#c0ffee',
	weekend: [ 1,0,0,0,0,0,1 ], // [ day index values: sun=0, mon=1, tue=2, wed=3, thu=4, fri=5, sat=6 ],
	holidays: [ '01/01', '07/04', '07/24', '11/24' ]
		// NewYearsDay, IndependenceDay(US), Eric's Birthday (hooray!), Thanksgiving(US)
};

config.macros.date.handler = function(place,macroName,params)
{
	// default: display current date
	var now =new Date();
	var date=now;
	var mode='display';
	if (params[0]&&['display','popup','link'].contains(params[0].toLowerCase()))
		{ mode=params[0]; params.shift(); }

	if (!params[0] || params[0]=='today')
		{ params.shift(); }
	else if (params[0]=='filedate')
		{ date=new Date(document.lastModified); params.shift(); }
	else if (params[0]=='tiddler')
		{ date=store.getTiddler(story.findContainingTiddler(place).id.substr(7)).modified; params.shift(); }
	else if (params[0].substr(0,8)=='tiddler:')
		{ var t; if ((t=store.getTiddler(params[0].substr(8)))) date=t.modified; params.shift(); }
	else {
		var y = eval(params.shift().replace(/Y/ig,(now.getYear()<1900)?now.getYear()+1900:now.getYear()));
		var m = eval(params.shift().replace(/M/ig,now.getMonth()+1));
		var d = eval(params.shift().replace(/D/ig,now.getDate()+0));
		date = new Date(y,m-1,d);
	}
	// date format with optional custom override
	var format=this.format; if (params[0]) format=params.shift();
	var linkformat=this.linkformat; if (params[0]) linkformat=params.shift();
	showDate(place,date,mode,format,linkformat);
}

window.showDate=showDate;
function showDate(place,date,mode,format,linkformat,autostyle,weekend)
{
	mode	  =mode||'display';
	format	  =format||config.macros.date.format;
	linkformat=linkformat||config.macros.date.linkformat;

	// format the date output
	var title=date.formatString(format);
	var linkto=date.formatString(linkformat);

	// just show the formatted output
	if (mode=='display') { place.appendChild(document.createTextNode(title)); return; }

	// link to a 'dated tiddler'
	var link = createTiddlyLink(place, linkto, false);
	link.appendChild(document.createTextNode(title));
	link.title = linkto;
	link.date = date;
	link.format = format;
	link.linkformat = linkformat;

	// if using a popup menu, replace click handler for dated tiddler link
	// with handler for popup and make link text non-italic (i.e., an 'existing link' look)
	if (mode=='popup') {
		link.onclick = onClickDatePopup;
		link.style.fontStyle='normal';
	}
	// format the popup link to show what kind of info it contains (for use with calendar generators)
	if (autostyle) setDateStyle(place,link,weekend);
}
//}}}
//{{{
// NOTE: This function provides default logic for setting the date style when displayed in a calendar
// To customize the date style logic, please see[[DatePluginConfig]]
function setDateStyle(place,link,weekend) {
	// alias variable names for code readability
	var date=link.date;
	var fmt=link.linkformat;
	var linkto=date.formatString(fmt);
	var cmd=config.macros.date;

	var co=config.options; // abbrev

	if ((weekend!==undefined?weekend:isWeekend(date))&&(cmd.weekendbg!=''))
		{ place.style.background = cmd.weekendbg; }
	if (hasModifieds(date)||hasCreateds(date)||hasTagged(date,fmt))
		{ link.style.fontStyle='normal'; link.style.fontWeight='bold'; }
	if (hasReminders(date))
		{ link.style.textDecoration='underline'; }
	if (isToday(date))
		{ link.style.border='1px solid black'; }
	if (isHoliday(date)&&(cmd.holidaybg!=''))
		{ place.style.background = cmd.holidaybg; }
	if (hasCreateds(date)&&(cmd.createdbg!=''))
		{ place.style.background = cmd.createdbg; }
	if (hasModifieds(date)&&(cmd.modifiedsbg!=''))
		{ place.style.background = cmd.modifiedsbg; }
	if ((hasTagged(date,fmt)||store.tiddlerExists(linkto))&&(cmd.linkedbg!=''))
		{ place.style.background = cmd.linkedbg; }
	if (hasReminders(date)&&(cmd.remindersbg!=''))
		{ place.style.background = cmd.remindersbg; }
	if (isToday(date)&&(cmd.todaybg!=''))
		{ place.style.background = cmd.todaybg; }
	if (config.options.chkShowJulianDate) { // optional display of Julian date numbers
		var m=[0,31,59,90,120,151,181,212,243,273,304,334];
		var d=date.getDate()+m[date.getMonth()];
		var y=date.getFullYear();
		if (date.getMonth()>1 && (y%4==0 && y%100!=0) || y%400==0)
			d++; // after February in a leap year
		wikify('@@font-size:80%;<br>'+d+'@@',place);
	}

}
//}}}
//{{{
function isToday(date) // returns true if date is today
	{ var now=new Date(); return ((now-date>=0) && (now-date<86400000)); }
function isWeekend(date) // returns true if date is a weekend
	{ return (config.macros.date.weekend[date.getDay()]); }
function isHoliday(date) // returns true if date is a holiday
{
	var longHoliday = date.formatString('0MM/0DD/YYYY');
	var shortHoliday = date.formatString('0MM/0DD');
	for(var i = 0; i < config.macros.date.holidays.length; i++) {
		var holiday=config.macros.date.holidays[i];
		if (holiday==longHoliday||holiday==shortHoliday) return true;
	}
	return false;
}
//}}}
//{{{
// Event handler for clicking on a day popup
function onClickDatePopup(e) { e=e||window.event;
	var p=Popup.create(this); if (!p) return false;
	// always show dated tiddler link (or just date, if readOnly) at the top...
	if (!readOnly || store.tiddlerExists(this.date.formatString(this.linkformat)))
		createTiddlyLink(createTiddlyElement(p,'li'),this.date.formatString(this.linkformat),true);
	else
		createTiddlyText(createTiddlyElement(p,'li'),this.date.formatString(this.linkformat));
	addCreatedsToPopup(p,this.date,this.format);
	addModifiedsToPopup(p,this.date,this.format);
	addTaggedToPopup(p,this.date,this.linkformat);
	addRemindersToPopup(p,this.date,this.linkformat);
	Popup.show(); e.cancelBubble=true; if(e.stopPropagation)e.stopPropagation(); return false;
}
//}}}
//{{{
function indexCreateds() // build list of tiddlers, hash indexed by creation date
{
	var createds= { };
	var tiddlers = store.getTiddlers('title','excludeLists');
	for (var t = 0; t < tiddlers.length; t++) {
		var date = tiddlers[t].created.formatString('YYYY0MM0DD')
		if (!createds[date])
			createds[date]=new Array();
		createds[date].push(tiddlers[t].title);
	}
	return createds;
}
function hasCreateds(date) // returns true if date has created tiddlers
{
	if (config.options.chkDatePopupHideCreated) return false;
	if (!config.macros.date.createds) config.macros.date.createds=indexCreateds();
	return (config.macros.date.createds[date.formatString('YYYY0MM0DD')]!=undefined);
}

function addCreatedsToPopup(p,when,format)
{
	if (config.options.chkDatePopupHideCreated) return false;
	var force=(store.isDirty() && when.formatString('YYYY0MM0DD')==new Date().formatString('YYYY0MM0DD'));
	if (force || !config.macros.date.createds) config.macros.date.createds=indexCreateds();
	var indent=String.fromCharCode(160)+String.fromCharCode(160);
	var createds = config.macros.date.createds[when.formatString('YYYY0MM0DD')];
	if (createds) {
		createds.sort();
		var e=createTiddlyElement(p,'div',null,null,'created ('+createds.length+')');
		for(var t=0; t<createds.length; t++) {
			var link=createTiddlyLink(createTiddlyElement(p,'li'),createds[t],false);
			link.appendChild(document.createTextNode(indent+createds[t]));
		}
	}
}
//}}}
//{{{
function indexModifieds() // build list of tiddlers, hash indexed by modification date
{
	var modifieds= { };
	var tiddlers = store.getTiddlers('title','excludeLists');
	for (var t = 0; t < tiddlers.length; t++) {
		var date = tiddlers[t].modified.formatString('YYYY0MM0DD')
		if (!modifieds[date])
			modifieds[date]=new Array();
		modifieds[date].push(tiddlers[t].title);
	}
	return modifieds;
}
function hasModifieds(date) // returns true if date has modified tiddlers
{
	if (config.options.chkDatePopupHideChanged) return false;
	if (!config.macros.date.modifieds) config.macros.date.modifieds = indexModifieds();
	return (config.macros.date.modifieds[date.formatString('YYYY0MM0DD')]!=undefined);
}

function addModifiedsToPopup(p,when,format)
{
	if (config.options.chkDatePopupHideChanged) return false;
	var date=when.formatString('YYYY0MM0DD');
	var force=(store.isDirty() && date==new Date().formatString('YYYY0MM0DD'));
	if (force || !config.macros.date.modifieds) config.macros.date.modifieds=indexModifieds();
	var indent=String.fromCharCode(160)+String.fromCharCode(160);
	var mods = config.macros.date.modifieds[date];
	if (mods) {
		// if a tiddler was created on this date, don't list it in the 'changed' section
		if (config.macros.date.createds && config.macros.date.createds[date]) {
			var temp=[];
			for(var t=0; t<mods.length; t++)
				if (!config.macros.date.createds[date].contains(mods[t]))
					temp.push(mods[t]);
			mods=temp;
		}
		mods.sort();
		var e=createTiddlyElement(p,'div',null,null,'changed ('+mods.length+')');
		for(var t=0; t<mods.length; t++) {
			var link=createTiddlyLink(createTiddlyElement(p,'li'),mods[t],false);
			link.appendChild(document.createTextNode(indent+mods[t]));
		}
	}
}
//}}}
//{{{
function hasTagged(date,format) // returns true if date is tagging other tiddlers
{
	if (config.options.chkDatePopupHideTagged) return false;
	return store.getTaggedTiddlers(date.formatString(format)).length>0;
}

function addTaggedToPopup(p,when,format)
{
	if (config.options.chkDatePopupHideTagged) return false;
	var indent=String.fromCharCode(160)+String.fromCharCode(160);
	var tagged=store.getTaggedTiddlers(when.formatString(format));
	if (tagged.length) var e=createTiddlyElement(p,'div',null,null,'tagged ('+tagged.length+')');
	for(var t=0; t<tagged.length; t++) {
		var link=createTiddlyLink(createTiddlyElement(p,'li'),tagged[t].title,false);
		link.appendChild(document.createTextNode(indent+tagged[t].title));
	}
}
//}}}
//{{{
function indexReminders(date,leadtime) // build list of tiddlers with reminders, hash indexed by reminder date
{
	var reminders = { };
	if(window.findTiddlersWithReminders!=undefined) { // reminder plugin is installed
		var t = findTiddlersWithReminders(date, [0,leadtime], null, null, 1);
		for(var i=0; i<t.length; i++) reminders[t[i].matchedDate]=true;
	}
	return reminders;
}

function hasReminders(date) // returns true if date has reminders
{
	if (config.options.chkDatePopupHideReminders) return false;
	if (window.reminderCacheForCalendar)
		return window.reminderCacheForCalendar[date]; // use calendar cache
	if (!config.macros.date.reminders)
		config.macros.date.reminders = indexReminders(date,90); // create a 90-day leadtime reminder cache
	return (config.macros.date.reminders[date]);
}

function addRemindersToPopup(p,when,format)
{
	if (config.options.chkDatePopupHideReminders) return false;
	if(window.findTiddlersWithReminders==undefined) return; // reminder plugin not installed

	var indent = String.fromCharCode(160)+String.fromCharCode(160);
	var reminders=findTiddlersWithReminders(when, [0,31],null,null,1);
	createTiddlyElement(p,'div',null,null,'reminders ('+(reminders.length||'none')+')');
	for(var t=0; t<reminders.length; t++) {
		link = createTiddlyLink(createTiddlyElement(p,'li'),reminders[t].tiddler,false);
		var diff=reminders[t].diff;
		diff=(diff<1)?'Today':((diff==1)?'Tomorrow':diff+' days');
		var txt=(reminders[t].params['title'])?reminders[t].params['title']:reminders[t].tiddler;
		link.appendChild(document.createTextNode(indent+diff+' - '+txt));
	}
	if (readOnly) return;	// readonly... omit 'new reminder...' command
	var rem='\\<\\<reminder day:%0 month:%1 year:%2 title:"Enter a reminder title here"\\>\\>';
	rem=rem.format([when.getDate(),when.getMonth()+1,when.getYear()+1900]);
	var cmd="<<newTiddler label:[["+indent+"new reminder...]] prompt:[[add a reminder to '%0']]"
		+" title:[[%0]] text:{{var t=store.getTiddlerText('%0','');t+(t.length?'\\n':'')+'%1'}} tag:%2>>";
	wikify(cmd.format([when.formatString(format),rem,config.options.txtCalendarReminderTags||'']),
		createTiddlyElement(p,'li'));
}
//}}}
[[Hello people]]
[[Начало]]
/***
|Name|EditFieldPlugin|
|Source|http://www.TiddlyTools.com/#EditFieldPlugin|
|Version|1.6.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|extend core edit macro for use in ViewTemplates or direct embedding in tiddler content|
!!!!!Usage
<<<
Normally, when a tiddler is edited, a set of input fields is displayed (as defined by the [[EditTemplate]]), and any changes you make are only saved when you press the "done" (or "cancel") command in the tiddler editor's toolbar.  However, you can also ''embed an input field directly in //viewed// tiddler content'' by writing:
{{{
<<edit fieldname numberOfLines defaultValue>>
<<edit fieldname@TiddlerName numberOfLines defaultValue>>
}}}
or in the [[ViewTemplate]] (to add it to every tiddler):
{{{
<span macro='edit fieldname numberOfLines defaultValue'></span>
<span macro='edit fieldname@TiddlerName numberOfLines defaultValue'></span>
}}}
Unfortunately, while the input field will be displayed, the "done" command item is not available when //viewing// a tiddler, so the 'save/discard' handling cannot be invoked once you have decided that your input activities are complete, and any changes you make will not stored anywhere.  To address this, the plugin extends the input field handler so that when a field is embedded in normal tiddler content and you make changes, it can automatically save/discard your changes as soon as you press ENTER or move away ('onBlur' handling) from that input field.  You can also abandon your changes to input field content by pressing ESCAPE.

The plugin also adds support for an optional 'remote field reference' syntax: "{{{fieldname@TiddlerName}}}" so you can display and edit fields stored in other tiddlers.  This allows you to create, for example, 'summary' tiddlers for reviewing/editing field values from several tiddlers at the same time.

Note: a message is displayed before saving/discarding any field changes.  To suppress either (or both) of these confirmation messages, you can add the following configuration settings to [[EditFieldPluginConfig]] (or any other tiddler you are using to store and apply 'persistent settings'):
{{{
config.macros.edit.cancelMsg = "";
config.macros.edit.saveMsg = "";
}}}
<<<
!!!!!Examples
<<<
*"""<<edit foobar>>"""<br><<edit foobar>>
*"""<<edit foobar@SomeTiddler>>"""<br><<edit foobar@SomeTiddler>>
*"""<<edit tags>>"""<br><<edit tags>>
*"""<<edit text 15>>"""<br>{{editor{<<edit text 15>>}}}
<<<
!!!!!Revisions
<<<
2010.11.15 [1.6.1] In handler(), corrected display field values for 'non-stored' tiddler content (e.g., shadows, tags, default new tiddler)
2010.10.31 [1.6.0] In handler(), fixed display of remote field values.  In onblur(), refactored save/cancel message text for easier customization and bypass confirmation if text is blank.  
2009.09.16 [1.5.1] fixed 'onblur' handling for local fields (fieldname@here).  Added support for  '@here' syntax
2009.09.05 [1.5.0] code refactored.  added handling for fieldname@tiddlername
2007.08.22 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.EditFieldPlugin= {major: 1, minor: 6, revision: 1, date: new Date(2010,11,15)};

config.macros.edit.editFieldPlugin_savedHandler=config.macros.edit.handler;
config.macros.edit.cancelMsg = "Abandon changes to %0@%1?";
config.macros.edit.saveMsg = "Save changes to %0@%1?";
config.macros.edit.handler = function(place,macroName,params,wikifier,paramString,tiddler) {

	// let core render input/textarea, then get resulting element
	config.macros.edit.editFieldPlugin_savedHandler.apply(this,arguments);
	var fieldType=params[0]=="text"||params[1]?'textarea':'input';
	var elems=place.getElementsByTagName(fieldType); var e=elems[elems.length-1];

	// extended fieldname@tiddlername handling
	var parts=e.getAttribute("edit").split('@');
	var field=parts[0];
	var title=parts[1]||tiddler.title;
	if (title=='here') title=tiddler.title;
	// stop field from being saved with 'done' button
	if (parts[1]) { e.setAttribute("edit",null); e.setAttribute("field",field); }

	// save starting value and target tiddler
	e.value=store.getValue(title,field)||e.value; // get field value
	e.setAttribute("currval",e.value); // save starting value
	e.setAttribute("tiddler",title);

	// force height for textarea field
	if (fieldType=="textarea" && params[1]) e.style.height=params[1]+"em";

	// if viewing tiddler, add autosave handlers
	var here=story.findContainingTiddler(place);
	var isViewed=here&&here.getAttribute("template").indexOf("ViewTemplate")!=-1;
	if (parts[1]||isViewed) { // remote reference or view mode editing...
		story.setDirty(tiddler.title,false); // clear tiddler ("dirty") flag (set by core)
		e.onkeydown=function(ev) { // ENTER key=save (for single-line input)
			var event=ev?ev:window.event;
			this.setAttribute("keyCode",event.keyCode); // save last keyCode (for blur)
			if (event.keyCode==13 && this.nodeName.toUpperCase()!="TEXTAREA")
				this.saveField(); // save input to tiddler field
		}
		e.onblur=function(ev) { // confirm input when focus moves away
			var event=ev?ev:window.event;
			var tid=this.getAttribute("tiddler"); if (!tid || !tid.length) return;
			var field=this.getAttribute("edit")||this.getAttribute("field");
			if (this.value==this.getAttribute("currval")) return; // no change
			if (this.getAttribute("keyCode")=="27") { // if user pressed ESC
				var msg=config.macros.edit.cancelMsg.format([field,tid]);
				if (!msg.length || confirm(msg)) this.value=this.getAttribute("currval"); // reset value
				this.id=new Date().getTime(); // set unique ID for delayed re-focus after blur
				setTimeout("document.getElementById('"+this.id+"').focus()",1);
			} else { // other focus change events
				var msg=config.macros.edit.saveMsg.format([field,tid]);
				if (!msg.length || confirm(msg)) this.saveField(); // save value
				else this.value=this.getAttribute("currval");
			}
		};
		e.saveField=function() { // unpack/validate attribs and then save the field
			var tid=this.getAttribute("tiddler"); if (!tid || !tid.length) return;
			var field=this.getAttribute("edit")||this.getAttribute("field");
			var title=(field=="title")?this.value:tid;
			if (!title.length) { // error: blank tiddler title
				this.value=this.getAttribute("currval"); // reset value
				this.id=new Date().getTime(); // set unique ID for delayed messages/refocus
				setTimeout("displayMessage('Please enter a non-blank value')",1);
				setTimeout("document.getElementById('"+this.id+"').focus()",2);
				return;
			}
			config.macros.edit.saveField(tid,title,field,this.value);
			this.setAttribute("currval",this.value); // remember new starting value
		};
	}
}
//}}}
//{{{
// save input value to tiddler field (create/touch/rename tiddler as needed)
config.macros.edit.saveField = function(tid,title,field,val) {
	var t=store.getTiddler(tid);
	store.suspendNotifications();
	var anim=config.options.chkAnimate; config.options.chkAnimate=false; // suspend animation
	var who=t&&config.options.chkForceMinorUpdate?t.modifier:config.options.txtUserName;
	var when=t&&config.options.chkForceMinorUpdate?t.modified:new Date();
	store.saveTiddler(t?tid:title,title,t?t.text:"",who,when,t?t.tags:[],t?t.fields:null);
	store.setValue(title,field,val); // save field
	if (tid!=title) // new title... show renamed tiddler in place of current one
		{ story.displayTiddler(story.getTiddler(tid),title); story.closeTiddler(tid); }
	if (field=="text") // content changed, refresh tiddler display
		{ story.refreshTiddler(title,null,true); }
	config.options.chkAnimate=anim; // resume animation
	store.resumeNotifications();
	store.notify(title,true);
}
//}}}
<<miniBrowser noplayer http://www.editpad.org/>>
Поднять свой smtp сервер (на примере debian)
{{{
sudo apt-get postfix
}}}
и поставить sendemail
{{{
apt-get install sendemail
}}}

Дальше всего одна строчка:
{{{
sendemail -f from@gmail.com -t username@facebook.com -u subj -m message
}}}
/***
|Name:|ExtentTagButtonPlugin|
|Description:|Adds a New tiddler button in the tag drop down|
|Version:|3.2 Rev: 3861|
|Source:|http://mptw.tiddlyspot.com/#ExtendTagButtonPlugin|
***/
//{{{
window.onClickTag_mptw_orig = window.onClickTag;
window.onClickTag = function(e) {
window.onClickTag_mptw_orig.apply(this,arguments);
	var tag = this.getAttribute("tag");
	var title = this.getAttribute("tiddler");
	var popup = Popup.stack[Popup.stack.length-1].popup;
	createTiddlyElement(createTiddlyElement(popup,"li",null,"listBreak"),"div");
	wikify("<<newTiddler label:'New tiddler' tag:'"+tag+"'>>",createTiddlyElement(popup,"li"));
	return false;
}
//}}}

Показать информацию по файлу:
{{{
ffmpeg -i sample.avi
}}}

Склеить изображений в видео:
{{{
ffmpeg -f image2 -i image%d.jpg video.mpg
}}}
Все картинки из текущей директории с именами файлов image1.jpg, image2.jpg и т.д. будут преобразованы в один ролик video.mpg.

Разложение видеоряда на кадры:
{{{
ffmpeg -i video.mpg image%d.jpg
}}}
Будут сгенерированы файлы image1.jpg, image2.jpg и т.д… Поддерживаемые графические форматы: PGM, PPM, PAM, PGMYUV, JPEG, GIF, PNG, TIFF, SGI.

Кодирование видеоряда для Apple iPod/iPhone:
{{{
ffmpeg -i source_video.avi input -acodec aac -ab 128kb -vcodec mpeg4 -b 1200kb -mbd 2 -flags +4mv+trell -aic 2 -cmp 2 -subcmp 2 -s 320x180 -title X final_video.mp4
}}}

Извлечение звука из видео с последующим сохранением в MP3:
{{{
ffmpeg -i source_video.avi -vn -ar 44100 -ac 2 -ab 192 -f mp3 sound.mp3
}}}

Преобразование WAV в MP3:
{{{
ffmpeg -i son_original.avi -vn -ar 44100 -ac 2 -ab 192 -f mp3 son_final.mp3
}}}

AVI в MPG:
{{{
ffmpeg -i video_source.avi video_final.mpg
}}}

MPG в AVI:
{{{
ffmpeg -i video_source.mpg video_final.avi
}}}

Конвертация AVI-файла в несжатый анимированный GIF:
{{{
ffmpeg -i video_source.avi gif_anime.gif
}}}

Смешение аудио- и видеопотока в один результирующий файл:
{{{
ffmpeg -i son.wav -i video_source.avi video_final.mpg
}}}

Преобразование AVI в FLV:
{{{
ffmpeg -i video_source.avi -ab 56 -ar 44100 -b 200 -r 15 -s 320x240 -f flv video_final.flv
}}}

FLV в AVI:
{{{
ffmpeg -i video_source.flv -ab 56 -ar 44100 -b 200 -s 320x240 video_final.avi
}}}

[[Linux SysAdmin|http://a.dmin.msk.ru/?p=407]]
[[Wiki FFmpeg|http://ru.wikipedia.org/wiki/FFmpeg]]
# [[Fossil wiki|http://ru.wikipedia.org/wiki/Fossil]]
# [[Download Fossil|http://www.fossil-scm.org/download.html]] 
# [[Cookbook Fossil|http://www.hwaci.com/cgi-bin/fossil/wiki?name=Cookbook]]
# [[Fuel|http://code.google.com/p/fuel-scm/]]
# [[Jurassic|http://code.google.com/p/jurassic-fossil/]]
<<miniBrowser noplayer http://4pda.ru/forum/index.php?autocom=favtopics>>
<<miniBrowser noplayer http://mm-3.blogspot.com/>>
<<miniBrowser noplayer http://mm-3.livejournal.com/friends>>
<<miniBrowser noplayer http://www.linux.org.ru/tracker/>>
<<miniBrowser noplayer http://statly.ru/red.html>>
<<miniBrowser noplayer http://mm3.tumblr.com/>>
<<miniBrowser noplayer http://mm3.tiddlyspot.com/#FrameBrowserTS>>
# [[findicons|http://findicons.com/pack/756/ginux]]
# [[iconfinder|http://www.iconfinder.com/search/?q=iconset:49handdrawing]]
#[[Gource — визуализируем историю работы над проектом|http://habrahabr.ru/post/75780/]]
#[[Про GitHub|http://habrahabr.ru/post/125799/]]
#[[Git to SVN|http://leonid.shevtsov.me/ru/perenos-svn-repozitariya-v-git]]
#[[LOR about git-svn|http://www.linux.org.ru/forum/development/5157592]]
#[[Habra about git|http://habrahabr.ru/post/68341/]]
#[[cloning-a-non-standard-svn-repository-with-git-svn|http://stackoverflow.com/questions/572893/cloning-a-non-standard-svn-repository-with-git-svn]]

коментарии к коммитам надо вставлять так:
{{{
git commit "$(curl -s http://whatthecommit.com/index.txt)"
}}}

Комманда git up (аналог svn up) добавляется так:
{{{
git config --global alias.up '!(git add . && git stash && git pull --rebase >&2) | grep -v "No local changes to save" && git stash pop'
}}}
git up при надобности ныкает все ещё незакоммиченные изменения в stash, обновляет локальную ветку до свежайшей и восстанавливает локальные изменения назад. В том числе переносит ещё неотправленные локальные коммиты в самый конец делая историю линейной как в Subversion, т.е. избегая веток и лишних merge-коммитов.

 Если всё прошло гладко (без конфликтов) можно сразу же делать git push. В редких случаях конфликтов (вы и кто-то меняли одну и ту же строку) rebase остановится и далее конечно придется разбираться самому и завершать апдейт с помощью git rebase  - -  continue сколько нужно раз и git stash apply чтобы вернуть заныканные изменения.

 Есть много аналогов, но в большинстве своем это нелаконичные скрипты. Алиас легко добавить на любом сервере вместе с другими просто вставив в консоль всё это:
{{{
# git up
git config --global alias.up '!(git add . && git stash && git pull --rebase >&2) | grep -v "No local changes to save" && git stash pop'

# git in / git out — смотреть какие коммиты придут/уйдут перед выполнением pull/push
git config --global alias.in '!git remote update -p; git log ..@{u}'
git config --global alias.out 'log @{u}..'

# git addremove - добавить в индекс новые файлы/изменения и удалить всё что удалилось
git config --global alias.addremove \!"git add . && git ls-files --deleted | xargs --no-run-if-empty git rm"

# git unstage - убрать всё из индекса (чтобы например добавить/закоммитить сначала что-то другое)
git config --global alias.unstage "reset HEAD --"

# git backup - заархивировать весь локальный репозиторий перед экспериментированием
git config --global alias.backup \!'file=../`git describe`.tar && echo "Creating `readlink -f $file`" && tar cf $file .'

# Просто удобные сокращения
git config --global alias.st "status -sb"
git config --global alias.ci commit
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.bra "branch -a"
git config --global alias.chp cherry-pick
git config --global alias.pr "pull --rebase"
git config --global alias.bl "blame -b -w"
git config --global alias.cia "commit --amend"
git config --global alias.lg "log --pretty=format:'%h was %an, %ar, message: %s' --graph"
git config --global alias.who "shortlog -s --"

# what else?
}}}
 Делитесь полезными алиасами!

[[источник на хабре|http://habrahabr.ru/post/155391/]]

{{{
-------------------OO---------
--------------------OO--------
-------------------O----------
------------------------------
--------------------------O---
--------------------------O-O-
--------------------------OO--
------------------------------
------OO----------------------
-----OO-----------------------
-------O----------------------
------------------------------
-------------------------O----
--------------------------OO--
-------------------------OO---
----OOO-----------------------
------O-----------------------
-----O------------------------
------------------------------
-----------O-O----------------
-----------OO-----------------
------------O-----------------
------------------------------
--------------------OOO-------
--------------------O---------
---------------------O--------
------------------------------
-----------O------------------
------------O-----------------
----------OOO-----------------
}}}
{{{
--------------------------------------
------------------------O-------------
----------------------O-O-------------
------------OO------OO------------OO--
-----------O---O----OO------------OO--
OO--------O-----O---OO----------------
OO--------O---O-OO----O-O-------------
----------O-----O-------O-------------
-----------O---O----------------------
------------OO------------------------
--------------------------------------
--------------------------------------
--------------------------------------
--------------------------------------
--------------------------------------
--------------------------------------
--------------------------------------
--------------------------------------
--------------------------------------
--------------------------------------
--------------------------------------
--------------------------------------
-------------------------------------#
-------------------------------------#
-----------------------------------###
}}}
/***
|Name|HTMLFormattingPlugin|
|Source|http://www.TiddlyTools.com/#HTMLFormattingPlugin|
|Version|2.1.5|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|'HTML' formatter|
|Description|embed wiki syntax formatting inside of HTML content|

The shorthand Wiki-style formatting syntax of ~TiddlyWiki is very convenient and enables most content to be reasonably well presented. However, there are times when tried-and-true HTML formatting syntax allows more more precise control of the content display.

When HTML formatting syntax is embedded within a tiddler (in between {{{<}}}{{{html>}}} and {{{<}}}{{{/html>}}} markers) TiddlyWiki passes this content to the browser for processing as 'native' HTML.  However, TiddlyWiki does not also process the HTML source content for any embedded wiki-formatting syntax it may contain.  This means that while you can use HTML formatted content, you cannot mix wiki-formatted content within the HTML formatting.
!!!!!Usage
<<<
The ~HTMLFormatting plugin allows you to freely ''mix wiki-style formatting syntax within HTML formatted content'' by extending the action of the standard TiddlyWiki formatting handler.

When a tiddler is about to be displayed, ~TiddlyWiki looks for tiddler content contained within ''<{{{html}}}>'' and ''<{{{/html}}}>'' HTML tags.  This content (if any) is passed directly to the browser's internal "rendering engine" to process as ~HTML-formatted content.  Once the HTML formatting has been processed, all the pieces of text occuring in between the HTML formatting are then processed by the ~TiddlyWiki rendering engine, one piece at a time, so that normal wiki-style formatting can be applied to the individual text pieces.

<<<
!!!!!Line breaks
<<<
One major difference between Wiki formatting and HTML formatting is how "line breaks" are processed. Wiki formatting treats all line breaks as literal content to be displayed //as-is//. However, because HTML normally ignores line breaks and actually processes them as simple "word separators" instead, many people who write HTML include extra line breaks in their documents, just to make the "source code" easier to read.

Even though you can use HTML tags within your tiddler content, the default treatment for line breaks still follows the Wiki-style rule (i.e., all new lines are displayed as-is). When adding HTML content to a tiddler (especially if you cut-and-paste it from another web page), you should take care to avoid adding extra line breaks to the text.

If removing all the extra line breaks from your HTML content would be a big hassle, you can quickly //override the default Wiki-style line break rule// so that the line breaks use the standard HTML rules instead.  Placing a ''<{{{hide linebreaks}}}>'' tag within the tiddler's HTML content changes all line breaks to spaces before rendering the content, so that the literal line breaks will be processed as simple word-breaks instead.

Note: this does //not// alter the actual tiddler content that is stored in the document, just the manner in which it is displayed. Any line breaks contained in the tiddler will still be there when you edit its content. Also, to include a literal line break when the ''<{{{hide linebreaks}}}>'' tag is present, you will need to use a ''<{{{br}}}>'' or ''<{{{p}}}>'' HTML tag instead of simply typing a line break.

<<<
!!!!!How it works
<<<
The TW core support for HTML does not let you put ANY wiki-style syntax (including TW macros) *inside* the {{{<html>...</html>}}} block.  Everything between {{{<html>}}} and {{{</html>}}} is handed to the browser for processing and that is it.  Fortunately, this plugin ADDS the ability to let you put wiki-syntax (including macros) inside the html.  It does this by first giving the tiddler source content to the browser to process the HTML, and then handling any wiki-based syntax that remains afterward.

However, not all wiki syntax can be safely passed through the browser's parser. Specifically, any TW macros inside the HTML will get 'eaten' by the browser since the macro brackets, {{{<<...>>}}} use the "<" and ">" that normally delimit the HTML/XML syntax recognized by the browser's parser.

Similarly, you can't use InlineJavascript within the HTML because the {{{<script>...</script>}}} syntax will also be consumed by the browser and there will be nothing left to process afterward.  Note: unfortunately, even though the browser removes the {{{<script>...</script>}}} sequence, it doesn't actually execute the embedded javascript code that it removes, so any scripts contained inside of <html> blocks in TW are currently being ignored. :-(

As a work-around to allow TW *macros* (but not inline scripts) to exist inside of <html> formatted blocks of content, the plugin first converts the {{{<<}}} and {{{>>}}} into "%%(" and ")%%", making them "indigestible" so they can pass unchanged through the belly of the beast (the browser's HTML parser).

After the browser has done its job, the wiki syntax sequences (including the "undigested" macros) are contained in #text nodes in the browser-generated DOM elements.  The plugin then recursively locates and processes each #text node, converts the %%( and )%% back into {{{<<}}} and {{{>>}}}, passes the result to wikify() for further rendering of the wiki-formatted syntax into a containing SPAN that replaces the previous #text node.  At the end of this process, none of the encoded %%( and )%% sequences remain in the rendered tiddler output.

<<<
!!!!!Installation
<<<
import (or copy/paste) the following tiddlers into your document:
''HTMLFormattingPlugin'' (tagged with <<tag systemConfig>>)
^^documentation and javascript for HTMLFormatting handling^^
<<<
!!!!!Revision History
<<<
''2007.12.04 [*.*.*]'' update for TW2.3.0: replaced deprecated core functions, regexps, and macros
''2007.06.14 [2.1.5]'' in formatter, removed call to e.normalize().  Creates an INFINITE RECURSION error in Safari!!!!
''2006.09.10 [2.1.4]'' update formatter for 2.1 compatibility (use this.lookaheadRegExp instead of temp variable)
''2006.05.28 [2.1.3]'' in wikifyTextNodes(), decode the *value* of TEXTAREA nodes, but don't wikify() its children.  (thanks to "ayj" for bug report)
''2006.02.19 [2.1.2]'' in wikifyTextNodes(), put SPAN element into tiddler DOM (replacing text node), BEFORE wikifying the text content.  This ensures that the 'place' passed to any macros is correctly defined when the macro is evaluated, so that calls to story.findContainingTiddler(place) will work as expected. (Thanks for bug report from GeoffSlocock)
''2006.02.05 [2.1.1]'' wrapped wikifier hijack in init function to eliminate globals and avoid FireFox 1.5.0.1 crash bug when referencing globals
''2005.12.01 [2.1.0]'' don't wikify #TEXT nodes inside SELECT and TEXTAREA elements
''2005.11.06 [2.0.1]'' code cleanup
''2005.10.31 [2.0.0]'' replaced hijack wikify() with hijack config.formatters["html"] and simplified recursive WikifyTextNodes() code
''2005.10.09 [1.0.2]'' combined documentation and code into a single tiddler
''2005.08.05 [1.0.1]'' moved HTML and CSS definitions into plugin code instead of using separate tiddlers
''2005.07.26 [1.0.1]'' Re-released as a plugin. Added <{{{html}}}>...</{{{nohtml}}}> and <{{{hide newlines}}}> handling
''2005.07.20 [1.0.0]'' Initial Release (as code adaptation)

<<<
!!!!!Credits
<<<
This feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]
<<<
!!!!!Code
***/
//{{{
version.extensions.HTMLFormatting = {major: 2, minor: 1, revision: 5, date: new Date(2007,6,14)};

// find the formatter for HTML and replace the handler
initHTMLFormatter();
function initHTMLFormatter()
{
	for (var i=0; i<config.formatters.length && config.formatters[i].name!="html"; i++);
	if (i<config.formatters.length)	config.formatters[i].handler=function(w) {
		if (!this.lookaheadRegExp)  // fixup for TW2.0.x
			this.lookaheadRegExp = new RegExp(this.lookahead,"mg");
		this.lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
			var html=lookaheadMatch[1];
			// optionally suppress wiki-style literal handling of newlines
			// strip any carriage returns added by Internet Explorer's textarea edit field
			// encode newlines as \n so Internet Explorer's HTML parser won't eat them
			// encode macro brackets (<< and >>) so HTML parser won't eat them
			if (html.indexOf('<hide linebreaks>')!=-1) html=html.replace(/\n/g,' ');
			html=html.replace(/\r/g,'');
			html=html.replace(/\n/g,'\\n');
			html=html.replace(/<</g,'%%(').replace(/>>/g,')%%');
			// create span to hold HTML
			// parse HTML and normalize the results
			// walk node tree and call wikify() on each text node
			var e = createTiddlyElement(w.output,"span");
			e.innerHTML=html;
			// REMOVED: e.normalize();  // THIS CAUSED INFINITE RECURSION IN SAFARI
			wikifyTextNodes(e);
			// advance to next parse position
			w.nextMatch = this.lookaheadRegExp.lastIndex;
		}
	}
}

// wikify text nodes remaining after HTML content is processed (pre-order recursion)
function wikifyTextNodes(theNode)
{
	// textarea node doesn't get wikified, just decoded... 
	if (theNode.nodeName.toLowerCase()=='textarea')
		theNode.value=theNode.value.replace(/\%%\(/g,'<<').replace(/\)\%%/g,'>>').replace(/\\n/g,'\n');
	else for (var i=0;i<theNode.childNodes.length;i++) {
		var theChild=theNode.childNodes.item(i);
		if (theChild.nodeName.toLowerCase()=='option') continue;
		if (theChild.nodeName.toLowerCase()=='select') continue;
		wikifyTextNodes(theChild);
		if (theChild.nodeName=='#text') {
			var txt=theChild.nodeValue;
			// decode macro brackets and newlines
			txt=txt.replace(/\%%\(/g,'<<').replace(/\)\%%/g,'>>').replace(/\\n/g,'\n');
			// replace text node with wikified() span
			var newNode=createTiddlyElement(null,"span");
			theNode.replaceChild(newNode,theChild);
			wikify(txt,newNode);
		}
	}
}
//}}}
Ладно, раз уж вы сюда забрели, то можете для [[начала|Начало]] можно побольше узнать про TiddlyWiki
и насладиться зайчиком: 
{{{
(\__/) 
(='.'=) 
(")_(")
}}}
и пингвинами
{{{
          (o_
(o_  (o_  //\
(/)_ (/)_ V_/_
}}}


Любовь – это когда ты кодишь. Она подошла сзади. Обняла. Посмотрела на то, чем ты занимаешься, и прошептала на ухо: «Кавычки закрой на 127 строке, программист хренов.»


Тяжела и неказиста жизнь простого даосиста...
Кстати, а вы никогда не задумывались над тем как вы будете выглядеть (весело, нелепо, вызывающе или наоборот успокаивающе) с точки зрения жителя какой нибудь другой планеты?

представьте себе существо яркого жёлто-красного цвета с редкими полу прозрачными вставками, с головой в нижней точке туловища, семью конечностями согнутыми в пяти местах да ещё и разно длинны, перемещающееся опусканием туловища на землю и одновременным перемещением всех конечностей... ведь нигде не сказано, что на другой планете существа обязательно должны иметь чётное количество конечностей, быть прямо ходящими и голова непременно должна находиться вверху...

вот примерно таким же странным и неказистым я показался моим новым знакомымс планеты Эгрт (вроде так оно произносится) в системе NGC 1397, но обовсём этом чуть по позже...

если я напишу ещё хоть одну букву, значит я всётаки вернулся из путешествия по NGC 4414...

{{{
Бѣ - мудрое слово
ѣѣ - второе мудрое слово
}}}

[[Простой блокнот с форматированием|data:text/html, <html contenteditable>]]

[[Простой блокнот без форматирования в хроме|data:text/html, <html contenteditable=plaintext-only>]]

[[Простой блокнот без форматирования везде|data:text/html, <html><textarea style="width:100%;height:100%"/>]]

[[Свобода]]

[[Медитация]]

[[Обучение]]

[[Linux]]

[[firefox]]

[[карты]]

[[3D принтер]]

[[квадрокоптер]]

[[QR-code]]

[[Браузерные игры]]

[[Карточные игры]]

[[ZPG]]

[[Public Lab|http://publiclab.org/]]

[[Самое интересное]]

[[Мои ссылки]]

[[Благодатная почва]]
/***
|Name:|HideWhenPlugin|
|Description:|Allows conditional inclusion/exclusion in templates|
|Version:|3.1 Rev: 3919|
|Source:|http://mptw.tiddlyspot.com/#HideWhenPlugin|
For use in ViewTemplate and EditTemplate. Example usage:
{{{<div macro="showWhenTagged Task">[[TaskToolbar]]</div>}}}
{{{<div macro="showWhen tiddler.modifier == 'BartSimpson'"><img src="bart.gif"/></div>}}}
***/
//{{{
window.hideWhenLastTest = false;
window.removeElementWhen = function(test,place) {
	window.hideWhenLastTest = test;
	if (test) {removeChildren(place);place.parentNode.removeChild(place);}
};
merge(config.macros,{
	hideWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {removeElementWhen( eval(paramString), place);}},
	showWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {removeElementWhen( !eval(paramString), place);}},
	hideWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {removeElementWhen( tiddler.tags.containsAll(params), place);}},
	showWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {removeElementWhen( !tiddler.tags.containsAll(params), place);}},
	hideWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {removeElementWhen( tiddler.tags.containsAny(params), place);}},
	showWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {removeElementWhen( !tiddler.tags.containsAny(params), place);}},
	hideWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {removeElementWhen( tiddler.tags.containsAll(params), place);}},
	showWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {removeElementWhen( !tiddler.tags.containsAll(params), place);}},
	hideWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {removeElementWhen( store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0]), place);}},
	showWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {removeElementWhen( !(store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0])), place);}},
	hideWhenTitleIs: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {removeElementWhen( tiddler.title == params[0], place);}},
	showWhenTitleIs: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {removeElementWhen( tiddler.title != params[0], place);}},
	'else': { handler: function(place,macroName,params,wikifier,paramString,tiddler) {removeElementWhen( !window.hideWhenLastTest, place);	}}
});
//}}}

#[[Free hosting|http://members.host1free.com/vps?ac=h1f_register_vps]]
I2P

http://www.i2p2.i2p/ главная страница проекта в сети I2P
http://i2p-projekt.i2p/ зеркало для http://www.i2p2.i2p/
http://i2plugins.i2p/ плагины I2P
http://i2pbote.i2p/ распределённая p2p почта I2P 2010 (плагин)
http://inr.i2p/ про eepsites [ru, en]
http://forum.i2p/ I2P форум
http://forum.rus.i2p/ русский I2P форум [ru]
http://rus.i2p/ русская I2P вики


Каталоги сайтов и сеть

http://ugha.i2p/ I2P Вики и стартовые страницы в сети I2P, каталог eepsites
http://inproxy.tino.i2p/ список eepsites и индикация их активности, статистика I2P сети
http://epsilon.i2p/ поисковик по eepsites
http://yacysearch.i2p/ поисковик по eepsites
http://search.rus.i2p/ поисковик
http://i2host.i2p/ можно получить 64-разр. номер указанного eepsite (try it)
http://stats.i2p/ статистика I2P сети


Трекеры и файлы

http://exotrack.i2p/ трекер
http://tracker2.postman.i2p/ большой трекер
http://imules-weed.i2p/ трекер iMules
http://tracker.rus.i2p/ трекер (заброшенный) [ru]
http://anonymouszero.i2p/ скачать все сезоны Rozen Maiden [ru]
http://1c.i2p/ дистрибутивы 1C [ru]


Bitcoin

http://bitcoin4cash.i2p/ купить bitcoins
http://bitcoin2cc.i2p/ обмен bitcoins на виртуальную VISA карту
http://bitcoin-escrow.i2p/ безопасные транзакции bitcoins продавец-покупатель


Библиотеки и подборки книг

http://blacklib.i2p/ библиотека книг на английском языке
http://de-ebook-archiv.i2p/ библиотека книг на немецком языке
http://bookpusher.i2p/ личная библиотека книг
http://anarchydocuments.i2p/ коллекция анархических текстов


Блоги и странички

http://zzz.i2p/ сайт разработчика
http://godfrey.i2p/ godfrey's блог (активный) - политика [ru]
http://darkman.i2p/ darkman's блог (заброшенный) [ru]
http://gaunergazette.i2p/ блог Gaunergazette - новости [de]
http://ident.i2p/ zwitter
http://hq.postman.i2p/ блог почтовой службы I2P
http://killyourtv.i2p/ ubunter's eepsite
http://fakeboobs.i2p/ галерея эротики
http://duck.i2p/ блог Tahoe-LAFS, криптоказино за bitcoins


Форумы

http://hiddenchan.i2p/ I2P board [ru]
http://4chan.i2p/


Разное

http://jonatan.walck.i2p/ страничка программиста
http://hashparty.i2p/ hello, anonymous cyberpank
http://h2ik.i2p/ h2ik's eepsite
http://i2p-bt.postman.i2p/ i2p bt торрент клиент 2005
http://hips.i2p/ блог
http://darktunnel.i2p/ I2P - TOR Gateway

Бралось это отсюда: http://serverzona.ru/index.php/menu-i2p.html
#[[Mac OS X в эмуляторе QEMU под Linux|http://habrahabr.ru/post/68489/]]
#[[iPhone Toolchain|http://www.saurik.com/id/4]]
/***
|Name:|InstantTimestampPlugin|
|Description:|A handy way to insert timestamps in your tiddler content|
|Version:|1.0.10 ($Rev: 3646 $)|
|Date:|$Date: 2008-02-27 02:34:38 +1000 (Wed, 27 Feb 2008) $|
|Source:|http://mptw.tiddlyspot.com/#InstantTimestampPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Usage
If you enter {ts} in your tiddler content (without the spaces) it will be replaced with a timestamp when you save the tiddler. Full list of formats:
* {ts} or {t} -> timestamp
* {ds} or {d} -> datestamp
* !ts or !t at start of line -> !!timestamp
* !ds or !d at start of line -> !!datestamp
(I added the extra ! since that's how I like it. Remove it from translations below if required)
!!Notes
* Change the timeFormat and dateFormat below to suit your preference.
* See also http://mptw2.tiddlyspot.com/#AutoCorrectPlugin
* You could invent other translations and add them to the translations array below.
***/
//{{{

config.InstantTimestamp = {

	// adjust to suit
	timeFormat: 'DD/0MM/YY 0hh:0mm',
	dateFormat: 'DD/0MM/YY',

	translations: [
		[/^!ts?$/img,  "'!!{{ts{'+now.formatString(config.InstantTimestamp.timeFormat)+'}}}'"],
		[/^!ds?$/img,  "'!!{{ds{'+now.formatString(config.InstantTimestamp.dateFormat)+'}}}'"],

		// thanks Adapted Cat
		[/\{ts?\}(?!\}\})/ig,"'{{ts{'+now.formatString(config.InstantTimestamp.timeFormat)+'}}}'"],
		[/\{ds?\}(?!\}\})/ig,"'{{ds{'+now.formatString(config.InstantTimestamp.dateFormat)+'}}}'"]
		
	],

	excludeTags: [
		"noAutoCorrect",
		"noTimestamp",
		"html",
		"CSS",
		"css",
		"systemConfig",
		"systemConfigDisabled",
		"zsystemConfig",
		"Plugins",
		"Plugin",
		"plugins",
		"plugin",
		"javascript",
		"code",
		"systemTheme",
		"systemPalette"
	],

	excludeTiddlers: [
		"StyleSheet",
		"StyleSheetLayout",
		"StyleSheetColors",
		"StyleSheetPrint"
		// more?
	]

}; 

TiddlyWiki.prototype.saveTiddler_mptw_instanttimestamp = TiddlyWiki.prototype.saveTiddler;
TiddlyWiki.prototype.saveTiddler = function(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created) {

	tags = tags ? tags : []; // just in case tags is null
	tags = (typeof(tags) == "string") ? tags.readBracketedList() : tags;
	var conf = config.InstantTimestamp;

	if ( !tags.containsAny(conf.excludeTags) && !conf.excludeTiddlers.contains(newTitle) ) {

		var now = new Date();
		var trans = conf.translations;
		for (var i=0;i<trans.length;i++) {
			newBody = newBody.replace(trans[i][0], eval(trans[i][1]));
		}
	}

	// TODO: use apply() instead of naming all args?
	return this.saveTiddler_mptw_instanttimestamp(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created);
}

// you can override these in StyleSheet 
setStylesheet(".ts,.ds { font-style:italic; }","instantTimestampStyles");

//}}}

<<miniBrowser noplayer http://jsbin.com/>>
JSLinux - это Linux в виртуальной машине на JavaScript

# [[Ода на Хабре|http://habrahabr.ru/post/119424/]]
# [[Новость на ЛОРе|http://www.linux.org.ru/news/linux-general/6276830]]
# [[Офф сайт|http://bellard.org/jslinux/]]
# [[Про крутого чувака на вики|http://ru.wikipedia.org/wiki/Беллар,_Фабрис]]
# [[Сайт крутого чувака на котором много вкусняшек|http://bellard.org/]]
# [[Поддержка сети в JSLinux|http://habrahabr.ru/post/123371/]]
# [[JSModem|https://github.com/ewiger/jsmodem]]
# [[Новость про вкусности|http://opennet.ru/opennews/art.shtml?num=31979]]
# [[JsLinux с поддержкой локального хранения|http://stud.hro.nl/0814604/jslinuxdemo/]]
# [[JsLinux с поддержкой локального хранения прямая ссылка|http://stud.hro.nl/0814604/jslinuxdemo/emulator.html]]
# [[Компилятор в JavaScript|https://github.com/kripken/emscripten]]
# [[Эмулятор x86 на JavaScript|http://habrahabr.ru/post/198192/]]
# [[Virtual x86|http://copy.sh/v24/]]
# [[Список эмуляторов на JavaScript|https://gist.github.com/ysangkok/5606032]]



    https://github.com/ozaki-r/arm-js
    https://github.com/ubercomp/jslm32
    https://github.com/s-macke/jor1k
    https://github.com/asmblah/jemul8
    https://github.com/codinguncut/jsbochs
    http://sourceforge.net/p/jsdosbox/home/Home/
    http://bellard.org/jslinux/
    http://jsmachines.net/ (PCjs)
    https://github.com/thibaultimbert/Intel8080
    http://copy.sh/v24/
    http://jamesfriend.com.au/pce-js/pce-js-apps/



[[JSLinux в браузере|JSLinuxLocal]]
[[JsLinux с поддержкой локального хранения в браузере|JSLinuxHddLocal]]
<<miniBrowser noplayer http://stud.hro.nl/0814604/jslinuxdemo/emulator.html>>
<<miniBrowser noplayer http://bellard.org/jslinux/>>
#[[Javascript Open Source Games|http://www.java2s.com/Open-Source/Javascript/Game/CatalogGame.htm]]
#[[Open Source HTML5 Game Engines|http://mobilegameengines.com/html5/open_source_game_engines]]
#[[javascript-движки |http://html5gamedevelopment.ru/category/game-engines/]]
#[[Direct port of the Bullet physics engine to JavaScript using Emscripten|https://github.com/kripken/ammo.js/]]
#[[ammo.js-demos by schteppe|http://schteppe.github.io/ammo.js-demos/]]
#[[three.js|http://mrdoob.github.io/three.js/]]
#[[Game-Engines|https://github.com/bebraw/jswiki/wiki/Game-Engines]]
#[[jsGameWiki|https://github.com/DaRaFF/jsgamewiki]]
#[[voxel.js|http://voxeljs.com/]]
#[[cannon.js|http://schteppe.github.io/cannon.js/]]
#[[developer.mozilla.org demos|https://developer.mozilla.org/en-US/demos/search?q=3d]]
#[[open source javascript game engine for serious developers |http://ntt.cc/2011/01/31/66-open-source-javascript-game-engine-for-serious-developers.html]]
/***
|''Name:''|LegacyStrikeThroughPlugin|
|''Description:''|Support for legacy (pre 2.1) strike through formatting|
|''Version:''|1.0.2|
|''Date:''|Jul 21, 2006|
|''Source:''|http://www.tiddlywiki.com/#LegacyStrikeThroughPlugin|
|''Author:''|MartinBudden (mjbudden (at) gmail (dot) com)|
|''License:''|[[BSD open source license]]|
|''CoreVersion:''|2.1.0|
***/

//{{{
// Ensure that the LegacyStrikeThrough Plugin is only installed once.
if(!version.extensions.LegacyStrikeThroughPlugin) {
version.extensions.LegacyStrikeThroughPlugin = {installed:true};

config.formatters.push(
{
	name: "legacyStrikeByChar",
	match: "==",
	termRegExp: /(==)/mg,
	element: "strike",
	handler: config.formatterHelpers.createElementAndWikify
});

} //# end of "install only once"
//}}}
/***
|Name:|LessBackupsPlugin|
|Description:|Intelligently limit the number of backup files you create|
|Version:|3.0.1 ($Rev: 2320 $)|
|Date:|$Date: 2007-06-18 22:37:46 +1000 (Mon, 18 Jun 2007) $|
|Source:|http://mptw.tiddlyspot.com/#LessBackupsPlugin|
|Author:|Simon Baird|
|Email:|simon.baird@gmail.com|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Description
You end up with just backup one per year, per month, per weekday, per hour, minute, and second.  So total number won't exceed about 200 or so. Can be reduced by commenting out the seconds/minutes/hours line from modes array
!!Notes
Works in IE and Firefox only.  Algorithm by Daniel Baird. IE specific code by by Saq Imtiaz.
***/
//{{{

var MINS  = 60 * 1000;
var HOURS = 60 * MINS;
var DAYS  = 24 * HOURS;

if (!config.lessBackups) {
	config.lessBackups = {
		// comment out the ones you don't want or set config.lessBackups.modes in your 'tweaks' plugin
		modes: [
			["YYYY",  365*DAYS], // one per year for ever
			["MMM",   31*DAYS],  // one per month
			["ddd",   7*DAYS],   // one per weekday
			//["d0DD",  1*DAYS],   // one per day of month
			["h0hh",  24*HOURS], // one per hour
			["m0mm",  1*HOURS],  // one per minute
			["s0ss",  1*MINS],   // one per second
			["latest",0]         // always keep last version. (leave this).
		]
	};
}

window.getSpecialBackupPath = function(backupPath) {

	var now = new Date();

	var modes = config.lessBackups.modes;

	for (var i=0;i<modes.length;i++) {

		// the filename we will try
		var specialBackupPath = backupPath.replace(/(\.)([0-9]+\.[0-9]+)(\.html)$/,
				'$1'+now.formatString(modes[i][0]).toLowerCase()+'$3')

		// open the file
		try {
			if (config.browser.isIE) {
				var fsobject = new ActiveXObject("Scripting.FileSystemObject")
				var fileExists  = fsobject.FileExists(specialBackupPath);
				if (fileExists) {
					var fileObject = fsobject.GetFile(specialBackupPath);
					var modDate = new Date(fileObject.DateLastModified).valueOf();
				}
			}
			else {
				netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
				var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
				file.initWithPath(specialBackupPath);
				var fileExists = file.exists();
				if (fileExists) {
					var modDate = file.lastModifiedTime;
				}
			}
		}
		catch(e) {
			// give up
			return backupPath;
		}

		// expiry is used to tell if it's an 'old' one. Eg, if the month is June and there is a
		// June file on disk that's more than an month old then it must be stale so overwrite
		// note that "latest" should be always written because the expiration period is zero (see above)
		var expiry = new Date(modDate + modes[i][1]);
		if (!fileExists || now > expiry)
			return specialBackupPath;
	}
}

// hijack the core function
window.getBackupPath_mptw_orig = window.getBackupPath;
window.getBackupPath = function(localPath) {
	return getSpecialBackupPath(getBackupPath_mptw_orig(localPath));
}

//}}}

#[[Javascript и canvas в игре «Жизнь» Джона Конвея|http://habrahabr.ru/post/111686/]]
#[[Пишем и оптимизируем Жизнь Конуэя на JS|http://habrahabr.ru/post/144237/]]
#[[Игра «Жизнь» Джона Конуэя|http://habrahabr.ru/post/67790/]]
#[[Поиграем в жизнь|http://habrahabr.ru/post/63848/]]
#[[Wiki Жизнь|http://ru.wikipedia.org/wiki/Жизнь_(игра)]]
#[[TiddlyLife]]
Текстовый редактор vi имеет два режима работы: в первом он пищит, а во втором — всё портит.

# [[Настройка Indicator-Sysmonitor|indicator-sysmonitor]]
# [[PortableLinuxApps|http://portablelinuxapps.org/]]
# [[lm-sensors|http://www.aboutubuntu.ru/content/monitoring-apparatnogo-obespecheniya-s-pomoshchyu-sensors]]
# [[Conky|http://help.ubuntu.ru/wiki/conky]]
# [[http://guac-dev.org/|http://guac-dev.org/]]
# http://ubuntunews.ru/apps/indicator-applet-ubuntu.html
# [[Как собрать бинарный deb пакет|http://habrahabr.ru/post/78094/]]
# [[LFS|http://www.linuxfromscratch.org/lfs/read.html]]
# [[LFS-RU|http://lfs.linux.kiev.ua/doc.html]]
# [[Dosbox wiki|http://ru.wikipedia.org/wiki/Dosbox]]
# [[DosBox|http://www.dosbox.com/download.php?main=1]]
# [[Обзор *top утилит|http://habrahabr.ru/post/114082/]]
# [[REST|http://ru.wikipedia.org/wiki/REST]]
# [[SETI@home|http://en.wikipedia.org/wiki/List_of_distributed_computing_projects]]
# [[RetroShare|http://retroshare.sourceforge.net/downloads.html]]
# http://tkachenkosi.blogspot.com/2009/10/firewall.html
# [[Spark TF101|http://www.paulburton.eu/projects/transformer-android/]]
# [[running Debain native|http://forum.xda-developers.com/showthread.php?t=1138661]]
# [[dwl-2100ap|http://wiki.openwrt.org/toh/d-link/dwl-2100ap]]
# [[VNC server in Ubuntu|http://habrahabr.ru/post/77159/]]
# [[Сборка программ и deb пакетов|http://www.ubuntologia.ru/manual-app-install]]
# [[Ubuntu 11.04 Narwhals|http://www.weebls-stuff.com/songs/Narwhals/]]
# [[SSH VPN over Internet (SSH tun туннелирование) |http://habrahabr.ru/post/87197/]]
# [[Logreplica: сбор логов со всего кластера в единую точку в реальном времени|http://habrahabr.ru/post/126470/]]
# [[SSH за проксей|http://welinux.ru/post/2667/]]
# [[ssh over http proxy|http://wombat-house.blogspot.de/2011/05/ssh-over-http-proxy-linux-mint-10.html]]
# [[Corkscrew - ssh over https|http://wiki.kartbuilding.net/index.php/Corkscrew_-_ssh_over_https]]
# [[Bash хитрости|http://unedeuxtrois.ru/blog/Bash_v_Linux_nastroyka_komandyi.html]]




Кросс компиляция Win32 на Linux:
# [[Кросс-компиляция C/C++ программ для Windows в Linux |http://usefulbytes.blogspot.ru/2009/09/cc-windows-linux.html]]
# [[QtCreator: Qt кросс-компиляция из linux 64 в linux 32, win32, win64 и Mac OS X; upx, usb, dmg, etc|http://habrahabr.ru/post/198142/]]



Отобразить загрузку процессора можно простой командой:
{{{
echo 100-$(vmstat 1 2|tail -1|sed 's/\ \{1,\}/ /g'|cut -d ' ' -f16)|bc|sed -e 's/\..*//'
}}}
запуск программы на отдельном X сервере
{{{
startx steam -- :1
}}}
прокладываем туннели до vps1, с vps1 до vps2, и с vps2 уже на vps3 запускаем socks5 сервер. Теперь у себя в браузере указываем прокси сервер localhost, порт 8080, тип socks5. socks5 сервер это часть ssh демона, т.е. кроме самого ssh вам больше ничего не нужно. Опция -D (порт) поднимает проксю на хосте, которая теперь доступна с вашего локалхоста на указанном порту.
{{{
ssh -t -L 8080:localhost:8080 vps1 ssh -t -L 8080:localhost:8080 vps2 ssh -t -D 8080 vps3
}}}
перекодировка субтитров
{{{
enca -x UTF-8 -c *.ass
find * -name "*.ass" -exec enca -L ru -x utf8 "{}" \;
find . -name "*.ass" -type f -exec rename 's/\.ass/\.srt/g' '{}' \;
find . -name "*.srt" -type f -exec iconv -f cp1251 -t utf8 '{}' -o '{}' \;
for i in *ass; do iconv -c -f utf-8 -t cp1251 "$i" > "/tmp/$i"; mv "/tmp/$i" .; done
}}}

По умолчанию при включении работы Firefox через Socks прокси, DNS запросы продолжают обрабатываться локальным резолвером, что приводит к неработе преобразования имен в Firefox при отсутствии на машине иного выхода в сеть, кроме socks сервера.
Решение: в настройках about:config следует поменять значение переменной network.proxy.socks_remote_dns с false на true, тогда DNS запросы начнут транслироваться через socks сервер. При нахождении в недоверительной сети, самый простой способ поднять socks туннель через внешний сервер:
{{{
   ssh -D 1080 логин@ip_сервера
}}}


а затем настроить на локальной машине доступ через socks5 127.0.0.1:1080

[[Туннели с использованием SSH. Режим эмуляции Socks proxy в SSH|http://www.opennet.ru/tips/1691_ssh_tunnel_socks.shtml]]

[[SSH авторизация по ключам|http://nix-sa.blogspot.ru/2011/06/ssh.html]]

[[Памятка пользователям ssh|http://habrahabr.ru/post/122445/]]

[[Памятка по SSH]]

[[Node.js proxy]]

вместо make install
{{{
checkinstall -D --install=no
dpkg -i package_name.deb
}}}
или вручную
{{{
mkdir /tmp/package
make install DESTDIR=/tmp/package
cd /tmp/package
dpkg-deb -b package_name.deb
}}}

[[Сборка ПО и создание .deb-пакетов из исходников|http://help.ubuntu.ru/wiki/создание_deb_пакетов]]


Удаление старых ядер Ubuntu:
Смотрим установленные ядра:
{{{
dpkg -l | grep linux-image
}}}
Удаляем лишние ядра:
{{{
sudo apt-get remove linux-image-[номер_версии]-generic linux-image-[номер_версии]-generic
sudo apt-get remove linux-headers-[номер_версии] linux-image-[номер_версии]-generic
}}}
обновим grub:
{{{
$ sudo update-grub
}}}

или странным скриптом
{{{
sudo apt-get purge $(dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | head -n -1) --assume-yes
}}}
[[Удаление старых ядер|http://help.ubuntu.ru/wiki/%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%82%D0%B0%D1%80%D1%8B%D1%85_%D1%8F%D0%B4%D0%B5%D1%80]]
[[Автоматическое удаление старых ядер|http://habrahabr.ru/post/116336/]]

или более понятным скриптом:
{{{
dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | xargs sudo apt-get -y purge
}}}
[[Удаление старых ядер ( linux-kernel ) одной командой|http://meandubuntu.ru/2014/05/удаление-старых-ядер-linux-kernel-1-командой/]]
[[КАК востановить GRUB на UEFI]]


/***
|''Name:''|LoadRemoteFileThroughProxy (previous LoadRemoteFileHijack)|
|''Description:''|When the TiddlyWiki file is located on the web (view over http) the content of [[SiteProxy]] tiddler is added in front of the file url. If [[SiteProxy]] does not exist "/proxy/" is added. |
|''Version:''|1.1.0|
|''Date:''|mar 17, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#LoadRemoteFileHijack|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0|
***/
//{{{
version.extensions.LoadRemoteFileThroughProxy = {
 major: 1, minor: 1, revision: 0, 
 date: new Date("mar 17, 2007"), 
 source: "http://tiddlywiki.bidix.info/#LoadRemoteFileThroughProxy"};

if (!window.bidix) window.bidix = {}; // bidix namespace
if (!bidix.core) bidix.core = {};

bidix.core.loadRemoteFile = loadRemoteFile;
loadRemoteFile = function(url,callback,params)
{
 if ((document.location.toString().substr(0,4) == "http") && (url.substr(0,4) == "http")){ 
 url = store.getTiddlerText("SiteProxy", "/proxy/") + url;
 }
 return bidix.core.loadRemoteFile(url,callback,params);
}
//}}}
MPTW is a distribution or edition of TiddlyWiki that includes a standard TiddlyWiki core packaged with some plugins designed to improve usability and provide a better way to organise your information. For more information see http://mptw.tiddlyspot.com/.
[[Начало]]
[[Напоминания|День варенья]]
[[Мечты]]
[[BXT|Big XML Table]]
[[node.js]]
[[Mini Browser]]
[[Шифраторы]]

[[Мои ссылки]]


[[Справка|Вики-разметка (примеры)]]


[[Календарь]]
<<calendar thismonth>>
[[Как запустить Meld под windows|https://live.gnome.org/Meld/Windows]]
[[Home Meld|http://meld.sourceforge.net/]]
[[Meld в Windows|http://habrahabr.ru/post/87597/]]
[[Meld Installer|https://bitbucket.org/grozeille/meld/downloads]]
[[Diffuse|http://diffuse.sourceforge.net/]]
<<miniBrowser noplayer http://mm3.name/>>
/***
|Name|MiniBrowserPlugin|
|Source|http://www.TiddlyTools.com/#MiniBrowserPlugin|
|Version|1.3.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires|PlayerPlugin (optional, recommended)|
|Overrides||
|Options|##Configuration|
|Description|embedded browser-in-browser with favorites lists and media support|
!!!!!Usage
<<<
{{{<<miniBrowser noplayer hidecontrols URL TiddlerName TiddlerName TiddlerName...>>}}}
* ''noplayer'' (optional)<br>disables support for embedded media player (using [[PlayerPlugin]], if installed)
* ''hidecontrols'' (optional)<br>hide initial display of minibrowser controls (except for 'show controls' checkbox)<br>//note: if no initial URL is specified, controls will be shown anyway//
* ''URL'' (optional)<br>specifies an initial URL to open when the mini browser is rendered
* ''TiddlerName'', ''TiddlerName''... (optional)<br>indicates one or more tiddlers containing "HR-separated" lists of favorites.<br>//notes: if no tiddler is specified, [[MiniBrowserList]] is used by default.  In addition, when adding/deleting favorites, the plugin automatically updates [[MiniBrowserList]], regardless of any alternative lists of favorites stored in separate tiddlers.  After changes to [[MiniBrowserList]] are made, you can then use cut/paste to manually move entries from that tiddler into other tiddlers.//
<<<
!!!!!Configuration
<<<
Default mini browser size:
width: <<option txtMiniBrowserWidth>> height: <<option txtMiniBrowserHeight>>
<<<
!!!!!Example
>{{{<<miniBrowser>>}}}<br>{{smallform small{<<miniBrowser>>}}}
>{{{<<miniBrowser hidecontrols http://www.TiddlyWiki.com>>}}}<br>{{smallform small{<<miniBrowser hidecontrols http://www.TiddlyWiki.com>>}}}
!!!!!Revisions
<<<
2008.08.12 [1.3.0] added support for wikifying content from favorites lists to enable use of forEachTiddler or inline script output to generate lists on the fly.
2008.08.06 [1.2.2] corrected size control buttons to use fixed width
2008.04.07 [1.2.1] added txtMiniBrowserWidth and txtMiniBrowserHeight.  cleanup init handling (somewhat)
2008.04.06 [1.2.0] added support for specifying initial URL to view (suggested by Richard Berg).  When opening a URL, select matching entry (if any) in bookmarks droplist.  Added support for hiding minibrowser controls.
2008.01.19 [1.1.0] added support for optional extra favorites lists stored in separate tiddlers
2007.10.15 [1.0.0] combined MiniBrowser and MediaCenter inline scripts and converted to true plugin
2006.03.01 [0.0.0] inline script
<<<
!!!!!Code
***/
//{{{
version.extensions.MiniBrowser={major: 1, minor: 3, revision: 0, date: new Date(2008,8,12)};
//}}}
//{{{
config.shadowTiddlers.MiniBrowser="<<miniBrowser>>";
//}}}
//{{{
if (config.options.txtMiniBrowserWidth==undefined) config.options.txtMiniBrowserWidth="100%";
if (config.options.txtMiniBrowserHeight==undefined) config.options.txtMiniBrowserHeight="480";
//}}}
//{{{
config.macros.miniBrowser= {
	favoritesList:
		"MiniBrowserList",
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {

		var noPlayer=params[0]&&params[0].toLowerCase()=="noplayer"; if (noPlayer) params.shift();
		if (!config.macros.player) noPlayer=true; // if PlayerPlugin not installed
		var hideControls=params[0]&&params[0].toLowerCase()=="hidecontrols"; if (hideControls) params.shift();
		var url=(params[0]&&!store.tiddlerExists(params[0]))?params.shift():"";
		hideControls=hideControls&&url.length; // if no initial URL, then show controls anyway
		var w=config.options.txtMiniBrowserWidth;
		var h=config.options.txtMiniBrowserHeight;

		// create form
		var guid=new Date().getTime()+Math.random().toString(); // globally unique ID
		var html=this.html;
		html=html.replace(/%id%/g,guid);
		html=html.replace(/%noplayer%/g,noPlayer?"true":"");
		html=html.replace(/%hidecontrols%/g,hideControls?"none":"block");
		html=html.replace(/%favorites%/g,params[0]||config.macros.miniBrowser.favoritesList);
		createTiddlyElement(place,"span").innerHTML=html;

		// init form
		document.getElementById("minibrowser_controls_"+guid).style.display=hideControls?"none":"block";
		document.getElementById("minibrowser_resize_"+guid).style.display=hideControls?"none":"block";
		document.getElementById("minibrowser_togglecontrols_"+guid).checked=!hideControls;
		document.getElementById("minibrowser_form_"+guid).url.value=url;
		document.getElementById("minibrowser_form_"+guid).w.value=w;
		document.getElementById("minibrowser_form_"+guid).h.value=h;
		if (noPlayer) { // hide "type" list no PlayerPlugin
			document.getElementById("minibrowser_type_"+guid).style.display="none";
			document.getElementById("minibrowser_url_"+guid).style.width="36%";
		}

		// load bookmarks droplist from HR-separated tiddler contents
		var b=document.getElementById("minibrowser_bookmarks_"+guid);
		while (b.options[1]) b.options[1]=null; // clear list but leave 'prompt' item
		var p; while (p=params.shift()) this.getFavorites(b,p); // load custom bookmarks
		if (b.length<2) this.getFavorites(b,config.macros.miniBrowser.favoritesList); // default list

		// load initial URL (if any)
		var place=document.getElementById("minibrowser_player_"+guid);
		this.load(place,guid,"","",w,h,true,noPlayer);
		this.go(document.getElementById("minibrowser_form_"+guid));
	},
	getFavorites: function(list,tid) {
		var txt=store.getTiddlerText(tid); if (!txt||!txt.trim().length) return;
		txt=this.getWikifiedData(txt);
		var parts=txt.split("\n----\n");
		for (var p=0; p<parts.length; p++) {
			var lines=parts[p].split("\n");
			var label=lines.shift()||""; // 1st line=display text
			var value=lines.shift()||""; // 2nd line=item value
			var indent=value&&value.length?"\xa0\xa0":"";
			list.options[list.length]=new Option(indent+label,value,false,false);
		}
	},
	getWikifiedData: // wikify tiddler content, then extract text WITH newlines and HRs included
	function(txt) {
		var e=createTiddlyElement(document.body,"div"); wikify(txt,e);
		var breaks=e.getElementsByTagName("br");
		for (var b=0; b<breaks.length; b++)
			breaks[b].parentNode.insertBefore(document.createTextNode("\n"),breaks[b]);
		var lines=e.getElementsByTagName("hr");
		for (var l=0; l<lines.length; l++)
			lines[l].parentNode.insertBefore(document.createTextNode("----\n"),lines[l]);
		var items=e.getElementsByTagName("li");
		for (var i=0; i<items.length; i++)
			items[i].parentNode.insertBefore(document.createTextNode("\n"),items[i]);
		var txt=getPlainText(e); removeNode(e); return txt;
	},
	load: function(place,id,type,url,w,h,showcontrols,noPlayer) {
		if (noPlayer) {
			if (!place) place=document.getElementById(id).parentNode;
			place.innerHTML="<iframe name='"+id+"' id='"+id+"' \
				src='"+url+"' width='"+w+"' height='"+h+"' \
				style='background:#fff;border:1px solid'></iframe>"
		} else
			config.macros.player.loadURL(place,id,type,url,w,h,showcontrols);
	},
	go: function(f) {
		var url=f.url.value.trim();
		if (!url.length) url=f.url.value=f.bookmarks.value.trim();
		if (!url.length) { this.done(f); return false; }
		var id=f.playerID.value;
		document.getElementById("minibrowser_player_"+id).style.display="block";
		document.getElementById("minibrowser_controls2_"+id).style.display="block";
		this.load(null,id,f.type.value,f.url.value,f.w.value,f.h.value,f.ctrls.checked,f.noPlayer.value=="true");
		var matched=false; for (var i=0; i<f.bookmarks.options.length; i++) // select matching bookmark
			if (f.bookmarks.options[i].value==url) { f.bookmarks.selectedIndex=i; matched=true; break; }
		if (!matched) f.bookmarks.selectedIndex=0;
		f.done.disabled=false;
		return false;
	},
	done: function(f) {
		var id=f.playerID.value;
		this.load(null,id,null,null,f.w.value,0,f.ctrls.checked,f.noPlayer.value=="true");
		document.getElementById("minibrowser_player_"+id).style.display="none";
		document.getElementById("minibrowser_controls2_"+id).style.display="none";
		f.done.disabled=true; 
		return false;
	},
	fit: function(place) {
		var trim=89; 	// fudge factor to account for the other controls + padding + borders.  ADJUST THIS VALUE TO FIT LAYOUT
		var t=story.findContainingTiddler(place);
		if (!t) { t=place; while (t && t.className!='floatingPanel') t=t.parentNode; } if (!t) return;
		var w="100%"; // horizontal stretching via CSS works, but vertical stretching doesn't... so:
		var h=t.offsetHeight-trim; // workaround: get containing panel/tiddler height and subtract "trim" height
		var f=place.form;
		this.load(null,f.playerID.value,f.type.value,f.url.value,w,h,f.ctrls.checked,f.noPlayer.value=="true"); // reload player with new size
		place.form.w.value=w; place.form.h.value=h; // update width/height input fields
	},
	add: function(place,title) {
		var v=place.value; if (!v.length) return;
		var d=prompt("Please enter a description for\n"+place.value); if (!d || !d.length) return;
		var who=config.options.txtUserName;
		var when=new Date();
		var tid=store.getTiddler(title);
		var txt="%0\n%1\n----\n%2".format([d,v,tid?tid.text:""]);
		store.saveTiddler(title,title,txt,who,when,tid?tid.tags:[],tid?tid.fields:{});
		if (!tid) story.displayTiddler(story.findContainingTiddler(place),title);
		else story.refreshTiddler(title,1,true);
		var here=story.findContainingTiddler(place);
		if (here) story.refreshTiddler(here.getAttribute("tiddler"),1,true);
	},
	del: function(place,title) {
		var v=place.value; if (!v.length) return;
		var d=place.options[place.selectedIndex].text; if (!d.length) return;
		if (!confirm("Are you sure you want to remove this favorite?\n\n"+d+"\n"+v)) return;
		var tid=store.getTiddler(title); if (!tid) return;
		var who=config.options.txtUserName;
		var when=new Date();
		var pat='%0\n%1\n----\n'.format([d.replace(/\xa0/g,''),v]); var re=new RegExp(pat,"i");
		var txt=tid.text.replace(re,"");
		store.saveTiddler(title,title,txt,who,when,tid?tid.tags:[],tid?tid.fields:{});
		story.refreshTiddler(title,1,true);
		var here=story.findContainingTiddler(place);
		if (here) story.refreshTiddler(here.getAttribute("tiddler"),1,true);
	},
	html: "<form id='minibrowser_form_%id%' style='display:block;margin:0;padding:0' onsubmit='return config.macros.miniBrowser.go(this);'><!-- \
		--><nobr><input type='hidden' name='playerID' value='%id%'><input type='hidden' name='noPlayer' value='%noplayer%'><!-- \
		--><div id='minibrowser_controls_%id%' style='display:%hidecontrols%'><!-- \
		--><input type='button' value='<' title='back' style='font-size:8pt;width:3%' \
			onclick='try{window.frames[\"player_%id%\"].history.go(-1)}catch(e){window.history.go(-1)}' ><!-- \
		--><input type='button' value='>' title='forward' style='font-size:8pt;width:3%' \
			onclick='try{window.frames[\"player_%id%\"].history.go(+1)}catch(e){window.history.go(+1)}'><!-- \
		--><input type='button' value='+' title='refresh'style='font-size:8pt;width:3%' \
			onclick='try{window.frames[\"player_%id%\"].location.reload()}catch(e){;}'><!-- \
		--><input type='button' value='x' title='stop'style='font-size:8pt;width:3%' \
			onclick='window.stop()'><!-- \
		--><select name='bookmarks' id='minibrowser_bookmarks_%id%' size='1' style='font-size:8pt;width:20%' \
			onchange='this.form.url.value=this.value; return config.macros.miniBrowser.go(this.form);'><!-- \
		--><option value=''>bookmarks...</option><!-- \
		--></select><!-- \
		--><input type='button' value='add' title='add URL to the bookmarks' style='font-size:8pt;width:5%' \
			favorites=\"%favorites%\" \
			onclick='config.macros.miniBrowser.add(this.form.url,this.getAttribute(\"favorites\"));'><!-- \
		--><input type='button' value='del' title='remove URL from the bookmarks' style='font-size:8pt;width:5%' \
			favorites=\"%favorites%\" \
			onclick='config.macros.miniBrowser.del(this.form.bookmarks,this.getAttribute(\"favorites\"));'><!-- \
		--><input type='button' value='edit' title='edit the bookmarks list' style='font-size:8pt;width:5%' \
			favorites=\"%favorites%\" \
			onclick='story.displayTiddler(null,this.getAttribute(\"favorites\"),2)'><!-- \
		--><input type='text' name='url' id='minibrowser_url_%id%' size='60' value='' style='font-size:8pt;width:23%' \
			onfocus='this.select()'><!-- \
		--><select name='type' id='minibrowser_type_%id%' size='1' style='font-size:8pt;width:13%'><!-- \
		--><option value=''>media type...</option><!-- \
		--><option value=''>auto-detect</option><!-- \
		--><option value='iframe'>web page</option><!-- \
		--><option value='windows'>windows media</option><!-- \
		--><option value='realone'>real one</option><!-- \
		--><option value='quicktime'>quicktime</option><!-- \
		--><option value='flash'>flash</option><!-- \
		--><option value='image'>jpg/gif/png</option><!-- \
		--></select><!-- \
		--><input type='submit' value='go' title='view URL in embedded player' style='font-size:8pt;width:4%'><!-- \
		--><input type='button' value='open' title='view URL in a separate player' style='font-size:8pt;width:6%' \
			onclick='if (this.form.url.value.length) window.open(this.form.url.value)'><!-- \
		--><input type='button' value='done' name='done' disabled title='disconnect from URL' style='font-size:8pt;width:6%' \
			onclick='return config.macros.miniBrowser.done(this.form);'><!-- \
		--></div><!-- \
		--><div id='minibrowser_player_%id%' style='display:none;text-align:center'></div><!-- \
		--><span id='minibrowser_controls2_%id%' style='margin-top:2px;display:none;font-size:8pt;'><!-- \
		--><div id='minibrowser_resize_%id%' style='display:%hidecontrols%;float:right;font-size:8pt'><!-- \
		--> size: <input type='text' name='w' size='3' value='' style='font-size:8pt;' \
			onfocus='this.select()'><!-- \
		-->x<input type='text' name='h' size='3' value='' style='font-size:8pt;' \
			onfocus='this.select()'><!-- \
		--> <input type='submit' value='set' style='font-size:8pt;width:5em' \
			onclick='var f=this.form; \
				if(!f.w.value.trim().length) f.w.value=config.options.txtMiniBrowserWidth; \
				if(!f.h.value.trim().length) f.h.value=config.options.txtMiniBrowserHeight; \
				config.options.txtMiniBrowserWidth=f.w.value; config.options.txtMiniBrowserHeight=f.h.value; \
				saveOptionCookie(\"txtMiniBrowserWidth\"); saveOptionCookie(\"txtMiniBrowserHeight\");'><!-- \
		--><input type='submit' value='reset' style='font-size:8pt;width:5em' \
			onclick='var f=this.form; f.ctrls.checked=true; f.w.value=\"100%\"; f.h.value=\"480\"; \
				config.options.txtMiniBrowserWidth=f.w.value; config.options.txtMiniBrowserHeight=f.h.value; \
				saveOptionCookie(\"txtMiniBrowserWidth\"); saveOptionCookie(\"txtMiniBrowserHeight\");'><!-- \
		--><input type='button' value='fit' title='resize player to fit containing window' style='font-size:8pt;width:5em' \
			onclick='config.macros.miniBrowser.fit(this)'><!-- \
		--></div><!-- \
		--> <input type='checkbox' name='ctrls' id='minibrowser_togglecontrols_%id%' title='toggle minibrowser controls' CHECKED  \
			onclick='document.getElementById(\"minibrowser_controls_%id%\").style.display=this.checked?\"block\":\"none\"; \
				document.getElementById(\"minibrowser_resize_%id%\").style.display=this.checked?\"block\":\"none\";' \
		><a href='' title='toggle minibrowser controls' \
			onclick='this.previousSibling.click();return false;'>show controls</a><!-- \
		--></span><!-- \
		--></nobr></form> \
	"
}
//}}}
# [[Mono wiki|http://ru.wikipedia.org/wiki/Mono]]
# [[Mono home page|http://www.mono-project.com/Main_Page]]
Name: MptwBlack
Background: #000
Foreground: #fff
PrimaryPale: #333
PrimaryLight: #555
PrimaryMid: #888
PrimaryDark: #aaa
SecondaryPale: #111
SecondaryLight: #222
SecondaryMid: #555
SecondaryDark: #888
TertiaryPale: #222
TertiaryLight: #666
TertiaryMid: #888
TertiaryDark: #aaa
Error: #300

This is in progress. Help appreciated.


Name: MptwSmoke
Background: #fff
Foreground: #000
PrimaryPale: #aaa
PrimaryLight: #777
PrimaryMid: #111
PrimaryDark: #000
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88

|Name|MptwStandard|
|Description|Mptw Theme with the default TiddlyWiki PageLayout and Styles|
|ViewTemplate|MptwTheme##ViewTemplate|
|EditTemplate|MptwTheme##EditTemplate|
|Name|MptwTheme|
|Description|Mptw Theme including custom PageLayout|
|PageTemplate|##PageTemplate|
|ViewTemplate|##ViewTemplate|
|EditTemplate|##EditTemplate|
|StyleSheet|##StyleSheet|

http://mptw.tiddlyspot.com/#MptwTheme ($Rev: 1829 $)

!PageTemplate
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
	<div class='headerShadow'>
		<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
		<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
	</div>
	<div class='headerForeground'>
		<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
		<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
	</div>
</div>
<!-- horizontal MainMenu -->
<div id='topMenu' refresh='content' tiddler='MainMenu'></div>
<!-- original MainMenu menu -->
<!-- <div id='mainMenu' refresh='content' tiddler='MainMenu'></div> -->
<div id='sidebar'>
	<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
	<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
	<div id='messageArea'></div>
	<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->

!ViewTemplate
<!--{{{-->
[[MptwTheme##ViewTemplateToolbar]]

<div class="tagglyTagged" macro="tags"></div>

<div class='titleContainer'>
	<span class='title' macro='view title'></span>
	<span macro="miniTag"></span>
</div>

<div class='subtitle'>
	(updated <span macro='view modified date {{config.mptwDateFormat?config.mptwDateFormat:"MM/0DD/YY"}}'></span>
	by <span macro='view modifier link'></span>)
	<!--
	(<span macro='message views.wikified.createdPrompt'></span>
	<span macro='view created date {{config.mptwDateFormat?config.mptwDateFormat:"MM/0DD/YY"}}'></span>)
	-->
</div>

<div macro="showWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')">
	<div class='viewer'><pre macro='view text'></pre></div>
</div>
<div macro="else">
	<div class='viewer' macro='view text wikified'></div>
</div>

<div class="tagglyTagging" macro="tagglyTagging"></div>

<!--}}}-->

!ViewTemplateToolbar
<!--{{{-->
<div class='toolbar'>
	<span macro="showWhenTagged systemConfig">
		<span macro="toggleTag systemConfigDisable . '[[disable|systemConfigDisable]]'"></span>
	</span>
	<span macro="showWhenTagged systemTheme"><span macro="applyTheme"></span></span>
	<span macro="showWhenTagged systemPalette"><span macro="applyPalette"></span></span>
	<span macro="showWhen tiddler.tags.contains('css') || tiddler.title == 'StyleSheet'"><span macro="refreshAll"></span></span>
	<span style="padding:1em;"></span>
	<span macro='toolbar closeTiddler closeOthers +editTiddler deleteTiddler > fields syncing permalink references jump'></span> <span macro='newHere label:"new here"'></span>
	<span macro='newJournalHere {{config.mptwJournalFormat?config.mptwJournalFormat:"MM/0DD/YY"}}'></span>
</div>
<!--}}}-->

!EditTemplate
<!--{{{-->
<div class="toolbar" macro="toolbar +saveTiddler saveCloseTiddler closeOthers -cancelTiddler cancelCloseTiddler deleteTiddler"></div>
<div class="title" macro="view title"></div>
<div class="editLabel">Title</div><div class="editor" macro="edit title"></div>
<div macro='annotations'></div>
<div class="editLabel">Content</div><div class="editor" macro="edit text"></div>
<div class="editLabel">Tags</div><div class="editor" macro="edit tags"></div>
<div class="editorFooter"><span macro="message views.editor.tagPrompt"></span><span macro="tagChooser"></span></div>
<!--}}}-->

!StyleSheet
/*{{{*/

/* a contrasting background so I can see where one tiddler ends and the other begins */
body {
	background: [[ColorPalette::TertiaryLight]];
}

/* sexy colours and font for the header */
.headerForeground {
	color: [[ColorPalette::PrimaryPale]];
}
.headerShadow, .headerShadow a {
	color: [[ColorPalette::PrimaryMid]];
}

/* separate the top menu parts */
.headerForeground, .headerShadow {
	padding: 1em 1em 0;
}

.headerForeground, .headerShadow {
	font-family: 'Trebuchet MS' sans-serif;
	font-weight:bold;
}
.headerForeground .siteSubtitle {
	color: [[ColorPalette::PrimaryLight]];
}
.headerShadow .siteSubtitle {
	color: [[ColorPalette::PrimaryMid]];
}

/* make shadow go and down right instead of up and left */
.headerShadow {
	left: 1px;
	top: 1px;
}

/* prefer monospace for editing */
.editor textarea, .editor input {
	font-family: 'Consolas' monospace;
	background-color:[[ColorPalette::TertiaryPale]];
}


/* sexy tiddler titles */
.title {
	font-size: 250%;
	color: [[ColorPalette::PrimaryLight]];
	font-family: 'Trebuchet MS' sans-serif;
}

/* more subtle tiddler subtitle */
.subtitle {
	padding:0px;
	margin:0px;
	padding-left:1em;
	font-size: 90%;
	color: [[ColorPalette::TertiaryMid]];
}
.subtitle .tiddlyLink {
	color: [[ColorPalette::TertiaryMid]];
}

/* a little bit of extra whitespace */
.viewer {
	padding-bottom:3px;
}

/* don't want any background color for headings */
h1,h2,h3,h4,h5,h6 {
	background-color: transparent;
	color: [[ColorPalette::Foreground]];
}

/* give tiddlers 3d style border and explicit background */
.tiddler {
	background: [[ColorPalette::Background]];
	border-right: 2px [[ColorPalette::TertiaryMid]] solid;
	border-bottom: 2px [[ColorPalette::TertiaryMid]] solid;
	margin-bottom: 1em;
	padding:1em 2em 2em 1.5em;
}

/* make options slider look nicer */
#sidebarOptions .sliderPanel {
	border:solid 1px [[ColorPalette::PrimaryLight]];
}

/* the borders look wrong with the body background */
#sidebar .button {
	border-style: none;
}

/* this means you can put line breaks in SidebarOptions for readability */
#sidebarOptions br {
	display:none;
}
/* undo the above in OptionsPanel */
#sidebarOptions .sliderPanel br {
	display:inline;
}

/* horizontal main menu stuff */
#displayArea {
	margin: 1em 15.7em 0em 1em; /* use the freed up space */
}
#topMenu br {
	display: none;
}
#topMenu {
	background: [[ColorPalette::PrimaryMid]];
	color:[[ColorPalette::PrimaryPale]];
}
#topMenu {
	padding:2px;
}
#topMenu .button, #topMenu .tiddlyLink, #topMenu a {
	margin-left: 0.5em;
	margin-right: 0.5em;
	padding-left: 3px;
	padding-right: 3px;
	color: [[ColorPalette::PrimaryPale]];
	font-size: 115%;
}
#topMenu .button:hover, #topMenu .tiddlyLink:hover {
	background: [[ColorPalette::PrimaryDark]];
}

/* make 2.2 act like 2.1 with the invisible buttons */
.toolbar {
	visibility:hidden;
}
.selected .toolbar {
	visibility:visible;
}

/* experimental. this is a little borked in IE7 with the button 
 * borders but worth it I think for the extra screen realestate */
.toolbar { float:right; }

/* fix for TaggerPlugin. from sb56637. improved by FND */
.popup li .tagger a {
   display:inline;
}

/* makes theme selector look a little better */
#sidebarOptions .sliderPanel .select .button {
  padding:0.5em;
  display:block;
}
#sidebarOptions .sliderPanel .select br {
	display:none;
}

/* make it print a little cleaner */
@media print {
	#topMenu {
		display: none ! important;
	}
	/* not sure if we need all the importants */
	.tiddler {
		border-style: none ! important;
		margin:0px ! important;
		padding:0px ! important;
		padding-bottom:2em ! important;
	}
	.tagglyTagging .button, .tagglyTagging .hidebutton {
		display: none ! important;
	}
	.headerShadow {
		visibility: hidden ! important;
	}
	.tagglyTagged .quickopentag, .tagged .quickopentag {
		border-style: none ! important;
	}
	.quickopentag a.button, .miniTag {
		display: none ! important;
	}
}

/* get user styles specified in StyleSheet */
[[StyleSheet]]

/*}}}*/

Голосовой P2P чат с поддержкой конференций работающий прямо из браузера (без установки дополнительных программ).

[[WebRTC|http://habrahabr.ru/post/136605/]]
[[LibJingle|http://code.google.com/p/libjingle/]]
[[SpeechApi|http://code.google.com/p/speechapi/]]
[[Mutual-authentication with web services|http://stackoverflow.com/questions/2240931/mutual-authentication-with-web-services/2918525#2918525]]
[[How to create Custom CA and Certificates for SSL using Open SSL|http://oshogsb.blogspot.ru/2007/07/how-to-create-custom-ca-and.html]]
[[Client cert authentication with java|http://vafer.org/blog/20061010073725/]]
[[Two-Way SSL in Weblogic for Developers |http://red-3.blogspot.ru/2006/11/two-way-ssl-in-weblogic-for-developers.html]]
[[The Fifteen Minute Guide to Mutual Authentication|http://monduke.com/2006/06/04/the-fifteen-minute-guide-to-mutual-authentication/]]
[[Example: Mutual Certificates Security (MCS)|http://docs.oracle.com/cd/E17802_01/webservices/webservices/reference/tutorials/wsit/doc/WSIT_Security9.html]]
[[The TLS Protocol Version 1.0|http://www.ietf.org/rfc/rfc2246]]
[[The TLS Protocol Version 1.2|http://www.ietf.org/rfc/rfc5246.txt]]
[[WebServiceContext.getUserPrincipal returns “ANONYMOUS” when using mutual authentication|http://stackoverflow.com/questions/3082633/webservicecontext-getuserprincipal-returns-anonymous-when-using-mutual-authent?rq=1]]
[[MTLS ( mutual TLS) details|http://stackoverflow.com/questions/19601420/mtls-mutual-tls-details]]
[[Configure SSL Mutual (Two-way) Authentication|http://security.stackexchange.com/questions/34897/configure-ssl-mutual-two-way-authentication]]
[[Transport Layer Security (TLS) Vs. Mutual Transport Layer Security (MTLS)|http://gunnalag.com/2011/04/24/transport-layer-security-tls-vs-mutual-transport-layer-security-mtls-in-live-communications-server-lcs/]]
[[Configuring Apache 2.0 for SSL/TLS Mutual Authentication using an OpenSSL Certificate Authority|http://www.cafesoft.com/products/cams/ps/docs31/admin/ConfiguringApache2ForSSLTLSMutualAuthentication.html]]
[[A few frequently used SSL commands|http://shib.kuleuven.be/docs/ssl_commands.shtml]]
# [[NetCat and other|http://proft.me/2011/08/9/primery-ispolzovaniya-netstat-ss-netcat/]]
# [[netcat|http://mylinuxbook.com/linux-netcat-command/]]
# [[NetCat wiki en|http://en.wikipedia.org/wiki/Netcat]]
# [[NetCat wiki ru|http://ru.wikipedia.org/wiki/Netcat]]
# [[Полезные Unix утилиты. Netcat|http://handynotes.ru/2010/01/unix-utility-netcat.html]]
# [[HTTP сервер на BASH|http://www.opennet.ru/tips/info/1451.shtml]]
# [[HTTP сервер в одну строку: версия 2.0|http://alexey.sveshnikov.ru/blog/2007/08/30/bash-httpd-2/]]

открываем шелл, на сервере
{{{
mkfifo /tmp/pipe;
sh /tmp/pipe | nc -l 1234 > /tmp/pipe 
}}}
или
{{{
cat /tmp/tmp_fifo | /bin/sh -i 2>&1 | nc -l 1567 > /tmp/tmp_fifo
}}}
на клиенте вводим
{{{
nc 127.0.0.1 1234
}}}
и потом пишем команды

{{{
(echo -e "HTTP/1.1 200 OK\nContent-Type: text/html\n\n Hello World";) | nc -vv -l -p 8080
}}}

{{{
mkfifo tmp
mkfifo tmp2
nc -l 8080 -k > tmp < tmp2 &
while [ 1 ]
do
 openssl s_client -connect www.google.com:443 -quiet < tmp > tmp2
done
}}}

HTTP сервер на BASH
{{{
while :;do nc -p8080 -vnlc’r=read;e=”echo -e”;$r a b c;while [ -n "`$e $a|tr -d "\r\n"`" ];do $r a;done;f=`$e $b|sed s/.//`;h=”HTTP/1.0″;z=”404 Not Found\n”;[ -z $f ]&&(ls|while $r n;do [ -f $n ]&&$e “$n“;done)||([ -f $f ]&&($e “$h 200 OK\r\nContent-Type: `file -ib $f`\n”;cat $f)||$e “$h $z\n$z”)’;done
}}}
или
{{{
true; while [ $? -eq 0 ];do nc -vlp 8080 -c'(r=read;e=echo;$r a b c;E=NOTYET;while [ ${#E} -gt 0 ];do $r E;E=`$e $E|tr -d "\r\n"`;done;f=`$e $b|sed 's/[^a-z0-9_.-]//gi'`;h="HTTP/1.0";o="$h 200 OK\r\n";c="Content";if [ -z $f ];then($e -e $o;ls|(while $r n;do if test -f ${n}; then $e "<a href=\"/$n\">$n</a><br>";fi;done););elif [ -f $f ];then $e -e "$o$c-Type: `file -ib $f`\n$c-Length: `stat -c%s $f`\n";cat $f;else $e -e "$h 404 Not Found\n\n404\n";fi)';done
}}}

/***
|Name:|NewHerePlugin|
|Description:|Creates the new here and new journal macros|
|Version:|3.0 ($Rev: 3861 $)|
|Date:|$Date: 2008-03-08 10:53:09 +1000 (Sat, 08 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#NewHerePlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{
merge(config.macros, {
	newHere: {
		handler: function(place,macroName,params,wikifier,paramString,tiddler) {
			wikify("<<newTiddler "+paramString+" tag:[["+tiddler.title+"]]>>",place,null,tiddler);
		}
	},
	newJournalHere: {
		handler: function(place,macroName,params,wikifier,paramString,tiddler) {
			wikify("<<newJournal "+paramString+" tag:[["+tiddler.title+"]]>>",place,null,tiddler);
		}
	}
});

//}}}

http://stackoverflow.com/questions/20351637/how-to-create-a-simple-http-proxy-in-node-js
https://github.com/request/request
https://newspaint.wordpress.com/2012/11/05/node-js-http-and-https-proxy/
http://www.catonmat.net/http-proxy-in-nodejs/
http://blog.vanamco.com/proxy-requests-in-node-js/
https://www.glype.com/
http://www.steve.org.uk/Software/node-reverse-proxy/
https://github.com/skx/node-reverse-proxy.js
http://albertolarripa.com/2013/11/10/node-as-proxy-proxying-http-and-websockets/
https://www.pgrs.net/2010/02/01/web-proxy-in-node-js-for-high-availability/
Есть одна такая финская кампания, которая в прошлом делала неплохие телефоны, а сейчас некоторым заказчикам необходимо писать приложения для этих телефонов, вот и приходиться искать ссылки на документацию.

[[Library|http://www.developer.nokia.com/Resources/Library/]]
[[Java|http://www.developer.nokia.com/Resources/Library/Java/]]
[[S60 C++|http://library.developer.nokia.com/index.jsp?topic=/GUID-E35887BB-7E58-438C-AA27-97B2CDE7E069/GUID-E35887BB-7E58-438C-AA27-97B2CDE7E069_cover.html]]
<<miniBrowser noplayer http://notesave.ru/>>
#[[JPC - эмулятор x86 на Java|http://www.linux.org.ru/news/java/3848177]]
#[[JPC source|http://sourceforge.net/projects/jpc/]]
#[[Dioscuri - modular emulator|http://sourceforge.net/p/dioscuri/code/371/tree/]]
Paranoicus - это браузер с параноидальными настройками безопасности, который открывает только те сайты которые явно прописаны в его настройках по принципу белого списка и до кучи ещё имеет чёрный список контента который не загружать, даже если он проходит по белому списку.
Все мы ежедневно просматриваем ограниченный набор сайтов (ЛОР, хабра, жж, твиттер, контакт, фейсбук и ещё некоторые) и только иногда что-то гуглим, но при этом по умолчанию разрешаем браузеру грузить абсолютно всё что ему вздумается и даже не имеем возможности хоть как-то это контролировать.
Paranoicus грузит то и только то что ему разрешено и игнорирует любой другой контент.
В качестве фичи можно рассматривать презагруженные стандартные скрипты такие как jQuery, отображение списка правил по которым загружен контент на странице, быстрый доступ к белому и чёрному спискам с лёгкой возможностью их редактирования.
/***
|''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"
	});
*/
//}}}
# [[PhoneGap wiki|http://ru.wikipedia.org/wiki/PhoneGap]]
# [[Offsite|http://www.phonegap.com/]]
<<miniBrowser noplayer http://demo.qooxdoo.org/current/playground/#>>
# 209.244.0.3 / 209.244.0.4 - Level3
# 8.8.8.8 / 8.8.4.4  -Google
# 184.169.143.224 / 184.169.161.155 - Securly
# 8.26.56.26 / 8.20.247.20 - Comodo Secure DNS
# 208.67.222.222 / 208.67.220.220  - OpenDNS
# 156.154.70.1 / 156.154.71.1  - DNS Advantage
# 198.153.192.1 / 198.153.194.1  - Norton DNS
# 67.138.54.120 / 207.225.209.77 - ScrubIT
# 74.207.247.4 / 64.0.55.201  - OpenNIC
# 199.5.157.131 / 208.71.35.137 - Public-Root
# 208.76.50.50 / 208.76.51.51 - SmartViper

Cisco (San Jose, CA, US)
64.102.255.44
128.107.241.185

Level 3 Communications (Broomfield, CO, US)
4.2.2.1
4.2.2.2
4.2.2.3
4.2.2.4
4.2.2.5
4.2.2.6

Verizon (Reston, VA, US)
151.197.0.38
151.197.0.39
151.202.0.84
151.202.0.85
151.202.0.85
151.203.0.84
151.203.0.85
199.45.32.37
199.45.32.38
199.45.32.40
199.45.32.43
GTE (Irving, TX, US)
192.76.85.133
206.124.64.1

SpeakEasy (Seattle, WA, US)
66.93.87.2
216.231.41.2
216.254.95.2
64.81.45.2
64.81.111.2
64.81.127.2
64.81.79.2
64.81.159.2
66.92.64.2
66.92.224.2
66.92.159.2
64.81.79.2
64.81.159.2
64.81.127.2
64.81.45.2
216.27.175.2
66.92.159.2
66.93.87.2

Sprintlink (Overland Park, KS, US)
199.2.252.10
204.97.212.10
204.117.214.10

Яндекс.DNS
Базовый
77.88.8.8
77.88.8.1
Безопасный
77.88.8.88
77.88.8.2
Семейный
77.88.8.7
77.88.8.3

# [ПростоVPN.АнтиЗапрет|http://antizapret.prostovpn.org/]
# [Как обойти блокировку сайтов |http://ntv.livejournal.com/272969.html]
# [Обзор специализированных способов обхода блокировок в интернете|http://habrahabr.ru/post/219623/]

    http://anonymouse.org
    http://www.hidemyass.com
    http://www.shadowsurf.com
    http://www.proxyforall.com
    http://www.proxyweb.net
    http://www.pagewash.com
    http://webwarper.net
    https://www.megaproxy.com
    http://www.anonymizer.ru
http://habrahabr.ru/post/206924/
http://geektimes.ru/post/117778/
http://android-mobile.ru/qr-code/generator
http://mojiq.kazina.com/
https://www.unitag.io/qrcode
/***
|Name:|QuickOpenTagPlugin|
|Description:|Changes tag links to make it easier to open tags as tiddlers|
|Version:|3.0.1 ($Rev: 3861 $)|
|Date:|$Date: 2008-03-08 10:53:09 +1000 (Sat, 08 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#QuickOpenTagPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{
config.quickOpenTag = {

	dropdownChar: (document.all ? "\u25bc" : "\u25be"), // the little one doesn't work in IE?

	createTagButton: function(place,tag,excludeTiddler) {
		// little hack so we can do this: <<tag PrettyTagName|RealTagName>>
		var splitTag = tag.split("|");
		var pretty = tag;
		if (splitTag.length == 2) {
			tag = splitTag[1];
			pretty = splitTag[0];
		}
		
		var sp = createTiddlyElement(place,"span",null,"quickopentag");
		createTiddlyText(createTiddlyLink(sp,tag,false),pretty);
		
		var theTag = createTiddlyButton(sp,config.quickOpenTag.dropdownChar,
                        config.views.wikified.tag.tooltip.format([tag]),onClickTag);
		theTag.setAttribute("tag",tag);
		if (excludeTiddler)
			theTag.setAttribute("tiddler",excludeTiddler);
    		return(theTag);
	},

	miniTagHandler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var tagged = store.getTaggedTiddlers(tiddler.title);
		if (tagged.length > 0) {
			var theTag = createTiddlyButton(place,config.quickOpenTag.dropdownChar,
                        	config.views.wikified.tag.tooltip.format([tiddler.title]),onClickTag);
			theTag.setAttribute("tag",tiddler.title);
			theTag.className = "miniTag";
		}
	},

	allTagsHandler: function(place,macroName,params) {
		var tags = store.getTags(params[0]);
		var filter = params[1]; // new feature
		var ul = createTiddlyElement(place,"ul");
		if(tags.length == 0)
			createTiddlyElement(ul,"li",null,"listTitle",this.noTags);
		for(var t=0; t<tags.length; t++) {
			var title = tags[t][0];
			if (!filter || (title.match(new RegExp('^'+filter)))) {
				var info = getTiddlyLinkInfo(title);
				var theListItem =createTiddlyElement(ul,"li");
				var theLink = createTiddlyLink(theListItem,tags[t][0],true);
				var theCount = " (" + tags[t][1] + ")";
				theLink.appendChild(document.createTextNode(theCount));
				var theDropDownBtn = createTiddlyButton(theListItem," " +
					config.quickOpenTag.dropdownChar,this.tooltip.format([tags[t][0]]),onClickTag);
				theDropDownBtn.setAttribute("tag",tags[t][0]);
			}
		}
	},

	// todo fix these up a bit
	styles: [
"/*{{{*/",
"/* created by QuickOpenTagPlugin */",
".tagglyTagged .quickopentag, .tagged .quickopentag ",
"	{ margin-right:1.2em; border:1px solid #eee; padding:2px; padding-right:0px; padding-left:1px; }",
".quickopentag .tiddlyLink { padding:2px; padding-left:3px; }",
".quickopentag a.button { padding:1px; padding-left:2px; padding-right:2px;}",
"/* extra specificity to make it work right */",
"#displayArea .viewer .quickopentag a.button, ",
"#displayArea .viewer .quickopentag a.tiddyLink, ",
"#mainMenu .quickopentag a.tiddyLink, ",
"#mainMenu .quickopentag a.tiddyLink ",
"	{ border:0px solid black; }",
"#displayArea .viewer .quickopentag a.button, ",
"#mainMenu .quickopentag a.button ",
"	{ margin-left:0px; padding-left:2px; }",
"#displayArea .viewer .quickopentag a.tiddlyLink, ",
"#mainMenu .quickopentag a.tiddlyLink ",
"	{ margin-right:0px; padding-right:0px; padding-left:0px; margin-left:0px; }",
"a.miniTag {font-size:150%;} ",
"#mainMenu .quickopentag a.button ",
"	/* looks better in right justified main menus */",
"	{ margin-left:0px; padding-left:2px; margin-right:0px; padding-right:0px; }", 
"#topMenu .quickopentag { padding:0px; margin:0px; border:0px; }",
"#topMenu .quickopentag .tiddlyLink { padding-right:1px; margin-right:0px; }",
"#topMenu .quickopentag .button { padding-left:1px; margin-left:0px; border:0px; }",
"/*}}}*/",
		""].join("\n"),

	init: function() {
		// we fully replace these builtins. can't hijack them easily
		window.createTagButton = this.createTagButton;
		config.macros.allTags.handler = this.allTagsHandler;
		config.macros.miniTag = { handler: this.miniTagHandler };
		config.shadowTiddlers["QuickOpenTagStyles"] = this.styles;
		store.addNotification("QuickOpenTagStyles",refreshStyles);
	}
}

config.quickOpenTag.init();

//}}}

http://www.htc.com/uk/SupportViewNews.aspx?dl_id=948&news_id=653
Давай чтоли по проектируем немного.

RSS-Reader - Состоит из двух частей:
1. UI - в первом приближении браузерное приложение отображающее фиды в удобном виде, может работать, как с агрегатором так и с источниками фидов на прямую. В последствии можно написать нативные приложения под все популярные платформы, работающее по тому же принцыпу.

UI -состоит из следующих частей:
1.1.  преобразователь массива json обьектов в дивы для встраивания в dom - обьект страницы
1.2.  парсер данных из rss или atom формата в массив json обьектов
1.3.  остальная обьвязка и верстка 

2. RSS-агрегатор - серверная часть, осуществляет сбор и хранение фидов, а также обеспечивает доступ к фидам по REST протоколу, отдавая контент в json, rss или atom формате. Так же есть идея отдавать контент в виде статических html страниц с нужным форматированием.

агрегатор состоит из следующих частей:
2.1. паук забирающий по расписанию rss-фиды
2.2. база для хранения фидов
2.3. REST - сервер
2.4 отдача статики, скриптов и стилей.

sitename/rssreader/ - дефолтное приложение для анонимного пользователя
sitename/rssreader/admin - административная панель
sitename/rssreader/feeds - промофиды для анонимного пользователя
sitename/rssreader/feeds/feedid/json - фид в json формате
sitename/rssreader/feeds/feedid/rss - фид в rss формате
sitename/rssreader/feedid/atom - фид в atom формате
sitename/rssreader/feeds/feedid/html - фид в html формате
sitename/rssreader/feeds/feedid/settings - настройки фида
sitename/rssreader/search - поиск по всем фидам 
sitename/rssreader/auth - аутентификация
sitename/rssreader/username - приложение для залогиненого пользователя
sitename/rssreader/username/auth - аутентификация пользователя
sitename/rssreader/username/search - поиск для залогиненого пользователя
sitename/rssreader/username/favorites - отмеченые пользователем посты
sitename/rssreader/username/settings - настройки пользователя
sitename/rssreader/username/feeds - фиды пользователя
sitename/rssreader/username/feeds/feedid - определённый фид в дефолтном формате
sitename/rssreader/username/feeds/feedid/json - фид в json формате
sitename/rssreader/username/feeds/feedid/rss - фид в rss формате
sitename/rssreader/username/feeds/feedid/atom - фид в atom формате
sitename/rssreader/username/feeds/feedid/html - фид в html формате
sitename/rssreader/username/feeds/feedid/items - отдельная запись фида в дефолтном формате
sitename/rssreader/username/feeds/feedid/items/json - отдельная запись фида в json формате
sitename/rssreader/username/feeds/feedid/items/rss - отдельная запись фида в rss формате
sitename/rssreader/username/feeds/feedid/items/atom - отдельная запись фида в atom формате
sitename/rssreader/username/feeds/feedid/items/html - отдельная запись фида в html формате
sitename/rssreader/username/feeds/feedid/settings - настройки фида
sitename/rssreader/username/feeds/feedid/search - поиск в фиде
sitename/rssreader/username/feeds/feedid/favorites - отмеченые пользователем записи в фиде
sitename/rssreader/username/feeds/feedid/favorites/search - поиск в отмеченых пользователем записях в фиде




#[[Habra|http://habrahabr.ru/post/95526/]]
#[[Node-rss|https://github.com/dylang/node-rss]]
#[[Node-feedparser|https://github.com/danmactough/node-feedparser]]
#[[Node-js-rss-module|http://stackoverflow.com/questions/5722638/node-js-rss-module]]
#[[Node-rssparser|https://github.com/tk120404/node-rssparser]]
#[[selfoss|http://selfoss.aditu.de/]]
#[[NewsBlur|https://github.com/samuelclay/NewsBlur]]
#[[Tiny Tiny RSS|http://tt-rss.org/index.html]]

#[[Создание веб-паука на Node.js|http://nodejs.ru/268]]
#[[Бенчмарк HTML парсеров|http://habrahabr.ru/post/163979/]]
#[[Получение погоды на Node.JS|http://redspirit.ru/busy/poluchenie-pogody-na-node-js.html]]

#[[2000 часов в одиночестве, или как был сделан RSS reader|http://habrahabr.ru/post/95526/]]
#[[google-fucked-up|http://lifehacker.ru/2013/03/14/google-fucked-up/]]
#[[Ищем альтернативы Google Reader|http://habrahabr.ru/post/172725/]]
#[[Свой Google Reader методом Бендера|http://habrahabr.ru/post/172727/]]
#[[Обзор RSS-ридеров — self-hosted альтернативы Google Reader|http://habrahabr.ru/post/172967/]]
#[[Как использовать Gmail вместо Google Reader |http://lifehacker.ru/2013/03/20/kak-ispolzovat-gmail-vmesto-google-reader/]]
#[[Готовясь к отключению Google Reader-а|http://habrahabr.ru/post/174315/]]
!ФС Reizer4fs на основе которого буду писать свой код

|>|>|>|!linux-2.6.35|>|>|>|!reiser4-for-2.6.35.patch|>|>|>|!bxt-for-2.6.35.patch|
| \doc | [[Changes|Changes_old]] | |  | \doc | [[Changes|Changes_r4]] |  |  | \doc |  |  |  |
|  |  |  |  |  | \filesystems | [[reiser4.txt|reiser4_txt_r4]] |  |  |  |  |  |
| \mm | [[filemap.c|filemap_c_old]] |  |  | \mm | [[filemap.c|filemap_c_r4]] |  |  | \mm |  |  |  |
|  | [[page-writeback.c|page-writeback_c_old]] |  |  |  | [[page-writeback.c|page-writeback_c_r4]] |  |  |  |  |  |  |
| \include | \linux | [[fs.h|fs_h_old]] |  | \include | \linux | [[fs.h|fs_h_r4]] |  | \include |  |  |  |
|  |  | [[mm.h|mm_h_old]] |  |  |  | [[mm.h|mm_h_r4]] |  |  |  |  |  |
|  |  | [[writeback.h|writeback_h_old]] |  |  |  | [[writeback.h|writeback_h_r4]] |  |  |  |  |  |
| \fs | [[Kconfig|Kconfig_old]] |  |  | \fs | [[Kconfig|Kconfig_r4]] |  |  | \fs |  |  |  |
|  | [[Makefile|Makefile_old]] |  |  |  | [[Makefile|Makefile_r4]] |  |  |  |  |  |  |
|  | [[fs-writeback.c|fs-writeback_c_old]] |  |  |  | [[fs-writeback.c|fs-writeback_c_r4]] |  |  |  |  |  |  |
|  | [[inode.c|inode_c_old]] |  |  |  | [[inode.c|inode_c_r4]] |  |  |  |  |  |  |
|  |  |  |  |  | \reiser4 | [[Kconfig|reiser4_Kconfig]] |  |  |  |  |  |
|  |  |  |  |  |  | [[Makefile|reiser4_Makefile]] |  |  |  |  |  |
|  |  |  |  |  |  | [[README|reiser4_README]] |  |  |  |  |  |
|  |  |  |  |  |  |  |  |  |  |  |  |


! Ссылки по теме.

http://www.samag.ru/cgi-bin/go.pl?q=articles;n=04.2006;a=10
http://www.linuxcenter.ru/enc/file-sys.htm
http://www.ibm.com/developerworks/ru/library/l-linux-filesystem/index.html
http://www.linux.org.ru/wiki/en/Reiser4
http://www.opennet.ru/base/sys/xfs_struct.txt.html
/***
|''Name:''|ReminderPlugin|
|''Version:''|2.3.8 (Mar 9, 2006)|
|''Source:''|http://www.geocities.com/allredfaq/reminderMacros.html|
|''Author:''|Jeremy Sheeley(pop1280 [at] excite [dot] com)|
|''Licence:''|[[BSD open source license]]|
|''Macros:''|reminder, showreminders, displayTiddlersWithReminders, newReminder|
|''TiddlyWiki:''|2.0+|
|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|
|''Hacked by:'' | //Cleb. Support for Russian dates added// |
|''Hack version:'' | //0.8b// |
|''Hack source:'' | http://glebsite.ru/tw |

!Description
This plugin provides macros for tagging a date with a reminder.  Use the {{{reminder}}} macro to do this.  The {{{showReminders}}} and {{{displayTiddlersWithReminder}}} macros automatically search through all available tiddlers looking for upcoming reminders.

!Installation
* Create a new tiddler in your tiddlywiki titled ReminderPlugin and give it the {{{systemConfig}}} tag.  The tag is important because it tells TW that this is executable code.
* Double click this tiddler, and copy all the text from the tiddler's body.
* Paste the text into the body of the new tiddler in your TW.
* Save and reload your TW.
* You can copy some examples into your TW as well.  See [[Simple examples]], [[Holidays]], [[showReminders]] and [[Personal Reminders]]

!Syntax:
|>|See [[ReminderSyntax]] and [[showRemindersSyntax]]|

!Revision history
* v2.3.8 (Mar 9, 2006)
**Bug fix: A global variable had snuck in, which was killing FF 1.5.0.1
**Feature: You can now use TIDDLER and TIDDLERNAME in a regular reminder format
* v2.3.6 (Mar 1, 2006)
**Bug fix: Reminders for today weren't being matched sometimes.
**Feature:  Solidified integration with DatePlugin and CalendarPlugin
**Feature:  Recurring reminders will now return multiple hits in showReminders and the calendar.
**Feature:  Added TIDDLERNAME to the replacements for showReminders format, for plugins that need the title without brackets.
* v2.3.5 (Feb 8, 2006)
**Bug fix: Sped up reminders lots.  Added a caching mechanism for reminders that have already been matched.
* v2.3.4 (Feb 7, 2006)
**Bug fix: Cleaned up code to hopefully prevent the Firefox 1.5.0.1 crash that was causing lots of plugins 
to crash Firefox.  Thanks to http://www.jslint.com
* v2.3.3 (Feb 2, 2006)
**Feature: newReminder now has drop down lists instead of text boxes.
**Bug fix:  A trailing space in a title would trigger an infinite loop.
**Bug fix:  using tag:"birthday !reminder" would filter differently than tag:"!reminder birthday"
* v2.3.2 (Jan 21, 2006)
**Feature: newReminder macro, which will let you easily add a reminder to a tiddler. Thanks to Eric Shulman (http://www.elsdesign.com) for the code to do this.
** Bug fix: offsetday was not working sometimes
** Bug fix: when upgrading to 2.0, I included a bit to exclude tiddlers tagged with excludeSearch.  I've reverted back to searching through all tiddlers
* v2.3.1 (Jan 7, 2006)
**Feature: 2.0 compatibility
**Feature AlanH sent some code to make sure that showReminders prints a message if no reminders are found.
* v2.3.0 (Jan 3, 2006)
** Bug Fix:  Using "Last Sunday (-0)" as a offsetdayofweek wasn't working.
** Bug Fix:  Daylight Savings time broke offset based reminders (for example year:2005 month:8 day:23 recurdays:7 would match Monday instead of Tuesday during DST.

!Code
***/
//{{{

//============================================================================
//============================================================================
//           ReminderPlugin
//============================================================================
//============================================================================

version.extensions.ReminderPlugin = {major: 2, minor: 3, revision: 8, date: new Date(2006,3,9), source: "http://www.geocities.com/allredfaq/reminderMacros.html"};

//============================================================================
// Configuration
// Modify this section to change the defaults for 
// leadtime and display strings
//============================================================================

config.macros.reminders = {};
config.macros["reminder"] = {};
config.macros["newReminder"] = {};
config.macros["showReminders"] = {};
config.macros["displayTiddlersWithReminders"] = {};

config.macros.reminders["defaultLeadTime"] = [0,6000];
config.macros.reminders["defaultReminderMessage"] = "DIFF: TITLE: DATE ANNIVERSARY";
config.macros.reminders["defaultShowReminderMessage"] = "DIFF: TITLE: DATE ANNIVERSARY -- TIDDLER";
config.macros.reminders["defaultAnniversaryMessage"] = "(DIFF-летие)";
config.macros.reminders["untitledReminder"] = "Что-то";
config.macros.reminders["noReminderFound"] = "В ближайшие дни (LEADTIMEUPPER) TITLE отсутствует в планах."
config.macros.reminders["todayString"] = "''Сегодня''";
config.macros.reminders["tomorrowString"] = "''Завтра''";
config.macros.reminders["ndaysString"] = "Через DIFF дней";
config.macros.reminders["emtpyShowRemindersString"] = "Ничего не запланировано!";


//============================================================================
//  Code
// You should not need to edit anything 
// below this.  Make sure to edit this tiddler and copy 
// the code from the text box, to make sure that 
// tiddler rendering doesn't interfere with the copy 
// and paste.
//============================================================================

// This line is to preserve 1.2 compatibility
 if (!story) var story=window; 
//this object will hold the cache of reminders, so that we don't
//recompute the same reminder over again.
var reminderCache = {};

config.macros.showReminders.handler = function showReminders(place,macroName,params)
{
   var now = new Date().getMidnight();
   var paramHash = {};
   var leadtime = [0,14];
   paramHash = getParamsForReminder(params);
   var bProvidedDate = (paramHash["year"] != null) || 
			(paramHash["month"] != null) || 
			(paramHash["day"] != null) || 
			(paramHash["dayofweek"] != null);
   if (paramHash["leadtime"] != null)
   {
      leadtime = paramHash["leadtime"];
      if (bProvidedDate)
      {
         //If they've entered a day, we need to make 
         //sure to find it.  We'll reset the 
         //leadtime a few lines down.
         paramHash["leadtime"] = [-10000, 10000];
      }
   }
   var matchedDate = now;
   if (bProvidedDate)
   {
      var leadTimeLowerBound = new Date().getMidnight().addDays(paramHash["leadtime"][0]);
      var leadTimeUpperBound = new Date().getMidnight().addDays(paramHash["leadtime"][1]);
      matchedDate = findDateForReminder(paramHash, new Date().getMidnight(), leadTimeLowerBound, leadTimeUpperBound); 
   }

   var arr = findTiddlersWithReminders(matchedDate, leadtime, paramHash["tag"], paramHash["limit"]);
   var elem = createTiddlyElement(place,"span",null,null, null);
   var mess = "";
   if (arr.length == 0)
   {
      mess += config.macros.reminders.emtpyShowRemindersString; 
   }
   for (var j = 0; j < arr.length; j++)
   {
      if (paramHash["format"] != null)
      {
         arr[j]["params"]["format"] = paramHash["format"];
      }
      else
      {
         arr[j]["params"]["format"] = config.macros.reminders["defaultShowReminderMessage"];
      }
      mess += getReminderMessageForDisplay(arr[j]["diff"], arr[j]["params"], arr[j]["matchedDate"], arr[j]["tiddler"]);
      mess += "\n";
   }
   wikify(mess, elem, null, null);
};


config.macros.displayTiddlersWithReminders.handler = function displayTiddlersWithReminders(place,macroName,params)
{
   var now = new Date().getMidnight();
   var paramHash = {};
   var leadtime = [0,14];
   paramHash = getParamsForReminder(params);
   var bProvidedDate = (paramHash["year"] != null) || 
			(paramHash["month"] != null) || 
			(paramHash["day"] != null) || 
			(paramHash["dayofweek"] != null);
   if (paramHash["leadtime"] != null)
   {
      leadtime = paramHash["leadtime"];
      if (bProvidedDate)
      {
         //If they've entered a day, we need to make 
         //sure to find it.  We'll reset the leadtime 
         //a few lines down.
         paramHash["leadtime"] = [-10000,10000];
      }
   }
   var matchedDate = now;
   if (bProvidedDate)
   {
      var leadTimeLowerBound = new Date().getMidnight().addDays(paramHash["leadtime"][0]);
      var leadTimeUpperBound = new Date().getMidnight().addDays(paramHash["leadtime"][1]);
      matchedDate = findDateForReminder(paramHash, new Date().getMidnight(), leadTimeLowerBound, leadTimeUpperBound); 
   }
   var arr = findTiddlersWithReminders(matchedDate, leadtime, paramHash["tag"], paramHash["limit"]);
   for (var j = 0; j < arr.length; j++)
   {
      displayTiddler(null, arr[j]["tiddler"], 0, null, false, false, false);
   }
};

config.macros.reminder.handler = function reminder(place,macroName,params)
{
   var dateHash = getParamsForReminder(params);
   if (dateHash["hidden"] != null)
   {
      return;
   }
   var leadTime = dateHash["leadtime"];
   if (leadTime == null)
   {
      leadTime = config.macros.reminders["defaultLeadTime"]; 
   }
   var leadTimeLowerBound = new Date().getMidnight().addDays(leadTime[0]);
   var leadTimeUpperBound = new Date().getMidnight().addDays(leadTime[1]);
   var matchedDate = findDateForReminder(dateHash, new Date().getMidnight(), leadTimeLowerBound, leadTimeUpperBound);
   if (!window.story) 
   {
      window.story=window; 
   }
   if (!store.getTiddler) 
   {
      store.getTiddler=function(title) {return this.tiddlers[title];};
   }
   var title = window.story.findContainingTiddler(place).id.substr(7);
   if (matchedDate != null)
   {
      var diff = matchedDate.getDifferenceInDays(new Date().getMidnight());
      var elem = createTiddlyElement(place,"span",null,null, null);
      var mess = getReminderMessageForDisplay(diff, dateHash, matchedDate, title);
      wikify(mess, elem, null, null);
   }
   else
   {
      createTiddlyElement(place,"span",null,null, config.macros.reminders["noReminderFound"].replace("TITLE", dateHash["title"]).replace("LEADTIMEUPPER", leadTime[1]).replace("LEADTIMELOWER", leadTime[0]).replace("TIDDLERNAME", title).replace("TIDDLER", "[[" + title + "]]") );
   }
};

config.macros.newReminder.handler = function newReminder(place,macroName,params)
{
  var today=new Date().getMidnight();
  var formstring = '<html><form>год: <select name="year"><option value="">Каждый год</option>';
  for (var i = 0; i < 5; i++)
  {
    formstring += '<option' + ((i == 0) ? ' selected' : '') + ' value="' + (today.getFullYear() +i) + '">' + (today.getFullYear() + i) + '</option>';
  }
formstring += '</select>&nbsp;&nbsp;день:<select name="day"><option value="">Каждый день</option>';
  for (i = 1; i < 32; i++)
  {
    formstring += '<option' + ((i == (today.getDate() )) ? ' selected' : '') + ' value="' + i + '">' + i + '</option>';
  }


  formstring += '</select>&nbsp;&nbsp;месяца:<select name="month"><option value="">Каждый месяц</option>';
  for (i = 0; i < 12; i++)
  {
    formstring += '<option' + ((i == today.getMonth()) ? ' selected' : '') + ' value="' + (i+1) + '">' + config.messages.dates.months[i] + '</option>';
  }
  
formstring += '</select>&nbsp;&nbsp;<br />название:<input type="text" size="40" name="title" value="Введите название. Можно форматировать." onfocus="this.select();"><input type="button" value="Добавить" onclick="addReminderToTiddler(this.form)"></form></html>';

  var panel = config.macros.slider.createSlider(place,null,"Добавить новое напоминание","Откройте, чтобы добавить напоминание в эту запись");
  wikify(formstring ,panel,null,store.getTiddler(params[1]));
};

// onclick: process input and insert reminder at 'marker'
window.addReminderToTiddler = function(form) {
   if (!window.story) 
   {
      window.story=window; 
   }
   if (!store.getTiddler) 
   {
      store.getTiddler=function(title) {return this.tiddlers[title];};
   }
   var title = window.story.findContainingTiddler(form).id.substr(7);
   var tiddler=store.getTiddler(title);
  var txt='\n<<reminder ';
  if (form.year.value != "")
    txt += 'year:'+form.year.value + ' ';
  if (form.month.value != "")
    txt += 'month:'+form.month.value + ' ';
  if (form.day.value != "")
    txt += 'day:'+form.day.value + ' ';
  txt += 'title:"'+form.title.value+'" ';
  txt +='>>';
   tiddler.set(null,tiddler.text + txt);
   window.story.refreshTiddler(title,1,true);
   store.setDirty(true);
};

function hasTag(tiddlerTags, tagFilters)
{
  //Make sure we respond well to empty tiddlerTaglists or tagFilterlists
  if (tagFilters.length==0 || tiddlerTags.length==0)
  {
    return true;
  }

  var bHasTag = false;
  
  /*bNoPos says: "'till now there has been no check using a positive filter"
     Imagine a filterlist consisting of 1 negative filter:
         If the filter isn't matched, we want hasTag to be true.
         Yet bHasTag is still false ('cause only positive filters cause bHasTag to change)
         
     If no positive filters are present bNoPos is true, and no negative filters are matched so we have not returned false
         Thus: hasTag returns true.
      
      If at any time a positive filter is encountered, we want at least one of the tags to match it, so we turn bNoPos to false, which
      means bHasTag must be true for hasTag to return true*/
  var bNoPos=true;
  
for (var t3 = 0; t3 < tagFilters.length; t3++)
  {
      for(var t2=0; t2<tiddlerTags.length; t2++)
      {
           if (tagFilters[t3].length > 1 && tagFilters[t3].charAt(0) == '!') 
           {
              if (tiddlerTags[t2] == tagFilters[t3].substring(1))
              {
                 //If at any time a negative filter is matched, we return false
                  return false;
              }
           }
           else 
           {
              if (bNoPos)
              {
                 //We encountered the first positive filter
                 bNoPos=false;
              }
              if (tiddlerTags[t2] == tagFilters[t3])
              {
                  //A positive filter is matched. As long as no negative filter is matched, hasTag will return true
                  bHasTag=true;
              }
           }
        }
    }
    return (bNoPos || bHasTag);
};

//This function searches all tiddlers for the reminder  //macro.  It is intended that other plugins (like //calendar) will use this function to query for 
//upcoming reminders.
//The arguments to this function filter out reminders //based on when they will fire.
//
//ARGUMENTS:
//baseDate is the date that is used as "now".  
//leadtime is a two element int array, with leadtime[0] 
//         as the lower bound and leadtime[1] as the
//         upper bound.  A reasonable default is [0,14]
//tags is a space-separated list of tags to use to filter 
//         tiddlers.  If a tag name begins with an !, then 
//         only tiddlers which do not have that tag will 
//         be considered.  For example "examples holidays"  
//         will search for reminders in any tiddlers that  
//         are tagged with examples or holidays and 
//         "!examples !holidays" will search for reminders 
//         in any tiddlers that are not tagged with 
//         examples or holidays.  Pass in null to search 
//         all tiddlers.
//limit.  If limit is null, individual reminders can 
//        override the leadtime specified earlier.  
//        Pass in 1 in order to override that behavior.

window.findTiddlersWithReminders = function findTiddlersWithReminders(baseDate, leadtime, tags, limit)
{
//function(searchRegExp,sortField,excludeTag)
//   var macroPattern = "<<([^>\\]+)(?:\\*)([^>]*)>>";
   var macroPattern = "<<(reminder)(.*)>>";
   var macroRegExp = new RegExp(macroPattern,"mg");
   var matches = store.search(macroRegExp,"title","");
   var arr = [];
   var tagsArray = null;
   if (tags != null)
   {
      tagsArray = tags.split(" ");
   }
   for(var t=matches.length-1; t>=0; t--)
   {
      if (tagsArray != null)
      {
         //If they specified tags to filter on, and this tiddler doesn't 
	 //match, skip it entirely.
         if ( ! hasTag(matches[t].tags, tagsArray))
         {
            continue;
         }
      }

      var targetText = matches[t].text;
      do {
         // Get the next formatting match
         var formatMatch = macroRegExp.exec(targetText);
         if(formatMatch && formatMatch[1] != null && formatMatch[1].toLowerCase() == "reminder")
         {
            //Find the matching date.
            
            var params = formatMatch[2] != null ? formatMatch[2].readMacroParams() : {};
            var dateHash = getParamsForReminder(params);
            if (limit != null || dateHash["leadtime"] == null)
            {
               if (leadtime == null)
                   dateHash["leadtime"] = leadtime;
               else
               {
                  dateHash["leadtime"] = [];
                  dateHash["leadtime"][0] = leadtime[0];
                  dateHash["leadtime"][1] = leadtime[1];
               }
            }
	    if (dateHash["leadtime"] == null)
               dateHash["leadtime"] = config.macros.reminders["defaultLeadTime"]; 
            var leadTimeLowerBound = baseDate.addDays(dateHash["leadtime"][0]);
            var leadTimeUpperBound = baseDate.addDays(dateHash["leadtime"][1]);
            var matchedDate = findDateForReminder(dateHash, baseDate, leadTimeLowerBound, leadTimeUpperBound);
            while (matchedDate != null)
            {
               var hash = {};
               hash["diff"] = matchedDate.getDifferenceInDays(baseDate);
               hash["matchedDate"] = new Date(matchedDate.getFullYear(), matchedDate.getMonth(), matchedDate.getDate(), 0, 0);
               hash["params"] = cloneParams(dateHash);
               hash["tiddler"] = matches[t].title;
               hash["tags"] = matches[t].tags;
               arr.pushUnique(hash);
	       if (dateHash["recurdays"] != null || (dateHash["year"] == null))
	       {
	         leadTimeLowerBound = leadTimeLowerBound.addDays(matchedDate.getDifferenceInDays(leadTimeLowerBound)+ 1);
                 matchedDate = findDateForReminder(dateHash, baseDate, leadTimeLowerBound, leadTimeUpperBound);
	       }
	       else matchedDate = null;
            }
         }
      }while(formatMatch);
   }
   if(arr.length > 1)  //Sort the array by number of days remaining.
   {
      arr.sort(function (a,b) {if(a["diff"] == b["diff"]) {return(0);} else {return (a["diff"] < b["diff"]) ? -1 : +1; } });
   }
   return arr;
};

//This function takes the reminder macro parameters and
//generates the string that is used for display.
//This function is not intended to be called by 
//other plugins.
 window.getReminderMessageForDisplay= function getReminderMessageForDisplay(diff, params, matchedDate, tiddlerTitle)
{
   var anniversaryString = "";
   var reminderTitle = params["title"];
   if (reminderTitle == null)
   {
      reminderTitle = config.macros.reminders["untitledReminder"];
   }
   if (params["firstyear"] != null)
   {
      anniversaryString = config.macros.reminders["defaultAnniversaryMessage"].replace("DIFF", (matchedDate.getFullYear() - params["firstyear"]));
   }
   var mess = "";
   var diffString = "";
   if (diff == 0)
   {
      diffString = config.macros.reminders["todayString"];
   }
   else if (diff == 1)
   {
      diffString = config.macros.reminders["tomorrowString"];
   }
   else if (diff == 2)
   {
      diffString = "''Послезавтра''";
   }
   else if (diff == -1)
   {
      diffString = "//Вчера//";
   }
   else if (diff == -2)
   {
      diffString = "//Позавчера//";
   }
   else
   {
      diff-=1; //HACK(ru)
      diffString = config.macros.reminders["ndaysString"].replace("DIFF", diff);
   }
   var format = config.macros.reminders["defaultReminderMessage"];
   if (params["format"] != null)
   {
      format = params["format"];
   }
   mess = format;
//HACK!  -- Avoid replacing DD in TIDDLER with the date
   mess = mess.replace(/TIDDLER/g, "TIDELER");
   mess = matchedDate.formatStringDateOnly(mess);
   mess = mess.replace(/TIDELER/g, "TIDDLER");
   if (tiddlerTitle != null)
   {
      mess = mess.replace(/TIDDLERNAME/g, tiddlerTitle);
      mess = mess.replace(/TIDDLER/g, "[[" + tiddlerTitle + "]]");
   }
   
   mess = mess.replace("DIFF", diffString).replace("TITLE", reminderTitle).replace("DATE", matchedDate.formatString("DDD, [[DD MMM]], YYYY")).replace("ANNIVERSARY", anniversaryString);
//RUSSIAN LANGUAGE HACK
   var daysS = diff.toString();
   var lastD = daysS.charAt(daysS.length-1);
   var lastDs = daysS.substring(daysS.length-2 );

   
   var rD = "дней";
   var rD1 = "1";
   var rD234 = "2-3-4";
   var rD5_9 = "5-6-7-8-9";

   daysS = daysS.substring(daysS.length-2);

if( (lastDs.indexOf("14") == -1)&&(lastDs.indexOf("13") == -1)&&(lastDs.indexOf("12") == -1)&&(lastDs.indexOf("11") == -1) ){
      if (rD1.indexOf(lastD)!=-1){
         rD = "день";  
      }
      if (rD234.indexOf(lastD)!=-1){
         rD = "дня";  
     }
  } 

if(diff<0){
mess = mess.replace(/Через -/, ""  );
mess = mess.replace(/ дней/, " дней назад"  );
}
   mess = mess.replace(/ дней/, " "+rD  );
//HACK ENDS
   return mess;
};



// Parse out the macro parameters into a hashtable.  This
// handles the arguments for reminder, showReminders and 
// displayTiddlersWithReminders.
window.getParamsForReminder = function getParamsForReminder(params)
{
   var dateHash = {};
   var type = "";
   var num = 0;
   var title = "";
   for(var t=0; t<params.length; t++)
   {
      var split = params[t].split(":");
      type = split[0].toLowerCase();
      var value = split[1];
      for (var i=2; i < split.length; i++)
      {
         value += ":" + split[i];
      }
      if (type == "nolinks" || type == "limit" || type == "hidden")
      {
         num = 1;
      }
      else if (type == "leadtime")
      {
         var leads = value.split("...");
         if (leads.length == 1)
         {
            leads[1]= leads[0];
            leads[0] = 0;
         }
         leads[0] = parseInt(leads[0], 10);
         leads[1] = parseInt(leads[1], 10);
         num = leads;
      }
      else if (type == "offsetdayofweek")
      {
          if (value.substr(0,1) == "-")
          {
             dateHash["negativeOffsetDayOfWeek"] = 1;
	     value = value.substr(1);
          }
          num = parseInt(value, 10);
      }
      else if (type != "title" && type != "tag" && type != "format")
      {
         num = parseInt(value, 10);
      }
      else
      {
         title = value;
         t++;
         while (title.substr(0,1) == '"' && title.substr(title.length - 1,1) != '"' && params[t] != undefined)
         {
            title += " " + params[t++];
         }
         //Trim off the leading and trailing quotes
         if (title.substr(0,1) == "\"" && title.substr(title.length - 1,1)== "\"")
         {
            title = title.substr(1, title.length - 2);
            t--;
         }
         num = title;
      }
      dateHash[type] = num;
   }
   //date is synonymous with day
   if (dateHash["day"] == null)
   {
      dateHash["day"] = dateHash["date"];
   }
   return dateHash;
};

//This function finds the date specified in the reminder 
//parameters.  It will return null if no match can be
//found.  This function is not intended to be used by
//other plugins.
window.findDateForReminder= function findDateForReminder( dateHash, baseDate, leadTimeLowerBound, leadTimeUpperBound)
{
   if (baseDate == null)
   {
     baseDate = new Date().getMidnight();
   }
   var hashKey = baseDate.convertToYYYYMMDDHHMM();
   for (var k in dateHash)
   {
      hashKey += "," + k + "|" + dateHash[k];
   }
   hashKey += "," + leadTimeLowerBound.convertToYYYYMMDDHHMM();
   hashKey += "," + leadTimeUpperBound.convertToYYYYMMDDHHMM();
   if (reminderCache[hashKey] == null)
   {
      //If we don't find a match in this run, then we will
      //cache that the reminder can't be matched.
      reminderCache[hashKey] = false;
   }
   else if (reminderCache[hashKey] == false)
   {
      //We've already tried this date and failed
      return null;
   }
   else
   {
      return reminderCache[hashKey];
   }
   
   var bOffsetSpecified = dateHash["offsetyear"] != null || 
				dateHash["offsetmonth"] != null || 
				dateHash["offsetday"] != null || 
				dateHash["offsetdayofweek"] != null || 
				dateHash["recurdays"] != null;
   
   // If we are matching the base date for a dayofweek offset, look for the base date a 
   //little further back.
   var tmp1leadTimeLowerBound = leadTimeLowerBound;  
   if ( dateHash["offsetdayofweek"] != null)
   {
      tmp1leadTimeLowerBound = leadTimeLowerBound.addDays(-6);  
   }
   var matchedDate = baseDate.findMatch(dateHash, tmp1leadTimeLowerBound, leadTimeUpperBound);
   if (matchedDate != null)
   {
      var newMatchedDate = matchedDate;
      if (dateHash["recurdays"] != null)
      {
         while (newMatchedDate.getTime() < leadTimeLowerBound.getTime())
         {
            newMatchedDate = newMatchedDate.addDays(dateHash["recurdays"]);
         }
      }
      else if (dateHash["offsetyear"] != null || 
		dateHash["offsetmonth"] != null || 
		dateHash["offsetday"] != null || 
		dateHash["offsetdayofweek"] != null)
      {
         var tmpdateHash = cloneParams(dateHash);
         tmpdateHash["year"] = dateHash["offsetyear"];
         tmpdateHash["month"] = dateHash["offsetmonth"];
         tmpdateHash["day"] = dateHash["offsetday"];
         tmpdateHash["dayofweek"] = dateHash["offsetdayofweek"];
	 var tmpleadTimeLowerBound = leadTimeLowerBound;
	 var tmpleadTimeUpperBound = leadTimeUpperBound;
	 if (tmpdateHash["offsetdayofweek"] != null)
	 {
	 	if (tmpdateHash["negativeOffsetDayOfWeek"] == 1)
		{
		   tmpleadTimeLowerBound = matchedDate.addDays(-6);
		   tmpleadTimeUpperBound = matchedDate;

		}
		else
		{
		   tmpleadTimeLowerBound = matchedDate;
		   tmpleadTimeUpperBound = matchedDate.addDays(6);
		}

	 }
	 newMatchedDate = matchedDate.findMatch(tmpdateHash, tmpleadTimeLowerBound, tmpleadTimeUpperBound);
         //The offset couldn't be matched.  return null.
         if (newMatchedDate == null)
         {
            return null;
         }
      }
      if (newMatchedDate.isBetween(leadTimeLowerBound, leadTimeUpperBound))
      {
         reminderCache[hashKey] = newMatchedDate;
         return newMatchedDate;
      }
   }
   return null;
};

//This does much the same job as findDateForReminder, but
//this one doesn't deal with offsets or recurring 
//reminders.
Date.prototype.findMatch = function findMatch(dateHash, leadTimeLowerBound, leadTimeUpperBound)
{

   var bSpecifiedYear =     (dateHash["year"] != null);
   var bSpecifiedMonth =     (dateHash["month"] != null);
   var bSpecifiedDay =     (dateHash["day"] != null);
   var bSpecifiedDayOfWeek =     (dateHash["dayofweek"] != null);
   if (bSpecifiedYear && bSpecifiedMonth && bSpecifiedDay)
   {
      return new Date(dateHash["year"], dateHash["month"]-1, dateHash["day"], 0, 0);
   }
   var bMatchedYear = !bSpecifiedYear;
   var bMatchedMonth = !bSpecifiedMonth;
   var bMatchedDay = !bSpecifiedDay;
   var bMatchedDayOfWeek = !bSpecifiedDayOfWeek;
   if (bSpecifiedDay && bSpecifiedMonth && !bSpecifiedYear && !bSpecifiedDayOfWeek)
   {

      //Shortcut -- First try this year.  If it's too small, try next year.
      var tmpMidnight = this.getMidnight();
      var tmpDate = new Date(this.getFullYear(), dateHash["month"]-1, dateHash["day"], 0,0);
      if (tmpDate.getTime() < leadTimeLowerBound.getTime())
      {
         tmpDate = new Date((this.getFullYear() + 1), dateHash["month"]-1, dateHash["day"], 0,0);
      }
      if ( tmpDate.isBetween(leadTimeLowerBound, leadTimeUpperBound))
      {
         return tmpDate;
      }
      else
      {
         return null;
      }
   }

   var newDate = leadTimeLowerBound; 
   while (newDate.isBetween(leadTimeLowerBound, leadTimeUpperBound))
   {
      var tmp = testDate(newDate, dateHash, bSpecifiedYear, bSpecifiedMonth, bSpecifiedDay, bSpecifiedDayOfWeek);
      if (tmp != null)
        return tmp;
      newDate = newDate.addDays(1);
   }
};

function testDate(testMe, dateHash, bSpecifiedYear, bSpecifiedMonth, bSpecifiedDay, bSpecifiedDayOfWeek)
{
   var bMatchedYear = !bSpecifiedYear;
   var bMatchedMonth = !bSpecifiedMonth;
   var bMatchedDay = !bSpecifiedDay;
   var bMatchedDayOfWeek = !bSpecifiedDayOfWeek;
   if (bSpecifiedYear)
   {
      bMatchedYear = (dateHash["year"] == testMe.getFullYear());
   }
   if (bSpecifiedMonth)
   {
      bMatchedMonth = ((dateHash["month"] - 1)  == testMe.getMonth() );
   }
   if (bSpecifiedDay)
   {
      bMatchedDay = (dateHash["day"] == testMe.getDate());
   }
   if (bSpecifiedDayOfWeek)
   {
      bMatchedDayOfWeek = (dateHash["dayofweek"] == testMe.getDay());
   }

   if (bMatchedYear && bMatchedMonth && bMatchedDay && bMatchedDayOfWeek)
   {
      return testMe;
   }
};

//Returns true if the date is in between two given dates
Date.prototype.isBetween = function isBetween(lowerBound, upperBound)
{
  return (this.getTime() >= lowerBound.getTime() && this.getTime() <= upperBound.getTime());
}
//Return a new date, with the time set to midnight (0000)
Date.prototype.getMidnight = function getMidnight()
{
   return new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0);
};
// Add the specified number of days to a date.
Date.prototype.addDays = function addDays(numberOfDays)
{
   return new Date(this.getFullYear(), this.getMonth(), this.getDate() + numberOfDays, 0, 0);
};
//Return the number of days between two dates.
Date.prototype.getDifferenceInDays = function getDifferenceInDays(otherDate)
{
//I have to do it this way, because this way ignores daylight savings
   var tmpDate = this.addDays(0);
   if (this.getTime() > otherDate.getTime())
   {
      var i = 0;
      for (i = 0; tmpDate.getTime() > otherDate.getTime(); i++)
      {
         tmpDate = tmpDate.addDays(-1);
      }
      return i;
   }
   else
   {
      var i = 0;
      for (i = 0; tmpDate.getTime() < otherDate.getTime(); i++)
      {
         tmpDate = tmpDate.addDays(1);
      }
      return i * -1;
   }
   return 0;
};
function cloneParams(what) {
    var tmp = {};
    for (var i in what) {
        tmp[i] = what[i];
    }
    return tmp;
}
// Substitute date components into a string
Date.prototype.formatStringDateOnly = function formatStringDateOnly(template)
{
	template = template.replace("YYYY",this.getFullYear());
	template = template.replace("YY",String.zeroPad(this.getFullYear()-2000,2));
	template = template.replace("MMM",config.messages.dates.months[this.getMonth()]);
	template = template.replace("0MM",String.zeroPad(this.getMonth()+1,2));
	template = template.replace("MM",this.getMonth()+1);
	template = template.replace("DDD",config.messages.dates.days[this.getDay()]);
	template = template.replace("0DD",String.zeroPad(this.getDate(),2));
	template = template.replace("DD",this.getDate());
	return template;
};

//}}}
/***
|Name:|RenameTagsPlugin|
|Description:|Allows you to easily rename or delete tags across multiple tiddlers|
|Version:|3.0 ($Rev: 5501 $)|
|Date:|$Date: 2008-06-10 23:11:55 +1000 (Tue, 10 Jun 2008) $|
|Source:|http://mptw.tiddlyspot.com/#RenameTagsPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
Rename a tag and you will be prompted to rename it in all its tagged tiddlers.
***/
//{{{
config.renameTags = {

	prompts: {
		rename: "Rename the tag '%0' to '%1' in %2 tidder%3?",
		remove: "Remove the tag '%0' from %1 tidder%2?"
	},

	removeTag: function(tag,tiddlers) {
		store.suspendNotifications();
		for (var i=0;i<tiddlers.length;i++) {
			store.setTiddlerTag(tiddlers[i].title,false,tag);
		}
		store.resumeNotifications();
		store.notifyAll();
	},

	renameTag: function(oldTag,newTag,tiddlers) {
		store.suspendNotifications();
		for (var i=0;i<tiddlers.length;i++) {
			store.setTiddlerTag(tiddlers[i].title,false,oldTag); // remove old
			store.setTiddlerTag(tiddlers[i].title,true,newTag);  // add new
		}
		store.resumeNotifications();
		store.notifyAll();
	},

	storeMethods: {

		saveTiddler_orig_renameTags: TiddlyWiki.prototype.saveTiddler,

		saveTiddler: function(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created) {
			if (title != newTitle) {
				var tagged = this.getTaggedTiddlers(title);
				if (tagged.length > 0) {
					// then we are renaming a tag
					if (confirm(config.renameTags.prompts.rename.format([title,newTitle,tagged.length,tagged.length>1?"s":""])))
						config.renameTags.renameTag(title,newTitle,tagged);

					if (!this.tiddlerExists(title) && newBody == "")
						// dont create unwanted tiddler
						return null;
				}
			}
			return this.saveTiddler_orig_renameTags(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created);
		},

		removeTiddler_orig_renameTags: TiddlyWiki.prototype.removeTiddler,

		removeTiddler: function(title) {
			var tagged = this.getTaggedTiddlers(title);
			if (tagged.length > 0)
				if (confirm(config.renameTags.prompts.remove.format([title,tagged.length,tagged.length>1?"s":""])))
					config.renameTags.removeTag(title,tagged);
			return this.removeTiddler_orig_renameTags(title);
		}

	},

	init: function() {
		merge(TiddlyWiki.prototype,this.storeMethods);
	}
}

config.renameTags.init();

//}}}

/***
|''Name:''|RuStyle|
|''Description:''|TW russianization|
|''Version:''|0.6.0|
|''Date:''|2006|
|''Source:''|http://www.glebsite.ru|
|''Author:''|Глеб Тржемецкий (Gleb Trzhemetski)|
|''License:''|BSD open source license|
|''CoreVersion:''|2.1.0|
|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|

***/

//{{{

merge(config.messages,{
	customConfigError: "Возникли проблемы при загрузке плагинов. См. PluginManager ",
	pluginError: "Ошибка: %0",
	pluginDisabled: "Не задействован, так как помечен 'systemConfigDisable' ",
	pluginForced: "Задействован, так как помечен 'systemConfigForce' ",
	pluginVersionError: "Не задействован из-за несоответствия версий",
	nothingSelected: "Ничего не выделено.",
	savedSnapshotError: "Похоже, эта wiki была неправильно сохранена. См. http://www.tiddlywiki.com/#DownloadSoftware ",
	subtitleUnknown: "(неизвестно)",
	undefinedTiddlerToolTip: "Записи '%0' не существует",
	shadowedTiddlerToolTip: "Запись '%0' заполнена по умолчанию.",
	tiddlerLinkTooltip: "%0 - %1, %2",
	externalLinkTooltip: "Ссылка: %0",
	noTags: "Нет помеченных записей",
	notFileUrlError: "Сохраните TiddlyWiki в файл, чтобы иметь возможность сохранять изменения ",
	cantSaveError: "Сохранение невозможно. Либо ваш браузер не подерживает эту функцию (используйте по возможности FireFox), либо путь к файлу содержит недопустимые символы",
	invalidFileError: "Файл '%0' не похож на файл TiddlyWiki",
	backupSaved: "Резервная копия сохранена",
	backupFailed: "Не получилось сохранить резервную копию",
	rssSaved: "RSS сохранен",
	rssFailed: "Не получилось сохранить RSS",
	emptySaved: "Пустой шаблон сохранен",
	emptyFailed: "Не получилось сохранить пустой шаблон",
	mainSaved: "Файл TiddlyWiki сохранен",
	mainFailed: "Не получилось сохранить файл TiddlyWiki. Изменения не сохранены",
	macroError: "Ошибка в сценарии <<%0>>",
	macroErrorDetails: "Ошибка при выполнении сценария  <<%0>>:\n%1",
	missingMacro: "Нет такого сценария",
	overwriteWarning: "Запись '%0' уже есть. Нажмите OK, чтобы перезаписать",
	unsavedChangesWarning: "ВНИМАНИЕ! Есть несохраненные изменения! \n\nНажмите OK, чтобы сохранить\nНажмите CANCEL чтобы не сохранять",
	confirmExit: "--------------------------------\n\nИзменения в TiddlyWiki не сохранены. Если вы продолжите, они потеряются.\n\n--------------------------------",
	saveInstructions: "SaveChanges",
	unsupportedTWFormat: "Неподдерживаемый TiddlyWiki формат '%0'",
	tiddlerSaveError: "Ошибка при сохранении записи '%0'",
	tiddlerLoadError: "Ошибка при открытии записи '%0'",
	wrongSaveFormat: "Не получается сохранить в формате '%0'. Сохранено в стандартном формате.",
	invalidFieldName: "Недопустимое имя поля %0",
	fieldCannotBeChanged: "Поле '%0' нельзя изменять"});

merge(config.messages.messageClose,{
	text: "×",
	tooltip: "скрыть сообщение"});

config.messages.dates.months = ["января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября","декабря"];
config.messages.dates.days = ["Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"];
config.messages.dates.shortMonths = ["I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI", "XII"];
config.messages.dates.shortDays = ["Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"];

merge(config.views.wikified.tag,{
	labelNoTags: "меток нет",
	labelTags: "метки: ",
	openTag: "Открыть метку '%0'",
	tooltip: "Показать записи, помеченные как '%0'",
	openAllText: "Открыть все",
	openAllTooltip: "Открыть все эти записи",
	popupNone: "Нет других записей с меткой '%0'"});

merge(config.views.wikified,{
	defaultText: "Записи '%0' не существует. Создайте ее двойным щелчком.",
	defaultModifier: "(?)",
	shadowModifier: "(системная запись)",
	createdPrompt: "создана: "});

merge(config.views.editor,{
	tagPrompt: "Введите метки, разделенные пробелами, [[используйте квадратные скобки]] если нужно, или выберите метки из списка.",
	defaultText: "Здесь мог бы быть осмысленный текст на тему '%0'"});

merge(config.views.editor.tagChooser,{
	text: "метки",
	tooltip: "Выберите метки из списка",
	popupNone: "Меток пока нет",
	tagTooltip: "Добавить метку '%0'"});

merge(config.macros.search,{
	label: "поиск",
	prompt: "Поиск по всем записям",
	accessKey: "F",
	successMsg: "%0 записей, соответствующих критерию: %1",
	failureMsg: "Не найдено записей по запросу: %0"});

merge(config.macros.tagging,{
	label: "отмечены: ",
	labelNotTag: "нету",
	tooltip: "Список записей, помеченных: '%0'"});

merge(config.macros.timeline,{
	dateFormat: "DD.mmm.YYYY"});

merge(config.macros.allTags,{
	tooltip: "Показать записи, помеченные '%0'",
	noTags: "Нет таких записей"});

config.macros.list.all.prompt = "Все записи по алфавиту";
config.macros.list.missing.prompt = "Ненаписанные";
config.macros.list.orphans.prompt = "Записи, на которые нет ссылок";
config.macros.list.shadowed.prompt = "Системные записи";

merge(config.macros.closeAll,{
	label: "закрыть все",
	prompt: "Закрыть все записи \(кроме редактируемых\)"});

merge(config.macros.permaview,{
	label: "ссылка",
	prompt: "Постоянная ссылка"});

merge(config.macros.saveChanges,{
	label: "сохранить изменения",
	prompt: "Сохранить всё",
	accessKey: "S"});

merge(config.macros.newTiddler,{
	label: "новая запись",
	prompt: "Создать новую запись",
	title: "Новая запись",
	accessKey: "N"});

merge(config.macros.newJournal,{
	label: "новая датированная запись",
	prompt: "Создать запись, с названием, соответствующим текущей дате",
	accessKey: "J"});

merge(config.macros.plugins,{
	skippedText: "(Этот плагин не запущен, так как был добавлен после запуска)",
	noPluginText: "Плагинов нет",
	confirmDeleteText: "Вы действительно хотите удалить записи:\n\n%0",
	listViewTemplate : {
		columns: [
			{name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},
			{name: 'Title', field: 'title', tiddlerLink: 'title', title: "Title", type: 'TiddlerLink'},
			{name: 'Forced', field: 'forced', title: "Forced", tag: 'systemConfigForce', type: 'TagCheckbox'},
			{name: 'Disabled', field: 'disabled', title: "Disabled", tag: 'systemConfigDisable', type: 'TagCheckbox'},
			{name: 'Executed', field: 'executed', title: "Loaded", type: 'Boolean', trueText: "Yes", falseText: "No"},
			{name: 'Error', field: 'error', title: "Status", type: 'Boolean', trueText: "Error", falseText: "OK"},
			{name: 'Log', field: 'log', title: "Log", type: 'StringList'}
			],
		rowClasses: [
			{className: 'error', field: 'error'},
			{className: 'warning', field: 'warning'}
			],
		actions: [
			{caption: "Действия...", name: ''},
			{caption: "Сделать не системной записью", name: 'remove'},
			{caption: "Удалить из wiki", name: 'delete'}
			]}
	});

merge(config.macros.refreshDisplay,{
	label: "обновить",
	prompt: "Обновить отображение"
	});

merge(config.macros.importTiddlers,{
	defaultPath: "http://www.tiddlywiki.com/index.html",
	fetchLabel: "загрузить",
	fetchPrompt: "Загрузить файл TiddlyWiki",
	fetchError: "Ошибка при загрузке файла",
	confirmOverwriteText: "Вы уверены, что хотите перезаписать следующие записи:\n\n%0",
	wizardTitle: "Импорт записей из файла TiddlyWiki",
	step1: "Шаг 1: Введите путь к файлу",
	step1prompt: "Введите URL или путь к локальному файлу: ",
	step1promptFile: "...или выберите тут: ",
	step1promptFeeds: "...или из предустановленных: ",
	step1feedPrompt: "Выберите...",
	step2: "Шаг 2: Загрузка файла",
	step2Text: "Дождитесь окончания загрузки: %0",
	step3: "Шаг 3: Выберите записи для импорта:",
	step4: "%0 записей импортировано",
	step5: "Готово!",
	listViewTemplate: {
		columns: [
			{name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},
			{name: 'Title', field: 'title', title: "Title", type: 'String'},
			{name: 'Snippet', field: 'text', title: "Snippet", type: 'String'},
			{name: 'Tags', field: 'tags', title: "Tags", type: 'Tags'}
			],
		rowClasses: [
			],
		actions: [
			{caption: "Действия...", name: ''},
			{caption: "Импортировать", name: 'import'}
			]}
	});

merge(config.commands.closeTiddler,{
	text: "закрыть",
	tooltip: "Закрыть запись"});

merge(config.commands.closeOthers,{
	text: "закрыть остальные",
	tooltip: "Закрыть все записи, кроме этой"});

merge(config.commands.editTiddler,{
	text: "редактировать",
	tooltip: "Редактировать запись",
	readOnlyText: "исходный код",
	readOnlyTooltip: "Просмотреть исходный код записи"});

merge(config.commands.saveTiddler,{
	text: "готово",
	tooltip: "Сохранить изменения"});

merge(config.commands.cancelTiddler,{
	text: "отменить",
	tooltip: "Отменить изменения",
	warning: "Вы уверены, что не хотите сохранить запись '%0'?",
	readOnlyText: "обычный вид",
	readOnlyTooltip: "Вернуться к обычному просмотру"});

merge(config.commands.deleteTiddler,{
	text: "удалить",
	tooltip: "Удалить запись",
	warning: "Вы действительно хотите удалить '%0'?"});

merge(config.commands.permalink,{
	text: "ссылка",
	tooltip: "Постоянная ссылка на эту запись"});

merge(config.commands.references,{
	text: "ссылки сюда",
	tooltip: "Показать записи, ссылающиеся на эту",
	popupNone: "Ссылок нет"});

merge(config.commands.jump,{
	text: "перейти...",
	tooltip: "Перейти на другие открытые записи"});

merge(config.shadowTiddlers,{
	DefaultTiddlers: "GettingStarted",
	MainMenu: "GettingStarted",
	SiteTitle: "~TiddlyWiki(ru)",
	SiteSubtitle: "нелинейный гипертекстовый органайзер",
	SiteUrl: "http://www.tiddlywiki.com/",
	GettingStarted: "Для того, чтобы начать работать с TiddlyWiki, вы можете поменять следующие записи:\n* SiteTitle & SiteSubtitle: Заголовок и подзаголовок сайта (после сохранения вы увидите их в заголовке окна)\n* MainMenu: Меню (оно обычно слева)\n* DefaultTiddlers: Список записей, которые будут открыты при запуске wiki.\nИмя, которым будут подписаны ваши записи, можете ввести тут: <<option txtUserName>>",
	SideBarOptions: "<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal 'DD MMM YYYY г.'>><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel 'установки »' 'Различные опции TidlyWiki'>>",
	OptionsPanel: "Эти установки сохраняются в&nbsp\;Вашем браузере\n\nВаше имя для подписывания заметок. Лучше, если вы напишете его WotTak\n\n<<option txtUserName>>\n<<option chkSaveBackups>> Сохранять резервные копии\n<<option chkAutoSave>> Автосохранение\n<<option chkRegExpSearch>> Поиск с&nbsp\;регулярными выражениями\n<<option chkCaseSensitiveSearch>> Поиск чувствителен к&nbsp\;регистру?\n<<option chkAnimate>> Анимация\n\n----\n[[Дополнительно|AdvancedOptions]]\n[[Плагины|PluginManager]]\n[[Импорт записей|ImportTiddlers]]",
	AdvancedOptions: "<<option chkGenerateAnRssFeed>> Публиковать RSS\n<<option chkOpenInNewWindow>>  Ссылки в новом окне\n<<option chkSaveEmptyTemplate>> Сохранять пустой шаблон\n<<option chkToggleLinks>> Щелчок по ссылке на открытую заметку закрывает ее\n^^(с Ctrl или другой функциональной клавишей не&nbsp\;будет срабатывать)^^\n<<option chkHttpReadOnly>> Не показывать инструменты редактирования через HTTP\n<<option chkForceMinorUpdate>> Не менять дату заметки при редактировании\n^^(для изменеия - жмите Shift при сохранеии, либо сохраняйте, нажимая Ctrl-Shift-Enter^^\n<<option chkConfirmDelete>> Подтверждать удаление\nМаксимум строк в&nbsp\;поле редактирования: <<option txtMaxEditRows>>\nСохранять бэкапы в&nbsp\;папке: <<option txtBackupFolder>>\n<<option chkInsertTabs>> При нажатии Tab вводить знак табуляции, а&nbsp\;не&nbsp\;переходить к&nbsp\;следующему элементу формы",
	SideBarTabs: "<<tabs txtMainTab История История TabTimeline Все 'Все заметки' TabAll Метки 'Все метки' TabTags Ещё... 'Остальные списки' TabMore>>",
	TabTimeline: "<<timeline>>",
	TabAll: "<<list all>>",
	TabTags: "<<allTags>>",
	TabMore: "<<tabs txtMoreTab Нужные 'Ненаписанные заметки' TabMoreMissing Забытые 'Забытые заметки' TabMoreOrphans Системные 'Системные записи' TabMoreShadowed>>",
	TabMoreMissing: "<<list missing>>",
	TabMoreOrphans: "<<list orphans>>",
	TabMoreShadowed: "<<list shadowed>>",
	PluginManager: "<<plugins>>",
	ImportTiddlers: "<<importTiddlers>>"});



//}}}
<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal 'DD MMM YYYY г.'>><<saveChanges>><<tiddler TspotSidebar>><<slider chkSliderOptionsPanel OptionsPanel 'установки »' 'Различные опции TidlyWiki'>>
<<miniBrowser noplayer http://www.simpletext.ws/documents/#new>>
моя маленькая записная книжка               <<unsavedChanges command>>
mm3
Распределённая платформа для построения кластерных супер компьютеров. Поставляется в виде небольшого образа выполняющего абсолютно все необходимые роли в организации кластера.
[[StyleSheetSyntaxHighlighter]]
/***
StyleSheet for ~SyntaxHighlighter
***/

/*{{{*/
.dp-highlighter
{
	font-family: "Consolas", "Courier New", Courier, mono, serif;
	font-size: 12px;
	background-color: #E7E5DC;
	width: 99%;
	overflow: auto;
	margin: 18px 0 18px 0 !important;
	padding-top: 1px; /* adds a little border on top when controls are hidden */
}

/* clear styles */
.dp-highlighter ol,
.dp-highlighter ol li,
.dp-highlighter ol li span 
{
	margin: 0;
	padding: 0;
	border: none;
}

.dp-highlighter a,
.dp-highlighter a:hover
{
	background: none;
	border: none;
	padding: 0;
	margin: 0;
}

.dp-highlighter .bar
{
	padding-left: 45px;
}

.dp-highlighter.collapsed .bar,
.dp-highlighter.nogutter .bar
{
	padding-left: 0px;
}

.dp-highlighter ol
{
	list-style: decimal; /* for ie */
	background-color: #fff;
	margin: 0px 0px 1px 45px !important; /* 1px bottom margin seems to fix occasional Firefox scrolling */
	padding: 0px;
	color: #5C5C5C;
}

.dp-highlighter.nogutter ol,
.dp-highlighter.nogutter ol li
{
	list-style: none !important;
	margin-left: 0px !important;
}

.dp-highlighter ol li,
.dp-highlighter .columns div
{
	list-style: decimal-leading-zero; /* better look for others, override cascade from OL */
	list-style-position: outside !important;
	border-left: 3px solid #6CE26C;
	background-color: #F8F8F8;
	color: #5C5C5C;
	padding: 0 3px 0 10px !important;
	margin: 0 !important;
	line-height: 14px;
}

.dp-highlighter.nogutter ol li,
.dp-highlighter.nogutter .columns div
{
	border: 0;
}

.dp-highlighter .columns
{
	background-color: #F8F8F8;
	color: gray;
	overflow: hidden;
	width: 100%;
}

.dp-highlighter .columns div
{
	padding-bottom: 5px;
}

.dp-highlighter ol li.alt
{
	background-color: #FFF;
	color: inherit;
}

.dp-highlighter ol li span
{
	color: black;
	background-color: inherit;
}

/* Adjust some properties when collapsed */

.dp-highlighter.collapsed ol
{
	margin: 0px;
}

.dp-highlighter.collapsed ol li
{
	display: none;
}

/* Additional modifications when in print-view */

.dp-highlighter.printing
{
	border: none;
}

.dp-highlighter.printing .tools
{
	display: none !important;
}

.dp-highlighter.printing li
{
	display: list-item !important;
}

/* Styles for the tools */

.dp-highlighter .tools
{
	padding: 3px 8px 3px 10px;
	font: 9px Verdana, Geneva, Arial, Helvetica, sans-serif;
	color: silver;
	background-color: #f8f8f8;
	padding-bottom: 10px;
	border-left: 3px solid #6CE26C;
}

.dp-highlighter.nogutter .tools
{
	border-left: 0;
}

.dp-highlighter.collapsed .tools
{
	border-bottom: 0;
}

.dp-highlighter .tools a
{
	font-size: 9px;
	color: #a0a0a0;
	background-color: inherit;
	text-decoration: none;
	margin-right: 10px;
}

.dp-highlighter .tools a:hover
{
	color: red;
	background-color: inherit;
	text-decoration: underline;
}

/* About dialog styles */

.dp-about { background-color: #fff; color: #333; margin: 0px; padding: 0px; }
.dp-about table { width: 100%; height: 100%; font-size: 11px; font-family: Tahoma, Verdana, Arial, sans-serif !important; }
.dp-about td { padding: 10px; vertical-align: top; }
.dp-about .copy { border-bottom: 1px solid #ACA899; height: 95%; }
.dp-about .title { color: red; background-color: inherit; font-weight: bold; }
.dp-about .para { margin: 0 0 4px 0; }
.dp-about .footer { background-color: #ECEADB; color: #333; border-top: 1px solid #fff; text-align: right; }
.dp-about .close { font-size: 11px; font-family: Tahoma, Verdana, Arial, sans-serif !important; background-color: #ECEADB; color: #333; width: 60px; height: 22px; }

/* Language specific styles */

.dp-highlighter .comment, .dp-highlighter .comments { color: #008200; background-color: inherit; }
.dp-highlighter .string { color: blue; background-color: inherit; }
.dp-highlighter .keyword { color: #069; font-weight: bold; background-color: inherit; }
.dp-highlighter .preprocessor { color: gray; background-color: inherit; }

/*}}}*/
<<miniBrowser noplayer http://sync.in/YxZSOZOtkA>>
/***
!Metadata:
|''Name:''|SyntaxHighlighterPlugin|
|''Description:''|Code Syntax Highlighter Plugin for TiddlyWiki.|
|''Version:''|1.1.3|
|''Date:''|Oct 24, 2008|
|''Source:''|http://www.coolcode.cn/show-310-1.html|
|''Author:''|Ma Bingyao (andot (at) ujn (dot) edu (dot) cn)|
|''License:''|[[GNU Lesser General Public License|http://www.gnu.org/licenses/lgpl.txt]]|
|''~CoreVersion:''|2.4.1|
|''Browser:''|Firefox 1.5+; InternetExplorer 6.0; Safari; Opera; Chrome; etc.|

!Syntax:
{{{
<code options>
codes
</code>
}}}

!Examples:
{{{
<code java>
public class HelloWorld {
    public static void main(String args[]) {
        System.out.println("HelloWorld!");
    }
}
</code>
}}}

!Revision History:
|''Version''|''Date''|''Note''|
|1.1.2|Oct 15, 2008|Optimize Highlight|
|1.0.0|Oct 13, 2008|Initial release|

!Code section:
***/
//{{{
var dp={sh:{Toolbar:{},Utils:{},RegexLib:{},Brushes:{},Strings:{AboutDialog:"<html><head><title>About...</title></head><body class=\"dp-about\"><table cellspacing=\"0\"><tr><td class=\"copy\"><p class=\"title\">dp.SyntaxHighlighter</div><div class=\"para\">Version: {V}</p><p><a href=\"http://www.dreamprojections.com/syntaxhighlighter/?ref=about\" target=\"_blank\">http://www.dreamprojections.com/syntaxhighlighter</a></p>&copy;2004-2007 Alex Gorbatchev.</td></tr><tr><td class=\"footer\"><input type=\"button\" class=\"close\" value=\"OK\" onClick=\"window.close()\"/></td></tr></table></body></html>"},ClipboardSwf:null,Version:"1.5.1"}};dp.SyntaxHighlighter=dp.sh;dp.sh.Toolbar.Commands={ExpandSource:{label:"+ expand source",check:function($){return $.collapse},func:function($,_){$.parentNode.removeChild($);_.div.className=_.div.className.replace("collapsed","")}},ViewSource:{label:"view plain",func:function($,_){var A=dp.sh.Utils.FixForBlogger(_.originalCode).replace(/</g,"<"),B=window.open("","_blank","width=750, height=400, location=0, resizable=1, menubar=0, scrollbars=0");B.document.write("<textarea style=\"width:99%;height:99%\">"+A+"</textarea>");B.document.close()}},CopyToClipboard:{label:"copy to clipboard",check:function(){return window.clipboardData!=null||dp.sh.ClipboardSwf!=null},func:function($,A){var B=dp.sh.Utils.FixForBlogger(A.originalCode).replace(/</g,"<").replace(/>/g,">").replace(/&/g,"&");if(window.clipboardData)window.clipboardData.setData("text",B);else if(dp.sh.ClipboardSwf!=null){var _=A.flashCopier;if(_==null){_=document.createElement("div");A.flashCopier=_;A.div.appendChild(_)}_.innerHTML="<embed src=\""+dp.sh.ClipboardSwf+"\" FlashVars=\"clipboard="+encodeURIComponent(B)+"\" width=\"0\" height=\"0\" type=\"application/x-shockwave-flash\"></embed>"}alert("The code is in your clipboard now")}},PrintSource:{label:"print",func:function($,B){var _=document.createElement("IFRAME"),A=null;_.style.cssText="position:absolute;width:0px;height:0px;left:-500px;top:-500px;";document.body.appendChild(_);A=_.contentWindow.document;dp.sh.Utils.CopyStyles(A,window.document);A.write("<div class=\""+B.div.className.replace("collapsed","")+" printing\">"+B.div.innerHTML+"</div>");A.close();_.contentWindow.focus();_.contentWindow.print();alert("Printing...");document.body.removeChild(_)}},About:{label:"?",func:function(_){var A=window.open("","_blank","dialog,width=300,height=150,scrollbars=0"),$=A.document;dp.sh.Utils.CopyStyles($,window.document);$.write(dp.sh.Strings.AboutDialog.replace("{V}",dp.sh.Version));$.close();A.focus()}}};dp.sh.Toolbar.Create=function(B){var A=document.createElement("DIV");A.className="tools";for(var _ in dp.sh.Toolbar.Commands){var $=dp.sh.Toolbar.Commands[_];if($.check!=null&&!$.check(B))continue;A.innerHTML+="<a href=\"#\" onclick=\"dp.sh.Toolbar.Command('"+_+"',this);return false;\">"+$.label+"</a>"}return A};dp.sh.Toolbar.Command=function(_,$){var A=$;while(A!=null&&A.className.indexOf("dp-highlighter")==-1)A=A.parentNode;if(A!=null)dp.sh.Toolbar.Commands[_].func($,A.highlighter)};dp.sh.Utils.CopyStyles=function(A,_){var $=_.getElementsByTagName("link");for(var B=0;B<$.length;B++)if($[B].rel.toLowerCase()=="stylesheet")A.write("<link type=\"text/css\" rel=\"stylesheet\" href=\""+$[B].href+"\"></link>")};dp.sh.Utils.FixForBlogger=function($){return(dp.sh.isBloggerMode==true)?$.replace(/<br\s*\/?>|<br\s*\/?>/gi,"\n"):$};dp.sh.RegexLib={MultiLineCComments:new RegExp("/\\*[\\s\\S]*?\\*/","gm"),SingleLineCComments:new RegExp("//.*$","gm"),SingleLinePerlComments:new RegExp("#.*$","gm"),DoubleQuotedString:new RegExp("\"(?:\\.|(\\\\\\\")|[^\\\"\"\\n])*\"","g"),SingleQuotedString:new RegExp("'(?:\\.|(\\\\\\')|[^\\''\\n])*'","g")};dp.sh.Match=function(_,$,A){this.value=_;this.index=$;this.length=_.length;this.css=A};dp.sh.Highlighter=function(){this.noGutter=false;this.addControls=true;this.collapse=false;this.tabsToSpaces=true;this.wrapColumn=80;this.showColumns=true};dp.sh.Highlighter.SortCallback=function($,_){if($.index<_.index)return-1;else if($.index>_.index)return 1;else if($.length<_.length)return-1;else if($.length>_.length)return 1;return 0};dp.sh.Highlighter.prototype.CreateElement=function(_){var $=document.createElement(_);$.highlighter=this;return $};dp.sh.Highlighter.prototype.GetMatches=function(_,B){var $=0,A=null;while((A=_.exec(this.code))!=null)this.matches[this.matches.length]=new dp.sh.Match(A[0],A.index,B)};dp.sh.Highlighter.prototype.AddBit=function($,A){if($==null||$.length==0)return;var C=this.CreateElement("SPAN");$=$.replace(/ /g,"&nbsp;");$=$.replace(/</g,"<");$=$.replace(/\n/gm,"&nbsp;<br>");if(A!=null){if((/br/gi).test($)){var _=$.split("&nbsp;<br>");for(var B=0;B<_.length;B++){C=this.CreateElement("SPAN");C.className=A;C.innerHTML=_[B];this.div.appendChild(C);if(B+1<_.length)this.div.appendChild(this.CreateElement("BR"))}}else{C.className=A;C.innerHTML=$;this.div.appendChild(C)}}else{C.innerHTML=$;this.div.appendChild(C)}};dp.sh.Highlighter.prototype.IsInside=function(_){if(_==null||_.length==0)return false;for(var A=0;A<this.matches.length;A++){var $=this.matches[A];if($==null)continue;if((_.index>$.index)&&(_.index<$.index+$.length))return true}return false};dp.sh.Highlighter.prototype.ProcessRegexList=function(){for(var $=0;$<this.regexList.length;$++)this.GetMatches(this.regexList[$].regex,this.regexList[$].css)};dp.sh.Highlighter.prototype.ProcessSmartTabs=function(E){var B=E.split("\n"),$="",D=4,A="\t";function _(A,E,_){var B=A.substr(0,E),C=A.substr(E+1,A.length),$="";for(var D=0;D<_;D++)$+=" ";return B+$+C}function C(B,C){if(B.indexOf(A)==-1)return B;var D=0;while((D=B.indexOf(A))!=-1){var $=C-D%C;B=_(B,D,$)}return B}for(var F=0;F<B.length;F++)$+=C(B[F],D)+"\n";return $};dp.sh.Highlighter.prototype.SwitchToList=function(){var C=this.div.innerHTML.replace(/<(br)\/?>/gi,"\n"),B=C.split("\n");if(this.addControls==true)this.bar.appendChild(dp.sh.Toolbar.Create(this));if(this.showColumns){var A=this.CreateElement("div"),_=this.CreateElement("div"),E=10,G=1;while(G<=150)if(G%E==0){A.innerHTML+=G;G+=(G+"").length}else{A.innerHTML+="&middot;";G++}_.className="columns";_.appendChild(A);this.bar.appendChild(_)}for(var G=0,D=this.firstLine;G<B.length-1;G++,D++){var $=this.CreateElement("LI"),F=this.CreateElement("SPAN");$.className=(G%2==0)?"alt":"";F.innerHTML=B[G]+"&nbsp;";$.appendChild(F);this.ol.appendChild($)}this.div.innerHTML=""};dp.sh.Highlighter.prototype.Highlight=function(C){function A($){return $.replace(/^\s*(.*?)[\s\n]*$/g,"$1")}function $($){return $.replace(/\n*$/,"").replace(/^\n*/,"")}function _(B){var E=dp.sh.Utils.FixForBlogger(B).split("\n"),C=new Array(),D=new RegExp("^\\s*","g"),$=1000;for(var F=0;F<E.length&&$>0;F++){if(A(E[F]).length==0)continue;var _=D.exec(E[F]);if(_!=null&&_.length>0)$=Math.min(_[0].length,$)}if($>0)for(F=0;F<E.length;F++)E[F]=E[F].substr($);return E.join("\n")}function D(A,$,_){return A.substr($,_-$)}var F=0;if(C==null)C="";this.originalCode=C;this.code=$(_(C));this.div=this.CreateElement("DIV");this.bar=this.CreateElement("DIV");this.ol=this.CreateElement("OL");this.matches=new Array();this.div.className="dp-highlighter";this.div.highlighter=this;this.bar.className="bar";this.ol.start=this.firstLine;if(this.CssClass!=null)this.ol.className=this.CssClass;if(this.collapse)this.div.className+=" collapsed";if(this.noGutter)this.div.className+=" nogutter";if(this.tabsToSpaces==true)this.code=this.ProcessSmartTabs(this.code);this.ProcessRegexList();if(this.matches.length==0){this.AddBit(this.code,null);this.SwitchToList();this.div.appendChild(this.bar);this.div.appendChild(this.ol);return}this.matches=this.matches.sort(dp.sh.Highlighter.SortCallback);for(var E=0;E<this.matches.length;E++)if(this.IsInside(this.matches[E]))this.matches[E]=null;for(E=0;E<this.matches.length;E++){var B=this.matches[E];if(B==null||B.length==0)continue;this.AddBit(D(this.code,F,B.index),null);this.AddBit(B.value,B.css);F=B.index+B.length}this.AddBit(this.code.substr(F),null);this.SwitchToList();this.div.appendChild(this.bar);this.div.appendChild(this.ol)};dp.sh.Highlighter.prototype.GetKeywords=function($){return"\\b"+$.replace(/ /g,"\\b|\\b")+"\\b"};dp.sh.BloggerMode=function(){dp.sh.isBloggerMode=true};dp.sh.HighlightAll=function(N,B,K,I,O,E){function A(){var $=arguments;for(var _=0;_<$.length;_++){if($[_]==null)continue;if(typeof($[_])=="string"&&$[_]!="")return $[_]+"";if(typeof($[_])=="object"&&$[_].value!="")return $[_].value+""}return null}function J($,_){for(var A=0;A<_.length;A++)if(_[A]==$)return true;return false}function L(A,B,C){var _=new RegExp("^"+A+"\\[(\\w+)\\]$","gi"),$=null;for(var D=0;D<B.length;D++)if(($=_.exec(B[D]))!=null)return $[1];return C}function C(B,A,_){var $=document.getElementsByTagName(_);for(var C=0;C<$.length;C++)if($[C].getAttribute("name")==A)B.push($[C])}var T=[],P=null,M={},$="innerHTML";C(T,N,"pre");C(T,N,"textarea");if(T.length==0)return;for(var R in dp.sh.Brushes){var F=dp.sh.Brushes[R].Aliases;if(F==null)continue;for(var G=0;G<F.length;G++)M[F[G]]=R}for(G=0;G<T.length;G++){var _=T[G],U=A(_.attributes["class"],_.className,_.attributes["language"],_.language),Q="";if(U==null)continue;U=U.split(":");Q=U[0].toLowerCase();if(M[Q]==null)continue;P=new dp.sh.Brushes[M[Q]]();_.style.display="none";P.noGutter=(B==null)?J("nogutter",U):!B;P.addControls=(K==null)?!J("nocontrols",U):K;P.collapse=(I==null)?J("collapse",U):I;P.showColumns=(E==null)?J("showcolumns",U):E;var D=document.getElementsByTagName("head")[0];if(P.Style&&D){var S=document.createElement("style");S.setAttribute("type","text/css");if(S.styleSheet)S.styleSheet.cssText=P.Style;else{var H=document.createTextNode(P.Style);S.appendChild(H)}D.appendChild(S)}P.firstLine=(O==null)?parseInt(L("firstline",U,1)):O;P.Highlight(_[$]);P.source=_;_.parentNode.insertBefore(P.div,_)}};version.extensions.SyntaxHighLighterPlugin={major:1,minor:1,revision:3,date:new Date(2008,10,24)};dp.sh.ClipboardSwf="clipboard.swf";dp.sh.Highlight=function(_,Q,B,J,H,M,D){function A(){var $=arguments;for(var _=0;_<$.length;_++){if($[_]==null)continue;if(typeof($[_])=="string"&&$[_]!="")return $[_]+"";if(typeof($[_])=="object"&&$[_].value!="")return $[_].value+""}return null}function I($,_){for(var A=0;A<_.length;A++)if(_[A]==$)return true;return false}function K(A,B,C){var _=new RegExp("^"+A+"\\[(\\w+)\\]$","gi"),$=null;for(var D=0;D<B.length;D++)if(($=_.exec(B[D]))!=null)return $[1];return C}var N=null,$="innerHTML";if(this.registered==undefined){var L={};for(var O in dp.sh.Brushes){var E=dp.sh.Brushes[O].Aliases;if(E==null)continue;for(var F=0;F<E.length;F++)L[E[F]]=O}this.registered=L}Q=Q.split(":");language=Q[0].toLowerCase();if(this.registered[language]==null)return;N=new dp.sh.Brushes[this.registered[language]]();_.style.display="none";N.noGutter=(B==null)?I("nogutter",Q):!B;N.addControls=(J==null)?!I("nocontrols",Q):J;N.collapse=(H==null)?I("collapse",Q):H;N.showColumns=(D==null)?I("showcolumns",Q):D;var C=document.getElementsByTagName("head")[0],P=document.getElementById(N.CssClass);if(N.Style&&C&&!P){P=document.createElement("style");P.setAttribute("id",N.CssClass);P.setAttribute("type","text/css");if(P.styleSheet)P.styleSheet.cssText=N.Style;else{var G=document.createTextNode(N.Style);P.appendChild(G)}C.appendChild(P)}N.firstLine=(M==null)?parseInt(K("firstline",Q,1)):M;N.Highlight(_[$]);N.source=_;_.parentNode.insertBefore(N.div,_)};config.formatters.push({name:"SyntaxHighlighter",match:"^<code[\\s]+[^>]+>\\n",element:"pre",handler:function(_){this.lookaheadRegExp=/<code[\s]+([^>]+)>\n((?:^[^\n]*\n)+?)(^<\/code>$\n?)/mg;this.lookaheadRegExp.lastIndex=_.matchStart;var $=this.lookaheadRegExp.exec(_.source);if($&&$.index==_.matchStart){var C=$[1],B=$[2];if(config.browser.isIE)B=B.replace(/\n/g,"\r");var A=createTiddlyElement(_.output,this.element,null,null,B);dp.sh.Highlight(A,C);_.nextMatch=$.index+$[0].length}}});config.formatterHelpers.enclosedTextHelper=function(_){this.lookaheadRegExp.lastIndex=_.matchStart;var $=this.lookaheadRegExp.exec(_.source);if($&&$.index==_.matchStart){var B=$[1];if(config.browser.isIE)B=B.replace(/\n/g,"\r");var A=createTiddlyElement(_.output,this.element,null,null,B);switch(_.matchText){case"/*{{{*/\n":dp.sh.Highlight(A,"css");break;case"//{{{\n":dp.sh.Highlight(A,"js");break;case"<!--{{{-->\n":dp.sh.Highlight(A,"xml");break}_.nextMatch=$.index+$[0].length}};dp.sh.Brushes.AS3=function(){var _="class interface package",$="Array Boolean Date decodeURI decodeURIComponent encodeURI encodeURIComponent escape "+"int isFinite isNaN isXMLName Number Object parseFloat parseInt "+"String trace uint unescape XML XMLList "+"Infinity -Infinity NaN undefined "+"as delete instanceof is new typeof "+"break case catch continue default do each else finally for if in "+"label return super switch throw try while with "+"dynamic final internal native override private protected public static "+"...rest const extends function get implements namespace set "+"import include use "+"AS3 flash_proxy object_proxy "+"false null this true "+"void Null";this.regexList=[{regex:dp.sh.RegexLib.SingleLineCComments,css:"comment"},{regex:dp.sh.RegexLib.MultiLineCComments,css:"blockcomment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp("^\\s*#.*","gm"),css:"preprocessor"},{regex:new RegExp(this.GetKeywords(_),"gm"),css:"definition"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"},{regex:new RegExp("var","gm"),css:"variable"}];this.CssClass="dp-as";this.Style=".dp-as .comment { color: #009900; font-style: italic; }"+".dp-as .blockcomment { color: #3f5fbf; }"+".dp-as .string { color: #990000; }"+".dp-as .preprocessor { color: #0033ff; }"+".dp-as .definition { color: #9900cc; font-weight: bold; }"+".dp-as .keyword { color: #0033ff; }"+".dp-as .variable { color: #6699cc; font-weight: bold; }"};dp.sh.Brushes.AS3.prototype=new dp.sh.Highlighter();dp.sh.Brushes.AS3.Aliases=["as","actionscript","ActionScript","as3","AS3"];dp.sh.Brushes.Bash=function(){var _="alias bg bind break builtin cd command compgen complete continue "+"declare dirs disown echo enable eval exec exit export fc fg "+"getopts hash help history jobs kill let local logout popd printf "+"pushd pwd read readonly return set shift shopt source "+"suspend test times trap type typeset ulimit umask unalias unset wait",$="case do done elif else esac fi for function if in select then "+"time until while";this.regexList=[{regex:dp.sh.RegexLib.SingleLinePerlComments,css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp("[()[\\]{}]","g"),css:"delim"},{regex:new RegExp("\\$\\w+","g"),css:"vars"},{regex:new RegExp("\\w+=","g"),css:"vars"},{regex:new RegExp("\\s-\\w+","g"),css:"flag"},{regex:new RegExp(this.GetKeywords(_),"gm"),css:"builtin"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"}];this.CssClass="dp-bash";this.Style=".dp-bash .builtin {color: maroon; font-weight: bold;}"+".dp-bash .comment {color: gray;}"+".dp-bash .delim {font-weight: bold;}"+".dp-bash .flag {color: green;}"+".dp-bash .string {color: red;}"+".dp-bash .vars {color: blue;}"};dp.sh.Brushes.Bash.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Bash.Aliases=["bash","sh"];dp.sh.Brushes.Batch=function(){var _="APPEND ATTRIB CD CHDIR CHKDSK CHOICE CLS COPY DEL ERASE DELTREE "+"DIR EXIT FC COMP FDISK FIND FORMAT FSUTIL HELP JOIN "+"LABEL LOADFIX MK MKDIR MEM MEMMAKER MORE MOVE MSD PCPARK "+"PRINT RD RMDIR REN SCANDISK SHARE SORT SUBST SYS "+"TIME DATE TREE TRUENAME TYPE UNDELETE VER XCOPY",$="DO ELSE FOR IN CALL CHOICE GOTO SHIFT PAUSE ERRORLEVEL "+"IF NOT EXIST LFNFOR START SETLOCAL ENDLOCAL ECHO SET";this.regexList=[{regex:new RegExp("REM.*$","gm"),css:"comment"},{regex:new RegExp("::.*$","gm"),css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp("[()[\\]{}]","g"),css:"delim"},{regex:new RegExp("%\\w+%","g"),css:"vars"},{regex:new RegExp("%%\\w+","g"),css:"vars"},{regex:new RegExp("\\w+=","g"),css:"vars"},{regex:new RegExp("@\\w+","g"),css:"keyword"},{regex:new RegExp(":\\w+","g"),css:"keyword"},{regex:new RegExp("\\s/\\w+","g"),css:"flag"},{regex:new RegExp(this.GetKeywords(_),"gm"),css:"builtin"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"}];this.CssClass="dp-batch";this.Style=".dp-batch .builtin {color: maroon; font-weight: bold;}"+".dp-batch .comment {color: gray;}"+".dp-batch .delim {font-weight: bold;}"+".dp-batch .flag {color: green;}"+".dp-batch .string {color: red;}"+".dp-batch .vars {color: blue;font-weight: bold;}"};dp.sh.Brushes.Batch.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Batch.Aliases=["batch","dos"];dp.sh.Brushes.ColdFusion=function(){this.CssClass="dp-coldfusion";this.Style=".dp-coldfusion { font: 13px \"Courier New\", Courier, monospace; }"+".dp-coldfusion .tag, .dp-coldfusion .tag-name { color: #990033; }"+".dp-coldfusion .attribute { color: #990033; }"+".dp-coldfusion .attribute-value { color: #0000FF; }"+".dp-coldfusion .cfcomments { background-color: #FFFF99; color: #000000; }"+".dp-coldfusion .cfscriptcomments { color: #999999; }"+".dp-coldfusion .keywords { color: #0000FF; }"+".dp-coldfusion .mgkeywords { color: #CC9900; }"+".dp-coldfusion .numbers { color: #ff0000; }"+".dp-coldfusion .strings { color: green; }";this.mgKeywords="setvalue getvalue addresult viewcollection viewstate";this.keywords="var eq neq gt gte lt lte not and or true false "+"abs acos addsoaprequestheader addsoapresponseheader "+"arrayappend arrayavg arrayclear arraydeleteat arrayinsertat "+"arrayisempty arraylen arraymax arraymin arraynew "+"arrayprepend arrayresize arrayset arraysort arraysum "+"arrayswap arraytolist asc asin atn binarydecode binaryencode "+"bitand bitmaskclear bitmaskread bitmaskset bitnot bitor bitshln "+"bitshrn bitxor ceiling charsetdecode charsetencode chr cjustify "+"compare comparenocase cos createdate createdatetime createobject "+"createobject createobject createobject createobject createodbcdate "+"createodbcdatetime createodbctime createtime createtimespan "+"createuuid dateadd datecompare dateconvert datediff dateformat "+"datepart day dayofweek dayofweekasstring dayofyear daysinmonth "+"daysinyear de decimalformat decrementvalue decrypt decryptbinary "+"deleteclientvariable directoryexists dollarformat duplicate encrypt "+"encryptbinary evaluate exp expandpath fileexists find findnocase "+"findoneof firstdayofmonth fix formatbasen generatesecretkey "+"getauthuser getbasetagdata getbasetaglist getbasetemplatepath "+"getclientvariableslist getcontextroot getcurrenttemplatepath "+"getdirectoryfrompath getencoding getexception getfilefrompath "+"getfunctionlist getgatewayhelper gethttprequestdata gethttptimestring "+"getk2serverdoccount getk2serverdoccountlimit getlocale "+"getlocaledisplayname getlocalhostip getmetadata getmetricdata "+"getpagecontext getprofilesections getprofilestring getsoaprequest "+"getsoaprequestheader getsoapresponse getsoapresponseheader "+"gettempdirectory gettempfile gettemplatepath gettickcount "+"gettimezoneinfo gettoken hash hour htmlcodeformat htmleditformat "+"iif incrementvalue inputbasen insert int isarray isbinary isboolean "+"iscustomfunction isdate isdebugmode isdefined isk2serverabroker "+"isk2serverdoccountexceeded isk2serveronline isleapyear islocalhost "+"isnumeric isnumericdate isobject isquery issimplevalue issoaprequest "+"isstruct isuserinrole isvalid isvalid isvalid iswddx isxml "+"isxmlattribute isxmldoc isxmlelem isxmlnode isxmlroot javacast "+"jsstringformat lcase left len listappend listchangedelims listcontains "+"listcontainsnocase listdeleteat listfind listfindnocase listfirst "+"listgetat listinsertat listlast listlen listprepend listqualify "+"listrest listsetat listsort listtoarray listvaluecount "+"listvaluecountnocase ljustify log log10 lscurrencyformat lsdateformat "+"lseurocurrencyformat lsiscurrency lsisdate lsisnumeric lsnumberformat "+"lsparsecurrency lsparsedatetime lsparseeurocurrency lsparsenumber "+"lstimeformat ltrim max mid min minute month monthasstring now "+"numberformat paragraphformat parameterexists parsedatetime pi "+"preservesinglequotes quarter queryaddcolumn queryaddrow querynew "+"querysetcell quotedvaluelist rand randomize randrange refind "+"refindnocase releasecomobject removechars repeatstring replace "+"replacelist replacenocase rereplace rereplacenocase reverse right "+"rjustify round rtrim second sendgatewaymessage setencoding "+"setlocale setprofilestring setvariable sgn sin spanexcluding "+"spanincluding sqr stripcr structappend structclear structcopy "+"structcount structdelete structfind structfindkey structfindvalue "+"structget structinsert structisempty structkeyarray structkeyexists "+"structkeylist structnew structsort structupdate tan timeformat "+"tobase64 tobinary toscript tostring trim ucase urldecode urlencodedformat "+"urlsessionformat val valuelist week wrap writeoutput xmlchildpos "+"xmlelemnew xmlformat xmlgetnodetype xmlnew xmlparse xmlsearch xmltransform "+"xmlvalidate year yesnoformat";this.stringMatches=new Array();this.attributeMatches=new Array()};dp.sh.Brushes.ColdFusion.prototype=new dp.sh.Highlighter();dp.sh.Brushes.ColdFusion.Aliases=["coldfusion","cf"];dp.sh.Brushes.ColdFusion.prototype.ProcessRegexList=function(){function B(_,$){_[_.length]=$}function A(A,$){for(var _=0;_<A.length;_++)if(A[_]==$)return _;return-1}var _=null,$=null;this.GetMatches(new RegExp("\\b(\\d+)","gm"),"numbers");this.GetMatches(new RegExp(this.GetKeywords(this.mgKeywords),"igm"),"mgkeywords");this.GetMatches(dp.sh.RegexLib.SingleLineCComments,"cfscriptcomments");this.GetMatches(dp.sh.RegexLib.MultiLineCComments,"cfscriptcomments");this.GetMatches(new RegExp("(<|<)!---[\\s\\S]*?---(>|>)","gm"),"cfcomments");$=new RegExp("(cfset\\s*)?([:\\w-.]+)\\s*=\\s*(\".*?\"|'.*?')*","gm");while((_=$.exec(this.code))!=null){if(_[1]!=undefined&&_[1]!="")continue;if(_[3]!=undefined&&_[3]!=""&&_[3]!="\"\""&&_[3]!="''"){B(this.matches,new dp.sh.Match(_[2],_.index,"attribute"));B(this.matches,new dp.sh.Match(_[3],_.index+_[0].indexOf(_[3]),"attribute-value"));B(this.stringMatches,_[3]);B(this.attributeMatches,_[2])}}this.GetMatches(new RegExp("(<|<)/*\\?*(?!\\!)|/*\\?*(>|>)","gm"),"tag");$=new RegExp("(?:<|<)/*\\?*\\s*([:\\w-.]+)","gm");while((_=$.exec(this.code))!=null)B(this.matches,new dp.sh.Match(_[1],_.index+_[0].indexOf(_[1]),"tag-name"));$=new RegExp(this.GetKeywords(this.keywords),"igm");while((_=$.exec(this.code))!=null)if(A(this.attributeMatches,_[0])==-1)B(this.matches,new dp.sh.Match(_[0],_.index,"keywords"));$=new RegExp("cfset\\s*.*(\".*?\"|'.*?')","gm");while((_=$.exec(this.code))!=null)if(_[1]!=undefined&&_[1]!=""){B(this.matches,new dp.sh.Match(_[1],_.index+_[0].indexOf(_[1]),"strings"));B(this.stringMatches,_[1])}while((_=dp.sh.RegexLib.DoubleQuotedString.exec(this.code))!=null)if(A(this.stringMatches,_[0])==-1)B(this.matches,new dp.sh.Match(_[0],_.index,"strings"));while((_=dp.sh.RegexLib.SingleQuotedString.exec(this.code))!=null)if(A(this.stringMatches,_[0])==-1)B(this.matches,new dp.sh.Match(_[0],_.index,"strings"))};dp.sh.Brushes.Cpp=function(){var _="ATOM BOOL BOOLEAN BYTE CHAR COLORREF DWORD DWORDLONG DWORD_PTR "+"DWORD32 DWORD64 FLOAT HACCEL HALF_PTR HANDLE HBITMAP HBRUSH "+"HCOLORSPACE HCONV HCONVLIST HCURSOR HDC HDDEDATA HDESK HDROP HDWP "+"HENHMETAFILE HFILE HFONT HGDIOBJ HGLOBAL HHOOK HICON HINSTANCE HKEY "+"HKL HLOCAL HMENU HMETAFILE HMODULE HMONITOR HPALETTE HPEN HRESULT "+"HRGN HRSRC HSZ HWINSTA HWND INT INT_PTR INT32 INT64 LANGID LCID LCTYPE "+"LGRPID LONG LONGLONG LONG_PTR LONG32 LONG64 LPARAM LPBOOL LPBYTE LPCOLORREF "+"LPCSTR LPCTSTR LPCVOID LPCWSTR LPDWORD LPHANDLE LPINT LPLONG LPSTR LPTSTR "+"LPVOID LPWORD LPWSTR LRESULT PBOOL PBOOLEAN PBYTE PCHAR PCSTR PCTSTR PCWSTR "+"PDWORDLONG PDWORD_PTR PDWORD32 PDWORD64 PFLOAT PHALF_PTR PHANDLE PHKEY PINT "+"PINT_PTR PINT32 PINT64 PLCID PLONG PLONGLONG PLONG_PTR PLONG32 PLONG64 POINTER_32 "+"POINTER_64 PSHORT PSIZE_T PSSIZE_T PSTR PTBYTE PTCHAR PTSTR PUCHAR PUHALF_PTR "+"PUINT PUINT_PTR PUINT32 PUINT64 PULONG PULONGLONG PULONG_PTR PULONG32 PULONG64 "+"PUSHORT PVOID PWCHAR PWORD PWSTR SC_HANDLE SC_LOCK SERVICE_STATUS_HANDLE SHORT "+"SIZE_T SSIZE_T TBYTE TCHAR UCHAR UHALF_PTR UINT UINT_PTR UINT32 UINT64 ULONG "+"ULONGLONG ULONG_PTR ULONG32 ULONG64 USHORT USN VOID WCHAR WORD WPARAM WPARAM WPARAM "+"char bool short int __int32 __int64 __int8 __int16 long float double __wchar_t "+"clock_t _complex _dev_t _diskfree_t div_t ldiv_t _exception _EXCEPTION_POINTERS "+"FILE _finddata_t _finddatai64_t _wfinddata_t _wfinddatai64_t __finddata64_t "+"__wfinddata64_t _FPIEEE_RECORD fpos_t _HEAPINFO _HFILE lconv intptr_t "+"jmp_buf mbstate_t _off_t _onexit_t _PNH ptrdiff_t _purecall_handler "+"sig_atomic_t size_t _stat __stat64 _stati64 terminate_function "+"time_t __time64_t _timeb __timeb64 tm uintptr_t _utimbuf "+"va_list wchar_t wctrans_t wctype_t wint_t signed",$="break case catch class const __finally __exception __try "+"const_cast continue private public protected __declspec "+"default delete deprecated dllexport dllimport do dynamic_cast "+"else enum explicit extern if for friend goto inline "+"mutable naked namespace new noinline noreturn nothrow "+"register reinterpret_cast return selectany "+"sizeof static static_cast struct switch template this "+"thread throw true false try typedef typeid typename union "+"using uuid virtual void volatile whcar_t while";this.regexList=[{regex:dp.sh.RegexLib.SingleLineCComments,css:"comment"},{regex:dp.sh.RegexLib.MultiLineCComments,css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp("^ *#.*","gm"),css:"preprocessor"},{regex:new RegExp(this.GetKeywords(_),"gm"),css:"datatypes"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"}];this.CssClass="dp-cpp";this.Style=".dp-cpp .datatypes { color: #2E8B57; font-weight: bold; }"};dp.sh.Brushes.Cpp.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Cpp.Aliases=["cpp","c","c++"];dp.sh.Brushes.CSharp=function(){var $="abstract as base bool break byte case catch char checked class const "+"continue decimal default delegate do double else enum event explicit "+"extern false finally fixed float for foreach get goto if implicit in int "+"interface internal is lock long namespace new null object operator out "+"override params private protected public readonly ref return sbyte sealed set "+"short sizeof stackalloc static string struct switch this throw true try "+"typeof uint ulong unchecked unsafe ushort using virtual void while";this.regexList=[{regex:dp.sh.RegexLib.SingleLineCComments,css:"comment"},{regex:dp.sh.RegexLib.MultiLineCComments,css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp("^\\s*#.*","gm"),css:"preprocessor"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"}];this.CssClass="dp-c";this.Style=".dp-c .vars { color: #d00; }"};dp.sh.Brushes.CSharp.prototype=new dp.sh.Highlighter();dp.sh.Brushes.CSharp.Aliases=["c#","c-sharp","csharp"];dp.sh.Brushes.CSS=function(){var _="ascent azimuth background-attachment background-color background-image background-position "+"background-repeat background baseline bbox border-collapse border-color border-spacing border-style border-top "+"border-right border-bottom border-left border-top-color border-right-color border-bottom-color border-left-color "+"border-top-style border-right-style border-bottom-style border-left-style border-top-width border-right-width "+"border-bottom-width border-left-width border-width border cap-height caption-side centerline clear clip color "+"content counter-increment counter-reset cue-after cue-before cue cursor definition-src descent direction display "+"elevation empty-cells float font-size-adjust font-family font-size font-stretch font-style font-variant font-weight font "+"height letter-spacing line-height list-style-image list-style-position list-style-type list-style margin-top "+"margin-right margin-bottom margin-left margin marker-offset marks mathline max-height max-width min-height min-width orphans "+"outline-color outline-style outline-width outline overflow padding-top padding-right padding-bottom padding-left padding page "+"page-break-after page-break-before page-break-inside pause pause-after pause-before pitch pitch-range play-during position "+"quotes richness size slope src speak-header speak-numeral speak-punctuation speak speech-rate stemh stemv stress "+"table-layout text-align text-decoration text-indent text-shadow text-transform unicode-bidi unicode-range units-per-em "+"vertical-align visibility voice-family volume white-space widows width widths word-spacing x-height z-index",$="above absolute all always aqua armenian attr aural auto avoid baseline behind below bidi-override black blink block blue bold bolder "+"both bottom braille capitalize caption center center-left center-right circle close-quote code collapse compact condensed "+"continuous counter counters crop cross crosshair cursive dashed decimal decimal-leading-zero default digits disc dotted double "+"embed embossed e-resize expanded extra-condensed extra-expanded fantasy far-left far-right fast faster fixed format fuchsia "+"gray green groove handheld hebrew help hidden hide high higher icon inline-table inline inset inside invert italic "+"justify landscape large larger left-side left leftwards level lighter lime line-through list-item local loud lower-alpha "+"lowercase lower-greek lower-latin lower-roman lower low ltr marker maroon medium message-box middle mix move narrower "+"navy ne-resize no-close-quote none no-open-quote no-repeat normal nowrap n-resize nw-resize oblique olive once open-quote outset "+"outside overline pointer portrait pre print projection purple red relative repeat repeat-x repeat-y rgb ridge right right-side "+"rightwards rtl run-in screen scroll semi-condensed semi-expanded separate se-resize show silent silver slower slow "+"small small-caps small-caption smaller soft solid speech spell-out square s-resize static status-bar sub super sw-resize "+"table-caption table-cell table-column table-column-group table-footer-group table-header-group table-row table-row-group teal "+"text-bottom text-top thick thin top transparent tty tv ultra-condensed ultra-expanded underline upper-alpha uppercase upper-latin "+"upper-roman url visible wait white wider w-resize x-fast x-high x-large x-loud x-low x-slow x-small x-soft xx-large xx-small yellow",A="[mM]onospace [tT]ahoma [vV]erdana [aA]rial [hH]elvetica [sS]ans-serif [sS]erif";this.regexList=[{regex:dp.sh.RegexLib.MultiLineCComments,css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp("\\#[a-zA-Z0-9]{3,6}","g"),css:"value"},{regex:new RegExp("(-?\\d+)(.\\d+)?(px|em|pt|:|%|)","g"),css:"value"},{regex:new RegExp("!important","g"),css:"important"},{regex:new RegExp(this.GetKeywordsCSS(_),"gm"),css:"keyword"},{regex:new RegExp(this.GetValuesCSS($),"g"),css:"value"},{regex:new RegExp(this.GetValuesCSS(A),"g"),css:"value"}];this.CssClass="dp-css";this.Style=".dp-css .value { color: black; }"+".dp-css .important { color: red; }"};dp.sh.Highlighter.prototype.GetKeywordsCSS=function($){return"\\b([a-z_]|)"+$.replace(/ /g,"(?=:)\\b|\\b([a-z_\\*]|\\*|)")+"(?=:)\\b"};dp.sh.Highlighter.prototype.GetValuesCSS=function($){return"\\b"+$.replace(/ /g,"(?!-)(?!:)\\b|\\b()")+":\\b"};dp.sh.Brushes.CSS.prototype=new dp.sh.Highlighter();dp.sh.Brushes.CSS.Aliases=["css"];dp.sh.Brushes.Delphi=function(){var $="abs addr and ansichar ansistring array as asm begin boolean byte cardinal "+"case char class comp const constructor currency destructor div do double "+"downto else end except exports extended false file finalization finally "+"for function goto if implementation in inherited int64 initialization "+"integer interface is label library longint longword mod nil not object "+"of on or packed pansichar pansistring pchar pcurrency pdatetime pextended "+"pint64 pointer private procedure program property pshortstring pstring "+"pvariant pwidechar pwidestring protected public published raise real real48 "+"record repeat set shl shortint shortstring shr single smallint string then "+"threadvar to true try type unit until uses val var varirnt while widechar "+"widestring with word write writeln xor";this.regexList=[{regex:new RegExp("\\(\\*[\\s\\S]*?\\*\\)","gm"),css:"comment"},{regex:new RegExp("{(?!\\$)[\\s\\S]*?}","gm"),css:"comment"},{regex:dp.sh.RegexLib.SingleLineCComments,css:"comment"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp("\\{\\$[a-zA-Z]+ .+\\}","g"),css:"directive"},{regex:new RegExp("\\b[\\d\\.]+\\b","g"),css:"number"},{regex:new RegExp("\\$[a-zA-Z0-9]+\\b","g"),css:"number"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"}];this.CssClass="dp-delphi";this.Style=".dp-delphi .number { color: blue; }"+".dp-delphi .directive { color: #008284; }"+".dp-delphi .vars { color: #000; }"};dp.sh.Brushes.Delphi.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Delphi.Aliases=["delphi","pascal"];dp.sh.Brushes.Java=function(){var $="abstract assert boolean break byte case catch char class const "+"continue default do double else enum extends "+"false final finally float for goto if implements import "+"instanceof int interface long native new null "+"package private protected public return "+"short static strictfp super switch synchronized this throw throws true "+"transient try void volatile while";this.regexList=[{regex:dp.sh.RegexLib.SingleLineCComments,css:"comment"},{regex:dp.sh.RegexLib.MultiLineCComments,css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp("\\b([\\d]+(\\.[\\d]+)?|0x[a-f0-9]+)\\b","gi"),css:"number"},{regex:new RegExp("(?!\\@interface\\b)\\@[\\$\\w]+\\b","g"),css:"annotation"},{regex:new RegExp("\\@interface\\b","g"),css:"keyword"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"}];this.CssClass="dp-j";this.Style=".dp-j .annotation { color: #646464; }"+".dp-j .number { color: #C00000; }"};dp.sh.Brushes.Java.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Java.Aliases=["java"];dp.sh.Brushes.JScript=function(){var $="abstract boolean break byte case catch char class const continue debugger "+"default delete do double else enum export extends false final finally float "+"for function goto if implements import in instanceof int interface long native "+"new null package private protected public return short static super switch "+"synchronized this throw throws transient true try typeof var void volatile while with";this.regexList=[{regex:dp.sh.RegexLib.SingleLineCComments,css:"comment"},{regex:dp.sh.RegexLib.MultiLineCComments,css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp("^\\s*#.*","gm"),css:"preprocessor"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"}];this.CssClass="dp-c"};dp.sh.Brushes.JScript.prototype=new dp.sh.Highlighter();dp.sh.Brushes.JScript.Aliases=["js","jscript","javascript"];dp.sh.Brushes.Lua=function(){var $="break do end else elseif function if local nil not or repeat return and then until while this",_="math\\.\\w+ string\\.\\w+ os\\.\\w+ debug\\.\\w+ io\\.\\w+ error fopen dofile coroutine\\.\\w+ arg getmetatable ipairs loadfile loadlib loadstring longjmp print rawget rawset seek setmetatable assert tonumber tostring";this.regexList=[{regex:new RegExp("--\\[\\[[\\s\\S]*\\]\\]--","gm"),css:"comment"},{regex:new RegExp("--[^\\[]{2}.*$","gm"),css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"},{regex:new RegExp(this.GetKeywords(_),"gm"),css:"func"},];this.CssClass="dp-lua"};dp.sh.Brushes.Lua.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Lua.Aliases=["lua"];dp.sh.Brushes.Mxml=function(){this.CssClass="dp-mxml";this.Style=".dp-mxml .cdata { color: #000000; }"+".dp-mxml .tag { color : #0000ff; }"+".dp-mxml .tag-name { color: #0000ff; }"+".dp-mxml .script { color: green; }"+".dp-mxml .metadata { color: green; }"+".dp-mxml .attribute { color: #000000; }"+".dp-mxml .attribute-value { color: #990000; }"+".dp-mxml .trace { color: #cc6666; }"+".dp-mxml .var { color: #6699cc; }"+".dp-mxml .comment { color: #009900; }"+".dp-mxml .string { color: #990000; }"+".dp-mxml .keyword { color: blue; }"};dp.sh.Brushes.Mxml.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Mxml.Aliases=["mxml"];dp.sh.Brushes.Mxml.prototype.ProcessRegexList=function(){function H(_,$){_[_.length]=$}function B(B,_){var A=0,$=false;for(A=0;A<B.length;A++)if(_.index>B[A].firstIndex&&_.index<B[A].lastIndex)$=true;return $}var $=0,F=null,D=null,A=null,C="",E=new Array(),_="abstract boolean break byte case catch char class const continue debugger "+"default delete do double else enum export extends false final finally float "+"for function goto if implements import in instanceof int interface long native "+"new null package private protected public return short static super switch "+"synchronized this throw throws transient true try typeof var void volatile while with",G=[{regex:dp.sh.RegexLib.SingleLineCComments,css:"comment"},{regex:dp.sh.RegexLib.MultiLineCComments,css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp("^\\s*#.*","gm"),css:"preprocessor"},{regex:new RegExp(this.GetKeywords("trace"),"gm"),css:"trace"},{regex:new RegExp(this.GetKeywords(_),"gm"),css:"keyword"}];A=new RegExp("<\\!\\[CDATA\\[(.|\\s)*?\\]\\]>","gm");while((F=A.exec(this.code))!=null){C=F[0].substr(0,12);H(this.matches,new dp.sh.Match(C,F.index,"cdata"));C=F[0].substr(12,F[0].length-12-6);for(var I=0;I<G.length;I++)while((D=G[I].regex.exec(C))!=null)H(this.matches,new dp.sh.Match(D[0],F.index+12+D.index,G[I].css));C=F[0].substr(F[0].length-6,6);H(this.matches,new dp.sh.Match(C,F.index+F[0].length-6,"cdata"));E.push({firstIndex:F.index,lastIndex:F.index+F[0].length-1})}this.GetMatches(new RegExp("(<|<)!--\\s*.*?\\s*--(>|>)","gm"),"comments");A=new RegExp("([:\\w-.]+)\\s*=\\s*(\".*?\"|'.*?'|\\w+)*|(\\w+)","gm");while((F=A.exec(this.code))!=null){if(F[1]==null)continue;if(B(E,F))continue;H(this.matches,new dp.sh.Match(F[1],F.index,"attribute"));if(F[2]!=undefined)H(this.matches,new dp.sh.Match(F[2],F.index+F[0].indexOf(F[2]),"attribute-value"))}A=new RegExp("(?:<|<)/*\\?*\\s*([:\\w-.]+)","gm");while((F=A.exec(this.code))!=null){if(B(E,F))continue;C=F[0].substr(4,F[0].length-4);switch(C){case"mx:Script":case"/mx:Script":H(this.matches,new dp.sh.Match(F[0]+">",F.index,"script"));break;case"mx:Metadata":case"/mx:Metadata":H(this.matches,new dp.sh.Match(F[0]+">",F.index,"metadata"));break;default:H(this.matches,new dp.sh.Match(F[0],F.index,"tag-name"));break}}A=new RegExp("\\?>|>|/>","gm");while((F=A.exec(this.code))!=null){if(B(E,F))continue;H(this.matches,new dp.sh.Match(F[0],F.index,"tag"))}};dp.sh.Brushes.Perl=function(){var _="abs accept alarm atan2 bind binmode bless caller chdir chmod chomp chop chown chr chroot close closedir connect cos crypt dbmclose dbmopen defined delete dump each endgrent endhostent endnetent endprotoent endpwent endservent eof exec exists exp fcntl fileno flock fork format formline getc getgrent getgrgid getgrnam gethostbyaddr gethostbyname gethostent getlogin getnetbyaddr getnetbyname getnetent getpeername getpgrp getppid getpriority getprotobyname getprotobynumber getprotoent getpwent getpwnam getpwuid getservbyname getservbyport getservent getsockname getsockopt glob gmtime grep hex import index int ioctl join keys kill lc lcfirst length link listen localtime lock log lstat m map mkdir msgctl msgget msgrcv msgsnd no oct open opendir ord pack pipe pop pos print printf prototype push q qq quotemeta qw qx rand read readdir readline readlink readpipe recv ref rename reset reverse rewinddir rindex rmdir scalar seek seekdir semctl semget semop send setgrent sethostent setnetent setpgrp setpriority setprotoent setpwent setservent setsockopt shift shmctl shmget shmread shmwrite shutdown sin sleep socket socketpair sort splice split sprintf sqrt srand stat study sub substr symlink syscall sysopen sysread sysseek system syswrite tell telldir tie tied time times tr truncate uc ucfirst umask undef unlink unpack unshift untie utime values vec waitpid wantarray warn write qr",$="s select goto die do package redo require return continue for foreach last next wait while use if else elsif eval exit unless switch case",A="my our local";this.regexList=[{regex:dp.sh.RegexLib.SingleLinePerlComments,css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp("(\\$|@|%)\\w+","g"),css:"vars"},{regex:new RegExp(this.GetKeywords(_),"gmi"),css:"func"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"},{regex:new RegExp(this.GetKeywords(A),"gm"),css:"declarations"}];this.CssClass="dp-perl"};dp.sh.Brushes.Perl.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Perl.Aliases=["perl"];dp.sh.Brushes.Php=function(){var _="abs acos acosh addcslashes addslashes "+"array_change_key_case array_chunk array_combine array_count_values array_diff "+"array_diff_assoc array_diff_key array_diff_uassoc array_diff_ukey array_fill "+"array_filter array_flip array_intersect array_intersect_assoc array_intersect_key "+"array_intersect_uassoc array_intersect_ukey array_key_exists array_keys array_map "+"array_merge array_merge_recursive array_multisort array_pad array_pop array_product "+"array_push array_rand array_reduce array_reverse array_search array_shift "+"array_slice array_splice array_sum array_udiff array_udiff_assoc "+"array_udiff_uassoc array_uintersect array_uintersect_assoc "+"array_uintersect_uassoc array_unique array_unshift array_values array_walk "+"array_walk_recursive atan atan2 atanh base64_decode base64_encode base_convert "+"basename bcadd bccomp bcdiv bcmod bcmul bindec bindtextdomain bzclose bzcompress "+"bzdecompress bzerrno bzerror bzerrstr bzflush bzopen bzread bzwrite ceil chdir "+"checkdate checkdnsrr chgrp chmod chop chown chr chroot chunk_split class_exists "+"closedir closelog copy cos cosh count count_chars date decbin dechex decoct "+"deg2rad delete ebcdic2ascii echo empty end ereg ereg_replace eregi eregi_replace error_log "+"error_reporting escapeshellarg escapeshellcmd eval exec exit exp explode extension_loaded "+"feof fflush fgetc fgetcsv fgets fgetss file_exists file_get_contents file_put_contents "+"fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype "+"floatval flock floor flush fmod fnmatch fopen fpassthru fprintf fputcsv fputs fread fscanf "+"fseek fsockopen fstat ftell ftok getallheaders getcwd getdate getenv gethostbyaddr gethostbyname "+"gethostbynamel getimagesize getlastmod getmxrr getmygid getmyinode getmypid getmyuid getopt "+"getprotobyname getprotobynumber getrandmax getrusage getservbyname getservbyport gettext "+"gettimeofday gettype glob gmdate gmmktime ini_alter ini_get ini_get_all ini_restore ini_set "+"interface_exists intval ip2long is_a is_array is_bool is_callable is_dir is_double "+"is_executable is_file is_finite is_float is_infinite is_int is_integer is_link is_long "+"is_nan is_null is_numeric is_object is_readable is_real is_resource is_scalar is_soap_fault "+"is_string is_subclass_of is_uploaded_file is_writable is_writeable mkdir mktime nl2br "+"parse_ini_file parse_str parse_url passthru pathinfo readlink realpath rewind rewinddir rmdir "+"round str_ireplace str_pad str_repeat str_replace str_rot13 str_shuffle str_split "+"str_word_count strcasecmp strchr strcmp strcoll strcspn strftime strip_tags stripcslashes "+"stripos stripslashes stristr strlen strnatcasecmp strnatcmp strncasecmp strncmp strpbrk "+"strpos strptime strrchr strrev strripos strrpos strspn strstr strtok strtolower strtotime "+"strtoupper strtr strval substr substr_compare",$="and or xor __FILE__ __LINE__ array as break case "+"cfunction class const continue declare default die do else "+"elseif empty enddeclare endfor endforeach endif endswitch endwhile "+"extends for foreach function include include_once global if "+"new old_function return static switch use require require_once "+"var while __FUNCTION__ __CLASS__ "+"__METHOD__ abstract interface public implements extends private protected throw";this.regexList=[{regex:dp.sh.RegexLib.SingleLineCComments,css:"comment"},{regex:dp.sh.RegexLib.MultiLineCComments,css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp("\\$\\w+","g"),css:"vars"},{regex:new RegExp(this.GetKeywords(_),"gmi"),css:"func"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"}];this.CssClass="dp-c"};dp.sh.Brushes.Php.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Php.Aliases=["php"];dp.sh.Brushes.Python=function(){var $="and assert break class continue def del elif else "+"except exec finally for from global if import in is "+"lambda not or pass print raise return try yield while",_="None True False self cls class_";this.regexList=[{regex:dp.sh.RegexLib.SingleLinePerlComments,css:"comment"},{regex:new RegExp("^\\s*@\\w+","gm"),css:"decorator"},{regex:new RegExp("(['\"]{3})([^\\1])*?\\1","gm"),css:"comment"},{regex:new RegExp("\"(?!\")(?:\\.|\\\\\\\"|[^\\\"\"\\n\\r])*\"","gm"),css:"string"},{regex:new RegExp("'(?!')*(?:\\.|(\\\\\\')|[^\\''\\n\\r])*'","gm"),css:"string"},{regex:new RegExp("\\b\\d+\\.?\\w*","g"),css:"number"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"},{regex:new RegExp(this.GetKeywords(_),"gm"),css:"special"}];this.CssClass="dp-py";this.Style=".dp-py .builtins { color: #ff1493; }"+".dp-py .magicmethods { color: #808080; }"+".dp-py .exceptions { color: brown; }"+".dp-py .types { color: brown; font-style: italic; }"+".dp-py .commonlibs { color: #8A2BE2; font-style: italic; }"};dp.sh.Brushes.Python.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Python.Aliases=["py","python"];dp.sh.Brushes.Ruby=function(){var $="alias and BEGIN begin break case class def define_method defined do each else elsif "+"END end ensure false for if in module new next nil not or raise redo rescue retry return "+"self super then throw true undef unless until when while yield",_="Array Bignum Binding Class Continuation Dir Exception FalseClass File::Stat File Fixnum Fload "+"Hash Integer IO MatchData Method Module NilClass Numeric Object Proc Range Regexp String Struct::TMS Symbol "+"ThreadGroup Thread Time TrueClass";this.regexList=[{regex:dp.sh.RegexLib.SingleLinePerlComments,css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp(":[a-z][A-Za-z0-9_]*","g"),css:"symbol"},{regex:new RegExp("(\\$|@@|@)\\w+","g"),css:"variable"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"},{regex:new RegExp(this.GetKeywords(_),"gm"),css:"builtin"}];this.CssClass="dp-rb";this.Style=".dp-rb .symbol { color: #a70; }"+".dp-rb .variable { color: #a70; font-weight: bold; }"};dp.sh.Brushes.Ruby.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Ruby.Aliases=["ruby","rails","ror"];dp.sh.Brushes.Sql=function(){var _="abs avg case cast coalesce convert count current_timestamp "+"current_user day isnull left lower month nullif replace right "+"session_user space substring sum system_user upper user year",$="absolute action add after alter as asc at authorization begin bigint "+"binary bit by cascade char character check checkpoint close collate "+"column commit committed connect connection constraint contains continue "+"create cube current current_date current_time cursor database date "+"deallocate dec decimal declare default delete desc distinct double drop "+"dynamic else end end-exec escape except exec execute false fetch first "+"float for force foreign forward free from full function global goto grant "+"group grouping having hour ignore index inner insensitive insert instead "+"int integer intersect into is isolation key last level load local max min "+"minute modify move name national nchar next no numeric of off on only "+"open option order out output partial password precision prepare primary "+"prior privileges procedure public read real references relative repeatable "+"restrict return returns revoke rollback rollup rows rule schema scroll "+"second section select sequence serializable set size smallint static "+"statistics table temp temporary then time timestamp to top transaction "+"translation trigger true truncate uncommitted union unique update values "+"varchar varying view when where with work",A="all and any between cross in join like not null or outer some";this.regexList=[{regex:new RegExp("--(.*)$","gm"),css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp(this.GetKeywords(_),"gmi"),css:"func"},{regex:new RegExp(this.GetKeywords(A),"gmi"),css:"op"},{regex:new RegExp(this.GetKeywords($),"gmi"),css:"keyword"}];this.CssClass="dp-sql";this.Style=".dp-sql .func { color: #ff1493; }"+".dp-sql .op { color: #808080; }"};dp.sh.Brushes.Sql.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Sql.Aliases=["sql"];dp.sh.Brushes.Vb=function(){var $="AddHandler AddressOf AndAlso Alias And Ansi As Assembly Auto "+"Boolean ByRef Byte ByVal Call Case Catch CBool CByte CChar CDate "+"CDec CDbl Char CInt Class CLng CObj Const CShort CSng CStr CType "+"Date Decimal Declare Default Delegate Dim DirectCast Do Double Each "+"Else ElseIf End Enum Erase Error Event Exit False Finally For Friend "+"Function Get GetType GoSub GoTo Handles If Implements Imports In "+"Inherits Integer Interface Is Let Lib Like Long Loop Me Mod Module "+"MustInherit MustOverride MyBase MyClass Namespace New Next Not Nothing "+"NotInheritable NotOverridable Object On Option Optional Or OrElse "+"Overloads Overridable Overrides ParamArray Preserve Private Property "+"Protected Public RaiseEvent ReadOnly ReDim REM RemoveHandler Resume "+"Return Select Set Shadows Shared Short Single Static Step Stop String "+"Structure Sub SyncLock Then Throw To True Try TypeOf Unicode Until "+"Variant When While With WithEvents WriteOnly Xor";this.regexList=[{regex:new RegExp("'.*$","gm"),css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:new RegExp("^\\s*#.*","gm"),css:"preprocessor"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"}];this.CssClass="dp-vb"};dp.sh.Brushes.Vb.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Vb.Aliases=["vb","vb.net"];dp.sh.Brushes.Xml=function(){this.CssClass="dp-xml";this.Style=".dp-xml .cdata { color: #ff1493; }"+".dp-xml .tag, .dp-xml .tag-name { color: #069; font-weight: bold; }"+".dp-xml .attribute { color: red; }"+".dp-xml .attribute-value { color: blue; }"};dp.sh.Brushes.Xml.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Xml.Aliases=["xml","xhtml","xslt","html","xhtml"];dp.sh.Brushes.Xml.prototype.ProcessRegexList=function(){function B(_,$){_[_.length]=$}var $=0,A=null,_=null;this.GetMatches(new RegExp("(<|<)\\!\\[[\\w\\s]*?\\[(.|\\s)*?\\]\\](>|>)","gm"),"cdata");this.GetMatches(new RegExp("(<|<)!--\\s*.*?\\s*--(>|>)","gm"),"comments");_=new RegExp("([:\\w-.]+)\\s*=\\s*(\".*?\"|'.*?'|\\w+)*|(\\w+)","gm");while((A=_.exec(this.code))!=null){if(A[1]==null)continue;B(this.matches,new dp.sh.Match(A[1],A.index,"attribute"));if(A[2]!=undefined)B(this.matches,new dp.sh.Match(A[2],A.index+A[0].indexOf(A[2]),"attribute-value"))}this.GetMatches(new RegExp("(<|<)/*\\?*(?!\\!)|/*\\?*(>|>)","gm"),"tag");_=new RegExp("(?:<|<)/*\\?*\\s*([:\\w-.]+)","gm");while((A=_.exec(this.code))!=null)B(this.matches,new dp.sh.Match(A[1],A.index+A[0].indexOf(A[1]),"tag-name"))}
//}}}
{{{
#!/bin/bash

#settings:
netspeed=true
ram=true
ramused=true
cpu=true
swap=true
#-------------------------------------------------------

#----------- up/down speed -----------------------------
if [ $netspeed = true ]; then

upspeed1=$(cat /proc/net/dev | grep eth | tr -s ' ' | cut -d\  -f3)
downspeed1=$(cat /proc/net/dev | grep eth | tr -s ' ' | cut -d\  -f11)
sleep 0.9
upspeed2=$(cat /proc/net/dev | grep eth | tr -s ' ' | cut -d\  -f3)
downspeed2=$(cat /proc/net/dev | grep eth | tr -s ' ' | cut -d\  -f11)

upspeed=$(echo \($upspeed2 - $upspeed1\)/1024 | bc)
upkbmb=$(if [ $upspeed -gt 1024 ]; then
		up1=$(echo \($upspeed2 - $upspeed1\)/1024/1024 | bc -l)
		echo $up1 | head -c 4
	else 
		echo $upspeed | head -c 3
	fi)

downspeed=$(echo \($downspeed2 - $downspeed1\)/1024 | bc)
downkbmb=$(if [ $downspeed -gt 1024 ]; then
		down1=$(echo \($downspeed2 - $downspeed1\)/1024/1024 | bc -l)
		echo $down1 | head -c 4
	else 
		echo $downspeed | head -c 3
	fi)
#---------------- up/down speed unit --------------------
upunit=$(if [ $upspeed -gt 1024 ]; then echo "mb/s"; else echo "kb/s"; fi)
downunit=$(if [ $downspeed -gt 1024 ]; then echo "mb/s"; else echo "kb/s"; fi)

fi



#------------------- CPU % used -------------------------
if [ $cpu = true ]; then

cpufree=$(vmstat 1 2 | tail -1 | tr -s ' ' | cut -d ' ' -f16)
cpuused=$(echo 100-$cpufree | bc | sed -e 's/\..*//')

fi

#------------------- SWAP used -------------------------
if [ $swap = true ]; then

swapfree=$(free -k | grep Swap | tr -s ' ' | cut -d\  -f3)
swapkbmb=$(if [ $swapfree -gt 1024 ]; then 
		sw1=$(free -m | grep Swap | tr -s ' ' | cut -d\  -f3)
		echo $sw1 | head -c 5
	else 
		echo $swapfree | head -c 3
	fi)
swapunit=$(if [ $swapfree -gt 1024 ]; then echo "mb"; else echo "kb"; fi)

fi

#------------------- RAM used --------------------------
if [ $ramused = true ]; then

memfree=$(free -k | grep Mem | tr -s ' ' | cut -d\  -f3)
memkbmb=$(if [ $memfree -gt 1024 ]; then 
		mw1=$(free -m | grep Mem | tr -s ' ' | cut -d\  -f3)
		echo $mw1 | head -c 5
	else 
		echo $memfree | head -c 3
	fi)
memunit=$(if [ $memfree -gt 1024 ]; then echo "mb"; else echo "kb"; fi)

fi

#------------------- RAM % used --------------------------
if [ $ram = true ]; then

memused=$(free -m | grep buffers/cache | tr -s ' ' | cut -d' ' -f 3)
memfree=$(free -m | grep buffers/cache | tr -s ' ' | cut -d' ' -f 4)
memtotal=$(echo $memused+$memfree | bc -l)

memusedpercent=$(echo 100-100*$memfree/$memtotal | bc)

fi

#------------------ The Indicator Sysmonitor actual output -
echo $(if [ $cpu = true ]; then echo cpu: $cpuused%; fi) $(if [ $ram = true ]; then echo mem: $memusedpercent%; fi) $(if [ $ramused = true ]; then echo mem: $memkbmb $memunit; fi) $(if [ $swap = true ]; then echo swap: $swapkbmb $swapunit; fi) $(if [ $netspeed = true ]; then echo net u: $upkbmb $upunit d: $downkbmb $downunit; fi)
}}}
/***
|''Name:''|TWMacro|
|''Version:''||
|''Source:''|[[AiddlyWiki|http://aiddlywiki.sourceforge.net]]|
|''Author:''|[[Arphen Lin|mailto:arphenlin@gmail.com]]|
|''Type:''|WikiBar addon|
|''Required:''|WikiBar 2.0.0+|
!Description
support TiddlyWiki macro syntaxes
!Installation
#install WikiBar at first
#create your addon as a tiddler with tag 'wikibarAddons'
!Code
***/
//{{{

//----------------------------------------------------------------------------
// addon install function: this is a must
//----------------------------------------------------------------------------
function wikibar_addonInstall(unused){

  // register tools
  wikibarStore.macro = {
    TYPE: 'MENU',
    TOOLTIP: 'system macros',
    systemInfo:{
      TYPE: 'MENU',
      CAPTION:'system information',
      allTags:{
  			TOOLTIP:'display all TiddlyWiki tags',
  			syntax: '<<allTags>>',
  			HANDLER: wikibar_editFormatByWord
  		},
  		tag:{
  			TOOLTIP:'display specified tag',
  			syntax: '<<tag %1>>',
  			HANDLER: wikibar_getMacroParam,
  			doMore: wikibar_editFormatByWord,
  			param: 	'tagName(ex: systemConfig)'
  		},
  		message:{
  		  TOOLTIP:'get system message',
  		  syntax:'<<message %1>>',
  			HANDLER: wikibar_getMacroParam,
  			doMore: wikibar_editFormatByWord,
  			param: 	'customConfigError'
  		},
  		option:{
  			TOOLTIP:'display specified option',
  			syntax: '<<option %1>>[%2]\n',
  			HANDLER: wikibar_getMacroParam,
  			doMore: wikibar_editFormatByWord,
  			param: 	'chkOpenInNewWindow \"Open link in new window\"'
  		},
  		saveChanges:{
  			TOOLTIP:'save changes',
  			syntax: '<<saveChanges>>',
  			HANDLER: wikibar_editFormatByWord
  		},
  		search:{
  			TOOLTIP:'display search button and input box',
  			syntax: '<<search>>',
  			HANDLER: wikibar_editFormatByWord
  		},
  		timeline:{
  		  TYPE:'MENU',
  		  TOOLTIP:'list tiddlers in date order',
  		  modified:{
    			TOOLTIP:'list tiddlers in modified date order',
    			syntax: '<<timeline>>',
    			HANDLER: wikibar_editFormatByWord
    		},
    		created:{
    			TOOLTIP:'list tiddlers in created date order',
    			syntax: '<<timeline created>>',
    			HANDLER: wikibar_editFormatByWord
    		}
  		},
  		version:{
  			TOOLTIP:'display TiddlyWiki version',
  			syntax: '<<version>>',
  			HANDLER: wikibar_editFormatByWord
  		},
      list:{
        TYPE: 'MENU',
    		list:{
    			TOOLTIP:'list all tiddlers in alphabetical order',
    			syntax: '<<list>>',
    			HANDLER: wikibar_editFormatByWord
    		},
    		listMissing:{
    		  CAPTION:'list missing',
    			TOOLTIP:'list all undefined tiddlers',
    			syntax: '<<list missing>>',
    			HANDLER: wikibar_editFormatByWord
    		},
    		listOrphans:{
    			CAPTION:'list orphans',
    		  TOOLTIP:'tiddlers that are not linked to from any other tiddlers',
    			syntax: '<<list orphans>>',
    			HANDLER: wikibar_editFormatByWord
    		}
      }
    },  // systemInfo
    tiddlerOperate:{
      TYPE: 'MENU',
      CAPTION:'tiddler operation',
  		newJournal:{
  			TOOLTIP:'create a new tiddler from current date and time',
  			syntax: '<<newJournal %1>>',
  			HANDLER:   wikibar_getMacroParam,
  			doMore: wikibar_editFormatByWord,
  			param: 	'\"journal title\"'
  		},
  		newTiddler:{
  			TOOLTIP:'create new tiddler',
  			syntax: '<<newTiddler>>',
  			HANDLER: wikibar_editFormatByWord
  		},
  		closeAll:{
  			TOOLTIP:'close all tiddlers',
  			syntax: '<<closeAll>>',
  			HANDLER: wikibar_editFormatByWord
  		}
    },  // tiddlerOperate
    tiddlerInfo:{
      TYPE: 'MENU',
      CAPTION:'tiddler information',
  		tiddler:{
  			TOOLTIP:'display specified tiddler text',
  			syntax: '<<tiddler %1>>',
  			HANDLER: wikibar_getMacroParam,
  			doMore: wikibar_editFormatByWord,
  			param: 	'tiddlerTitle'
  		}
    },  // tiddlerInfo
    template:{
      TYPE:'MENU',
      CAPTION:'template only',
      toolbar:{
        TYPE:'MENU',
        TOOLTIP:'toolbar macro command',
    		closeTiddler:{
    			TOOLTIP:    'close current tiddler',
    			syntax: 'closeTiddler',
    			HANDLER: wikibar_editFormatByWord
    		},
    		closeOthers:{
    			TOOLTIP:    'close other opened tiddlers',
    			syntax: 'closeOthers',
    			HANDLER: wikibar_editFormatByWord
    		},
    		editTiddler:{
    			TOOLTIP:    'edit current tiddler',
    			syntax: 'editTiddler',
    			HANDLER: wikibar_editFormatByWord
    		},
    		saveTiddler:{
    			TOOLTIP:    'save current tiddler',
    			syntax: 'saveTiddler',
    			HANDLER: wikibar_editFormatByWord
    		},
    		cancelTiddler:{
    			TOOLTIP:    'cancel current tiddler',
    			syntax: 'cancelTiddler',
    			HANDLER: wikibar_editFormatByWord
    		},
    		deleteTiddler:{
    			TOOLTIP:    'delete current tiddler',
    			syntax: 'deleteTiddler',
    			HANDLER: wikibar_editFormatByWord
    		},
    		permalink:{
    			TOOLTIP:'display current tiddler link',
    			syntax: 'permalink',
    			HANDLER: wikibar_editFormatByWord
    		},
    		references:{
    			TOOLTIP:'current tiddler references',
    			syntax: 'references',
    			HANDLER: wikibar_editFormatByWord
    		},
    		jump:{
    			TOOLTIP:'jump to other opened tiddler',
    			syntax: 'jump',
    			HANDLER: wikibar_editFormatByWord
    		},
    		tagChooser:{
    			TOOLTIP:'add tag(s) to current tiddler',
    			syntax: 'tagChooser',
    			HANDLER: wikibar_editFormatByWord
    		}
      },
      edit:{
        TYPE:'MENU',
        editTitle:{
          CAPTION:'edit title',
    			TOOLTIP:'display title input box',
    			syntax: "macro='edit title'",
    			HANDLER: wikibar_editFormatByWord
        },
        editTags:{
          CAPTION:'edit tags',
    			TOOLTIP:'display tags input box',
    			syntax: "macro='edit tags'",
    			HANDLER: wikibar_editFormatByWord
        },
        editText:{
          CAPTION:'edit text',
    			TOOLTIP:'display tiddler text edit box',
    			syntax: "macro='edit text'",
    			HANDLER: wikibar_editFormatByWord
        }
      },
      view:{
        TYPE:'MENU',
        viewTitle:{
          CAPTION:'view title',
    			TOOLTIP:'display title',
    			syntax: "macro='view title'",
    			HANDLER: wikibar_editFormatByWord
        },
        viewTags:{
          CAPTION:'view tags',
    			TOOLTIP:'display tags',
    			syntax: "macro='view tags'",
    			HANDLER: wikibar_editFormatByWord
        },
        viewText:{
          CAPTION:'view text',
    			TOOLTIP:'display tiddler text',
    			syntax: "macro='view text'",
    			HANDLER: wikibar_editFormatByWord
        }
      }
    },
    misc:{
      TYPE: 'MENU',
  		gradient:{
  			TOOLTIP:    'gradient',
  			syntax: '<<gradient vert %1 #ffffff %1>>user_text\n>>',
  			HANDLER: wikibar_getColorCode,
  			doMore: wikibar_editFormatByWord
  		},
  		slider:{
  			TOOLTIP:    'slider',
  			syntax: '<<slider %1 %2 %3>>',
  			HANDLER:   wikibar_getMacroParam,
  			doMore: wikibar_editFormatByWord,
  			param: 	'sliderID sliderTiddler sliderLabel'
  		},
  		sparkline:{
  			TOOLTIP:    'sparkline',
  			syntax: '<<sparkline %N>>',
  			HANDLER:   wikibar_getMacroParam,
  			doMore: wikibar_editFormatByWord,
  			param:	'number_list(ex: 100 123 ...)'
  		},
  		tabs:{
  			TOOLTIP:    'tabs',
  			syntax: '<<tabs [%N]>>',
  			HANDLER:   wikibar_getMacroParam,
  			doMore: wikibar_editFormatByWord,
  			param: 	'indentifier tabLabel tabName Tiddler'
  		},
  		today:{
  			TOOLTIP:    'today',
  			syntax: '<<today [%1]>>',
  			HANDLER:   wikibar_getMacroParam,
  			doMore: wikibar_editFormatByWord,
  			param:  '"YYYY/MM/DD hh:mm:ss"'
  		}
    } // misc
  };  // macro

}

//}}}
//{{{
// for debugging: you can turn it off in final release ----------------------
wikibar_addonInstall();
//}}}
<<allTags excludeLists>>
<<tabs txtMoreTab "Tags" "All Tags" TabAllTags "Miss" "Missing tiddlers" TabMoreMissing "Orph" "Orphaned tiddlers" TabMoreOrphans "Shad" "Shadowed tiddlers" TabMoreShadowed>>
<<allTags excludeLists [a-z]>>
/***
|Name:|TagglyTaggingPlugin|
|Description:|tagglyTagging macro is a replacement for the builtin tagging macro in your ViewTemplate|
|Version:|3.3.1 ($Rev: 9828 $)|
|Date:|$Date: 2009-06-03 21:38:41 +1000 (Wed, 03 Jun 2009) $|
|Source:|http://mptw.tiddlyspot.com/#TagglyTaggingPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!Notes
See http://mptw.tiddlyspot.com/#TagglyTagging
***/
//{{{

merge(String.prototype,{

	parseTagExpr: function(debug) {

		if (this.trim() == "")
			return "(true)";

		var anyLogicOp = /(!|&&|\|\||\(|\))/g;
		var singleLogicOp = /^(!|&&|\|\||\(|\))$/;

		var spaced = this.
			// because square brackets in templates are no good
			// this means you can use [(With Spaces)] instead of [[With Spaces]]
			replace(/\[\(/g," [[").
			replace(/\)\]/g,"]] "). 
			// space things out so we can use readBracketedList. tricky eh?
			replace(anyLogicOp," $1 ");

		var expr = "";

		var tokens = spaced.readBracketedList(false); // false means don't uniq the list. nice one JR!

		for (var i=0;i<tokens.length;i++)
			if (tokens[i].match(singleLogicOp))
				expr += tokens[i];
			else
				expr += "tiddler.tags.contains('%0')".format([tokens[i].replace(/'/,"\\'")]); // fix single quote bug. still have round bracket bug i think

		if (debug)
			alert(expr);

		return '('+expr+')';
	}

});

merge(TiddlyWiki.prototype,{
	getTiddlersByTagExpr: function(tagExpr,sortField) {

		var result = [];

		var expr = tagExpr.parseTagExpr();

		store.forEachTiddler(function(title,tiddler) {
			if (eval(expr))
				result.push(tiddler);
		});

		if(!sortField)
			sortField = "title";

		result.sort(function(a,b) {return a[sortField] < b[sortField] ? -1 : (a[sortField] == b[sortField] ? 0 : +1);});
		
		return result;
	}
});

config.taggly = {

	// for translations
	lingo: {
		labels: {
			asc:        "\u2191", // down arrow
			desc:       "\u2193", // up arrow
			title:      "title",
			modified:   "modified",
			created:    "created",
			show:       "+",
			hide:       "-",
			normal:     "normal",
			group:      "group",
			commas:     "commas",
			sitemap:    "sitemap",
			numCols:    "cols\u00b1", // plus minus sign
			label:      "Tagged as '%0':",
			exprLabel:  "Matching tag expression '%0':",
			excerpts:   "excerpts",
			descr:      "descr",
			slices:     "slices",
			contents:   "contents",
			sliders:    "sliders",
			noexcerpts: "title only",
			noneFound:  "(none)"
		},

		tooltips: {
			title:      "Click to sort by title",
			modified:   "Click to sort by modified date",
			created:    "Click to sort by created date",
			show:       "Click to show tagging list",
			hide:       "Click to hide tagging list",
			normal:     "Click to show a normal ungrouped list",
			group:      "Click to show list grouped by tag",
			sitemap:    "Click to show a sitemap style list",
			commas:     "Click to show a comma separated list",
			numCols:    "Click to change number of columns",
			excerpts:   "Click to show excerpts",
			descr:      "Click to show the description slice",
			slices:     "Click to show all slices",
			contents:   "Click to show entire tiddler contents",
			sliders:    "Click to show tiddler contents in sliders",
			noexcerpts: "Click to show entire title only"
		},

		tooDeepMessage: "* //sitemap too deep...//"
	},

	config: {
		showTaggingCounts: true,
		listOpts: {
			// the first one will be the default
			sortBy:     ["title","modified","created"],
			sortOrder:  ["asc","desc"],
			hideState:  ["show","hide"],
			listMode:   ["normal","group","sitemap","commas"],
			numCols:    ["1","2","3","4","5","6"],
			excerpts:   ["noexcerpts","excerpts","descr","slices","contents","sliders"]
		},
		valuePrefix: "taggly.",
		excludeTags: ["excludeLists","excludeTagging"],
		excerptSize: 50,
		excerptMarker: "/%"+"%/",
		siteMapDepthLimit: 25
	},

	getTagglyOpt: function(title,opt) {
		var val = store.getValue(title,this.config.valuePrefix+opt);
		return val ? val : this.config.listOpts[opt][0];
	},

	setTagglyOpt: function(title,opt,value) {
		// create it silently if it doesn't exist
		if (!store.tiddlerExists(title)) {
			store.saveTiddler(title,title,config.views.editor.defaultText.format([title]),config.options.txtUserName,new Date(),"");

			// <<tagglyTagging expr:"...">> creates a tiddler to store its display settings
			// Make those tiddlers less noticeable by tagging as excludeSearch and excludeLists
			// Because we don't want to hide real tags, check that they aren't actually tags before doing so
			// Also tag them as tagglyExpression for manageability
			// (contributed by RA)
			if (!store.getTaggedTiddlers(title).length) {
				store.setTiddlerTag(title,true,"excludeSearch");
				store.setTiddlerTag(title,true,"excludeLists");
				store.setTiddlerTag(title,true,"tagglyExpression");
			}
		}

		// if value is default then remove it to save space
		return store.setValue(title, this.config.valuePrefix+opt, value == this.config.listOpts[opt][0] ? null : value);
	},

	getNextValue: function(title,opt) {
		var current = this.getTagglyOpt(title,opt);
		var pos = this.config.listOpts[opt].indexOf(current);
		// supposed to automagically don't let cols cycle up past the number of items
		// currently broken in some situations, eg when using an expression
		// lets fix it later when we rewrite for jquery
		// the columns thing should be jquery table manipulation probably
		var limit = (opt == "numCols" ? store.getTaggedTiddlers(title).length : this.config.listOpts[opt].length);
		var newPos = (pos + 1) % limit;
		return this.config.listOpts[opt][newPos];
	},

	toggleTagglyOpt: function(title,opt) {
		var newVal = this.getNextValue(title,opt);
		this.setTagglyOpt(title,opt,newVal);
	}, 

	createListControl: function(place,title,type) {
		var lingo = config.taggly.lingo;
		var label;
		var tooltip;
		var onclick;

		if ((type == "title" || type == "modified" || type == "created")) {
			// "special" controls. a little tricky. derived from sortOrder and sortBy
			label = lingo.labels[type];
			tooltip = lingo.tooltips[type];

			if (this.getTagglyOpt(title,"sortBy") == type) {
				label += lingo.labels[this.getTagglyOpt(title,"sortOrder")];
				onclick = function() {
					config.taggly.toggleTagglyOpt(title,"sortOrder");
					return false;
				}
			}
			else {
				onclick = function() {
					config.taggly.setTagglyOpt(title,"sortBy",type);
					config.taggly.setTagglyOpt(title,"sortOrder",config.taggly.config.listOpts.sortOrder[0]);
					return false;
				}
			}
		}
		else {
			// "regular" controls, nice and simple
			label = lingo.labels[type == "numCols" ? type : this.getNextValue(title,type)];
			tooltip = lingo.tooltips[type == "numCols" ? type : this.getNextValue(title,type)];
			onclick = function() {
				config.taggly.toggleTagglyOpt(title,type);
				return false;
			}
		}

		// hide button because commas don't have columns
		if (!(this.getTagglyOpt(title,"listMode") == "commas" && type == "numCols"))
			createTiddlyButton(place,label,tooltip,onclick,type == "hideState" ? "hidebutton" : "button");
	},

	makeColumns: function(orig,numCols) {
		var listSize = orig.length;
		var colSize = listSize/numCols;
		var remainder = listSize % numCols;

		var upperColsize = colSize;
		var lowerColsize = colSize;

		if (colSize != Math.floor(colSize)) {
			// it's not an exact fit so..
			upperColsize = Math.floor(colSize) + 1;
			lowerColsize = Math.floor(colSize);
		}

		var output = [];
		var c = 0;
		for (var j=0;j<numCols;j++) {
			var singleCol = [];
			var thisSize = j < remainder ? upperColsize : lowerColsize;
			for (var i=0;i<thisSize;i++) 
				singleCol.push(orig[c++]);
			output.push(singleCol);
		}

		return output;
	},

	drawTable: function(place,columns,theClass) {
		var newTable = createTiddlyElement(place,"table",null,theClass);
		var newTbody = createTiddlyElement(newTable,"tbody");
		var newTr = createTiddlyElement(newTbody,"tr");
		for (var j=0;j<columns.length;j++) {
			var colOutput = "";
			for (var i=0;i<columns[j].length;i++) 
				colOutput += columns[j][i];
			var newTd = createTiddlyElement(newTr,"td",null,"tagglyTagging"); // todo should not need this class
			wikify(colOutput,newTd);
		}
		return newTable;
	},

	createTagglyList: function(place,title,isTagExpr) {
		switch(this.getTagglyOpt(title,"listMode")) {
			case "group":  return this.createTagglyListGrouped(place,title,isTagExpr); break;
			case "normal": return this.createTagglyListNormal(place,title,false,isTagExpr); break;
			case "commas": return this.createTagglyListNormal(place,title,true,isTagExpr); break;
			case "sitemap":return this.createTagglyListSiteMap(place,title,isTagExpr); break;
		}
	},

	getTaggingCount: function(title,isTagExpr) {
		// thanks to Doug Edmunds
		if (this.config.showTaggingCounts) {
			var tagCount = config.taggly.getTiddlers(title,'title',isTagExpr).length;
			if (tagCount > 0)
				return " ("+tagCount+")";
		}
		return "";
	},

	getTiddlers: function(titleOrExpr,sortBy,isTagExpr) {
		return isTagExpr ? store.getTiddlersByTagExpr(titleOrExpr,sortBy) : store.getTaggedTiddlers(titleOrExpr,sortBy);
	},

	getExcerpt: function(inTiddlerTitle,title,indent) {
		if (!indent)
			indent = 1;

		var displayMode = this.getTagglyOpt(inTiddlerTitle,"excerpts");
		var t = store.getTiddler(title);

		if (t && displayMode == "excerpts") {
			var text = t.text.replace(/\n/," ");
			var marker = text.indexOf(this.config.excerptMarker);
			if (marker != -1) {
				return " {{excerpt{<nowiki>" + text.substr(0,marker) + "</nowiki>}}}";
			}
			else if (text.length < this.config.excerptSize) {
				return " {{excerpt{<nowiki>" + t.text + "</nowiki>}}}";
			}
			else {
				return " {{excerpt{<nowiki>" + t.text.substr(0,this.config.excerptSize) + "..." + "</nowiki>}}}";
			}
		}
		else if (t && displayMode == "contents") {
			return "\n{{contents indent"+indent+"{\n" + t.text + "\n}}}";
		}
		else if (t && displayMode == "sliders") {
			return "<slider slide>\n{{contents{\n" + t.text + "\n}}}\n</slider>";
		}
		else if (t && displayMode == "descr") {
			var descr = store.getTiddlerSlice(title,'Description');
			return descr ? " {{excerpt{" + descr  + "}}}" : "";
		}
		else if (t && displayMode == "slices") {
			var result = "";
			var slices = store.calcAllSlices(title);
			for (var s in slices)
				result += "|%0|<nowiki>%1</nowiki>|\n".format([s,slices[s]]);
			return result ? "\n{{excerpt excerptIndent{\n" + result  + "}}}" : "";
		}
		return "";
	},

	notHidden: function(t,inTiddler) {
		if (typeof t == "string") 
			t = store.getTiddler(t);
		return (!t || !t.tags.containsAny(this.config.excludeTags) ||
				(inTiddler && this.config.excludeTags.contains(inTiddler)));
	},

	// this is for normal and commas mode
	createTagglyListNormal: function(place,title,useCommas,isTagExpr) {

		var list = config.taggly.getTiddlers(title,this.getTagglyOpt(title,"sortBy"),isTagExpr);

		if (this.getTagglyOpt(title,"sortOrder") == "desc")
			list = list.reverse();

		var output = [];
		var first = true;
		for (var i=0;i<list.length;i++) {
			if (this.notHidden(list[i],title)) {
				var countString = this.getTaggingCount(list[i].title);
				var excerpt = this.getExcerpt(title,list[i].title);
				if (useCommas)
					output.push((first ? "" : ", ") + "[[" + list[i].title + "]]" + countString + excerpt);
				else
					output.push("*[[" + list[i].title + "]]" + countString + excerpt + "\n");

				first = false;
			}
		}

		return this.drawTable(place,
			this.makeColumns(output,useCommas ? 1 : parseInt(this.getTagglyOpt(title,"numCols"))),
			useCommas ? "commas" : "normal");
	},

	// this is for the "grouped" mode
	createTagglyListGrouped: function(place,title,isTagExpr) {
		var sortBy = this.getTagglyOpt(title,"sortBy");
		var sortOrder = this.getTagglyOpt(title,"sortOrder");

		var list = config.taggly.getTiddlers(title,sortBy,isTagExpr);

		if (sortOrder == "desc")
			list = list.reverse();

		var leftOvers = []
		for (var i=0;i<list.length;i++)
			leftOvers.push(list[i].title);

		var allTagsHolder = {};
		for (var i=0;i<list.length;i++) {
			for (var j=0;j<list[i].tags.length;j++) {

				if (list[i].tags[j] != title) { // not this tiddler

					if (this.notHidden(list[i].tags[j],title)) {

						if (!allTagsHolder[list[i].tags[j]])
							allTagsHolder[list[i].tags[j]] = "";

						if (this.notHidden(list[i],title)) {
							allTagsHolder[list[i].tags[j]] += "**[["+list[i].title+"]]"
										+ this.getTaggingCount(list[i].title) + this.getExcerpt(title,list[i].title) + "\n";

							leftOvers.setItem(list[i].title,-1); // remove from leftovers. at the end it will contain the leftovers

						}
					}
				}
			}
		}

		var allTags = [];
		for (var t in allTagsHolder)
			allTags.push(t);

		var sortHelper = function(a,b) {
			if (a == b) return 0;
			if (a < b) return -1;
			return 1;
		};

		allTags.sort(function(a,b) {
			var tidA = store.getTiddler(a);
			var tidB = store.getTiddler(b);
			if (sortBy == "title") return sortHelper(a,b);
			else if (!tidA && !tidB) return 0;
			else if (!tidA) return -1;
			else if (!tidB) return +1;
			else return sortHelper(tidA[sortBy],tidB[sortBy]);
		});

		var leftOverOutput = "";
		for (var i=0;i<leftOvers.length;i++)
			if (this.notHidden(leftOvers[i],title))
				leftOverOutput += "*[["+leftOvers[i]+"]]" + this.getTaggingCount(leftOvers[i]) + this.getExcerpt(title,leftOvers[i]) + "\n";

		var output = [];

		if (sortOrder == "desc")
			allTags.reverse();
		else if (leftOverOutput != "")
			// leftovers first...
			output.push(leftOverOutput);

		for (var i=0;i<allTags.length;i++)
			if (allTagsHolder[allTags[i]] != "")
				output.push("*[["+allTags[i]+"]]" + this.getTaggingCount(allTags[i]) + this.getExcerpt(title,allTags[i]) + "\n" + allTagsHolder[allTags[i]]);

		if (sortOrder == "desc" && leftOverOutput != "")
			// leftovers last...
			output.push(leftOverOutput);

		return this.drawTable(place,
				this.makeColumns(output,parseInt(this.getTagglyOpt(title,"numCols"))),
				"grouped");

	},

	// used to build site map
	treeTraverse: function(title,depth,sortBy,sortOrder,isTagExpr) {

		var list = config.taggly.getTiddlers(title,sortBy,isTagExpr);

		if (sortOrder == "desc")
			list.reverse();

		var indent = "";
		for (var j=0;j<depth;j++)
			indent += "*"

		var childOutput = "";

		if (depth > this.config.siteMapDepthLimit)
			childOutput += indent + this.lingo.tooDeepMessage;
		else
			for (var i=0;i<list.length;i++)
				if (list[i].title != title)
					if (this.notHidden(list[i].title,this.config.inTiddler))
						childOutput += this.treeTraverse(list[i].title,depth+1,sortBy,sortOrder,false);

		if (depth == 0)
			return childOutput;
		else
			return indent + "[["+title+"]]" + this.getTaggingCount(title) + this.getExcerpt(this.config.inTiddler,title,depth) + "\n" + childOutput;
	},

	// this if for the site map mode
	createTagglyListSiteMap: function(place,title,isTagExpr) {
		this.config.inTiddler = title; // nasty. should pass it in to traverse probably
		var output = this.treeTraverse(title,0,this.getTagglyOpt(title,"sortBy"),this.getTagglyOpt(title,"sortOrder"),isTagExpr);
		return this.drawTable(place,
				this.makeColumns(output.split(/(?=^\*\[)/m),parseInt(this.getTagglyOpt(title,"numCols"))), // regexp magic
				"sitemap"
				);
	},

	macros: {
		tagglyTagging: {
			handler: function (place,macroName,params,wikifier,paramString,tiddler) {
				var parsedParams = paramString.parseParams("tag",null,true);
				var refreshContainer = createTiddlyElement(place,"div");

				// do some refresh magic to make it keep the list fresh - thanks Saq
				refreshContainer.setAttribute("refresh","macro");
				refreshContainer.setAttribute("macroName",macroName);

				var tag = getParam(parsedParams,"tag");
				var expr = getParam(parsedParams,"expr");

				if (expr) {
					refreshContainer.setAttribute("isTagExpr","true");
					refreshContainer.setAttribute("title",expr);
					refreshContainer.setAttribute("showEmpty","true");
				}
				else {
					refreshContainer.setAttribute("isTagExpr","false");
					if (tag) {
        				refreshContainer.setAttribute("title",tag);
						refreshContainer.setAttribute("showEmpty","true");
					}
					else {
        				refreshContainer.setAttribute("title",tiddler.title);
						refreshContainer.setAttribute("showEmpty","false");
					}
				}
				this.refresh(refreshContainer);
			},

			refresh: function(place) {
				var title = place.getAttribute("title");
				var isTagExpr = place.getAttribute("isTagExpr") == "true";
				var showEmpty = place.getAttribute("showEmpty") == "true";
				removeChildren(place);
				addClass(place,"tagglyTagging");
				var countFound = config.taggly.getTiddlers(title,'title',isTagExpr).length
				if (countFound > 0 || showEmpty) {
					var lingo = config.taggly.lingo;
					config.taggly.createListControl(place,title,"hideState");
					if (config.taggly.getTagglyOpt(title,"hideState") == "show") {
						createTiddlyElement(place,"span",null,"tagglyLabel",
								isTagExpr ? lingo.labels.exprLabel.format([title]) : lingo.labels.label.format([title]));
						config.taggly.createListControl(place,title,"title");
						config.taggly.createListControl(place,title,"modified");
						config.taggly.createListControl(place,title,"created");
						config.taggly.createListControl(place,title,"listMode");
						config.taggly.createListControl(place,title,"excerpts");
						config.taggly.createListControl(place,title,"numCols");
						config.taggly.createTagglyList(place,title,isTagExpr);
						if (countFound == 0 && showEmpty)
							createTiddlyElement(place,"div",null,"tagglyNoneFound",lingo.labels.noneFound);
					}
				}
			}
		}
	},

	// todo fix these up a bit
	styles: [
"/*{{{*/",
"/* created by TagglyTaggingPlugin */",
".tagglyTagging { padding-top:0.5em; }",
".tagglyTagging li.listTitle { display:none; }",
".tagglyTagging ul {",
"	margin-top:0px; padding-top:0.5em; padding-left:2em;",
"	margin-bottom:0px; padding-bottom:0px;",
"}",
".tagglyTagging { vertical-align: top; margin:0px; padding:0px; }",
".tagglyTagging table { margin:0px; padding:0px; }",
".tagglyTagging .button { visibility:hidden; margin-left:3px; margin-right:3px; }",
".tagglyTagging .button, .tagglyTagging .hidebutton {",
"	color:[[ColorPalette::TertiaryLight]]; font-size:90%;",
"	border:0px; padding-left:0.3em;padding-right:0.3em;",
"}",
".tagglyTagging .button:hover, .hidebutton:hover, ",
".tagglyTagging .button:active, .hidebutton:active  {",
"	border:0px; background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]];",
"}",
".selected .tagglyTagging .button { visibility:visible; }",
".tagglyTagging .hidebutton { color:[[ColorPalette::Background]]; }",
".selected .tagglyTagging .hidebutton { color:[[ColorPalette::TertiaryLight]] }",
".tagglyLabel { color:[[ColorPalette::TertiaryMid]]; font-size:90%; }",
".tagglyTagging ul {padding-top:0px; padding-bottom:0.5em; margin-left:1em; }",
".tagglyTagging ul ul {list-style-type:disc; margin-left:-1em;}",
".tagglyTagging ul ul li {margin-left:0.5em; }",
".editLabel { font-size:90%; padding-top:0.5em; }",
".tagglyTagging .commas { padding-left:1.8em; }",
"/* not technically tagglytagging but will put them here anyway */",
".tagglyTagged li.listTitle { display:none; }",
".tagglyTagged li { display: inline; font-size:90%; }",
".tagglyTagged ul { margin:0px; padding:0px; }",
".excerpt { color:[[ColorPalette::TertiaryDark]]; }",
".excerptIndent { margin-left:4em; }",
"div.tagglyTagging table,",
"div.tagglyTagging table tr,",
"td.tagglyTagging",
" {border-style:none!important; }",
".tagglyTagging .contents { border-bottom:2px solid [[ColorPalette::TertiaryPale]]; padding:0 1em 1em 0.5em;",
"  margin-bottom:0.5em; }",
".tagglyTagging .indent1  { margin-left:3em;  }",
".tagglyTagging .indent2  { margin-left:4em;  }",
".tagglyTagging .indent3  { margin-left:5em;  }",
".tagglyTagging .indent4  { margin-left:6em;  }",
".tagglyTagging .indent5  { margin-left:7em;  }",
".tagglyTagging .indent6  { margin-left:8em;  }",
".tagglyTagging .indent7  { margin-left:9em;  }",
".tagglyTagging .indent8  { margin-left:10em; }",
".tagglyTagging .indent9  { margin-left:11em; }",
".tagglyTagging .indent10 { margin-left:12em; }",
".tagglyNoneFound { margin-left:2em; color:[[ColorPalette::TertiaryMid]]; font-size:90%; font-style:italic; }",
"/*}}}*/",
		""].join("\n"),

	init: function() {
		merge(config.macros,this.macros);
		config.shadowTiddlers["TagglyTaggingStyles"] = this.styles;
		store.addNotification("TagglyTaggingStyles",refreshStyles);
	}
};

config.taggly.init();

//}}}

/***
InlineSlidersPlugin
By Saq Imtiaz
http://tw.lewcid.org/sandbox/#InlineSlidersPlugin

// syntax adjusted to not clash with NestedSlidersPlugin
// added + syntax to start open instead of closed

***/
//{{{
config.formatters.unshift( {
	name: "inlinesliders",
	// match: "\\+\\+\\+\\+|\\<slider",
	match: "\\<slider",
	// lookaheadRegExp: /(?:\+\+\+\+|<slider) (.*?)(?:>?)\n((?:.|\n)*?)\n(?:====|<\/slider>)/mg,
	lookaheadRegExp: /(?:<slider)(\+?) (.*?)(?:>)\n((?:.|\n)*?)\n(?:<\/slider>)/mg,
	handler: function(w) {
		this.lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart ) {
			var btn = createTiddlyButton(w.output,lookaheadMatch[2] + " "+"\u00BB",lookaheadMatch[2],this.onClickSlider,"button sliderButton");
			var panel = createTiddlyElement(w.output,"div",null,"sliderPanel");
			panel.style.display = (lookaheadMatch[1] == '+' ? "block" : "none");
			wikify(lookaheadMatch[3],panel);
			w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
		}
   },
   onClickSlider : function(e) {
		if(!e) var e = window.event;
		var n = this.nextSibling;
		n.style.display = (n.style.display=="none") ? "block" : "none";
		return false;
	}
});

//}}}

/***
|Name|TiddlerEncryptionPlugin|
|Author|Lyall Pearce|
|Source|http://www.Remotely-Helpful.com/TiddlyWiki/TiddlerEncryptionPlugin.html|
|License|[[Creative Commons Attribution-Share Alike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|Version|3.2.1|
|~CoreVersion|2.4.0|
|Requires|None|
|Overrides|store.getSaver().externalizeTiddler(), store.getTiddler() and store.getTiddlerText()|
|Description|Encrypt/Decrypt Tiddlers with a Password key|

!!!!!Usage
<<<
* Tag a tiddler with Encrypt(prompt)
** Consider the 'prompt' something to help you remember the password with. If multiple tiddlers can be encrypted with the same 'prompt' and you will only be asked for the password once.
* Upon save, the Tiddler will be encrypted and the tag replaced with Decrypt(prompt).
** Failure to encrypt (by not entering a password) will leave the tiddler unencrypted and will leave the Encrypt(prompt) tag in place. This means that the next time you save, you will be asked for the password again.
** To have multiple tiddlers use the same password - simply use the same 'prompt'.
** Tiddlers that are encrypted may be automatically tagged 'excludeSearch' as there is no point in searching encrypted data - this is configurable by an option - you still may want to search the titles of encrypted tiddlers
** Tiddlers that are encrypted may be automatically tagged 'excludeLists', if you have them encrypted, you may also want to keep them 'hidden' - this is configurable by an option.
** Automatic removal of excludeLists and excludeSearch tags is performed, if the above two options are set, only if these two tags are the last 2 tags for a tiddler, if they are positioned somewhere else in the tags list, they will be left in place, meaning that the decrypted tiddler will not be searchable and/or will not appear in lists.
** Encrypted tiddlers are stored as displayable hex, to keep things visibly tidy, should you display an encrypted tiddler. There is nothing worse than seeing a pile of gobbledy gook on your screen. Additionally, the encrypted data is easily cut/paste/emailed if displayed in hex form.
* Tiddlers are decrypted only if you click the decrypt button or the decryptAll button, not when you load the TiddlyWiki
** If you don't display a tiddler, you won't have the option to decrypt it (unless you use the {{{<<EncryptionDecryptAll>>}}} macro)
** Tiddlers will re-encrypt automatically on save.
** Decryption of Tiddlers does not make your TiddlyWiki 'dirty' - you will not be asked to save if you leave the page.
* Errors are reported via diagnostic messages.
** Empty passwords, on save, will result in the tiddler being saved unencrypted - this should only occur with new tiddlers, decrypted tiddlers or with tiddlers who have had their 'prompt' tag changed.
** Encrypted tiddlers know if they are decrypted successfully - failure to decrypt a tiddler will ''not'' lose your data.
** Editing of an encrypted (that has not been unencrypted) tiddler will result in loss of that tiddler as the SHA1 checksums will no longer match, upon decryption. To this end, it is best that you do not check the option. You can, however edit an encrypted tiddler tag list - just do ''not'' change the tiddler contents.
** To change the password on a Tiddler, change the Encrypt('prompt') tag to a new prompt value, after decrypting the tiddler.
** You can edit the tags of an encrypted tiddler, so long as you do not edit the text.
** To change the password for all tiddlers of a particular prompt, use the {{{<<EncryptionChangePassword ["button text" ["tooltip text" ["prompt string" ["accessKey"]]]]>>}}} macro.
** To decrypt all tiddlers of a particular "prompt string", use the {{{<<EncryptionDecryptAll ["button text" ["tooltip text" ["prompt string" ["accessKey"]]]]>>}}} macro - this will make tiddlers encrypted with "prompt string" searchable - or prompt for all 'prompt strings', if none is supplied.
<<<
!!!!!Configuration
<<<
Useful Buttons: 
<<EncryptionChangePassword>> - Change passwords of encrypted tiddlers.
<<EncryptionDecryptAll>> - Decrypt ALL tiddlers - enables searching contents of encrypted tiddlers.
<<option chkExcludeEncryptedFromSearch>> - If set, Encrypted Tiddlers are excluded from searching by tagging with excludeSearch. If Clear, excludeSearch is not added and it is also removed from existing Encrypted Tiddlers only if it is the last Tag. Searching of Encrypted Tiddlers is only meaningful for the Title and Tags.
<<option chkExcludeEncryptedFromLists>> - If set, Encrypted Tiddlers are excluded from lists by tagging with excludeLists. If Clear, excludeLists is not added and it is also removed from existing Encrypted Tiddlers only if it is the last Tag. Preventing encrypted tiddlers from appearing in lists effectively hides them.
<<option chkShowDecryptButtonInContent>> - If set, Encrypted Tiddlers content is replaced by <<EncryptionDecryptThis>> button. This has consequences, in the current version as, if you edit the tiddler without decrypting it, you lose the contents.
<<<
!!!!!Revision History
<<<
* 3.2.1 - Returned the <<EncryptionDecryptThis>> button as an option.
* 3.2.0 - Ditched the 'Decrypt' button showing up in the tiddler contents if the tiddler is encrypted. It caused too much pain if you edit the tiddler without decrypting it - you lost your data as it was replaced by a Decrypt Macro call!  Additionally, a 'decrypt' button will now appear in the toolbar, just before the edit button, if the tiddler is encrypted. This button only appears if using core TiddlyWiki version 2.4 or above.
* 3.1.1 - Obscure bug whereby if an encrypted tiddler was a certain length, it would refuse to decrypt.
* 3.1.0 - When creating a new Encrypt(prompt) tiddler and you have not previously decrypted a tiddler with the same prompt, on save, you will be prompted for the password to encrypt the tiddler. Prior to encrypting, an attempt to decrypt all other tiddlers with the same prompt, is performed. If any tiddler fails to decrypt, the save is aborted - this is so you don't accidentally have 2 (or more!) passwords for the same prompt. Either you enter the correct password, change the prompt string and try re-saving or you cancel (and the tiddler is saved unencrypted).
* 3.0.1 - Allow Enter to be used for password entry, rather than having to press the OK button.
* 3.0.0 - Major revamp internally to support entry of passwords using forms such that passwords are no longer visible on entry. Completely backward compatible with old encrypted tiddlers. No more using the javascript prompt() function.
<<<
!!!!!Additional work

***/
//{{{
version.extensions.TiddlerEncryptionPlugin = {major: 3, minor: 2, revision: 1, date: new Date(2008,10,26)};

// where I cache the passwords - for want of a better place.
config.encryptionPasswords = new Array();
config.encryptionReEnterPasswords = false;

if(config.options.chkExcludeEncryptedFromSearch == undefined) config.options.chkExcludeEncryptedFromSearch = false;
if(config.options.chkExcludeEncryptedFromLists == undefined) config.options.chkExcludeEncryptedFromLists = false;
if(config.options.chkShowDecryptButtonInContent == undefined) config.options.chkShowDecryptButtonInContent = false;

config.macros.EncryptionChangePassword = {};
config.macros.EncryptionChangePassword.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
    var theButton = createTiddlyButton(place,
				       (params[0] && params[0].length > 0) ? params[0] : "Change Passwords", 
				       (params[1] && params[1].length > 0) ? params[1] : "Change Passwords" + (params[2] ? " for prompt "+params[2] : ""), 
				       onClickEncryptionChangePassword,
				       null,
				       null,
				       params[3]);
    if(params[2] && params[2].length > 0) {
	theButton.setAttribute("promptString", params[2]);
    }
};

config.macros.EncryptionDecryptAll = {};
config.macros.EncryptionDecryptAll.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
    var theButton = createTiddlyButton(place,
				       (params[0] && params[0].length > 0) ? params[0] : "Decrypt All", 
				       (params[1] && params[1].length > 0) ? params[1] : "Decrypt All Tiddlers" + ((params[2] && params[2].length > 0) ? " for prompt "+params[2] : " for a given 'prompt string'"), 
				       onClickEncryptionDecryptAll,
				       null,
				       null,
				       params[3]);
    if(params[2] && params[2].length > 0) {
	theButton.setAttribute("promptString", params[2]);
    }
};

config.macros.EncryptionDecryptThis = {};
config.macros.EncryptionDecryptThis.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
    var theButton = createTiddlyButton(place,
				       (params[0] && params[0].length > 0) ? params[0] : "Decrypt", 
				       (params[1] && params[1].length > 0) ? params[1] : "Decrypt this Tiddler", 
				       onClickEncryptionDecryptThis,
				       null,
				       null,
				       params[3]);
    if(params[2] && params[2].length > 0) {
	theButton.setAttribute("theTiddler", params[2]);
    }
};
// toolbar button to decrypt tiddlers.
config.commands.decryptThis = {
  text: "decrypt",
  tooltip: "Decrypt this tiddler",
  isEnabled : function(tiddler) {
	// Only show decrypt button if tiddler is tagged as Decrypt(
	if(tiddler.tags.join().indexOf('Decrypt(') == -1)  {
	    return false;
	} else {
	    return true;
	}
    },	
  handler: function(event, src, title) {
	encryptionGetAndDecryptTiddler(title);
	return false; 
    }
};
// core version 2.4 or above get a 'decrypt' button in the toolbar.
if(config.shadowTiddlers && config.shadowTiddlers.ToolbarCommands  && config.shadowTiddlers.ToolbarCommands.indexOf('decryptThis') == -1) {
    // put our toolbar button in before the edit button.
    // won't work if editTiddler is not the default item (prefixed with plus)
    config.shadowTiddlers.ToolbarCommands.replace(/\+editTiddler/,'decryptThis +editTiddler');
}


// Called by the EncryptionChangePassword macro/button
// Also invoked by the callback for password entry
function onClickEncryptionChangePassword(eventObject) {
    var promptString;
    if(!promptString && this.getAttribute) {
	promptString = this.getAttribute("promptString");
    }
    // I do call this function directly
    if(!promptString && typeof(eventObject) == "string") {
	promptString = eventObject;
    }
    if(!promptString) {
	promptString = prompt("Enter 'prompt string' to change password for:","");
    }
    if(!promptString) {
	return;
    }
    if(! config.encryptionPasswords[promptString]) {
	var changePasswordContext = {changePasswordPromptString: promptString,
				     callbackFunction: MyChangePasswordPromptCallback_TiddlerEncryptionPlugin};
	MyPrompt_TiddlerEncryptionPlugin(promptString,"",changePasswordContext);
	return;
	// Callback function will re-invoke this function
    }

    // Decrypt ALL tiddlers for that prompt
    onClickEncryptionDecryptAll(promptString);
    // Now ditch the cached password, this will force the re-request for the new password, on save.
    displayMessage("Save TiddlyWiki to set new password for '"+promptString+"'");
    config.encryptionPasswords[promptString] = null;
    // mark store as dirty so a save will be requrested.
    store.setDirty(true);
    autoSaveChanges(); 
    return;
};
// Called by the password entry form when the user clicks 'OK' button.
function MyChangePasswordPromptCallback_TiddlerEncryptionPlugin(context) {
    config.encryptionPasswords[context.passwordPrompt] = context.password;
    onClickEncryptionChangePassword(context.changePasswordPromptString);
    return;
}
// Called by the EncryptionDecryptThis macro/button
function onClickEncryptionDecryptThis() {
    var theTiddler = this.getAttribute("theTiddler");
    if(!theTiddler) {
	return;
    }
    encryptionGetAndDecryptTiddler(theTiddler);
    return;
};

function encryptionGetAndDecryptTiddler(title) {
    config.encryptionReEnterPasswords = true;
    try {
	theTiddler = store.getTiddler(title);
	config.encryptionReEnterPasswords = false;
	story.refreshAllTiddlers();
    } catch (e) {
	if(e == "DecryptionFailed") {
	    displayMessage("Decryption failed");
	    return;
	}
    } // catch
    return;
};

// called by the EncryptionDecryptAlll macro/button
// Also called by the callback after the user clicks 'OK' button on the password entry form
function onClickEncryptionDecryptAll(eventObject) {
    var promptString;
    if(!promptString && this.getAttribute) {
	promptString = this.getAttribute("promptString");
    }
    // I do call this function directly
    if(!promptString && typeof(eventObject) == "string") {
	promptString = eventObject;
    }
    if(!promptString) {
	promptString = "";
    }

    // Loop through all tiddlers, looking to see if there are any Decrypt(promptString) tagged tiddlers
    // If there are, check to see if their password has been cached.
    // If not, ask for the first one that is missing, that we find
    // the call back function will store that password then invoke this function again, 
    // which will repeat the whole process. If we find all passwords have been cached
    // then we will finally do the decryptAll functionality, which will then
    // be able to decrypt all the required tiddlers, without prompting.
    // We have to do this whole rigmarole because we are using a 'form' to enter the password
    // rather than the 'prompt()' function - which shows the value of the password.
    var tagToSearchFor="Decrypt("+promptString;
    config.encryptionReEnterPasswords = true; 
    var promptGenerated = false;
    store.forEachTiddler(function(store,tiddler) {
	    // Note, there is no way to stop the forEachTiddler iterations
	    if(!promptGenerated && tiddler && tiddler.tags) {
		for(var ix=0; ix<tiddler.tags.length && !promptGenerated; ix++) {
		    if(tiddler.tags[ix].indexOf(tagToSearchFor) == 0) {
			var tag = tiddler.tags[ix];
			var lastBracket=tag.lastIndexOf(")");
			if(lastBracket >= 0) {
			    // Ok, tagged with Encrypt(passwordPrompt)
			    // extract the passwordPrompt name
			    var passwordPromptString=tag.substring(8,lastBracket);
			    if(!config.encryptionPasswords[passwordPromptString]) {
				// no password cached, prompt and cache it, rather than decryptAll
				// callback from prompting form will resume decryptAll attempt.
				var decryptAllContext = {decryptAllPromptString: promptString,
							 callbackFunction: MyDecryptAllPromptCallback_TiddlerEncryptionPlugin};
				MyPrompt_TiddlerEncryptionPlugin(passwordPromptString,"",decryptAllContext);
				promptGenerated = true;
			    } // if(!config.encryptionPasswords
			} // if(lastBracket
		    } // if(tiddler.tags[ix]..
		} // for
	    } // if
	}); // store.forEachTiddler
    // If we get here, all passwords have been cached.
    if(!promptGenerated) {
	config.encryptionReEnterPasswords = false;
	// Now do the decrypt all functionality
	try {
	    store.forEachTiddler(function(store,tiddler) {
		    // Note, there is no way to stop the forEachTiddler iterations
		    if(tiddler && tiddler.tags) {
			for(var ix=0; ix<tiddler.tags.length; ix++) {
			    if(tiddler.tags[ix].indexOf(tagToSearchFor) == 0) {
				try {
				    CheckTiddlerForDecryption_TiddlerEncryptionPlugin(tiddler);
				} catch (e) {
				    displayMessage("Decryption of '"+tiddler.title+"' failed.");
				    // throw e;
				}
			    } // if(tiddler.tags
			} // for
		    } // if
		}); // store.forEachTiddler
	    displayMessage("All tiddlers" + (promptString != "" ? " for '"+promptString+"'" : "") + " have been decrypted");
	} catch (e) {
	    if(e == "DecryptionFailed") {
		return;
	    }
	} // catch
    }
    return;
};

function MyDecryptAllPromptCallback_TiddlerEncryptionPlugin(context) {
    config.encryptionPasswords[context.passwordPrompt] = context.password;
    // restart the decryptAll process again after the user has entered a password.
    onClickEncryptionDecryptAll(context.decryptAllPromptString);
    return;
}

saveChanges_TiddlerEncryptionPlugin = saveChanges;
saveChanges = function(onlyIfDirty,tiddlers) {
    // Loop through all tiddlers, looking to see if there are any Encrypt(string) tagged tiddlers
    // If there are, check to see if their password has been cached.
    // If not, ask for the first one that is missing, that we find
    // the call back function will store that password then invoke this function again, 
    // which will repeat the whole process. If we find all passwords have been cached
    // then we will finally call the original saveChanges() function, which will then
    // be able to save the tiddlers.
    // We have to do this whole rigmarole because we are using a 'form' to enter the password
    // rather than the 'prompt()' function - which shows the value of the password.
    config.encryptionReEnterPasswords = true; 
    var promptGenerated = false;
    store.forEachTiddler(function(store,tiddler) {
	    if(!promptGenerated && tiddler && tiddler.tags) {
		for(var ix=0; ix<tiddler.tags.length && !promptGenerated; ix++) {
		    if(tiddler.tags[ix].indexOf("Encrypt(") == 0) {
			var tag = tiddler.tags[ix];
			var lastBracket=tag.lastIndexOf(")");
			if(lastBracket >= 0) {
			    // Ok, tagged with Encrypt(passwordPrompt)
			    // extract the passwordPrompt name
			    var passwordPrompt=tag.substring(8,lastBracket);
			    if(!config.encryptionPasswords[passwordPrompt]) {
				// no password cached, prompt and cache it, rather than save
				var saveContext = {onlyIfDirty: onlyIfDirty, 
						   tiddlers: tiddlers, 
				                   callbackFunction: MySavePromptCallback_TiddlerEncryptionPlugin};
				MyPrompt_TiddlerEncryptionPlugin(passwordPrompt,"",saveContext);
				promptGenerated = true;
			    } // if(!config.encryptionPasswords
			} // if(lastBracket
		    } // if(tiddler.tags[ix]..
		} // for
	    } // if
	}); // store.forEachTiddler
    // If we get here, all passwords have been cached.
    if(!promptGenerated) {
	config.encryptionReEnterPasswords = false;
	saveChanges_TiddlerEncryptionPlugin(onlyIfDirty,tiddlers);
    }
    return;
}

function MySavePromptCallback_TiddlerEncryptionPlugin(context) {
    config.encryptionPasswords[context.passwordPrompt] = context.password;
    // validate the password entered by attempting to decrypt all tiddlers
    // with the same encryption prompt string.
    onClickEncryptionDecryptAll(context.passwordPrompt);

    // restart the save process again
    saveChanges(context.onlyIfDirty, context.tiddlers);
    return;
}

store.getSaver().externalizeTiddler_TiddlerEncryptionPlugin = store.getSaver().externalizeTiddler;
store.getSaver().externalizeTiddler = function(store, tiddler) {
    // Ok, got the tiddler, track down the passwordPrompt in the tags.
    // track down the Encrypt(passwordPrompt) tag
    if(tiddler && tiddler.tags) {
	for(var g=0; g<tiddler.tags.length; g++) {
	    var tag = tiddler.tags[g];
	    if(tag.indexOf("Encrypt(") == 0) {
		var lastBracket=tag.lastIndexOf(")");
		if(lastBracket >= 0) {
		    // Ok, tagged with Encrypt(passwordPrompt)
		    // extract the passwordPrompt name
		    var passwordPrompt=tag.substring(8,lastBracket);
		    // Ok, Encrypt this tiddler!
		    var decryptedSHA1 = Crypto.hexSha1Str(tiddler.text);
		    var password =  GetAndSetPasswordForPrompt_TiddlerEncryptionPlugin(passwordPrompt);
		    if(password) {
			var encryptedText = TEAencrypt(tiddler.text, password);
			encryptedText = StringToHext_TiddlerEncryptionPlugin(encryptedText);
			tiddler.text = "Encrypted("+decryptedSHA1+")\n"+encryptedText;
			// Replace the Tag with the Decrypt() tag
			tiddler.tags[g]="Decrypt("+passwordPrompt+")";
			// let the store know it's dirty
			store.setDirty(tiddler.title, true);
			// prevent searches on encrypted tiddlers, still nice to search on title though.
			if(config.options.chkExcludeEncryptedFromSearch == true) {
			    tiddler.tags.push("excludeSearch");
			}
			// prevent lists of encrypted tiddlers
			if(config.options.chkExcludeEncryptedFromLists == true) {
			    tiddler.tags.push("excludeLists");
			}
		    } else {
			// do not encrypt - no password entered
		    }
		    break;
		} // if (lastBracket...
	    } // if(tag.indexOf(...
	} // for(var g=0;...
    } // if(tiddler.tags...
    
    // Then, finally, do the save by calling the function we override.

    return store.getSaver().externalizeTiddler_TiddlerEncryptionPlugin(store, tiddler);
};

function CheckTiddlerForDecryption_TiddlerEncryptionPlugin(tiddler) {
    if(tiddler && tiddler.tags) {
	for(var g=0; g<tiddler.tags.length; g++) {
	    var tag = tiddler.tags[g];
	    if(tag.indexOf("Decrypt(") == 0) {
		var lastBracket=tag.lastIndexOf(")");
		if(lastBracket >= 0) {
		    if(tiddler.text.substr(0,10) == "Encrypted(") {
			var closingSHA1Bracket = tiddler.text.indexOf(")");
			var decryptedSHA1 = tiddler.text.substring(10, closingSHA1Bracket);
			// Ok, tagged with Decrypt(passwordPrompt)
			// extract the passwordPrompt name
			var passwordPrompt=tag.substring(8,lastBracket);
			// Ok, Decrypt this tiddler!
			var decryptedText = tiddler.text.substr(closingSHA1Bracket+2);
			decryptedText = HexToString_TiddlerEncryptionPlugin(decryptedText);
                        // prompt("Decryption request for Tiddler '"+tiddler.title+"'");
			var password = GetAndSetPasswordForPromptToDecrypt_TiddlerEncryptionPlugin(passwordPrompt);
			if(password) {
			    decryptedText = TEAdecrypt(decryptedText, password );
			    var thisDecryptedSHA1 = Crypto.hexSha1Str(decryptedText);
			    if(decryptedSHA1 == thisDecryptedSHA1) {
				tiddler.text = decryptedText;
				// Replace the Tag with the Encrypt() tag
				tiddler.tags[g]="Encrypt("+passwordPrompt+")";
				if(tiddler.tags[tiddler.tags.length-1] == 'excludeLists') {
				    // Remove exclude lists only if it's the last entry
				    // as it's automatically put there by encryption
				    tiddler.tags.length--;
				}
				if(tiddler.tags[tiddler.tags.length-1] == 'excludeSearch') {
				    // Remove exclude search only if it's the last entry
				    // as it's automatically put there by encryption
				    tiddler.tags.length--;
				}
			    } else {
				// Did not decrypt, discard the password from the cache
				config.encryptionPasswords[passwordPrompt] = null;
				config.encryptionReEnterPasswords = false;
				throw "DecryptionFailed";
			    }
			} else {
			    // no password supplied, dont bother trying to decrypt
			    config.encryptionReEnterPasswords = false;
			    throw "DecryptionFailed";
			}
		    } else {
			// Tagged as encrypted but not expected format, just leave it unchanged
		    }
		    break; // out of for loop
		} // if (lastBracket...
	    } // if(tag.indexOf(...
	} // for(var g=0;...
    } // if (tiddler && tags)
    return tiddler;
};

store.getTiddler_TiddlerEncryptionPlugin = store.getTiddler;
store.getTiddler = function(title) {
    var tiddler = store.getTiddler_TiddlerEncryptionPlugin(title);
    if(tiddler) { // shadow tiddlers are not expected to be encrypted.
	try {
	    return CheckTiddlerForDecryption_TiddlerEncryptionPlugin(tiddler);
	} catch (e) {
	    if (config.options.chkShowDecryptButtonInContent == true) {
		if(e == "DecryptionFailed") {
		    var tiddler = store.getTiddler("DecryptionFailed");
		    if(!tiddler) {
			tiddler = new Tiddler();
			tiddler.set(title,
				    "<<EncryptionDecryptThis \"Decrypt\" \"Decrypt this tiddler\" \""+title+"\">>",
				    config.views.wikified.shadowModifier,
				    version.date,[],version.date);
		    } 
		    return tiddler;
		} // if(e)
	    }
	    return(tiddler);
	} // catch
    } // if(tiddler) {
    return null;
};

store.getTiddlerText_TiddlerEncryptionPlugin = store.getTiddlerText;
store.getTiddlerText = function(title,defaultText) {
    // Simply retrieve the tiddler, normally, if it requires decryption, it will be decrypted
    var decryptedTiddler = store.getTiddler(title);
    if(decryptedTiddler) {
	return decryptedTiddler.text;
    }
    //Ok, rather than duplicate all the core code, the above code should fail if we reach here
    // let the core code take over.
    return  store.getTiddlerText_TiddlerEncryptionPlugin(title,defaultText);
};

// Given a prompt, search our cache to see if we have already entered the password.
// Can return null if the user enters nothing.
function MyPrompt_TiddlerEncryptionPlugin(promptString,defaultValue,context) {
    if(!context) {
	context = {};
    }
    context.passwordPrompt = promptString;
    PasswordPrompt.prompt(MyPromptCallback_TiddlerEncryptionPlugin, context);
    return;
}

function MyPromptCallback_TiddlerEncryptionPlugin(context) {
    if(context.callbackFunction) {
	context.callbackFunction(context);
    } else {
	config.encryptionPasswords[context.passwordPrompt] = context.password;
	story.refreshAllTiddlers(true);
    }
    return;
}

function GetAndSetPasswordForPrompt_TiddlerEncryptionPlugin(promptString) {
    if(!config.encryptionPasswords[promptString]) {
	config.encryptionPasswords[promptString] = MyPrompt_TiddlerEncryptionPlugin(promptString, "");
    }
    return config.encryptionPasswords[promptString]; // may be null, prompt can be cancelled.
}

function GetAndSetPasswordForPromptToDecrypt_TiddlerEncryptionPlugin(promptString) {
    if(config.encryptionReEnterPasswords) {
	return GetAndSetPasswordForPrompt_TiddlerEncryptionPlugin(promptString);
    } else {
	return config.encryptionPasswords[promptString];
    }
}

// Make the encrypted tiddlies look a little more presentable.
function StringToHext_TiddlerEncryptionPlugin(theString) {
    var theResult = "";
    for(var i=0; i<theString.length; i++) {
	var theHex = theString.charCodeAt(i).toString(16);
	if(theHex.length<2) {
	    theResult += "0"+theHex;
	} else {
	    theResult += theHex;
	}
	if(i && i % 32 == 0)
	    theResult += "\n";
    }
    return theResult;
}

function HexToString_TiddlerEncryptionPlugin(theString) {
    var theResult = "";
    for(var i=0; i<theString.length; i+=2) {
	if(theString.charAt(i) == "\n") {
	    i--;	// cause us to skip over the newline and resume
	    continue;
	}
	theResult += String.fromCharCode(parseInt(theString.substr(i, 2),16));
    }
    return theResult;
}
//
// Heavily leveraged from http://trac.tiddlywiki.org/browser/Trunk/contributors/SaqImtiaz/verticals/Hesperian/PasswordPromptPlugin.js  Revision 5635
//
PasswordPrompt ={
  prompt : function(callback,context){
	if (!context) {
	    context = {};
	}
	var box = createTiddlyElement(document.getElementById("contentWrapper"),'div','passwordPromptBox');
	box.innerHTML = store.getTiddlerText('PasswordPromptTemplate');
	box.style.position = 'absolute';
	this.center(box);
	document.getElementById('promptDisplayField').value = context.passwordPrompt;
	var passwordInputField = document.getElementById('passwordInputField');
	passwordInputField.onkeyup = function(ev) {
	    var e = ev || window.event;
	    if(e.keyCode == 10 || e.keyCode == 13) { // Enter
		PasswordPrompt.submit(callback, context);
	    }
	};
	passwordInputField.focus();
	document.getElementById('passwordPromptSubmitBtn').onclick = function(){PasswordPrompt.submit(callback,context);};
	document.getElementById('passwordPromptCancelBtn').onclick = function(){PasswordPrompt.cancel(callback,context);};
    },     
 	       
  center : function(el){
	var size = this.getsize(el);
	el.style.left = (Math.round(findWindowWidth()/2) - (size.width /2) + findScrollX())+'px';
	el.style.top = (Math.round(findWindowHeight()/2) - (size.height /2) + findScrollY())+'px';
    },
 	       
  getsize : function (el){
	var x = {};
	x.width = el.offsetWidth || el.style.pixelWidth;
	x.height = el.offsetHeight || el.style.pixelHeight;
	return x;
    },
 	       
  submit : function(cb,context){
	context.passwordPrompt = document.getElementById('promptDisplayField').value;
	context.password = document.getElementById('passwordInputField').value;
	var box = document.getElementById('passwordPromptBox');
	box.parentNode.removeChild(box);
	cb(context);
	return false;
    },

  cancel : function(cb,context){
	var box = document.getElementById('passwordPromptBox');
	box.parentNode.removeChild(box);
	return false;
    },
 	       
  setStyles : function(){
	setStylesheet(
	    "#passwordPromptBox dd.submit {margin-left:0; font-weight: bold; margin-top:1em;}\n"+
	    "#passwordPromptBox dd.submit .button {padding:0.5em 1em; border:1px solid #ccc;}\n"+
	    "#passwordPromptBox dt.heading {margin-bottom:0.5em; font-size:1.2em;}\n"+
	    "#passwordPromptBox {border:1px solid #ccc;background-color: #eee;padding:1em 2em;}",'passwordPromptStyles');
    },
 	       
  template : '<form action="" onsubmit="return false;" id="passwordPromptForm">\n'+
  '    <dl>\n'+
  '        <dt class="heading">Please enter the password:</dt>\n'+
  '        <dt>Prompt:</dt>\n'+
  '        <dd><input type="text" readonly id="promptDisplayField" class="display"/></dd>\n'+
  '        <dt>Password:</dt>\n'+
  '        <dd><input type="password" tabindex="1" class="input" id="passwordInputField"/></dd>\n'+
  '        <dd class="submit">\n'+
  '            <a tabindex="2" href="javascript:;" class="button" id="passwordPromptSubmitBtn">OK</a>\n'+
  '            <a tabindex="3" href="javascript:;" class="button" id="passwordPromptCancelBtn">Cancel</a>\n'+
  '        </dd>\n'+
  '    </dl>\n'+
  '</form>',
 	                         
  init : function(){
	config.shadowTiddlers.PasswordPromptTemplate = this.template;
	this.setStyles();
    }
};
 	
PasswordPrompt.init();

// http://www.movable-type.co.uk/scripts/tea-block.html
//
// TEAencrypt: Use Corrected Block TEA to encrypt plaintext using password
//             (note plaintext & password must be strings not string objects)
//
// Return encrypted text as string
//
function TEAencrypt(plaintext, password)
{
    if (plaintext.length == 0) return('');  // nothing to encrypt
    // 'escape' plaintext so chars outside ISO-8859-1 work in single-byte packing, but keep
    // spaces as spaces (not '%20') so encrypted text doesn't grow too long (quick & dirty)
    var asciitext = escape(plaintext).replace(/%20/g,' ');
    var v = strToLongs(asciitext);  // convert string to array of longs
    if (v.length <= 1) v[1] = 0;  // algorithm doesn't work for n<2 so fudge by adding a null
    var k = strToLongs(password.slice(0,16));  // simply convert first 16 chars of password as key
    var n = v.length;

    var z = v[n-1], y = v[0], delta = 0x9E3779B9;
    var mx, e, q = Math.floor(6 + 52/n), sum = 0;

    while (q-- > 0) {  // 6 + 52/n operations gives between 6 & 32 mixes on each word
        sum += delta;
        e = sum>>>2 & 3;
        for (var p = 0; p < n; p++) {
            y = v[(p+1)%n];
            mx = (z>>>5 ^ y<<2) + (y>>>3 ^ z<<4) ^ (sum^y) + (k[p&3 ^ e] ^ z);
            z = v[p] += mx;
        }
    }

    var ciphertext = longsToStr(v);

    return escCtrlCh(ciphertext);
}

//
// TEAdecrypt: Use Corrected Block TEA to decrypt ciphertext using password
//
function TEAdecrypt(ciphertext, password)
{
    if (ciphertext.length == 0) return('');
    var v = strToLongs(unescCtrlCh(ciphertext));
    var k = strToLongs(password.slice(0,16)); 
    var n = v.length;

    var z = v[n-1], y = v[0], delta = 0x9E3779B9;
    var mx, e, q = Math.floor(6 + 52/n), sum = q*delta;

    while (sum != 0) {
        e = sum>>>2 & 3;
        for (var p = n-1; p >= 0; p--) {
            z = v[p>0 ? p-1 : n-1];
            mx = (z>>>5 ^ y<<2) + (y>>>3 ^ z<<4) ^ (sum^y) + (k[p&3 ^ e] ^ z);
            y = v[p] -= mx;
        }
        sum -= delta;
    }

    var plaintext = longsToStr(v);

    // strip trailing null chars resulting from filling 4-char blocks:
    plaintext = plaintext.replace(/\0+$/,'');

    return unescape(plaintext);
}


// supporting functions

function strToLongs(s) {  // convert string to array of longs, each containing 4 chars
    // note chars must be within ISO-8859-1 (with Unicode code-point < 256) to fit 4/long
    var l = new Array(Math.ceil(s.length/4));
    for (var i=0; i<l.length; i++) {
        // note little-endian encoding - endianness is irrelevant as long as 
        // it is the same in longsToStr() 
        l[i] = s.charCodeAt(i*4) + (s.charCodeAt(i*4+1)<<8) + 
               (s.charCodeAt(i*4+2)<<16) + (s.charCodeAt(i*4+3)<<24);
    }
    return l;  // note running off the end of the string generates nulls since 
}              // bitwise operators treat NaN as 0

function longsToStr(l) {  // convert array of longs back to string
    var a = new Array(l.length);
    for (var i=0; i<l.length; i++) {
        a[i] = String.fromCharCode(l[i] & 0xFF, l[i]>>>8 & 0xFF, 
                                   l[i]>>>16 & 0xFF, l[i]>>>24 & 0xFF);
    }
    return a.join('');  // use Array.join() rather than repeated string appends for efficiency
}

function escCtrlCh(str) {  // escape control chars etc which might cause problems with encrypted texts
    return str.replace(/[\0\t\n\v\f\r\xa0'"!]/g, function(c) { return '!' + c.charCodeAt(0) + '!'; });
}

function unescCtrlCh(str) {  // unescape potentially problematic nulls and control characters
    return str.replace(/!\d\d?\d?!/g, function(c) { return String.fromCharCode(c.slice(1,-1)); });
}

//}}}

/***
|Name|TiddlyLifePlugin|
|Source|http://www.TiddlyTools.com/#TiddlyLifePlugin|
|Documentation|http://www.TiddlyTools.com/#TiddlyLifePlugin|
|Version|1.6.5|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|Cellular Automata: Conway's "Game of Life"|
!!!!!Documentation
<<<
[[TiddlyLife]] is a TiddlyWiki-enabled javascript version of Conway's "Game of Life" cellular automata simulator.  It provides a "life matrix" on which to place cells, run the simulation, and observe the results.  The speed of the simulation is related to the total size of the matrix (i.e., rows X cols): the larger the matrix, the longer it takes to compute each 'generation' of cells.

You can set the number of rows and columns in the matrix, as well as the size of each cell and the color of the cells, grid, and background.  You can use the mouse to click/drag over the grid to add/delete cells (hold shift to add "walls").  The current life matrix can be saved as text in a tiddler and then reloaded later from a popup list of tiddlers tagged with<<tag tiddlyLife>>

Please see Wikipedia for an overview of [[Conway's "Game of Life"|http://en.wikipedia.org/wiki/Conway%27s_Game_of_Life]].
<<<
!!!!!Syntax
<<<
{{{
<<life	cellcolor:... gridcolor:... bgcolor:... wallcolor:...
	cellsize:... gridwidth:... delay:... limit:... stability:...
	autostart nomenu nostats noedit width:... height:... tid:...>>
}}}
where all parameters are optional (default values are shown in parentheses):
*''cellcolor:'' (//green//), ''gridcolor:'' (//#111//), ''bgcolor:'' (//black//) and ''wallcolor:'' (//gray//)<br>are CSS color names or RGB values (e.g.: "black", "blue",  "#fff", "#9af", etc.)
*''cellsize:'' (//1em//), and ''gridwidth:'' (//1px//)<br>are CSS dimensions, including units (e.g., px,em,cm,in)
*''delay:'' (//0//)<br>delay time (in msec) between simulation ticks (a larger number results in a slower simulation, but also leaves more CPU cycles available for other processes)
*''limit:'' (//10000//)<br>automatically stop stimulation after the indicated number of generations (use 0 for no limit)
*''stability:'' (//500//)<br>automatically stop simulation if population count remains stable for the indicated number of generations (use 0 for no limit)
*''autostart'' (//keyword//)<br>when present, causes the simulation to begin running as soon as the macro is rendered
*''nomenu'' (//keyword//)<br>when present, suppresses display of command menu (use with ''autostart'')
*''nostats'' (//keyword//)<br>when present, suppresses display of the current matrix statistics (generation #, population count/min/avg/max, birthrate/deathrate, average age)
*''noedit'' (//keyword//)<br>when present, prevent hand editing of cells in the matrix.  Instead, clicking on the matrix starts/stops the simulation (useful with ''nomenu'' and ''autostart'')
*''width:'' (//30//) and ''height:'' (//30//)<br>are dimensions for an empty life matrix
*''tid:'' (//no default//)<br>specifies a tiddler containing a saved life matrix definition.  note: when using a saved matrix, the width/height are determined by the stored definition and any width/height macro parameters that are present will be ignored.
<<<
!!!!!Examples
<<<
"Multi-cellular organisms" can be constructed by arranging blocks in specific patterns that exhibit emergent behaviors such as movement, symmetry, oscillation and generative abilities.  Two well-known organisms that are [[discussed in the Wikipedia article|http://en.wikipedia.org/wiki/Conway%27s_Game_of_Life]] are ''//gliders//'' and ''//Gosper's glider gun//'':

[[GliderDance]]: many small moving organisms just missing each other!
{{{<<life cellsize:.8em tid:GliderDance>>}}}
<<life cellsize:.8em tid:GliderDance>>
[[GliderGun]]: generates a stream of gliders that hits a wall
{{{<<life cellsize:.6em tid:GliderGun>>}}}
<<life cellsize:.6em tid:GliderGun>>
... and here's an ''empty life matrix'' for you to play with:
{{{<<life>>}}}
<<life>>
<<<
!!!!!Revisions
<<<
2008.10.11 [1.6.5] added 'step' command.  Also, for performance, removed birth/death stats and don't display average age (but //do// calculate it)
2008.10.10 [1.6.0] added birthrate, deathrate, and average age to statistics
2008.10.09 [1.5.0] use //named// params.  changed matrix values: 0==empty, >0==alive, <0==wall, where value=generation # in which cell was created
2008.10.08 [1.4.0] added 'stability' and 'limit' options (replaces 'autostop' checkbox)
2008.10.08 [1.3.0] added optional 'autostart', 'nomenu' and 'nostats' macro params
2008.10.07 [1.2.1] fixed update handling so multiple timers will no longer be created
2008.10.06 [1.2.0] added support for walls (unchanging dead cells) using dead="-", alive="O", wall="#"
2008.10.06 [1.1.1] redraw optimization: 300% speed improvement by setting CSS only when cell state *changes*
2008.10.05 [1.1.0] drag to draw (set/clear) multiple cells, new option controls (rows,cols,cellsize,delay,autostop), popup list for opening saved matrix
2008.10.04 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.TiddlyLifePlugin= {major: 1, minor: 6, revision: 5, date: new Date(2008,10,11)};
config.shadowTiddlers.TiddlyLife="<<life>>";
config.macros.life={
//}}}
// // DEFAULTS
//{{{
	cellcolor:	"green",
	cellsize:	"1em",
	gridcolor:	"#111",
	gridwidth:	"1px",
	bgcolor:	"black",
	wallcolor:	"gray",
	width:		30,
	height:		30,
	stability: 	300,
	limit:		5000,
	delay:		0,
//}}}
// // TRANSLATE
//{{{
	lifeTag:	"tiddlyLife",
	titlePrompt:	"Enter a new tiddler title",
	openErr:	"Could not open '%0'",
	limitMsg:	"stopped: completed %0 generations",
	stableMsg:	"stopped: no growth for %0 generations",
	cellEditTip:	"CLICK=set/clear, SHIFT-CLICK=set wall",
	noEditTip:	"CLICK=start/stop simulation",
	startLabel:	"start",
	stopLabel:	"<b>STOP</b>",
	stats:		"gen: <b>%0</b> pop: <b>%1</b> min: <b>%2</b> avg: <b>%3</b> max: <b>%4</b> %5",
	cmds:		"<a href='#' title='start/stop simulation'\
				onclick='return config.macros.life.toggle(\"%0\")'>%1</a> \
			 | <a href='#' title='advance simulation by one generation'\
				onclick='return config.macros.life.step(\"%0\")'>step</a> \
			 | <a href='#' title='reload the starting life matrix'\
				onclick='return config.macros.life.reset(\"%0\")'>reset</a> \
			 | <a href='#' title='clear the life matrix'\
				onclick='return config.macros.life.clear(\"%0\")'>clear</a> \
			 | <a href='#' title='load a life matrix from a tiddler'\
				onclick='return config.macros.life.open(this,event,\"%0\")'>open</a> \
			 | <a href='#' title='save the current life matrix to a tiddler'\
				onclick='return config.macros.life.save(\"%0\")'>save</a> \
			 | <a href='#' title='change simulation option settings'\
				onclick='var s=this.nextSibling.style; var show=s.display==\"none\"; \
					s.display=show?\"block\":\"none\"; \
					return false;'>options</a><span style='display:none'>%2</span>",
	opts:		"delay:<input type='text' title='delay between generations (msec)' \
				value='%1' style='width:4em;font-size:90%;text-align:center;'>\
			 limit:<input type='text' title='automatically stop after N generations (0=no limit)' \
				value='%2' style='width:4em;font-size:90%;text-align:center;'>\
			 stability:<input type='text' title='stop if population count is stable for N generations (0=no limit)'\
				value='%3' style='width:4em;font-size:90%;text-align:center;'><br>\
			 rows:<input type='text' title='matrix height' \
				value='%4' style='width:3em;font-size:90%;text-align:center;'>\
			 cols:<input type='text' title='matrix width' \
				value='%5' style='width:3em;font-size:90%;text-align:center;'>\
			 cells:<input type='text' title='cellsize' \
				value='%6' style='width:3em;font-size:90%;text-align:center;'>\
			 <input type='button' value='OK' style='font-size:90%;' \
				title='change the life matrix dimensions' \
				onclick='var ins=this.parentNode.getElementsByTagName(\"input\"); \
					var t=ins[0].value; var l=ins[1].value; var a=ins[2].value; \
					var h=ins[3].value; var w=ins[4].value; var s=ins[5].value; \
					return config.macros.life.setoptions(\"%0\",w,h,s,t,a,l)'>",
	msgfmt: 	"<br><span title='use \"options\" command to change autostop settings' \
			onclick='this.style.display=\"none\"' \
			style='display:block;position:absolute;padding:0 .5em;cursor:pointer; \
			margin:.5em;color:%1;background-color:%2;border:1px solid %1'>%3</span>",

//}}}
// // GENERAL UTILITIES
//{{{
	empty: function(w,h) { // generate an empty matrix
		var m=[]; for (var r=0; r<h; r++) { m[r]=[]; for (var c=0; c<w; c++) m[r][c]=0; } return m;
	},
	paste: function(row,col,m1,m2) { // copy one matrix into another
		for (var r=row; r<m1.length && r<m2.length; r++)
			for (var c=col; c<m1[r].length && c<m2[r].length; c++)
				m2[r][c]=m1[r][c];
	},
	zeroPad: function(v,m) { // formatting for population stats
		var t=("0000"+v.toString());
		return t.substr(t.length-Math.max(m.toString().length,v.toString().length));
	},
	getValue: function(s) { // cell value from stored matrix symbol
		return s=='O'?1:s=='#'?-1:0;
	},
	getSymbol: function(v) { // stored matrix symbol from cell value
		return v>0?'O':v<0?'#':'-';
	},
	getColor: function(v,d) { // color from cell value
		return v>0?d.cellcolor:v<0?d.wallcolor:'';
	},
	getAge: function(v,d) { // age of a cell or wall
		return v?(d.gen||1)-Math.abs(v):0;
	},
	isAlive: function(v) { // 0 if dead, 1 if alive
		return v>0;
	},
	isWall: function(v) { // 1 if cell is a wall
		return v<0;
	},
	isAncient: function(v,d) { // true if cell age is more than ten times the average age
		return d.avgage>0 && this.getAge(v,d)>10*d.avgage;
	},
//}}}
// // MACRO HANDLER
//{{{
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var autostart	=params.contains("autostart");
		var nomenu	=params.contains("nomenu");
		var nostats	=params.contains("nostats");
		var noedit	=params.contains("noedit");
		params = paramString.parseParams("anon",null,true,false,false);
		var cellcolor	=getParam(params,"cellcolor",this.cellcolor);
		var wallcolor	=getParam(params,"wallcolor",this.wallcolor);
		var cellsize	=getParam(params,"cellsize",this.cellsize);
		var gridcolor	=getParam(params,"gridcolor",this.gridcolor);
		var gridwidth	=getParam(params,"gridwidth",this.gridwidth);
		var bgcolor	=getParam(params,"bgcolor",this.bgcolor);
		var tid		=getParam(params,"tid",this.tid);
		var w		=getParam(params,"rows",this.width);
		var h		=getParam(params,"cols",this.height);
		var delay	=getParam(params,"delay",this.delay);
		var stability	=getParam(params,"stability",this.stability);
		var limit	=getParam(params,"limit",this.limit);
		var m=this.load(tid); if (!m) var m=this.empty(w,h);
		var id="tiddlyLife_"+new Date().getTime()+Math.random();
		var e=createTiddlyElement(place,"span",id,"tiddlyLife");
		e.data={w:w, h:h, tid:tid, matrix:m, gen:0, stopped:!autostart,
			gencount:0, stable:0, total:0, birthrate:0, deathrate:0, age:0, 
			cellcolor:cellcolor, wallcolor:wallcolor, gridcolor:gridcolor, bgcolor:bgcolor,
			cellsize:cellsize, gridwidth:gridwidth, delay:delay, stability:stability, limit:limit,
			nostats:nostats, nomenu:nomenu, noedit:noedit };
		this.draw(id); if (autostart) this.go(id);
	},
//}}}
// // COMMAND HANDLERS
//{{{
	toggle: function(id) { // toggle simulation
		var e=document.getElementById(id); if (!e) return; var d=e.data; var m=d.matrix;
		if (d.stopped) this.go(id); else this.stop(id);
		return false;
	},
	go: function(id) { // start simulation and set command text
		var e=document.getElementById(id); if (!e) return; var d=e.data; var m=d.matrix;
		var b=e.getElementsByTagName("a")[0]; if (b) b.innerHTML=this.stopLabel;
		d.stopped=false; d.stable=0; d.gencount=0; clearTimeout(d.timer); this.refresh(id);
		return false;
	},
	stop: function(id) { // stop simulation and set command text
		var e=document.getElementById(id); if (!e) return; var d=e.data; var m=d.matrix;
		var b=e.getElementsByTagName("a")[0]; if (b) b.innerHTML=this.startLabel;
		d.stopped=true; clearTimeout(d.timer);		
		return false;
	},
	reset: function(id) { // reload initial matrix
		var e=document.getElementById(id); if (!e) return; var d=e.data;
		var m=this.load(d.tid); if (!m) var m=this.empty(d.w,d.h);
		this.stop(id); d.matrix=m; d.gen=0; this.draw(id);
		return false;
	},
	clear: function(id) { // load empty matrix
		var e=document.getElementById(id); if (!e) return; var d=e.data;
		var tid=d.tid; d.tid=""; this.reset(id); d.tid=tid;
		return false;
	},
	setoptions: function(id,w,h,s,t,a,l) { // options: width,height,cellsize,delaytime,autostop,limit
		var e=document.getElementById(id); if (!e) return; var d=e.data; var m=d.matrix;
		clearTimeout(d.timer); // stop simulation while changing matrix content
		d.w=w; d.h=h; d.stability=a; d.limit=l; d.cellsize=s; d.delay=t;
		var m2=this.empty(w,h); this.paste(0,0,m,m2); d.matrix=m2; this.draw(id);
		d.min=Math.min(d.min,d.count); d.max=Math.max(d.max,d.count);
		if (!d.stopped) d.timer=setTimeout('config.macros.life.refresh("'+id+'")',d.delay);
		return false;
	},
//}}}
// // I/O HANDLERS
//{{{
	load: function(tid) { // read tiddler into matrix
		var t=store.getTiddlerText(tid); if (!t) return;
		var lines=t.split("\n"); var m=[];
		if (lines[0]=="{{{") lines.shift();
		if (lines[lines.length-1]=="}}}") lines.pop();
		for (var r=0; r<lines.length; r++) { m[r]=[];
			for (var c=0; c<lines[r].length; c++) m[r].push(this.getValue(lines[r].substr(c,1)));
		}
		return m;
	},
	save: function(id) { // write matrix to tiddler
		var e=document.getElementById(id); if (!e) return; var d=e.data; var m=d.matrix;
		var tid=d.tid; var msg=config.messages.overwriteWarning.format([tid]);
		while (!tid||!tid.length ||(store.tiddlerExists(tid)&&!confirm(msg)))
			{ tid=prompt(this.titlePrompt,tid); if (!tid||!tid.length) return false; }
		d.tid=tid;
		var out=[];
		out.push('{{{');
		for (var r=0; r<m.length; r++) { var row='';
			for (var c=0; c<m[r].length; c++) row+=this.getSymbol(m[r][c]);
			out.push(row);
		}
		out.push('}}}');
		var t=store.getTiddler(tid);
		var txt=out.join('\n');
		var who=t&&config.options.chkForceMinorUpdate?t.modifier:config.options.txtUserName;
		var when=t&&config.options.chkForceMinorUpdate?t.modified:new Date();
		var tags=t?t.tags:[]; tags.pushUnique(this.lifeTag);
		var fields=t?t.fields:{};
		store.saveTiddler(tid,tid,txt,who,when,tags,fields);
		story.displayTiddler(null,tid); story.refreshTiddler(tid,null,true);
		return false;
	},
	open: function(here,event,id) { // select from a list of saved matrix tiddlers
		var p=Popup.create(here); if (!p) return false;
		p.style.padding="2px .5em";
		var tids=store.getTaggedTiddlers(this.lifeTag);
		for (var t=0; t<tids.length; t++) {
			var b=createTiddlyButton(createTiddlyElement(p,"li"),tids[t].title,tids[t].title,
				function() {
					var cml=config.macros.life;
					var id=this.getAttribute("id");
					var e=document.getElementById(id); if (!e) return false; var d=e.data;
					var tid=this.getAttribute("tid");
					var m=cml.load(tid);
					if (!m) { displayMessage(this.openErr.format([tid])); return false; }
					cml.stop(id); d.tid=tid; d.matrix=m; d.gen=0; cml.draw(id);
					return false;
				});
			b.setAttribute("id",id);
			b.setAttribute("tid",tids[t].title);
		}
		Popup.show();
		event.cancelBubble=true;if(event.stopPropagation)event.stopPropagation();
		return false;
	},
//}}}
// // EDIT HANDLERS
//{{{
	mousedown: function(here,ev,id,r,c) { // start manual edit
		var e=document.getElementById(id); if (!e) return; var d=e.data; var m=d.matrix;
		d.savedstop=d.stopped; this.stop(id); d.draw=!this.isAlive(m[r][c])?(d.gen||1):0;
		return this.setcell(here,id,r,c,ev&&ev.shiftKey?-(d.gen||1):d.draw);
	},
	mouseover: function(here,ev,id,r,c) { // drag edit
		var e=document.getElementById(id); if (!e) return; var d=e.data; var m=d.matrix;
		if (d.draw!==undefined) this.setcell(here,id,r,c,ev&&ev.shiftKey?-(d.gen||1):d.draw);
		return false;
	},
	mouseup: function(here,ev,id,r,c) { // end manual edit
		var e=document.getElementById(id); if (!e) return; var d=e.data; var m=d.matrix;
		if (d.savedstop!==undefined) d.stopped=d.savedstop; if (!d.stopped) this.go(id);
		d.draw=undefined; d.savedstop=undefined;
		return false;
	},
	setcell: function(here,id,r,c,v) { // set cell content and revise stats display
		var e=document.getElementById(id); if (!e) return; var d=e.data; var m=d.matrix;
		if (m[r][c]==v) return;
		if (this.isAlive(m[r][c]) && !this.isAlive(v)) { d.count--; d.min=Math.min(d.min,d.count); }
		if (!this.isAlive(m[r][c]) && this.isAlive(v)) { d.count++; d.max=Math.max(d.max,d.count); }
		m[r][c]=v; here.style.background=this.getColor(v,d);
		this.showstats(id,'');
		return false;
	},
//}}}
// // RENDER
//{{{
	draw: function(id) { // render entire tiddlyLife container (menu, stats, and table)
		var e=document.getElementById(id); if (!e) return; var d=e.data; var m=d.matrix;
		var out=[]; var count=0; var maxwidth=0;
		var style="border:%0 solid %1;background:%2;height:%3 !important;width:%3; !important";
		var onmousedown=d.noedit?"":"return config.macros.life.mousedown(this,event,'%4',%5,%6);";
		var onmouseover=d.noedit?"":"return config.macros.life.mouseover(this,event,'%4',%5,%6);";
		var onmouseup  =d.noedit?"":"return config.macros.life.mouseup(this,event,'%4',%5,%6);";
		var onclick    =d.noedit?"return config.macros.life.toggle('%4');":"";
		var tip="[%7,%8] "+(d.noedit?this.noEditTip:this.cellEditTip);
		var cell='<td style="margin:0;padding:0;'+style +'" title="'+tip+'" onclick="'+onclick
			+'" onmousedown="'+onmousedown+'" onmouseover="'+onmouseover+'" onmouseup="'+onmouseup+'"></td>';
		out.push('<table style="table-layout:fixed;border-collapse:collapse;'
			+'margin:0;padding:0;border:0;background-color:'+d.bgcolor+'">');
		for (var r=0; r<m.length; r++) {
			if (m[r].length>maxwidth) maxwidth=m[r].length;
			out.push('<tr style="margin:0;padding:0;border:0;">');
			for (var c=0; c<m[r].length; c++) {
				out.push(cell.format([d.gridwidth,d.gridcolor,this.getColor(m[r][c],d),
					d.cellsize,id,r,c,r+1,c+1]));
				count+=this.isAlive(m[r][c]);
			}
			out.push('</tr>');
		}
		out.push('</table>');
		d.count=count;
		if (!d.gen) { d.gencount=d.stable=d.total=d.oldest=d.maxage=d.avgage=0; d.min=d.max=d.avg=count; }
		var hdr=[];
		if (!d.nomenu) hdr.push(this.cmds.format([id,d.stopped?this.startLabel:this.stopLabel,
			this.opts.format([id,d.delay,d.limit,d.stability,m.length,maxwidth,d.cellsize])]));
		if (!d.nostats) hdr.push('<div style="font-size:90%">'
			+this.stats.format([d.gen,d.count,d.min,d.avg,d.max])+'</div>');
		e.innerHTML=hdr.join('')+out.join('');
		return false;
	},
//}}}
// // RUN SIMULATION
//{{{
	refresh: function(id) { // timer-based refresh cycle
		var e=document.getElementById(id); if (!e) return; var d=e.data; var m=d.matrix;
		this.step(id); if (!d.stopped) d.timer=setTimeout('config.macros.life.refresh("'+id+'")',d.delay);
		return false;
	},
	step: function(id) { // calc new matrix, gather stats and display changes
		var e=document.getElementById(id); if (!e) return; var d=e.data; var m=d.matrix;
		// calculate next generation
		var m2=[]; var count=agecount=agetotal=oldest=0; d.gen++; d.gencount++;
		var table=e.getElementsByTagName("table")[0]; if (!table) return;
		var rows=table.getElementsByTagName("tr");
		for (var r=0; r<m.length; r++) {
			m2[r]=[];
			var cells=rows[r].getElementsByTagName("td");
			for (var c=0; c<m[r].length; c++) {
				var v=this.tick(d.gen,m,r,c); // apply Conway's 23/3 rule
				m2[r].push(v);
				var color=this.getColor(v,d);
				if (cells[c].style.backgroundColor!=color)
					cells[c].style.backgroundColor=color;
				if (this.isAlive(v)) {
					var a=this.getAge(v,d);
					if (!this.isAncient(v,d)) { agecount++; agetotal+=a; }
					oldest=Math.max(oldest,a);
					count++;
				}
			}
		}
		d.matrix=m2; // update matrix
		this.calcstats(id,count,agecount,agetotal,oldest); // calculate statistics
		var msg=this.autostop(id); // autostop if conditions apply
		this.showstats(id,msg); // show statistics and message (if any)
		return false;
	},
	tick: function(gen,m,r,c) { // apply Conway's 23/3 rule
		if (this.isWall(m[r][c])) return m[r][c]; // walls don't change
		var prevrow=r>0?r-1:(m.length-1);
		var nextrow=r<m.length-1?r+1:0;
		var prevcol=c>0?c-1:(m[r].length-1);
		var nextcol=c<m[r].length-1?c+1:0;
		var near=this.isAlive(m[prevrow][prevcol]) + this.isAlive(m[prevrow][c]) + this.isAlive(m[prevrow][nextcol])
			+this.isAlive(m[r][prevcol])       + this.isAlive(m[r][nextcol])
			+this.isAlive(m[nextrow][prevcol]) + this.isAlive(m[nextrow][c]) + this.isAlive(m[nextrow][nextcol]);
		if (!this.isAlive(m[r][c])&&near==3) return gen; // birth
		if (this.isAlive(m[r][c])&&near==2||near==3) return m[r][c]; // stay alive
		return 0; // death
	},
	autostop: function(id) { // autostop if run limit reached or no changes for N generations
		var e=document.getElementById(id); if (!e) return; var d=e.data; var m=d.matrix;
		var msg='';
		var limited=d.limit>0 && d.gencount>=d.limit;
		var stabilized=d.stability>0 && d.stable>=d.stability;
		if (limited || stabilized) {
			this.stop(id); 
			msg=stabilized?this.stableMsg.format([d.stability]):this.limitMsg.format([d.limit]);
			msg=this.msgfmt.format([id,d.cellcolor,d.bgcolor,msg]);
		}
		return msg;
	},
	calcstats: function(id,count,agecount,agetotal,oldest) {
		var e=document.getElementById(id); if (!e) return; var d=e.data; var m=d.matrix;
		d.stable+=(count==d.count)?1:-d.stable; // add one or reset to zero
		d.count=count; d.total+=count;
		d.min=Math.min(d.min,count); d.max=Math.max(d.max,count); d.avg=Math.floor(d.total/d.gen);
		d.avgage=agecount?agetotal/agecount:0; d.oldest=oldest; d.maxage=Math.max(d.maxage,oldest);
		return false;
	},
	showstats: function(id,msg) {
		var e=document.getElementById(id); if (!e) return; var d=e.data; var m=d.matrix;
		var stats=e.getElementsByTagName("div")[0];
		if (stats) stats.innerHTML=this.stats.format([d.gen,this.zeroPad(d.count,d.max),d.min,d.avg,d.max,msg]);
		return false;
	}
}
//}}}
TiddlyWiki — вики-движок и вики-концепция, заключающаяся в том, что весь вики-сайт представляет собой одну HTML-страницу, интерактивность которой обеспечивается скриптами. Каждая отдельная логическая вики-страница называется «тидлер» («рыбка», англ. tiddler) и по виду напоминает пост в блоге.

#[[http://www.tiddlywiki.com/|http://www.tiddlywiki.com/]]
#[[TiddlyWiki на GitHub|http://github.com/TiddlyWiki/tiddlywiki]]
#[[TiddlyWiki на Wiki|http://ru.wikipedia.org/wiki/TiddlyWiki]]
#[[Серверная часть TiddlyWiki на PHP|http://tiddlywiki.bidix.info/]]
#[[Серверная часть TiddlyWiki на GAPS|http://code.google.com/p/giewiki/]]
#[[TiddlyWiki по русски|http://www.tiddlywiki.ru/_index/]]
#[[TiddlyWiki на Python|http://tiddlyspace.com/]]
#[[TiddlyWiki на Python|http://tiddlyweb.peermore.com/wiki/]]
#[[WoaS - Wiki on a Stick|http://stickwiki.sourceforge.net/]]
#[[Плагин русификатор|http://glebsite.net/tw/]]
#[[Сборник плагинов|http://www.tiddlytools.com/]]
<<miniBrowser noplayer http://tinymce.moxiecode.com/tryit/full.php>>
/***
|Name:|ToggleTagPlugin|
|Description:|Makes a checkbox which toggles a tag in a tiddler|
|Version:|3.1.0 ($Rev: 4907 $)|
|Date:|$Date: 2008-05-13 03:15:46 +1000 (Tue, 13 May 2008) $|
|Source:|http://mptw.tiddlyspot.com/#ToggleTagPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Usage
{{{<<toggleTag }}}//{{{TagName TiddlerName LabelText}}}//{{{>>}}}
* TagName - the tag to be toggled, default value "checked"
* TiddlerName - the tiddler to toggle the tag in, default value the current tiddler
* LabelText - the text (gets wikified) to put next to the check box, default value is '{{{[[TagName]]}}}' or '{{{[[TagName]] [[TiddlerName]]}}}'
(If a parameter is '.' then the default will be used)
* TouchMod flag - if non empty then touch the tiddlers mod date. Note, can set config.toggleTagAlwaysTouchModDate to always touch mod date
!!Examples
|Code|Description|Example|h
|{{{<<toggleTag>>}}}|Toggles the default tag (checked) in this tiddler|<<toggleTag>>|
|{{{<<toggleTag TagName>>}}}|Toggles the TagName tag in this tiddler|<<toggleTag TagName>>|
|{{{<<toggleTag TagName TiddlerName>>}}}|Toggles the TagName tag in the TiddlerName tiddler|<<toggleTag TagName TiddlerName>>|
|{{{<<toggleTag TagName TiddlerName 'click me'>>}}}|Same but with custom label|<<toggleTag TagName TiddlerName 'click me'>>|
|{{{<<toggleTag . . 'click me'>>}}}|dot means use default value|<<toggleTag . . 'click me'>>|
!!Notes
* If TiddlerName doesn't exist it will be silently created
* Set label to '-' to specify no label
* See also http://mgtd-alpha.tiddlyspot.com/#ToggleTag2
!!Known issues
* Doesn't smoothly handle the case where you toggle a tag in a tiddler that is current open for editing
* Should convert to use named params
***/
//{{{

if (config.toggleTagAlwaysTouchModDate == undefined) config.toggleTagAlwaysTouchModDate = false;

merge(config.macros,{

	toggleTag: {

		createIfRequired: true,
		shortLabel: "[[%0]]",
		longLabel: "[[%0]] [[%1]]",

		handler: function(place,macroName,params,wikifier,paramString,tiddler) {
			var tiddlerTitle = tiddler ? tiddler.title : '';
			var tag   = (params[0] && params[0] != '.') ? params[0] : "checked";
			var title = (params[1] && params[1] != '.') ? params[1] : tiddlerTitle;
			var defaultLabel = (title == tiddlerTitle ? this.shortLabel : this.longLabel);
			var label = (params[2] && params[2] != '.') ? params[2] : defaultLabel;
			var touchMod = (params[3] && params[3] != '.') ? params[3] : "";
			label = (label == '-' ? '' : label); // dash means no label
			var theTiddler = (title == tiddlerTitle ? tiddler : store.getTiddler(title));
			var cb = createTiddlyCheckbox(place, label.format([tag,title]), theTiddler && theTiddler.isTagged(tag), function(e) {
				if (!store.tiddlerExists(title)) {
					if (config.macros.toggleTag.createIfRequired) {
						var content = store.getTiddlerText(title); // just in case it's a shadow
						store.saveTiddler(title,title,content?content:"",config.options.txtUserName,new Date(),null);
					}
					else 
						return false;
				}
				if ((touchMod != "" || config.toggleTagAlwaysTouchModDate) && theTiddler)
						theTiddler.modified = new Date();
				store.setTiddlerTag(title,this.checked,tag);
				return true;
			});
		}
	}
});

//}}}

|~ViewToolbar|closeTiddler closeOthers +editTiddler > fields syncing permalink references jump|
|~EditToolbar|+saveTiddler -cancelTiddler deleteTiddler|
#[[BTDigg|http://btdigg.org/]]
#[[TPB|http://thepiratebay.se/torrent/8156416]]
#[[BitSnoop|http://bitsnoop.com/]]
#[[isohunt|https://isohunt.com/]]

#[[Trackers|http://bitsnoop.com/trackers/]]
/***
Description: Contains the stuff you need to use Tiddlyspot
Note, you also need UploadPlugin, PasswordOptionPlugin and LoadRemoteFileThroughProxy
from http://tiddlywiki.bidix.info for a complete working Tiddlyspot site.
***/
//{{{

// edit this if you are migrating sites or retrofitting an existing TW
config.tiddlyspotSiteId = 'mm3';

// make it so you can by default see edit controls via http
config.options.chkHttpReadOnly = false;
window.readOnly = false; // make sure of it (for tw 2.2)
window.showBackstage = true; // show backstage too

// disable autosave in d3
if (window.location.protocol != "file:")
	config.options.chkGTDLazyAutoSave = false;

// tweak shadow tiddlers to add upload button, password entry box etc
with (config.shadowTiddlers) {
	SiteUrl = 'http://'+config.tiddlyspotSiteId+'.tiddlyspot.com';
	SideBarOptions = SideBarOptions.replace(/(<<saveChanges>>)/,"$1<<tiddler TspotSidebar>>");
	OptionsPanel = OptionsPanel.replace(/^/,"<<tiddler TspotOptions>>");
	DefaultTiddlers = DefaultTiddlers.replace(/^/,"[[WelcomeToTiddlyspot]] ");
	MainMenu = MainMenu.replace(/^/,"[[WelcomeToTiddlyspot]] ");
}

// create some shadow tiddler content
merge(config.shadowTiddlers,{

'WelcomeToTiddlyspot':[
 "This document is a ~TiddlyWiki from tiddlyspot.com.  A ~TiddlyWiki is an electronic notebook that is great for managing todo lists, personal information, and all sorts of things.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //What now?// &nbsp;&nbsp;@@ Before you can save any changes, you need to enter your password in the form below.  Then configure privacy and other site settings at your [[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]] (your control panel username is //" + config.tiddlyspotSiteId + "//).",
 "<<tiddler TspotControls>>",
 "See also GettingStarted.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Working online// &nbsp;&nbsp;@@ You can edit this ~TiddlyWiki right now, and save your changes using the \"save to web\" button in the column on the right.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Working offline// &nbsp;&nbsp;@@ A fully functioning copy of this ~TiddlyWiki can be saved onto your hard drive or USB stick.  You can make changes and save them locally without being connected to the Internet.  When you're ready to sync up again, just click \"upload\" and your ~TiddlyWiki will be saved back to tiddlyspot.com.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Help!// &nbsp;&nbsp;@@ Find out more about ~TiddlyWiki at [[TiddlyWiki.com|http://tiddlywiki.com]].  Also visit [[TiddlyWiki.org|http://tiddlywiki.org]] for documentation on learning and using ~TiddlyWiki. New users are especially welcome on the [[TiddlyWiki mailing list|http://groups.google.com/group/TiddlyWiki]], which is an excellent place to ask questions and get help.  If you have a tiddlyspot related problem email [[tiddlyspot support|mailto:support@tiddlyspot.com]].",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Enjoy :)// &nbsp;&nbsp;@@ We hope you like using your tiddlyspot.com site.  Please email [[feedback@tiddlyspot.com|mailto:feedback@tiddlyspot.com]] with any comments or suggestions."
].join("\n"),

'TspotControls':[
 "| tiddlyspot password:|<<option pasUploadPassword>>|",
 "| site management:|<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . .  " + config.tiddlyspotSiteId + ">>//(requires tiddlyspot password)//<br>[[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]], [[download (go offline)|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download]]|",
 "| links:|[[tiddlyspot.com|http://tiddlyspot.com/]], [[FAQs|http://faq.tiddlyspot.com/]], [[blog|http://tiddlyspot.blogspot.com/]], email [[support|mailto:support@tiddlyspot.com]] & [[feedback|mailto:feedback@tiddlyspot.com]], [[donate|http://tiddlyspot.com/?page=donate]]|"
].join("\n"),

'TspotSidebar':[
 "<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . .  " + config.tiddlyspotSiteId + ">><html><a href='http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download' class='button'>download</a></html>"
].join("\n"),

'TspotOptions':[
 "tiddlyspot password:",
 "<<option pasUploadPassword>>",
 ""
].join("\n")

});
//}}}
/***
|Name|UnsavedChangesPlugin|
|Source|http://www.TiddlyTools.com/#UnsavedChangesPlugin|
|Version|3.3.4|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|show droplist of tiddlers that have changed since the last time the document was saved|
Display a list of tiddlers that have been changed since the last time the document was saved.  The list includes all new/modified tiddlers as well as those changed with "minor edits" enabled and any tiddlers that you import during the session, regardless of their modification date.
!!!!!Usage
<<<
{{{
<<unsavedChanges panel>> or <<unsavedChanges>>
}}}
{{indent{
the ''panel'' keyword displays a 'control panel' interface containing a droplist of unsaved tiddlers and a 'goto' button, along with a command link to 'save changes'.  Depending upon what other plugins are installed, several additional elements will also be displayed: When [[NestedSlidersPlugin]] is installed, the entire control panel is contained within a ''SLIDER''.  When [[LoadTiddlersPlugin]] is installed, a ''REVERT'' button is added.  When [[SaveAsPlugin]] is installed, a ''SAVE AS'' link is added.  When [[UploadPlugin]] is installed, an ''UPLOAD'' (or ''save to web'') link is added.  When [[TrashPlugin]] is installed and there are tiddlers tagged with<<tag Trash>>, an ''EMPTY TRASH'' link is added.
}}}
{{{
<<unsavedChanges list separator>>
}}}
{{indent{
the ''list'' keyword displays a simple space-separated list of unsaved tiddlers without any other command links.  You can specify an optional ''separator'' value that can be used in place of the default space character.  For example, you can specify {{{"<br>"}}} as the separator in order to display each link, one per line.
}}}
{{{
<<unsavedChanges command label tip>>
}}}
{{indent{
the ''command'' keyword displays a single 'command link' that, when clicked, displays a ~TiddlyWiki popup containing the list of unsaved tiddlers, the 'save changes' command and, depending upon what other plugins are installed, additional commands for 'save as', 'upload', and 'empty trash' (similar to the panel display described above).

You can specify optional ''label'' and ''tip'' parameters in the macro to customize the command link text and tooltip.  The default label for the command link is: "There %1 %0 unsaved tiddler%2...", where:
* %0 is automatically replaced with the number of unsaved changes
* %1 is either "is" (if changes=1) or "are" (if changes>1)
* %2 is either blank (if changes=1) or "s" (if changes>1)
resulting in the text: //"There is 1 unsaved tiddler...", "There are 2 unsaved tiddlers...", etc.//
}}}
<<<
!!!!!Examples
<<<
^^//note: the following examples will not display any output unless you have already created/modified tiddlers in the current document.//^^
{{{<<unsavedChanges>>}}}
<<unsavedChanges>>
----
{{{<<unsavedChanges command>>}}}
<<unsavedChanges command>>
----
{{{<<unsavedChanges list>>}}}
<<unsavedChanges list>>
----
{{{<<unsavedChanges list "<br>">>}}}
<<unsavedChanges list "<br>">>
<<<
!!!!!Revisions
<<<
2010.12.05 3.3.4 display 'save as...' command even if readOnly
2009.03.02 3.3.3 fix handling for titles that contain HTML special chars (lt,gt,quot,amp)
2008.09.02 3.3.2 cleanup popup list output generation and added timestamps/sizes to popup display
2008.08.23 3.3.1 added optional custom 'label' and 'tip' params to 'command' mode and defined default values for mode, label, tip, and separator as object properties for I18N/L10N-readiness.
2008.08.21 3.3.0 complete re-write of rendering and refresh processing to support multiple instances and automatic self-refresh (no longer depends upon core refresh notifications)
2008.08.21 3.2.0 added 'command' option for link+popup as alternative to 'control panel' interface
2008.04.22 3.1.2 use SaveAsPlugin instead of obsolete NewDocumentPlugin to add "save as" link
2007.12.22 3.1.1 hijack removeTiddler() instead of low-level deleteTiddler() to correct tracking and refresh handling issues.  in saveTiddler(), check for 'tiddler rename' (title!=newtitle) and adjust list accordingly.
2007.12.21 3.1.0 added support for {{{<<unsavedChanges list separator>>}}} usage to unsaved tiddlers as a simple list of links, embedded in tiddler content (e.g., [[MainMenu]])
2007.12.20 3.0.0 rewrite to track ALL changed tiddlers, including imports and minor edits, regardless of saved modification dates.  Also, rewrote display logic to directly refresh macro output instead of triggering a page refresh.  The entire process is MUCH more efficient now.
2007.08.02 2.0.0 converted from inline script
2007.01.01 1.0.0 initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.UnsavedChangesPlugin= {major: 3, minor: 3, revision: 4, date: new Date(2010,12,5)};

config.macros.unsavedChanges = {
	changed: [], // list of currently unsaved tiddler titles
	defMode: "panel",
	defSep: " ",
	defLabel: "There %1 %0 unsaved tiddler%2",
	defTip: "view a list of unsaved tiddler changes",
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var wrapper=createTiddlyElement(place,"span",null,"unsavedChanges");
		wrapper.setAttribute("mode",params[0]||this.defMode);
		wrapper.setAttribute("sep",params[1]||this.defSep); // for 'list' mode
		wrapper.setAttribute("label",params[1]||this.defLabel); // for 'command' mode
		wrapper.setAttribute("tip",params[2]||this.defTip); // for 'command' mode
		this.render(wrapper);
	},
	render: function(wrapper) {
		removeChildren(wrapper); // make sure its empty
		if (!this.changed.length) return; // no changes = no output
		switch (wrapper.getAttribute("mode")) {
			case "command": this.command(wrapper); break;
			case "list": this.list(wrapper); break;
			case "panel": default: this.panel(wrapper); break;
		}
	},
	refresh: function() {
		var wrappers=document.getElementsByTagName("span");
		for (var w=0; w<wrappers.length; w++)
			if (hasClass(wrappers[w],"unsavedChanges"))
				this.render(wrappers[w]);
	},
	list: function(place) { // show simple list of unsaved tiddlers
		wikify("[["+this.changed.join("]]"+place.getAttribute("sep")+"[[")+"]]",place);
	},
	command: function(place) { // show command link with popup list
		var c=this.changed.length;
		var txt=place.getAttribute("label").format([c,c==1?'is':'are',c==1?'':'s']);
		var tip=place.getAttribute("tip");
		var action=function(ev) { if (!ev) var ev=window.event;
			var p=Popup.create(this); if (!p) return false;
			var d=createTiddlyElement(p,"div");
			d.style.whiteSpace="normal"; d.style.width="auto"; d.style.padding="2px";
			// gather pretty links for changed tiddlers
			var list=[]; var item=" &nbsp;[[%1 - %0 (%2 bytes)|%0]]&nbsp; ";
			for (var i=config.macros.unsavedChanges.changed.length-1; i>=0; i--) {
				var tid=store.getTiddler(config.macros.unsavedChanges.changed[i]);
				if (!tid) continue;
				var when=tid.modified.formatString('YYYY.0MM.0DD 0hh:0mm:0ss');
				list.push(item.format([tid.title,when,tid.text.length]));
			}
			wikify("@@white-space:nowrap;"+list.join("<br>")+"@@",d);
			var t="\n----\n";
			t+="@@white-space:nowrap;display:block;text-align:center; &nbsp;";
			if (!readOnly) {
				t+="<<saveChanges>>";
				t+=config.macros.saveAs?" | <<saveAs>>":"";
				t+=config.macros.upload?" | <<upload>>":"";
				t+=(config.macros.emptyTrash&&store.getTaggedTiddlers("Trash").length)?" | <<emptyTrash>>":"";
			} else {
				t+=config.macros.saveAs?"<<saveAs>>":"";
			}
			t+="&nbsp; @@";
			wikify(t,d);
			Popup.show();
			ev.cancelBubble=true; if(ev.stopPropagation)ev.stopPropagation();
			return(false);
		}
		createTiddlyButton(place,txt,tip,action,"button");
	},
	panel: function(place) { // show composite droplist+buttons+commands
		// gather changed tiddlers (in reverse order by date - most recent first)
		var tids=[]; for (var i=this.changed.length-1; i>=0; i--)
			{ var t=store.getTiddler(this.changed[i]); if (t) tids.push(t); }
		tids.sort(function(a,b){return a.modified<b.modified?-1:(a.modified==b.modified?0:1);});
		// generate droplist items
 		var list=[]; var item='<option value="%0">%1 - %0 (%2 bytes)</option>';
		for (var i=tids.length-1; i>=0; i--) {
			var when=tids[i].modified.formatString('YYYY.0MM.0DD 0hh:0mm:0ss');
			list.push(item.format([tids[i].title.htmlEncode(),when,tids[i].text.length]));
		}
		// display droplist, buttons, and command links
		var out=''; var c=this.changed.length;
		var NSP=config.formatters.findByField("name","nestedSliders");
		var summary=this.defLabel.format([c,c==1?'is':'are',c==1?'':'s'])
		out+=NSP?'+++(unsaved)['+summary+'|'+this.defTip+']...':(summary+"\n");
		out+='<html><form style="display:inline"><!--\
			--><select size="1" name="list" \
				title="select a tiddler to view" \
				onchange="var v=this.value; if (v.length) story.displayTiddler(null,v);"><!--\
			-->'+list.join('')+'<!--\
			--></select><!--\
			--><input type="button" value="goto" onclick="this.form.list.onchange();">';
		if (config.macros.loadTiddlers)  {
			out+='<input type="button" value="revert" \
				title="import the last saved version of this tiddler" \
				onclick="var v=this.form.list.value; if (!v.length) return; \
					var t=\'<\'+\'<loadTiddlers [[tiddler:\'+v+\']] \'; \
					t+=document.location.href; \
					t+=\' confirm force noreport>\'+\'>\'; \
					var e=document.getElementById(\'executeRevert\'); \
					if (e) e.parentNode.removeChild(e); \
					e=document.createElement(\'span\'); \
					e.id=\'executeRevert\'; \
					wikify(t,e);">';
		}
		out+='</form></html>';
		out+='\n{{small nowrap{';
		if (!readOnly) {
			out+="<<saveChanges>>";
			out+=config.macros.saveAs?" | <<saveAs>>":"";
			out+=config.macros.upload?" | <<upload>>":"";
			out+=(config.macros.emptyTrash&&store.getTaggedTiddlers("Trash").length)?" | <<emptyTrash>>":"";
		} else {
			out+=config.macros.saveAs?"<<saveAs>>":"";
		}
		out+='}}}';
		out+=NSP?'===':'';
		wikify(out,place);
	}
};

// hijack store.saveTiddler() to track changes to tiddlers
if (store.showUnsaved_saveTiddler==undefined) {
	store.showUnsaved_saveTiddler=store.saveTiddler;
	store.saveTiddler=function(title,newtitle) {
		if (title!=newtitle) {
			var i=config.macros.unsavedChanges.changed.indexOf(title);
			if (i!=-1) config.macros.unsavedChanges.changed.splice(i,1); // remove old from list
		} 
		var i=config.macros.unsavedChanges.changed.indexOf(newtitle);
		if (i!=-1) config.macros.unsavedChanges.changed.splice(i,1); // remove new title from list
		config.macros.unsavedChanges.changed.push(newtitle); // add new title to END of list
		var t=this.showUnsaved_saveTiddler.apply(this,arguments);
		if (!this.notificationLevel) config.macros.unsavedChanges.refresh();
		return t;
	}
}

// hijack store.removeTiddler() to track changes to tiddlers
if (store.showUnsaved_removeTiddler==undefined) {
	store.showUnsaved_removeTiddler=store.removeTiddler;
	store.removeTiddler=function(title) {
		var i=config.macros.unsavedChanges.changed.indexOf(title);
		if (i!=-1) config.macros.unsavedChanges.changed.splice(i,1); // remove from list
		this.showUnsaved_removeTiddler.apply(this,arguments);
		if (!this.notificationLevel) config.macros.unsavedChanges.refresh();
	}
}

// hijack store.setDirty() function to reset change list after file save
// note: do NOT hijack the prototype function.  This hijack should only be applied to
// the main 'store' instance only (i.e., don't refresh when loading temporary store
// as part of ImportTiddlers processing)
if (store.showUnsaved_setDirty==undefined) {
	store.showUnsaved_setDirty=store.setDirty;
	store.setDirty = function(flag) {
		var refresh=this.isDirty() && !flag; // 'dirty' to 'clean', force a refresh...
		this.showUnsaved_setDirty.apply(this,arguments); // but change the flag first.
		if (refresh) {
			config.macros.unsavedChanges.changed=[]; // clear changed list
			config.macros.unsavedChanges.refresh();
		}
	}
}
//}}}
| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |
| 31/10/2015 01:26:02 | mm3 | [[/|http://mm3.tiddlyspot.com/]] | [[store.cgi|http://mm3.tiddlyspot.com/store.cgi]] | . | [[index.html | http://mm3.tiddlyspot.com/index.html]] | . |
| 22/11/2015 15:57:03 | mm3 | [[/|http://mm3.tiddlyspot.com/]] | [[store.cgi|http://mm3.tiddlyspot.com/store.cgi]] | . | [[index.html | http://mm3.tiddlyspot.com/index.html]] | . |
| 25/12/2015 10:00:07 | mm3 | [[/|http://mm3.tiddlyspot.com/]] | [[store.cgi|http://mm3.tiddlyspot.com/store.cgi]] | . | [[index.html | http://mm3.tiddlyspot.com/index.html]] | . |
| 20/02/2016 18:36:33 | mm3 | [[/|http://mm3.tiddlyspot.com/]] | [[store.cgi|http://mm3.tiddlyspot.com/store.cgi]] | . | [[index.html | http://mm3.tiddlyspot.com/index.html]] | . |
| 14/05/2016 12:56:05 | mm3 | [[/|http://mm3.tiddlyspot.com/]] | [[store.cgi|http://mm3.tiddlyspot.com/store.cgi]] | . | [[index.html | http://mm3.tiddlyspot.com/index.html]] | . |
| 14/05/2016 13:03:10 | mm3 | [[/|http://mm3.tiddlyspot.com/]] | [[store.cgi|http://mm3.tiddlyspot.com/store.cgi]] | . | [[index.html | http://mm3.tiddlyspot.com/index.html]] | . |
| 04/08/2016 22:09:14 | mm3 | [[/|http://mm3.tiddlyspot.com/]] | [[store.cgi|http://mm3.tiddlyspot.com/store.cgi]] | . | [[index.html | http://mm3.tiddlyspot.com/index.html]] | . |
| 17/08/2016 08:37:51 | mm3 | [[/|http://mm3.tiddlyspot.com/]] | [[store.cgi|http://mm3.tiddlyspot.com/store.cgi]] | . | [[index.html | http://mm3.tiddlyspot.com/index.html]] | . | ok |
| 17/08/2016 08:38:44 | mm3 | [[/|http://mm3.tiddlyspot.com/]] | [[store.cgi|http://mm3.tiddlyspot.com/store.cgi]] | . | [[index.html | http://mm3.tiddlyspot.com/index.html]] | . |
| 17/02/2020 11:20:14 | mm3 | [[/|http://mm3.tiddlyspot.com/]] | [[store.cgi|http://mm3.tiddlyspot.com/store.cgi]] | . | [[index.html | http://mm3.tiddlyspot.com/index.html]] | . |
/***
|''Name:''|UploadPlugin|
|''Description:''|Save to web a TiddlyWiki|
|''Version:''|4.1.3|
|''Source:''|http://tiddlywiki.bidix.info/#UploadPlugin|
|''Requires:''|PasswordOptionPlugin|
***/
//{{{
version.extensions.UploadPlugin = {
	major: 4, minor: 1, revision: 3,
	date: new Date("Feb 24, 2008"),
	source: 'http://tiddlywiki.bidix.info/#UploadPlugin',
	author: 'BidiX (BidiX (at) bidix (dot) info',
	coreVersion: '2.2.0'
};
if (!window.bidix) window.bidix = {}; // bidix namespace
bidix.debugMode = false;	// true to activate both in Plugin and UploadService
	
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;
};

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'} 
			]}
};

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");


//}}}

<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
#[[1|http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj720571%28v=vs.105%29.aspx]]
#[[2|http://www.windowsphone.com/ru-RU/business/phone-management]]
#[[3|http://windows.microsoft.com/en-us/windows/buy]]
#[[4|http://msdn.microsoft.com/ru-ru/library/windows/apps/jj863494.aspx]]
#[[5|http://msdn.microsoft.com/ru-ru/library/windows/apps/hh694064]]
#[[6|http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj206943%28v=vs.105%29.aspx]]
#[[7|http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj720571%28v=vs.105%29.aspx]]
#[[8|http://msdn.microsoft.com/en-us/library/windowsphone/help/jj206719%28v=vs.105%29.aspx]]
#[[9|http://msdn.microsoft.com/ru-ru/ff380145]]
#[[10 !!!|http://www.developer.nokia.com/Community/Wiki/Windows_Phone_8_SDK_on_a_Virtual_Machine_with_Working_Emulator]]
#[[Знакомство с WebGL|http://habrahabr.ru/post/112430/]]
#[[Wiki WebGL|http://ru.wikipedia.org/wiki/WebGL]]
#[[Wiki Web3D|http://en.wikipedia.org/wiki/Web3D]]
#[[Wiki X3D|http://ru.wikipedia.org/wiki/X3D]]
#[[Wiki VML|http://en.wikipedia.org/wiki/Vector_Markup_Language]]
#[[Wiki U3D|http://ru.wikipedia.org/wiki/Universal_3D]]
#[[Wiki 3DXML|http://en.wikipedia.org/wiki/3DXML]]
#[[Wiki MusicXML|http://en.wikipedia.org/wiki/MusicXML]]
#[[WebGL по русски|http://russian-webgl.blogspot.ru/2010/07/0_03.html]]
#[[Каталог из тысяч 3D моделей в браузере с помощью WebGL|http://habrahabr.ru/post/145101/]]
#[[GrabCAD|http://grabcad.com/]]
#[[STL for 3D|http://grabcad.com/library/software/stl-for-3d-print]]
#[[Museum 3D STL|http://www.thingiverse.com/ArtInstituteChicago/collections/museum-love-in-3d/page:1]]
#[[STL files|http://www.thingiverse.com/]]
#[[O3D|http://code.google.com/p/o3d/wiki/Samples]]
#[[Blender Android|http://wiki.blender.org/index.php/Doc:2.6/Manual/Introduction/Installing_Blender/Android]]
#[[STLDroid|https://github.com/justjoheinz/STLDroid/tree/master/STLDroid]]
[[Wiki WebRTC|http://ru.wikipedia.org/wiki/WebRTC]]
[[WebRTC — Знакомимся|http://habrahabr.ru/post/163527/]]
/***
|''Name:''|WikiBar|
|''Version:''|2.0.0 beta3|
|''Source:''|[[AiddlyWiki|http://aiddlywiki.sourceforge.net]]|
|''Type:''|toolbar macro command extension|
!Description
WikiBar is a toolbar that gives access to most of TiddlyWiki's formatting features with a few clicks. It's a handy tool for people who are not familiar with TiddlyWiki syntax.
Besides, with WikiBar-addons, users can extend the power of WikiBar.
!Code
***/
//{{{
config.macros.wikibar = {major: 2, minor: 0, revision: 0, beta: 3, date: new Date(2005,12,30)};
config.macros.wikibar.handler = function(place,macroName,params,wikifier,paramString,tiddler){
  if(!(tiddler instanceof Tiddler))  {return;}
	story.setDirty(tiddler.title,true);
  place.id = 'wikibar'+tiddler.title;
  place.className = 'toolbar wikibar';
};
function wikibar_install(){
  config.commands.wikibar = {
  	text: 'wikibar',
  	tooltip: 'wikibar on/off',
  	handler: function(e,src,title) {
      if(!e){ e = window.event; }
      var theButton = resolveTarget(e);
      theButton.id = 'wikibarButton'+title;
      wikibarPopup.remove();
      wikibar_installAddons(theButton, title);
      wikibar_createWikibar(title);
      return(false);
    }
  };
  config.shadowTiddlers['EditTemplate'] = wikibar_addWikibarCommand(config.shadowTiddlers['EditTemplate']);
  var tiddler = store.getTiddler('EditTemplate');
  if(tiddler){
    tiddler.text = wikibar_addWikibarCommand(tiddler.text);
  }
}
function wikibar_installAddons(theButton, title){
 	var tiddlers = store.getTaggedTiddlers('wikibarAddons');
	if(!tiddlers)	  { return; }
	theButton.addons=[];
  for(var i=0; i<tiddlers.length; i++){
    try{
      eval(tiddlers[i].text);
      try{
        wikibar_addonInstall(title);
        wikibar_addonInstall = null;
        theButton.addons.push({ok:true, name:tiddlers[i].title});
      }catch(ex){
        theButton.addons.push({ok:false, name:tiddlers[i].title, error:ex});
      }
    }catch(ex){
      theButton.addons.push({ok:false, name:tiddlers[i].title, error:ex});
    }
  }
}
function wikibar_addWikibarCommand(tiddlerText){
  var div = document.createElement('div');
  div.style.display = 'none';
  div.innerHTML = tiddlerText;
  for(var i=0; i<div.childNodes.length; i++){
    var o=div.childNodes[i];
    if(o.tagName==='DIV'){
      if(o.className=='toolbar'){
        var macroText = o.getAttribute('macro').trim();
        if(macroText.search('wikibar')<=0){
          macroText += ' wikibar';
          o.setAttribute('macro', macroText);
        }
        break;
      }
    }
  }
  return div.innerHTML.replace(/\"/g, "\'");
}
function wikibar_processSyntaxParams(theSyntax, params){
  try{
    var pcr = 'AplWikibarPcr';
    var rx=null;
    var allParams=null;
    if(params){
      if(typeof(params)=='object'){
        for(var i=0; i<params.length; i++){
          if(params[i]){
            params[i] = params[i].replace(new RegExp('%','g'), pcr).trim();
            rx = '(\\[%'+(i+1)+'\\])' + '|' + '(%'+(i+1)+')';
            theSyntax = theSyntax.replace(new RegExp(rx,'g'), params[i] );
          }
        }
        allParams = params.join(' ').trim();
      }else{
        allParams = params.replace(new RegExp('%','g'), pcr).trim();
        rx = /(\[%1{1}\])|(%1{1})/g;
        theSyntax = theSyntax.replace(rx, allParams);
      }
    }
    if(allParams){
      theSyntax = theSyntax.replace(new RegExp('%N{1}','g'), allParams);
    }
    rx=/\[%(([1-9]{1,}[0-9]{0,})|(N{1}))\]/g;
    theSyntax = theSyntax.replace(rx, '');
    rx=/%(([1-9]{1,}[0-9]{0,})|(N{1}))/g;
    if( theSyntax.match(rx) ){
      throw 'Not enough parameters! ' + theSyntax;
    }
    theSyntax=theSyntax.replace(new RegExp(pcr,'g'), '%');
    return theSyntax;
  } catch(ex){
    return null;
  }
}
function wikibar_resolveEditItem(tiddlerWrapper, itemName){
  if(tiddlerWrapper.hasChildNodes()){
    var c=tiddlerWrapper.childNodes;
    for(var i=0; i<c.length; i++){
      var txt=wikibar_resolveEditItem(c[i], itemName);
      if(!txt){
        continue;
      }else{
        return txt;
      }
    }
  }
  return ((tiddlerWrapper.getAttribute && tiddlerWrapper.getAttribute('edit')==itemName)? tiddlerWrapper : null);
}
function wikibar_resolveEditItemValue(tiddlerWrapper, itemName){
  var o = wikibar_resolveEditItem(tiddlerWrapper, itemName);
  return (o? o.value.replace(/\r/mg,'') : null);
}
function wikibar_resolveTiddlerEditorWrapper(obj){
  if(obj.id=='tiddlerDisplay'){return null;}
  if((obj.getAttribute && obj.getAttribute('macro')=='edit text')){return obj;}
  return wikibar_resolveTiddlerEditorWrapper(obj.parentNode);
}
function wikibar_resolveTiddlerEditor(obj){
  if(obj.hasChildNodes()){
    var c = obj.childNodes;
    for(var i=0; i<c.length; i++){
      var o=wikibar_resolveTiddlerEditor(c[i]);
      if(o){ return o;}
    }
  }
  return ((obj.getAttribute && obj.getAttribute('edit')=='text')? obj : null);
}
function wikibar_resolveTargetButton(obj){
  if(obj.id && obj.id.substring(0,7)=='wikibar'){ return null; }
  if(obj.tiddlerTitle){
    return obj;
  }else{
    return wikibar_resolveTargetButton(obj.parentNode);
  }
}
function wikibar_isValidMenuItem(tool){
  if(!tool){  return false; }
  if(tool.TYPE=='MENU' || tool.TYPE=='MAIN_MENU'){
    for(var key in tool){
      if(key.substring(0,8)=='DYNAITEM'){ return true; }
      if(wikibar_isValidMenuItem(tool[key])){ return true; }
    }
    return false;
  }else{
    return (tool.HANDLER? true : false);
  }
}
function wikibar_editFormat(param){
  var editor = param.button.editor;
  var params = param.params;
  clearMessage();
  if(!editor){ return; }
  var repText = wikibar_processSyntaxParams(this.syntax, params);
  if(repText===null){ return; }
	var st = editor.scrollTop;
	var ss = editor.selectionStart;
	var se = editor.selectionEnd;
	var frontText= '';
	var endText  = '';
	var fullText = editor.value;
	if(se>ss && ss>=0){
	  frontText  = fullText.substring(0, ss);
	  endText    = fullText.substring(se, fullText.length);
	}
	else if(ss===0 && (se===0 || se == fullText.length) ){
    endText    = fullText;
	}
	else if(se==ss && ss>0){
    frontText  = fullText.substring(0, ss);
    endText    = fullText.substring(se, fullText.length);
	}
	if(repText.indexOf('user_text')>=0 && this.hint){
		repText = repText.replace('user_text', this.hint);
	}
	editor.value = frontText + repText + endText;
	editor.selectionStart = ss;
	editor.selectionEnd   = ss + repText.length;
	editor.scrollTop      = st;
	editor.focus();
}
function wikibar_editFormatByWord(param){
  var editor = param.button.editor;
  var params = param.params;
  clearMessage();
  if(!editor){return;}
  var repText = wikibar_processSyntaxParams(this.syntax, params);
  if(repText===null){ return; }
	var st = editor.scrollTop;
	var ss = editor.selectionStart;
	var se = editor.selectionEnd;
	var frontText= '';
	var selText  = '';
	var endText  = '';
	var fullText = editor.value;
	if(se>ss && ss>=0){
	  frontText  = fullText.substring(0, ss);
	  selText	   = fullText.substring(ss,se);
	  endText    = fullText.substring(se, fullText.length);
	}
	else if(ss===0 && (se===0 || se == fullText.length) ){
    endText    = fullText;
	}
	else if(se==ss && ss>0){
    frontText  = fullText.substring(0, ss);
    endText    = fullText.substring(se, fullText.length);
	  if(!( fullText.charAt(ss-1).match(/\W/gi) || fullText.charAt(ss).match(/\W/gi) )){
      var m = frontText.match(/\W/gi);
      if(m){
        ss = frontText.lastIndexOf(m[m.length-1])+1;
      }
      else{
        ss = 0;
      }
      m = endText.match(/\W/gi);
      if(m){
        se += endText.indexOf(m[0]);
      }
      else{
        se = fullText.length;
      }
      frontText = fullText.substring(0, ss);
  	  endText   = fullText.substring(se, fullText.length);
  	  selText   = fullText.substring(ss,se);
	  }
	}
	if(selText.length>0){
		repText = repText.replace('user_text', selText);
	}
	if(repText.indexOf('user_text')>=0 && this.hint){
		repText = repText.replace('user_text', this.hint);
	}
	editor.value = frontText + repText + endText;
	editor.selectionStart = ss;
	editor.selectionEnd   = ss + repText.length;
	editor.scrollTop      = st;
	editor.focus();
}
function wikibar_editFormatByCursor(param){
  var editor = param.button.editor;
  var params = param.params;
  clearMessage();
  if(!editor){ return; }
  var repText = wikibar_processSyntaxParams(this.syntax, params);
  if(repText===null){ return; }
	var st = editor.scrollTop;
	var ss = editor.selectionStart;
	var se = editor.selectionEnd;
	var frontText= '';
	var endText  = '';
	var fullText = editor.value;
	if(se>ss && ss>=0){
	  frontText  = fullText.substring(0, ss);
	  endText    = fullText.substring(se, fullText.length);
	}
	else if(ss===0 && (se===0 || se == fullText.length) ){
    endText    = fullText;
	}
	else if(se==ss && ss>0){
    frontText  = fullText.substring(0, ss);
    endText    = fullText.substring(se, fullText.length);
	}
	if(repText.indexOf('user_text')>=0 && this.hint){
		repText = repText.replace('user_text', this.hint);
	}
	editor.value = frontText + repText + endText;
	editor.selectionStart = ss;
	editor.selectionEnd   = ss + repText.length;
	editor.scrollTop      = st;
	editor.focus();
}
function wikibar_editFormatByLine(param){
  var editor = param.button.editor;
  var params = param.params;
  clearMessage();
  if(!editor){ return; }
  var repText = wikibar_processSyntaxParams(this.syntax, params);
  if(repText===null){ return; }
	var st = editor.scrollTop;
	var ss = editor.selectionStart;
	var se = editor.selectionEnd;
	var frontText= '';
	var selText  = '';
	var endText  = '';
	var fullText = editor.value;
	if(se>ss && ss>=0){
		if(this.byBlock){
	    frontText  = fullText.substring(0, ss);
	    selText		 = fullText.substring(ss,se);
	    endText    = fullText.substring(se, fullText.length);
		}
		else{
	  	se = ss;
		}
	}
  if(ss===0 && (se===0 || se == fullText.length) ){
    var m=fullText.match(/(\n|\r)/g);
    if(m){
      se = fullText.indexOf(m[0]);
    }else{
      se = fullText.length;
    }
    selText    = fullText.substring(0, se);
    endText    = fullText.substring(se, fullText.length);
	}
	else if(se==ss && ss>0){
    frontText  = fullText.substring(0, ss);
    endText    = fullText.substring(se, fullText.length);
    m = frontText.match(/(\n|\r)/g);
    if(m){
      ss = frontText.lastIndexOf(m[m.length-1])+1;
    }
    else{
      ss = 0;
    }
    m = endText.match(/(\n|\r)/g);
    if(m){
      se += endText.indexOf(m[0]);
    }
    else{
      se = fullText.length;
    }
    frontText = fullText.substring(0, ss);
	  selText   = fullText.substring(ss,se);
	  endText   = fullText.substring(se, fullText.length);
	}
	if(selText.length>0){
		repText = repText.replace('user_text', selText);
	}
	if(repText.indexOf('user_text')>=0 && this.hint){
		repText = repText.replace('user_text', this.hint);
	}
	if(this.byBlock){
    if( (frontText.charAt(frontText.length-1)!='\n') && ss>0 ){
    	repText = '\n' + repText;
    }
    if( (endText.charAt(0)!='\n') || se==fullText.length){
    	repText += '\n';
    }
	}
	editor.value = frontText + repText + endText;
	editor.selectionStart = ss;
	editor.selectionEnd   = ss + repText.length;
	editor.scrollTop      = st;
	editor.focus();
}
function wikibar_editFormatByTableCell(param){
  var editor = param.button.editor;
  var params = param.params;
  clearMessage();
  if(!editor){ return; }
  var repText = wikibar_processSyntaxParams(this.syntax, params);
  if(repText===null){ return; }
	var st = editor.scrollTop;
	var ss = editor.selectionStart;
	var se = editor.selectionEnd;
	var frontText= '';
	var selText  = '';
	var endText  = '';
	var fullText = editor.value;
	if(ss===0 || ss==fullText.length){
		throw 'not valid cell!';
	}
	se=ss;
  frontText  = fullText.substring(0, ss);
  endText    = fullText.substring(se, fullText.length);
  i=frontText.lastIndexOf('\n');
  j=frontText.lastIndexOf('|');
  if(i>j || j<0){
  	throw 'not valid cell!';
  }
	ss = j+1;
  i=endText.indexOf('\n');
  j=endText.indexOf('|');
  if(i<j || j<0){
  	throw 'not valid cell!';
  }
  se += j;
  frontText = fullText.substring(0, ss-1);
  selText   = fullText.substring(ss,se);
  endText   = fullText.substring(se+1, fullText.length);
	if(this.key.substring(0,5)=='align'){
		selText = selText.trim();
		if(	selText=='>' || selText=='~' ||	selText.substring(0,8)=='bgcolor(')	{return; }
	}
	if(selText.length>0){
		repText = repText.replace('user_text', selText);
	}
	if(repText.indexOf('user_text')>=0 && this.hint){
		repText = repText.replace('user_text', this.hint);
	}
	editor.value = frontText + repText + endText;
	editor.selectionStart = ss;
	editor.selectionEnd   = ss + repText.length - 2;
	editor.scrollTop      = st;
	editor.focus();
}
function wikibar_editSelectAll(param){
  var editor = param.button.editor;
	editor.selectionStart = 0;
	editor.selectionEnd   = editor.value.length;
	editor.scrollTop      = 0;
	editor.focus();
}
function wikibar_doPreview(param){
  var theButton = param.button;
  var editor = param.button.editor;
  var wikibar = theButton.parentNode;
  if(!wikibar)  { return; }
  title = theButton.tiddlerTitle;
  var editorWrapper = wikibar_resolveTiddlerEditorWrapper(editor);
  var tiddlerWrapper = editorWrapper.parentNode;
  var previewer = document.getElementById('previewer'+title);
  if(previewer){
    previewer.parentNode.removeChild(previewer);
    editorWrapper.style.display = 'block';
    visible=true;
  }else{
    previewer = document.createElement('div');
    previewer.id = 'previewer'+title;
    previewer.className = 'viewer previewer';
    previewer.style.height = (editor.offsetHeight) + 'px';
    wikify(editor.value, previewer);
    tiddlerWrapper.insertBefore(previewer, editorWrapper);
    editorWrapper.style.display = 'none';
    visible=false;
  }
  var pv=null;
  for(var i=0; i<wikibar.childNodes.length; i++){
    try{
      var btn = wikibar.childNodes[i];
      if(btn.toolItem.key == 'preview'){ pv=btn; }
      if(btn.toolItem.key != 'preview'){
        btn.style.display = visible ? '': 'none';
      }
    }catch(ex){}
  }
  if(!pv) { return; }
  if(visible){
    pv.innerHTML = '<font face=\"verdana\">&infin;</font>';
    pv.title = 'preview current tiddler';
  }
  else{
    pv.innerHTML = '<font face=\"verdana\">&larr;</font>';
    pv.title = 'back to editor';
  }
}
function wikibar_doListAddons(param){
  clearMessage();
  var title = param.button.tiddlerTitle;
  var wikibarButton = document.getElementById('wikibarButton'+title);
  var ok=0, fail=0;
  for(var i=0; i<wikibarButton.addons.length; i++){
    var addon=wikibarButton.addons[i];
    if(addon.ok){
      displayMessage('[ o ] '+addon.name);
      ok++;
    }
    else{
      displayMessage('[ x ] '+addon.name + ': ' + addon.error);
      fail++;
    }
  }
  displayMessage('---------------------------------');
  displayMessage(ok + ' ok ; ' + fail + ' failed');
}
function wikibar_getColorCode(param){
  var cbOnPickColor = function(colorCode, param){
    param.params = colorCode;
    param.button.toolItem.doMore(param);
  };
  wikibarColorTool.openColorPicker(param.button, cbOnPickColor, param);
}
function wikibar_getLinkUrl(param){
  var url= prompt('Please enter the link target', (this.param? this.param : ''));
  if (url && url.trim().length>0){
    param.params = url;
    this.doMore(param);
  }
}
function wikibar_getTableRowCol(param){
  var rc= prompt('Please enter (rows x cols) of the table', '2 x 3');
  if (!rc || (rc.trim()).length<=0){ return; }
  var arr = rc.toUpperCase().split('X');
  if(arr.length != 2)   { return; }
  for(var i=0; i<arr.length; i++){
    if(isNaN(arr[i].trim()))  { return; }
  }
  var rows = parseInt(arr[0].trim(), 10);
  var cols = parseInt(arr[1].trim(), 10);
  var txtTable='';
  for(var r=0; r<rows; r++){
    for(var c=0; c<=cols; c++){
      if(c===0){
        txtTable += '|';
      }else{
        txtTable += ' |';
      }
    }
    txtTable += '\n';
  }
  if(txtTable.trim().length>0){
    param.params = txtTable.trim();
    this.doMore(param);
  }
}
function wikibar_getMacroParam(param){
  var p = prompt('Please enter the parameters of macro \"' + this.key + '\":' +
                 '\nSyntax: ' + this.syntax +
                 '\n\nNote: '+
                 '\n%1,%2,... - parameter needed'+
                 '\n[%1] - optional parameter'+
                 '\n%N   - more than one parameter(1~n)'+
                 '\n[%N] - any number of parameters(0~n)'+
                 '\n\nPS:'+
                 '\n1. Parameters should be seperated with space character'+
                 '\n2. Use \" to wrap the parameter that includes space character, ex: \"hello world\"'+
                 '\n3. Input the word(null) for the optional parameter ignored',
                 (this.param? this.param : '') );
  if(!p)  { return; }
  p=p.readMacroParams();
  for(var i=0; i<p.length; i++){
    var s=p[i].trim();
    if(s.indexOf(' ')>0){ p[i]="'"+s+"'"; }
    if(s.toLowerCase()=='null'){ p[i]=null; }
  }
  param.params = p;
  this.doMore(param);
}
function wikibar_getMorePalette(unused){
  clearMessage();
  displayMessage('Get more color palettes(*.gpl) from ColorZilla Palettes site', 'http:\/\/www.iosart.com/firefox/colorzilla/palettes.html');
  displayMessage('Save it as a new tiddler with \"ColorPalettes\" tag');
}
function wikibar_createWikibar(title){
  var theWikibar = document.getElementById('wikibar' + title);
  if(theWikibar){
    if(theWikibar.hasChildNodes()){
      theWikibar.style.display = (theWikibar.style.display=='block'? 'none':'block');
      return;
    }
  }
  var tiddlerWrapper = document.getElementById('tiddler'+title);
  var theTextarea = wikibar_resolveTiddlerEditor(tiddlerWrapper);
  if(!theTextarea){
    clearMessage();
    displayMessage('WikiBar only works in tiddler edit mode now');
    return;
  }else{
    if(!theTextarea.id){ theTextarea.id = 'editor'+title; }
    if(!theTextarea.parentNode.id){ theTextarea.parentNode.id='editorWrapper'+title;  }
  }
  if(theWikibar){
    theWikibar = document.getElementById('wikibar'+title);
  }else{
    var editorWrapper = wikibar_resolveTiddlerEditorWrapper(theTextarea);
    theWikibar = createTiddlyElement(tiddlerWrapper, 'div', 'wikibar'+title, 'toolbar');
    addClass(theWikibar, 'wikibar');
    var previewer = document.getElementById('previewer'+title);
    if(previewer){
      tiddlerWrapper.insertBefore(theWikibar, previewer);
    }else{
      tiddlerWrapper.insertBefore(theWikibar, editorWrapper);
    }
  }
  wikibar_createMenu(theWikibar,wikibarStore,title,theTextarea);
  if(config.options['chkWikibarSetEditorHeight'] && config.options['txtWikibarEditorRows']){
    theTextarea.rows = config.options['txtWikibarEditorRows'];
  }
  setStylesheet(
    '.wikibar{text-align:left;visibility:visible;margin:2px;padding:1px;}.previewer{overflow:auto;display:block;border:1px solid;}#colorPicker{position:absolute;display:none;z-index:10;margin:0px;padding:0px;}#colorPicker table{margin:0px;padding:0px;border:2px solid #000;border-spacing:0px;border-collapse:collapse;}#colorPicker td{margin:0px;padding:0px;border:1px solid;font-size:11px;text-align:center;cursor:auto;}#colorPicker .header{background-color:#fff;}#colorPicker .button{background-color:#fff;cursor:pointer;cursor:hand;}#colorPicker .button:hover{padding-top:3px;padding-bottom:3px;color:#fff;background-color:#136;}#colorPicker .cell{padding:4px;font-size:7px;cursor:crosshair;}#colorPicker .cell:hover{padding:10px;}.wikibarPopup{position:absolute;z-index:10;border:1px solid #014;color:#014;background-color:#cef;}.wikibarPopup table{margin:0;padding:0;border:0;border-spacing:0;border-collapse:collapse;}.wikibarPopup .button:hover{color:#eee;background-color:#014;}.wikibarPopup .disabled{color:#888;}.wikibarPopup .disabled:hover{color:#888;background-color:#cef;}.wikibarPopup tr .seperator hr{margin:0;padding:0;background-color:#cef;width:100%;border:0;border-top:1px dashed #014;}.wikibarPopup tr .icon{font-family:verdana;font-weight:bolder;}.wikibarPopup tr .marker{font-family:verdana;font-weight:bolder;}.wikibarPopup td{font-size:0.9em;padding:2px;}.wikibarPopup input{border:0;border-bottom:1px solid #014;margin:0;padding:0;font-family:arial;font-size:100%;background-color:#fff;}',
  	'WikiBarStyleSheet');
}
function wikibar_createMenu(place,toolset,title,editor){
  if(!wikibar_isValidMenuItem(toolset)){return;}
  if(!(toolset.TYPE=='MAIN_MENU' || toolset.TYPE=='MENU')){ return; }
    for(var key in toolset){
      if(key.substring(0,9)=='SEPERATOR'){
        wikibar_createMenuSeperator(place);
        continue;
      }
      if(key.substring(0,8)=='DYNAITEM'){
        var dynaTools = toolset[key](title,editor);
        if(dynaTools.TYPE && dynaTools.TYPE=='MENU'){
          wikibar_createMenuItem(place,dynaTools,null,editor,title);
        }else{
          dynaTools.TYPE = 'MENU';
          wikibar_createMenu(place, dynaTools, title, editor);
        }
        continue;
      }
      if((toolset[key].TYPE!='MENU' && toolset[key].TYPE!='MAIN_MENU') && !toolset[key].HANDLER){continue;}
      wikibar_createMenuItem(place,toolset,key,editor,title);
    }
}
function wikibar_createMenuItem(place,toolset,key,editor,title){
  if(!key){
    var tool = toolset;
  }else{
    tool = toolset[key];
    tool.key = key;
  }
  if(!wikibar_isValidMenuItem(tool)){return;}
  var toolIsOnMainMenu = (toolset.TYPE=='MAIN_MENU');
  var toolIsMenu = (tool.TYPE=='MENU');
  var theButton;
  if(toolIsOnMainMenu){
    theButton = createTiddlyButton(
                  place,
                  '',
                  (tool.TOOLTIP? tool.TOOLTIP : ''),
                  (toolIsMenu? wikibar_onClickMenuItem : wikibar_onClickItem),
                  'button');
    theButton.innerHTML = (tool.CAPTION? tool.CAPTION : key);
    theButton.isOnMainMenu = true;
    addClass(theButton, (toolIsMenu? 'menu' : 'item'));
  	place.appendChild( document.createTextNode('\n') );
    if(!toolIsMenu){
      if(config.options['chkWikibarPopmenuOnMouseOver']){
        theButton.onmouseover = function(e){ wikibarPopup.remove(); };
      }
    }
  }else{
    theButton=createTiddlyElement(place, 'tr',key,'button');
    theButton.title = (tool.TOOLTIP? tool.TOOLTIP : '');
    theButton.onclick = (toolIsMenu? wikibar_onClickMenuItem : wikibar_onClickItem);
    var tdL = createTiddlyElement(theButton, 'td','','marker');
    var td = createTiddlyElement(theButton, 'td');
    var tdR = createTiddlyElement(theButton, 'td','','marker');
    td.innerHTML = (tool.CAPTION? tool.CAPTION : key);
    if(toolIsMenu){
      tdR.innerHTML='&nbsp;&nbsp;&rsaquo;';
    }
    if(tool.SELECTED){
      tdL.innerHTML = '&radic; ';
      addClass(theButton, 'selected');
    }
    if(tool.DISABLED){
      addClass(theButton, 'disabled');
    }
  }
  theButton.tiddlerTitle = title;
  theButton.toolItem = tool;
  theButton.editor = editor;
  theButton.tabIndex = 999;
  if(toolIsMenu){
    if(config.options['chkWikibarPopmenuOnMouseOver']){
      theButton.onmouseover = wikibar_onClickMenuItem;
    }
  }
}
function wikibar_createMenuSeperator(place){
  if(place.id.substring(0,7)=='wikibar')  { return; }
  var onclickSeperator=function(e){
  	if(!e){ e = window.event; }
  	e.cancelBubble = true;
    if (e.stopPropagation){ e.stopPropagation();  }
  	return(false);
  };
  var theButton=createTiddlyElement(place,'tr','','seperator');
  var td = createTiddlyElement(theButton, 'td','','seperator');
  td.colSpan=3;
  theButton.onclick=onclickSeperator;
	td.innerHTML = '<hr>';
}
function wikibar_genWikibarAbout(){
  var toolset={};
  toolset.version = {
    CAPTION: '<center>WikiBar ' +
              config.macros.wikibar.major + '.' +
              config.macros.wikibar.minor + '.' +
              config.macros.wikibar.revision +
              (config.macros.wikibar.beta? ' beta '+config.macros.wikibar.beta : '') +
              '</center>',
    HANDLER: function(){}
  };
  toolset.SEPERATOR = {};
  toolset.author = {
    CAPTION: '<center>Arphen Lin<br>arphenlin@gmail.com</center>',
    TOOLTIP: 'send mail to the author',
    HANDLER: function(){ window.open('mailto:arphenlin@gmail.com'); }
  };
  toolset.website = {
    CAPTION: '<center>aiddlywiki.sourceforge.net</center>',
    TOOLTIP: 'go to the web site of WikiBar',
    HANDLER: function(){ window.open('http:\/\/aiddlywiki.sourceforge.net/'); }
  };
  return toolset;
}
function wikibar_genWikibarOptions(title, editor){
  var toolset={};
  toolset.popOnMouseOver = {
    CAPTION:'popup menu on mouse over',
    SELECTED: config.options['chkWikibarPopmenuOnMouseOver'],
    HANDLER: function(param){
      config.options['chkWikibarPopmenuOnMouseOver'] = !config.options['chkWikibarPopmenuOnMouseOver'];
      saveOptionCookie('chkWikibarPopmenuOnMouseOver');
      var title = param.button.tiddlerTitle;
      var wikibar = document.getElementById('wikibar'+title);
      if(wikibar){ wikibar.parentNode.removeChild(wikibar); }
      wikibar_createWikibar(title);
    }
  };
  toolset.setEditorSize = {
    CAPTION:'set editor height: <input id=\"txtWikibarEditorRows\" type=text size=1 MAXLENGTH=3 value=\"' +
            (config.options['txtWikibarEditorRows']? config.options['txtWikibarEditorRows']:editor.rows) + '\"> ok',
    HANDLER: function(param){
      var input = document.getElementById('txtWikibarEditorRows');
      if(input){
        var rows = parseInt(input.value, 10);
        if(!isNaN(rows)){
          var editor = param.button.editor;
          editor.rows = rows;
        }else{
          rows=config.maxEditRows;
        }
        config.options['txtWikibarEditorRows'] = rows;
        saveOptionCookie('txtWikibarEditorRows');
        config.maxEditRows = rows;
      }
    }
  };
  toolset.setEditorSizeOnLoadingWikibar = {
    CAPTION:'set editor height on loading wikibar',
    SELECTED: config.options['chkWikibarSetEditorHeight'],
    HANDLER: function(param){
      config.options['chkWikibarSetEditorHeight'] = !config.options['chkWikibarSetEditorHeight'];
      saveOptionCookie('chkWikibarSetEditorHeight');
      if(config.options['chkWikibarSetEditorHeight']){
        var rows = config.options['txtWikibarEditorRows'];
        if(!isNaN(rows)){ rows = 15; }
        var editor = param.button.editor;
        editor.rows = rows;
        config.options['txtWikibarEditorRows'] = rows;
        saveOptionCookie('txtWikibarEditorRows');
      }
    }
  };
  toolset.SEPERATOR = {};
  toolset.update = {
    CAPTION: 'check for updates',
    DISABLED: true,
    HANDLER: function(){}
  };
  return toolset;
}
function wikibar_genPaletteSelector(){
  try{
  	var cpTiddlers = store.getTaggedTiddlers('ColorPalettes');
  	if(!cpTiddlers) { return; }
  	var palettes=[];
  	palettes.push(wikibarColorTool.defaultPaletteName);
  	for(var i=0; i<cpTiddlers.length; i++){
  		palettes.push(cpTiddlers[i].title.trim());
  	}
    var toolset={};
    for(i=0; i<palettes.length; i++){
      toolset[palettes[i]] = {
        TOOLTIP: palettes[i],
        SELECTED: (palettes[i]==wikibarColorTool.paletteName),
        HANDLER: wikibar_doSelectPalette
      };
    }
    return toolset;
  }catch(ex){ return null; }
}
function wikibar_onClickItem(e){
	if(!e){ e = window.event; }
	var theTarget = resolveTarget(e);
	if(theTarget.tagName=='INPUT'){
    e.cancelBubble = true;
    if (e.stopPropagation){ e.stopPropagation(); }
    return;
	}
	var theButton = wikibar_resolveTargetButton(theTarget);
	if(!theButton){ return(false);  }
  	var o = theButton.toolItem;
    if(!o) { return; }
    var param = {
      event: e,
      button: theButton
    };
    if(o.HANDLER){ o.HANDLER(param);  }
  if(o.DISABLED){
    e.cancelBubble = true;
    if (e.stopPropagation){ e.stopPropagation(); }
  }
	return(false);
}
function wikibar_onClickMenuItem(e){
	if(!e){ e = window.event; }
	var theButton = wikibar_resolveTargetButton(resolveTarget(e));
	if(!theButton){ return(false);  }
	e.cancelBubble = true;
	if (e.stopPropagation){ e.stopPropagation(); }
    var title = theButton.tiddlerTitle;
    var editor = theButton.editor;
    var tool = theButton.toolItem;
    if(!tool) { return; }
    var popup = wikibarPopup.create(this);
  	if(popup){
      wikibar_createMenu(popup,tool,title,editor);
      if(!popup.hasChildNodes()){
        wikibarPopup.remove();
      }else{
        wikibarPopup.show(popup, false);
      }
    }
	return(false);
}
var wikibarColorTool = {
  defaultPaletteName : 'default',
  defaultColumns : 16,
  defaultPalette : [
    '#FFF','#DDD','#CCC','#BBB','#AAA','#999','#666','#333','#111','#000','#FC0','#F90','#F60','#F30','#C30','#C03',
    '#9C0','#9D0','#9E0','#E90','#D90','#C90','#FC3','#FC6','#F96','#F63','#600','#900','#C00','#F00','#F36','#F03',
    '#CF0','#CF3','#330','#660','#990','#CC0','#FF0','#C93','#C63','#300','#933','#C33','#F33','#C36','#F69','#F06',
    '#9F0','#CF6','#9C3','#663','#993','#CC3','#FF3','#960','#930','#633','#C66','#F66','#903','#C39','#F6C','#F09',
    '#6F0','#9F6','#6C3','#690','#996','#CC6','#FF6','#963','#630','#966','#F99','#F39','#C06','#906','#F3C','#F0C',
    '#3F0','#6F3','#390','#6C0','#9F3','#CC9','#FF9','#C96','#C60','#C99','#F9C','#C69','#936','#603','#C09','#303',
    '#0C0','#3C0','#360','#693','#9C6','#CF9','#FFC','#FC9','#F93','#FCC','#C9C','#969','#939','#909','#636','#606',
    '#060','#3C3','#6C6','#0F0','#3F3','#6F6','#9F9','#CFC','#9CF','#FCF','#F9F','#F6F','#F3F','#F0F','#C6C','#C3C',
    '#030','#363','#090','#393','#696','#9C9','#CFF','#39F','#69C','#CCF','#C9F','#96C','#639','#306','#90C','#C0C',
    '#0F3','#0C3','#063','#396','#6C9','#9FC','#9CC','#06C','#369','#99F','#99C','#93F','#60C','#609','#C3F','#C0F',
    '#0F6','#3F6','#093','#0C6','#3F9','#9FF','#699','#036','#039','#66F','#66C','#669','#309','#93C','#C6F','#90F',
    '#0F9','#6F9','#3C6','#096','#6FF','#6CC','#366','#069','#36C','#33F','#33C','#339','#336','#63C','#96F','#60F',
    '#0FC','#6FC','#3C9','#3FF','#3CC','#399','#033','#39C','#69F','#00F','#00C','#009','#006','#003','#63F','#30F',
    '#0C9','#3FC','#0FF','#0CC','#099','#066','#3CF','#6CF','#09C','#36F','#0CF','#09F','#06F','#03F','#03C','#30C'
  ],
	colorPicker : null,
  pickColorHandler: null,
  userData: null
};
wikibarColorTool.paletteName = wikibarColorTool.defaultPaletteName;
wikibarColorTool.columns = wikibarColorTool.defaultColumns;
wikibarColorTool.palette = wikibarColorTool.defaultPalette;
wikibarColorTool.onPickColor = function(e){
	if (!e){ e = window.event; }
	var theCell = resolveTarget(e);
	if(!theCell){ return(false); }
    color = theCell.bgColor.toLowerCase();
    if(!color)  { return; }
    wikibarColorTool.displayColorPicker(false);
    if(wikibarColorTool.pickColorHandler){
      wikibarColorTool.pickColorHandler(color, wikibarColorTool.userData);
    }
	return(false);
};
wikibarColorTool.onMouseOver = function(e){
	if (!e){ e = window.event; }
	var theButton = resolveTarget(e);
	if(!theButton){ return(false);  }
  	if(!wikibarColorTool)  { return; }
    color = theButton.bgColor.toUpperCase();
    if(!color)  { return; }
    td=document.getElementById('colorPickerInfo');
  	if(!td) { return; }
  	td.bgColor = color;
  	td.innerHTML = '<span style=\"color:#000;\">'+color+'</span>&nbsp;&nbsp;&nbsp;' +
  	               '<span style=\"color:#fff;\">'+color+'</span>';
	e.cancelBubble = true;
	if (e.stopPropagation){ e.stopPropagation(); }
	return(false);
};
wikibarColorTool.openColorPicker = function(theTarget, pickColorHandler, userData){
  wikibarColorTool.skipClickDocumentEvent = true;
  wikibarColorTool.pickColorHandler = pickColorHandler;
  wikibarColorTool.userData = userData;
  wikibarColorTool.moveColorPicker(theTarget);
};
wikibarColorTool.convert3to6HexColor = function(c){
  c=c.trim();
  var rx=/^\#(\d|[a-f])(\d|[a-f])(\d|[a-f])$/gi;
  return (rx.test(c)? c.replace(rx, '#$1$1$2$2$3$3') : c);
};
wikibarColorTool.numToHexColor = function (n){
  if(typeof(n)=='number' && (n>=0 && n<=255)) {
  		s = n.toString(16).toLowerCase();
  		return ((s.length==1)? '0'+s : s);
  }else{
	 return null;
	}
};
wikibarColorTool.renderColorPalette = function(){
	if(wikibarColorTool.paletteName==wikibarColorTool.defaultPaletteName){
		wikibarColorTool.palette=wikibarColorTool.defaultPalette;
		wikibarColorTool.columns=wikibarColorTool.defaultColumns;
		return;
	}
	tiddlerText = (store.getTiddlerText(wikibarColorTool.paletteName, '')).trim();
	if(tiddlerText.length<=0) { return; }
	var cpContents = tiddlerText.split('\n');
	var colors=[];
	columns = wikibarColorTool.defaultColumns;
	var tmpArray=null;
	errCount=0;
	for(var i=0; i<cpContents.length; i++){
		cpLine=cpContents[i].trim();
    if( (!cpLine) || (cpLine.length<=0) || (cpLine.charAt(0) == '#') ){ continue; }
		if(cpLine.substring(0,8).toLowerCase()=='columns:'){
			tmpArray = cpLine.split(':');
			try{
				columns = parseInt(tmpArray[1],10);
			}catch(ex){
				columns = wikibarColorTool.defaultColumns;
			}
		}else{
			tmpArray = cpLine.replace('\t', ' ').split(/[ ]{1,}/);
			try{
				color='';
				for(var j=0; j<3; j++){
          c=parseInt(tmpArray[j].trim(), 10);
          if(isNaN(c)){
						break;
          }else{
						c=wikibarColorTool.numToHexColor(c);
						if(!c) {break;}
            color+=c;
					}
				}
				if(color.length==6){
					colors.push('#'+color);
				}	else {
					throw 'error';
				}
			}catch(ex){
			}
		}
	}
	if(colors.length>0){
		wikibarColorTool.palette = colors;
		wikibarColorTool.columns = columns;
	}else{
		throw 'renderColorPalette(): No color defined in the palette.';
	}
};
wikibarColorTool.displayColorPicker = function(visible){
  if(wikibarColorTool.colorPicker){
    wikibarColorTool.colorPicker.style.display = (visible? 'block' : 'none');
  }
};
wikibarColorTool.moveColorPicker = function(theTarget){
  if(!wikibarColorTool.colorPicker){
  	wikibarColorTool.createColorPicker();
  }
	var cp = wikibarColorTool.colorPicker;
	var rootLeft = findPosX(theTarget);
  var rootTop = findPosY(theTarget);
  var popupLeft = rootLeft;
  var popupTop = rootTop;
  var popupWidth = cp.offsetWidth;
  var winWidth = findWindowWidth();
  if(popupLeft + popupWidth > winWidth){
	  popupLeft = winWidth - popupWidth;
	}
  cp.style.left = popupLeft + 'px';
  cp.style.top = popupTop + 'px';
  wikibarColorTool.displayColorPicker(true);
};
wikibarColorTool.createColorPicker = function(unused, palette){
  if(palette){	wikibarColorTool.paletteName=palette; }
	wikibarColorTool.renderColorPalette();
	wikibarColorTool.colorPicker = document.createElement('div');
	wikibarColorTool.colorPicker.id = 'colorPicker';
	document.body.appendChild(wikibarColorTool.colorPicker);
  var theTable = document.createElement('table');
  wikibarColorTool.colorPicker.appendChild(theTable);
  var theTR = document.createElement('tr');
	theTable.appendChild(theTR);
	var theTD = document.createElement('td');
	theTD.className = 'header';
	theTD.colSpan = wikibarColorTool.columns;
	theTD.innerHTML = wikibarColorTool.paletteName;
  theTR.appendChild(theTD);
  for(var i=0; i<wikibarColorTool.palette.length; i++){
    if((i%wikibarColorTool.columns)===0){
      theTR = document.createElement('tr');
      theTable.appendChild(theTR);
    }
    theTD = document.createElement('td');
    theTD.className = 'cell';
    theTD.bgColor = wikibarColorTool.convert3to6HexColor(wikibarColorTool.palette[i]);
    theTD.onclick = wikibarColorTool.onPickColor;
    theTD.onmouseover = wikibarColorTool.onMouseOver;
    theTR.appendChild(theTD);
  }
  rest = wikibarColorTool.palette.length % wikibarColorTool.columns;
  if(rest>0){
    theTD = document.createElement('td');
		theTD.colSpan = wikibarColorTool.columns-rest;
    theTD.bgColor = '#000000';
    theTR.appendChild(theTD);
  }
  theTR = document.createElement('tr');
	theTable.appendChild(theTR);
	theTD = document.createElement('td');
	theTD.colSpan = wikibarColorTool.columns;
	theTD.id = 'colorPickerInfo';
  theTR.appendChild(theTD);
};
wikibarColorTool.onDocumentClick = function(e){
	if (!e){ e = window.event; }
	if(wikibarColorTool.skipClickDocumentEvent) {
	  wikibarColorTool.skipClickDocumentEvent = false;
    return true;
	}
	if((!e.eventPhase) || e.eventPhase == Event.BUBBLING_PHASE || e.eventPhase == Event.AT_TARGET){
    wikibarColorTool.displayColorPicker(false);
  }
	return true;
};
function wikibar_doSelectPalette(param){
	clearMessage();
	var theButton = param.button;
	if(!theButton.toolItem.key)  { return; }
	var palette = theButton.toolItem.key;
	var oldPaletteName = wikibarColorTool.paletteName;
	if(oldPaletteName != palette){
		try{
			wikibarColorTool.createColorPicker(theButton, palette);
			displayMessage('Palette \"'+palette+'\" ('+ wikibarColorTool.palette.length +' colors) is selected');
		}catch(ex){
			errMsg = ex;
			if(errMsg.substring(0,18)=='renderColorPalette'){
				displayMessage('Invalid palette \"' + palette + '\", please check it out!');
				wikibarColorTool.createColorPicker(theButton, oldPaletteName);
			}
		}
	}
}
var wikibarPopup = {
  skipClickDocumentEvent: false,
	stack: []
};
wikibarPopup.resolveRootPopup = function(o){
  if(o.isOnMainMenu){  return null; }
  if(o.className.substring(0,12)=='wikibarPopup'){  return o;}
  return wikibarPopup.resolveRootPopup(o.parentNode);
};
wikibarPopup.create = function(root){
  for(var i=0; i<wikibarPopup.stack.length; i++){
    var p=wikibarPopup.stack[i];
    if(p.root==root){
      wikibarPopup.removeFrom(i+1);
      return null;
    }
  }
  var rootPopup = wikibarPopup.resolveRootPopup(root);
  if(!rootPopup){
    wikibarPopup.remove();
  }else{
    wikibarPopup.removeFromRootPopup(rootPopup);
  }
	var popup = createTiddlyElement(document.body,'div','wikibarPopup'+root.toolItem.key,'wikibarPopup');
	var pop = createTiddlyElement(popup,'table','','');
	wikibarPopup.stack.push({rootPopup: rootPopup, root: root, popup: popup});
	return pop;
};
wikibarPopup.show = function(unused,slowly){
	var curr = wikibarPopup.stack[wikibarPopup.stack.length-1];
	var overlayWidth = 1;
  var rootLeft, rootTop, rootWidth, rootHeight, popupLeft, popupTop, popupWidth;
  if(curr.rootPopup){
  	rootLeft = findPosX(curr.rootPopup);
  	rootTop = findPosY(curr.root);
  	rootWidth = curr.rootPopup.offsetWidth;
  	popupLeft = rootLeft + rootWidth - overlayWidth;
  	popupTop = rootTop;
  }else{
  	rootLeft = findPosX(curr.root);
  	rootTop = findPosY(curr.root);
  	rootHeight = curr.root.offsetHeight;
  	popupLeft = rootLeft;
  	popupTop = rootTop + rootHeight;
  }
	var winWidth = findWindowWidth();
	popupWidth = curr.popup.offsetWidth;
	if(popupLeft + popupWidth > winWidth){
		popupLeft = rootLeft - popupWidth + overlayWidth;
	}
	curr.popup.style.left = popupLeft + 'px';
	curr.popup.style.top = popupTop + 'px';
	curr.popup.style.display = 'block';
	addClass(curr.root, 'highlight');
	if(config.options.chkAnimate){
		anim.startAnimating(new Scroller(curr.popup,slowly));
	}else{
		window.scrollTo(0,ensureVisible(curr.popup));
	}
};
wikibarPopup.remove = function(){
	if(wikibarPopup.stack.length > 0){
		wikibarPopup.removeFrom(0);
  }
};
wikibarPopup.removeFrom = function(from){
	for(var t=wikibarPopup.stack.length-1; t>=from; t--){
		var p = wikibarPopup.stack[t];
		removeClass(p.root,'highlight');
		p.popup.parentNode.removeChild(p.popup);
  }
	wikibarPopup.stack = wikibarPopup.stack.slice(0,from);
};
wikibarPopup.removeFromRootPopup = function(from){
  for(var t=0; t<wikibarPopup.stack.length; t++){
    var p = wikibarPopup.stack[t];
    if(p.rootPopup==from){
      wikibarPopup.removeFrom(t);
      break;
    }
  }
};
wikibarPopup.onDocumentClick = function(e){
	if (!e){ e = window.event; }
	if(wikibarPopup.skipClickDocumentEvent){
	 wikibarPopup.skipClickDocumentEvent=false;
	 return true;
	}
	if((!e.eventPhase) || e.eventPhase == Event.BUBBLING_PHASE || e.eventPhase == Event.AT_TARGET){
		wikibarPopup.remove();
	}
	return true;
};
var wikibarStore = {
  TYPE: 'MAIN_MENU',
  help:{
    TYPE:'MENU',
    CAPTION: '<font face=\"verdana\">?</font>',
    TOOLTIP:     'about WikiBar',
    options:{
      TYPE:'MENU',
      DYNAITEM: wikibar_genWikibarOptions
    },
    about:{
      TYPE:'MENU',
      DYNAITEM: wikibar_genWikibarAbout
    }
  },
  preview:{
    TOOLTIP:     'preview this tiddler',
    CAPTION: '<font face=\"verdana\">&infin;</font>',
    HANDLER: wikibar_doPreview
  },
	line:{
		TOOLTIP:    'horizontal line',
		CAPTION: '<font face=\"verdana\">&mdash;</font>',
		syntax: '\n----\n',
		HANDLER: wikibar_editFormatByCursor
	},
	crlf:{
		TOOLTIP:    'new line',
		CAPTION: '<font face=\"verdana\">&para;</font>',
		syntax: '\n',
		HANDLER: wikibar_editFormatByCursor
	},
	selectAll:{
		TOOLTIP:    'select all',
		CAPTION: '<font face=\"verdana\">&sect;</font>',
		HANDLER: wikibar_editSelectAll
	},
	deleteSelected:{
		TOOLTIP:    'delete selected',
		CAPTION: '<font face=\"verdana\">&times;</font>',
		syntax: '',
		HANDLER: wikibar_editFormat
	},
  textFormat:{
    TYPE: 'MENU',
    CAPTION: 'text',
    TOOLTIP: 'text formatters',
    ignore:{
			TOOLTIP:     'ignore wiki word',
			CAPTION: 'ignore wikiWord',
			syntax:  '~user_text',
			hint:    'wiki_word',
			HANDLER:    wikibar_editFormatByWord
		},
		bolder:{
			TOOLTIP:     'bolder text',
			CAPTION: '<strong>bolder</strong>',
			syntax:  "''user_text''",
			hint:		 'bold_text',
			HANDLER:    wikibar_editFormatByWord
		},
		italic:{
			TOOLTIP:    'italic text',
			CAPTION: '<em>italic</em>',
			syntax: '\/\/user_text\/\/',
			hint:		'italic_text',
			HANDLER: wikibar_editFormatByWord
		},
		underline:{
			TOOLTIP:    'underline text',
			CAPTION: '<u>underline</u>',
			syntax: '__user_text__',
			hint:		'underline_text',
			HANDLER: wikibar_editFormatByWord
		},
		strikethrough:{
			TOOLTIP:    'strikethrough text',
			CAPTION: '<strike>strikethrough</strike>',
			syntax: '==user_text==',
			hint:		'strikethrough_text',
			HANDLER: wikibar_editFormatByWord
		},
		superscript:{
			TOOLTIP:    'superscript text',
			CAPTION: 'X<sup>superscript</sup>',
			syntax: '^^user_text^^',
			hint:		'superscript_text',
			HANDLER: wikibar_editFormatByWord
		},
		subscript:{
			TOOLTIP:    'subscript text',
			CAPTION: 'X<sub>subscript</sub>',
			syntax: '~~user_text~~',
			hint:		'subscript_text',
			HANDLER: wikibar_editFormatByWord
		},
		comment:{
			TOOLTIP:    'comment text',
			CAPTION: 'comment text',
			syntax: '/%user_text%/',
			hint:		'comment_text',
			HANDLER: wikibar_editFormatByWord
		},
		monospaced:{
			TOOLTIP:    'monospaced text',
			CAPTION: '<code>monospaced</code>',
			syntax: '{{{user_text}}}',
			hint:		'monospaced_text',
			HANDLER: wikibar_editFormatByWord
		}
  },
  paragraph:{
    TYPE: 'MENU',
    TOOLTIP: 'paragarph formatters',
    list:{
      TYPE: 'MENU',
      TOOLTIP: 'list tools',
      bullet:{
  			TOOLTIP:    'bullet point',
  			syntax: '*user_text',
  			hint:		'bullet_text',
  			HANDLER: wikibar_editFormatByLine
  		},
  		numbered:{
  			TOOLTIP:    'numbered list',
  			syntax: '#user_text',
  			hint:		'numbered_text',
  			HANDLER: wikibar_editFormatByLine
  		}
    },
    heading:{
      TYPE: 'MENU',
      heading1:{
  		  CAPTION:'<h1>Heading 1</h1>',
  			TOOLTIP:    'Heading 1',
  			syntax: '!user_text',
  			hint:		'heading_1',
  			HANDLER: wikibar_editFormatByLine
  		},
  		heading2:{
  		  CAPTION:'<h2>Heading 2<h2>',
  			TOOLTIP:    'Heading 2',
  			syntax: '!!user_text',
  			hint:		'heading_2',
  			HANDLER: wikibar_editFormatByLine
  		},
  		heading3:{
  		  CAPTION:'<h3>Heading 3</h3>',
  			TOOLTIP:    'Heading 3',
  			syntax: '!!!user_text',
  			hint:		'heading_3',
  			HANDLER: wikibar_editFormatByLine
  		},
  		heading4:{
  		  CAPTION:'<h4>Heading 4</h4>',
  			TOOLTIP:    'Heading 4',
  			syntax: '!!!!user_text',
  			hint:		'heading_4',
  			HANDLER: wikibar_editFormatByLine
  		},
  		heading5:{
  		  CAPTION:'<h5>Heading 5</h5>',
  			TOOLTIP:    'Heading 5',
  			syntax: '!!!!!user_text',
  			hint:		'heading_5',
  			HANDLER: wikibar_editFormatByLine
  		}
    },
    comment:{
      TYPE: 'MENU',
      commentByLine:{
  			CAPTION:'comment by line',
  			TOOLTIP:    'line comment',
  			syntax: '/%user_text%/',
  			hint:		'comment_text',
  			HANDLER: wikibar_editFormatByLine
  		},
  		commentByBlock:{
  			CAPTION:'comment by block',
  			TOOLTIP:    'block comment',
  			syntax: '/%\nuser_text\n%/',
  			hint:		'comment_text',
  			byBlock: true,
  			HANDLER: wikibar_editFormatByLine
  		}
    },
    monospaced:{
      TYPE: 'MENU',
  		monosByLine:{
  			CAPTION: 	'monospaced by line',
  			TOOLTIP:    'line monospaced',
  			syntax: '{{{\nuser_text\n}}}',
  			hint:		'monospaced_text',
  			HANDLER: wikibar_editFormatByLine
  		},
  		monosByBlock:{
  			CAPTION: 	'monospaced by block',
  			TOOLTIP:    'block monospaced',
  			syntax: '{{{\nuser_text\n}}}',
  			hint:		'monospaced_text',
  			byBlock: true,
  			HANDLER: wikibar_editFormatByLine
  		}
    },
    quote:{
      TYPE: 'MENU',
  		quoteByLine:{
  			CAPTION: 	'quote by line',
  			TOOLTIP:    'line quote',
  			syntax: '>user_text',
  			hint:		'quote_text',
  			HANDLER: wikibar_editFormatByLine
  		},
  		quoteByBlcok:{
  			CAPTION: 	'quote by block',
  			TOOLTIP:    'block quote',
  			syntax: '<<<\nuser_text\n<<<',
  			hint:		'quote_text',
  			byBlock: true,
  			HANDLER: wikibar_editFormatByLine
  		}
    },
    plugin:{
      TYPE: 'MENU',
      code:{
  			CAPTION: 	'code area',
  			TOOLTIP:    'block monospaced for plugin',
  			syntax: '\n\/\/{{{\nuser_text\n\/\/}}}\n',
  			hint:		'monospaced_plugin_code',
  			byBlock: true,
  			HANDLER: wikibar_editFormatByLine
  		},
  		commentByLine:{
  			CAPTION: 	'comment by line',
  			TOOLTIP:    'line comment',
  			syntax: '\/\/user_text',
  			hint:		'plugin_comment',
  			HANDLER: wikibar_editFormatByLine
  		},
  		commentByBlock:{
  			CAPTION: 	'comment by block',
  			TOOLTIP:    'block comment',
  			syntax: '\/\***\nuser_text\n***\/',
  			hint:		'plugin_comment',
  			byBlock: true,
  			HANDLER: wikibar_editFormatByLine
  		}
    },
    css:{
      TYPE: 'MENU',
      code:{
  			CAPTION: 	'code area',
  			TOOLTIP:    'block monospaced for css',
  			syntax: '\n\nuser_text\n\n',
  			hint:		'monospaced_css_code',
  			byBlock: true,
  			HANDLER: wikibar_editFormatByLine
  		},
  		commentByLine:{
  			CAPTION: 	'comment by line',
  			TOOLTIP:    'line comment',
  			syntax: '',
  			hint:		'css_comment',
  			HANDLER: wikibar_editFormatByLine
  		},
  		commentByBlock:{
  			CAPTION: 	'comment by block',
  			TOOLTIP:    'block comment',
  			syntax: '',
  			hint:		'css_comment',
  			byBlock: true,
  			HANDLER: wikibar_editFormatByLine
  		}
    }
  },
  color:{
    TYPE: 'MENU',
    TOOLTIP: 'color tools',
    highlight:{
		  CAPTION:'highlight text',
			TOOLTIP:    'highlight text',
			syntax: '@@user_text@@',
			hint:		'highlight_text',
			HANDLER: wikibar_editFormatByWord
		},
		color:{
		  CAPTION:'text color',
			TOOLTIP:    'text color',
			hint:		'your_text',
			syntax: '@@color(%1):user_text@@',
			HANDLER:   wikibar_getColorCode,
			doMore: wikibar_editFormatByWord
		},
		bgcolor:{
		  CAPTION:'background color',
			TOOLTIP:    'background color',
			hint:		'your_text',
			syntax: '@@bgcolor(%1):user_text@@',
			HANDLER: wikibar_getColorCode,
			doMore: wikibar_editFormatByWord
		},
		colorcode:{
      CAPTION:'color code',
      TOOLTIP:    'insert color code',
      syntax: '%1',
      HANDLER: wikibar_getColorCode,
      doMore: wikibar_editFormatByCursor
    },
    'color palette':{
      TYPE:'MENU',
      DYNAITEM: wikibar_genPaletteSelector,
  		SEPERATOR:{},
  		morePalette:{
  		  CAPTION:'more palettes',
  		  TOOLTIP:'get more palettes',
  		  HANDLER: wikibar_getMorePalette
  		}
    }
  },
  link:{
    TYPE: 'MENU',
    TOOLTIP: 'insert link',
    wiki:{
		  CAPTION:'wiki link',
			TOOLTIP:    'wiki link',
			syntax: '[[user_text]]',
			hint:		'wiki_word',
			HANDLER: wikibar_editFormatByWord
		},
		pretty:{
			CAPTION: 	'pretty link',
			TOOLTIP:    'pretty link',
			syntax: '[[user_text|%1]]',
			hint:		'pretty_word',
			param:	'PrettyLink Target',
			HANDLER:   wikibar_getLinkUrl,
			doMore: wikibar_editFormatByWord
		},
		url:{
			TOOLTIP:    'url link',
			syntax: '[[user_text|%1]]',
			hint:		'your_text',
			param:	'http:\/\/...',
			HANDLER:   wikibar_getLinkUrl,
			doMore: wikibar_editFormatByWord
		},
		image:{
			TOOLTIP:    'image link',
			syntax: '[img[user_text|%1]]',
			hint:		'alt_text',
			param:	'image/icon.jpg',
			HANDLER:   wikibar_getLinkUrl,
			doMore: wikibar_editFormatByWord
		}
  },
  macro:{},
  more:{
    TYPE: 'MENU',
    TOOLTIP: 'more tools',
    table:{
      TYPE: 'MENU',
      TOOLTIP: 'table',
      table:{
  		  CAPTION:'create table',
  			TOOLTIP:    'create a new table',
  			syntax: '\n%1\n',
  			HANDLER: wikibar_getTableRowCol,
  			doMore: wikibar_editFormatByWord
  		},
  		header:{
  			TOOLTIP:    'table header text',
  			syntax: '|user_text|c',
  			hint:		'table_header',
  			HANDLER: wikibar_editFormatByWord
  		},
  		cell:{
  			TOOLTIP:    'create a tabel cell',
  			syntax: '|user_text|',
  			hint:		'your_text',
  			HANDLER: wikibar_editFormatByWord
  		},
  		columnHeader:{
  		  CAPTION:'column header',
  			TOOLTIP:    'create a column header cell',
  			syntax: '|!user_text|',
  			hint:		'column_header',
  			HANDLER: wikibar_editFormatByWord
  		},
  	  cell:{
  	    TYPE: 'MENU',
        CAPTION: 'cell options',
    		bgcolor:{
    			CAPTION: 	'background color',
    			TOOLTIP:    'cell bgcolor',
    			syntax: '|bgcolor(%1):user_text|',
    			hint:		'your_text',
    			HANDLER: wikibar_getColorCode,
    			doMore: wikibar_editFormatByTableCell
    		},
    		alignLeft:{
    			CAPTION: 	'align left',
    			TOOLTIP:    'left align cell text',
    			syntax: '|user_text|',
    			hint:		'your_text',
    			HANDLER: wikibar_editFormatByTableCell
    		},
    		alignCenter:{
    			CAPTION: 	'align center',
    			TOOLTIP:    'center align cell text',
    			syntax: '| user_text |',
    			hint:		'your_text',
    			HANDLER: wikibar_editFormatByTableCell
    		},
    		alignRight:{
    			CAPTION: 	'align right',
    			TOOLTIP:    'right align cell text',
    			syntax: '| user_text|',
    			hint:		'your_text',
    			HANDLER: wikibar_editFormatByTableCell
    		}
    	}
    },
    html:{
      TYPE: 'MENU',
      html:{
  			CAPTION: 	'<html>',
  			TOOLTIP:    'html tag',
  			syntax: '<html>\nuser_text\n</html>',
  			hint:		'html_content',
  			byBlock: true,
  			HANDLER: wikibar_editFormatByLine
  		}
    }
  },
  addon:{
    TYPE: 'MENU',
    TOOLTIP:'3rd party tools',
    'about addons':{
      TOOLTIP: 'list loaded addons',
      HANDLER: wikibar_doListAddons
    },
    SEPERATOR:{}
  }
};
addEvent(document, 'click', wikibarColorTool.onDocumentClick);
addEvent(document, 'click', wikibarPopup.onDocumentClick);
wikibar_install();
//}}}
/***
!WikiBar CSS 說明
*井號開頭表示 id, ex: #colorPicker
*點號開頭表示 class, ex: .wikibar

!WikiBar Colors Used
*@@bgcolor(#014):color(#fff): #014 - 選單邊框@@
*@@bgcolor(#014):color(#fff): #014 - 選單字體色@@
*@@bgcolor(#cef): #cef - 選單底色@@
*@@bgcolor(#eee): #eee - 選單字體色:游標滑過時@@
*@@bgcolor(#014):color(#fff): #014 - 選單底色:游標滑過時@@
*@@bgcolor(#888): #888 - 無效選單字體色@@
*@@bgcolor(#cef): #cef - 無效選單底色:游標滑過時@@
*@@bgcolor(#014):color(#fff): #014 - 分隔線顏色@@

!wikibar: 工具列, 繼承 .toolbar /%==============================================%/
***/
/*{{{*/
.wikibar {
  text-align: left;
  visibility: visible;
  margin:2px; padding:1px;
}
/*}}}*/

/***
!previewer: 預覽區, 繼承 .viewer /%==============================================%/
***/
/*{{{*/
.previewer {overflow:auto; display:block; border:1px solid;}
/*}}}*/

/***
!colorPicker 調色盤 /%==============================================%/
***/
/*{{{*/
#colorPicker {position:absolute; display:none; z-index:10; margin:0px; padding:0px; }
#colorPicker table {
  margin:0px; padding:0px;
  border:2px solid #000;
  border-spacing: 0px;
  border-collapse: collapse;
}
#colorPicker td {margin:0px; padding:0px; border:1px solid; font-size:11px; text-align:center; cursor:auto;}
#colorPicker .header {background-color: #fff;}
#colorPicker .button {background-color: #fff; cursor:pointer; cursor:hand;}
#colorPicker .button:hover {padding-top:3px; padding-bottom:3px; color:#fff; background-color:#136;}
#colorPicker .cell {padding:4px; font-size:7px; cursor:crosshair;}
#colorPicker .cell:hover {padding:10px;}
/*}}}*/

/***
!wikibarPopup 功能表選單 /%==============================================%/
***/
/*{{{*/
.wikibarPopup{
  position:absolute; z-index:10;
  border: 1px solid #014;
  color: #014; background-color: #cef;
  /*
  max-height:150px;
  overflow-x:hidden; overflow-y:auto;
  */
}

/* 彈出選單 */
.wikibarPopup table{
  margin:0; padding:0;
  border:0;
  border-spacing:0;
  border-collapse:collapse;
}

/* 選單上之按鈕 */
.wikibarPopup .button:hover{color:#eee; background-color: #014;}

/*
.wikibarPopup .selected {background-color: #cf6;}
*/

/* 停用選項 */
.wikibarPopup .disabled {color: #888;}
.wikibarPopup .disabled:hover {color: #888; background-color: #cef;}

/* 分隔線 */
.wikibarPopup tr .seperator hr{
  margin:0; padding:0; background-color: #cef; width: 100%;
  border: 0;
  border-top: 1px dashed #014;
}

/* 選項左右兩邊符號區 */
.wikibarPopup tr .icon   {font-family:verdana; font-weight:bolder;}
.wikibarPopup tr .marker {font-family:verdana; font-weight:bolder;}

/* 選項 */
.wikibarPopup td {font-size:0.9em; padding:2px;}

.wikibarPopup input{
  border:0;
  border-bottom: 1px solid #014;
  margin:0; padding:0;
  font-family: arial;
  font-size:100%;
  background-color: #fff;
}

/*}}}*/
Вот перечень наиболее популярных инструкции wiki-разметки:
# Заголовки !, !!, !!!, !!!, !!!!, !!!!
# Обычные списки - *, **, **
# Нумерованные списки #, ##, ##
# Жирный - две одинарных кавычки в начале и в конце.
# Наклонный - два слэша в начале и в конце
Xvfb (X virtual framebuffer) — виртуальный X-сервер, который для вывода использует не видеокарту, а оперативную память.

[[Linux: запуск графических приложений в фоне|http://habrahabr.ru/post/113928/]]
[[wiki|http://en.wikipedia.org/wiki/Xvfb]]
ZPG - Zero Player Game -  вид компьютерных игр, в которых вмешательство человека в игровой процесс минимально или отсутствует вовсе.

# [[Годвилль|http://godville.net]]
# [[Сказка|http://the-tale.org]]
Аддоны:
# [[UnMHT|https://addons.mozilla.org/ru/firefox/addon/unmht/]]
# [[Super Start|https://addons.mozilla.org/ru/firefox/addon/super-start/]]
# [[Secure Login|https://addons.mozilla.org/ru/firefox/addon/secure-login/]]
# [[Scriptish|https://addons.mozilla.org/ru/firefox/addon/scriptish/]]
# [[Scriptify|https://addons.mozilla.org/ru/firefox/addon/scriptify/]]
# [[Save File to|https://addons.mozilla.org/ru/firefox/addon/save-file-to/]]
# [[RESTClient|https://addons.mozilla.org/ru/firefox/addon/restclient/]]
# [[REST Easy|https://addons.mozilla.org/ru/firefox/addon/rest-easy/]]
# [[RequestPolicy|https://addons.mozilla.org/ru/firefox/addon/requestpolicy/]]
# [[RefControl|https://addons.mozilla.org/ru/firefox/addon/refcontrol/]]
# [[Proxy Selector|https://addons.mozilla.org/ru/firefox/addon/proxy-selector/]]
# [[Offline QR generator|https://addons.mozilla.org/ru/firefox/addon/offlineqr/]]
# [[NoScript|https://addons.mozilla.org/ru/firefox/addon/noscript/]]
# [[Google search link fix|https://addons.mozilla.org/ru/firefox/addon/google-search-link-fix/]]
# [[Ghostery|https://addons.mozilla.org/ru/firefox/addon/ghostery/]]
# [[Firebug|https://addons.mozilla.org/ru/firefox/addon/firebug/]]
# [[FB2 Reader|https://addons.mozilla.org/ru/firefox/addon/fb2-reader/]]
# [[friGate|https://addons.mozilla.org/ru/firefox/addon/frigate/]]
# [[English-Russian dictionary|https://addons.mozilla.org/en-US/firefox/addon/english-russian-dict/]]
# [[Russian/English spell dictionary 1.0.0.1|http://ftp.mozilla-russia.org/dictionaries/ru-en_spell_dictionary.xpi]]
# [[S3.Google Переводчик|https://addons.mozilla.org/ru/firefox/addon/s3google-translator/]]

ссылки:
# http://www.citilink.ru/
# http://pickpoint.ru/partners/
# https://boards.4chan.org/gif/
# http://www.dressterra.ru/mens-rompers/?page=1
# http://futujama.ru/collection/dlya-nego
# http://www.kombinezon4u.ru/
# http://www.yoox.com/ru/54117735he/item?dept=women&tp=78825&utm_source=direct_ru&utm_medium=affiliazione&utm_campaign=feed_shmoter_ru#cod10=54117735HE&sizeId=
# http://www.luisaviaroma.com/index.aspx#ItemSrv.ashx|SeasonId=60I&CollectionId=3JD&ItemId=2&SeasonMemoCode=sale&GenderMemoCode=men&CategoryId=&SubLineId=clothing&PID=5806503&AID=11104552&utm_source=CommissionJunction&utm_medium=affiliation
# http://www.lamoda.ru/p/pu053emdtl71/clothes-puma-kombinezon/?utm_campaign=partner_110&utm_medium=ap&utm_source=lap&utm_content=3316977
# http://www.shmoter.ru/muzhskie-kombinezony
# http://www.asos.com/ru/Men/Onesies/Cat/pgecategory.aspx?cid=16714
# http://3dpmake.com/t/opensource
# http://www.hongkiat.com/blog/download-free-stl-3d-models/
# http://prn3d.ru/stati/pechat-na-3d-printere/abs-otlipaet.html
# http://prn3d.ru/stati/pechat-na-3d-printere/uskoreine-progreva.html
# http://ardunn.ru/goods/3D-принтер-Ppusa-I3-Acryll
# http://все-роботы.рф/index.php/www-shop/komplektuyushchie-dlya-3d-printera-buy
# http://avatech3d.ru/contacts
# http://home3dprint.ru/
# http://ro-bo.ru/katalog/hi-tech-gadzhety/neyrointerfeysyi/
# http://roboino.ru/collection/3d?page=2
# http://printers3d.ru/index.php?com=autoshop&elemId=119
# http://www.foroffice.ru/products/3d-plotter_allpages.html
# http://habrahabr.ru/company/masterkit/blog/253240/
# http://amperka.ru/
# http://gazontech.ru/catalog/274/7622/
# http://www.splav350.ru/ru/zhuk.html
# http://www.diving-nn.ru/new_treval
# http://club.navionic.ru/
# http://extremenn.ru/
# http://www.mirpr.ru/articles/
# http://aeroclubnn.ru/
# http://www.vertoletnn.ru/index.php?option=com_content&view=article&id=277&Itemid=337
# http://www.samaragid.ru/amusement/answers/gde-nauchitsya-letat-na-vertolete-v-nizhnem-novgorode.html
# http://maps.aopa.ru/#lon/43.662952/lat/56.163145/z/10/bl/gm/mode/r/ll/a/p/133
# http://upgrade-garage.ru/shop.php?cat=5#2
# http://navoroty.com/contacts
# http://www.niva4x4shop.com/index.php?route=product/product&product_id=162
# http://www.autoprospect.ru/vaz/21213-niva/21-3-snyatie-bloka-rele.html
# http://bery24.ru/
# http://www.avtozapchasty.ru/shop/i.php?id=8725674
# http://www.niva-club.net/
# http://www.niva4x4.ru/
# http://4x4nn.ru/
# http://niva-remont.com/zamena-generatora-svoimi-rukami/
# http://www.niva-lada4x4.ru/shop/product_info.php?cPath=37&products_id=1654
# http://niva-lada4x4.ru/shop/product_info.php?products_id=2670
# http://the-tale.org/game/
# https://appdb.winehq.org/objectManager.php?sClass=version&iId=25522
# https://www.ingress.com/intel?ll=56.272192,43.993957&z=15
# https://www.lektorium.tv/course/22896?id=22896
# http://www.intuit.ru/catalog/se/intel/
# http://universarium.org/#/
# http://lingualeo.com/ru/dashboard
# http://192.168.11.121
# http://192.168.11.10:9081/transmission/web/#upload
# http://mm3.github.io/4096/
# https://code.google.com/p/mm3/
# https://github.com/mm3
# http://mm3.tiddlyspot.com/
# https://www.inoreader.com/all_articles
# http://mm-3.livejournal.com/friends
# https://mail.google.com/mail/u/0/?tab=wm#inbox
# https://www.linux.org.ru/tracker/
# http://regex.info/exif.cgi?url
# http://solargear.ru/goods_charge_controller_guardian_12.htm


новый набор ссылок
# http://www.log4j.ru/articles/StandardAppenders.html
# http://habrahabr.ru/post/172075/
# https://github.com/rinconjc/app-introspector
# https://github.com/bbytes/log-see
# http://www.liquibase.org/documentation/command_line.html
# http://habrahabr.ru/post/266781/
# http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/testing.html#spring-mvc-test-framework
# http://stackoverflow.com/questions/20957477/testing-http-request-response-in-android/22334918#22334918
# http://stackoverflow.com/questions/4643105/how-to-unittest-a-class-using-resttemplate-offline
# http://habrahabr.ru/post/265061/
# http://skyruk.livejournal.com/244920.html
# http://habrahabr.ru/post/266969/
# http://slobodin.livejournal.com/155034.html
# http://geektimes.ru/company/robohunter/blog/262386/
# http://geektimes.ru/post/262454/
# http://www.emercoin.com/
# https://www.duolingo.com/
# http://lib.ru/LINUXGUIDE/bazar.txt
# http://rkka21.ru/docs/turing-award/ed1972r.pdf




скрипт для Scriptify для ЛОР-а:
{{{

// ==UserScript==
// @id             www.linux.org.ru-2ch-style@scriptish
// @name           LOR 2ch-style
// @version    0.1
// @author         
// @description    enter something useful
// @match      http://www.linux.org.ru/*
// @match      https://www.linux.org.ru/*
// @namespace http://www.linux.org.ru/*
// @namespace https://www.linux.org.ru/*
// @include http://www.linux.org.ru/*
// @include https://www.linux.org.ru/*
// @require       http://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.js
// @run-at         document-end
// ==/UserScript==

(function () {

//
// Settings
//
var timeoutOnShow = 50;
var timeoutOnHide = 300;
//


var locationurl = $(location).attr("href").replace(/#.*$/, "");

var locatTimer = null;

var response = null;

var cleanTimer = function (){
    if (locatTimer){
        clearTimeout(locatTimer);
        locatTimer = null;
    }
};

var processMouseOut = function (msg){
    cleanTimer();
    locatTimer = setTimeout(function(){    
        locatTimer = null;
        $('.2ch_popup').remove(); 
    }, timeoutOnHide);
};

var processTimerOnShow = function (msg){
    cleanTimer();
    locatTimer = setTimeout(function(){    
        locatTimer = null;
        msg(); 
    }, timeoutOnShow);
};

var getMsgById = function (msgId){
    return $("#comment-" + msgId);
};

var getMsgIdByLink = function(element) {
    var msgId = null;
    var href = $(element).prop("href");
    var t = href.match(/comment-(\d+)/);
    if(t != null)
    {
        var msgId = t[1];
        if(msgId != null && msgId.length > 0)
        {
            return msgId;
        }
    }
        
    t = href.match(/.*[\?\&]?cid=(\d+).*/);
    if(t != null)
    {
        msgId = t[1];
    }
    return msgId;
};

var processLink = function (lnk, elem){
    msg = lnk.parents('article');
    showPopup(msg, elem);
};

var showPopup = function (msg, elem) {
    var msg_title = msg.find('.title');
    var msg_body = msg.find('.msg_body.message-w-userpic');
    var popup = null;
    if(msg_title.length > 0 && msg_body.length > 0)
    {
        popup = $('<div class="2ch_popup">' + '<div class="msg_title">' + msg_title.html()  + '</div>' + '<div class="msg_body">' + msg_body.html()   + '</div>' + '</div>');
    }
    else
    {
        popup = $('<div class="2ch_popup">' + msg.html() + '</div>');
    }
    popup.find('.hideon-phone').parent().remove();
    popup.find('div.msg_title > a').each(function (idx,elem){$(elem).mouseover(function(){processTimerOnShow(function(){processMouseOver(elem);});});})
                                                                    .mouseout(function(){cleanTimer();}).click(function(){cleanTimer();});
    popup.find('div.answers > a').each(function (idx,elem){$(elem).mouseover(function(){processTimerOnShow(function(){showPopup(getMsgById(getMsgIdByLink(elem)), elem);});});})
                                                                  .mouseout(function(){cleanTimer();}).click(function(){cleanTimer();});
    popup.mouseenter(function(){cleanTimer();}).mouseleave(function(){processMouseOut();});

    cleanTimer();
    
    $('body').remove('.2ch_popup');
               
    $(popup).css('z-index', '9999')
            .css('position', 'absolute')
            .css('top', ($(elem).offset().top+$(elem).height()+5)+'px')
            .css('left', ($(elem).offset().left+20)+'px')
            .css('background-color','#101010')
            .css('width', '600px')
            .css('border-radius', '5px')
            .css('border-width', '1px')
            .css('border-style', 'solid')
            .css('border-color','#face8d')
            .css('padding', '5px')
            .attr('rel', $(elem).attr('href'));
    $('body').append(popup);
};
        
var findLinks = function (msg, elem){
    return $(msg).find('a').filter(function(){return ($(this).text() === "Ссылка" && $(this).attr('href') == $(elem).attr('href')); });
};
        
var processMouseOver = function (elem){
    var links = findLinks($('#comments'), elem);
    if(links.length > 0)
    {
        processLink(links, elem);
        return false;
    }
    console.log('not found');
    if($('.2ch_popup').length > 0 && $('.2ch_popup').attr('rel') == $(elem).attr('href'))
        return false;
    if(response != null)
    {
        links = findLinks(response,elem);
        if(links.length > 0)
        {
            processLink(links, elem);
            return false;
        }
    }
    showPopup($('<div>loading</div>'), elem);
    $.ajax({type: "GET", url: $(elem).attr('href')}).done(function(msg){response = $(msg);processLink(findLinks(msg,elem), elem);})
};
    

var processLinkComments = function (elem, msgId){
    $(elem).mouseover(function(){processTimerOnShow(function(){showPopup(getMsgById(msgId), elem);});})
           .mouseout(function(){processMouseOut();});
};
    
        
var processTitle = function (element) {
    $(element).mouseover(function(){processTimerOnShow(function(){processMouseOver(element);});})
              .mouseout(function(){processMouseOut();}).click(function(){cleanTimer();});
    var msg = element.parents('article');
    var msgId = msg.prop("id").match(/comment-(\d+)/)[1];
    var nick = $("a[itemprop='creator']", msg).text();
    if (nick == null || nick == "")
        nick = "anonymous";
					
    $("#comment-" + getMsgIdByLink(element)).each(function() {
        var href = locationurl + "#comment-" + msgId;
        var link = $("<a href='" + href + "'>" + nick + "</a>");
        processLinkComments(link, msgId);

        var container = $(".msg_body", $(this));
        var answersClass = "answers";
        var answers = $("." + answersClass, container);
        if (!answers.length) {
            answers = $("<div class='" + answersClass + "'>Ответы: </div>");
            answers.css("font-size", "smaller");
            container.append(answers);
        }
        if (answers.children().length) {
            answers.append(", ");
        }
        answers.append(link);
    });
};

$('div.title > a').each(function (idx,elem){processTitle($(elem));});

}());

}}}


moto
[[Как отображать скорость отдачи и загрузки на панели Unity|http://myubuntu.ru/rukovodstvo/kak-otobrazhat-skorost-otdachi-i-zagruzki-na-paneli-unity]]

# Качаем [[deb-пакет indicator-sysmonitor|https://launchpad.net/indicator-sysmonitor]]
# Ставим Dstat:  ''sudo apt-get install dstat''
# Качаем [[SysMon|https://webupd8.googlecode.com/files/sysmon_0.2.tar.gz]]
# Правим [[SysMon]] по своему усмотрению и кидаем например в $HOME/bin/
# Добавляем $HOME/bin/sysmon в indicator-sysmonitor и перезапускаем

Моя версия [[SysMon]] не требует установки dstat или ifstat

В последних девелверских сборках изменился набор параметров которые можно отслеживать, по этому я предлагаю обновлённую инструкцию:
# Качаем и ставим [[deb-пакет indicator-sysmonitor|https://launchpad.net/indicator-sysmonitor]]
# Качаем исходники  indicator-sysmonitor: ''bzr branch lp:indicator-sysmonitor''
# Фиксим ошибку в проврке доступности заряда батареи
# Подменяем установленный indicator-sysmonitor обновлённым и исправленным: ''sudo cp indicator-sysmonitor /usr/bin/indicator-sysmonitor''
# Создаём директорию ~/.config/autostart/ для возможности задания автостарта  indicator-sysmonitor 
# Ставим lm-sensors: ''sudo apt-get install lm-sensors''
# Запускаем  indicator-sysmonitor 
# Добавляем сенсор температуры: Name: ''temp'' Command: ''sensors -A | grep -i temp1 | cut -f 2 -d ':'  | awk '{print $1}' | head -n 1''
# Формируем строку интересующих сенсоров: ''net:{net} cpu:{cpu} mem:{mem} swap:{swap} cput:{temp} bat:{bat1} fs:{fs///}''
что же такое [[Node.js|node.js]]:
Это инструмент командной строки. Вы скачиваете архив, компилируете и устанавливаете его.
Это позволит вам выполнять программы на JavaScript, набрав 'node my_app.js' в терминале.
JavaScript выполняется движком V8 (тем самым, благодаря которому так быстро работает Google Chrome).
Node.js предоставляет API для доступа к сети и файловой системе из JavaScript.


[[server.js]] - код [[сервера|Mini Browser]]
[[proxy.js]] - прокся на [[Node.js|node.js]]


ссылки:
# [[Установка node.js|http://habrahabr.ru/blogs/webdev/95960/]]
# [[Модули для nodejs|https://github.com/joyent/node/wiki/modules]]
# [[node.js версии v0.2.5 и v0.3.1|http://habrahabr.ru/blogs/nodejs/108346/]]
# [[node.js использование process.nextTick()|http://habrahabr.ru/blogs/nodejs/112742/]]
# [[Understanding node.js|http://habrahabr.ru/blogs/nodejs/104171/]]
# [[Node.JS — Основы асинхронного программирования|http://habrahabr.ru/blogs/javascript/102717/]]
# [[Удалённая отладка|http://habrahabr.ru/blogs/javascript/114825/#habracut]]
# [[Студенческий сайт 2.0|http://habrahabr.ru/blogs/startup/110082/]]
# [[Вы наверное шутите, мистер Дал, или почему Node.js — это венец эволюции веб-серверов|http://habrahabr.ru/blogs/webdev/108241/]]
# [[node.js сокращатель ссылок|http://habrahabr.ru/blogs/nodejs/105691/]]
# [[WYSIWYG HTML редактор в браузере. Часть 3|http://habrahabr.ru/blogs/webdev/107907/]]
# [[Еще раз об архитектуре сетевых демонов|http://habrahabr.ru/blogs/hi/108294/]]
# [[Геттеры и сеттеры в Javascript|http://habrahabr.ru/blogs/javascript/108295/]]
# [[CouchApp: JavaScript приложения в CouchDB|http://habrahabr.ru/blogs/nosql/110675/]]
# [[Асинхронная синхронность. JSDeferred|http://habrahabr.ru/blogs/javascript/108575/]]
# [[Кодирование видео в реальном времени во время загрузки|http://habrahabr.ru/blogs/video/110421/]]
# [[Сервер разработки на основе Gitosis|http://kuroikaze85.wordpress.com/2010/12/28/gitosis-deploy-server/]]
# [[Синхронизация асинхронных вызовов. WaitSync|http://habrahabr.ru/blogs/javascript/108542/]]
# [[Написание документации|http://habrahabr.ru/blogs/javascript/111861/]]
# [[Асинхронное программирование на JavaScript — Остаться в живых|http://habrahabr.ru/blogs/javascript/111634/]]
#[[Node.JS — формируем результирующий документ, используя другие HTTP-источники|http://habrahabr.ru/blogs/javascript/102722/]]
#[[Асинхронный web-mining c помощью node.js|http://habrahabr.ru/blogs/personal/102840/]]
#[[Server-side JS (v8+Node)|http://habrahabr.ru/blogs/javascript/71858/]]
#[[Храните ваши клятвы; Отношения с Node|http://habrahabr.ru/blogs/javascript/98671/]]
#[[Node.JS: Пример HTTP-сервера в режиме prefork с использованием Web Workers|http://habrahabr.ru/blogs/webdev/95972/]]
#[[Bespin переходит на node.js|http://habrahabr.ru/blogs/webdev/94416/]]
#[[Используем Coffeescript на Windows|http://habrahabr.ru/blogs/javascript/106811/]]
#[[2000 часов в одиночестве, или как был сделан RSS reader / Я робокоп|http://habrahabr.ru/blogs/webdev/95526/]]
#[[Асинхронность: почему это никак не сделают правильно?|http://habrahabr.ru/blogs/development/99792/]]
#[[Введение в Nitrode — выделенный HTTP-сервер|http://habrahabr.ru/blogs/webdev/102258/]]
#[[Выполнение SQL-подобных запросов над данными — как в браузере, так и на сервере|http://habrahabr.ru/blogs/javascript/92867/]]
#[[Колибри: Обзор вашего интернет-трафика в реальном времени|http://habrahabr.ru/blogs/webdev/93514/]]
#[[nodeJS и nonblocking I/O|http://habrahabr.ru/blogs/javascript/83865/]]
#[[Как устроен AES|http://habrahabr.ru/blogs/algorithm/112733/]]
#[[Самораспаковывающийся HTML|http://habrahabr.ru/blogs/algorithm/112757/]]
#[[Наш опыт участия в 10K Apart или как ужать 40 Кбайт кода в 10|http://habrahabr.ru/blogs/webdev/102153/]]
#[[Наш опыт участия в 10К Apart, часть вторая: жмем дальше|http://habrahabr.ru/blogs/crazydev/102534/]]
#[[Подсветка синтаксиса несколькими строками javascript|http://habrahabr.ru/blogs/javascript/43030/]]
#[[Наглядно о потоке выполнения в Node.js|http://habrahabr.ru/blogs/nodejs/112977/]]

прочие ссылки (closed):
http://habrahabr.ru/blogs/nodejs/104761/
http://habrahabr.ru/blogs/javascript/99816/
http://habrahabr.ru/blogs/social_networks/113130/

со ссылками потом разберусь
//{{{
http.createServer(function(request, response) {
    sys.puts('received '+request.method+' '+request.url + "\n"+JSON.stringify(request.headers));
    if(/^\/node/.test(request.url)) {
        response.writeHead(200, {'Content-Type': 'text/plain'});
        response.end("Hi, it's node =)\n");
    }
    else if(/^\/exit/.test(request.url)) {
        sys.puts('closing..\n');
        MainServer.close();
        throw new Error('forced');
    }
    else {
        var apache = http.createClient(80, 'localhost');
        var clientrequest = apache.request(request.method, request.url, request.headers);

        request.addListener('end', function() {
            clientrequest.end();
        });

        request.addListener('data', function(chunk) {
            clientrequest.write(chunk);
            sys.puts('writting chunk\n');
        });

        clientrequest.addListener('response', function(clientresponse) {
            response.writeHead(clientresponse.statusCode, clientresponse.headers);
            clientresponse.addListener('data', function(chunk) {
                sys.puts('writting data..\n');
                response.write(chunk);
            });
            clientresponse.addListener('end', function() {
                sys.puts('end of request');
                response.end();
            });
        });
    }
}).listen(8033, 'mike.name');
//}}}
//{{{
Reiser4 filesystem
==================
Reiser4 is a file system based on dancing tree algorithms, and is
described at http://www.namesys.com


References
==========
web page		http://namesys.com/v4/v4.html
source code		ftp://ftp.namesys.com/pub/reiser4-for-2.6/
userland tools		ftp://ftp.namesys.com/pub/reiser4progs/
install page		http://www.namesys.com/install_v4.html

Compile options
===============
Enable reiser4 debug mode
       This checks everything imaginable while reiser4
       runs

Mount options
=============
tmgr.atom_max_size=N
	Atoms containing more than N blocks will be forced to commit.
	N is decimal.
	Default is nr_free_pagecache_pages() / 2 at mount time.

tmgr.atom_max_age=N
	Atoms older than N seconds will be forced to commit. N is decimal.
	Default is 600.

tmgr.atom_max_flushers=N
	Limit of concurrent flushers for one atom. 0 means no limit.
	Default is 0.

tree.cbk_cache.nr_slots=N
	Number of slots in the cbk cache.

flush.relocate_threshold=N
	If flush finds more than N adjacent dirty leaf-level blocks it
	will force them to be relocated.
	Default is 64.

flush.relocate_distance=N
	If flush finds can find a block allocation closer than at most
	N from the preceder it will relocate to that position.
	Default is 64.

flush.scan_maxnodes=N
	The maximum number of nodes to scan left on a level during
	flush.
	Default is 10000.

optimal_io_size=N
	Preferred IO size. This value is used to set st_blksize of
	struct stat.
	Default is 65536.

bsdgroups
	Turn on BSD-style gid assignment.

32bittimes
	By default file in reiser4 have 64 bit timestamps. Files
	created when filesystem is mounted with 32bittimes mount
	option will get 32 bit timestamps.

mtflush
	Turn off concurrent flushing.

nopseudo
	Disable pseudo files support. See
	http://namesys.com/v4/pseudo.html for more about pseudo files.

dont_load_bitmap
	Don't load all bitmap blocks at mount time, it is useful for
	machines with tiny RAM and large disks.

//}}}

Код [[сервера|Mini Browser]]

//{{{

var sys = require('sys'),
http = require('http');
var fs = require('fs');
var i=0;
http.createServer(function (req, res) {
 i = i+1;

 var filename = req.url.replace(/\?.*/, '').replace(/(\.\.|\/)/, '');
 
 if(filename == 'robots.txt')
 {
   res.writeHead(200, {'content-Type': 'text/plain'});
   res.write('User-Agent: * \nDisallow: ');
   res.end();
 }
 else if(filename == 'favicon.ico')
 {
   res.writeHead(404, {'Content-Type': 'text/plain'});
   res.end('File ' + filename + ' doesn\'t exist');
 }
 else
 {
   res.writeHead(200, {'content-Type': 'text/html', 'Set-Cookie': 'mm3=hello'});
   res.write('<!DOCTYPE html>' +
           '<html>' +
           '<head>' +
           '<title>Start page</title>' +
           '</head>' +
           '<body>' +
           'Hello my dear '+i+' friend! <br><br><br>\n'+
           'My Links: <br> \n' +
           '<a href="http://mm-3.blogspot.com/">mm-3.blogspot.com</a> <br>\n'+
	   '<a href="http://mm-3.livejournal.com/">mm-3.livejournal.com</a> <br>\n'+
           '<a href="http://mm3.tiddlyspot.com/">mm3.tiddlyspot.com</a> <br>\n'+
           '<a href="http://mm3.name/">mm3.name</a> <br>\n'+
           '<a href="http://twitter.com/mm0">twitter.com</a> <br>\n'+
           '<a href="http://mm3.tumblr.com">mm3.tumblr.com</a> <br>\n'+
           '\n\n\n\n\n' +
	   '<!-- simple comment -->' +
           '</body>' +
           '</html>' + '\n\n\n'
   );
   res.end();
 };

 sys.log(  '\n Reqest #' + i + '\n' +
           'metod: ' + req.method + '\n' +
	   'url: ' + req.url + '\n' +
	   'accept: ' + req.headers['accept'] + '\n' +
	   'accept-charset: ' + req.headers['accept-charset'] + '\n' +
	   'accept-encoding: ' + req.headers['accept-encoding'] + '\n' +
	   'accept-language: ' + req.headers['accept-language'] + '\n' +
	   'user-agent: ' + req.headers['user-agent'] + '\n' +
	   'via: ' + req.headers['via'] + '\n' +
	   'trailer: ' + req.headers['trailer'] + '\n' +
	   'connection: ' + req.headers['connection'] + '\n' +
	   'date: ' + req.headers['date'] + '\n' +
	   'expect: ' + req.headers['expect'] + '\n' +
	   'from: ' + req.headers['from'] + '\n' + 
	   'host: ' + req.headers['host'] + '\n' +
	   'referer: ' + req.headers['referer'] + '\n' +
	   'range: ' + req.headers['range'] + '\n' +
	   'cookie:' + req.headers['cookie'] + '\n' +
	   'content-length: ' + req.headers['content-leangth'] + '\n' +
	   'content-type: ' + req.headers['content-type'] + '\n' +
	   'stream: ' + req.headers['stream'] + '\n' + 
	   'transfer-encoding: ' + req.headers['transfer-encoding'] + '\n' +
	   'upgrade: ' + req.headers['upgrade'] + '\n' +
	   'ip: ' + req.connection.remoteAddress + '\n' +
	   '\n'
);
}).listen(80);
sys.puts('Server running at mm3.name:80');




//}}}

[[http://swimcenter.ru/pools/nnovgorod|http://swimcenter.ru/pools/nnovgorod]]
Для мозга, который не имеет центральной иерархии знаний, где каждый кирпичик плотно пригнан, поскольку следует из предыдущего и подтверждается последующим, для такого мозга любая информация воспринимается отдельно подвешенной в пространстве. Таблица умножения, экстрасенс, блокбастер, википедия, совет сотрудницы, реклама в глянце, школьный учебник, проповедь центра Махариши, статья в блоге, диктовка Матери Марии из Центрального Солнца, телепередача, молекулярная физика, энергия атома, обнаженная женщина, киллер с лопатой — любая информация имеет равные права, и критерием является вера. Если я верю - значит годится. А не верю - отметается. Какой анализ, у меня интуиция. Я сам себе диагноз рак поставил и вчера зеленым чаем вылечил.
[[Стандартные_потоки_ввода/вывода|http://xgu.ru/wiki/Стандартные_потоки_ввода/вывода]]
Используем wget чтобы скачать страницу
{{{
wget -q -O - http://google.com
}}}
или тоже через tr
{{{
tr -d "\n\r\f"
}}}
удаляем из входного потока переводы строки
{{{
sed ':a; /$/N; s/\n//; ta'
}}}
вставляем перевод строки после символа '>'
{{{
sed 's/>/>\n/g'
}}}
удаляем пустые строки
{{{
sed '/^\s*$/d'
}}}
удаляем блоки в строке начинающиеся '<' и заканчивающиеся '>' более правильное удаление тегов
{{{
sed 's/<[^>]*>//g'
}}}
удаляем коментарии (всё что между "< ! - - " и " - - >")
{{{
sed 's/<!--[^-][^>]*-->//g'
}}}
удаляем тег "<script bla/>"
{{{
sed 's/<script[^\/][^>]*\/>//g'
}}}
удаляем тег вида "< script blabla > bla bla < / script >"
{{{
sed 's/<\/script>/<\/script>\n/g' | sed 's/<script.*<\/script>//g'
}}}
удаляем тег "style"
{{{
sed 's/<style[^\/][^>]*\/>//g'
}}}
удаляем тег вида "<style blabla > bla bla </style>"
{{{
sed 's/<\/style>/<\/style>\n/g' | sed 's/<style.*<\/style>//g'
}}}
удаление экранированных символов вида &nbsp;
{{{
sed 's/\&[^\;]*\;/ /g'
}}}
Замена множества пробелов одним
{{{
sed 's/\ \{1,\}/ /g'
}}}
работа с ссылками, выделение href=""
{{{
sed 's/<a\(.*\)href=\"\([^\"]*\)\"\([^>]*\)>\(.*\)<\/a>/\4 \( \2 \)/g'
}}}

Объединяем в одну строчку
{{{
wget -q -O - http://linux.org.ru | sed ':a; /$/N; s/\n//; ta' | sed 's/<!--[^-][^>]*-->//g;s/\&[^\;]*\;/ /g;s/<script[^\/][^>]*\/>//g;s/<style[^\/][^>]*\/>//g' | sed 's/<\/script>/<\/script>\n/g;s/<\/style>/<\/style>\n/g;s/<br/\n<br/g;s/<\/div>/<\/div>\n/g;s/<a /\n<a /g;s/<\/a>/<\/a>\n/g' | sed 's/<script.*<\/script>//g;s/<style.*<\/style>//g;s/<a\(.*\)href=\"\([^\"]*\)\"\([^>]*\)>\(.*\)<\/a>/\4 \( \2 \)/g' | sed 's/<[^>]*>/ /g' | sed '/^\s*$/d;s/\ \{1,\}/ /g'
}}}



[[Понятная справка по SED|http://forum.puppyrus.org/index.php?topic=1863.0]]
[[http://zoshyt.blogspot.com/2009/04/sed.html|http://zoshyt.blogspot.com/2009/04/sed.html]]
[[http://www.welinux.ru/post/4986/|http://www.welinux.ru/post/4986/]]
[[http://www.f-notes.info/linux:sed|http://www.f-notes.info/linux:sed]]
[[http://www.regatta.cs.msu.su/doc/usr/share/man/info/ru_RU/a_doc_lib/aixprggd/genprogc/manip_strings_sed.htm|http://www.regatta.cs.msu.su/doc/usr/share/man/info/ru_RU/a_doc_lib/aixprggd/genprogc/manip_strings_sed.htm]]
[[http://jerr.at.ua/publ/linux/linux_command/odno_strochnye_skripty_sed/2-1-0-14|http://jerr.at.ua/publ/linux/linux_command/odno_strochnye_skripty_sed/2-1-0-14]]
[[http://rus-linux.net/lib.php?name=MyLDP/consol/cli-magic.html|http://rus-linux.net/lib.php?name=MyLDP/consol/cli-magic.html]]
[[http://www.linux.org.ru/forum/general/6062582|http://www.linux.org.ru/forum/general/6062582]]
[[http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454|http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454]]
[[http://www.opennet.ru/man.shtml?topic=sed&category=1&russian=0|http://www.opennet.ru/man.shtml?topic=sed&category=1&russian=0]]


http://www.lissyara.su/doc/programming/awk/
[[http://lib.ru/MAN/DEMOS210/awk.txt|http://lib.ru/MAN/DEMOS210/awk.txt]]
http://ru.wikipedia.org/wiki/AWK
[[Мега-игра|http://candies.aniwey.net/]]
[[Candies|http://candies.aniwey.net/index.php?pass=k246n]]
[[CookieClicker|http://orteil.dashnet.org/cookieclicker]]
[[adarkroom|http://adarkroom.doublespeakgames.com/]]
[[Симулятор Жида|http://jew.pizd.ec/]]
[[Игра. Распутываем нитки|http://nemez-06.livejournal.com/213448.html]]
[[lky|http://game.lky.ph/]]
[[godville|http://godville.net/superhero]] mm33

[[A Dark Room|http://adarkroom.doublespeakgames.com/]]

копай, молись, лечись
бей, молись, лечись

[[JavaScript RPG game|http://lifehacker.ru/2014/03/19/ne-lezet-v-golovu-programmirovanie-poprobujte-v-nego-igrat/]]
[[Java game|http://javarush.ru/landing05.html?reference=9d03f3fe-6099-4660-a10c-0eb20a4e55b9]]
# Человек свободен, пока он верит в свою свободу
# "совершенство в миниатюре, незаслуженно лишается внимания, в следствии неверного стереотипологического представления о лимитах выражения рабочего кода, призванного вызывать поток энергии "гы" )"
# Ленинград хорошо формулирует принципы даосизма - все по хуям, и все до пизды!
# ну я купил, пришел дамой зуб балит, думаю на ватку ультракаин и на зуб, нахрен пол ебала онемело, щас сижу и думаю как пожрать чтоб язык не откусить :(((
# x:- дай hex значение телесного цвета. y:- #FACE8D x:- издеваешься? y:- попробуй x:- шойтан 8D
# (echo "это типа тело письма - за ним будет аттач";uuencode file file) | mail -s "это типа subj" mail@me.ru
# Зачастую, юношеский максимализм, умирая в человеке, когда тот взрослеет, забирает вместе с собой все силы и устремления, заменяя внутренний мир навязанными ложными ценностями, так появляются новые солдаты в рядах офисного планктона...
# Я ничего не имею против Бога, мне просто не нравится его фан-клуб.
# Девушки, если вы хотите, чтобы вас любили, зачем вы одеваетесь так, чтобы вас хотели?
# Совсем не просто быть обидчивым, ведь приходится в каждом добром слове издевательскую подоплеку искать.
# Сердиться на людей означает считать их поступки чем-то важным.
# Нет ничего приятнее победы и ничего полезнее поражения.
# Плохо о нас говорят те, кто хуже нас. Тем, кто лучше нас, не до нас.
# Не обязательно быть говном, даже если ты в жопе.
# Выяснять отношения надо только с теми, с кем эти отношения имеешь. Остальных — на берег безмолвия, собирать ракушки.
# То что ты получаешь достигая цели, не так важно, как то, кем ты становишься, достигнув их.
# Я слышал столько клеветы в Ваш адрес, что у меня нет сомнений: Вы — прекрасный человек! (О. Уайльд)
# Я с вами не ругаюсь и не спорю. Я просто подробно рассказываю, почему я прав.
# Все люди приносят счастье. Одни своим присутствием, другие своим отсутствием.
# «Да пошла ты нахуй» — подумал я, и отправил смайлик.
# И что бы с Вами не случилось — ничего не принимайте близко к сердцу. Немногое на свете долго бывает важным. ©Конфуций
# Молчи, пока ты не в состоянии сказать нечто такое, что полезнее твоего молчания. (Архимед)
#  В постели можно делать всё, что доставляет удовольствие обоим. Даже читать.
# Нельзя так категорично делить людей на плохих и хороших, добрых и злых, умных и глупых. Будем объективны: люди, в общем-то, все «так себе».
# Я пессимист-наркоман и считаю, что стакан наполовину мангуст.
# Это ведь просто! Сделай так, чтобы человеку было с тобой хорошо, и он сам к тебе придет. А если не пришел, то это не он дурак, и не ты дурак, а просто твое хорошо ему не подходит.
# Из всех глупостей мира стоит делать только те, которые ведут к деньгам и оргазмам.
# Встретил чёрную кошку в пути - три раза плюнь и один раз пни!
# Лучшая форма физического труда — ворочать миллионами.
# Не нужно гоняться за счастьем, нужно лечь на его пути.
# Было время, когда удивляло хамство, теперь удивляет вежливость…
# Либо ты продаешь душу дьяволу, либо она в конечном итоге достается ему бесплатно.
# Перед тем, как уходя громко хлопнуть дверью, не забудьте убрать хвост.
# Лучше надеяться на лучшее и пережить разочарование, чем надеяться на худшее и оказаться правым.
# «В человеческом теле шесть литров крови — достаточно, чтобы выкрасить большую квартиру» — эта мысль не дает мне покоя.
# За лишние деньги обычно покупают лишние вещи.
# Мне всегда немного грустно, когда красноречиво, изящно и тонко оскорбляешь человека, а он слишком глуп, чтобы это понять.
# Не обижайтесь на слова, когда не видите глаз.
# Не всем известный факт, но на момент написания «Анны Карениной» паровоз был чудом передовых технологий. И прыжок Анны под паровоз был не обыденной смертью под трамваем, а особо технологичным, изощрённым самоубийством. Что вызывало у читателя закономерную оторопь. Если проводить параллели с сегодняшним днём, Анна Каренина прыгнула в дюзы стартующей ракеты «Энергия». Это так, для справки.
# Неудачная метафора подобна котёнку с дверцей.
# Свобода нужна сумасшедшим. Равенство нужно лентяям. Братство нужно слабым. Умным нужен покой. Мудрым не нужно ничего, потому что они владеют всем.
# Не надо тратить драгоценное время на битву с дураками. В нужное время они вымрут сами. А вот вам будет жаль потерянного времени.
# Вы не полностью одеты, если на вас нет улыбки.
# Всё, что происходит в мире, – это обмен. Даже если тебе кажется, что ты получил что-то просто так, рано или поздно ты за это заплатишь.
# О том, как ты несчастен подумаешь в могиле. А сейчас — живи.
# Удачу можно сравнить с женщиной. Перестаньте бегать за ней — обидится и придёт сама.
# Призыв «Всегда оставайся самим собой!» особенно бесполезен, если ты идиот.
# - Сэр, мы окружены!   - Отлично! Теперь мы можем атаковать в любом направлении!
# Время не лечит, время просто проходит мимо.
# Вежливость стала такой редкостью, что некоторые девушки принимают её за флирт.
# Не надо бояться неудач. Абсолютное большинство планов провалилось потому, что их никто не пытался воплотить в жизнь.
# Первая цель — осуществление того, к чему вы стремились. Вторая цель — умение радоваться достигнутому. Только самые мудрые представители человечества способны к достижению второй цели.
# Путь к сердцу человека лежит через разорванную грудную клетку, все остальные утверждения — ванильная ересь.
# Возьми от жизни всё. Но на всякий случай запомни, где брал.
# Рискуйте. Если вы победите — будете счастливы, а если проиграете — опытны.
# Хотите вдохновения и мотивации? Обзаведитесь настоящими врагами. Это стимулирует двигаться со скоростью поезда и быть как никогда креативным.
# Переубедить вас мне не удастся, поэтому сразу перейду к оскорблениям.
# Если вы не умеете снимать стресс, не надевайте его.
# Какими бы разными не были люди, котлеты из них выходят одинаковые.
# Поставить Убунту может даже цыплёнок, если на клавишу Enter приклеить несколько зёрнышек.
# Если вы измеряете свой успех мерой чужих похвал и порицаний, ваша тревога будет бесконечной.
# Осторожно, во дворе злая собака! Прививки не делали, ест что попало. Давно мечтает реализовать себя в сексе.
# Ничто так не мешает видеть, как точка зрения.
# Иногда, некоторым личностям, корону на голове хочется поправить лопатой!!!
# Никогда не мстите подлым людям. Просто станьте счастливыми. Они этого не переживут.
# Профессорша мединститута на лекции: — У мужчины нет признаков лишения девственности, кроме его наглой, довольной рожи.
# Не хочешь идти ко дну — не храни камни за пазухой.
# ВСЁ — это когда под портретом вторая дата появилась.
# Нет смысла нанимать толковых людей, а затем указывать, что им делать. Мы нанимаем людей, чтобы они говорили, что делать нам. Стив Джобс
# У нас на работе ругательство новое: ѢѢ - Double ять.
# Бриллиант упавший в грязь, всё равно остаётся бриллиантом, а пыль поднявшаяся до небес, так и остаётся пылью. (китайская народная мудрость)
# Мы живем в славное время, когда отключения электричества влечет за собой потерю смысла жизни.
# Когда ничего не остается делать, многие так и поступают.
# О человеке многое можно сказать по тому, как он паркует свою яхту.
# Никогда! Слышите, никогда не держите попугая в одной комнате с маленьким ребенком! Ребенок вырастет и перестанет плакать. Но эта падла…
# У каждого человека есть руки, ноги, голова и 168 часов в неделю, чтобы сделать все то, чего он по-настоящему желает.
# Если упорство побеждает лень, то полезность этого события зависит от того, дурак ты или умный.
# Многие, не достигнув желаемого, делают вид, что желали достигнутого.
# Вторую неделю мучаюсь вопросом, какой вариант правильный: Две белки вылезли из своих: 1) Дупл 2) Дуплов 3) Дуплищ 4) Дуплей 5) Дупел
# Чтобы выделяться из серой массы, не обязательно красить волосы в красный цвет и носить кольцо в носу. Достаточно просто не быть говном.
# Жизнь скучна и однообразна. Но всё меняется, когда приходят ОНИ…деньги на карточку!
# Мое сердце занято – оно гоняет кровь по организму.
# 5 из 7 россиян страдают от гиперслуховой эстетоафазии. Это серьёзная социопсихологическая болезнь, заключающаяся в хуёвом музыкальном вкусе.
# Открыв окно в будущее, необходимо закрыть дверь в прошлое, чтобы сквозняком не выдуло настоящее.
# Если человек замерзает, можно дать ему дрова и спички, и ему будет тепло один час, а можно облить его бензином и поджечь — и ему будет тепло до конца жизни.
# Ужасная несправедливость: нервные клетки не восстанавливаются, а жировые — не погибают!
# Разговаривать с незнакомым человеком интереснее. Знакомые уже знают, что ты идиот.
# С женщиной нужно быть жестким и строгим: причинять радость, наносить добро, подвергать ласке.
# Этапы в жизни российского бизнесмена: собственный автомобиль, собственный самолет, собственная яхта, собственное мнение.
# Когда речь идёт о тринадцатой зарплате, все моментально забывают о суевериях.
# Образование — это то, что делает из неграмотных людей некомпетентных.
# Не то, чтобы не рад Вас видеть, просто не успеваю соскучиться.
# Проблема в том, что наука сделала нас богами раньше, чем мы научились быть людьми.
# Секрет успеха в том, чтобы дружить с теми, кто лучше, тренироваться с тем, кто сильнее, любить того, кого нельзя, и не сдаваться там, где сдаются другие.
# Не комментируйте и некомментируемы будете.
# Деньги можно кидать на ветер, пока ветер дует в твою сторону.
# Поговаривают, что есть жизнь за пределами браузера.
# В истинности поговорки «если человек чего-то сильно хочет, то это обязательно сбывается» я убедился вчера, так и не успев добежать до туалета.
# Наша страна похожа на постапокалиптический мир. У всех планшеты, гарнитуры и прочие гаджеты, а вокруг лежит говно и плохие дороги.
# Цветочный мед, с физиологической точки зрения, — это рвотные массы насекомых из полупереваренных выделений половых органов растений.
# Джеки Чана можно победить только в чистом поле, где нет предметов. Но не дай бог ему под руку попадется хотя бы ёжик…
# Детство - это когда спать обязанность, а не мечта.
# А в Чернобыле сейчас разгар весны! Травка синеет, птички гавкают.
# Если тебя кто-то напрягает - расслабься и забей. Ногами. До смерти.
# Проблема дискуссий заключается в том, что в результате возникает иллюзия, будто нужная мысль донесена адресату.
# Если Вы хотите вырастить хороших детей, тратьте на них в два раза меньше денег и в два раза больше времени.
# Хорошо там, где нас нет. Если не верите, можем прийти.
# Уборка, уборка – перейди на Егорку, стирка – на Ирку, а готовка – на Вовку!
# Цензура - вонь комплекса неполноценности.
# Самая большая награда за труд - это не то, что человек за него получает, а то, кем он становится в процессе.
# Самое тяжёлое в нашей жизни — это синий кит. Всё остальное фигня.
# У меня в голове порядок. Слева – тараканы, справа – мания величия.
# Если рядом с вами происходит извержение вулкана и вам уже поздно убегать, застыньте в непонятной позе — сломайте мозг археологам.
# Лучший способ предсказать своё будущее – стать его создателем.
# Когда кидают палку собаке — собака смотрит на палку. Когда кидают палку льву — он смотрит на бросающего.
# Весна в этом году будет очень жаркая. Главное, не пропустить этот день.
# Вкладывайте деньги в землю. Этого товара производят всё меньше и меньше.
# Все в жизни нужно зарабатывать трудом, талантом и способностями. Даже везение.
# Я старый пират и не знаю слов лицензионного соглашения…
# Тупиковых ситуаций не бывает — бывает тупиковое мышление.
# Никогда не рассказывай женщине о своих прошлых похождениях, иначе она расскажет тебе о своих, и тогда ты рискуешь заработать комплекс неполноценности
# Дети! Подпускать маму к компу — это к беде.
# Тройка самых популярных животных нашей страны — жаба, песец и белочка.
# — Пациент, вы страдаете извращениями?  — Что вы, доктор! Я ими наслаждаюсь!
# Духовенство было бы весьма недовольно, если бы его духовный труд оплачивался духовно.
# Если вам будут гoворить про меня гадости — верьте каждому слову.
# Самый большой банкрот в этом мире — человек, утративший свой жизненный энтузиазм.
# Не обязательно знать дорогу, достаточно уметь ее находить.
# Общаясь с Мишей, надо осторожно выбирать слова. Он в WoW довел до распада гильдию «Братья стали» одним лишь невинным вопросом «Кем?».
# Хипстерам: пытаясь выделиться из толпы, ты попадаешь в толпу, которая пытается выделиться из толпы.
# Чтоб быть счастливым — надо просто правильно хотеть.
# Шикарная женщина — это не соотношение веса, роста и внешности. Это пропорции интеллекта и чувства юмора, умноженные на чувство собственного до# стоинства.
# Сделай первый шаг и ты поймешь, что не все так страшно. Сенека
# Этот неловкий момент, когда сарказм оказался настолько тонок, что тебя приняли за идиота.
# Если в глазах собеседника застыл интерес, значит, он перестал вас понимать.
# Как я выгляжу утром: (~_~) (-_-) (°_-) ( -_°) (>_<) (o_O) (o_o)
# Никогда не сожалейте. Если это было хорошо, то это замечательно. А если это было плохо, то это опыт. А опыт очень ценен.
# Чем отличается верующий человек от фанатика? Верующий готов умереть за веру, а фанатик убить.
# Чему бы грабли не учили, а сердце верит в чудеса…
# Не родился ещё тот враг, которому я отдал бы свой ужин.
# Иногда чувствую себя сусликом во время Куликовской битвы — чувствую, что что-то происходит, а что — понять не могу.
# Психотип — это форма правления тараканов в голове.
# Ваше мнение, безусловно, очень важно, поэтому спрячьте его в надёжном и безопасном месте — например, в своей заднице.
# Сделал добро — отойди на безопасное расстояние.
# Ты заставляешь мой мозг биться чаще.
# Эндорфины — это всё, что нужно человеку для счастья.
# Как просто было раньше создать религию: показал пару фокусов, рассказал о своем общении с богом, а сейчас приходится писать операционную систему.
# Becти домaшнee хозяйcтво лeгко: что упaло - пoдними, что нe упaло - cмaхни пыль, что движeтcя - нaкорми.
# Как вы умудряетесь общаться с людьми без раздражения? Ну я просто представляю себе, что у них вместо головы мухомор, а в руках балалайка.
# Любимая фраза начальства: «НЕЗАМЕНИМЫХ ЛЮДЕЙ НЕТ!» Но как только подходит твоя очередь идти в отпуск, всё пипец – ты единственный!
# Совет девушкам. Парни не понимают намёков. Если вам кто-то нравится, подойдите и скажите: «Привет,ты мне нравишься,давай дружить и трахаться».
# Если человек замерзает, можно дать ему дрова и спички, и ему будет тепло один час, а можно облить его бензином и поджечь — и ему будет тепло до конца ж# изни.
# Ужасная несправедливость: нервные клетки не восстанавливаются, а жировые — не погибают!
# Оптимист – это человек, который находясь по уши в дерьме не падает духом, а весело и задорно булькает.
# А лет через 50 куча молодых людей будет с умным видом рассуждать, что Путин был великим правителем, и зря его тогда расстреляли.
# Однажды при установке игры я полностью прочитал лицензионное соглашение и в конце там было написано «ТЕБЕ ВСЁ РАВНО НИКТО НЕ ПОВЕРИТ».
# Однажды ученик спросил у Мастера:  — Долго ли ждать перемен к лучшему?  — Если ждать, то долго! — ответил Мастер
# Не люблю, когда свои вкусы превращают в философию, полную презрения к тем, кто их не разделяет.  (Франсуаза Саган)
# Вот так узнаешь какой нить мелкий факт из мировой истории, и на свою собственную историю начинаешь смотреть иначе «14 июля 1789 года восемьсот парижан и двое РУССКИХ захватили Бастилию».
# Никогда не смеши человека, который жуёт печеньку. Подожди, пока он начнёт запивать её чаем.
# — Господи, а правда, что секс без любви — это грех?  — Да что вы на этом сексе зациклились, всё, что без любви, — грех!
# Вот спишь ты в своей кровати, храпишь, слюнявишь подушку, пердишь. А ведь кто-то мнит тебя своей мечтой.
# Если человек говорит всем, что ему похуй, это значит, что он хочет, чтобы все думали, что ему похуй, хотя на самом деле это не так. Ибо человеку, которому действительно похуй, даже не придет в голову сказать об этом. Ему просто похуй.
# Водитель трамвая уснул за рулем и нормально выспался, знаете ли.
# Будьте интеллигентнее — говорите не «тупая пизда», а «наивное отверстие».
# Ходил на фотоохоту — завалил семь горизонтов.
# Редкая птица долетит до середины турбины.
# Я зарегистрировался посмотреть, не зарегистрировалась ли она, чтоб посмотреть, не зарегистрировался ли я.
# Возьмите семью, подмешайте в нее веру в Бога, приправьте ароматом чувства Родины, добавьте десятичасовой рабочий день и получите то, что нужно, — ячейку общества.  Чарльз Буковски
# Когда человек с деньгами встречает человека с опытом, человек с опытом уходит с деньгами, а человек у которого были деньги уходит с опытом.
# Безопасного секса не бывает по определению. Даже резиновая женщина может лопнуть в самый неподходящий момент и оставить тебя заикой на всю жизнь.
# Забавно: в стране, где еще вчера рисовали карикатуры на попов и Бога, судят неких девушек за слова, которые некое лицо посчитало богохульством.
# Старые мосты могут еще пригодиться. Лучше сжечь старые грабли.
# Если не знаешь, чего хочешь, умрешь в куче того, чего не хотел.
# Каменный век закончился не потому, что закончились камни, и нефтяной век закончится не потому, что закончится нефть.
# Чтобы спокойно заснуть, нужно принять расслабляющую ванну, выпить зелёного чая и кинуть гранату в орущих придурков под окном.
# О мертвых либо ничего, либо хорошо. Например: «Он умер, и это хорошо».
# Арабские женщины выглядят сильно замотанными.
# Дорога на Красную Планету ($2,5 млрд. и 567 млн. км.) стоит в ТРИ раза дешевле олимпийской дороги на Красную Поляну (227 млрд. руб. и 48 км.)
# Ничто так не сигнализирует о проблемах в обществе, как митинги в поддержку правительства.
# Для сохранения хороших отношений с мужем, женщине следует пореже открывать рот на кухне и почаще — в спальне.
# Правительство заявило, что оснований для повышения цен нет, поэтому цены будут повышать без основания.
# «Если вы будете интересоваться другими людьми, то за два месяца приобретёте больше друзей, чем за два года попыток заинтересовать других людей собой». Дейл Карнеги
# Что бы ты ни придумал, всегда найдется тот, кто уже делал это до тебя. Так что главное — сделать это лучше.
# Чем дольше я живу, тем яснее понимаю, что главное в жизни – это твердо знать, чего ты хочешь, и не позволять сбить себя с толку тем, кто думает, что знает лучше.
# Если бы человека можно было скрестить с кошкой, это улучшило бы человека, но испортило бы кошку.
# Не тревожься о том, что дети тебя никогда не слушают; тревожься о том, что они всегда за тобой наблюдают.
# Мальчик Дима перебегал дорогу в настолько неположенном месте, что его сбило ПВО.
# Лучше стыдно, чем никогда.
# Рождение — это единственный светлый момент в жизни, когда тебе помогают выбраться оттуда, куда потом будут только посылать.
# Никогда не спорьте с дураком — люди могут не заметить между вами разницы.
# Всё-таки красиво на польском языке звучит фраза «Мохнатый шмель» — «Волоснявый жужик»!
# Оказавшись в центре внимания, вы рискуете стать крайним.
# Быстро, но внятно прочитайте вслух ЖПЧШЦ, и ведь зачешется. Парадокс.
# Память компьютера лучше нашей, потому что из неё всё можно стереть.
# «Я всегда мечтала найти мужчину, с которым могла бы чувствовать себя маленькой девочкой. Пока не поняла, что все мужчины сами, как маленькие девочки». Мила Йовович.
# - Как вам удается защититься от пагубного влияния социума?  - Солнцезащитные очки, вакуумные наушники и пафосный ебальник.
# Легкая придурковатость делает человека практически неуязвимым.
# Этот неловкий момент, когда ты начинаешь считать педофилов более адекватными, чем борцов с педофилами.
# Человек, у которого нет аккаунта в социальных сетях, вызывает сначала удивление, потом жалость и, в конце концов, зависть.
# Очереди в поликлинике отсеивают тех, кто может и сам дома полечиться.
# Не люблю ночные клубы: свет мелькает, музыка гремит, книжку читать совершенно невозможно.
# Болезнь — это попытка организма хоть как-то адаптироваться под те условия, в которые человек себя загнал.
# В случае революции выдернуть шнур и выдавить из себя раба.
# Я веду интеллектуальные споры, выстраиваю логические цепочки, аргументирую, и всё лишь потому, что не могу сразу въебать с ноги в челюсть.
# Люди говорят, что ты изменился, когда ты просто перестал вести себя так, как им хочется.
# Проблема в том, что среднестатистический человек гораздо умнее, чем ему надо для счастья.
# Сделал добро — отойди на безопасное расстояние, чтобы ударной волной благодарности не зацепило.
# Возможности очень часто приходят к нам в рабочем комбинезоне и мы не замечаем их, потому что они подозрительно похожи на работу.
# Надпись «Осторожно, злая собака!» — фигня по сравнению с человеческими черепами на частоколе.
# Если человека раздражают мелочи, значит его что-то не устраивает по-крупному.
# Независимая женщина — это женщина, которая пока не нашла того, от кого бы ей хотелось зависеть.
# Если женщина умная, то бить ее уже поздно.
# Может характер у меня от того и тяжелый, что золотой?
# Жить надо так, чтобы на социальные сети не хватало времени.
# Велика Россия, а нужду справляют в подъезде.
# Больше всего природу загрязняют люди, на которых она отдохнула.
# Русский язык преподают в школе в течение всех 10 лет обучения. Если человек за 10 лет так и не смог научиться писать преимущественно без ошибок, то это по крайней мере подозрительно. Я бы не стал трахать такого человека без презерватива.
# Самое бескровное оружие — водородная бомба: в радиусе 20 километров никакой крови, только радиоактивный пепел.
# Не теряйте лучшие моменты в вашей жизни только потому, что вы не уверены.  Николас Кейдж
# Если завернуть мыло в полотенце и избить им кого-то, то на теле жертвы не останется никаких следов, которые могла бы зафиксировать судмедэкспертиза. Эта информация не даёт мне покоя.
# Даже если ты ангел, всегда найдется тот, кому не нравится шелест твоих крыльев. Так что поменьше оглядывайся на чужое мнение.
# Если вы опоздали на работу – значит, она у вас есть.
# Нервный не тот, кто стучит пальцами по столу, а тот, кого это раздражает.
# Любовь — это когда бабочки в животе воюют с тараканами в голове.
# К большому сожалению правительства, реформу ЖКХ тормозит простое соображение: нельзя делать стоимость коммунальных услуг выше стоимости автомата Калашникова.
# Бояться нужно не смерти, а пустой жизни.
# Приходишь домой, варишь кофе, садишься в кресло и вокруг тишина … И каждый из нас сам выбирает, что это: Одиночество или Свобода.
# Если слова не клеятся, их связывают матом.
# Всем моим ошибкам есть оправдание: я живу в первый раз.
# Полемика вокруг дуумвирата напоминает старинную поговорку: Против начальства ссать можно, главное ширинку не расстегивать.
# Недавно пересел из Мерса на КАМАЗ и не жалею…. никого не жалею.
# Если тебя посещают мысли о смерти — это ещё полбеды. Беда — это когда смерть посещают мысли о тебе…
# Высшее наслаждение состоит в том, чтобы быть довольным самим собою.
# Разговаривал с другом на ноутбуке по скайпу. В это время звонит второй друг на мобильник, включаю громкую связь, и общаемся уже втроём. Потом вышел на лоджию покурить. Возвращаюсь, картина маслом: ноутбук с телефоном что-то активно обсуждают. Ну, скажите, это ли не дурдом?
# Интернет не относится к «средствам массовой информации». Интернет — это средство коммуникации. Любое ограничение «средств коммуникации» — это нарушение прав граждан.
# Для некрофила любовь до гроба — не более, чем лёгкий флирт…
# Если смешать ЛСД с анальгином — головная боль уедет на драконе.
# «Иногда страпон — это всего лишь страпон» (Зигмунд Фрейд)
# Демократия — это гарантия того, что нами руководят не лучше, чем мы того заслуживаем.
# Ли Куан Ю в ответ на вопрос «Как Вы победили коррупцию?», отвечал: «Я посадил двух друзей, остальные сами всё поняли».
# Скромность красит человека. В серый цвет.
# Религия существует с тех пор, как первый лицемер повстречал первого дурака. (Вольтер)
# Без труда не вытащишь кишечник из врага!
# Митинг — это конституционное право, являющееся административным нарушением и карающееся, как уголовное преступление.
# Мир принадлежит оптимистам. Пессимисты – всего лишь зрители.
# Если ваш принтер мнет бумагу, поставьте его в туалет.
# Котов обвиняют в эгоизме и самолюбии. А как бы вы себя вели, если бы были самыми совершенными существами во вселенной?
# Если ты будешь колоть дрова сам, то согреешься ими дважды.
# Под самым красивым хвостом павлина скрывается самая обычная куриная жопа.
# Скромность — это то, что заставляет уважать других, внимательно к ним прислушиваться и не перебивать, когда тебя хвалят.
# Если спящему кошатнику ночью положить на грудь кирпич, то он всю ночь будет заботиться о нем, укрывать и бояться перевернуться.
# Котенку оторвали лапку, котенок кровью истекал, но о котенке кто-то думал, он и икал и умирал.
# Мы против оголтелого национализма! Все мы: русские, беларусы, украинцы, — все мечтаем жить вместе, в одной большой, богатой, дружной стране. В Канаде, например.
# Скупой платит дважды. Тупой платит трижды. Участники МММ всегда всем платят.
# Склоненная голова не всегда принадлежит рабу. Возможно человек ищет для ответа булыжник.
# Семиклассницу разорвало стрингами прямо на уроке!
# Зачем ещё придумывать какие-то слова? Вот взять, например новомодное слово «хипстер». Есть прекрасное старое слово — долбоёб. Ну вот чем оно кого-то не устраивает?
# Люди никогда не взрослеют. Они просто учатся вести себя на людях.
# (голосом Дроздова): — Почуяв опасность, банка пива шипит на человека.
# Самое важное — не то большое, до чего додумались другие, а то маленькое, к чему пришел ты сам.
# Госдума в очередной раз ужесточила конституционные свободы граждан.
# Бескорыстие и искренность вызывают симпатию, уважение и подозрение.
# Идти по трупам неудобно, но мягко.
# Долг, постоянно висящий над современным рабом, хорошо стимулирует его к работе даже за мизерную плату.
# Пить водку, пиво, коньяк, кофе и курить в один день это нормально. А вот воду в чайник нужно обязательно фильтровать, а то для здоровья плохо!
# «Я всегда выберу ленивого человека делать трудную работу, потому что он найдет легкий путь ее выполнения». (с) Билл Гейтс
# Особенно резко точку зрения меняет удар в глаз.
# Медицина — вторая по точности наука после религии.
# В старинную венгерскую деревушку Máglya стоит заглянуть, чтобы насладится удивительной традицией местных жителей сжигать всех приезжих.
# Ненавижу людей, из-за которых мне приходится иметь политические убеждения.
# Ты такая смешная, когда у тебя кончается кислород.
# Зеркала и совокупления отвратительны, ибо умножают количество людей.
# Вся история женской моды — это история борьбы климата, морали и гигиены с желанием женщины ходить голой.
# Заходит как–то давление в один бар в один бар…
# «Иди туда, где был ты до рожденья.»
# Мало кто знает, что Пауло Коэльо пишет свои книги, используя статусы пятнадцатилетних разочарованных школьниц.
# Жестокость — это черта характера добрых людей, она возникает когда об твою доброту начинают вытирать ноги.
# Лучший способ добиться успеха — следовать советам, которые мы даем другим.
# Один московский фидошник pассказывал шикаpную истоpию о некой девушке по пpозвищу «Летучая мышь». Девушка завела себе молодого человека, и только после свадьбы тот узнал, что за глаза большинство знакомых невесты зовёт его вуглускpом.
# Канал «Дискавери» (США):  «Чернобыль — это страшное и опасное место. Ведь отсюда всего шестьдесят миль до границы с Россией».
# Ик — это заблудившийся и очищенный пук.
# Духовенство было бы весьма недовольно, если бы его духовный труд оплачивался духовно.
# По информации Департамента природопользования мэрии Москвы, на Чистых прудах выращивали марихуану. Другая трава не может стоить 20 млн. руб.
# Самый большой банкрот в этом мире — человек, утративший свой жизненный энтузиазм.
# Народу не следует ожидать, что полицейские не будут нарушать закон. Врачи же имеют право заболеть.
# Не обязательно знать дорогу, достаточно уметь ее находить.
# Шикарная женщина — это не соотношение веса, роста и внешности. Это пропорции интеллекта и чувства юмора, умноженные на чувство собственного достоинства.
# Сущность научной работы — в борьбе с нежеланием работать. [© И. П. Павлов]
# Совет дня: воспринимайте критику окружающих с высоко поднятым средним пальцем.
# Религия — это уздечка, за которую лошадку ведут в рай, попутно цепляя к ней то телегу, то плуг, то сани.
# Это бомж Василий, он не ходит ни на работу, ни на учёбу, потому что он может себе это позволить.
# Наркоман может бесконечно смотреть на три вещи: как горит вода, как течёт огонь и как улитка в костюме сталевара бреется ластиком.
# Все «правила хорошего кода» написаны кровью, вытекшей из глаз программистов, читавших чужой код.
# Психиатр на приеме задает пациенту вопрос:  - Какое сегодня число?  - 23 октября по григорианскому календарю, 10 октября по юлианскому, 18 листопада по древнеславянскому, 2 брюмера по республиканскому, 7 Зуль-Хиджжа по исламскому, 2 абана по персидскому, 7 хешвана по еврейскому, 5 архасамна по Вавилонскому, 18 марерри по древнеармянскому и 4 сака по календарю Майя.  - Понятно. Какой сегодня год вы наверно тоже не знаете.
# Как выясняется, мое решение вылизать баночку из-под йогурта, работая единственным мужчиной в коллективе, преимущественно состоящим из незамужних девушек, было хорошей идеей...
# Особенности применения метода кнута и пряника в нашем офисе состоят в том, что здесь пряником тоже бьют.
# Голая правда была признана порнографией и преследовалась по закону.
# Вот ещё! Буду я всякую блядь оскорблять!
# Зачем ждать от жизни чуда — чудите сами!
# Есть только два дня в году, когда вы не можете ничего сделать. Один из них называется вчера, а другой называется завтра.
# Мальчик воспитанный интернетом, был повергнут в шок... увидев на улице одетых женщин!
# Бойтесь ангелов — они добры, согласятся быть и дьяволами.
# У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
# Начните искать в жизни хорошее, и она будет предлагать вам его всё больше и больше.
# О проблемах: 1. Проблемы будут. 2. Проблемы – это сработавшие риски. 3. Если мы не решаем проблему – мы часть проблемы. 4. Если мы скрываем проблему – мы проблема.
# Однажды какая-то самая тупая, бестолковая обезьяна так и не сумела научиться лазить по деревьям. Так началась история человечества.
# Я умственно усталый.
# Человек может все. Только ему обычно мешают лень, страх и низкая самооценка.
# Господь сделал меня атеистом. Кто ты такой, чтобы оспаривать Его мудрость?!
# Растения в естественном отборе накапливали соки, вызывающие жжение во рту, слёзы из глаз, резкие запахи, всё, лишь бы животные уяснили, что их есть нельзя, боком выйдет, а тут появился человек, назвал это приправами и специями и активно жрёт вопреки тысячелетиям трудов природы.
# Разгул законности и правопорядка.
# Нужно поступать с людьми так, как они хотят поступить с вами, но прежде чем они успеют это сделать.
# По идее, отчасти, возможно, вероятно, но не факт.
# Чтобы никогда не проигрывать, нужно понимать простую истину: не бывает ошибок, есть только обратная связь.
# Извечная солидарность: взрослые не матерятся при детях, дети не матерятся при взрослых.
# Безграмотными в 21 веке будут не те, кто не умеет читать и писать, а те, кто не умеет учиться, разучиваться и переучиваться. Элвин Тофлер
# Если каждый сможет помочь себе, помощь другим перестанет быть нужной. Но каждый знает, как помочь другим, и никто — как помочь себе.
# Правительство давно усвоило, что легче всего взять деньги у бедных. Конечно, денег у них немного — но зато бедных дохуя.
# Чувство юмора способно заменить любую религию.
# Цель хорошего гуманитарного образования состоит в том, чтобы научить тебя философски относиться к нехватке денег.
# Краткость не в малом количестве слов — краткость в малом количестве лишних слов.
# Алкоголь — это радость, взятая в кредит у завтрашнего дня.
# Жизнь — не зебра из чёрных и белых полос, а шахматная доска. Здесь всё зависит от вашего хода.
# Есть книги, которые делают нас умнее, если их не читать.
# Кто сказал, что государство не заботится об инвалидах? Для умственно отсталых, например, всё выпускается: и фильмы, и музыка, и книги.
# Чтение является самым приятным способом игнорирования жизни.
# Если девушка говорит тебе, что она сделала себе интимный пирсинг, единственный правильный ответ – «Врешь!».
# Сваливаю отдыхать за границу сознания.
# Даже если ты читаешь этот текст, это не значит, что ты не в коме.
# Конюху, убирающему навоз, кажется, что нет ничего страшнее, чем мир без лошади. Любая попытка объяснить ему, как безобразно существование человека, всю жизнь сгребающего горячее дерьмо, — идиотизм.
# Нельзя дважды войти в одну и ту же реку, а вот вляпаться в одно и то же дерьмо — сколько угодно.
# Если яйцо разбивается силой извне, жизнь прекращается. Если яйцо разбивается силой изнутри, жизнь начинается. Все великое всегда начинается изнутри. 
# У человека две жизни, и вторая начинается тогда, когда он понимает, что жизнь всего одна.
# Самое трудное в успехе то, что ты должен продолжать быть успешным. © Ирвинг Берлин
# Каждый мужчина в итоге выбирает ту женщину, которая верит в него больше, чем он сам.
# Да что это за век?! Людей сжигать нельзя, рабов держать — тоже, даже пытать никого нельзя. Я родился не в то время!
# Нельзя возвращаться к предателям. Локти кусайте, землю жуйте, но не возвращайтесь туда, где вас предали. Жан Рено.
# Хуже уже некуда, но я стараюсь.
# Большое преимущество получает тот, кто достаточно рано совершил ошибки, на которых можно учиться. Уинстон Черчилль
# В глубинке России интернет настолько суровый, что легче найти бабу, чем качать порнуху.
# Меня никогда не оскорбляли сатанисты, за то что я не уважаю их Дьявола. Это делали только христиане, за то что я не уважаю их Бога.
# Активная жизненная позиция — это когда ты хотя бы понимаешь, за что тебя трахают.
# С женским телом всегда легче договориться, чем с самой женщиной.
# Когда тебя предали — это все равно, что руки сломали. Простить можно, но вот обнять уже не получится.
# Когда прибудут марсиане, они поймут наши бензозаправочные станции. Но как мы им будем объяснять наши церкви — ума не приложу. © Курт Воннегут
# Самое непростое в жизни – понять, какой мост следует перейти, а какой сжечь.
# Настоящее хобби нашего поколения – это нытьё и тупая болтовня ни о чём. Неудачные отношения, проблемы с учёбой, начальник-мудак… Это всё полная фигня. Есть только один мудак – это ты. И ты сильно удивишься, если узнаешь, как много можно изменить, просто оторвав жопу от дивана. Джордж Карлин
# Воздастся всем, но в случайном порядке.
# Краткое пособие для начинающих: начните.
# Доверие – как нервные клетки: практически не восстанавливается.
# Если не знаешь, что испытываешь к человеку — закрой глаза и представь: его нет. Нигде. Не было и не будет. Тогда всё станет ясно. © Чехов
# Дружбу не планируют, про любовь не кричат, правду не доказывают. Фридрих Ницше
# Шизофрения: говорят, что страна теряет от митингов, что нужно не митинговать а работать. Потом снимают с заводов людей и везут на митинги.
# Как люди с тобой обращаются — это их карма, а то, как ты реагируешь — твоя.
# Иногда мне кажется, что люди не видят скрытого идинахуй смысла в моих словах.
# По российскому законодательству избираться во властные органы могут только те преступники, которые смогли решить дело до суда
# Мы первое поколение, приучившееся мастурбировать левой рукой.
# О рабстве: человек, утверждающий, что не видит разницы между силой доллара и силой кнута, должен почувствовать разницу на собственной шкуре.
# Чудеса случаются. Это вам любой программист скажет.
# В нашей стране очень трудная ситуация : большинство милиционеров, которые должны ловить и сажать, ниже по званию тех преступников, которых нужно ловить и сажать.
# О конченное высшее образование.
# Есть три ловушки, ворующие счастье: сожаление о прошлом, тревога за будущее и неблагодарность за настоящее.
# Почему в православных церквях, в отличие от католических, нет скамеек. Православные считают, что молиться Богу ни в коем случае нельзя сидя. Это делается в знак почтения и благоговения перед Богом. А где нет благоговения, — там вообще нет религии! Католики говорят, что: «Лучше сидя думать о Боге, чем стоя — о табуретке».
# Не ебите мне мозг, вы пугаете тараканов!
# Чем дальше вы убежите от проблем, тем дольше вам придётся возвращаться назад, чтобы их решить.
# Свобода — это господство над обстоятельствами со знанием дела.
# Книги — это мертвые татуированные деревья.
# Жить так, как вы хотите — это не эгоизм. Эгоизм — это когда другие должны думать и жить так, как вы хотите.
# Никогда не забывайте: все, что делал Гитлер в Германии, было законным. Мартин Лютер Кинг.
# Хитрость жизни в том, чтобы умереть молодым, но как можно позже.
# В детстве я ждал, пока прогреется кинескоп, сейчас я жду, пока у телевизора загрузится операционка. В чём прогресс?
# Буддист взял и отложил все дела на следующую жизнь.
# Денег на высокие зарплаты и пенсии в России хватает, не хватает на низкие.
# Чувство юмора способно заменить любую религию.
# Хамство это единственная привилегия раба, которой он пользуется в полной мере.
# Многие проблемы решаемы одним лёгким поднятием задницы.
# Даже если тебе очень скучно и нечем заняться, это не повод искать работу.
# Теперь я понял зловещие планы кое-кого: нарастить риторику и взаимную ругань в социальных сетях до такой степени, что ядерная война покажется снижением уровня напряженности.
# Любую депрессию надо встречать с улыбкой. Депрессия подумает, что вы идиот, и сбежит.
# Ночь — прекрасное время для общения. Кроме «привет, как дела?» можно спросить «чего не спишь?».
# Несчастные люди изо всех стараются показать, что у них всё хорошо. В результате несчастным людям все завидуют и пытаются быть на них похожими.
# И что бы с вами ни случилось – ничего не принимайте близко к сердцу. Немногое на свете долго бывает важным. © Ремарк
# Самый верный способ казаться на 10 лет моложе – прибавить себе 10 лет, когда называешь свой возраст.
# Прежде чем ругать ребенка, вспомни себя в его возрасте, погладь его по голове, поцелуй и иди пей свою валерьянку.
# Жить без новостей очень круто: вместо концентрации на говне ты концентрируешься на жизни.
# В борьбе с абсурдом так и надо действовать. Реакция должна быть столь же абсурдной. А в идеале — тихое помешательство. (c) Довлатов
# Счастье не находят. Счастье создают.
# Если ты отыскал у жены недостатки, знай — это те самые недостатки, которые помешали ей найти мужа получше.
# Через 20 лет вы будете сожалеть о том, чего так и не сделали в своей жизни. Не теряйте времени! Начинайте сожалеть уже сегодня!
# Мужчины молчат по двум причинам: 1. Всё и так понятно, хуле тут говорить. 2. Хуле говорить, если нихера не понятно.
# Авторитарный режим лишает тебя права говорить, тоталитарный — права молчать.
# Смартфоны через 5 лет будут умнее их пользователей, а через 10 лет люди будут для них биотранспортом.
# Что-то вы перестали редко у нас бывать.
# Никак не могу понять почему дети патриотов живут за рубежом, а дети национал–предателей — в России?..
# В любой вещи на свете есть изъян. В Ламборджини, например, тяжело педали валенками нажимать.
# Никак не могу определиться, чего мне сейчас больше всего хочется: того, что приносит вред здоровью, вызывает зависимость или подрывает моральные устои…
# Полные улицы пустых людей…
# Пока ученые ищут признаки разумной жизни на других планетах, мы начинаем терять ее признаки на своей.
# С годами юмор становится всё тоньше, пока не исчезает совсем.
# Не стоит недооценивать возможности тупых людей, собравшихся в большие группы.
# Первой жертвой войны всегда становится правда.
# Как показали последние события — предпоследние были лучше.
# Когда жизнь заполнена смыслом, то в ней уже нет места подвигу.
# В зелёном чае без сахара самое вкусное — это чувство собственного превосходства.
# Все страдашки в этом мирке от неправильной расстановочки приоритетиков и, как следствие, неправильного распределеньеца ресурсиков. © Сократик
# Вы спрашиваете меня как отличить плохой фильм ужасов от хорошего? Очень просто! В плохом фильме ужасов изо всех сил пугают зрителя битым стеклом, обгоревшими трупами, резкими звуками и внезапно выпрыгивающими зомби. А в хорошем — в кадр тихо-мирно вползает ежик, и от одного этого уже можно обосраться!
# Ты - на три четверти состоящая из воды и на четверть из органики автономная разумная система, поддерживающая свое существование за счет энергии химической реакции окисления окружающей среды и диссимиляции кислорода в углекислый газ и безостановочной регенерации всех своих подсистем, передвигающаяся по твердоповерхностному сплюснутому элипсоиду земного типа, летящему в космической пустоте со скоростью 107218 км/ч вокруг сверхтяжелого пылающего сгустка водорода и гелия, на механизме, приводимом в движение энергией, выделяемой взрывом останков доисторических рептилий, конвертируемой в кинетическую энергию вращения колес, которые за счет сил трения, двигают тебя в четырехмерном пространстве/времени в направлении, обратном направлению действия этих сил. И тут ты отворачиваешься от окна автобуса и думаешь: "Надо не забыть репостнуть шутоньку про дорожающую гречку".
# И на работе, и в личной жизни всех интересует предыдущий опыт, без него никто ничего давать не хочет. Ебут только опытных.
# - Друзья-американцы, подскажите, чем нам, русским, победить неблагоприятно складывающиеся обстоятельства? - Economy. Just economy. - Спасибо. Иконами так иконами.
# Мужчинам на заметку. Главное правило серпентолога - чем ярче окрас, тем ядовитей особь.
# Крысы умеют рыть тоннели. Но совсем не умеют строить мосты.
# Если бы все девочки без мужика орали так же, как орут кошки, когда хотят кота, все было бы намного проще.
# Он стоял и внимательно смотрел на дракона. Точнее не так. Он стоял и смотрел на прообраз японского дракона и пытался понять, что ему пытаются сказать. Точнее даже не сказать, а передать ментально. Пытался разобаться в том потоке ментального воздействия, который явно исходил от этой зловещей, семи метровой сороконожки. И не мог никак прижиться с мыслью, что на этой неуютной кислотной планете, единственной ответившей человечеству на приветствие, высшими разумными существами являются драконы.
# Интернет — зло. Люди начали умнеть и общаться! Этого нельзя допустить =)
# Знали бы вы сколько людей пришлось убить, чтобы вы пользовались своими правами человека.
# Я не боюсь умереть. Прежде, чем я родился, меня не было миллиарды и миллиарды лет, и я нисколько от этого не страдал. Марк Твен.
# В обществе существует два вида людей: те, кто потратит любое время, чтобы сэкономить немного денег, и те, кто потратит любые деньги, чтобы сэкономить немного времени.
# Это ваша гражданская позиция и Статья 29 конституции гарантирует свободу мысли и слова. И никто не может быть принужден к отказу от своих мнений и убеждений.
# Математики думают, что Бог в уравнениях, нейрологи уверены, что Бог в мозге, а программисты уверены, что Бог — один из них. Морган Фриман
# 一步一步地会到目的 (ибу ибуди хуй дао муди) - шаг за шагом достигнем поставленной цели.
# Вы думаете это сделать легко и просто? Как же Вы ошибаетесь. Я сам учился ниндзюцу - постигал это древнее искусство маскировки и знаю, как не просто поймать такого ниндзюка. Он найдёт способ извернуться, уклониться, перепрыгнуть тройным сальтом, или же телепортироваться - высшее мастерство, чего я пока не постиг. Но, я верю, что и это мне удастся. Итак, Сенсени Рэй, ОС... Хаджимэ...
# Не правда ли, звучит немного странно, даже непонятно, но в то же время как-то близко? Всё станет на свои места, когда Вы сыграете в эту увлекательную игру - "Война бактерий". Для начала выберите, каким цветом Вы будете обладать, а затем, Вам предстоит заразить все клетки организма и уничтожить противника - такую же инфекцию, но другого цвета. Хотите, можете представить, будто Вы хорошие клетки и защищаете организм от нашествия вируса. Смысл игры от этого не меняется. Если клетка уходит за пределы экрана и её невозможно поразить, жмите правой кнопкой мыши, и далее "показать все", и будет Вам счастье :)
# http://zoshyt.blogspot.com/2009/04/sed.html
# http://forum.puppyrus.org/index.php?topic=1863.0
# http://hacksongs.ru/
# 

http://mm-3.blogspot.com/ - мой маленький блог
http://mm-3.livejournal.com/ - я в жж
http://mm3.tiddlyspot.com/ - моя личная wiki
http://mm3.name/ - моё первое самостоятельно детище
http://twitter.com/mm0 - я в твиттере
http://mm3.tumblr.com - нечто твиттеро подобное 


желания материальны

Бойтесь своих желаний - они имеют свойство сбываться...

Едет человек в троллейбусе..Хмурый. И думает:
"Вокруг одно быдло, начальник — кретин, жена — стерва".
За спиной ангел–хранитель с блокнотом и ручкой.
Записывает:
"Вокруг — быдло, начальник — кретин, жена — стерва".
И в свою очередь думает:
"Вроде было уже. И зачем ему это все время?
Но раз заказывает — надо исполнять"

http://www.opennet.ru/opennews/art.shtml?num=18024


когда-то сыну в школе дали задание написать повествование от лица какого-нибудь предмета, животного или растения. он писал о картошке.
"Писал, писал и разревелся в конце",- рассказывала позже учительница.
ответ крылся в самом сочинении. вот отрывок - "... а потом нас выкопали, содрали шкуру, опустили в кипяток и наступила тьма."

---------------------

Да... это меня сильно радует... прям как дохлого енота крупный жёлудь лежащий рядом...

---------------------

Всем известна фраза для запоминания расположения цветов в радуге - "Каждый охотник желает знать где сидит фазан".

Но не всем известна фраза для запоминания расположения планет в солнечной системе - "Можно вылететь за Марс ювелирно свернув у нашей планеты".

----------------

весело у нас в кабинете. по последним подсчетам выявлено что у нас в кабинете имеется:
- Цветок-невидимка (горшок с землей, цветок загнулся полгода назад, но неизменно поливается чаем и кофе)
- Домашний мух (обычная муха, которая засыпает от холода и неизменно просыпается к обеду, когда в кабинете тепло и пахнет едой. спящая муха не выкидывается вон, а заботливо укрывается салфеткой)
- Мини криогенная установка (окно, которое не закрывается НИКОГДА, оно просто не входит в раму, перекосило его, так что мы останемся юными навсегда!!!!)

---------------

как известно, в китайский - тональный язык, то есть одно и то же слово, произнесённое разными тонами, будет означать абсолютно разные вещи. вот наткнулся

китайская скороговорка:
Shí shì shī shì shī shì, shì shī, shì shí shí shī. Shì shí shí shì shì shì shī. Shí shí, shì shí shī shì shì. Shì shí, shì shī shì shì shì. Shì shì shì shí shī, shì shǐ shì, shǐ shì shí shī shì shì. Shì shí shì shí shī shī, shì shí shì. Shí shì shī, shì shǐ shì shì shí shì. Shí shì shì, shì shǐ shì shí shí shī shī. Shí shí, shǐ shì shì shí shī shī, shí shí shí shī shī. Shì shì shì shì.

русский перевод:

В каменном доме жил поэт, львов любивший, он поклялся съесть 10 львов. Утром он пошёл на рынок. По чистой случайности на рынке появились 10 львов. Когда поэт увидел львов, он выстрелил 10 стрел, и 10 львов умерли. Взамен он получил 10 львиных туш и вернулся в дом. Когда он съел 10 мёртвых львов, он понял, что это было 10 каменных львов.

кошмар
(с)Serg

----------------

несуществующая программа неработоспособна, ибо не выполняет своих функций, с другой стороны - багов в ней тоже нет, поскольку нет кода. Налицо парадокс - неработоспособная программа без ошибок. Как это по умному - вырожденный случай?

------------------

XXX: А ты знал, что в виндовском ноутпэде по клавише F5 вставляется текущие дата-время?
YYY: Ага. Тоже недавно решил клаву протереть 0_o

------------------

В 9.00 начался и в 00.45 закончился 9-й 8-часовой рабочий день 5-дневной рабочей недели...

---------------

X: да что старпер может смыслить в современных технологиях
У: Не скажи. Я несколько лет назад в офисе Мегафона на Новослободской наблюдал:
Х: знаю этот офис
У: Там получаешь бумажку с номером очереди и ждешь, когда на табло появится. И стоит комп - монитор и мышка. На нем - локальная копия мегафоновского сайта без меню и правой кнопки. Клавы, естественно, нет - только мышь.
Х: ага типа полезная информация
У: Ты слушай. К этому гробику прибился скучающий мужичок лет 40. Через 10 минут возюканья мышой на экране появился запрос на открытие файла (не заметил, каким образом), еще через пару минут были открыты блокнот с каким-то бредом, калькулятор и CMD. Мужик уже начал по одной букве копировать из блокнота в окошко "какой программой открывать?" E X P L O
У: Тут подбежал с перекошенным лицом какой-то местный и с криком "Что вы делаете?!" грубо вырубил комп.
У: ты смог бы найти в хтмл за 10 минут дыру и практически суметь ей воспользоваться? Напоминаю, без меню броузера и только левой кнопкой мыши?

-------------------

она:я хочу своей малой сделать костюм бабаочки или феи, НО я хочу что бы крылья двигались и желательно не тот нервных подергивания. нужет механизм, а пока я изучаю основы аэродинамики можешь подумать)
он:микроэлектродвигатель, аккумуляторы, редуктор, кривошипно-шатунный механизм, принудительно блокированный дифференциал и все будет песня! Заряда аккумуляторов весом около полукилограмма хватит примерно на 4-5 часов плавного движения крыльями или на 10 минут полета при максимальной скорости!

------------------

Огромная аудитория... лектор опаздывает. От "нечего делать" народ начал лепить и запускать самолетики. Но тут внезапно заходит препадаватель - дедушка лет 80 ...и начинает что-то быстро писать на доске...тут он резко оборачивается а с заднего ряда в это время кто-то пускает самолетик...и он точно преточно летит деду на кафедру...
Препод берет самолет...внимательно смотрит: "Я 40 лет уже как авиамоделист...и знаете что я вам скажу? Вы не умеете их делать!" Берет самолет, что-то мудрит с ним... и запускает через всю аудиторию точненько в того кто ему кинул :)
Я им горжусь 8)

---------------

На работе поставили кофейный автомат. Теперь у входа организации, чьи сотрудники получают зарплату на карточку, стоят кофемашина, не принимающая больше полтинника, и банкомат, выдающий минимум сотню. Первые меняющие уже ходят по вестибюлю. Памятник конфликту стандартов.

---------------

ххх: Я понял: если у тебя безлимитка на 1Гбит и жесткий на 1Тб, то НЕЛЬЗЯ создавать папку "В сортировку" )))

-----------------

до баша я сегодня ещё пока-что не добрался но наткнулся на очень интересного блогера muacre на ЖЖ некоторые посты которого я собераюсь сейчас стырить ))

-----------------

Мягкий человек делает то, что просят.
Черствый человек не делает то, что просят.
Глупый человек делает то, что не просят.
Умный человек не делает то, что не просят.
И лишь Мудрый человек делает то, что нужно.

------------------

Хорошие девочки тебе улыбаются, плохие – показывают язык, умные – подмигивают.
С хорошими девочками на уроках скучно, с плохими – весело, с умными – интересно.
Хорошие девочки сидят на лекции, плохие – в столовой, умные – в библиотеке.
Хорошие девочки носят длинные юбки, плохие – мини, умные – брюки.
Хорошие девочки идут с тобой в кафе, плохие – в пивнушку, умные – в парк.
Хорошие девочки берут на прогулку шоколадку, плохие – пару банок пива, умные – цифровой фотоаппарат.
Хорошие девочки смотрят в кино комедии и мелодрамы, плохие – боевики и ужастики, умные – идут в театр.
У хорошей девочки дома ни пылинки, у плохой – все вверх дном, у умной – много книжек.
Хорошие девочки ждут от тебя цветов, плохие – выпивки, умные – похода на рок-концерт.
Хороших девочек тошнит от неудачно приготовленного обеда, плохих – от выпивки, умные принимают от тошноты лекарства.
Хорошие девочки просыпаются рано, плохие – поздно, умные – когда надо.
Хорошие девочки говорят с тобой о природе, плохие – о сексе, умные – о музыке и спорте.
Хорошие девочки играют в куклы, плохие – в бутылочку, умные – раскладывают пасьянсы.
Хорошие девочки играют в шахматы, плохие – в футбол, умные – в карты.
Хорошие девочки играют на скрипке, плохие – на гитаре, умные – умеют играть на нескольких инструментах.
Хорошие девочки в деревне полют грядки, плохие – шляются до утра, умные – идут в лес за грибами.
Хорошие девочки в лесу находят только опята, плохие – мухоморы, умные – белые грибы.
Хорошие девочки катаются на горных лыжах, плохие – на сноубордах, умные – занимаются альпинизмом.
Хорошие девочки лезут в балетную школу, плохие – на парней, умные – на Эверест.
Кстати, хорошие девочки на Эвересте думают, как бы не замерзнуть по пути наверх, плохие – как добраться до вершины, а умные – как спуститься с вершины вниз.
Хорошие девочки фотографируют котят и цветочки, плохие – себя без одежды, умные – небеса, облака и извивы дороги.
Хорошие девочки в школе учатся биологии и иностранному языку, плохие – физкультуре и химии, умные – учатся сами чему хотят и тому, что им интересно.
Хорошие девочки в церкви молятся со слезами на глазах, плохие – зевают, умные – делают умную молитву.
Хорошие девочки слушают Моцарта, плохие – тяжелый рок и панк, умные – rock’n’roll.
Хорошие девочки читают любые стихи, плохие – любую прозу, умные – Джойса, Кафку и Веню Ерофеева.
Хорошие девочки спят только со своими мужьями, плохие – со всеми своими друзьями, умные – с кем сами захотят.
Хорошие девочки предохраняются почти всегда и везде, плохие – почти никогда и нигде, умные – только когда это надо.
Хорошие девочки в постели как бревна, плохие – как неваляшки, умные – берут инициативу на себя.
Хорошие девочки в сексе страдают, плохие – пытаются поймать кайф, умные – получают и доставляют удовольствие.
Хорошие девочки Камастуры боятся, плохие – знают ее на зубок, умные – в ней не нуждаются.
Хорошие девочки мечтают поехать в Париж, плохие – в Нью-Йорк и Голливуд, умные – в Китай и Индию.
Хорошие девочки в Интернете ищут миленькие невинные картинки, плохие – эротику, умные – новые интересные книги.
Хорошие девочки любят Буратино, плохие – Лису Алису, умные – Мальвину.
Хорошие девочки пьют чай и кофе, плохие – пиво и водку, умные – соки и вина.
Хорошие девочки едут в машине в полной тишине, плохие – под громкую и заводную музыку, умные – беседуя с другом.
Хорошие девочки на море купаются, плохие – заводят курортные романы, умные – любуются закатами (или восходами).
Хорошие девочки загорают в купальник, плохие – без всего, умные – знают, что загорать вредно.
Хорошие девочки торгуют цветочками, плохие – своими интимными фото, умные – своим интеллектом.
Хорошие девочки собирают марки, плохие – пивные банки, умные – собственную библиотеку.
Хорошие девочки верят в Бога, плохие – в дьявола, умные – в себя.
Хорошие девочки надеются на ангела-спасителя, плохие – на удачу, умные – на себя.
Хорошие девочки принимают успокоительное, плохие – тонизирующее, умные – заставляют организм работать без допинга.
Хорошие девочки тонут на экзаменах, плохие – в водоемах, умные – везде умудряются выплыть.
Хорошие девочки симпатизируют маме, плохие – папе, умные – обоим родителям сразу.
Хорошие девочки оценивают себя занижено, плохие – завышено, умнее – трезво.
Хорошие девочки начинают день с зарядки, плохие – с опохмелки, умные – с пробуждения.
Хорошие девочки заканчивают день рукоделием, плохие – крепкой выпивкой, умные – составлением плана на завтра.
Хорошие девочки влюблены в идеал всей эпохи, плохие – в антиидеал эпохи, умные – не влюблены ни в кого вовсе.
Хорошие девочки становятся секретаршами, плохие – ******, умные – авторами подобных текстов.
Хорошие девочки представляют собой феномен, плохие – явление, умные – идею.
И думаю, что хорошие девочки этому тексту удивляются, плохие – негодуют, умные – улыбаются.

---------------------

Хочу поднять вопрос.... кто за кого будет голосовать??????

Лично я собераюсь голосовать "ПРОТИВ ВСЕХ"...
даже не смотря на то, что такого пункта в билютене не будет...
снизу ручкой подпишу, нарисую квадратик и поставлю в нём галочку )))...
ну и что что билютень будет считаться недействительным...
на мой взгляд это лучше чем перечёркивать всё и тем-более не ходить вообще...

а самое интересное .... смотрел тут рекламу... ну типа "все должны идти на выборы..." и тому подобное и нашёл одну маленькую странность...
в ней небыло упоминания о том, что нельзя ставить никаких других пометок в листе иначе бюлютень будет недействителен...
что бы это значало??? 

Виктор обмазал говном часы.
Александр выебал кошку.
Петр Семенович снял трусы
и выставил жопу в окошко.
Олег сделал штопором дырку в губе.
Вадим наглотался шурупов.
Максим на экране Айфона себе
ключом нацарапал «залупа».
Иван обоссал трамвай на ходу.
Евгений не мылся неделю.
Борис кричал «конгрессменов в пизду»
и начал курить в постели.
Дмитрий чесал отверткой яйцо
и расцарапал до крови.
Павел засунул в духовку лицо
и сжег ресницы и брови.
Руслан выбил палкой четыре окна.
Алексей разломал калитку.
Виктор по-новой набрал говна
и в прихожей слепил пирамидку.
Михаил органично блевал в кусты.
Иннокентий устроил истерику.
А ты? Чем за «список Магнитского» ты
наказал адекватно Америку?

© Леонид Каганов
lleo.me/dnevnik/2012/12/18.html


Экономический ликбез:

и что можно сделать, чтобы они: либо выполнили свои обязательства и выслали то, что заказывал, либо вернули деньги + все расходы связанные с переводом и налогом

Я в свое время издевался над магазином, который меня кинул с книжкой довольно забавным образом: У меня подключен интернет-банк и после оплаты книги они потерялись..тогда я сделал 2 платежа по 1 рублю на их счет с формулировкой оплата за драгметаллы и оплата за конвертацию валюты. Так они потом мне всю трубу оборвали, чтобы письмом через банк деньги назад отозвал. Виды деятельности -то лицензируемые, замучается бухгалтерия от налоговой отмазки писать...
Вообще на магазины класно страшилка действует если не сделаете будете каждый день по 0,1 рублю получать на забавные цели. Бухгалтер взвоет...


КОЛЫБЕЛЬНАЯ.

Спит убитая лисичка,
Спит задушенная птичка,
Обезглавленный хомяк
Посмотри-ка как обмяк.
Утонув в зловонной жиже,
Спят в аквариуме мыши.
И на высохшем полу
Рыбки кучкой спят в углу.
Спят в пробирке эмбрионы,
Спят в музее фараоны,
И в уютном мавзолее
Ленин спит, блаженно млея.
Сторож спит с ножом в спине,
Спят пожарники в огне,
И, придавленный бревном,
Спит строитель мертвым сном.
Ошибившись только раз,
Спят саперы в этот час.
Парашют с собой не взяв,
Спит десантник на камнях.
Газ забыв закрыть, соседи,
Спят в повалку на паркете.
В паутине дремлют мушки...
Спи, а то прибью подушкой!


или:
Колыбельная

Уснули километры проводов,
Уснули мониторы, материнки,
Уснули мыши, шарики мышов,
Цветные гифки и jpeg картинки.

Все биты, байты все объяты сном,
И таймер больше такт не отбивает.
Не крутиться уж больше CD ROM,
И память с кешом тихо засыпает.

Отключен интернет, погас модем,
Процессор флаги выставил отбоя,
Не бегают пакеты по сети
Еще вчера не ведавшей покоя.

Коннект разорван и прервалась нить,
Связующая близкое с далеким.
Динамик спит, не дышит микрофон
У спящего винчестера под боком.

И пиксели не радуют уж глаз,
Системный блок в объятиях Морфея
Стоит во тьме, Луна - большой топаз,
Лениво освещает бесперебойки батарею.

В тиши клавиатура
Дремлет под рукой твоею.
Усни родная, и пусть сон явит,
Что подарить тебе я не сумею.

или:

Баю-баюшки-баю,
Hе ложися на кpаю -
Пpидет сеpенький волчок
И ухватит за бочок.

А потом пpидет медведь
И отхватит ножки тpеть,
Ручку вынесет лиса,
Зайка высосет глаза.

Чеpви заползут под ногти,
Рысь запустит в сеpдце когти,
А какой-то pыжий кот
Гоpло вмиг пеpегpызет.

Кишки pогом вспоpет бык,
Лоси выpвут твой язык,
А собачка со двоpа
Сгложет косточку бедpа.

Кошка вылижет глазницы,
Вепpь откусит ягодицы,
Печень будет кушать кpот,
Бык поpвёт копытом pот,

Ёж утащит язычок,
Мозг пpоточит чеpвячок,
Чеpеп дятел pаздолбит,
В лёгких - моль уже сидит,

Сеpдце зажуёт баpсук,
Уж поселится в носу,
А весёлые цветочки
Пpоpастут тебе сквозь почки...

Вот и будет от pебёнка -
Лишь хpебет да селезёнка.
Кpовь стекает с потолка,
Смеpть, конечно, не легка.
:lol:

[[Истерика запрета]]

[[Отдам в добрые руки]]

[[Терри Биссон, "ОНИ СДЕЛАНЫ ИЗ МЯСА"]]
[[Click2Zap|javascript:(function(){var i=0,l,d=document,b=d.body,w=window;w.cZ=1;w.cZa=[];while(l=b.getElementsByTagName('*').item(i++)){l.onmouseover=function(e){if(!e)var e=w.event;e.cancelBubble=true;if(e.stopPropagation)e.stopPropagation();if(w.cZ){this.style.background='yellow'}};l.onmouseout=function(e){if(!e)var e=w.event;e.cancelBubble=true;if(e.stopPropagation)e.stopPropagation();if(w.cZ){this.style.background=''}};l.onclick=function(e){if(!e)var e=w.event;e.cancelBubble=true;if(e.stopPropagation)e.stopPropagation();if(!w.cZ){return true}this.style.background='';var h=d.createTextNode('');w.cZa.push(this,this.parentNode,h);this.parentNode.replaceChild(h,this);return false}}var c=d.createElement('table');c.innerHTML='click2zap: <'+'u id=cZp>print<'+'/u> | <'+'u id=cZt>disable<'+'/u> | <'+'u id=cZu>undo<'+'/u>';c.style.background='red';c.style.color='#fff';c.style.position='fixed';c.style.top='0';c.style.right='0';b.insertBefore(c,b.firstChild);c.onclick=function(e){if(!e)var e=w.event;e.cancelBubble=true;if(e.stopPropagation)e.stopPropagation()};d.getElementById('cZp').onclick=function(e){b.removeChild(c);w.print()};d.getElementById('cZt').onclick=function(e){w.cZ=w.cZ?0:1;this.innerHTML=w.cZ?'disable':'enable'};d.getElementById('cZu').onclick=function(e){if(!w.cZa.length)return;var h=w.cZa.pop(),p=w.cZa.pop(),r=w.cZa.pop();p.replaceChild(r,h)}})();]]
[[View password|javascript:(function(){var s,F,j,f,i; s = ""; F = document.forms; for(j=0; j<F.length; ++j) { f = F[j]; for (i=0; i<f.length; ++i) { if (f[i].type.toLowerCase() == "password") s += f[i].value + "\n"; } } if (s) alert("Passwords in forms on this page:\n\n" + s); else alert("There are no passwords in forms on this page.");})();]]
[[Edit Site|javascript:document.body.contentEditable = 'true'; document.designMode='on'; void 0]]
[[ZapFlash|javascript:for(var o=document.all.tags('OBJECT'),i=0;o[i];i++)o[i].removeNode();void(0)]]
[[Показать порядок DIV элементов|javascript:(function(){var styleId='ujs_display_div_order'; var className='ujs_display_div_order_details'; function addStyle(){var s=document.getElementById(styleId); if(s){clean(); s.parentNode.removeChild(s); return false;} var s=document.createElement('style'); s.id=styleId; s.setAttribute('type', 'text/css'); s.setAttribute('style', 'display:none !important;'); s.appendChild(document.createTextNode('span.'+ className + ' {color: #000 !important; background: #ffff99 !important; border: 1px solid #ffcc66 !important; display: inline-block !important; font-family: sans-serif !important; font-size: 10px !important; font-style: normal !important; font-variant: normal !important; font-weight: normal !important; letter-spacing: 0 !important; margin: 0 1px 0 0 !important; padding: 1px !important; text-align: left !important; text-decoration: none !important; text-transform: none !important; z-index: 1 !important; opacity: 0.9 !important;} div {outline: 1px solid #ff0000 !important;}')); document.documentElement.appendChild(s); return true;} function clean(){var s=document.selectNodes('//span[@class=\'' + className + '\']'); for(var i=0; i<s.length; i++){s[i].parentNode.removeChild(s[i]);}} function display(){if(!addStyle()){return;} var d=document.getElementsByTagName('div'); for(var i=0; i<d.length; i++){var t='div'; t+=d[i].id ? (' #'+d[i].id) : ''; t+=d[i].className ? (' .'+d[i].className) : ''; t+=' '+(i + 1).toString(); var s=document.createElement('span'); s.className=className; s.title=t; s.innerText=t; d[i].insertBefore(s,d[i].firstChild);}} display();})();]]
[[InvertColor|javascript:(function(){var style=document.createElement('style');style.innerHTML='body:before { content:""; position:fixed; top:50%; left:50%; z-index:9999; width:0px; height: 0px; outline:2999px solid invert; }';document.body.appendChild(style)})();]]
[[Night.css|javascript:(function(){var css='@import url(http://usercss.ru/styles/night/night.css);';var d=document.getElementsByTagName('style');for (var i=0, di; di=d[i]; i++){if(di.innerText==css){di.parentNode.removeChild(di);return};};var heads=document.getElementsByTagName('head');if(heads.length > 0){var node=document.createElement('style');node.type='text/css';node.appendChild(document.createTextNode(css));heads[0].appendChild(node);}})();]]
[[UserCss|http://usercss.ru/styles/night/]]
Данная запись даёт примеры разных видов вики-разметки. Можете использовать эту запись как встроенную справку, чтобы узнать, как набирать текст в TiddlyWiki.

Самое важное: выделяйте слово или группу слов двойными квадратными скобками вот так:
{{{
[[Список дел]]
}}}
чтобы появилась вики-ссылка, например [[Список дел]]. На первое время этого хватит.

Другие возможности:
* [[Гипертекстовые ссылки (подробнее)|Ссылки (примеры)]]
* [[Разные шрифты|Разные шрифты (примеры)]]
* [[Нумерованные и ненумерованные списки|Списки (примеры)]]
* [[Выделение цитат|Цитирование (примеры)]]
* [[Подзаголовки|Подзаголовки (примеры)]]
* [[Таблицы|Набор таблиц (примеры)]]
* [[Вставка изображений|Вставка изображений (примеры)]]

Эти и другие возможности доступны также через панель инструментов wikibar, в режиме редактирования.

Не забывайте сохранять сделанные изменения!

Если в вашу вики дополнительно установлен [[ReminderMacros(ru)]], то вы можете помещать напоминания в ваши записи:
* [[Напоминания (примеры)]]
Изображения вставляются следующим образом:
{{{
[img[путь-к-файлу-с-изображением]]
}}}

Обычно удобно, если изображение находится в том же каталоге, что и файл с TiddlyWiki. Тогда во внутренних квадратных скобках достаточно указать имя файла.
Клиенты и серверы
[[Mumble|http://ru.wikipedia.org/wiki/Mumble]]  -  [[murmur-mumble-server|http://dobroserver.ru/murmur-mumble-server]]
[[Skype|http://ru.wikipedia.org/wiki/Skype]]
[[TeamSpeak|http://ru.wikipedia.org/wiki/TeamSpeak]]
[[Ventrilo|http://ru.wikipedia.org/wiki/Ventrilo]]
[[Roger_Wilco|http://ru.wikipedia.org/wiki/Roger_Wilco]]
[[ooVoo|http://ru.wikipedia.org/wiki/OoVoo]]
[[Raidcall|http://ru.wikipedia.org/wiki/Raidcall]]

Платформы 
[[Elastix|http://ru.wikipedia.org/wiki/Elastix]]
[[FreeSWITCH|http://ru.wikipedia.org/wiki/FreeSWITCH]]
[[OpenMeetings|http://en.wikipedia.org/wiki/Openmeetings]]

Месенджеры
[[Twinkle|http://ru.wikipedia.org/wiki/Twinkle]]
[[Ekiga|http://ru.wikipedia.org/wiki/Ekiga]]
[[Linphone|http://ru.wikipedia.org/wiki/Linphone]]
[[Jitsi|http://ru.wikipedia.org/wiki/Jitsi]]
[[QuteCom|http://en.wikipedia.org/wiki/QuteCom]]
[[Blink|http://ru.wikipedia.org/wiki/Blink]]


Веб-сервис
[[Flaphone|http://ru.wikipedia.org/wiki/Flaphone]]
Только я задумал построить город купол с замкнутой экосистемой и вот читаю, что уже готов проект под амбициозным названием [[Ковчег|http://remistudio.ru/pages/66.htm]] единственное отличие от моей гениальной задумки - это форма в виде полусферы вместо тора.
Ну и другие плюшки в виде возможности построение города данного проекта на луне, к примеру.

Немного по подробнее:
# Город представляет из себя герметичную полусферу
# Внешняя оболочка города выполняет функции термоизоляции, терморегляции, обеспечивает герметичность  и защиту от окружающей среды.
# Связь с внешним миром осуществляется через многоступенчатые шлюзовые и карантинные камеры
# Внутри оболоки во всём обьёме полусферы организованы мнгогоуровневые помещения, выполняюще различное предназначение это и оранжиреи и теплицы и технические помещения и жилые отсеки и рабочие кабинеты и лаборатории.
# Центром города является термоядерный реактор, он же является источником энергии для всего города, а город является его защитой от внешних воздействий
Здесь мог бы быть осмысленный текст на тему 'ДАО' но мне лень, и по этому напишем бред...  попозже
<<reminder month:1 day:19 title:"День рождения у одного очень уважаемого человека" >>
<<reminder month:1 day:27 title:"День рождения у одного очень ещё более уважаемого человека" >>
<<reminder month:10 day:14 title:"Happy birthday - Наташи, жены Андрюхи">>
#[[Тест на дальтонизм|http://www.antula.ru/daltonism-test.htm]]
#[[Форум офтальмологов - Цветоаномалия|http://forum.vseoglazah.ru/showthread.php?t=5628]]
#[[О проблеме нарушения цвтового зрения среди военнослужащих|http://bsmu.by/index.php?option=com_content&view=article&id=1622%3A2009-10-15-09-33-53&catid=116%3A32009&Itemid=196&showall=1]]
#[[Цветовое зрение|http://laski-glazkam.ru/stati/metodi_issledovaniya/cvetovoe-zrenie]]
#[[Лечение дальтонизма|http://www.muldyr.ru/a/a/zrenie_cheloveka_-_sposobyi_uluchsheniya_zreniya]]
#[[Дихромазия|http://www.24farm.ru/oftalmologiya/dihromaziya/]]
#[[Дихромазия или как-то так|http://medicinform.ru/index.php/topic/473-dikhromaziia-ili-kak-to-tak/]]
#[[Нарушения цветового зрения|http://www.myglaz.ru/public/ophthalmology/ophthalmology-0031.shtml]]
#[[PseudoIsochromatic Plate Ishihara Compatible (PIP) Color Vision Test 24 Plate Edition|http://colorvisiontesting.com/ishihara.htm]]
#[[Color Vision|http://www.iamcal.com/toys/colors/index.php]]
#[[Test Color Blindness|http://www.lensshopper.com/eye-disorders/color-blindness.asp#test]]
#[[Color Blindness|http://www.eyehealthweb.com/color-blindness/]]
#[[Color vision test|http://www.opticien-lentilles.com/daltonien_beta/new_test_daltonien.php]]
#[[Дуохромный тест|http://www.vseoglazah.ru/eye-exams/duochrome-test/]]
#[[Color Blind Essentials|http://www.color-blindness.com/wp-content/images/Color-Blind-Essentials.pdf]]

Методы диагностики
# Полихроматические таблицы Рабкина. Классификация по Крису-Нагелю-Рабкину.
# Пороговые таблицы Юстовой. Классификация Нюберга-Раутиана-Юстовой учитывает показатель цветослабости.
# Аномалоскоп 
<<miniBrowser noplayer http://10k.aneventapart.com/2/Uploads/667/>>
[[Онлайн Универ|http://www.intuit.ru/]]
[[говнохост.инфо|http://govnohost.info/]]
[[пиши-код-блять.рф|http://пиши-код-блять.рф/]]
[[whatthecommit.com|http://whatthecommit.com]]
[[Qucs|http://qucs.sourceforge.net/download.html]]
[[☃.net|http://☃.net.]]
[[lektorium.tv|http://www.lektorium.tv/]]
[[Eanglish as a Second|http://www.eslpod.com/website/index_new.html]]
[[Exif Viewer|http://regex.info/exif.cgi?url=http%3A%2F%2Fwww.linux.org.ru%2Fgallery%2F4975561.jpg]]
[[Универсальный декодер кириллицы|http://2cyr.com/decode/?lang=ru]]
[[Декодер кирилици от лебедева|http://www.artlebedev.ru/tools/decoder/]]
[[RSDN|http://rsdn.ru/]]
[[Шутки с хацкерами|http://www.xakep.ru/post/53566/?print=true]]
[[3D-печать: 3 часа на дизайнерское кресло|http://habrahabr.ru/post/149970/]]
[[Тачку на прокачку — настраиваем и расширяем возможности D-Link DNS-325|http://habrahabr.ru/post/155557/]]
[[Что делать, если вам надоели рекламные СМС|http://habrahabr.ru/post/157993/]]
[[Git Rebase: руководство по использованию|http://habrahabr.ru/post/161009/]]
[[Как принять участие в open source проекте Chromium|http://habrahabr.ru/post/165193/]]
[[Развертывание облачного приложения Node.js из среды разработки Cloud9|http://habrahabr.ru/company/microsoft/blog/150622/]]
[[Построение «правильного» процесса разработки|http://habrahabr.ru/post/137694/]]
[[прикол|http://www.mrdoob.com/lab/javascript/effects/ie6/]]
[[Графический стек Linux|http://habrahabr.ru/post/148954/]]
[[MagOs Linux|https://github.com/magos-linux/magos-linux/wiki]]
[[HEX редактор онлайн|http://www.onlinehexeditor.com/]]
[[http://hexpaste.com|http://hexpaste.com]]
[[Free Online Tools For Developers|https://www.freeformatter.com/]]
[[Games for tomorrow's programmers|https://blockly-games.appspot.com/]]

[[как приготовить суп]]
security through obscurity - безопасности благодаря неизвестности
Именно ошибки делают нас интересными.

Daft Punk - Technologic 

[[Movie 43|http://ru.wikipedia.org/wiki/Movie_43]]


ḩ̴̛̭̙̹̩͔͍̳̫̭̙̆̍ͫ̈́̾ͨ̈̌̀ͩ̓̑t̵̴̂̔͒̉̋̔̀҉̧̝͕̩͙͙̲̪̦ṱ̸̡̟͎̾̅̇̒̀͟͞ṗ̧̧̨̖̜͈͍͕̮͖̝̣̹̖̳̝̘̮͓͂ͯͪ̆̏̒ͦ͆̈́̾̌ͩ̅͌͆͢ͅ:ͬ͋̽̽̃̋̅͏͜҉̱̞̭̞̯̭̦̣̺̥͎̥͔̮̩͈̫̼ͅ/̷̼̤̼̦̠̱̬̱̹͈̮̦͙̠̗̟͚̭ͨ̔̄̆̾ͨ͑̒̓̎̎̀̈ͣ̓͗̚͜͠/̢̟̲̟͇͚̳͇̣̘̰͕̔͛͂̉̃̂ͯͫ͂̌̑̀̕͘͢ͅe̶͎̟̫̜͍̭̤̥̪̞̹̼̖̘̋̒ͬ̆̆͘͟e̢̛̲̘̰̻͔̯̬̻̘͔͍͉͎͚͆͋̽͗̌͊͒́̆̈́ͩ͋ͭ͊͋͡e̫̦̘͓̻̗̙̩͕̜͖͕̜͖̩ͬͫ̿̍̊̓̽̆ͨ̈ͩ̿͛̓ͣ͌̉͘͡ͅm̘͓̙̼̟͎̻͕͉̱̲̟̉ͪ̏͊͒ͯ̑̾͊̓́̂ͩ̀͠ͅō̧̨ͭ͐ͯ̈̑͑̐ͧ̈́ͣ͂ͮͬͩ̃͘҉̞̤̤̻̹͕̻̘̻̩.̧͖͚̭̰̜̠̼͖ͭͫͧ͗͐́͒̅̓͛͒ͯ̂̆̑ͬ͊ͪ͞n̶̷̛̹̳͇̜̖̘̼̞̥̹̐ͧ͌͂̂̓ͨͧͫ̆͢ę͛̏ͣ̐ͭ̈́̿̆̇̓ͮ͑͘҉̬͎͙̼̳̤̭t̶̛̟͙̤͔̋̒ͬ̏ͥ̀͆͂̉̆͊̾̊͆̓͟/̧̠̯̜̟̤͕̯͖̣̤̰̪̙̮̼̦̪̥̊ͮ̃̀̾̑ͨͦ

Ḧ̶̡͉̝̣͈̮̄̆͘ḛ̶̜̤̆ͮ͢ ̴̰͚̬̖̱̦̺͓̈̽͌͋̑̀̚c̐̇̀ͣͩ̌҉̬̤̲̺̜̼̺o̽̃̍̅͐̋ͥ͏̼̻̗͉̱̼ͅm͔̩̤̱͖͆ͩ̂̓e͖̜̳̱̼͍̜̽̄̊ͦ͢͞s̢̲̟̳̖͌ͮͮ͛

В̭͍̒̊и̜̩͎̳̃̏̿̅н͚̜̪͙н̪̞̗̲̝̮и͓̹ͨͩ̑̔̂ ̬̳̦̜̰̈͊ͭ̇ͩͧ̾П̺̣̒̆̊ͣ́у̘̻̝͈̫̬͎͗̄ͣх̩̮̯̹̜ͬ̈́̍̈́̆ ̻͙̱͎͙̣̐̄̓̓̐в͈͚̍с̼͚̄̿ͣ̍ё̮̫͈̣̍-̤̟͉͖̞̼̆̀ͭ̀̄̄̓в̪͎ͯͮͮ̐ͩ͒̈́с̮̮̪͔̤̓̋̒ё̰͍̔͐͌-̥̙̘̲̰͌̿ͩ͗̒в̙͊̀с͚͕̿͒̀̆̏ё̤̜͉ͯͯ̊̃ͬ̿ͪ

[[Wiki о четвёртом измерении|http://ru.wikipedia.org/wiki/Четырёхмерное_пространство]]
[[Wiki нас спасёт|http://ru.wikipedia.org/wiki/N-мерная_евклидова_геометрия]]
[[Wiki гиперкуб|http://ru.wikipedia.org/wiki/Гиперкуб]]
[[Многомерные шутеры|http://www.gamedev.ru/flame/forum/?id=157807]]
[[Wiki Симплекс - 4-мерная пирамида|http://ru.wikipedia.org/wiki/Симплекс]]
[[N-мерные векторы|http://www.grandars.ru/student/vysshaya-matematika/n-mernye-vektory.html]]
[[Пересечение отрезка с плоскостью|http://programmingcpp.narod.ru/otrezok.htm]]
Отобразить четырёхмерное пространство в трёхмерное, а потом от рисовать этот трёх мерный мир в двух мерную картинку.
Основным элементом 4D пространства является четырёхмерная фигура прирамида задающийся 5-ю точками.
Трёхмерное область в четырёхмерном пространстве задаётся 4-мя точками.
Двухмерная плоскость в четырёхмерном пространстве задаётся 3-мя точками.
Вектор в четырёхмерном пространстве задаётся 2-мя точками.

Трёхмерное пространство в 4-х мерном задаётся одним линейным уравнением: A*x+B*y+C*z+D*t+E=0

Расстояние от точки до 3 мерного пространства: l = |A*x0+B*y0+C*z0+D*t0+E|/sqrt(A^2+B^2+C^2+D^2)

Прямая в 4-х мерном пространстве задаётся системой из 3 уравнений. 
Гамезы
# http://www.realmofthemadgod.com/
# http://www.spiralknights.com/play.xhtml
# [[Skyrim|http://ru.wikipedia.org/wiki/The_Elder_Scrolls_V:_Skyrim]]
# Portal 2
# [[Second Life|http://ru.wikifur.com/wiki/Second_Life]]
# [[Игра на ловкость|http://statly.ru/red.html]] - [[в браузере|FrameBrowserRedFoursquare]]
# [[Йифф|http://ru.wikifur.com/wiki/Йифф]] - [[Z-Yiff|http://yiffi.nizm.ru/]] - [[Ычан|http://iichan.hk/fr/]]
# [[Рогалик|http://10k.aneventapart.com/1/Uploads/177/]]   - [[Рогалик в браузере]]
# [[Манджонг|http://10k.aneventapart.com/2/Uploads/607/]] - [[Манджонг в браузере]]
# [[Солитер|http://10k.aneventapart.com/2/Uploads/557/]] -  [[Солитер в браузере]]
# [[Жизнь|http://10k.aneventapart.com/2/Uploads/667/]] - [[Жизнь в браузере]]
# [[Шахматы|http://10k.aneventapart.com/2/Uploads/571/]] - [[Шахматы в браузере]]
# [[Авиасимулятор|http://10k.aneventapart.com/2/Uploads/541/]] 
# [[Астросимулятор 3D|http://10k.aneventapart.com/2/Uploads/660/]]
# [[Пасьянс|http://10k.aneventapart.com/2/Uploads/559/]]
# [[Очко|http://10k.aneventapart.com/2/Uploads/621/]]
# [[Автосимулятор|http://10k.aneventapart.com/2/Uploads/655/]]
# [[Фотошоп|http://10k.aneventapart.com/2/Uploads/658/]]
# [[Змейка|http://10k.aneventapart.com/2/Uploads/554/]]
# [[Символы|http://10k.aneventapart.com/2/Uploads/558/]]
# [[Графики|http://10k.aneventapart.com/2/Uploads/528/]]
# [[Угадай новость|http://fiddle.jshell.net/BDbTG/1/show/]]
# [[Бродилка|http://tinysubversions.com/game/spelunky/]]
# [[Linux games|http://www.lgdb.org/]]


# http://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B0%D0%B9_%D0%9C%D0%B8%D1%80%D0%B0
# http://ru.wikipedia.org/wiki/Sky2Fly
# http://ru.wikipedia.org/wiki/Ace_Online
# http://ru.wikipedia.org/wiki/Fallen_Earth
# http://ru.wikipedia.org/wiki/Second_Life
# http://ru.wikipedia.org/wiki/Entropia_Universe
# http://ru.wikipedia.org/wiki/Perfect_World


Истерика запрета

«…Я хочу обратить внимание читателя на одну характерную особенность архаичного сознания - оно принципиально тоталитарно, оно жаждет кнута и „порядка“, а его носитель всегда стремится запретить другим людям то, что не нравится лично ему. Основание для запрета в основе своей глубоко деревенское - традиция, обычай, канон, норматив, догмат, мораль, Священное Писание, - а вовсе не трезвая логика.

Именно дураки, то есть особи с острой недостаточностью мышления, разделяют людей по второстепенным признакам.

Дурак искренне полагает, что именно его понимание правильности жизни является моральным. И больше ничье. Если кто-то выступает против знакомых дураку паттернов (моделей поведения), в его душе непроизвольно возникает праведный гнев, а изо рта начинают автоматически вываливаться слова „запретить“, „разврат“, „грех“, „никто так не делает“, „стыдно перед людьми“, „подумайте о детях“ и „это просто аморально“. Дурака всегда можно опознать по этим фразам-меткам, которые он сеет вокруг себя, как хомячок какашки.

А поскольку дурак убежден, что правда бывает одна-единственная, он агрессивно стремится навязать ее другим людям. Если же отдельные граждане дурацкую правду добровольно не приемлют, значит, нужно совершить над ними насилие, запретив поступать так, как им хочется. Ведь это же так просто: стоит только что-нибудь запретить, как все тут же чудесным образом наладится! Для этого нужен Надзиратель. Поэтому прямым следствием дурацкого взгляда на жизнь является потребность в сверхопеке и вытекающая отсюда безответственность. Человек в понимании дурака - это не отвечающее за себя создание, за которым нужен непременный присмотр. Роль Надсмотрщика может выполнять государство, царь-батюшка, господь-надзиратель или барин, который приедет и рассудит. И поскольку хозяин дурака всегда находится вне дурака, дурак никогда ни в чем не виноват.

Если такому человеку не нравится, скажем, проституция, он яростно выступает за ее запрет для всех - вне зависимости от их мнения… Проституцию нужно запретить, потому что это „аморально“… Ходить голым „аморально“… И тому подобное… Кому вы хотите запретить проституцию - тем, кто считает ее злом, или тем, кто так не считает? И почему одни люди должны запрещать другим людям то, что их непосредственно не касается? Есть же другой, вполне демократический, способ решения проблемы: если ты считаешь проституцию злом, не ходи в проститутки! Не покупай проститутку! Не занимайся сводничеством». Но, увы, мы уже знаем характерную черту традиционалистов - они всегда стремятся запретить «зло» не себе, а другим.

Второй характерный признак инфантильного сознания - вера во всемогущество запретов: «стоит только запретить что-либо и хорошенечко проконтролировать, как все и наладится!..».

Все бессмысленные и неудобные запреты, законы, правила, инструкции и положения людьми обходятся. И массовость этого обхода является лучшим индикатором бессмысленности запрета. Скажем, если процент нарушителей закона или неких правил составляет 95 %, значит КПД закона не превышает 5 % - закон работает против людей.

Запретите аборты - их будут делать подпольно. И государство вместо того, чтобы зарабатывать на этом (через налоги), будет расходовать бюджет на борьбу с этим явлением.

Запретите дышать - люди обзовут процесс дыхания «гипервентиляцией легких по медицинским показаниям», все обзаведутся справками от врача и будут не «дышать», а «гипервентилировать». И вы откроете грандиозный теневой рынок взяток.

Запретите людям пить водку, введите сухой закон - и, кроме подпольных ресторанов, вы взрастите спрута мафии. И снова государство вместо того, чтобы пополнять бюджет на алкогольном рынке (через акцизы и налоги), будет расходовать деньги на борьбу с бутлегерской мафией.

Умный человек понимает, что правд столько, сколько мнений. Поэтому, если ему лично не нравится, скажем, коррида, он просто не покупает на нее билет. А не бегает, как дурак, по улицам с плакатами против корриды.

Есть три демагогических способа попытаться запретить всем то, что не нравится некоторой части.

1) Объективизация запрета с помощью объявления запрещаемого явления аморальным либо наносящим вред детям.

На этот крючок еще Пушкина пытались поймать. Его перманентно корили за срамные матерные стихи: мол, а вы сами, Александр Сергеевич, хотели бы, чтобы эти произведения прочла ваша 15-летняя племянница?.. На это умный Пушкин отвечал примерно следующее:

— Существование на свете 15-летних племянниц никак не может послужить основанием для запрета срамных стихов. Потому что эти стихи предназначены не для 15-летних племянниц. А для взрослых людей.

2) Фантазирование. Приведение в качестве аргумента на ходу придуманных ситуаций, при которых явление могло бы нанести кому-то хоть какой-то вред.

3) Уговаривание. То есть попытка убедить оппонента, что никакая свобода ему на самом деле не нужна, он может без нее обойтись, потерпеть «ради всеобщего блага». «Возможно, вы лично и доросли до такой свободы, но народ еще не дорос. Вы же знаете наших людей…»

Давайте представим себе, что вы чего-то остро не любите и потому хотите это запретить не только себе, но и прочим людям, которые с вами не согласны. Как навязать им свою волю? Например, вы не любите бананы или, скажем, аморальность… Впрочем, почему «или»? Никаких «или»! То, что вы не любите, как раз и должно быть объявлено аморальным!.. Это один из приемов, он называется «объективизация запрета».

В самом деле, вкусовая позиция весьма уязвима - если вы не любите бананы, на одном только этом основании сложно добиться повсеместного запрета бананов. Потому что любой и каждый скажет вам: ну и не люби, я-то здесь при чем? Значит, вкусовую позицию нужно заменить объективной, то есть общей и для вас, и для вашего оппонента. Если вам это удастся, вы втащите оппонента на свое поле и одновременно уведете разговор в сторону.

Допустим, вам нужно запретить людям бегать по улицам. Первое, что напрашивается, так это сказать:

— Да вы что, наших людей не знаете? Им только дай, все будут носиться. Старушек начнут сбивать. Старушки же не могут бегать, как молодые. И реакция у них уже не та.

Действительно, не та…

— А повышенная скорость передвижения неминуемо увеличит вероятность столкновений пешеходов. Ну, представьте себе, идет бабушка из магазина. Вы же знаете, какие у пенсионеров пенсии?

Действительно, знаем…

— И вот она несет купленные яйца, например, или молоко в бидоне. А такой вот бегун ее сбивает. Ей даже новые яйца будет не на что купить! И это в лучшем случае, потому что в худшем она может получить перелом шейки бедра, а в таком возрасте — это смерть. Пожалейте людей! Неужели наши старики не заслужили…

Действительно, наши старики заслужили…

…Наконец, четвертый способ «аргументации» - разговор из серии «а почему бы вам не потерпеть?» Это самый слабый из способов, но тем не менее успешно работает. Его секрет в том, что он заставляет оправдываться не того, кто настаивает на ущемлении гражданских свобод, а того, кто протестует против запрета.

Очень просто. Например, вам нужно оправдать запрет на появление в публичных местах в одежде красного цвета, потому что вы ненавидите красный цвет и хотите встречать его как можно реже. Вам резонно возражают: то, во что одеваетесь не вы - не вашего ума дело. Вы уже использовали иные способы объективизации, например, аргумент о здоровье нации (у некоторых людей может быть идиосинкразия на этот цвет) и о социальном благополучии (красный цвет - это, как известно, цвет агрессии, а зачем провоцировать в обществе агрессию). Теперь вам нужно добить противника. Это как раз и можно сделать третьим способом - уговариванием.

— А вам так уж обязательно носить красное? Вы не можете поступиться своей прихотью ради здоровья людей, ради спокойствия на улицах? Что, разве нельзя выразить себя иначе? Неужели вы помрете, если не наденете красное? Вам обязательно дразнить общество? Бросать ему вызов?

И ведь действительно не помрете… Вас душат, но вам нечего сказать, чтобы не прослыть жутким эгоистом.

…Тот же аргумент в развернутом виде применительно к запрету взрослым людям бегать по улицам:

— Даже если в результате разрешения этого баловства погибнет хоть одна старая женщина из миллионов в течение ста лет, бег на улицах нужно запретить законодательно! Потому что чем измерить слезы родственников этой женщины? А если бы это была ваша мать?.. Да и зачем вам бегать по улицам, в самом деле? Мало ли, что вы этого хотите! Прихоть — не оправдание! Вам прихоть, а ей — смерть! Вы что, не можете просто пройтись по улице?.. Ах, вам может понадобиться пробежаться к отходящему автобусу! А зачем? Подождите следующий, автобус не последний. Куда спешить-то? Опаздываете? Ну так выходите из дому чуть раньше! Почему из-за вашей недисциплинированности и желания поспать подольше должны страдать люди? Если станете дисциплинированнее, вам же самому лучше будет!..

Вас имеют по полной, а вам вроде и ответить нечего. Кроме разве того, что эти подонки своей демагогией ущемляют вашу свободу.

Вы имеете право дышать, жить, зарабатывать, бегать по улицам, носить красное, белое и обтягивающее. Просто по праву рождения. Потому, что ваш интерес — ничуть не хуже интереса другого человека. И наплевать вам на чью-то аллергию к свободе!.."

Александр Никонов «Свобода от равенства и братства»,
[[Как восстановить grub UEFI в linux|http://noisee.ru/how2-reinstall-grub-uefi-in-linux/]]

{{{
// sda5 - корень моей файловой системы
sudo mount /dev/sda5 /mnt

// sda1 - раздел с efi
sudo mount /dev/sda1 /mnt/boot/efi

// примонтируем необходимые папки
for i in /dev /dev/pts /proc /sys; do sudo mount -B $i /mnt$i; done

// makes the network available after chrooting
sudo cp /etc/resolv.conf /mnt/etc/

// убедитесь, что модуль ядра загружен
modprobe efivars

// перейдём в среду
sudo chroot /mnt

// переустановим grub
apt-get install --reinstall grub-efi-amd64

// для 32х битных систем
apt-get install --reinstall grub-efi

//или так
grub-install

// обновим grub
update-grub

// отмонтируем все необходимые виртуальные устройства и папки
for i in /sys /proc /dev/pts /dev; do sudo umount /mnt$i; done

// обязательно отмонтируем раздел с EFI
sudo umount /mnt/boot/efi

// отмонтируем корень файловой системы
sudo umount /mnt

// перезагрузим систему
sudo reboot
}}}
«С понедельника начну новую жизнь, буду ходить в зал, заниматься будо, делать самомассаж, качать пресс…» — каждый из нас периодически ставит себе какие-то цели и не достигает их, переносит на следующий месяц, на несколько месяцев, на год. Не потому ли это происходит, что мы сразу хотим многого и планы наваливаются на нас тяжелым грузом, не давая в итоге сделать даже самую малость. Иногда мы рано начинаем выполнять задуманное, но прозанимавшись, к примеру, 3 раза в неделю в додзе по несколько часов, бросаем занятия на долгое время. Почему так происходит? Потому что нагрузка большая, потому что надоедает, а привычка еще не выработана.
!!!!! Методика Кайдзэн или принцип одной минуты
Существует японская методика «кайдзэн», в которую заложен принцип «одной минуты». Принцип этой методики состоит в том, что человек занимается определенным делом ровно одну минуту, но изо дня в день и в одно и то же время. Одна минута времени — это совсем мало, а значит легко выполнимо для любого человека. Лень не встанет на вашем пути. Те же самые действия, которые вы не хотели выполнять в течение получаса, придумывая отговорки или оправдания, вы с легкостью выполните за минуту.
Попрыгать на скакалке, покачать пресс, сделать гимнастику для глаз, выполнить камаэ, почитать книжку на иностранном языке — когда время ограничено одной минутой, занятия не кажутся вам трудно выполнимыми, а наоборот, приносят радость и удовлетворение. А делая маленькие шаги, вы совершенствуетесь и достигаете больших результатов.
Немаловажно то, что вы побеждаете неуверенность в своих силах, освобождаетесь от чувства вины и беспомощности, ощущаете успех и победу. Вдохновляясь чувством успеха, вы постепенно увеличиваете минутные занятия на пятиминутные и так далее. Потом незаметно подойдете и к получасовым занятиям. Прогресс налицо!
Кайдзен зародился в Японии. Само слово является составным, и включает в себя два других – «кай» (перемена) и «дзен» (мудрость). Считается, что кайдзен – это настоящая философия, которая может быть одинаково успешно применима и в бизнесе, и в личной жизни.
Людям западной культуры японская методика может показаться не эффективной, так как на Западе устоялось мнение, что без больших усилий хороших результатов не добиться. Но масштабные программы, отнимающие много сил, могут сломить человека и остаться безрезультатными. А принцип «кайдзэн» подойдет всем и может быть применим для многих сфер жизни. Японцы, например, используют стратегию постепенного и постоянного улучшения в сфере бизнеса.
Осталось только определиться с вашими потребностями и начать применение методики «кайдзэн» на практике.
!Точите ножи своим любимым
Как правильно и быстро наточить нож, чтобы тот был острым? Освещая тему заточки ножа на страницах оружейно-охотничьих изданий, одни авторы напустили так много туману, что превратили это занятие чуть ли не в священнодействие.
!!Острота лезвия
Если следовать их советам, то чего там только не требуется! Набор точильных брусков, набор оселков, специальные масла, доводочные пасты и так далее. А вдобавок ко всему нас стращают тем, что придется для достижения победы угробить на это ЧАСЫ (!) личного времени. Конечно, если у человека есть масса свободного времени, а он озаботил себя проблемой: на что бы его потратить, то лучшего времяпрепровождения и придумать трудно. Опять же какая-никакая, а тренировка для бицепсов. 
Другие авторы не поскупились на советы, следовать которым, безусловно, не стоит ввиду их (не побоюсь этого слова) анекдотичности. Опять же редко кто упускает возможность повесить моток-другой лапши на наши многострадальные уши, когда речь заходит об остроте лезвия. Тут вам и катана, воткнутая в ручей, натыкаясь на которую, листья плывут дальше по течению, разрезанные пополам. А другая катана (в фильме "Телохранитель") разрезает якобы не виртуальный платок из тончайшей ткани, брошенный на нее бестрепетной рукой Кевина Костнера. 
Тема заточки оказалась столь актуальной, что даже была отражена в устном народном творчестве. Помните старый добрый анекдот: "Приходит однажды добрый молодец чуть раньше положенного времени к своей подруге, у которой муж уехал в командировку. Стол накрыт, но еще не полностью. Туг подруга ему и говорит, мол, пока я стол накрываю, нечего без дела сидеть. Иди-ка ты, мил друг, на кухню да поточи мне ножи. Никаких проблем! Тот снимает пиджак, закатывает рукава у рубашки, идет на кухню. Быстро точит один нож, второй, третий... Внезапно движения бруска делаются все более медленными, а затем и вовсе останавливаются, поскольку в полове у гостя крутится-вертится интересная МЫСЛЬ: А КТО ЖЕ У МЕНЯ ЛОМА НОЖИ ТОЧИТ?" 
А что прикажете делать охотнику в лесу, рыбаку на рыбалке или туристу в походе, у которых нет под рукой домашней заточной мини-мастерской? Ответственно заявляю: если точильный брусок не забыт, то это минутное дело. Надо только соблюдать три правила инженера Посудина. Статья на эту тему была написана мною пять лет тому назад, но, будучи опубликованной лишь в каталоге выставки "Клинок-2001", она осталась практически неизвестной широкому кругу пользователей холодного оружия и так называемых режущих предметов хозяйственно-бытового назначения. Предлагаю ее вашему вниманию.
!!Технология "вострения"
В технологии заточки ножа достаточно много приемов, нюансов и тонкостей. Начну с направления движения по плоскости заточки того инструмента, которым производится заточка (точильного бруска, оселка, алмазного напильника). Это просто поразительно, но мои многолетние наблюдения показывают, что самым распространенным приемом заточки является тот, при котором точило перемещается по плоскости заточки ВДОЛЬ лезвия. Это совершенно неправильно! 
Возможно, этот способ и хорош, но пользоваться им для получения действительно острого лезвия можно только в 2-х случаях: 
Когда лезвие не точится, а лишь "направляется" (доводится) с помощью специальных брусков, арканзаса или индия. Суть этой правки (доводки) - снятие боковых заусенцев. Эти точила обладают настолько микроскопическим размером зерна, что направление их движения практически не имеет значения. 
2. Когда точатся кухонные ножи с помощью круглого специального напильника с продольными режущими кромками. Суть згой "заточки" - срезание упомянутым напильником тонких ленточек металла с обеих плоскостей заточки. 
Кстати, аналогичный процесс происходит при работе со специальным кухонным точилом. При этом срезание ленточек металла происходит одновременно с двух плоскостей заточки острыми краями двух твердосплавных эксцентрично расположенных дисков. 
А вот с обычными точилами мелкой, средней и уж тем более крупной зернистости такой номер не пройдет! Напомню о конечной цели заточки - получении действительно ОСТРОГО лезвия. Чтобы проще было понять, почему дело обстоит именно так, а не иначе, предложу вашему вниманию простенькую схему точения ножа, рассмотрев один из участков соприкосновения лезвия и точила под увеличением. 
Как вы видите, рабочая поверхность точила состоит из большого количества выступов и впадин, образованных зернами абразива. И при движении точила ВДОЛЬ лезвия большая часть выступов пойдет по плоскости заточки. Но при этом какая-то (пусть незначительная) их часть, увы, пойдет по острию (!!!) со всеми вытекающими из этого нехорошими последствиями. 
Вообще, строго говоря, существует и достаточно широко применяется еще один способ "вострения", при котором точило движется вдоль лезвия клинка, а именно: когда роль точила выполняет другой нож. Этим приемом умело пользуются мясники-профессионалы и обвальщики туш, у которых, как известно, каждая секунда на счету. Но опять же, строго говоря, в этом случае ни о какой заточке речи не идет. Движениями "лезвие по лезвию" добиваются лишь выправления режущей кромки и ее переориентации в плоскость симметрии клинка, поскольку съема металла здесь не происходит из-за равной твердости клинков. 
!!"Три правила инженера Посудина"
Что же касается заточки лезвия ножа, действительно гарантирующей его высокие режущие свойства, то прежде, чем перейти к описанию ее практических приемов, сделаю небольшое отступление в область теории. Согласитесь, голословные заявления и уверения мало чего стоят, и только лишь безупречно аргументированные, а посему доказательные советы и пожелания могут "браться на вооружение" и успешно применяться. Так вот, ту методику заточки, которую я практикую уже много-много лет, мои друзья-охотники шутливо именуют "тремя правилами инженера Посудина". В чем они заключаются? 
ПРАВИЛО ПЕРВОЕ. Рабочая поверхность точильного бруска ВСЕГДА должна располагаться по отношению к боковой поверхности грани клинка под углом 10-15 градусов. 
ПРАВИЛО ВТОРОЕ: Возвратно-поступательные движения точильного бруска ВСЕГДА должны быть ориентированы ПЕРПЕНДИКУЛЯРНО режущей кромке ножа. 
ПРАВИЛО ТРЕТЬЕ: ОДНОВРЕМЕННО с правильным наклоном (правило №1) и правильно ориентированными возвратно-поступательными движениями (правило №2) точильный брусок должен совершать медленное поступательное движение в направлении от крестовины ножа к его острию и обратно. Затем тот же самый проход от крестовины до острия и обратно повторяется на грани с другой стороны клинка. 
Этот цикл повторяется вплоть до окончания заточки лезвия. Вот и все! 
Острота лезвия периодически проверяется в процессе заточки. Если режущая кромка начинает цеплять кожу на подушечках пальцев, значит, желаемый результат достигнут. Даже можете попробовать им что-нибудь побрить. Не верите? Проверьте! 
В заключение приведу несколько примечаний, поясняющих, КАК и ПОЧЕМУ вы достигаете столь впечатляющего результата, неукоснительно следуя трем вышеупомянутым правилам. 
1. Выдерживая заданный угол (10-15 градусов) наклона точильного бруска по отношению к граням клинка, вы в итоге получаете общий угол заточки где-то в пределах 35-45 градусов, то есть как раз то, что требуется для охотничьих, рыболовных и туристических ножей. 
2. Затачивая лезвие поперечными по отношению к нему движениями, вы в итоге получаете на нем как бы микропилу, "шаг зубьев" которой будет соразмерен габаритам зерен абразива, примененного при изготовлении вашего точильного бруска. Прибегая к модной и популярной ныне терминологии, вы получаете на лезвии своего рода микросерейторную заточку, которую невозможно увидеть невооруженным глазом. 
3. Проходя по лезвию дважды и поочередно с каждой стороны, вы практически ликвидируете заусенец, дробя его на мельчайшие элементы и одновременно ориентируя эти элементы в направлении плоскости симметрии клинка. 
4. Если лезвие сильно запущено или вами приобретен новый дурно заточенный ножик, то в начале процесса заточки усилие прижатия точильного бруска к клинку должно быть достаточно сильным. И лишь потом, по мере того, как требуемый угол заточки будет "вытанцовываться", это усилие следует уменьшать. К моменту завершения заточки оно должно быть минимальным. Это следует делать еще и потому, что чем слабее вы будете прижимать точильный брусок к клинку, тем на меньшую глубину будут врезаться в металл зерна абразива. Следовательно, есть все шансы получить на лезвии более мелкозубую "пилу". Такое лезвие будет, безусловно, более острым, нежели крупнозубое. 
5. Еще раз подчеркну такой ВАЖНЫЙ МОМЕНТ, заключающийся в том, что выдерживание нужного угла наклона точила и оба его движения должны выполняться ОДНОВРЕМЕННО! Только в этом случае ваш успех гарантирован!
!!Доводка лезвия
Доводка лезвия позволяет сделать уже остро наточенный нож еще более острым. Операция эта выполняется с помощью ремня (кожаного, плетеного из х/б нити), на рабочую поверхность которого нанесена доводочная или полировальная паста. Замечу, что особо выдающихся результатов позволяет добиться алмазная паста. При доводке лезвия ножа тоже существуют "три правила инженера Посудина", которых следует придерживаться. 
ПРАВИЛО ПЕРВОЕ: боковая наклонная плоскость клинка (грань) должна накладываться на доводочный ремень равномерно ВСЕЙ плоскостью, то есть БЕЗ НАКЛОНА, а ремень следует натягивать как можно сильнее. 
ПРАВИЛО ВТОРОЕ: клинок по отношению к ремню должен располагаться таким образом, чтобы контактирующая с рабочей поверхностью ремня часть режущей кромки была ПЕРПЕНДИКУЛЯРНА направлению движений клинка (от себя и к себе) по ремню. 
ПРАВИЛО ТРЕТЬЕ: при поочередных движениях клинка по доводочному ремню (от себя и к себе) режущая кромка лезвия всегда должна смотреть в сторону. ПРОТИВОПОЛОЖНУЮ направлению движения клинка. 
Несколько примечаний, поясняющих то, чего вы добиваетесь, руководствуясь упомянутыми тремя правилами доводки. 
С силой натягивая доводочный ремень и прижимая к нему всю плоскость боковой грани, вы АВТОМАТИЧЕСКИ добиваетесь того, что рабочая поверхность ремня с равномерным усилием прилегания будет перемещаться по плоскости заточки (а теперь по плоскости доводки) лезвия. При этом так же АВТОМАТИЧЕСКИ будет выдерживаться ТОТ ЖЕ САМЫЙ УГОЛ (10-15 градусов) плоскости доводки по отношению к боковой грани клинка. А произойдет это потому, что именно почти на такой угол все равно прогнется ремень, сколь бы сильно вы его не натягивали. Пожалуй, в этом и заключается самая главная тонкость при доводке! 
А теперь представим, что вы накладываете клинок на ремень не плоскостью грани, а плоскостью доводки и, вдобавок, натягиваете ремень с незначительным усилием, из-за чего он сильно прогнется. Ежу понятно, что при этом будет иметь место уже не доводка, а УМЫШЛЕННОЕ ПРИТУПЛЕНИЕ лезвия. 
2. Второе и третье правила доводки, я думаю, в комментариях не нуждаются, так как аналогия со всем тем, что происходит при заточке, полная. А вот поскольку габариты зерен абразивной пасты, нанесенной на ремень, гораздо меньше габаритов зерен абразива точильного бруска, то в конечном итоге каждый "зуб" на режущей кромке после доводки приобретет уже следующий вид. 
Господа любознательные! Вам этот рисунок ничего не напоминает? Конечно, ответите вы. Именно такую форму имеют ЗУБЫ БЕЛОЙ АКУЛЫ (КАРХОРОДОНА) - самого страшного и кровожадного из морских созданий! А уж каковы в работе эти зубки, я думаю, можно не описывать. Все смотрели "Челюсти". 
Ослаблять натяжение ремня и располагать режущую кромку клинка под углом к направлению его движения, отличном от 90 градусов, не следует еще и потому, что, стоит вам лишь на мгновенье пренебречь этим правилом (да еще, не дай бог, при гибком клинке), как вы мгновенно перережете доводочный ремень. И это в лучшем случае. А в худшем нож полоснет по руке, натягивающей ремень. Так что не рискуйте. 
3. Усилие прижатия клинка к ремню должно в процессе доводки уменьшаться и постепенно "сходить на нет" к ее концу. 
Вот и все! Пожалуйте бриться! Доведенное таким образом лезвие ножа способно без всяких усилий снимать двухмиллиметровую "соломку" с обычного листа писчей бумаги, удерживаемого на весу. Не верите? Проверьте! 
Друзья мои охотники, рыбаки, туристы и просто любители холодного оружия! Всем вам хорошо известно, что в любом деле есть такой важнейший момент, который именуется правила техники безопасности. Должен вам сказать, что они существуют не только для владельца, но и для ножа.
!!Правила техники безопасности (для владельца)
Эти правила во все времена писались, пишутся и будут писаться КРОВЬЮ тех, кто ими пренебрегал! А уж в нашем случае тем более. И если пренебречь несколькими простыми, но очень важными правилами, СТРАШНАЯ РЕЗАНАЯ РАНА НА РУКЕ ВАМ ГАРАНТИРОВАНА! Поэтому... 
1. При заточке и доводке ножа будьте предельно внимательны и сосредоточены. 
2. Исключите полностью из своих движений элементы нерасчетливости, торопливости и нетерпения. 
3. Не берите в руки нож и брусок, будучи в нетрезвом виде. 
4. Не пользуйтесь старыми, сильно сработавшимися в средней части точильными брусками или брусками, прочность которых вызывает у вас сомнение. 
5. Не отвлекайтесь: не отводите своего внимательного взгляда от зоны соприкосновения точила и клинка. 
6. Не беритесь за заточку озябшими или замерзшими руками. В этих случаях подвижность суставов пальцев, увы, ограничена и сами пальцы, увы, уже не такие гибкие. Это резко повышает вероятность возможного пореза руки. 
7. Не держите затачиваемый нож на весу! Такие "фокусы" (да и то с опаской) могут себе позволить только настоящие профи. "Чайникам" следует класть нож на какую-нибудь плоскость (например, на угол стола) или упирать во что-то острием (например, в ствол дерева) и придерживать левой рукой, обеспечивая тем самым его надежную фиксацию. А уж "лихая хватка" ножа и точильного бруска при первых робких опытах по заточке вам совершенно противопоказана. Под "лихой хваткой" подразумевается та, при которой нож удерживается за рукоятку левой рукой в вертикальном положении острием вверх, а точильный брусок зажимается за торны подушечками большого и среднего пальцев правой руки. 
8. Не применяйте при заточке ножа суперусилий, поскольку от этого даже новый брусок может сломаться. 
9. Ограничивайте амплитуду движений точильного бруска таким образом, чтобы он не мог "соскочить" с плоскости заточки клинка, и рука, удерживающая брусок. НЕ КОСНУЛАСЬ лезвия. 
ПРИМЕЧАНИЕ: Когда деду моему, Матвею Егоровичу Королеву, исполнилось шестьдесят лет, то у новоиспеченного пенсионера в буйной шевелюре не было НИ ОДНОГО СЕДОГО ВОЛОСА, хотя в жизни ему довелось пережить всякого. Из девяти детей один умер в детстве, двоих забрала война. Остальных он вырастил и "поставил на ноги". Так вот, седины не было, а сердечко после шестидесяти на счетчике, увы, стало пошаливать. Дед к врачам практически почти не ходил, а тут ему пришлось изменить своему правилу. Врач в сельской больнице осмотрел его и вынес деду следующий приговор: - Матвей Егорович! Вам уже седьмой десяток пошел. Все у вас нормально. Вот только выпивать вам надо ПОМЕНЬШЕ (врач выдержал паузу). НО ПОЧАЩЕ!" Деда такие слова привели в совершенный восторг, и далее в течение почти четверти века всякий раз, когда в его руке оказывалась стопка (по поводу и без повода), он непременно произносил вслух совет того врача. 
Так вот дедов принцип "поменьше, но почаще" относительно правил 8 и 9, более чем уместен. 
И, наконец, самое главное общее правило: ОСТРЫЙ НОЖ - ШТУКА ОЧЕНЬ ОПАСНАЯ! Доказательством этого может служить такой исторический факт, что классическая складная бритва так и называется: ОПАСНАЯ БРИТВА!
!!Правила техники безопасности (для ножа)
Эксплуатируя свой любимый ножик, следует заботиться не только о своих пальцах, но и о нем, любимом, тоже. К вещам, которые вам служат верой и правдой долгие годы, привыкаешь. Именно поэтому всякого рода досадные оказии, случающиеся иногда с любимыми вещами, служат поводом для расстройства. Чтобы такого не случалось с вашим ножом, запомните несколько правил: 
1. Не следует мешать ножом чай (кофе) в стакане или чашке. Вид напитка, его температура и вид сосуда никакого значения не имеют. Важно лишь то, что стекло и эмаль, покрывающая посуду, имеют твердость, превосходящую твердость клинка вашего любимца. Поэтому от ударов по внутренним частям стенок режущая кромка тупится просто великолепно. 
2. Не следует резать ножом закуску непосредственно на тарелке. Почему? Смотри п.1. Для этого есть специальная деревянная доска. Если вдруг приспичило заняться этим где-то в угодьях, то закусь можно (и нужно) резать на весу. 
3. Не используйте свой нож в качестве средства для открывания консервных банок. Чтобы успешно избегать этого соблазна, следует приобрести многофункциональный инструмент-раскладушку. Этот инструмент служит десятилетиями и в сложных ситуациях всегда играет роль палочки-выручалочки. Поэтому, прежде чем делать шаг из дома, надо всегда повесить чехол с раскладушкой на пояс. 
4. Не участвуйте в соревнованиях на самый твердый нож. Что греха таить, в состоянии легкого подпития (да и тяжелого тоже) такие споры-соревнования на охоте возникают достаточно часто. Самые тупорылые (я хотел сказать, необразованные) спорщики ударяют ножи друг об друга РЕЖУЩИМИ КРОМКАМИ. Бедняги не знают, что в зоне контакта при этом возникают усилия сжатия, достигающие ДЕСЯТКОВ ТЫСЯЧ (это не оговорка) ТОНН!!! А потом тупо и уныло смотрят на дело своих рук и мозгов. Но, если уж совершенно невтерпеж и устоять перед соблазном показа превосходства своего ножа невозможно, то поступите следующим образом. Возьмите свой нож за лезвие (как карандаш) острием вниз и попробуйте нацарапать на боковой поверхности лезвия уложенного на стол ножа-соперника либо имя его владельца, либо другое короткое слово из трех букв, не более. Если вам это удастся, значит, ваш клинок крепче. Если же острие вашего ножа будет скользить по лезвию другого, не оставляя на нем никаких следов, значит, вы проиграли. Обычно для чистоты эксперимента ножи меняют местами, но, как вы понимаете, на результат поединка эта рокировка никак не влияет. 
5. Не используйте свой нож в качестве оружия для метания. У всех ножей с всадным череном есть одно слабое место (под передней частью крестовины). Именно там широкая часть пяты клинка переходит в узкий хвостовик. Согласно законам сопромата там ВСЕГДА имеет место быть концентрация напряжений. При статических нагрузках это совершенно не страшно. А вот при кратковременных динамических воздействиях - другое дело. И вероятность того, что после вашего броска ножом в дерево вы найдете под ним ДВЕ ПОЛОВИНКИ того, что секундой раньше представляло единое целое, чрезвычайно высока! Поэтому берегите свой нож, и он долгие годы будет служить вам верой и правдой!
!!Советы старого точильщика
Чем точить ножи? Специально для небольшой категории неуверенных в себе или просто ленивых владельцев ножей придуманы и продаются всевозможные приспособления и оснастка для заточки ножей. Вот наиболее типичные и распространенные из них: 
1. "Точилки" со смещенными твердосплавными дисками, уже упоминавшиеся мною. 
2. Приспособления, в которых клинок ножа фиксируется специальной струбциной, а точильный камень зажимается в специальную оправку. Он движется строго под определенным углом по отношению к грани клинка с помощью длинной направляющей, проходящей через определенное отверстие в вертикальной стойке. Такие приспособления обычно комплектуются набором точильных камней разной зернистости. 
3. Еще один вид приспособлений для заточки (это последний писк) представляет собой массивное основание, в которое вставлены два равнонаклоненных круглых в сечении керамических бруска, образующих в итоге что-то вроде буквы "V". Точение производится движениями (с потягом) сверху вниз поочередно по каждой из внутренних частей точильных брусков, вставленных в основание. 
Вне всяких сомнений, эти приспособления имеют свои преимущества. Но все они обладают одним общим существенным недостатком: ни в лес, ни на озеро, ни в саванну эти приспособления НЕ БЕРУТСЯ. А точильный брусок - запросто! Он просто обязан получить "постоянную прописку" в определенном кармане вашего любимого рюкзака или ваших любимых штанов (особенно подходит для этого узкий длинный карман на правом бедре).
!!Несколько слов о точильных брусках
На первое место, безусловно, следует поставить алмазные бруски. Такое точило представляет собой плоский узкий параллелепипед из алюминиевого сплава, на две противоположные стороны которого нанесен слой, содержащий зерна искусственного алмаза. На одной стороне зерна крупные, на другой - мелкие. В работе такой брусок просто бесподобен, да и стоит он не очень дорого. Таким точилом можно быстро наточить клинок ЛЮБОЙ твердости, поскольку твердость алмаза по шкале Мооса составляет 10 единиц! Это, как известно, самый твердый материал на Земле. 
На второе место с полным на это правом претендуют точильные керамические искусственные бруски, производимые знаменитой фирмой "Спайдер ко". Они так же хороши, как и производимые этой фирмой складные ножи. Главным достоинством точил "Спайдер ко" является их легкость, тонкость прочность и отличные рабочие качества. Недостаток только один - цена. Чуть не забыл упомянуть еще одно достоинство этих точил: великолепную износостойкость. 
Третье место следует отдать точилам, изготовленным из корунда. Если где-нибудь на периферии вдруг возникнут проблемы с покупкой алмазных или заграничных керамических точил, то не надо отчаиваться! Корунд, как и алмаз, очень твердый материал с твердостью по шкале уже упоминавшегося выше Мооса, составляющей 9 единиц. Его ювелирные разновидности (рубин, сапфир) давно и успешно применяются в производстве украшений. Что же касается точил из корунда, то их рабочие качества выше всяческих похвал при совершенно незначительной цене. Точат они не хуже алмазных. От других брусков корундовые отличаются характерным оранжево-кирпичным цветом. 
Все другие точила не могут сравниться с упомянутыми выше, но также могут использоваться для заточки. Только вот потеть придется гораздо дольше. 
На чем доводить ножи? В магазинах можно купить специальное приспособление, предназначенное для доводки опасных бритв, представляющее собой раму, на которую натянуто кожаное полотно. На кожу наносится слой доводочной пасты и вперед! Правда, в угодья это приспособление с собой тоже не возьмешь. Каков же выход? Охотники, гораздые на выдумки, придумали следующие приспособления. В качестве доводочной поверхности они предлагают использовать следующие предметы охотничьей экипировки: 
1. Ремень-погон для оружия (особенно хорошо подходит для этого дела брезентовый ремень). 
2. Брючный ремень. 
3. Брезентовую полосу, нашиваемую на левую штанину в районе передней части бедра. Замечу, что это довольно опасная штука и этим "играются" лишь истинные профессионалы. То есть эта придумка не рекомендуется для широкого использования. 
Слой доводочной пасты (например, пасты ГОИ) наносится на поверхность этих предметов. У погона для этого используется наружная поверхность. Пасту наносят не сплошь, а пятнами, отчего ремень приобретает камуфляжный вид. У брючного ремня рабочей является поверхность, прилегающая к брюкам. Как работают с этой "оснасткой". Все очень просто. Первые два ремня следует перекинуть через прочный горизонтальный сук и натягивать, удерживая левой рукой концы ремня. Когда же для доводки любимого ножа приспособлены не менее любимые штаны, то для принятия правильной боевой позы следует сесть на пень, выдвинуть левое колено вперед, а пятку левой ноги максимально придвинуть к пню. Левой рукой следует ухватить штанину в районе верхней части бедра и натянуть ее. В этом случае полоса брезента будет плотно прилегать к бедру и доводка станет относительно безопасной.
!!Заточка эксклюзивных клинков
Предположим, что клинок вашего ножа имеет эксклюзивное исполнение (сделан из мозаичного Дамаска, имеет тонкую гравировку или, наконец, просто замечательно отполирован). Предположим, также, что вы пока еще, увы, совершенный "чайник" в вопросах заточки, а потому не в состоянии четко и безошибочно контролировать абсолютно все свои движения. Тогда вам есть прямой смысл подстраховаться. Оклейте лезвие ножа полосками поливинилхлоридной изоляционной ленты (в два слоя), оставив открытой лишь полоску вдоль режущей кромки шириной 5 мм. Таким образом, вы предохраните своего красавчика от нечаянного повреждения точилом. Впоследствии, когда вы овладеете навыками заточки, эта операция станет ненужной.
!!С чего начать?
Решив овладеть наукой (ремеслом, мастерством) заточки не проводите первые опыты и эксперименты со своим любимым ножом. Дело в том, что на кухне, где хозяйничает ваша жена (подруга), всегда имеется достаточное количество ножей, которые ждут не дождутся, чтобы их кто-нибудь поточил. С кухонных ножей и начните. Экспериментируйте и оттачивайте свое мастерство. Кстати, материал лезвий кухонных ножей не столь твердый, как материал ножей охотничьих. Поэтому точить их, ОДНОВРЕМЕННО выполняя три правила, одно сплошное удовольствие. И вскоре, уверяю вас, станете мастером. Удачи вам!
P.S. Друзья мои охотники, рыболовы, туристы и просто любители поточить ножи (на чужой кухне)! Вам когда-нибудь доводилось наблюдать за работой профессионального точильщика? Сейчас такое зрелище, безусловно, большая редкость. Обычно это был мужичок в брезентовом фартуке, стоящий за элементарным и примитивным станком, наждачный круг на котором приводился в движение с помощью мускульной силы его ноги. В старые добрые времена такие умельцы ходили по тогда еще оживленным деревням или стояли у входов на большие городские рынки и оглашали окрестности зычными криками: "НОЖИ, НОЖНИЦЫ, ТОПОРЫ ТОЧИМ!". 
Глядя на манеру работы такого мастера, всегда можно было увидеть, что при заточке ножа или топора он постоянно придерживается трех правил, а именно: 
1. Грань клинка в его руках всегда наклонена на 10-15 градусов по отношению к линии, являющейся касательной к вращающейся (рабочей) цилиндрической поверхности наждака. 
2. Линия режущей кромки в зоне заточки всегда перпендикулярна направлению перемещения зерен абразива наждака. 
3. Клинок медленно перемещается по наждаку от начала режущей кромки лезвия до ее конца и обратно. Затем все повторяется с другой стороны лезвия. Вам это ничего не напоминает? 
А. Посудин 
"Российская Охотничья газета № 39,40,41 - 2005 г."




Прежде, чем приступить к разъяснениям, касающимся непосредственно заточки ножей, необходимо знать следующее:
! Какие ножи нельзя точить
Например, в ножах TwinStar Plus фирмы Zwilling J.A. Henckels используется покрытие MagnaDur ®, которое в 1000 раз повышает износостойкость режущей кромки. Естественно, после заточки никакого твердого слоя не остается.
! Керамические лезвия
никогда не тупятся, поэтому никогда не точатся. Единствнным недостатком керамического лезвия является его повышенная хрупкость, хотя некоторые вещества (например, оксид циркония) имеют некоторую гибкость. По твердости керамические лезвия уступают только корунду и алмазу.
! Зубчатая режущая кромка
приобрела популярность по двум причинам: внедрение твердых износостойких сталей (типа 440C) и появление автоматов для сложной заточки с лазерным контролем. Однако именно это затрудняет переточку ножа в домашних условиях. Хороший ‘серрейтор’ сделан из твердой стали, которую трудно точить, а переточка с двух сторон уничтожает зубчатую кромку.
! И еще нужно знать следующее:
#Не существует «вечных самозатачивающихся» ножей. Это просто рекламная фишка. Если нож постоянно использовать, то он рано или поздно он затупится, и надо будет его наточить, чтобы и далее работать им удобно и безопасно.
#Нет никакой лазерной заточки. Ножи точатся на фрезерном станке, и лазер там используется лишь для контроля угла заточки.
#Секрет «дамасской» стали давно утерян. Современные методики изготовления могут сделать нож очень прочным и твёрдым, но есть производители, которые наносят специфический рисунок «под дамасск» на дешёвые лезвия.
#При заточке нож должен быть чистым и сухим.

А теперь — наблюдение из жизни: подавляющее большинство пользователей свои ножи точить не умеют и чужие — тоже, и поэтому все довольствуются в лучшем случае полуострыми, кое-как заточенными ножами. Давайте убедимся вместе! Попробуйте разрезать лист обычной писчей бумаги любым ножом, держа его другой рукой за один угол. Не вышло? Все ясно, значит этот нож просто не очень острый, мягко говоря.
Так почему нож тупится при резке? В этом принимают участие два параллельных процесса. Первый — это отрывание микроскопических частичек стали от лезвия под действием силы трения. Проще говоря, лезвие стирается.
Сталь клинка, конечно, намного тверже, чем большинство разрезаемых ножом материалов, поэтому она стирается намного медленней, в конце концов ведь дерево режут сталью, а не сталь деревом. Но все-таки понемногу стирается и сталь. Особенно там, где на нее приходится наибольшая удельная нагрузка — на самом краю лезвия, на его передней, режущей, кромке. Подчеркиваю, этот процесс происходит на микроуровне, поэтому и результаты его — микроскопические.
Невооруженным глазом их не видно, и о затуплении ножа можно только догадываться по плавно возрастающему усилию, необходимому для резки. Но если бы только так наш нож тупился — очень редко нам пришлось бы его точить. Беда в том, что при резке практически невозможно удерживать лезвие все время так, чтобы оно «атаковало» разрезаемый материал строго в направлении своей плоскости симметрии.
Первое, с чем надо примириться, это расход нескольких десятков долларов на порядочные инструменты для заточки. Особенно если вы имеете несколько ножей или, тем более, целую их коллекцию. Истратить сотни долларов на сами ножи и пожалеть десятки на хороший инструмент для заточки — это уж очень напоминает народную мудрость о пресловутом «экономном», который, как известно, дважды платит…
 Второе — примириться с тем, что никто не наточит нож так, как сделает это сам его хозяин при соответствующем уровне подготовки, и пользуясь соответствующими инструментами, конечно. А вот то, что не надо точить нож на высокооборотном шлифовальном кругу — это уже не дело вкуса! Каждая сталь закаляется в определенных температурных условиях. Неконтролируемый нагрев во время заточки на шлифовальном круге, скорее всего, испортит клинок необратимо.
 Мочить нож во время заточки — ничего не меняет, тоненькая ленточка стали на самом-самом острие перегревается моментально! Да, производители точат ножи механически, на шлифовальных ремнях. Но, во-первых, они делают это с умом, на заточке сидят обычно самые квалифицированные рабочие. Во-вторых, подают эти ремни с малой скоростью. А главное, стоит обратить внимание, как недолго держится фабричная заточка, хотя в самом начале нож действительно режет как бритва.
! «Правка» ножа
Если недавно купленный или недавно заточенный нож потерял былую остроту, то режущую кромку можно подправить с помощью мусата или на тонком точильном камне. Это можно сделать несколько раз, затем всё равно придётся его капитально точить.
Мусат — это стержень, сделанный из очень твердой стали, или из обычной стали но с напылением алмазного покрытия или вообще из керамики. Стальной мусат напоминает круглый напильник с бороздками осевого направления. Во время правки надо вести по мусату режущей кромкой ножа от себя, плавно сдвигая нож от рукоятки к острию.
Заточка ножа Не рекомендуется пользоваться специальными точилками, поскольку их угол заточки может не совпадать с изначальным углом клинка, а движение происходит вдоль лезвия, создавая продольные бороздки.
Также нельзя точить нож на высокооборотном шлифовальном кругу. 
И, наконец, на наждачной бумаге стоит точить только в крайнем случае.
Заточить нож лучше всего на точильном камне (бруске).
Точильные камни и бруски имеют разную степень зернистости:
 грубые используются для восстановления правильного угла заточки и формы режущей кромки; средние используются для заточки как таковой; тонкие используются для чистовой правки ножа. Чем больше размер бруска, тем легче поддерживать правильный угол заточки. Наиболее удобно, когда длина бруска составляет полторы-две длины клинка. Ширина бруска играет второстепенную роль. На широком бруске удобней работать и меньше вероятность «упустить» клинок за пределы бруска, что может повредить его боковую поверхность или лезвие. Двухдюймовой (5 см) ширины брусок был бы в самый раз. Алмазный может быть немножко короче, потому что шлифует быстрей и эффективней, но чтобы освоить правильно основное движение, лучше всего учиться да длинном бруске. Сам брусок лучше положить на специальную подкладку, чтобы он не скользил и не царапал стол.
Во время заточки нож ведут по бруску так, чтобы лезвие всегда двигалось по бруску в направлении перпендикулярном режущей кромке в месте соприкосновения (ни в коем случае не вдоль) режущей кромкой вперед, одновременно сдвигая кромку от рукоятки к острию.
Очень важно поддерживать постоянный угол заточки (оптимально — по 20 градусов в каждую сторону от оси клинка). Контроль постоянного угла можно производить с помощью фломастера: закрасьте им режущую кромку и после нескольких циклов точки оцените состояние краски — если она снимается не равномерно, то это приведет к «заваливанию» режущей кромки. Если заточка ножа идет равномерно, необходимо продолжать, но при этом не забывать точить попеременно обе стороны.
Итак, устанавливаем лезвие под углом 20 градусов к поверхности бруска и ведем по нему лезвием вперед, постепенно перемещая точку соприкосновения в направлении острия. Так, чтобы когда дойдем до конца бруска, как раз одновременно дойти до острия.
 В конце прохода острие должно остаться на рабочей поверхности бруска, ни в коем случае нельзя допустить, чтобы клинок с него сорвался. Срыв поцарапает боковую поверхность клинка.
Чтобы удержать постоянный угол заточки, придется немного приподнимать рукоять над столом, и даже в месте, где лезвие имеет дугообразную форму, его «брюшка». Иначе на «брюшке» угол заточки окажется более острый.
При достижении острия, клинок надо вернуть на исходную позицию и повторять это основное движение много-много раз, сохраняя угол заточки постоянным. Важно всегда вести клинок по бруску лезвием вперед.
Не надо стараться ускорить работу, сильнее нажимая на брусок. При нажатии сильнее теряется точность, с которой надо удерживать угол заточки и это, скорее всего, сведет все усилия на нет.
Шлифуем до тех пор, пока на его обратной стороне не появится явно чувствующийся заусенец по всей длине лезвия.
Не надо пробовать ускорить работу, шлифуя только те участки, где заусенец еще не появился. Таким образом выпрофилированная режущая кромка не будет совпадать с плоскостью симметрии клинка, будет хуже резать, а затупится быстрее.
Равномерно, плавными движениями шлифовать лезвие, пока на всей его длине не появится непрерывный заусенец.
После заточки на среднем камне режущую кромку хорошо бы поправить на тонком камне — это делает лезвие более ровным и заточку более долговечной.
Вот в принципе и всё. И напоследок — важный совет:
Никогда нельзя проверять качество заточки руками. Даже при неглубоком порезе микроскопические металлические опилки, попавшие в порез, не дадут ране быстро зажить. Лучше взять лист бумаги вертикально одной рукой и попробовать его разрезать на весу. Остро заточенный нож легко справится с этой задачей, какого бы размера он ни был.






[[Как точить ножи|http://manual.ru/articles/Как_точить_ножи]]
[[Видео|http://www.youtube.com/watch?v=J0K7B2_Bmnw]]
[[Три правила инженера Посудина|http://www.kaliningrad-fishing.ru/rog/pr-05-1/rpres-0237.html]]
[[Правельное видео|http://www.youtube.com/watch?v=AUD_i8JBH9I]]
[[ Точилка для ножей даром или Лански - в Бобруйск!|http://forum.guns.ru/forum/97/211055.html]]
[[Самодельный sharpmaker за пол-часа|http://forum.zadi.ru/viewtopic.php?f=46&t=169]]
<<calendar>>
"Хуй" - карточная игра.

Возможно где-то она известна под другим названием. Играют в "Хуя" колодой состоящий из 24 карт ( от 9ки до туза ) В игре может принимать участие то количество игроков, на которое можно разделить 24, чтобы карт у всех было поровну ( но если не подерётесь это правило можно упустить ) Все карты раздаются на руки игрокам. Первой скидывается 9ка бубен, соответственно ходит тот у кого она оказалась. Следующий ( сидящий, стоящий или лежащий за ним по часовой стрелке ) должен скинуть либо такую же по значению карту т.е 9ку либо выше 10;В;Д;К;Т, ( масти карт при этом не учитываются ), за ним следующий и т.д. Пока у игрока, чья очередь ходить, не окажется нужной по значению карты или по каким либо причинам он не захочет её скидывать -  в этом случае он должен сверху колоды ( образовавшейся из скинутых карт ) взять три карты и пропустить ход, при этом 9ка бубен всегда остаётся на столе ( или на чём там вы собираетесь играть ), и если сверху неё лежат одна или две карты - игрок берёт только их. Если у игрока на руках имеется четыре одинаковые карты, например четыре вольта, он может скидывать их за один ход, также на 9 бубен можно кидать три оставшееся 9ки. Цель игры - первее других избавиться от карт, у кого они остаются тому пишется буква из названия игры. Кто соберет все три буквы тот проиграл.
КНИГИ
#«Маленький принц» Антуана де Сент-Экзюпери
#«Айвенго» Вальтера Скотта
#«Фауст» Гете
#«Божественная комедия» Данте Алигьери
#«Старик с крыльями» Габриэля Гарсиа Маркеса, 
#«Чужая боль» Сергея Лукьяненко 
#«Алхимик» Пауло Коэльо
#[[Книги Харуки Мураками|Харуки Мураками]]
#[[Руководство полного идиота по программированию (на языке Си)|http://lib.ru/CTOTOR/starterkit.txt]]
Да зачем вообще нужна база на луне?

Только лишь за тем что на ней можно разместить основной главный и единственный межпланетный космопорт земли, там можно строить межпланетные и межзвёздные корабли, и собственно с луны и запускать все экспедиции, потому что для запуска экспедиций с луны нужно потратить на несколько порядков меньше топлива чем на запуск с поверхности земли. 

Энергию, материалы, воздух, воду, продовольствие, топливо, всё это можно добывать на самой луне или кометах, которые можно отлавливать, пригонять на орбиту луны и разделывать там.  

Конечно же на этапе строительства базы на луну придётся доставлять очень много материалов, технологии, оборудования, продовольствия, воды, воздуха и людей, но этот этап очень быстро пройдёт как только база выйдет на самообеспечение, продовольствием, воздухом и главное оборудованием, перерабатывая минералы найденые на поверхности или под поверхностью луны.  

Единственное условие развития такого сценария это регулярные рейсы земля-луна, скажем раз в месяц,  для перевозки людей и товаров как на луну так и на землю.

И в качестве варианта организации дешёвых рейсов можно использовать [[Космический фонтан|http://habrahabr.ru/post/235605/]]
<<miniBrowser noplayer http://10k.aneventapart.com/2/Uploads/607/>>
Мантра от лени:
ОМ ХРИМ ШРИМ КРИМ ПАРАМЕШВАРИ КАЛИКЕ КРИМ ШРИМ КРИМ СВАХА
ОМ ХРИМ ШРИМ КРИМ ПАРАМЕШВАРИ КАЛИКЕ КРИМ ШРИМ ХРИМ СВАХА










ОМ АХ ХУМ СО ХА
Это мощная мантра, очищающая моментально, и вы можете визуализировать, как все предметы в вашей комнате очищаются, когда вы окуриваете их благовонием. Просто повторяйте мантру 108 раз в такт дыхания, делая резкий  выдох на последнем слоге ХА.  Эту мантру распевают все буддисты, когда совершают подношения Будде на домашнем алтаре или в святилище, а также перед приемом пищи.


•    Сарасвати- покровительница знания.
OМ АЙМ САРАСВАТЬЕ НАМАХ - АУМ


•    Мантра для усвоения знаний
ОМ ШРИ САРАСВАТЬЯ НАМАХ


•    Кали- устраняющая неведение,которое заставляет нас испытывать страх перед смертью. (Для вхождения в некрослой)
OМ КРИМ КАЛИКАЙЕ НАМАХ - АУМ


•    Энерго мантра: Дурга I- Единая Божественная энергия, разрушитель зла.
АУМ АЙМ ХРИМ КЛИМ ЧАМУНДАЙЕ ВИЧЧЕЙ НАМАХ - АУМ


•    Дурга II- Единая Божественная энергия, разрушитель зла.
АУМ ДУМ ДУРГАЙЕ НАМАХ- АУМ


•    Маха Майя- приносящая энергию.
АУМ ХРИМ НАМАХ -АУМ


•    Маха Лакшми- приносящая энергию, процветание и гармонию.
АУМ ШРИМ ХРИМ КЛИМ МАХА ЛАКШМАЙЕ НАМАХ - АУМ


•    Мантра Гайатри- мантра для всех целей.(также про неё много чего написано ТУТ)
ОМ БХУР-БХУВАХ СВАХ ТАТ-САВИТУР-ВАРЕНЬЯМ БХАРГО ДЭВАСЬЯ ДХИМАХИ ДХИЙО ЙО НАХ ПРАЧОДАЙАТ


•    Вишну Гайатри- для семейного благополучия:
АУМ НАРАЙЯНАЙЯ ВИДМАХЕ,
ВАСУДЕВАЙЯ ДХИМАХИ ТАННО ВИШНУХ ПРАЧОДАЙЯТ


•    Шива Гайатри- для снятия проблем, для покоя и преуспевания.
АУМ ПАНЬЧВАКТРАЙЯ ВИДМАХЕ, МАХАДЕВАЙЯ ДХИМАХИ ТАННО РУДРАХ ПРАЧОДАЙЯТ


•    Брахма Гайатри - для увеличения продуктивности действий.
АУМ ПАРМЕШВАРАЙЯ ВИДМАХЕ, ПАРАТАТТВАЙЯ ДХИМАХИ ТАННО БРАХМА ПРАЧОДАЙЯТ


•    Рама Гайатри- для безопасности , доброго имени и положения.
АУМ ДАШАРАТХАЙЯ ВИДМАХЕ, СИТА-ВАЛЛАБХАЙЯ ДХИМАХИ ТАННО РАМАХ ПРАЧОДАЙЯТ


•    Кришна Гайатри - для успеха в работе, повышения активности.
АУМ ДЕВАКИНАНДАНАЙЯ ВИДМАХЕ, ВАСУДЕВАЙЯ ДХИМАХИ ТАННО КРИШНАХ ПРАЧОДАЙЯТ


•    Индра Гайатри- для безопасности в конфликтах.
АУМ САХАСРА -НЕТРАЙЯ ВИДМАХЕ,
ВАДЖРАСТРАЙЯ ДХИМАХИ ТАННО ИНДРАХ ПРАЧОДАЙЯТ


•    Хануман Гайатри- для бескорыстного служения.
АУМ АНДЖАНЕЙЯЙЯ ВИДМАХЕ,
МАХАБАЛАЙЯ ДХИМАХИ ТАННО ХАНУМАН ПРАЧОДАЙЯТ


•    Сурья Гайатри- для лечения заболеваний, освобождения от недугов.
АУМ БХАСКАРАЙЯ ВИДМАХЕ, ДИВАКАРАЙЯ ДХИМАХИ ТАННО СУРЬЯХ ПРАЧОДАЙЯТ


•    Чантра Гайатри- для подавления страхов, беспокойств, пессимизма,психозов и неврозов.
АУМ КРИШНА -ПУТРАЙЯ ВИДМАХЕ, АМРИТАТАТВАЙЯ ДХИМАХИ ТАННО ЧАНДРАХ ПРАЧОДАЙЯТ


•    Яма Гайатри- для освобождения от страха смерти.
АУМ СУРЬЯ -ПУТРАЙЯ ВИДМАХЕ,
МАХАКАЛАЙЯ ДХИМАХИ ТАННО ЯМАХ ПРАЧОДАЙЯТ


•    Варуна Гайатри- для увеличения любви между мужчиной и женщиной.
АУМ ДЖАЛАВИМВАЙЯ ВИДМАХЕ, НИЛА-ПУРУШАЙЯ ДХИМАХИ ТАННО ВАРУНАХ ПРАЧОДАЙЯТ


•    Нараяна Гайатри - для увеличения силы организаторских способностей.
АУМ НАРАЙЯНАЙЯ ВИДМАХЕ, ВАСУДЕВАЙЯ ДХИМАХИ ТАННО НАРАЙЯНА ПРАЧОДАЙЯТ


•    Нарасимха Гайатри - для увеличения способности помочь другим.
ВАДЖРАНАКХАЙЯ ДХИМАХИ ТАННО НАРАСИНХАХ ПРАЧОДАЙЯТ


•    Дурга Гайатри - для победы над обстоятельствами, врагами, болью и страданиями.
АУМ ГИРИДЖАЯЙ ВИДМАХЕ, ШИВАПРИЯЯЙ ДХИМАХИ ТАННО ДУРГА ПРАЧОДАЙЯТ


•    Лакшми Гайатри - для достижения богатства, роскоши, положения, продвижения по службе.
АУМ МАХАЛАКШМЬЯЙ ВИДМАХЕ, ВИШНУПРИЯЯЙ ДХИМАХИ ТАННО ЛАКШМИ ПРАЧОДАЙЯТ


•    Радха Гайатри - для увеличения религиозной преданности, божественной любви.
АУМ ВРИШАБХАНУДЖАЯЙ ВИДМАХЕ, КРИШНАПРИЯЯЙ ДХИМАХИ ТАННО РАДХАПРАЧОДАЙЯТ


•    Сита Гайатри - для обретения способности работать над собой, искупления и терпимости
АУМ ДЖАНАКАНАНДИНЬЯЙ ВИДМАХЕ, БХУМИДЖАЯЙ ДХИМАХИ ТАННО СИТА ПРАЧОДАЙЯТ


•    Сарасвати Гайатри - для укрепления памяти, мудрости, знаний, творческих способностей.
АУМ САРАСВАТЬЯЙ ВИДМАХЕ, БРАХМАПУТРЬЯЙ ДХИМАХИ ТАННО САРАСВАТИ ПРАЧОДАЙЯТ


•    Агни Гайатри - для обеспечения тела, ума, всех органов чувств жизненными силами и оджасом.
АУМ МАХАДЖВАЛАЙЯ ВИДМАХЕ, АГНИДЕВАЙЯ ДХИМАХИ ТАННО АГНИХ ПРАЧОДАЙЯТ


•    Притхи Гайатри - для стабильности, настойчивости и сотрудничества.
АУМ ПРИТХВИДЕВЬЕ ВИДМАХЕ, САХАСРАМУРТЬЕ ДХИМАХИ ТАННО ПРИТХВИ ПРАЧОДАЙЯТ


•    Кама Гайатри - для увеличения чувственности, сексуального удовлетворения и половой силы, жизненных сил, бодрости, стойкости и выносливости.
АУМ КАМАДЕВАЙЯ ВИДМАХЕ, ПУШПАВАНАЙЯ ДХИМАХИ ТАННО КАМАХ ПРАЧОДАЙЯТ


•    Хамса Гайатри - для увеличения силы проницательности (способности различения).
АУМ ПАРАМАХАМСАЙЯ ВИДМАХЕ, МАХАХАМСАЙЯ ДХИМАХИ ТАННО ХАМСАХ ПРАЧОДАЙЯТ


•    Хайягрива Гайатри - для увеличения мужества и избавления от страхов.
АУМ ВАНИШВАРАЙЯ ВИДМАХЕ, ХАЙЯГРИВАЙЯ ДХИМАХИ ТАННО ХАЙЯГРИВАХ ПРАЧОДАЙЯТ


•    Мантра Махамритьюнджайя - для устранения физических, ментальных и астральных недугов.
АУМ ТРИЙЯМБАКАМ ЯДЖАМАХЕ СУГАНДХИМ ПУШТИВАРДХАНАМ УРВАРУКАМИВА БАНДХАНАН МРИТЙОРМУКШИЙЯ МАМРИТАТ


•    Магическая мантра для защиты мага от сущностей:
Иат-Ха-Аху-Ваирио


Мантра для набора энергии и силы. (читать ее от 9 до 36 раз):
СИХ ТАМТ ТХУ


Еще одна мантра для набора энергии
КАСТОНАЙ ЛАПИО АСТЕРИУМ МАНТО


И еще одна сильная мантра для набора энергии:
наберите полную грудь воздуха и постарайтесь на выдохе проговорить (или пропеть) эти звуки. звуки плавно перетекают один в другой
ЫЭАОУМУОАЭЫМ


Мантра подчинения чел-ка:
ДХУМ ДХУМ ДХУМАВАТИ ТХАХ ТХАХ


Мантра, усиливающая силу разрушительного воздействия. Произносить при ударе:
ТОФАТ ХУМ ПХАТ


Мантра, которая убивает злых существ:
ОМ ХРИ


ИАТ ХА АХ ХУ ВО- формула разящего света

 

Формула для изгнания проявлений зла( сущностей ):


"FUNDAMENTA EJUS IN MONTIBUS SANCTIS" читать в голос 3 раза.

 

Формула изгнания нечести:

"APAGE AME SATANAS" читать 3 раза


Формула алхимиков для очищения. "Уроборос":
"IGNE NATURA RENOVATUR INTEGRA" 3 РАЗА
для восстановления зрения можно помедитировать на свечу и читать мантру (3 недели по 108 раз)
ОМ ШАМ ГЕФТАХ ОУМ

 

Мантра, которая усиливает силу перед соперником:
ЧАНДРАМ-БРАМБАЧАНДРА


Тибетская мантра для похудения. Можно читать по 9-12 раз на воду и пить. Через неделю будет эффект-не поверите! Помогло многим,кому я ее давал. И кстати, при ее использовании курс луны можно не учитывать.
Мантра:
"САН СИА ЧИИ НАХ ПАЙ ТУН ДОУ"


мантра для победы над гневом и ненавистью:
ОМ АКШОБИЯ ХУМ


Мантра, которая успокаивает ум:
ТАКЕ ДЖУГА ПАДА КАМАЛА МНАВАУН ДЖАСУ КРИПА НАРАМАЛА МАТИ ПАВАУН


мантра для удачи во всех начинаниях:
ОМ НАМО ДХАНАДАЙЕ СВАХА


Мантра для развития прорицательского дара:
ГЕ КА ОМ


мантра для очищения от негатива
ОМ ШРИ КАЛИ НАМАХ ФОРАМ


Мантра для привлечения внимания противоположного пола и усиления привлекательности:
ОМ КУРКУЛЛЕ ХУМ ХРИХ СВАХА

 

МАНТРА НА ПРИЗЫВ ЭНЕРГИЙ НА ПОМОЩЬ В ДЕЛАХ И ИСЦЕЛЕНИИ:
АКСАНФОРИЯ -РАМИНХА-МИНЭЛЬЕ-ОЕ-ФОРАМ


Мантра-защита от темных сил:
Ята Ахуна Варья


Мантра-просьба к богам, о даровании способностей:
ДХЙО ЙО НАХ ПРАЧОДАЯТ


мантра для привлечения денег
КВОЧ КОХИН ТО


мантра для развития ясновидения
ОМ ШРИ ДЕЛЛА ОМ"


Мантра Огня
АУМ ШРИ АГНИ СУРЬЯ ДЖАЙЯ РАМ


Защитная мантра
Аум-мистериом-Раом


Мантра "Зуб Дракона", наделяет силой, и укрепляет дух:
аум мани падме хум


Мантра для прохода между мирами:
Лаум-АС-Танаан-Инигму-Сферати-Инвинум-И-И-А-А-Ла-А-А-А-А-Тум!


Мантра-вызов астрального двойника опр. чел-ка:
Ус-Монакос-Пес-Акос-(имя)-Ас-Менторос-Монакос


Мантра мгновенного увеличания запаса сил (не самих сил, а личного запаса. После неё следует тутже запонить появившийся резерв энергией):
Тау-О-Ма-Сатиби-Ат-Та-Па-Тьюлум (Тиулум)-Мэнсал!


Мантра для насылания сна:
Мэрсон-Берессо-Эст-Катор-Алэм-Эст-Барум-Хатум


Мантра духовной звезды сознания, с повторением ее одиннадцать раз открывает резервы организма к восприятию любого знания.
Каааф ха йа аййййн саааад


Повторяя 14 раз, помогает при выпечке целительного хлеба, хлебопродуктов. Можно пирожок так спечь.
Та Сиииин Миииим Ра Саааад


Гимн является защитой от инфекционных болезней; повторять 8, 18, 28 раз каждые 2 часа во время лечения, а так же временами для профилактики (работает как "щит" из рекламы какого-то там молочного продукта - типа щит от бактерий и инфекции).
АлифЛаааам Мии-иим Алиф Лаааам Ра Йа-сиииин Кааааф ха йа аййййн саааад Ха Миииим Та ха Ха Миииим. Аййййн Сиииин Кааааф


Постоянное повторение этой мантры обеспечит безопасность.
Тоха, Йа-Сии-ииин


Мантра, которая помогает при отравлении.
Йа-Сиииин и Ха Миииим Аййййн Сиииин Кааф


Мантра, которая избавит Вас колдовства, сглаза и порчи.
Аль-Мумину-Аллаху


Мантры для изменения собственных вибраций:
Ау-Вэ-Таании-Лау-Мэ-Раорэ-Ра. (Работает на увеличение частоты)
Цако-Гумо-Коллодон-Тигун-Донун-Эраконтум. (Понижение частоты)


При необходимости создаёт активную защиту. Успокаивает при эмоциональном возбуждении.
Аум нама Нараяна


Погружает в транс с выходом в астрал
Алэм сенемасанд джанэм арманусат тал шиб сарут элиджасаб нимонисан кобшали вусат аршилибусат.


Мантра для развития астрального зрения
АУМ КАССИЯН ХАРА ШАНАТАР


Мантра против заикания( болезнь такая)
ДААЗА - МААТОМ
Мантра успокоения ума, даруит интуицию:
ха-ро-ха-ра


Для получения знания (Сарасвати)
АУМ АЙМ САРАСВАТЬЕ НАМАХ - АУМ


Мантра для всех целей.
АУМ БХУР-БХУВАХ СВАХ
ТАТ-САВИТУР-ВАРЕНЬЯМ
БХАРГО ДЭВАСЬЯ ДХИМАХИ
ДХИЙО ЙО НАХ ПРАЧОДАЙАТ


Мантра для устранения врагов
АУМ ЭКАДАНТАЙЯ ВИДМАХЕ,
ВАКРАТУНДАЙЯ ДХИМАХИ
ТАННО БУДДХИХ ПРАЧОДАЙЯТ


Мантра для снятия проблем, для покоя и преуспевания.
АУМ ПАНЬЧВАКТРАЙЯ ВИДМАХЕ,
МАХАДЕВАЙЯ ДХИМАХИ
ТАННО РУДРАХ ПРАЧОДАЙЯТ


Мантра для увеличения продуктивности действий. (Брахма)
АУМ ПАРМЕШВАРАЙЯ ВИДМАХЕ,
ПАРАТАТТВАЙЯ ДХИМАХИ
ТАННО БРАХМА ПРАЧОДАЙЯТ


Мантра для безопасности , доброго имени и положения. (Рама)
АУМ ДАШАРАТХАЙЯ ВИДМАХЕ,
СИТА-ВАЛЛАБХАЙЯ ДХИМАХИ
ТАННО РАМАХ ПРАЧОДАЙЯТ


Мантра для успеха в работе, повышения активности. (Кришна)
АУМ ДЕВАКИНАНДАНАЙЯ ВИДМАХЕ,
ВАСУДЕВАЙЯ ДХИМАХИ
ТАННО КРИШНАХ ПРАЧОДАЙЯТ


Мантра для безопасности в конфликтах. (Индра)
АУМ САХАСРА -НЕТРАЙЯ ВИДМАХЕ,
ВАДЖРАСТРАЙЯ ДХИМАХИ
ТАННО ИНДРАХ ПРАЧОДАЙЯТ


Мантра для лечения заболеваний, освобождения от недугов. (Сурья)
АУМ БХАСКАРАЙЯ ВИДМАХЕ,
ДИВАКАРАЙЯ ДХИМАХИ
ТАННО СУРЬЯХ ПРАЧОДАЙЯТ


Мантра для подавления страхов, беспокойств, пессимизма,психозов и неврозов. (Чантра)
АУМ КРИШНА -ПУТРАЙЯ ВИДМАХЕ,
АМРИТАТАТВАЙЯ ДХИМАХИ
ТАННО ЧАНДРАХ ПРАЧОДАЙЯТ


Мантра для освобождения от страха смерти. (Яма)
АУМ СУРЬЯ -ПУТРАЙЯ ВИДМАХЕ,
МАХАКАЛАЙЯ ДХИМАХИ
ТАННО ЯМАХ ПРАЧОДАЙЯТ


Мантра для увеличения любви между мужчиной и женщиной. (Варуна)
АУМ ДЖАЛАВИМВАЙЯ ВИДМАХЕ,
НИЛА-ПУРУШАЙЯ ДХИМАХИ
ТАННО ВАРУНАХ ПРАЧОДАЙЯТ


Мантра для увеличения силы организаторских способностей.
АУМ НАРАЙЯНАЙЯ ВИДМАХЕ,
ВАСУДЕВАЙЯ ДХИМАХИ
ТАННО НАРАЙЯНА ПРАЧОДАЙЯТ


Мантра для увеличения способности помочь другим.
АУМ УГРАНАРАСИМХАЙЯ ВИДМАХЕ,
ВАДЖРАНАКХАЙЯ ДХИМАХИ
ТАННО НАРАСИНХАХ ПРАЧОДАЙЯТ


Мантра для победы над обстоятельствами, врагами, болью и страданиями.
АУМ ГИРИДЖАЯЙ ВИДМАХЕ,
ШИВАПРИЯЯЙ ДХИМАХИ
ТАННО ДУРГА ПРАЧОДАЙЯТ


Мантра для достижения богатства, роскоши, положения, продвижения по службе.
АУМ МАХАЛАКШМЬЯЙ ВИДМАХЕ,
ВИШНУПРИЯЯЙ ДХИМАХИ
ТАННО ЛАКШМИ ПРАЧОДАЙЯТ


Мантра для укрепления памяти, мудрости, знаний, творческих способностей.
АУМ САРАСВАТЬЯЙ ВИДМАХЕ,
БРАХМАПУТРЬЯЙ ДХИМАХИ
ТАННО САРАСВАТИ ПРАЧОДАЙЯТ


Мантра для стабильности, настойчивости и сотрудничества.
АУМ ПРИТХВИДЕВЬЕ ВИДМАХЕ,
САХАСРАМУРТЬЕ ДХИМАХИ
ТАННО ПРИТХВИ ПРАЧОДАЙЯТ


Мантра для увеличения чувственности, сексуального удовлетворения и половой силы, жизненных сил, бодрости, стойкости и выносливости.
АУМ КАМАДЕВАЙЯ ВИДМАХЕ,
ПУШПАВАНАЙЯ ДХИМАХИ
ТАННО КАМАХ ПРАЧОДАЙЯТ


•    Мантра для увеличения мужества и избавления от страхов.
АУМ ВАНИШВАРАЙЯ ВИДМАХЕ,
ХАЙЯГРИВАЙЯ ДХИМАХИ
ТАННО ХАЙЯГРИВАХ ПРАЧОДАЙЯТ


•    Мантра для устранения физических, ментальных и астральных недугов.
АУМ ТРИЙЯМБАКАМ ЯДЖАМАХЕ
СУГАНДХИМ ПУШТИВАРДХАНАМ
УРВАРУКАМИВА БАНДХАНАН
МРИТЙОРМУКШИЙЯ МАМРИТАТ

 

 

Мантры к Богам


•    Кали- богиня трансформации
КРИМ КРИМ КРИМ
ХИМ ХРИМ ДАКШИНЕ КАЛИКЕ
КРИМ КРИМ КРИМ ХРИМ ХРИМ
ХУМ ХУМ СВАХА


•    Тара- богиня выразительности
АЙМ АУМ ХРИМ
КРИМ ХУМ ПХАТ


•    Шодаши- юная и прекрасная
ХРИМ КА Э И ЛА ХРИМ
ХА СА КА ХА ЛА ХРИМ
СА КА ЛА ХРИМ


•    Бхуванешвари- царица феноменального мира
ХРИМ
•    Чиннамаста - богиня желания и проницательности
ШРИМ ХРИМ КЛИМ АЙМ
ВАДЖРАВАЙРОЧАНИЙЕ
ХУМ ХУМ ПХАТ СВАХА


•    Трипура Бхайрави - разрушитель девяти заблуждений ума
ХАСАЙН ХАСКАРИМ ХАСАЙН


•    Дхумавати - Подчинение
ДХУМ ДХУМ
ДХУМАВАТИ ТХАХ ТХАХ


•    Багала Мукхи - энергия
АУМ ХРИМ БАГАЛАМУКХИ САРВА
ДУШТАНАМ ВАВАЧАМУКХАМ
ИСТАМБХАЙ ДЖИВХАМКИЛАЙ БУДДХИНАШАЙ
ХРИМ АУМ СВАХА


•    Матанги - богиня красноречия
АУМ ХРИМ КЛИМ ХУМ
МАТАНГАЙЕ ПХАТ СВАХА


•    Камала - богиня покоя и процветания
АУМ АЙМ ХИМ
ШРИМ КЛИМ ХАССАУ
ДЖАГАТПРАСУТАЙЕЙ НАМАХ


•    Мантра Дурги - несокрушимая
АУМ ХРИМ ДУМ ДУРГАЙЕ НАМАХ


•    Мантра для богатства и процветания, ежедневно, до получения результата 108 раз
ОМ - ХРИМ - ШРИМ - ЛАКШМИ - БЙО - НАМАХА


•    Мантры посвященные Ганеши
o    Махамантра Ганеши (главная мантра)./Ганеша- устраняющий препятствия/
Дарует чистоту намерений, удачу в бизнесе и всяческое процветание.
ОМ - ГАМ - ГАНАПАТАЙЕ - НАМАХА


o    Ганеша Гайатри- для устранения препятствий.
АУМ ЭКАДАНТАЙЯ ВИДМАХЕ, ВАКРАТУНДАЙЯ ДХИМАХИ ТАННО БУДДХИХ ПРАЧОДАЙЯТ


o    В результате повторений достигается успех в любых коммерческих делах, стремление к совершенству, глубинное знание мира, расцвет талантов.
ОМ - ШРИ - ГАНЕШАЙЯ - НАМАХ


•    Мантра для обретения благословения небес во всех начинаниях, счастья, любви и процветания.
МАНГАЛАМ - ДИШТУ - МЕ - МАХЕШВАРИ


•    Медицинская мантра
Мобилизует защитные силы организма, повышает иммунитет и способствует быстрому выздоровлению.
ОМ - БХАЙКАНДЗЕ - БХАЙКАНДЗЕ - МАХА - БХАЙКАНДЗЕ - РАТНА - САМУ - ГАТЭ - СВАХА


•    Мантра для успеха и благополучия
ОМ - ХРИМ - КШИМ - ШРИМ - ШРИ - ЛАКШМИ - НРИСИНХАЙЕ - НАМАХ

 


 

ОМ МАЙЯ МА КИТЕ РАКУ АНА ПИЯ НАМО

БОЖЕСТВЕННАЯ ЗАЩИТА !
ЭНЕРГЕТИЧЕСКИХ ТЕЛ ЧЕЛОВЕКА !
поётся на низкой частоте в медленном ритме
появится привкус во рту металла (справились)
она платиновая внутри, бело-золотая сверху.
















 Мантра для блага других

ОМ МАНИ ПЕМЕ ХУНГ

Мантра, которую произносят для блага других существ, где шесть слогов превращают шесть мешающих чувств в мудрость (привязанность и жадность имеют здесь одну и ту же природу). Ом - преобразует гордыню и самомнение; Ма - ревность и зависть; Ни - привязанность и эгоистические желания; Пе - неведение и запутанность; Ме - жадность и алчность; Хунг - ненависть и злость.

Универсальная мантра

ОМ

ОМ - изначальный звук. Символ творения, универсальный символ созидания и разрушения. Это божественная и универсальная вибрация, не имеющая ни начала ни конца, она успокаивает сознание и дарит чувство мира и гармонии. Одной этой мантры достаточно для познания и понимания природы реальности и самого Бога.
Мантра для привлечения денег

КУНГ-РО-НО АМА НИ-ЛО-ТА-ВОНГ

Нужно день поститься, думая о добрых делах, которые следует совершить, имея деньги. В полнолуние произнести три раза подняв руки над головой данную мантру. Повторять эти мантры раз в неделю в течение 3-х месяцев.
Защищающая от нападения мантра

ИАТ-ХУ-АХУ-ВОО (петушиный крик)

ИАТ-ХУ-АХУ-ВАИРИО (львиный рев)

ДО-КУЛАК-МАНТУГО-ЯРАХАТ-ЭТЭР (при последнем слове ударить воздух правой рукой ладонью вниз)
Мантра гасящая драку

АЛАУМ-РАУМ-ОМ
Мантра на счастье

ЛО-АН-АН-ТА, ФА-РИ

Накануне следует поститься и медитировать. В течение недели каждый день после пробуждения следует повторять вслух данную мантру.
Мантра на любовь

ГО-ДО-СИ, РО АН-ВАТ, МОНО-РАН

Перед этим провести медитацию и однодневный пост. В полутемной комнате сказать шепотом 4 раза данную мантру. Затем делать это подряд в течение трех вечеров, имея внутреннюю готовность встретить любовь. Мгновенно это не действует. Нужно повторять процедуру в течение месяца. А начать это следует при плной луне.
Мантра на здоровье

ЧУНГ-ДО-АМА, РУНГ-НИНГ

День нужно поститься, медитируя о здоровье. Утром следующего дня до восхода солнца следует медленно произнести мантру. Повторять это по утрам в течение 10 дней. Самочувствие будет улучшаться изо дня в день. 
Гармоничное развитие

ГОУР РА АНГ ГА, ХА-РИБОЛ НИТАЙ-ГОУР НИТАЙ-ГОУР ХАРИБОЛ, ГОПАЛА ГОВИНДА РАМА МАДАНА-МОХАНА

Универсальные для обеспечения наиболее гармоничного и естественного развития вашей личности в направлении духовного просветления. Их нужно произносить естественным голосом после остановки внутреннего диалога в течение 10-15 минут. Если хотите можно придумать мелодию и напевать
Мантра для наслаждения любовью, нежных и доверительных отношений

ОМ ШРИ КРИШНАЙЯ ГОВИНДАЙЯ ГОПИДЖАНА ВА ЛАБХАЙЯ НАМАХ
Мантра для укрепления уверенности в себе и очарования

ОМ НАМО БХАГАВАТЭ РУКМИНИ ВАЛАБХАЙЯ СВАХА
Мантра укрепляющая сердце, а также универсальная защитная мантра

ГАТЭ ГАТЭ ПОРО ГАТЭ ПОРО СОМ ГАТЭ БОДХИ СВАХА
Мантра для обретения благословения небес во всех начинаниях, счастья, любви и процветания

МАНГАЛАМ ДИШТУ МЕ, МАХЕШВАРИ

Дай счастья мне Махешвара
Мантра для богатства, умиротворения и исполнения желаний

ОМ ЛАКШМИ ВИГАН ШРИ КАМАЛА ДХАРИГАН СВАХА

Эту мантру для лучших результатов следует повторять с 13 апреля до 14 мая.
Мантра для изобилия, радости души и успеха во всем

ОМ ШРИМ ХРИМ ШРИМ КАМАЛЕ КАМАЛАЛАЙЕ ПРАСИД ПРАСИД ШРИМ ХРИМ ОМ МАХАЛАКШМИМЙЕ НАМАХ

Эту мантру лучше повторять с 16 октября по 15 ноября каждый день.
Мантра для удачи в бизнесе и процветания

ОМ ГАМ ГАНАПАТАЙЕ НАМАХА
Успех в любых коммерческих делах, глубинное знание, расцвет талантов

ОМ ШРИ ГАНЕШАЙЯ НАМАХ
Мантра для успеха и благополучия

ОМ ХРИМ КШИМ ШРИМ ШРИ ЛАКШМИ НРИСИНХАЙЕ НАМАХ
Мантра для исцеления (мантра для сердечной чакры)

СА

Начните с того, что разведите руки, чтобы позволить энергии свободно течь между чакрой сердца и ладонями. Повторяя мантру, представляйте энергию, наполняющую область чакры сердца. Произнося слова, попробуйте визуально представить чакру в виде сферы зеленоватого цвета размером с теннисный мячик, светящуюся в сердце по мере вибрации мантры.
Мантра для мира во всем мире

НАМ МИОХО РЕНГЕЙ КИО

Произносится мантра громко и быстро, производя вибрации мира на всей планете. Можно также произносить эту мантру для хорошего здоровья и материального благополучия.
Мантра для пробуждения глубокого сострадания ко всему живому

ОМ МАНИ ПАДМЕ ХУМ

Популярная восточная мантра и применяется для благоговения и пробуждения глубокого чувства сострадания ко всему живому. Эта мантра сострадательному Будде. Это очень мощная мантра: говорят, что любой пропевший эту мантру миллион раз (на что может уйти целый год) получит в дар ясновидение. Многие распевают эту мантру для вызова благословения сострадательного Будды. Также мантра хорошо очищает. Пропойте ее 108 раз для очищения дома.
Мантра для избавления от зависимости

АУМ ШРИ ГАЙЯ АДИ ШИВА ГАЙЯ АДИ КАЛИ ГАЙЯ АДИ КАЛА БХАЙРАВА НАМАХ ФОРАМ
Мантра для уничтожения плохого в себе

КОРФТ ОУМ
Мантра для уничтожения плохого в себе

РЕМ РАО АУМ
Мантра для закрепления результата после любых изменений

КАТЕ КАТЕ ПОРО КАТЕ ПОРО СОМ КАТЕ БОДЕ СОХА

Читается до или после любых действий, направленных на улучшение Фэн-шуй
Мантра для закрепления результата после любых изменений

ОМ БХАЙКАНДЗЕ БХАЙКАНДЗЕ МАХА БХАЙКАНДЗЕ РАМА САМУ ГАТЕ СОХА

Читается до или после любых действий, направленных на улучшение Фэн-шуй
Мантра для закрепления результата после любых изменений

ОМ МА НЕ ПАД МЕ ХУМ Мантра

Читается до или после любых действий, направленных на улучшение Фэн-шуй
Мантра Богине Луны

АУМ ШРИ ГАЙЯ АДИ ЧАНДРА АЙЯ НАМАХ

Надо выбрать время полнолуния и выйти на улицу. Ноги должны опираться на землю, руки вытянуты ладонями к луне. Произносим мантру 12 минут. К концу 12 минуты тело будет жужжать как рой пчел. Так повторить 12 полнолуний. На тринадцатое на вас обрушится поток денег и во всех делах пойдет удача, тело оздоровится. Но 12 полнолуний выдержать сложно, будут и кошмарные сновидения и необычные феномены и нежелание проводить ритуал. Это неблагоприятные силы не хотят изгоняться. Но если дойти до конца - все получается. В принципе, устойчивый рост достатка начинается уже после третьего полнолуния. После 12 полнолуний продолжаем делать каждое полнолуние. Если одно пропустить, то нужно начинать все с начала.
Мантра Юпитеру

ДЗАЯН ДЗАЯЧИ КОЧ КОХЕН ТО

Эта мантра отвечает за рост достатка и дружбу с сильными мира сего. Для привлечения этих энергий Юпитера выбирают четверг, время восхода солнца. Медитируя на глубокий синий цвет читают мантру. Так каждую неделю в четверг на протяжении четырех месяцев. Потом раз в месяц, пока не будет достигнут желаемый уровень.
Мантра для материального блага

ГАЙЯ АДИ ЧАНДРЕ

Читается в дни и ночи Луны (день Луны понедельник, ночь Луны с четверга на пятницу)
Мантра для процветания и благополучия

ОМ ХРИМ КЛИМ ШРИМ НАМАХ
Мантра для обретения удачи во всех начинаниях

ОМ НАМО ДХАНАДАЙЕ СВАХА
Мантра для достижения социального успеха и процветания бизнеса

ОМ ХРИМ ШРИМ ШРИМ ШРИМ ШРИМ ШРИМ ШРИМ ШРИМ ЛАКШМИ МАМ ГРАХЕ ПУРАЙЕ ПУРАЙЕ ЧИНТА ДУРАЙЕ ДУРАЙЕ СВАХА

Эта мантра работает великолепно, но ее нужно читать ровно 108 раз. Ее достаточно повторять 2 дня. Для достижения успеха в бизнес-проектах можно работать с ней 2 раза в месяц.
Мантра для избавления от страха

ДЖАЙЯ ДЖАЙЯ ШРИ НРИСИМХА

Читайте эту мантру утром и вы обретете душевный покой и благоприятный настрой.
Наполнение энергией

РА

Для этого понадобится камень гранат. Чтобы извлечь из камня пользу вы должны применить гранат к чакре Муладхара (в районе комчика у основания позвоночного столба). Прижмите гранат к нижней части спины на уровне этой чакры. Произносите мантру в течение нескольких минут, что поможет активизировать энергию в этой чакре. Почувствуйте энергию звука, проходящую вниз по руке, сосредотачивающуюся в гранате. Эта энергия стимулирующая чакру, помогает активизировать любые поврежденные энергетические точки.
Очистительная мантра

ОМ АХ ХУМ СО ХА

Это мощная мантра, очищающая моментально, и вы можете визуализировать, как все предметы в вашей комнате очищаются, когда вы окуриваете их благовонием. Протсто повторяйте мантру 108 раз в такт дыхания. Эту мантру распевают все буддисты, когда совершают подношения Будде на домашнем алтаре или в святилище, а также перед приемом пищи.
Мантра Будды Медицины

ОМ БХАЙКАНДЗЕ, БХАЙКАНДЗЕ МАХА БХАЙКАНДЗЕ РАТНА САМУ ГАТЕ СВАХА

Мысленно представьте у себя над головой Будду Медицины. Этот Будду имеет темно-голубое тело, и Он прекрасен. Распевайте мантру семь раз каждое утро и семь раз каждый вечер. Распевайте с визуализацией. Вы обязательно почувствуете улучшение здоровья. Также эту мантру можно петь для другого человека, когда ему нездоровится.
Мантра для снятия зубной боли

АУМ ШРИ МАХАЗУРДИВИЙЯ НАМАХ
Мантра для радости, наслаждения жизнью и любовью

ОМ ШРИ КРИШНАЙЯ ГОВИНДАЙЯ ГОПИДЖАНА ВАЛАБХАЙЯ НАМАХ
Мантра для привлечения света

ОМ ШАНТИ ШАНТИ ШАНТИ
Мантра для успокоения сердца и защиты от всякого зла

ГАТЭ ГАТЭ ПОРО ГАТЭ ПОРО СОМ ГАТЭ БОДХИ СВАХА

Мантра Великого знания. Самая известная универсальная защитная мантра. Ее повторение делает человека неуязвимым для любых негативных действий. В любой сложной ситуации можно повторять эту мантру и представить, что тебя окутывает облако золотистого цвета. Это облако Божественной любви. Оно защищает человека от неприятностей.
Мантра для обращения к Абсолюту

ОМ МАХАДЕВАЙЯ НАМАХ
Мантра жизнедающая, исцеляющая, наполняющая силой и радостью

ОМ ТРИЙЯМБАКАМ ЙАДЖАМАХЕ СУГАНДХИМ ПУШТИ ВАРДХАНАМ УРВАРУКАМИВА БАНДХАНАН МРИТИЙОР МУКШИЙЯ МАМРИТАТ

Лучше всего читать эту мантру когда перед выходом из дома приводите себя порялок. Это настроит сердце на гармонию, а душу наполнит радостью и уверенностью. Одна из основных мантр Высшего счастья. Наделяет здоровьем, защищает от болезней, несчастных случаев. Приносит радостное настроение, счастье, любовь, улучшает взаимоотношения. Помогает найти спутника жизни. Также полезно повторять ее для исцеления в день рождения.
Мантра, устраняющая препятствия и дающая радость жизни и духовное озарение

ОМ ШРИ РАМА ДЖАЙЯ РАМА ДЖАЙЯ ДЖАЙЯ РАМА
Мантра для легких

У

Этот звук оказывается вибрирует на частоте легких. Поэтому если долго тянуть: у-у-у, происходит их вентиляция и в них проникает Космическая энергия.
Мантра для женщин

АУМ ПАРАМАТМАЙЯ БРАХМА АУМ ТАТ САТ, СОХАМ, ВИДЖАМ
Мантра для нормализации менструального цикла и женской сексуальности. 

Мантра для женщин

АДИШАКТИ

Мантра, связанная с женскими божествами.
Мантра для богатства

ОМ ХРЙМ КЛИМ ШРЙМ НАМАХ

Ежедневное повторение этих мантр помогает быстро обрести богатство праведным путем
Мантра для богатства

ОМ ХРЙМ КШЙМ ШРИМ ШРИ ЛАКШМИ НРИСИНХАЙЕ НАМАХ

Ежедневное повторение этих мантр помогает быстро обрести богатство праведным путем
Мантра, чтобы найти клад

ОМ ХАНСЕ ХАНСЕДЖАНЕ ХРЙМ КЛИМ СВАХА

Повторение этой мантры в уединенном месте поможет найти клад.
Мантра для богатства

ОМ ЛАКШМИ ВИГАН ШРЙ КАМАЛАДХАРИГАН СВАХА

Эту мантру, чтобы ощутить всю полноту ее воздействия, следует повторить 20 тысяч раз в течение периода с 13 апреля до 14 мая. После прочтения вы обретете богатство, ваши желания, связанные с улучшением материального положения, осуществятся.
Мантры для умиротворения планет

Мантра для умиротворения Солнца ОМ ХРАМ ХРИМ ХРУМ САХ СУРЙАЙЕ НАМАХ (7000 раз, воскресенье)

Для умиротворения Луны ОМ ШРАМ ШРИМ ШРУМ СА ЧАНДРА МАСЕ НАМАХ (11000 раз, вторник)

Для умиротворения Меркурия ОМ БРАМ БРИМ БРУМ СА БУД ХАЙЕ НАМАХ (9000 раз, среда)

Для умиротворения Марса ОМ КРАМ КРИМ КРУМ СА БХАУ МАЙЕ НАМАХ (10000 раз, четверг)

Для умиротворения Юпитера ОМ ГРАМ ГРИМ ГРУМ СА ГУРАВЕ НАМАХ (19000 раз, четверг)

Для умиротворения Венеры ОМ ДРАМ ДРИМ ДРУМ СА ШУЕ РАЙЕ НАМАХ (16000 раз, пятница)

Для умиротворения Сатурна ОМ ПРАМ ПРИМ ПРУМ СА ШАНАЙЕ НАМАХ или ОМ КХАМ КХИМ КХУМ СА ШАНАЙЕ НАМАХ (24000 раз, суббота)

Планеты способны оказывать не только благоприятное, но и пагубное воздействие на финансовый модус человека. Для нейтрализации этого негативного влияния следует читать специально разработанные тантрические мантры для каждой планеты.
Мантра для обретения великого богатства

ОМ ГАМ ГАНАПАТАЙЕ САРВА ВИГХНА РАЙА САРВАЙА САРВА ГУРАВЕ ЛАМБО ДАРАЙА ХРИМ ГАМ НАМАХ
Мантра для процветания

ВАКРА ТУНЛАЙА ХУМ И ОМ ХРИМ ШРИМ ХРИМ
Мантра для изобилия и благополучия

ОМ ШРИМ ХРИМ КЛИМ ГЛАУМ ИМ НАМО БХАГАВАТИ ГАНЕШАН КАНИ ВАСИНИ МАХА ЛАКШМИ ВАРА ВАРАДЕ ШРИМ ВИБХУ ТАЙЕ СВАХА
Обеспечивает надежную охрану богатства

РАЙА СПОШАСЙА ДАДИТА НИД ХИДО РАТНА ДХАТУМАН РАКШО ХАНО ВАЛАГА ХАНО ВАКРА ТУНДАЙА ХУМ
Мантра для оберегания имущества от всевозможных неприятностей, а также существенно увеличить его

ОМ НАМО БХАГАВАТЕ ГЛАУМ МАХА ГАНАПАТАЙЕ СИНДУ РАРАН ДЖИТАЙА ОМ ШРИМ ХРИМ КЛИМ САРВА ДЖАНА САМРА КШАКАЙА САРВА ЛАКШМИ ПРАДАЙА САРВА ЛОКА ВАШИКА РАНАЙА КРОМ КРОМ КРОМ АМ АМ АМ КЛИМ КЛИМ КЛИМ САКА ЛАРА ДЖАМАН ДАЛАМ МАМА ВАША МАНАЙА ВАША МАНАЙА САКА ЛАВИ ШАДИ НИВАРАНАМ ККУРУ КУРУ РАМ РАМ ЗРАМ ХРИМ ХРУМ КШАМ САКАЛА БХУТА ПРЕТА ПИШАЧА БРАХМА РАКШАСА ЙАКШИНИ МОХИНИ ШУЛИНИ ЧАТУХ ШАШТИ ЙОГИ НЙАДИ САКА ЛАВЕ ТАЛА ГРАХА ШАКИНИ ДАКИНИ ВИ ДХВАМ САНАМ КУРУ КУРУ ПХРОМ ПХРОМ ПХРОМ САКА ЛАЧ ЧОРА БХАЙАМ НИВА РАЙА ТХАМ ТХАМ ТХАМ ШАТ РУМАН ДАЛАМ ДХВАМ САЙА ДХВАМ САЙА ГЛАУМ ГЛАУМ ГЛАУМ САКА ЛАВИ ГХНА НИДХВАМ САЙА НИДХВАМ САЙА САУМ ШРИМ МАМА МАНО РАДХАМ САДХА ЙАСАД ХАЙА ОМ ШРИМ ХРИМ КЛИМ ЩРИ МАХА ГАНАПАТАЙЕ ХУМ ПХАТ СВАХА
Мантра для оберегания имущества от всевозможных неприятностей, а также существенно увеличить его

ОМ АМ ХРИМ КРОМ ХРИМ ХРАХ САКА ЛАКАР ЙАКАРИ КУЛА ВРИДДХИ КАРИ ПАРА МА ДЖНАНА КАРИ МАХА БХАЙА ВИНА ШИНИ МАНО ВАНЧХИТА ДАЙИНИ ДУШТА ГРАХА НИВА РИНИ ВИДРА ВИНИ УНМА ДИНИ ДЖВАЛИНИ БХАН ДЖАНИ МОХИНИ ТРИДЖА ГАДВЙА ПИНИ БХУТА КРИТАМ КАРМА КРИТАМ ПИША ЧАКРИ ТАМ НАШАЙА НАШАЙА РАКША РАКША МАМ АЧА ЛАМ КУРУ КУРУ ХРИМ ХУМ ХУМ ХУМ ТХАМ ТХАМ ПХАТ СВАХА
Мантра для оберегания имущества от всевозможных неприятностей, а также существенно увеличить его

АХО ВИГНЕ ШВАРА МАХА ГАНЕША СПХО ТАНАЙА САРВА ВИГХНАН НАШХАЙА НАШАЙА АКАЛА МРИТЙУ ДЖА ГХАНА ДЖА ГХАНА ВАДЖРА ХАСТИН ЧХИНДИ ЧХИНДИ ПАРА ШУХА СТЕНА БХИНДИ БХИНДИ АХО ГАНА ДХИ ПАТЕ АГАЧ ЧХА ГАЧ ЧХА АВАТАР АВАТАРА ШРИ РУДРА МА ДЖНА ПАЙА СВАХА
Мантра для усиления настроя на высшие духовные планы

И

Долгое и протяжное пение звука "И" стимулирует головной мозг, гипофиз, щитовидную железу и все элементы черепа. Когда человек достаточно долго поет этот звук, он начинает ощущать радостное возбуждение. Это хорошее средство не только против плохого настроения, но и против бытового сглаза. Распевание звука "И" усиливает настрой человека на высшие духовные планы, способствует самосовершенствованию, открывает и усиливает его творческие возможности.
Мантра для очищения

А

Звук "А" - звук, дающий и отдающий энергию. Произносить его нужно так, как будто укачиваете ребенка. Долгое "А" чистит человека, снимает напряжение и дает почти такой же результат, как и покаяние, снимая с вас накопленную негативную энергию.
Мантра для повышения защиты

СИ

Когда человек напуган чем-то, звук "СИ" снимает напряжение, которое колеблет тонкие верхние оболочки нашего энергетического поля. Распевание этого звука повышает защиту от сил черной магии и негативных обстоятельств.
Мантра для наполнения мудростью

У

Звук "У" наполняет человека мудростью. Распевание звука "У" дает человеку прилив сил и энергии для активной деятельности, усиливает динамику его жизни.
Мантра для общительности

Э

Распевание этого звука делает человека коммуникабельным, усиливает сообразительность и предпреимчивость.
Мантра для благополучия

Ю

Звук "Ю" открывает новые горизонты в жизни, способствует благополучию.
Мантра для благополучия и достатка

МН

Этот звук приносит в жизнь благополучие и достаток. Его произнесение упрощает жизнь, в затруднительных ситуациях мы часто лечимся этим звуком. Вибрация этого звука хороша для программирования своей судьбы с помощью мантр и аффирмаций.
Мантра для гармонизирующего воздействия

Е

При пении звука "Е" возникает ощущение зеленого цвета. Распевание этого звука настраивает человека на чувство любви к миру и к людям, оно дает ощущение стабильности, покоя и удовлетворения, что часто используется в практиках белой магии.
Мантра для целительства и очищения

ОЕ

Это очень целебный и очищающий звук. Распевание этого звука улучшает партнерские отношения, дает выход из внутреннего тупика.
Мантра для гармонизации

О

Это главный гармонизирующий звук, который управляет временем. Слова, которые несут вибрацию звука "О" позволяют подключиться к универсальной гармонизирующей вибрации. Это один из ведущих и связующих элементов в магии и составлении заговоров.
Мантра для достижения цели

ИЯ

Этот звук благотворно действует на энергетическом плане на чакру Анахата, а на физическом плане на сердце, что позволяет использовать его в заговорах на сохранение семьи и гармонию отношений. Распевание этого звука усиливает связь с Ангелом-Хранителем, способствует более гармоничному восприятию себя в мире.
Мантра для понятия внутреннего состояния

ОЙ

Этот звук, как вой, его можно подвывать. Он структурирует внутреннюю энергетику и помогает понять внутреннее состояние в кокретный момент времени.
Мантра для защиты

МПОМ

Это энергетическая замкнутая цепочка вибраций. Распевание этого звука создает временную защиту от воздествия черной магии, помогает настоять на своем и использовать возможности настоящего момента.
Мантра для возвращения сил

ЭУОАИЫАОМ

Очень важная энергетическая цепочка, используемая в белой магии для возвращения сил и самостоятельности человеку после тяжелой порчи. Сначала надо научиться произносить эти звуки отдельно, правильно и чисто без напряжения, а затем перейти к их слитному напеванию.
Мантра для улучшения семейных отношений

НГОНГ

Распевание этого звука помогает улучшить семейные отношения и получить большую свободу в достижении цели.
Мантра для открытия астрального зрения

АУМ КАССИЯНА ХАРА ШАНАТАР

Читать 50 дней по 777 раз в сутки
Мантра для исполнения желания

ХАРЕ КРИШНА, ХАРЕ КРИШНА, КРИШНА КРИШНА, ХАРЕ ХАРЕ; ХАРЕ РАМА, ХАРЕ РАМА, РАМА РАМА, ХАРЕ ХАРЕ

Если ее петь и мечтать о каком-либо желании - оно сбудется.
Универсальная мантра для привлечения денег

АУМ НАМО ДХАНАДАЙЕ СВАХА

Эту мантру надо читать 5 раз в день. Вы будете благословлены счастьем и богатством.
Мантра для получения и сохранения богатства

АУМ ХРИМ А-СИ-А-У-САА ХРИМ НАМАХ

Эту мантру желательно произносить утром до 8 часов, количество повторений кратно 3.
Мантра для благополучия и процветания

АУМ ХРИМ ХРИМ ШРИМ КЛИМ БЛУМ КАЛИКУНДА ДАНДА СВАМИНА СИДДХИМ ДЖАГАДВАСАМ ААНАЙЯ ААНАЙЯ СВАХА

Мантра повторяется 108 раз в утренние часы до 8 часов утра. Лучший день для повторения - четверг.
Мантра для усвоения знаний

ОМ ШРИ САРАСВАТЬЯ НАМАХ

Она помогает легко усваивать знания, помогает созидать. Бодрит, омолаживает, активизирует "спящие" клетки головного мозга. Мантра оказывает целебное действие, человек меньше устает, а значит - достигает большего.
Мантра Ганеши

ОМ ШРИ МАХА ГАНАПАТАЙЕ НАМАХ

Для достижения успеха в своих начинаниях читайте эту мантру, и она дарует вам свободу в достижении цели, умиротворение, успех в делах.
Мантра для лечения заикания

ДААЗАМААТОМ 


















Мантры для здоровья
Очень сильная мантра для улучшения здоровьяСимвол здоровья

ОМ ТРЙЯМБАКАМ ЙАДЖАМАХЕ СУГАНДХИМ ПУШТИ ВАРДХАНАМ УРВАРУКАМИВА БАНДХАНАН МРИТИЙОР МУКШИЯ МАМРИТАТ

Одна из основных мантр Высшего счастья. Она наделяет здоровьем, защищает от болезней и несчастных случаев. Приносит радостное настроение, счастье, любовь, улучшает взаимоотношения. Помогает найти спутника жизни. Также полезно повторять ее для исцеления и в день рождения. Если вам нужно избавиться от болезни, то начинать мантру лучше на убывающей луне. А если просто улучшить состояние здоровья, то на возрастающей.
Мантра для здоровья

ОМ БХАЙКАНАДЗЕ БХАЙКАНАДЗЕ МАХА БХАЙКАНАДЗЕ РАТНА САМУ ГАТЭ СВАХА.

Когда принимаете лекарства, она помогает оживить лекарства и усилить их действие. Очень полезно представлять, как рассасывается болезнь, когда поете эту мантру.
Тибетская мантра для здоровья

ЧУНЕ-ДО АЛМА РУНГ-НИНТ
Мантры помогающие избавиться от страха, приобрести силы для борьбы со страхом

    ДЖАЙЯ ДЖАЙЯ ШРИ НРИСИМХА
    НИРБХАО НИРВЭР АКОЛ МОРТ

Начинать работать с мантрами лучше на убывающей луне. Читать мантры по 108 раз. Можно начать сразу обе - одну утром, другую вечером, а можно сначала первую, через месяц другую. Как лучше для вас, кроме вас никто не скажет.
Мантра очищения кармы, удачи и защиты от всех видов напастей

ОМ БХУР БХУВАХ СВАХА ТАТ СВИТУР ВАРЕНЬЯМ БХАРГО ДЭВАСЬЯ ДХИМАХИ ДХИЙО ЙО НАХ ПРАЧОДАЙЯТ
Мантра активизации мыслительных процессов

ОМ АРА ВАЗА НАГИ
Мантра защиты

ГАТЭ ГАТЭ ПОРО ГАТЭ ПОРО СОМ ГАТЭ БОДХИ СВАХА












 Мантра, исцеляющая болезни

ОМ БХАЙКАНДЗЕ БХАЙКАНДЗЕ МАХА БХАЙКАНДЗЕ РАТНА САМУ ГАТЭ СОХА

Визуализируйте, что лазурно-голубой исцеляющий свет направляется на вас с небес во время пения этой мантры. Повторяйте ее радостно, с удовольствием, по 108 раз, утром и вечером.










Мантры богатства

1) ОМ ХРИМ КЛИМ ШРИМ НАМАХ
Это мантра для ежедневного пения. Практикующий обретает богатство.

2) КЛИМ ХРИШИКЕШАЙА НАМАХ
Мантра материального богатства

3) ОМ ДРАМ ДРИМ ДРАУМ САХ ШУКРАЙЕ НАМАХ
Увеличение материального и духовного богатства.
Мантра любви и очищения

4) ОМ HАMO НАРАЙАНАЙА
Дарует радость и любовь. Мантра оживляет воду, усиливает очищающие свойства воды. Гармонизирует тело человека.
Мантра здоровья

5) ОМ БРАМ БРИМ БРАУМ САХ БУДХАЙЕ НАМАХ
Обретение удачи

6) ОМ САЧЧИДЭКАМ БРАХМА
Постижение наук, развитие интеллекта и обретение удачи.
Защита 

7) ОМ ШРИ ДУРГАЙАЙ НАМАХ ОМ ДУРГАМ ДЕВИМ САРАНАМАХАМ ПРАПАДЙЕ
Эта мантра рассеивает дурные влияния, защищает от темных сил, устраняет препятствия. Она разрушает апатию, эгоизм, дарует силу, величие и влиятельность.
Преуспевание

8) ОМ ШРИ МАХАЛАКШМИЯЙ НАМАХ
Эта мантра дарует все виды преуспевания: духовного и материального. Она приносит гармонизацию в семье. Дарует богатство, здоровье, удачу, мудрость, человечность, сострадание, смирение, добродетель, самопознание.
Особо популярные мантры

9) ОМ ШРИ МАХА ГАНАПАТАЙЕ НАМАХ

10) ОМ ШРИ ГАНЕШАЯ НАМАХ

Эти две мантры разрушают все препятствия, которые могут возникнуть на жизненном пути. Они даруют совершенство в интеллектуальной деятельности и правильное восприятие и различение людей, концепций, реального и нереального; дают познание элементов, из которых состоит мир; а также приносят успех в литературной деятельности, искусстве и коммерции.

Признаюсь, я лично читал эти мантры по 108 раз ежедневно. Они одни из самых моих любимых. Чтобы не запутаться в количестве произнесенных мантр, можно пользоваться четками. Нить моих четок насчитывает 108 бусин; 108 - священное число. 1 - символизирует Высшую энергию, Божество; 0 - совершенство Божественного творения, а 8 - вечность. Четки помогают лучше сосредоточиться на мантре и ее сути. 

Мантры и молитвы всегда лучше произносить на том языке, на котором они были созданы. Даже если Вы не понимаете ее значение. Просто вдумайтесь о том, что сохраняется связь между словами, ритмом, значением слов, музыкой. А перевод нарушает эту связь.

Повторять мантру нужно на выдохе. Обращайте внимание на артикуляцию и правильное произношение.

Слог ОМ является источником всех мантр. ОМ - самая главная из мантр. Через эту мантру происходит осознание Бога и соединение с Божественным потоком. 












!!!! Литания против страха
{{{
    I must not fear.
    Fear is the mind-killer.
    Fear is the little-death that brings total obliteration.
    I will face my fear.
    I will permit it to pass over me and through me.
    And when it has gone past I will turn the inner eye to see its path.
    Where the fear has gone there will be nothing.
    Only I will remain.
}}}
перевод:
{{{
    Я не должен бояться.
    Страх — убийца разума.
    Страх — это маленькая смерть, влекущая за собой полное уничтожение.
    Я встречусь лицом к лицу со своим страхом.
    Я позволю ему пройти через меня и сквозь меня.
    И, когда он уйдет, я обращу свой внутренний взор на его путь.
    Там, где был страх, не будет ничего.
    Останусь лишь я
}}}
сокращённо:
{{{
    Я не буду бояться.
    Страх — убийца разума.
    Я встречусь лицом к лицу со своим страхом.
    Я позволю ему пройти сквозь меня
}}}
[[Литания против страха|http://ru.wikipedia.org/wiki/%CB%E8%F2%E0%ED%E8%FF_%EF%F0%EE%F2%E8%E2_%F1%F2%F0%E0%F5%E0]]




# [[Медитация улучшает память и повышает продуктивность|http://lifehacker.ru/2012/07/13/meditaciya/]] - или [[локально|Медитация введение]] 
# [[Как приучить себя медитировать каждый день: практика двухминутной медитации|http://lifehacker.ru/2012/04/14/kak-priuchit-sebya-meditirovat-kazhdyjj-den-praktika-dvukhminutnojj-meditacii/]] - или [[локально|Медитация за две минуты]] 
# [[Укрепляем сердце и снимаем стресс с помощью медитации|http://lifehacker.ru/2012/04/04/ukreplyaem-serdce-i-snimaem-stress-s-pomoshhyu-meditacii/]] - или [[локально|Медитация о пользе]] 
# [[Техника глубокой медитации|http://lifehacker.ru/2012/07/19/deep-meditation/]] - или [[локально|Медитация глубокая]] 
# [[28 способов отдохнуть за 5 минут|http://lifehacker.ru/2012/06/25/28-sposobov-otdokhnut-za-5-minut/]] - или [[локально|отдохнуть за 5 минут]] 
# [[Как начать медитировать. Медитации для начинающих.|http://luking.ru/kak-nachat-meditirovat/]]
# [[Медитации для успокоения и концентрации|http://ktoperviy.ru/ezoterika/meditacii-dlya-uspokoeniya-i-koncentracii.html]]

[[Кайдзен|Кайдзен - японская методика против лени]]

[[Мантры]]
! Медитация улучшает память и повышает продуктивность
Мы много рассказывали [[о пользе медитации|Медитация о пользе]] (она помогает снять хронические боли и стресс, «перезагрузиться», улучшить работу мозга), а в этом посте приведём ещё один аргумент в её пользу: медитация помогает работать продуктивнее.
Недавнее исследование, проведённое в Университете Вашингтона, показало, что медитация учит работников лучше концентрироваться, помогает удерживать в голове больше рабочих деталей, оставаться энергичными и меньше подвергаться воздействию негативных эмоций.
 В исследовании приняли участие 3 группы по 12-15 участников. Первая группа в течение 8-ми недель практиковала медитацию, вторая — расслабление тела, третья группа была контрольной, они вели привычный образ жизни.
По прошествии 8 недель у участников проверили скорость и точность их работы, а также способность к многозадачной работе. Также проверили память и уровень стресса у участников.
Превзошла всех первая группа. Память у них улучшилась, они были более внимательны и менее подвержены стрессу. Третья группа начала практиковать медитацию через 8 недель после первой группы. После начала регулярных медитаций у них также стало отмечаться снижение уровня стресса. Группа, которая практиковала расслабление, как ни странно, не стала более расслабленной на работе. 
Практике медитации рекомендуется посвящать несколько часов в неделю, но даже 2 минуты в день помогут вам достичь результатов. Подробнее о том, как начать медитировать в нашей статье: [[«Как приучить себя медитировать каждый день: практика двухминутной медитации»|Медитация за две минуты]] .

[[Медитация улучшает память и повышает продуктивность|http://lifehacker.ru/2012/07/13/meditaciya/]]
! Техника глубокой медитации

Сергей Булаев, продюсер Lifehacker.ru, решил поделиться своим опытом медитации после того, как побывал на ретрите в Таиланде. Поверьте, это действительно очень интересно!
Думаю, что о медитации слышали все и при этом каждый, скорее всего, разное. Медитировать можно всего несколько минут в день, а можно уходить в специально отведенные для этого места и просветляться в течении нескольких недель. И последний вариант особо интересен, так как это можно сравнить чуть ли не с перерождением.
!! Нет ничего сложного и волшебного
Как показывает мой опыт, медитация считается чем-то волшебным, мистическим. Чем-то недоступным каждому. Чем-то, чем люди занимаются в индийских ашрамах или в залах для йоги. Это совсем не так. Медитация больше похожа на умственную зарядку, а вернее даже разрядку. Что-то вроде чистки зубов.
Медитация всего лишь тренирует способность вырываться из непрерывного потока мыслей, в который обычно погружены люди. Учит останавливать внутренний диалог. Останавливать то, что люди называют «накручиванием себя».
Огромное число техник медитации не добавляет ясности. Действительно, есть сотни способов достичь «безмыслия», от очень простых до очень сложных, и далеко не всегда люди натыкаются на простые методы. В результате у них ничего не получается, и вера в то, что это может хоть как-то работать, пропадает.
!! Моя техника
Хочу поделиться действительно простой техникой, которую я нашёл в книге, рекомендованной моим другом «Глубокая медитация», написанной неким Yogani. К сожалению, книга на английском и большинство моих друзей не могут её прочитать. Поэтому я и хочу рассказать об этой технике здесь на русском языке.
Итак, ''техника глубокой медитации''.
Скорее всего вы уже встречали слово «мантра». Оно означает слово, набор слов, или просто звуков, которые человек непрерывно повторяет. Это позволяет вытеснить из сознания другие мысли, тем самым подавив внутренний диалог. Именно с использованием мантры мы и будем медитировать.
Yogani предлагает использовать словосочетания «I AM» (айем, переводится как «я есть»). Причём предлагает работать именно с этим сочетанием, независимо от вашего родного языка, так как важен не смысл, а просто звуки. На самом деле вообще ничего не важно и вы вполне можете использовать любую другую мантру, будь то «я есть», «Родина» или «Господи помилуй».
Вам понадобится 20 минут, во время которых никто не будет вас отвлекать. Сядьте в удобное место в удобной позе. На кресло или на диван. Совсем не обязательно садиться на коврик для йоги в подмасане. Более того, я рекомендую вам этого не делать даже если вы умеете. Вам просто нужно будет расслабиться. Однако не стоит пытаться медитировать лёжа. Очень часто это приводит к погружению в сон.
Поставьте таймер или будильник на срабатывание через 20 минут. Выберите наиболее мягкий, спокойный сигнал. А можете и не ставить вовсе. Просто убедитесь, что с места, в котором вы сидите, хорошо и без лишних движений видны часы.
Закройте глаза, расслабьтесь. Вглядитесь в темноту и цветные пятна, которые будут мелькать на закрытых веках. Не волнуйтесь, вам не надо ничего там разглядеть, это просто хаотичные пятна. Сделайте пару спокойных вдохов-выдохов. Произнесите про себя вашу мантру. Прислушайтесь к внутреннему молчанию, которое наступит после этого.
Ваш мозг немедленно вернётся к размышлениям, которые пойдут своим чередом. Это нормально. Это обычное дело. Как только вы поймёте, что в вашей голове есть мысли — опять произнесите мантру. Спокойно, не торопясь. Послушайте тишину. Мозг опять вернётся к размышлениям.
Не стремитесь полностью очистить голову от мыслей. Вряд ли это у вас получится. И самое главное, не расстраивайтесь и не осуждайте себя, если вам будет казаться, что вы слишком долго не замечали, что отвлеклись от мантры. Слишком поздно не бывает. Важно заметить и произнести её, не важно когда.
У вас обязательно будут мысли «мне надоело тут сидеть», «может на сегодня хватит?». Это нормально, просто произнесите мантру про себя очередной раз.
Не надо связывать произнесение мантры с вдохами или выдохами. Не обращайте на дыхание внимание. А если обратили, просто произнесите мантру.
Возможно кто зайдёт в комнату, позвонит по телефону и вы будете вынуждены общаться. Ничего страшного, просто добавьте потраченное на это время к времени медитации.
Не нужно надеяться на какие-то результаты, просветление, понимание. Просто заниматься медитацией иногда, а лучше регулярно. Потихоньку начнут происходить изменения. Главное не ждите их :)

[[Техника глубокой медитации|http://lifehacker.ru/2012/07/19/deep-meditation/]]
! Как приучить себя медитировать каждый день: практика двухминутной медитации
В последнее время тема медитации стала попадаться мне на глаза все чаще и чаще. Я не суеверная, но это определенно знак — пора наконец-то остановиться и оглядеться не только вокруг, но и заглянуть внутрь.
Многие думают, что научиться медитации очень сложно. В чем-то они правы и проблемы действительно есть. Так как, например, мне, как холерику, крайне сложно просидеть на одном месте длительное время, полностью вытеснив из головы мысли о насущном.
Лео Бабаута в одном из своих постов на Zenhabits советует начинать с двух минут. И это действительно работает.
 Мы уже не один раз писали о тех преимуществах, которые дает медитация. Она учит фокусироваться, снимает стресс, помогает избавиться от вредных привычек, улучшает память и тренирует внимательность, улучшает самоконтроль, снижает давление, нормализирует обмен веществ, снижает частоту пульса и многое другое. 
Думаю, даже этого списка вполне достаточно для того, чтобы хотя бы попробовать. Я уже не говорю о том, что, возможно, это будет чуть ли не ваша единственная возможность побыть наедине с самим собой при соблюдении обычного бешеного ритма жизни.
!! Выделите для себя хотя бы 2 минуты в день
Этого будет вполне достаточно. Глупо было бы утверждать, что у вас нет времени на медитацию. Две минуты — это очень-очень мало! Так что никаких отмазок.
!! Создайте ритуал
Привяжите медитацию ко времени суток или к какому-нибудь действию. Например, рано утром, когда все еще спят, или во время первой чашки кофе, или во время обеда — выберите самое удобное для себя.
!! Найдите тихое место
Это может быть ваша квартира ранним утром или поздним вечером, когда вы можете быть точно уверены, что вас никто не побеспокоит. Или это может быть парк с лавочкой в каком-нибудь укромном уголке. Или любое другое тайное место, где не так людно и вы можете спокойно посидеть хотя бы несколько минут. Медитация на берегу моря или возле любого другого водоема оставляет самые приятные впечатления.
!! Сядьте поудобнее
Вы не должны сосредотачиваться на своей позе и постоянно думать о том, как же вам, все-таки, удобнее. Сядьте так, как вам удобно. Конечно, желательно при этом держать спину прямо, так что если совсем сложно, можно облокотиться на стену или сесть на стул с удобной спинкой.
!! Начинайте с малого
Начните хотя бы с двух минут. Когда почувствуете, что можете делать это дольше, постепенно увеличивайте время. Через неделю перейти к 5 минутам, через две — к 10, а через 21 день — к 15 или 20 минутам.
!! Сфокусируйтесь на дыхании
Вдох-выдох, медленно, сфокусировано. Вы должны полностью сосредоточиться на дыхании и провожать каждый вдох и выдох, чувствуя, как воздух входит в вас, наполняя легкие, и как медленно выходит. Считайте. На раз — вдох, на два — выдох. На три — вдох, на четыре — выдох. И так до десяти. Затем начните сначала.
Глаза открыты, смотрите вниз, фокус рассеян. Если с открытыми глазами вы чувствуете дискомфорт, можете закрыть их.
Не переживайте, если вы отвлеклись от дыхания на свои мысли — в первые дни это случается очень часто. Если мысль в голове все-таки появилась, обратите на нее внимание, а потом снова вернитесь к дыханию.
Со временем вы научитесь не отвлекаться на более продолжительное время.
!! Расширение границ вашей практики
Медитировать можно не только сидя сосредоточившись на дыхании. Вы можете тренировать свое сознания во время повседневной жизни. Например, во время поедания обеда, прогулки по парку или даже мытья посуды.
Не просто проглатывайте свой обед, а смакуйте его небольшими кусочками, медленно пережевывая и полностью ощущая его вкус, раскладывая на ингредиенты. 
Не просто гуляйте по парку, а созерцайте происходящее. Обратите внимание на яркие краски, на звуки и запахи. Сосредоточьтесь на своих ощущениях.
Попробуйте поэкспериментировать с чайным ритуалом, придавая значение каждому движению.
И даже во время мытья посуды вы можете не просто мыть ее, а сосредоточиться на каждом движении. Как вы это делаете, как появляется пена, как вода стекает по тарелке. Получается что-то вроде осознанной (вдумчивой) медитации.
Основная моя ошибка была в том, что я пыталась начинать сразу с 30 минут. Это было сложно и у меня либо не получалось отключить свой внутренний голос, либо я просто засыпала, что тоже не очень-то и правильно. Достигнуть правильного состояния действительно очень сложно. Но если начинать с маленьких шагов, у вас просто обязано все получиться.

[[Как приучить себя медитировать каждый день: практика двухминутной медитации|http://lifehacker.ru/2012/04/14/kak-priuchit-sebya-meditirovat-kazhdyjj-den-praktika-dvukhminutnojj-meditacii/]]
! Укрепляем сердце и снимаем стресс с помощью медитации
Заботясь о красоте своего тела, мы должны не забывать и о нашем главном моторе — о сердце. Правильное питание, кардио-тренировки и спокойствие, только спокойствие — залог здорового сердца. И если первые два пункта мы в состоянии контролировать на 99,9%, то со стрессом дело обстоит немного иначе. Мы можем тысячу раз повторять про себя, что мы не будем переживать из-за проблем на работе. Но в горячий период готовы взорваться просто от того, что кто-то случайно наступил нам на ногу в общественном транспорте.
И больше всего от подобного поведения страдает наше сердце. Встаньте утром на 10 минут раньше и проделайте описанное ниже упражнение. Оно снимает напряжение, укрепляет сердце и помогает сохранять спокойствие на протяжении всего дня.
Если совсем припекло, эту медитацию можно провести на работе в особо острые моменты, чтобы успокоиться и не сорваться на коллег или клиентов. Главное найти укромное и спокойное место на 5-10 минут.
Это упражнение разработала Сусанна Бэр, одна из основателей Института прикладной медитации в Тусоне, штат Аризона. По её словам она работала с людьми, которые с помощью этого упражнения понижали свое давление.
!! Упражнение
Сядьте прямо, спина ровно, грудь вперед, плечи опущены и отведены назад, голова прямо.
''Сосредоточьтесь.'' Закройте глаза и прочувствуйте своё дыхание. Вдох-выдох. Почувствуйте поток входящего и исходящего воздуха. Ладони можно положить на грудь в районе сердца или просто оставить их опущенными по бокам.
''Прислушайтесь к своему сердцебиению.'' Медленно вдохните, задержите на секунду дыхание и медленно выдыхайте. Если не получается услышать свое сердце, почувствуйте его пульсацию, положив ладони на грудь в районе сердца или прощупав пульс на запястье.
''Синхронизируйте дыхание.'' Позвольте вашему дыханию войти в один ритм с сердцем. Это не означает, что вы должны вдыхать и выдыхать на каждый удар. Попробуйте вдыхать в течении 8 ударов, а затем на столько же ударов продлить выдох. Продолжайте дышать в этом ритме от 5 до 10 минут.
Попробуйте проделать это упражнение утром, для того чтобы подготовиться к рабочему дню и зарядиться энергией. И вечером, чтоб очистить голову и тело от беспокойных мыслей и подготовиться ко сну. Ведь спокойный и здоровый сон также является залогом не только нашего здоровья, но и повышает нашу продуктивность.
Если вы все ещё думаете, что медитация — это занятие, более подходящее дамам, у вас есть шанс попробовать что-то новое и изменить свое мнение. Подумайте, это ведь всего 10 минут в день, а результатом могут быть дополнительные 10 лет здоровой и полноценной жизни.

[[Укрепляем сердце и снимаем стресс с помощью медитации|http://lifehacker.ru/2012/04/04/ukreplyaem-serdce-i-snimaem-stress-s-pomoshhyu-meditacii/]]
#[[Метрики кода|http://dimakudr.blogspot.ru/2010/05/blog-post_27.html]]
#[[Программный код и его метрики|http://habrahabr.ru/company/intel/blog/106082/]]
#[[Метрики Кода И Их Практическая Реализация В Subversion И Clearcase. Часть 1 - Метрики|http://cmcons.com/articles/CC_CQ/dev_metrics/mertics_part_1/]]
#[[C and C++ Code Counter|http://sourceforge.net/projects/cccc/]]
#[[Code Analyzer|http://sourceforge.net/projects/codeanalyze-gpl/]]
#[[GMetrics|http://gmetrics.sourceforge.net/gmetrics-CyclomaticComplexityMetric.html]]
#[[Cyclomatic Complexity Viewer|http://www.codeproject.com/Articles/10705/Cyclomatic-Complexity-Viewer]]
В будущем буду описывать тут свои мечты в особенности если они вдруг начнут сбываться.

# [[Город-купол]]
# [[Самодвижущаяся дорога]]
# [[Плоский водозащищённый телефон]]
# [[Транспорт будущего]]
# [[BXT]]
# [[Small Hamster]]
# [[Лунная база]]
#[[mm-3.blogspot.com|http://mm-3.blogspot.com/]] - мой маленький блог [[в браузере|FrameBrowserBS]]
#[[mm-3.livejournal.com|http://mm-3.livejournal.com/]] - я в жж [[в браузере|FrameBrowserLJ]]
#[[mm3.tiddlyspot.com|http://mm3.tiddlyspot.com/]] - моя личная wiki [[в браузере|FrameBrowserTS]]
#[[mm3.name|http://mm3.name/]] - моё первое самостоятельно детище так же можно посмотреть в  [[браузере|Mini Browser]]
#[[mm0.twitter.com|http://twitter.com/mm0]] - я в твиттере
#[[mm0.ya.ru|http://mm0.ya.ru/]] - я на яндексе
#[[mm3.tumblr.com|http://mm3.tumblr.com]] - нечто твитероподобное [[в браузере|FrameBrowserTB]]
#[[Просто ЛОР|http://www.linux.org.ru/]] - я тут обитаю [[в браузере|FrameBrowserLOR]]
#[[LinkedIn|http://www.linkedin.com]]
#[[4PDA|http://4pda.ru/forum/index.php?autocom=favtopics]] - тут тоже появляюсь [[в браузере|FrameBrowser4PDA]]
#[[Я на гуглокоде|http://code.google.com/p/mm3/]]
#[[Я на GitHub|https://github.com/mm3]]
#[[Я на Launchpad|https://launchpad.net/~mm3-b]]
#[[Я на Sourceforge|https://sourceforge.net/users/mouse166]]
#[[Я на OpenShift|http://nodetest-mm3.rhcloud.com/]]
#[[Я на Could9 IDE|https://c9.io/mm3]]
#[[Fossil репозиторий проектов|https://chiselapp.com/user/mm3/repository/mm3]]
#[[Veracity репозиторий|https://mm3.onveracity.com]]
#[[Халява TFS от мелкомягких|https://mm3.visualstudio.com/]]
#[[Домашняя страничка|http://mm3-home.no-ip.org]]

[[jsfiddle.net|http://jsfiddle.net/]]

[[RSS Reader]]

[[Самое интересное]]

[[Занимательные ссылки]]

|!заголовок левой колонки|!заголовок правой колонки|
|>| объединение ячеек по горизонтали |
| объединение ячеек по вертикали |левое выравнивание|
|~| правое выравнивание|
|bgcolor(#a0ffa0):цветовыделение| центрирование |
|Таблица|c

Эта таблица набрана так:
{{{
|!заголовок левой колонки|!заголовок правой колонки|
|>| объединение ячеек по горизонтали |
| объединение ячеек по вертикали |левое выравнивание|
|~| правое выравнивание|
|bgcolor(#a0ffa0):цветовыделение| центрирование |
|Таблица|c
}}}
Прошу не обвинять в поклонении перед Западом, я просто оставил прилагавшийся к плагину файл, это все же просто демо. Ну, перевел кое-что.
!!!!Обычные напоминания, день месяца каждый год.
*<<reminder month:1 day:1 title:"Новый Год, один из моих любимых дней" >>
*<<reminder month:2 day:2 title:"День Сурка ;)" >>

!!!!Напоминания со смещением (...день недели месяца)
*Третий понедельник февраля
**<<reminder month:2 day:15 offsetdayofweek:1 title:"Американский День Президента">>
*Второе воскресенье мая
**<<reminder month:5 day:8 offsetdayofweek:0 title:"Американский День Матери">>
*Последний понедельник мая (обратите внимание -- offsetdayofweek отрицательное число, что означает обратный отсчет)
**<<reminder month:5 day:31 offsetdayofweek:-1 title:"Memorial Day">>

!!!И просто так
*<<reminder month:4 day:1 title:"День Юмора" >>
*<<reminder month:10 day:31 title:"Хэллоуин" >>
*<<reminder month:12 day:25 title:"Католическое рождество" >>
Начало всему всегда должно быть...
#[[Hello people]] - приветствие 
#[[Android]] - мои заметки по андроиду
#[[Ссылко-концентратор]] - всякие ссылки
#[[Big XML Table]] -мой маленький проект
#[[Linux]] - заметки по линуксу
#[[ДАО]] - запись на случай просветления
#[[Бред]] - просто бред
#[[Ракета]] - как построить маленькую ракету на дому
#[[фильмы]] - что хочется скачать
#[[музыка]] - разные названия разных групп и альбомов
#[[День варенья]] - дни рождений моих близких друзей 
#[[Мечты]] - всякие разные несбыточные мечты
#[[Справка|Вики-разметка (примеры)]] - справка
#[[Mini Browser]] - проверка браузера
#[[node.js]] - node.js
#[[Шифраторы]] - проверка различных шифрующих плагинов
#[[Календарь]] - маленький календарик
#[[прочее]] - не помню
#[[Игры]] - несколько игр в которые я возможно поиграю
#[[3D-принтер]] - и всё что с ним связано
#[[конец]]

конец всему всегда будет...
Настройка карбюратора, диагностика (ВАЗ, Нива, по другим маркам не знаю): Борисычев Андрей dyukach.www.nn.ru/
Территориально на Ванеева 155, по предварительной записи, телефон 89056664816
По карбюратору, зажиганию езжу только туда

Также могу порекомендовать сервис ВиРо, находятся на Бринского в гаражах, на повороте с Бринского на Хохлова поехать прямо вниз, далее второй поворот направо. Телефон 91079З9675 Виктор. Почти три года по своей Ниве делаю там слесарные работы (подвеска, ходовая, трансмиссия), косяков не замечено, а перебрал за это время я её почти всю. Пример: на покатушках в выходные порвал передний редуктор, в понедельник в 9 утра загнал машину в бокс, в 14 уехал на готовой машине, в это время также вошел трансфер на переборку редуктора

Также могу порекомендовать -Shadow- mazurik.www.nn.ru/ по сварочным работам 
[[Как получить американский диплом бакалавра бесплатно и не выходя из дома|http://lifehacker.ru/2014/04/20/kak-poluchit-amerikanskij-diplom-bakalavra-besplatno-i-ne-vyxodya-iz-doma/]]

[[Pennsylvania State University—World Campus Online Scholarships|http://student.worldcampus.psu.edu/paying-for-your-education/scholarships-available-for-penn-state-world-campus-students?status=undergraduate]]
Один из самых лучших ВУЗов мира, Пенсильванский университет предлагает множество стипендий для обучения онлайн, включая Jane Ireland Student Fund Scholarship, Alpha Sigma Lambda, Trustee Scholarship Program, Fischer Family Scholarship for Continuing and Distance Education, Penn State Outreach Advisory Board Scholarship in the World Campus и Alexander P. Fletcher Navy Student Award. Полный список можно посмотреть на официальном сайте ВУЗа.

[[Embry-Riddle Aeronautical University—Worldwide Online Scholarships|http://worldwide.erau.edu/finance/financial-aid/scholarships/index.html]]
Отличная онлайн-площадка для образования и больше 30 миллионов долларов ежегодно на стипендии. Наиболее известная стипендия – Worldwide Scholarship для студентов с высоким потенциалом и заслугами в учебе. Дополнительная информация по поводу стипендий здесь.

[[University of Wisconsin — Online Superior Scholarships|http://www.uwsuper.edu/dl/current/scholarships.cfm]]
Этот ВУЗ также популярен среди студентов онлайн-программ своими стипендиями. Самые знаменитые из них – Educational Leadership Department Scholarships, Dean of Students Scholarships, Communicating Arts Scholarships and Distance Learning Center/UW-Superior Foundation Scholarships. Больше информации – на официальном сайте.

[[University of Illinois — Chicago Online Scholarships|http://www.wiu.edu/student_services/scholarship/]]
Также есть несколько стипендий для студентов бакалавриата онлайн-программ. Самая популярная – BGS Alumni Scholarship, которую могут получить иностранные студенты. Для уточнения всех деталей можно связаться с университетом.

[[Indiana University-Purdue University — Fort Wayne Online Scholarships|http://www.ipfw.edu/financial/]]
В Индианском университете есть несколько онлайн-программ, самые популярные из которых Bachelor of General Studies, Registered Nurse (RN) to Bachelor of Science (B.S.) и Information Systems B.S. Degree. Некоторые из них предусматривают стипендии. Детали на сайте ВУЗа.

[[Arizona State University Online Scholarships|http://asuonline.asu.edu/what-it-costs/scholarship-opportunities]]
Предлагает онлайн-программы обучения как для местных, так и иностранных студентов. Самые популярные – Bachelor of Applied Science in Health Sciences, Internet and Web development and operation management. ВУЗ также предлагает программы бакалавриата в Art History, Business and Communication, Criminal Justice and Criminology, Electrical Engineering, English, History, Liberal Studies, Nursing, Philosophy. О стипендиях можно узнать здесь.

[[University of Alabama—Huntsville Online Scholarships|http://www.uah.edu/financial-aid/aid/scholarships/gen-info]]
Здесь можно получить диплом онлайн по нескольким программам, одна из популярных –  Bachelor of Science in Nursing. Информация о стипендиях на сайте ВУЗа.

[[Daytona State College Scholarships|http://www.daytonastate.edu/online/]]
Также пользуется популярностью среди студентов онлайн-программ. Самые востребованные из них – Bachelor of Applied Science in Supervision and Management, Bachelor of Science in Engineering Technology и Bachelor of Science in Education. Стипендии здесь.

[[University of Florida Undergraduate Online Scholarships|http://www.admissions.ufl.edu/scholarships.html]]
В этом университете хорошие онлайн-программы, как бакалавриата, так и магистратуры. Некоторые из них – Bachelor of Science Interdisciplinary Studies in Environmental Management in Agriculture and Natural Resources, Bachelor of Science in Business Administration, Bachelor of Science in Health Education and Behavior, Bachelor of Science in Sport Management, Bachelor of Arts in Biology, Bachelor of Arts in Criminology & Law, Bachelor of Arts in Geology and Bachelor of Science in Psychology. Информация о стипендиях на сайте ВУЗа.



[[37 сайтов для обучения чему-то новому|http://lifehacker.ru/2015/07/23/37-sajtov-dlya-obucheniya/]]

Онлайн-курсы

    edX  — онлайн-курсы от лучших университетов мира.
    Coursera — бесплатные курсы от преподавателей лучших вузов со всего мира.
    Coursmos — подборки небольших курсов, которые не занимают много времени.
    Highbrow — ежедневная подборка лучших курсов, которая отправляется вам на почту.
    Skillshare — онлайн-курсы и проекты, которые расширяют кругозор.
    Curious — видеоуроки для улучшения профессиональных навыков.
    Lynda — курсы о технологиях, бизнесе и креативности.
    CreativeLive — бесплатные креативные курсы от мировых экспертов.
    Udemy — курсы по компьютерным специальностям.

Программирование

    Codecademy — интерактивное обучение программированию.
    Stuk.io — обучение программированию с нуля.
    Udacity — курсы от Google, Facebook, mongoDB, AT&T и других крупных компаний.
    Platzi — курсы по дизайну, маркетингу и программированию.
    Learnable — курсы по веб-разработке.
    Code School — практические задачи для обучения программированию.
    Thinkful — обучение в виртуальных классах с ментором тет-а-тет.
    Code.org — гайды по программированию для начинающих.
    BaseRails — обучение Ruby on Rails и другим веб-технологиям.
    Treehouse — разработка на HTML, CSS и приложений для iOS.
    One Month — обучение основам создания веб-приложений за месяц.
    Dash — создание веб-сайтов.

Работа с информацией

    DataCamp — онлайн-туториалы и курсы по науке о данных.
    DataQuest — интерактивное обучение науке о данных.
    DataMonkey  — улучшение аналитических навыков с помощью игры.

Языки

    Duolingo — бесплатное обучение иностранным языкам.
    Lingvist — программа обучения языку за 200 часов.
    Busuu — сообщество пользователей, которые хотят выучить новый язык.
    Memrise — карточки для расширения словарного запаса.

Кругозор

    TEDed — категория образовательных видео с конференции TED.
    Khan Academy — огромная библиотека интерактивного контента.
    Guides.co — коллекция различных гайдов.
    Learnist — текстовые и видеолекции от экспертов в разных областях.
    Prismatic — изучение нового, основываясь на ваших предпочтениях.
    Snapguide — тысячи гайдов о том, как сделать что-то своими руками.

Бонус

    Chesscademy — обучение игре в шахматы.
    Pianu — интерактивное обучение игре на фортепиано.
    Yousician — персональный учитель по игре на гитаре.
отдам в добрые руки программиста, умный, общительный, любознательный, к системам контроля версий приучен, промышленного программирования не боится, основные навыки: поиск и устранение багов и добавление новых фичь на любом языке программирования и под любую платформу.
 Памятка пользователям ssh
Серверное администрирование*, Системное администрирование*, Настройка Linux*
abstract: В статье описаны продвинутые функций OpenSSH, которые позволяют сильно упростить жизнь системным администраторам и программистам, которые не боятся шелла. В отличие от большинства руководств, которые кроме ключей и -L/D/R опций ничего не описывают, я попытался собрать все интересные фичи и удобства, которые с собой несёт ssh.

Предупреждение: пост очень объёмный, но для удобства использования я решил не резать его на части.

Оглавление:

    управление ключами
    копирование файлов через ssh
    Проброс потоков ввода/вывода
    Монтирование удалённой FS через ssh
    Удалённое исполнение кода
    Алиасы и опции для подключений в .ssh/config
    Опции по-умолчанию
    Проброс X-сервера
    ssh в качестве socks-proxy
    Проброс портов — прямой и обратный
    Реверс-сокс-прокси
    туннелирование L2/L3 трафика
    Проброс агента авторизации
    Туннелирование ssh через ssh сквозь недоверенный сервер (с большой вероятностью вы этого не знаете)


Управление ключами

Теория в нескольких словах: ssh может авторизоваться не по паролю, а по ключу. Ключ состоит из открытой и закрытой части. Открытая кладётся в домашний каталог пользователя, «которым» заходят на сервер, закрытая — в домашний каталог пользователя, который идёт на удалённый сервер. Половинки сравниваются (я утрирую) и если всё ок — пускают. Важно: авторизуется не только клиент на сервере, но и сервер по отношению к клиенту (то есть у сервера есть свой собственный ключ). Главной особенностью ключа по сравнению с паролем является то, что его нельзя «украсть», взломав сервер — ключ не передаётся с клиента на сервер, а во время авторизации клиент доказывает серверу, что владеет ключом (та самая криптографическая магия).

Генерация ключа

Свой ключ можно сгенерировать с помощью команды ssh-keygen. Если не задать параметры, то он сохранит всё так, как надо.

Ключ можно закрыть паролем. Этот пароль (в обычных графических интерфейсах) спрашивается один раз и сохраняется некоторое время. Если пароль указать пустым, он спрашиваться при использовании не будет. Восстановить забытый пароль невозможно.

Сменить пароль на ключ можно с помощью команды ssh-keygen -p.

Структура ключа

(если на вопрос про расположение ответили по-умолчанию).
~/.ssh/id_rsa.pub — открытый ключ. Его копируют на сервера, куда нужно получить доступ.
~/.ssh/id_rsa — закрытый ключ. Его нельзя никому показывать. Если вы в письмо/чат скопипастите его вместо pub, то нужно генерировать новый ключ. (Я не шучу, примерно 10% людей, которых просишь дать ssh-ключ постят id_rsa, причём из этих десяти процентов мужского пола 100%).

Копирование ключа на сервер

В каталоге пользователя, под которым вы хотите зайти, если создать файл ~/.ssh/authorized_keys и положить туда открытый ключ, то можно будет заходить без пароля. Обратите внимание, права на файл не должны давать возможность писать в этот файл посторонним пользователям, иначе ssh его не примет. В ключе последнее поле — user@machine. Оно не имеет никакого отношения к авторизации и служит только для удобства определения где чей ключ. Заметим, это поле может быть поменяно (или даже удалено) без нарушения структуры ключа.

Если вы знаете пароль пользователя, то процесс можно упростить. Команда ssh-copy-id user@server позволяет скопировать ключ не редактируя файлы вручную.

Замечание: Старые руководства по ssh упоминают про authorized_keys2. Причина: была первая версия ssh, потом стала вторая (текущая), для неё сделали свой набор конфигов, всех это очень утомило, и вторая версия уже давным давно переключилась на версии без всяких «2». То есть всегда authorized_keys и не думать о разных версиях.

Если у вас ssh на нестандартном порту, то ssh-copy-id требует особого ухищрения при работе: ssh-copy-id '-p 443 user@server' (внимание на кавычки).

Ключ сервера

Первый раз, когда вы заходите на сервер, ssh вас спрашивает, доверяете ли вы ключу. Если отвечаете нет, соединение закрывается. Если да — ключ сохраняется в файл ~/.ssh/known_hosts. Узнать, где какой ключ нельзя (ибо несекьюрно).

Если ключ сервера поменялся (например, сервер переустановили), ssh вопит от подделке ключа. Обратите внимание, если сервер не трогали, а ssh вопит, значит вы не на тот сервер ломитесь (например, в сети появился ещё один компьютер с тем же IP, особо этим страдают всякие локальные сети с 192.168.1.1, которых в мире несколько миллионов). Сценарий «злобной man in the middle атаки» маловероятен, чаще просто ошибка с IP, хотя если «всё хорошо», а ключ поменялся — это повод поднять уровень паранойи на пару уровней (а если у вас авторизация по ключу, а сервер вдруг запросил пароль — то паранойю можно включать на 100% и пароль не вводить).

Удалить известный ключ сервера можно командой ssh-keygen -R server. При этом нужно удалить ещё и ключ IP (они хранятся раздельно): ssh-keygen -R 127.0.0.1.

Ключ сервера хранится в /etc/ssh/ssh_host_rsa_key и /etc/ssh/ssh_host_rsa_key.pub. Их можно:
а) скопировать со старого сервера на новый.
б) сгенерировать с помощью ssh-keygen. Пароля при этом задавать не надо (т.е. пустой). Ключ с паролем ssh-сервер использовать не сможет.

Заметим, если вы сервера клонируете (например, в виртуалках), то ssh-ключи сервера нужно обязательно перегенерировать.

Старые ключи из know_hosts при этом лучше убрать, иначе ssh будет ругаться на duplicate key.

Копирование файлов

Передача файлов на сервер иногда может утомлять. Помимо возни с sftp и прочими странными вещами, ssh предоставляет нам команду scp, которая осуществляет копирование файла через ssh-сессию.

scp path/myfile user@8.8.8.8:/full/path/to/new/location/

Обратно тоже можно:
scp user@8.8.8.8:/full/path/to/file /path/to/put/here

Fish warning: Не смотря на то, что mc умеет делать соединение по ssh, копировать большие файлы будет очень мучительно, т.к. fish (модуль mc для работы с ssh как с виртуальной fs) работает очень медленно. 100-200кб — предел, дальше начинается испытание терпения. (Я вспомнил свою очень раннюю молодость, когда не зная про scp, я копировал ~5Гб через fish в mc, заняло это чуть больше 12 часов на FastEthernet).

Возможность копировать здорово. Но хочется так, чтобы «сохранить как» — и сразу на сервер. И чтобы в графическом режиме копировать не из специальной программы, а из любой, привычной.

Так тоже можно:

sshfs

Теория: модуль fuse позволяет «экспортировать» запросы к файловой системе из ядра обратно в userspace к соответствующей программе. Это позволяет легко реализовывать «псевдофайловые системы». Например, мы можем предоставить доступ к удалённой файловой системе через ssh так, что все локальные приложения (за малым исключением) не будут ничего подозревать.

Собственно, исключение: O_DIRECT не поддерживается, увы (это проблема не sshfs, это проблема fuse вообще).

Использование: установить пакет sshfs (сам притащит за собой fuse).

Собственно, пример моего скрипта, который монтирует desunote.ru (размещающийся у меня на домашнем комьютере — с него в этой статье показываются картинки) на мой ноут:

#!/bin/bash
sshfs desunote.ru:/var/www/desunote.ru/ /media/desunote.ru -o reconnect



Делаем файл +x, вызываем, идём в любое приложение, говорим сохранить и видим:



Параметры sshfs, которые могут оказаться важными: -o reconnect (говорит пытаться пересоединиться вместо ошибок).

Если вы много работаете с данными от рута, то можно (нужно) сделать idmap:

-o idmap=user. Работает она следующим образом: если мы коннектимся как пользователь pupkin@server, а локально работаем как пользователь vasiliy, то мы говорим «считать, что файлы pupkin, это файлы vasiliy». ну или «root», если мы коннектимся как root.

В моём случае idmap не нужен, так как имена пользователей (локальное и удалённое) совпадают.

Заметим, комфортно работать получается только если у нас есть ssh-ключик (см. начало статьи), если нет — авторизация по паролю выбешивает на 2-3 подключение.

Отключить обратно можно командой fusermount -u /path, однако, если соединение залипло (например, нет сети), то можно/нужно делать это из-под рута: sudo umount -f /path.


Удалённое исполнение кода

ssh может выполнить команду на удалённом сервере и тут же закрыть соединение. Простейший пример:

ssh user@server ls /etc/

Выведет нам содержимое /etc/ на server, при этом у нас будет локальная командная строка.

Некоторые приложения хотят иметь управляющий терминал. Их следует запускать с опцией -t:
ssh user@server -t remove_command

Кстати, мы можем сделать что-то такого вида:
ssh user@server cat /some/file|awk '{print $2}' |local_app

Это нас приводит следующей фиче:
Проброс stdin/out

Допустим, мы хотим сделать запрос к программе удалённо, а потом её вывод поместить в локальный файл

ssh user@8.8.8.8 command >my_file

Допустим, мы хотим локальный вывод положить удалённо

mycommand |scp — user@8.8.8.8:/path/remote_file

Усложним пример — мы можем прокидывать файлы с сервера на сервер: Делаем цепочку, чтобы положить stdin на 10.1.1.2, который нам не доступен снаружи:

mycommand | ssh user@8.8.8.8 «scp — user@10.1.1.2:/path/to/file»

Есть и вот такой головоломный приём использования pipe'а (любезно подсказали в комментариях в жж):

tar -c * | ssh user@server "cd && tar -x"

Tar запаковывает файлы по маске локально, пишет их в stdout, откуда их читает ssh, передаёт в stdin на удалённом сервере, где их cd игнорирует (не читает stdin), а tar — читает и распаковывает. Так сказать, scp для бедных.

Алиасы

Скажу честно, до последнего времени не знал и не использовал. Оказались очень удобными.

В более-менее крупной компании часто оказывается, что имена серверов выглядят так: spb-MX-i3.extrt.int.company.net. И пользователь там не равен локальному. То есть логиниться надо так: ssh ivanov_i@spb-MX-i3.extrt.int.company.net. Каждый раз печатать — туннельных синдромов не напасёшься. В малых компаниях проблема обратная — никто не думает о DNS, и обращение на сервер выглядит так: ssh root@192.168.1.4. Короче, но всё равно напрягает. Ещё большая драма, если у нас есть нестандартный порт, и, например, первая версия ssh (привет цискам). Тогда всё выглядит так: ssh -1 -p 334 vv_pupkin@spb-MX-i4.extrt.int.company.net. Удавиться. Про драму с scp даже рассказывать не хочется.

Можно прописать общесистемные alias'ы на IP (/etc/hosts), но это кривоватый выход (и пользователя и опции всё равно печатать). Есть путь короче.

Файл ~/.ssh/config позволяет задать параметры подключения, в том числе специальные для серверов, что самое важное, для каждого сервера своё. Вот пример конфига:

Host ric
        Hostname ооо-рога-и-копыта.рф
        User Администратор
        ForwardX11 yes
        Compression yes
Host home
        Hostname myhome.dyndns.org
        User vasya
        PasswordAuthentication no



Все доступные для использования опции можно увидеть в man ssh_config (не путать с sshd_config).

Опции по умолчанию

По подсказке UUSER: вы можете указать настройки соединения по умолчанию с помощью конструкции Host *, т.е., например:

Host *
User root
Compression yes



То же самое можно сделать и в /etc/ssh/ssh_config (не путать с /etc/ssh/sshd_config), но это требует прав рута и распространяется на всех пользователей.



Проброс X-сервера

Собственно, немножко я проспойлерил эту часть в примере конфига выше. ForwardX11 — это как раз оно.

Теория: Графические приложения в юникс обычно используют X-сервер (wayland в пути, но всё ещё не готов). Это означает, что приложение запускается и подключается к X-серверу для рисования. Иными словами, если у вас есть голый сервер без гуя и есть локальный x-сервер (в котором вы работаете), то вы можете дать возможность приложениям с сервера рисовать у вас на рабочем столе. Обычно подключение к удалённом X-серверу — не самая безопасная и тривиальная вещь. SSH позволяет упростить этот процесс и сделать его совсем безопасным. А возможность жать трафик позволяет ещё и обойтись меньшим трафиком (т.е. уменьшить утилизацию канала, то есть уменьшить ping (точнее, latency), то есть уменьшить лаги).

Ключики: -X — проброс X-сервера. -Y проброс авторизации.

Достаточно просто запомнить комбинацию ssh -XYC user@SERVER.
В примере выше (названия компании вымышленные) я подключаюсь к серверу ооо-рога-и-копыта.рф не просто так, а с целью получить доступ к windows-серверу. Безопасность microsoft при работе в сети мы все хорошо знаем, так что выставлять наружу голый RDP неуютно. Вместо этого мы подключаемся к серверу по ssh, а дальше запускаем там команду rdesktop:
ssh ric rdesktop -k en-us 192.168.1.1 -g 1900x1200

и чудо, окошко логина в windows на нашем рабочем столе. Заметим, тщательно зашифрованное и неотличимое от обычного ssh-трафика.



Socks-proxy

Когда я оказываюсь в очередной гостинице (кафе, конференции), то местный wifi чаще всего оказывается ужасным — закрытые порты, неизвестно какой уровень безопасности. Да и доверия к чужим точкам доступа не особо много (это не паранойя, я вполне наблюдал как уводят пароли и куки с помощью банального ноутбука, раздающего 3G всем желающим с названием близлежащей кафешки (и пишущего интересное в процессе)).

Особые проблемы доставляют закрытые порты. То джаббер прикроют, то IMAP, то ещё что-нибудь.

Обычный VPN (pptp, l2tp, openvpn) в таких ситуациях не работает — его просто не пропускают. Экспериментально известно, что 443ий порт чаще всего оставляют, причём в режиме CONNECT, то есть пропускают «как есть» (обычный http могут ещё прозрачно на сквид завернуть).

Решением служит socks-proxy режим работы ssh. Его принцип: ssh-клиент подключается к серверу и слушает локально. Получив запрос, он отправляет его (через открытое соединение) на сервер, сервер устанавливает соединение согласно запросу и все данные передаёт обратно ssh-клиенту. А тот отвечает обратившемуся. Для работы нужно сказать приложениям «использовать socks-proxy». И указать IP-адрес прокси. В случае с ssh это чаще всего localhost (так вы не отдадите свой канал чужим людям).

Подключение в режиме sock-proxy выглядит так:

ssh -D 8080 user@server



В силу того, что чужие wifi чаще всего не только фиговые, но и лагливые, то бывает неплохо включить опцию -C (сжимать трафик). Получается почти что opera turbo (только картинки не жмёт). В реальном сёрфинге по http жмёт примерно в 2-3 раза (читай — если вам выпало несчастье в 64кбит, то вы будете мегабайтные страницы открывать не по две минуты, а секунд за 40. Фигово, но всё ж лучше). Но главное: никаких украденных кук и подслушанных сессий.

Я не зря сказал про закрытые порты. 22ой порт закрывают ровно так же, как «не нужный» порт джаббера. Решение — повесить сервер на 443-й порт. Снимать с 22 не стоит, иногда бывают системы с DPI (deep packet inspection), которые ваш «псевдо-ssl» не пустят.

Вот так выглядит мой конфиг:

/etc/ssh/sshd_config:
(фрагмент)
Port 22
Port 443

А вот кусок ~/.ssh/config с ноутбука, который описывает vpn

Host vpn
    Hostname desunote.ru
    User vasya
    Compression yes
    DynamicForward 127.1:8080
    Port 443



(обратите внимание на «ленивую» форму записи localhost — 127.1, это вполне себе законный метод написать 127.0.0.1)


Проброс портов

Мы переходим к крайне сложной для понимания части функционала SSH, позволяющей осуществлять головоломные операции по туннелированию TCP «из сервера» и «на сервер».

Для понимания ситуации все примеры ниже будут ссылаться на вот эту схему:



Комментарии: Две серые сети. Первая сеть напоминает типичную офисную сеть (NAT), вторая — «гейтвей», то есть сервер с белым интерфейсом и серым, смотрящим в свою собственную приватную сеть. В дальнейших рассуждениях мы полагаем, что «наш» ноутбук — А, а «сервер» — Б.

Задача: у нас локально запущено приложение, нам нужно дать возможность другому пользователю (за пределами нашей сети) посмотреть на него.

Решение: проброс локального порта (127.0.0.1:80) на публично доступный адрес. Допустим, наш «публично доступный» Б занял 80ый порт чем-то полезным, так что пробрасывать мы будем на нестандартный порт (8080).

Итоговая конфигурация: запросы на 8.8.8.8:8080 будут попадать на localhost ноутбука А.

ssh -R 127.1:80:8.8.8.8:8080 user@8.8.8.8

Опция -R позволяет перенаправлять с удалённого (Remote) сервера порт на свой (локальный).
Важно: если мы хотим использовать адрес 8.8.8.8, то нам нужно разрешить GatewayPorts в настройках сервера Б.
Задача. На сервере «Б» слушает некий демон (допустим, sql-сервер). Наше приложение не совместимо с сервером (другая битность, ОС, злой админ, запреща