config.options.chkHttpReadOnly = false;\n
!1. Konfiguracja interfejsu Bluetooth\n!!Instalacja\nZainstaluj pakiety:\n{{{\n# yum install bluez-hcidump bluez-libs bluez-pin bluez-utils gnome-bluetooth nautilus-sendto-bluetooth\n}}}\n\n!!Podłączenie urządzenia do komputera\nPodłącz dongle do portu USB (w laptopach włącz połączenie bezprzewodowe odpowiednim przyciskiem).\nWykonaj:\n{{{\n$ dmesg | grep BlueZ\n}}}\ni sprawdź, czy system widzi urządzenie\n\n!!Sprawdź, jakie ID system przypisał do urządzenia:\n{{{\n$ hcitool dev\nDevices:\n hci0 00:10:20:30:40:50\n}}}\nZapamiętaj ten numer.\n\n!!Konfiguracja HCI\nW pliku {{{/etc/bluetooth/hcid.conf}}}:\n* zmień:\n{{{\n passkey "haslo";\n}}}\nlub\n{{{\n security user;\n}}}\n* zmień\n{{{\n name "Mój komputer"\n}}}\n\n!!Start serwisów\nUruchom demony {{{hcid}}} i {{{sdpd}}}\n{{{\n# /etc/init.d/bluetooth start\n}}}\n\n!!Wyszukanie urządzenia zdalnego\n{{{\n$ hcitool inq\nInquiring ...\n 00:11:22:33:44:55 clock offset: 0x46fd class: 0x580204\n$ hcitool scan\nScanning ...\n 00:11:22:33:44:55 Moja komorka\n$ hcitool info 00:11:22:33:44:55\nRequesting information ...\n BD Address: 00:11:22:33:44:55\n Device Name: Moja komorka\n LMP Version: 2.0 (0x3) LMP Subversion: 0x420b\n Manufacturer: Broadcom Corporation (15)\n Features: 0xff 0xff 0x8d 0xfe 0x9b 0xf9 0x00 0x80\n <3-slot packets> <5-slot packets> <encryption> <slot offset> \n <timing accuracy> <role switch> <hold mode> <sniff mode> \n <park state> <RSSI> <channel quality> <SCO link> <HV2 packets> \n <HV3 packets> <u-law log> <A-law log> <CVSD> <power control> \n <transparent SCO> <broadcast encrypt> <EDR ACL 2 Mbps> \n <EDR ACL 3 Mbps> <enhanced iscan> <interlaced iscan> \n <interlaced pscan> <inquiry with RSSI> <extended SCO> \n <EV4 packets> <EV5 packets> <AFH cap. slave> \n <AFH class. slave> <3-slot EDR ACL> <5-slot EDR ACL> \n <AFH cap. master> <AFH class. master> <EDR eSCO 2 Mbps> \n <EDR eSCO 3 Mbps> <3-slot EDR eSCO> <extended features> \n}}}\n\n!2. Połączenie szeregowe\n\n!!Utworzenie połączenia:\n{{{\nhcitool cc --role=m 00:11:22:33:44:55\n}}}\n''m'' - master (domyślne)\n''s'' - slave\n\n!!Wyświetlenie połączeń\n{{{\nhcitool con\n}}}\n\n!!Usunięcie połączenia\n{{{\nhcitool dc 00:11:22:33:44:55\n}}}\n\n!!Wykorzystanie połączenia\n{{{\nrfcomm connect X 00:11:22:33:44:55\n}}}\nTworzony jest port szeregowy {{{/dev/rfcommX}}}, który można otworzyć np. minicomem.\n\n!!Konfiguracja "na stałe"\nModyfikujemy plik {{{/etc/bluetooth/rfcomm.conf}}}:\n{{{\nrfcomm0 {\n # Automatically bind the device at startup\n bind yes;\n\n # Bluetooth address of the device\n device 00:11:22:33:44:55;\n\n # RFCOMM channel for the connection\n channel 1;\n\n # Description of the connection\n comment "Moja komorka";\n}\n}}}\n\n!3. Sieć\nSprawdź, czy działa interfejs:\n{{{\n# hciconfig\nhci0: Type: USB\n BD Address: 00:10:20:30:40:50 ACL MTU: 377:10 SCO MTU: 16:0\n UP RUNNING PSCAN ISCAN\n RX bytes:10583 acl:52 sco:0 events:519 errors:0\n TX bytes:35874 acl:152 sco:0 commands:40 errors:0\n}}}\nJeśli nie widzisz komunikatu {{{UP RUNNING PSCAN ISCAN}}} wykonaj\n{{{\nhciconfig hci0 up\n}}}\n...cdn.?...\n\n!4. GNOME\n!!Wyświetlenie urządzeń w zasięgu:\nUtwórz plik np. {{{/usr/local/bin/bluetooth-gnome-manager}}}:\n{{{\n#!/bin/sh\nPYTHONPATH=/usr${exec_prefix}/lib/python2.4/site-packages:$PYTHONPATH\nexport PYTHONPATH\nexec /usr/bin/python /usr${exec_prefix}/lib/python2.4/site-packages/gnomebt/manager.py\n}}}\nUruchom go.\n\n!5. Przesyłanie plików\n!!Do telefonu\nPonieważ zainstalowane jest rozszerzenie Nautilusa (pakiet {{{nautilus-sendto-bluetooth}}}) wystarczy wskazać odpowiedni plik, kliknąć prawym klawiszem myszy i wybrać "Wysłanie do...".\n\nW oknie dialogowym, które się otworzy, wybierz "Bluetooth (OBEX)", oraz urządzenie, do którego chcesz przesłać plik, a następnie kliknij "Wyślij". W telefonie pojawi się pytanie o PIN. Wpisz cztery dowolne cyfry, które potem wpiszesz w oknie dialogowym w komputerze.\n\n!!Do komputera\n* ''Start->Narzędzia systemowe->Bluetooth File Sharing'' (uruchamia {{{gnome-obex-server}}})\n* W telefonie wskaż plik, wybierz ''Wyślij do->Bluetooth''
/***\n| Name:|CloseOnCancelPlugin|\n| Description:|Closes the tiddler if you click new tiddler then cancel. Default behaviour is to leave it open|\n| Version:|6.9.3|\n| Date:|30-Sep-2006|\n| Source:|http://mptw.tiddlyspot.com/#CloseOnCancelPlugin|\n| Author:|Simon Baird <simon.baird@gmail.com>|\n| CoreVersion:|2.1.x|\n***/\n//{{{\nmerge(config.commands.cancelTiddler,{\n\n handler_orig_closeUnsaved: config.commands.cancelTiddler.handler,\n\n handler: function(event,src,title) {\n this.handler_orig_closeUnsaved(event,src,title);\n if (!store.tiddlerExists(title) && !store.isShadowTiddler(title))\n story.closeTiddler(title,true);\n return false;\n }\n\n});\n\n//}}}\n\n
//{{{\nconfig.options.chkHttpReadOnly = false; // means web visitors can experiment with your site by clicking edit\nconfig.options.chkInsertTabs = true; // tab inserts a tab when editing a tiddler\nconfig.views.wikified.defaultText = ""; // don't need message when a tiddler doesn't exist\nconfig.views.editor.defaultText = ""; // don't need message when creating a new tiddler \n//}}}\n
!Uruchomienie karty USB LAN\n[>img[http://www.slubek.top.pl/img/Davicom-USB-LAN.jpg][Karta USB LAN]]\nKarta sieciowa USB z chipem [[DM9601|http://www.davicom.com.tw/eng/products/dm9601.htm]] firmy Davicom jest tanim (na Allegro można ją kupić już za ok. 20zł) rozwiązaniem umożliwiającym korzystanie z sieci z wykorzystaniem portu USB. Jest to na pewno tańsze rozwiązanie niż zakup karty PCMCIA.\n\n!!Pierwsza próba\nTwardziele nie czytają instrukcji, dlatego pierwszym krokiem było oczywiście wetknięcie karty do portu USB. Zgodnie z przewidywaniami, system (Aurox 12) zobaczył nowe urządzenie, jednak nie potrafił go rozpoznać. Nadeszła pora na poszukanie sterowników.\n\n!!W poszukiwaniu sterowników\nZ kartą dostarczane są niestety tylko sterowniki do starszych wersji kernela (2.2.x i 2.4.x). \nDzięki Google trafiłem jednak na stronę http://alcopop.org/unix/linux/dm9601/ , której autor znalazł [[nowe sterowniki Davicom-u|http://www.silencio.ro/DM9601.GZ]] do wersji 2.6.x, trochę je poprawił i udostępnił Społeczności Linuksa pod adresem http://alcopop.org/unix/linux/dm9601/git/ .\n\n!!Kompilacja sterowników\nPobieramy [[najnowszą wersję|http://alcopop.org/unix/linux/dm9601/git/]] sterowników i zapisujemy je w oddzielnym katalogu na dysku twardym (może być np. {{{/usr/local/src/davicom}}}).\n\nJądra >=2.6.18 mają nowy mechanizm konfiguracji. Jeśli mamy takie właśnie jądro, musimy w pliku {{{dm9601.c}}} zmienić linijkę\n{{{\n#include <linux/config.h>\n}}}\nna\n{{{\n#include <linux/autoconf.h>\n}}}\n\nNastępnie wykonujemy: \n{{{\n$ sudo -s\n(wpisujemy swoje hasło - będzie niewidoczne)\n# make\n}}}\n\nPo zakończeniu kompilacji próba (adres IP przykładowy - musicie go dopasować do swojej sieci):\n{{{\n# insmod dm9601.ko\n# ifconfig eth0 192.168.1.10\n# route add default netmask 255.255.255.0 eth0\n}}}\n\n!!Zapisanie zmian\nAby system automatycznie ładował moduł po każdym restarcie, należy jeszcze zmodyfikować pliki konfiguracyjne.\n* Skopiuj plik {{{dm9601.ko}}} do katalogu {{{/lib/modules/2.6.x/kernel/drivers/net/}}}.\n* Do pliku {{{/etc/modprobe.conf}}} dodaj linijkę \n{{{\nalias eth0 dm9601\n}}}\n* Uruchom {{{system-config-networks}}} i skonfiguruj nowy port.\n\nPS. Instrukcja instalacji została przeze mnie bezczelnie ściągnięta z pliku {{{readme.txt}}} dostępnego wraz ze źródłami sterownika. Wprowadziłem jedynie kilka modyfikacji w celu umożliwienia uruchomienia karty w systemie Fedora Core 5.
[[Witaj!]]
Informacje ułatwiające tworzenie i dystrybucję oprogramowania.\n* [[SVN]] - podstawy systemu [[subversion|http://subversion.tigris.org]]\n* [[Pliki Spec]] - tworzenie plików opisujących pakiety w systemie [[RPM|http://www.rpm.org]].
!Uruchomienie karty USB WLAN\n[>img[http://www.edimax.pl/images/Image/productimage/wireless/217x205/EW-7318Ug-217x205.jpg][Karta USB WLAN]]\n\n!!Sprawdzenie\nPrzed instalacją sprawdź, czy faktycznie masz opisaną tu kartę. Włóż kartę i wykonaj:\n{{{\n# lsusb\n}}}\nJeśli widzisz poniższą linijkę,\n{{{\nBus 001 Device 002: ID 148f:2573 Ralink Technology, Corp.\n}}}\nmożesz czytać dalej.\n!!Przygotowanie\nSterownik karty wymaga obecności źródeł aktualnego jądra. Zainstaluj pakiet {{{kernel-devel}}}:\n{{{\n# yum install kernel-devel\n}}}\n\n!!Instalacja sterowników\nSterowniki dostępne są na stronie http://www.ralinktech.com.tw/Home/Support/Linux.html\n* Pobierz [[wersję|http://www.ralinktech.com.tw/data/RT73_Linux_STA_Drv1.0.4.0.tar.gz]] opisaną jako ''~RT2501USB(~RT73:~RT2571W/~RT2573/~RT2671)'', zapisz w katalogu {{{/home/uzytkownik}}}\n* Przejdź do {{{/usr/local/src}}}, rozpakuj pobrane źródła\n{{{\n# tar -xzvf /home/uzytkownik/RT73_Linux_STA_Drv1.0.4.0.tar.gz\n}}}\n* wejdź do katalogu zawierającego rozpakowane źródła, uruchom kompilację i zainstaluj sterownik:\n{{{\n# make\n# make install\n}}}\n* jeśli masz zainstalowane dwa pakiety z kernelem, sprawdź, w którym został zainstalowany sterownik:\n{{{\n# cd /lib/modules\n# find | grep rt73\n./2.6.18-8.1.1.el5/extra/rt73.ko\n# uname -r\n2.6.18-8.1.15.el5\n}}}\nJeśli wersje jądra są różne, musisz skopiować plik (znaleziony przez {{{find}}}) do katalogu, z którego korzysta aktualny kernel (identyfikowany przez {{{uname -r}}}).\n{{{\n# cp 2.6.18-8.1.1.el5/extra/rt2570.ko 2.6.18-8.1.15.el5/extra\n}}}\n\n!!Uruchomienie intefejsu\nPoinformuj jądro, że ma nowy sterownik:\n{{{\n# depmod -a\n}}}\nTeraz możesz już włożyć kartę. Będzie dostępna jako urządzenie {{{rausb0}}}. Wykonaj \n{{{\n# iwconfig rausb0\n}}}\n\n!!Konfiguracja sieci\n* W pliku {{{/etc/Wireless/RT73STA/rt73sta.dat}}} znajdź wpisy:\n{{{\nSSID=nazwa sieci\nAuthMode=WPA2PSK\nWPAPSK=haslosieciowe\n}}}\n* W pliku {{{/etc/sysconfig/network-scripts/ifcfg-rausb0}}} wpisz parametry sieci. Możesz również wykorzystać {{{system-config-network}}}.\n\n!!Instalacja w systemie [[CentOS|http://www.centos.org]]\nDla ~CentOS istnieje przygotowana paczka .rpm:\n* [[Zainstaluj|http://jazz-linux.org/tiki-index.php?page=Instalacja]] repozytorium [[JazzLinux|http://www.jazz-linux.org]]\n* Zainstaluj moduł poleceniem {{{sudo yum install kmod-rt73}}}\n!Dokumentacja\n* [[Instrukcja obsługi|http://www.edimax.pl/images/Image/manual/Wireless/EW-7318Ug/EW-7318Ug_M.pdf]]\n* [[Strona projektu OpenSource kart rt*|http://rt2x00.serialmonkey.com/wiki/index.php?title=Main_Page]]
[[MptwEditTemplate]]\n
!1. Wyszukanie tematów\n{{{\nyum search plymouth-theme\n}}}\n\n!2. Instalacja wybranego tematu\n{{{\n# yum install plymouth-theme-spinfinity\n# plymouth-set-default-theme spinfinity\n# /usr/libexec/plymouth/plymouth-update-initrd\n}}}\n\n
Artykuły opisujące instalację nietypowego sprzętu w systemach zgodnych z ~RedHat/Fedora/~CentOS\n* [[Bluetooth]] - połączenia bezprzewodowe BT\n* [[DM9601]] - karta sieciowa USB\n* [[rt2570]] - karta sieciowa USB ~WiFi
/***\n| Name:|HideWhenPlugin|\n| Description:|Allows conditional inclusion/exclusion in templates|\n| Version:|6.1.2|\n| Date:|20-Oct-2006|\n| Source:|http://mptw.tiddlyspot.com/#HideWhenPlugin|\n| Author:|Simon Baird <simon.baird@gmail.com>|\nFor use in ViewTemplate and EditTemplate. Eg\n{{{<div macro="showWhenTagged Task">[[TaskToolbar]]</div>}}}\n{{{<div macro="showWhen tiddler.modifier == 'BartSimpson'"><img src="bart.gif"/></div>}}}\n***/\n//{{{\n\nwindow.removeElementWhen = function(test,place) {\n if (test) {\n removeChildren(place);\n place.parentNode.removeChild(place);\n }\n};\n\nmerge(config.macros,{\n\n hideWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( eval(paramString), place);\n }},\n\n showWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( !eval(paramString), place);\n }},\n\n hideWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( tiddler.tags.containsAll(params), place);\n }},\n\n showWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( !tiddler.tags.containsAll(params), place);\n }},\n\n hideWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( tiddler.tags.containsAny(params), place);\n }},\n\n showWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( !tiddler.tags.containsAny(params), place);\n }},\n\n hideWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0]), place);\n }},\n\n showWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( !(store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0])), place);\n }}\n\n});\n\n//}}}\n\n
!Obsługa w Linuksie\n* kernel tworzy dla każdego joysticka plik {{{/dev/input/jsX}}} zawierający zwracane przez joystick dane\n* pakiet ''joystick'' z base CentOS zawiera programy:\n** jscal - kalibracja\n** jstest - testy\n** jsattach - podłączenie do {{{/dev/input/jsX}}} joysticka szeregowego\n!Programy mapujące zdarzenia joysticka na klawiaturę\n!! qjoypad\n* download: [[SF.net|http://qjoypad.sourceforge.net/doc/doc_index.html]]\n* aplikacja QT\n* konfiguracja okienkowa\n!! jkeys\n* download: [[svn|http://code.google.com/p/jkeys/source/checkout]]\n* aplikacja konsolowa \n* konfiguracja w pliku .xml\n* wymaga ''python-xlib'' i ''python-pygame''\n* uruchomienie przez {{{jkeys konfig.xml aplikacja}}}
/***\n|''Name:''|LegacyStrikeThroughPlugin|\n|''Description:''|Support for legacy (pre 2.1) strike through formatting|\n|''Version:''|1.0.1|\n|''Date:''|Jul 21, 2006|\n|''Source:''|http://www.tiddlywiki.com/#LegacyStrikeThroughPlugin|\n|''Author:''|MartinBudden (mjbudden (at) gmail (dot) com)|\n|''License:''|[[BSD open source license]]|\n|''CoreVersion:''|2.1.0|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n\n***/\n\n//{{{\n\n// Ensure that the LegacyStrikeThrough Plugin is only installed once.\nif(!version.extensions.LegacyStrikeThroughPlugin)\n {\n version.extensions.LegacyStrikeThroughPlugin = true;\n\nconfig.formatters.push(\n{\n name: "legacyStrikeByChar",\n match: "==",\n termRegExp: /(==)/mg,\n element: "strike",\n handler: config.formatterHelpers.createElementAndWikify\n});\n\n} // end of "install only once"\n//}}}\n
[[Początek|Witaj!]]\n<<tag Development>>\n<<tag OpenSSL>>\n<<tag SELinux>>\n<<tag Hardware>>\n<<tag Multimedia>>
/***\n| Name:|MptwLayoutPlugin|\n| Description:|A package containing templates and css for the MonkeyPirateTiddlyWiki layout|\n| Version:|6.1.2|\n| Date:|02-Oct-2006|\n| Source:|http://mptw.tiddlyspot.com/#MptwLayoutPlugin|\n| Author:|Simon Baird <simon.baird@gmail.com>|\n| CoreVersion:|2.1.x|\n!Notes\nPresumes you have TagglyTaggingPlugin installed.\n***/\n//{{{\nconfig.shadowTiddlers.GettingStarted += "\sn\snSee also MonkeyPirateTiddlyWiki.";\n\n//}}}\n\n//{{{\nmerge(config.shadowTiddlers,{\n\nMptwStyleSheet:[\n "/*{{{*/",\n "/* a contrasting background so I can see where one tiddler ends and the other begins */",\n "body {",\n " background: [[ColorPalette::TertiaryLight]];",\n "}",\n "",\n "/* sexy colours and font for the header */",\n ".headerForeground {",\n " color: [[ColorPalette::PrimaryPale]];",\n "}",\n ".headerShadow, .headerShadow a {",\n " color: [[ColorPalette::PrimaryMid]];",\n "}",\n ".headerForeground, .headerShadow {",\n " padding: 1em 1em 0;",\n " font-family: 'Trebuchet MS' sans-serif;",\n " font-weight:bold;",\n "}",\n ".headerForeground .siteSubtitle {",\n " color: [[ColorPalette::PrimaryLight]];",\n "}",\n ".headerShadow .siteSubtitle {",\n " color: [[ColorPalette::PrimaryMid]];",\n "}",\n "",\n "/* make shadow go and down right instead of up and left */",\n ".headerShadow {",\n " left: 1px;",\n " top: 1px;",\n "}",\n "",\n "/* prefer monospace for editing */",\n ".editor textarea {",\n " font-family: 'Consolas' monospace;",\n "}",\n "",\n "/* sexy tiddler titles */",\n ".title {",\n " font-size: 250%;",\n " color: [[ColorPalette::PrimaryLight]];",\n " font-family: 'Trebuchet MS' sans-serif;",\n "}",\n "",\n "/* more subtle tiddler subtitle */",\n ".subtitle {",\n " padding:0px;",\n " margin:0px;",\n " padding-left:0.5em;",\n " font-size: 90%;",\n " color: [[ColorPalette::TertiaryMid]];",\n "}",\n ".subtitle .tiddlyLink {",\n " color: [[ColorPalette::TertiaryMid]];",\n "}",\n "",\n "/* a little bit of extra whitespace */",\n ".viewer {",\n " padding-bottom:3px;",\n "}",\n "",\n "/* don't want any background color for headings */",\n "h1,h2,h3,h4,h5,h6 {",\n " background: [[ColorPalette::Background]];",\n " color: [[ColorPalette::Foreground]];",\n "}",\n "",\n "/* give tiddlers 3d style border and explicit background */",\n ".tiddler {",\n " background: [[ColorPalette::Background]];",\n " border-right: 2px [[ColorPalette::TertiaryMid]] solid;",\n " border-bottom: 2px [[ColorPalette::TertiaryMid]] solid;",\n " margin-bottom: 1em;",\n " padding-bottom: 2em;",\n "}",\n "",\n "/* make options slider look nicer */",\n "#sidebarOptions .sliderPanel {",\n " border:solid 1px [[ColorPalette::PrimaryLight]];",\n "}",\n "",\n "",\n "/* the borders look wrong with the body background */",\n "#sidebar .button {",\n " border-style: none;",\n "}",\n "",\n "/* displays the list of a tiddler's tags horizontally. used in ViewTemplate */",\n ".tagglyTagged li.listTitle {",\n " display:none",\n "}",\n ".tagglyTagged li {",\n " display: inline; font-size:90%;",\n "}",\n ".tagglyTagged ul {",\n " margin:0px; padding:0px;",\n "}",\n "",\n "/* this means you can put line breaks in SidebarOptions for readability */",\n "#sidebarOptions br {",\n " display:none;",\n "}",\n "/* undo the above in OptionsPanel */",\n "#sidebarOptions .sliderPanel br {",\n " display:inline;",\n "}",\n "",\n "/* horizontal main menu stuff */",\n "#displayArea {",\n " margin: 1em 15.7em 0em 1em; /* use the freed up space */",\n "}",\n "#topMenu br {",\n " display: none;",\n "}",\n "#topMenu {",\n " background: [[ColorPalette::PrimaryMid]];",\n " color:[[ColorPalette::PrimaryPale]];",\n "}",\n "#topMenu {",\n " padding:2px;",\n "}",\n "#topMenu .button, #topMenu .tiddlyLink, #topMenu a {",\n " margin-left: 0.5em;",\n " margin-right: 0.5em;",\n " padding-left: 3px;",\n " padding-right: 3px;",\n " color: [[ColorPalette::PrimaryPale]];",\n " font-size: 115%;",\n "}",\n "#topMenu .button:hover, #topMenu .tiddlyLink:hover {",\n " background: [[ColorPalette::PrimaryDark]];",\n "}",\n "",\n "/* make it print a little cleaner */",\n "@media print {",\n " #topMenu {",\n " display: none ! important;",\n " }",\n " /* not sure if we need all the importants */",\n " .tiddler {",\n " border-style: none ! important;",\n " margin:0px ! important;",\n " padding:0px ! important;",\n " padding-bottom:2em ! important;",\n " }",\n " .tagglyTagging .button, .tagglyTagging .hidebutton {",\n " display: none ! important;",\n " }",\n " .headerShadow {",\n " visibility: hidden ! important;",\n " }",\n " .tagglyTagged .quickopentag, .tagged .quickopentag {",\n " border-style: none ! important;",\n " }",\n " .quickopentag a.button, .miniTag {",\n " display: none ! important;",\n " }",\n "}",\n "/*}}}*/",\n ""\n].join("\sn"),\n\nMptwPageTemplate:[\n "<!--{{{-->",\n "<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>",\n " <div class='headerShadow'>",\n " <span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;",\n " <span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>",\n " </div>",\n " <div class='headerForeground'>",\n " <span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;",\n " <span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>",\n " </div>",\n "</div>",\n "<!-- horizontal MainMenu -->",\n "<div id='topMenu' refresh='content' tiddler='MainMenu'></div>",\n "<!-- original MainMenu menu -->",\n "<!-- <div id='mainMenu' refresh='content' tiddler='MainMenu'></div> -->",\n "<div id='sidebar'>",\n " <div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>",\n " <div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>",\n "</div>",\n "<div id='displayArea'>",\n " <div id='messageArea'></div>",\n " <div id='tiddlerDisplay'></div>",\n "</div>",\n "<!--}}}-->",\n ""\n].join("\sn"),\n\nMptwViewTemplate:[\n "<!--{{{-->",\n "",\n "<div class='toolbar'>",\n " <span macro=\s"showWhenTagged systemConfig\s">",\n " <span macro=\s"toggleTag systemConfigDisable . '[[disable|systemConfigDisable]]'\s"></span>",\n " </span>",\n " <span style=\s"padding:1em;\s"></span>",\n " <span macro='toolbar closeTiddler closeOthers +editTiddler deleteTiddler undoChanges permalink references jump newHere newJournalHere'></span>",\n "</div>",\n "",\n "<div class=\s"tagglyTagged\s" macro=\s"tags\s"></div>",\n "",\n "<div class='titleContainer'>",\n " <span class='title' macro='view title'></span>",\n " <span macro=\s"miniTag\s"></span>",\n "</div>",\n "",\n "<div class='subtitle'>",\n " <span macro='view modifier link'></span>,",\n " <span macro='view modified date [[DD-mmm-YY]]'></span>",\n " (<span macro='message views.wikified.createdPrompt'></span>",\n " <span macro='view created date [[DD-mmm-YY]]'></span>)",\n "</div>",\n "",\n "<div macro=\s"showWhenExists ViewPanelTemplate\s">[[ViewPanelTemplate]]</div>",\n "",\n "<div macro=\s"hideWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')\s">",\n " <div class='viewer' macro='view text wikified'></div>",\n "</div>",\n "<div macro=\s"showWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')\s">",\n " <div class='viewer'><pre macro='view text'></pre></div>",\n "</div>",\n "",\n "<div macro=\s"showWhenExists ViewDashboardTemplate\s">[[ViewDashboardTemplate]]</div>",\n "",\n "<div class=\s"tagglyTagging\s" macro=\s"tagglyTagging\s"></div>",\n "",\n "<!--}}}-->",\n ""\n].join("\sn"),\n\nMptwEditTemplate:[\n "<!--{{{-->",\n "<div class=\s"toolbar\s" macro=\s"toolbar +saveTiddler closeOthers -cancelTiddler deleteTiddler\s"></div>",\n "<div class=\s"title\s" macro=\s"view title\s"></div>",\n "<div class=\s"editLabel\s">Title</div><div class=\s"editor\s" macro=\s"edit title\s"></div>",\n "<div class=\s"editLabel\s">Tags</div><div class=\s"editor\s" macro=\s"edit tags\s"></div>",\n "<div class=\s"editorFooter\s"><span macro=\s"message views.editor.tagPrompt\s"></span><span macro=\s"tagChooser\s"></span></div>",\n "<div macro=\s"showWhenExists EditPanelTemplate\s">[[EditPanelTemplate]]</div>",\n "<div class=\s"editor\s" macro=\s"edit text\s"></div>",\n "<!--}}}-->",\n ""\n].join("\sn"),\n\nMonkeyPirateTiddlyWiki:[\n "[[MonkeyPirateTiddlyWiki|http://mptw.tiddlyspot.com]] is a distribution of [[TiddlyWiki|http://www.tiddlywiki.com/]] created by Simon Baird. See [[the web site|http://mptw.tiddlyspot.com/]] for more information.",\n "!!Upgrading ~MonkeyPirateTiddlyWiki",\n "This \s"empty\s" ~MonkeyPirateTiddlyWiki file comes pre-installed with the core ~MonkeyPirateTiddlyWiki plugins. You can upgrade these core plugins to the latest version by doing the following:",\n "* Click ImportTiddlers",\n "* Click \s"Choose...\s" and select \s"~MptwUpgradeURL\s"",\n "* Click \s"fetch\s"",\n "* Click the checkbox in the first column heading to select all tiddlers",\n "* Click \s"More actions...\s" and select \s"Import these tiddlers\s"",\n "* Click \s"OK\s" to confirm you want to overwrite the tiddlers",\n "* Save and reload",\n ""\n].join("\sn")\n\n});\n//}}}\n
For upgrading directly from tiddlyspot. See [[ImportTiddlers]].\nURL: /proxy/mptw.tiddlyspot.com/upgrade.html\n
For upgrading. See [[ImportTiddlers]].\nURL: http://mptw.tiddlyspot.com/upgrade.html\n
Artykuły opisujące wykorzystanie Linuksa jako stanowiska multimedialnego\n* [[Obsługa MIDI]] - wykorzystanie narzędzi konsolowych ALSA do odtwarzania i rejestracji danych MIDI.
/***\n| Name:|NewHerePlugin|\n| Description:|Creates the new here and new journal toolbar commands|\n| Version:|6.1.6|\n| Date:|06-Oct-2006|\n| Source:|http://mptw.tiddlyspot.com/#NewHerePlugin|\n| Author:|Simon Baird <simon.baird@gmail.com>|\n| CoreVersion:|2.1.x|\nTo use edit your ViewTemplate and add newHere to the toolbar div, eg\n{{{<div class='toolbar' macro='toolbar ... newHere'></div>}}}\nNote: would be good if we could do this instead some day\n{{{<<newTiddler tag:{{tiddler.title}} label:'new here'>>}}}\n***/\n//{{{\nmerge(config.commands,{\n\n newHere: {\n text: 'new here',\n tooltip: 'Create a new tiddler tagged as this tiddler',\n hideReadOnly: true,\n handler: function(e,src,title) {\n if (!readOnly) {\n clearMessage();\n var t=document.getElementById('tiddler'+title);\n story.displayTiddler(t,config.macros.newTiddler.title,DEFAULT_EDIT_TEMPLATE);\n story.setTiddlerTag(config.macros.newTiddler.title, title, 0);\n story.focusTiddler(config.macros.newTiddler.title,"title"); // doesn't work??\n return false;\n }\n }\n },\n\n newJournalHere: {\n //text: 'new journal here', // too long\n text: 'new journal',\n hideReadOnly: true,\n dataFormat: 'DD MMM YYYY', // adjust to your preference\n //dataFormat: 'YYYY-0MM-0DD', \n tooltip: 'Create a new journal tiddler tagged as this tiddler',\n handler: function(e,src,title) {\n if (!readOnly) {\n clearMessage();\n var now = new Date();\n var t=document.getElementById('tiddler'+title);\n var newtitle = now.formatString(this.dataFormat)\n story.displayTiddler(t,newtitle,DEFAULT_EDIT_TEMPLATE);\n story.setTiddlerTag(newtitle, title, 0);\n story.focusTiddler(newtitle,"title");\n return false;\n }\n }\n }\n\n});\n//}}}\n
!Sprawdzenie obecności karty zawierającej kanały MIDI\n{{{\n$ aplaymidi -l\n Port Client name Port name\n 14:0 Midi Through Midi Through Port-0\n 24:0 E-MU XMidi1X1 E-MU XMidi1X1 MIDI 1\n}}}\n!Odtwarzanie pliku\n{{{\n$ aplaymidi -p 24:0 plik.mid\n}}}\n!Rejestracja pliku z klawiatury muzycznej\n{{{\n$ arecordmidi -p 24:0 plik.mid\n^C\n}}}\n!Programowanie MIDI\n* Informacje o interfejsie są dostępne w {{{/proc/asound/*}}};\n* Komunikaty MIDI wysyłane są do (i odczytywane z) pseudopliku {{{/dev/snd/midiCxDy}}}.
Różne opcje do wpisania w {{{/etc/default/grub}}}. Pamiętać, aby po modyfikacjach konfiguracji grub2 wygenerować ponownie plik konfiguracyjny:\n{{{\n# grub2-mkconfig -o /boot/grub2/grub.cfg\n}}}\n\n!1. Wyłączenie ~IPv6\n{{{\nGRUB_CMDLINE_LINUX="ipv6.disable=1 ...\n}}}\n\n!2. Klasyczne nazwy interfejsów sieciowych\n{{{\nGRUB_CMDLINE_LINUX="... net.ifnames=0 biosdevname=0"\n}}}\nUWAGA! Pamiętać o zmianie nazwy {{{/etc/sysconfig/network-scripts/ifcfg-***}}} np. na {{{ifcfg-eth0}}}\n\n!3. Wybór tematu graficznego\n!!3.1 Instalacja paczki\n{{{\n# yum install grub2-starfield-theme\n}}}\n!!3.2 Modyfikacja {{{/etc/default/grub}}}\n{{{\nGRUB_THEME="/usr/share/grub/themes/starfield/theme.txt"\n}}}\n\n!4. Instalacja dual boot z Windows 7\n* utworzyć plik {{{/etc/grub.d/15_windows7}}}\n{{{\n#! /bin/sh -e\necho "Adding Windows 7" >&2\ncat <<EOF\nmenuentry "Windows 7" {\nset root=(hd0,1)\nchainloader +1\n}\nEOF\n}}}\n* nadać mu uprawnienia {{{+x}}}
Artykuły opisujące w niniejszym serwisie sposoby wykorzystania biblioteki [[OpenSSL|http://www.openssl.org]] to:\n* OpenSSL-CA - utworzenie Ośrodka Certyfikacji (CA - Certificate Authority)\n* OpenSSL-WWW - utworzenie, podpisanie i konfiguracja certyfikatu dla serwerów (WWW, poczta)\n* OpenSSL-poczta - utworzenie i podpisanie certyfikatu do podpisywania poczty w programie Mozilla Thunderbird
!Tworzenie struktury CA\nUtworzenie własnego Ośrodka Certyfikacji (''CA'' - ''Certificate Authority'') umożliwi własnoręczne podpisywanie certyfikatów. ''CA'' mają np. takie firmy jak Thawte i Verisign - ich certyfikaty są domyślnie instalowane w przeglądarkach jako zaufane. Certyfikat naszego CA będzie rozpoznawany jako zaufany tylko w naszym systemie. \n\n!!Edycja parametrów CA\nW pliku konfiguracyjnym {{{/etc/pki/tls/openssl.cnf}}} warto zmienić następujące parametry:\n* w sekcji {{{[ CA_default ]}}}\n{{{\ndir = /etc/pki/CA\nprivate_key = $dir/private/cakey.pem # The private key\n}}}\nPrzed '#' musi być spacja!\n* w sekcji {{{[ req_distinguished_name ]}}}\n{{{\ncountryName_default = PL\nstateOrProvinceName_default = Mazowieckie\nlocalityName_default = Warszawa\n0.organizationName_default = Nazwa instytucji\norganizationalUnitName_default = Nazwa jednostki w instytucji\n}}}\nOczywiście, musisz podać swoje prawdziwe dane lokalizacyjne.\n\n!!Utworzenie CA oraz wygenerowanie certyfikatu i klucza CA\n* Sposób "ręczny"\n{{{\nmkdir /etc/pki/CA/certs\nmkdir /etc/pki/CA/crl\nmkdir /etc/pki/CA/newcerts\ntouch /etc/pki/CA/index.txt\necho '01' > /etc/pki/CA/serial\ncd /etc/pki/CA\nexport OPENSSL_CONF=/etc/pki/tls/openssl.cnf\nopenssl req -x509 -newkey rsa -out cacert.pem -outform PEM -days 1825\nmv privkey.pem private/cakey.pem\n}}}\n* Skryptem\nMożna skorzystać ze skryptu CA znajdującego się w /etc/pki/tls/misc/, musimy mu jedynie poprawić zmienną CATOP:\n{{{\nexport CATOP=/etc/pki/CA\n}}}\nWykonujemy:\n{{{\ncd /etc/pki/tls/misc\n./CA -newca\n}}}\nPodczas generowania podajemy hasło dla CA (nie wolno go zapomnieć!) oraz opis certyfikatu - wartości domyślne skonfigurowaliśmy wcześniej. Musimy dodać adres email administratora. Jako "Common Name" można podać adres strony www instytucji.\nKlucz prywatny CA zapisany jest w {{{$CATOP/CA/private/cakey.pem}}}, a certyfikat w {{{cacert.pem}}}\nJeśli chcemy udostępnić nasz certyfikat innym użytkownikom (i spowodować, że nasze strony będą uznawane przez ich oprogramowanie za zaufane) możemy skopiować plik {{{cacert.pem}}} do katalogu serwera www:\n{{{\ncp cacert.pem /var/www/html/cacert.crt\n}}}\nPo wskazaniu adresu {{{http://serwer/cacert.crt}}} przeglądarka umożliwi zaimportowanie certyfikatu naszego CA i określenie go jako zaufanego. Od tej pory usługi wykorzystujące podpisane przez nas certyfikaty będą uznawane za zaufane.\n\n''UWAGA! Zaimportowanie certyfikatu CA i określenie go jako zaufanego powinno być wykonywane tylko wtedy, gdy jesteśmy absolutnie pewni co do uczciwości osoby znającej hasło CA''. \nW przeciwnym wypadku można wyobrazić sobie sytuację, w której nieuczciwy admin generuje certyfikat np. banku internetowego, podpisuje go swoim, zaufanym certyfikatem CA i podsuwa go nam w ataku typu [[Man In The Middle|http://pl.wikipedia.org/wiki/Man_in_the_middle]].
!Wygenerowanie klucza dla serwera\n* Bez hasła\n{{{\nopenssl genrsa -out nazwa.key 1024\n}}}\n* Z hasłem\n{{{\nopenssl genrsa -des3 -out nazwa.key 1024\n}}}\nMusisz pamiętać, że gdy serwer (np. Apache) będzie korzystał z klucza prywatnego z hasłem, podczas startu musi zapytać o hasło, aby odszyfrować tym kluczem certyfikat. Jeśli chcemy usunąć hasło z klucza, aby pytania nie było, wykonujemy:\n{{{\nopenssl rsa -in nazwa_pass.key -out nazwa.key\n}}}\nPonowne ustawienie hasła to\n{{{\nopenssl rsa -in nazwa.key -des3 -out nazwa_pass.key\n}}}\nJest to rozwiązanie mniej bezpieczne, ale wygodniejsze.\n\n!Wygenerowanie żądania podpisania certyfikatu (CSR)\n* Ręczne\n{{{\nopenssl req -new -key domena.key -out domena.csr\n}}}\n* Skryptem\n{{{\n./CA -newreq\n}}}\nJako CN (Common Name) podajemy nazwę zabezpieczanego serwera - np. {{{www.domena.pl}}} dla www, {{{imap.domena.pl}}} dla serwera pocztowego imap, {{{pop3.domena.pl}}} dla serwera ~POP3 etc.\nUtworzony plik {{{newreq.pem}}} zawiera zarówno klucz prywatny dla serwera, jak i prośbę o podpisanie certyfikatu (CSR). W przypadku podpisywania przez zewnętrzne CA trzeba wysłać tylko treść certyfikatu. Klucz prywatny musi pozostać tajny - można go zapisać do oddzielnego pliku.\n\n!Podpisanie certyfikatu w naszym CA\nŻeby własnoręcznie podpisać certyfikat musimy mieć zainstalowaną strukturę katalogów OpenSSL-CA\n{{{\nopenssl ca -in newreq.pem -out server_crt.pem\n}}}\nUtworzony plik {{{server_crt.pem}}} zawiera podpisany certyfikat. Ten plik trzeba wskazać w konfiguracji serwera pocztowego, httpd etc.\n\n!Uwagi\n* Aby przeglądarka nie alarmowała, że certyfikat strony www został podpisany przez nieznaną instytucję, należy zaimportować do niej certyfikat naszego CA. W tym celu udostępniamy na stronie plik {{{cacert.pem}}} jako plik z rozszerzeniem {{{.crt}}} - otwarcie go w przeglądarce rozpocznie proces importu certyfikatu. Zanim to jednak zrobisz, zobacz uwagę zamieszczoną pod koniec artykułu OpenSSL-CA .\n\n!Gdzie w Polsce można kupić certyfikat\n* http://www.gigaone.pl\n* http://www.neo.pl
!Konfiguracja poczty (Mozilla Thunderbird)\n!!Wygenerowanie pary klucz/request\n{{{\nopenssl req -newkey rsa:1024 -keyout tempkey.pem -keyform PEM -out tempreq.pem -outform PEM\n}}}\nOtrzymany plik {{{tempkey.pem}}} zawiera wygenerowany klucz prywatny. W pliku {{{tempreq.pem}}} znajduje się request, który ma zostać podpisany.\n\nJeśli mamy utworzony [[Ośrodek Certyfikacji|OpenSSL-CA]], możemy podpisać request:\n{{{\n[root]# openssl ca -in tempreq.pem -out email_crt.pem\nUsing configuration from /etc/pki/tls/openssl.cnf\nEnter pass phrase for /etc/pki/CA/private/cakey.pem:\nDEBUG[load_index]: unique_subject = "yes"\nCheck that the request matches the signature\nSignature ok\nCertificate Details:\n Serial Number: 3 (0x3)\n Validity\n Not Before: Nov 26 20:11:11 2006 GMT\n Not After : Nov 25 20:11:11 2008 GMT\n Subject:\n countryName = PL\n stateOrProvinceName = Mazowieckie\n organizationName = Rafal Slubowski - dom\n commonName = rafal@******.***.pl\n emailAddress = rafal@******.***.pl\n X509v3 extensions:\n X509v3 Basic Constraints:\n CA:FALSE\n Netscape Comment:\n OpenSSL Generated Certificate\n X509v3 Subject Key Identifier:\n E2:90:8E:F2:79:26:E5:A8:95:AB:B6:10:7B:BB:50:FD:6D:62:7C:EC\n X509v3 Authority Key Identifier:\n keyid:7E:81:13:BB:32:CF:9A:B4:21:DA:7F:78:19:18:5D:CF:00:28:D6:CC\n DirName:/C=PL/ST=Mazowieckie/L=Janowek Pierwszy/O=Rafal Slubowski - dom/CN=www.slubek.waw.pl/emailAddress=rafal@******.***.pl\n serial:8C:A2:6F:4B:0B:66:6F:F4\n\nCertificate is to be certified until Nov 25 20:11:11 2008 GMT (730 days)\nSign the certificate? [y/n]:y\n\n\n1 out of 1 certificate requests certified, commit? [y/n]y\nWrite out database with 1 new entries\nData Base Updated\n}}}\nMusimy to zrobić jako root, gdyż w przeciwnym razie nie będziemy mieć dostępu do plików CA niezbędnych do podpisania.\n\nCertyfikat poczty dla Mozilla Thunderbird musi być zapisany w pliku o formacie PKC#12, my mamy podpisany w formacie PEM. Musimy więc go skonwertować:\n{{{\nopenssl pkcs12 -export -name "Imię Nazwisko" -in email_crt.pem -inkey tempkey.pem -out email.p12\nEnter pass phrase for tempkey.pem:\nEnter Export Password:\nVerifying - Enter Export Password:\n}}}\nJako pierwsze podajemy hasło podane podczas tworzenia klucza prywatnego (tempkey.pem).\nDrugie hasło to hasło niezbędne do zaimportowania klucza do Thunderbirda.\n\n!Import certyfikatów do Thunderbirda\n!!Import certyfikatu CA\n* Pobieramy plik {{{cacert.crt}}} udostępniony na naszym serwerze [[CA|OpenSSL-CA]]\n* Importujemy go w Mozilla Thunderbird: {{{Edycja|Preferencje}}}, sekcja {{{Prywatność}}}, zakładka {{{Zabezpieczenia}}}, przycisk {{{Wyświetl certyfikaty}}}. Wchodzimy na zakładkę {{{Ośrodki certyfikacji}}} i klikamy przycisk {{{Importuj}}}. Wskazujemy pobrany plik i zgadzamy się na to, żeby certyfikat tego CA identyfikował użytkowników poczty.\n[img[http://www.slubek.top.pl/img/importCA.png]] \nNa tym etapie musimy również podać hasło importu.\n* W menagerze certyfikatów wchodzimy na zakładkę {{{Twoje certyfikaty}}} i importujemy certyfikat z podpisanego pliku {{{email.p12}}}\n!Podpisanie e-maila\nPodczas tworzenia e-maila wybieramy z menu Thunderbirda {{{Opcje}}}|{{{Zabezpieczenia wiadomości}}}|{{{Podpisz cyfrowo tę wiadomość}}}\n!Weryfikacja podpisu\nWiadomość zawierająca podpis elektroniczny identyfikowana jest ikonką [img[http://www.slubek.top.pl/img/ZweryfikowanyPodpis1.png]]\nPo kliknięciu na tej ikonce możemy zweryfikować certyfikat, którym podpisano wiadomość.\n[img[http://www.slubek.top.pl/img/ZweryfikowanyPodpis2.png]]\n
[[MptwPageTemplate]]\n
Zachowanie jądra Linuksa możemy zmienić podając mu odpowiednie parametry.\n\nMożemy to zrobić np. w celu:\n* poinformowania jądra o sprzęcie, którego nie jest ono w stanie samo rozpoznać,\n* sprawdzenia przyczyn, dla których system pracuje błędnie,\n* wymuszenia konkretnej konfiguracji sprzętowej.\n\n!Jak podawać parametry\nTuż po uruchomieniu, gdy [[grub|Grub]] wyświetli ekran graficznego wyboru systemu operacyjnego, klawiszami kursora wskaż Linux. Jeśli nie widzisz menu wyboru systemu, tzn. że albo zdefiniowano tylko jeden system, albo menu jest ukryte. Przyciśnięcie klawisza kursora spowoduje pokazanie menu.\n\nPo wyborze systemu, wciśnij klawisz ''e'' - uruchomi się tryb edycji parametrów. Zobaczysz coś takiego:\n{{{\n root (hd0,0)\n kernel /vmlinuz-2.6.16.2 ro root=/dev/hda5 quiet rhgb resume2=swap:/dev/ hda3\n initrd /initrd-2.6.16.2.img\n}}}\nWskaż linijkę zaczynającą się od ''kernel'' i znowu naciśnij ''e'' - wejdziesz w tryb edycji parametrów jądra.\n\n* ''kernel'' - informuje bootloader, że ta linijka zawiera opis jądra i jego parametrów\n* ''/vmlinuz-2.6.16.2'' - to nazwa pliku zawierającego jądro\n* reszta tej linijki to parametry jądra, które chcemy zmienić.\n\n!Najważniejsze parametry jądra\n\n|!Parametr|!Znaczenie|!Przykład|\n|{{{root=}}}|Partycja root systemu|{{{root=/dev/hda1}}}|\n|{{{ro}}}/{{{rw}}}|Tryb wstępnego montowania partycji root||\n|{{{init=}}}|Nazwa pliku zawierającego proces startowy. Domyślnie {{{/sbin/init}}}. Podanie liczby oznacza, że init ma ją potraktować jako numer poziomu uruchamiania systemu ([[runlevel|Runlevel]]). Jeśli więc podczas instalacji wybrałeś start w trybie graficznym i chcesz wymusić tryb tekstowy, wpisz <tt>init=3</tt>. Definicja poszczególnych poziomów uruchamiania (wraz z opisem) zawarta jest w pliku <tt>/etc/inittab</tt>.|{{{init=/bin/bash}}}|\n|{{{initrd=}}}|Nazwa pliku zawierającego ramdysk startowy. Parametr ten stosowany jest w przypadku dwufazowego startu.|{{{initrd=/boot/initrd.img}}}|\n|{{{single}}}|Uruchomienie systemu w trybie single||\n|{{{mem=rozmiar K|M|G}}}|Poinformowanie kernela, że ma wykorzystywać tylko podaną ilość pamięci|{{{mem=128M}}}|\n|{{{vga=tryb}}}|Uruchomienie systemu w podanym trybie graficznym|{{{vga=792}}}|\n|{{{video=sterownik}}}|Nazwa sterownika, który ma być wykorzystany do uruchomienia trybu graficznego|{{{video=vesafb:ywrap}}}|\n|{{{panic=sekundy}}}|Standardowo po wystąpieniu błędu __kernel panic__ system się zawiesza i wymaga ręcznego restartu. Parametr {{{panic}}} umożliwia określenie czasu po jakim nastąpi restart automatyczny.|{{{panic=10}}}|
Like most wikis, TiddlyWiki supports a range of simplified character formatting:\n| !To get | !Type this |h\n| ''Bold'' | {{{''Bold''}}} |\n| --Strikethrough-- | {{{--Strikethrough--}}} |\n| __Underline__ | {{{__Underline__}}} (that's two underline characters) |\n| //Italic// | {{{//Italic//}}} |\n| Superscript: 2^^3^^=8 | {{{2^^3^^=8}}} |\n| Subscript: a~~ij~~ = -a~~ji~~ | {{{a~~ij~~ = -a~~ji~~}}} |\n| @@highlight@@ | {{{@@highlight@@}}} |\n| ~OpenSSL (bez odnośnika)| {{{~OpenSSL}}} |\n| [img[http://www.slubek.top.pl/img/smash.gif]] | {{{[img[http://www.slubek.top.pl/img/smash.gif]]}}} |\n<<<\nThe highlight can also accept CSS syntax to directly style the text:\n@@color:green;green coloured@@\n@@background-color:#ff0000;color:#ffffff;red coloured@@\n@@text-shadow:black 3px 3px 8px;font-size:18pt;display:block;margin:1em 1em 1em 1em;border:1px solid black;Access any CSS style@@\n<<<\n\n//For backwards compatibility, the following highlight syntax is also accepted://\n{{{\n@@bgcolor(#ff0000):color(#ffffff):red coloured@@\n}}}\n@@bgcolor(#ff0000):color(#ffffff):red coloured@@\n\n
Podczas pisania plików spec można wykorzystać różne sztuczki. Oto niektóre z nich.\n\n__Opis nagłówka__\n{{{\nBuildRoot: %{_tmppath}/rpm-%{name}-%{version}\nSummary(pl): Blablabla\n}}}\nBudowa niektórych pakietów zależna jest od {{{xorg-x11-devel}}}:\n{{{\nBuildRequires: xorg-x11-devel\n}}}\nW Fedora Core nie ma takiego pakietu. Jego funkcję pełni {{{libX11-devel}}}, powyższą linijkę należy wobec tego zmienić na:\n{{{\nBuildRequires: libX11-devel\n}}}\n\n__Pakiety__\n{{{\n%package -n %{name}-doc\nSummary: Description\nSummary(pl): Opis\nGroup: Grupa\n\n%description -n %{name}-doc\nDescription of package\n\n%description -n %{name}-doc -l pl\nOpis pakietu\n}}}\n\n__Zmienne__\n{{{\n%{_tmppath}\n%{_builddir}\n%{buildroot}\n}}}\n\n__Użyteczne makra__\n\n* %makeinstall - nie podawać parametrów (DESTDIR), rpmbuild sam je sobie doda.\n* %setup -q - ciche rozpakowanie (tar) \n** -D - nie kasuj katalogu przed rozpakowaniem źródeł\n** -n - nazwa katalogu w którym będzie budowany pakiet (najpierw jest kasowany) potrzebne tylko jeśli jest inny niż {{{%{name}-%{version} }}}\n** -c - utwórz katalog {{{BUILD/%{name}-%{version} }}} przed rozpakowaniem w nim plików.\n** -T - nie rozpakowuj źródeł 0.\n** -a 1 - rozpakuj źródła 1 po wejściu do katalogu BUILD (nazwa=wersja).\n** -b 0 - rozpakuj źródła 0 przed wejściem do katalogu BUILD\n* %patchx -p1 -b .nazwa - patch plikiem {{{pakiet-nazwa.patch}}}\n{{{\npatch -p1 -b --suffix .nazwa -s\n}}}\n\n__Polecenia__\n{{{\n%{__make}\n%{__rm}\n%{__install}\n%{__mkdir}\n%{__chmod}\n%{__python}\n%{__perl}\n}}}\n\n__Przykładowe sekcje__\n{{{\n%clean\n[ "%{buildroot}" != "/" ] && %{__rm} -rf %{buildroot}\n\n%prep\n%setup -q \n\n%build\n%configure\n%{__make}\n\n%install\n[ "%{buildroot}" != "/" ] && %{__rm} -rf %{buildroot}\n%makeinstall\n}}}\n\n__Pliki__\n{{{\n%files\n%defattr(-,root,root)\n%dir /etc/pakiet\n%config(noreplace) /etc/pakiet/konfig\n%(_sbindir)/*\n%(_bindir)/*\n%(_mandir)/*/*\n%(_libdir)/*\n%(_datadir)/* (/usr/share)\n}}}\n{{{\n%files -n %{name}-doc\n%doc README\n}}}\n\n__Pliki w pakiecie pythona__\nInstalując moduły pythona można skorzystać z ułatwienia {{{distutils}}}:\n{{{\n%install\npython setup.py install --optimize 2 --root=$RPM_BUILD_ROOT --record=INSTALLED_FILES\n}}}\nDzięki temu, {{{setup.py}}} zapisze listę instalowanych plików do {{{INSTALLED_FILES}}}.\nMożna ją będzie później wykorzystać:\n{{{\n%files -f INSTALLED_FILES\n}}}\nNiestety, distutils z python-2.4.3-8.~FC5 kompilując tworzy jedynie pliki {{{*.pyc}}}. Tymczasem rpmbuild w wersji 4.4.2-15.2 również zawiera skrypt kompilujący bytecode ({{{/usr/lib/rpm/brp-python-bytecompile}}}), jednakże tworzy on zarówno pliki zwykłe ({{{.pyc}}}) jak i zoptymalizowane ({{{.pyo}}}). Ponieważ {{{INSTALLED_FILES}}} nie zawiera informacji o plikach zoptymalizowanych, nie są one brane pod uwagę podczas tworzenia pakietu i proces budowania się wysypuje z komunikatem o znalezieniu zainstalowanych, ale niespakietowanych plików {{{.pyo}}}.\n\nRozwiązań jest kilka:\n* modyfikacja makra {{{/usr/lib/rpm/brp-python-bytecompile}}} - tak, aby nie tworzyło plików zoptymalizowanych,\n* dodanie {{{%{_libdir}/python%{python_version}/site-packages/%{name}/*o}}} do sekcji {{{%files}}},\n* dodanie opcji {{{--optimize 2}}}, dzięki której distutils skompilują również pliki {{{.pyo}}}\n\n__Różne__\n* Warunek na architektury\n{{{\n%ifarch %{ix86} %{ia64}\n bleble\n%endif\n}}}\n\n* Konfiguracja warunkowa\n{{{\n%configure \n %{?without_mp3:--without-mp3} \s\n %{!?with_musepack:--without-musepack}\n}}}\n\n* Warunkowe wykonywanie poleceń\n{{{\n%define baza mysql\n...\n%if %{?baza:mysql}\nconfigure --with-mysql\n%endif\n}}}\n\n* Wymuszenie architektury\n{{{\nBuildarch: noarch\n}}}\nArchitekturę można również wymusić uruchamiając {{{rpmbuild}}} z parametrem {{{--target}}}:\n{{{\nrpmbuild -ba --target=i686 plik.spec\n}}}\n\n* Definicje zmiennych\nZmienne takie jak ~SOURCE1 można wykorzystać np. tak:\n{{{\nSource1: foo-%{VERSION}\n...\ntar -xzf %{SOURCE1}\n}}}\n\nJeśli w pliku .spec znajdują się definicje zmiennych, np.:\n{{{\n%if %{?builtin_libs:0}%{!?builtin_libs:1}\n%define builtin_libs 0\n%endif\n}}}\nmożna ją wymusić w trakcie budowania:\n{{{\nrpmbuild -ba --define 'builtin_libs 1'\n}}}
!Instalacja PostgreSQL w Windows\n!!Pobranie plików\nPliki instalacyjne wersji 8.2.5:\n* [[postgresql-8.2.5-1.zip|http://wwwmaster.postgresql.org/download/mirrors-ftp?file=%2Fbinary%2Fv8.2.5%2Fwin32%2Fpostgresql-8.2.5-1.zip]]\n* [[postgresql-8.2.5-1.zip.sig|http://wwwmaster.postgresql.org/download/mirrors-ftp?file=%2Fbinary%2Fv8.2.5%2Fwin32%2Fpostgresql-8.2.5-1.zip.sig]]\n!!Instalacja\n* Rozpakuj plik {{{postgresql-8.2.5-1.zip}}}\n* Uruchom rozpakowany plik {{{postgresql-8.2.msi}}}\nUWAGA! Windows potrafi "wejść" do archiwum jak do katalogu. Jednakże nie da się uruchomić instalatora w takim archiwum - pliki muszą być rozpakowane.\n\n!!Konfiguracja\nPostgreSQL może być uruchamiany na dwa sposoby:\n* jako serwis NT\n* jako aplikację\nW przypadku, gdy chcemy uruchamiać go jako serwis, będzie uruchamiany zawsze, niezależnie od tego, czy będziemy go wykorzystywać, czy nie. Możemy również uruchamiać go jako aplikację skryptami startowymi. W przypadku wyboru takiej metody, tworzone są w menu startowym skróty:\n* {{{Start database}}}\n* {{{Stop database}}}\nNiestety, skróty te przewidują uruchamianie serwera z bazą w katalogu domyślnym {{{c:\sProgram Files\sPostgreSQL\s8.2\sdata}}}. Jeśli chcemy zmienić położenie plików bazy, musimy te skrypty zmodyfikować.\n!!!Inicjalizacja bazy\nZakładam, że pliki bazy chcemy trzymać na partycji {{{D:}}} w katalogu {{{PostgreSQL\sdata}}}. \n* Zaloguj się jako zwykły użytkownik.\n* Wpisz w linii poleceń:\n{{{\n"C:\sProgram Files\sPostgreSQL\s8.2\sbin\sinitdb.exe" -D "D:\sPostgreSQL\sdata\s"\n}}}\n\n!!!Uruchamianie bazy\nWe właściwościach skrótu {{{Start database}}} wpisz w linii {{{Element docelowy}}}:\n{{{\n"C:\sProgram Files\sPostgreSQL\s8.2\sbin\spg_ctl.exe" start -l "D:\sPostgreSQL\spostgreSQL.log" -s -D "D:\sPostgreSQL\sdata\s"\n}}}\n\n!!!Zatrzymywanie bazy\nWe właściwościach skrótu {{{Stop database}}} wpisz w linii {{{Element docelowy}}}:\n{{{\n"C:\sProgram Files\sPostgreSQL\s8.2\sbin\spg_ctl.exe" stop -D "D:\sPostgreSQL\sdata\s"\n}}}\n\n!!!Przeładowywanie bazy\nWe właściwościach skrótu {{{Reload configuration}}} wpisz w linii {{{Element docelowy}}}:\n{{{\n"C:\sProgram Files\sPostgreSQL\s8.2\sbin\spg_ctl.exe" reload -D "D:\sPostgreSQL\sdata\s"\n}}}\n
Utworzyć plik {{{~/.gtkrc-2.0}}}:\n{{{\ngtk-menu-popup-delay = 0\n}}}
!Instalacja\n{{{\n$ sudo -s\n# createlang plpythonu -U user bazadanych\n}}}\n!Definiowanie funkcji\n{{{\nCREATE FUNCTION pymax (a integer, b integer)\n RETURNS integer\nAS $$\n if a > b:\n return a\n return b\n$$ LANGUAGE plpythonu;\n}}}\n
/***\n| Name:|QuickOpenTagPlugin|\n| Description:|Changes tag links to make it easier to open tags as tiddlers|\n| Version:|6.1.1|\n| Date:|01-Oct-2006|\n| Source:|http://mptw.tiddlyspot.com/#QuickOpenTagPlugin|\n| Author:|Simon Baird <simon.baird@gmail.com>|\n| CoreVersion:|2.1.x|\n***/\n//{{{\nconfig.quickOpenTag = {\n\n dropdownChar: (document.all ? "\su25bc" : "\su25be"), // the little one doesn't work in IE\n\n createTagButton: function(place,tag,excludeTiddler) {\n // little hack so we can to <<tag PrettyTagName|RealTagName>>\n var splitTag = tag.split("|");\n var pretty = tag;\n if (splitTag.length == 2) {\n tag = splitTag[1];\n pretty = splitTag[0];\n }\n \n var sp = createTiddlyElement(place,"span",null,"quickopentag");\n createTiddlyText(createTiddlyLink(sp,tag,false),pretty);\n \n var theTag = createTiddlyButton(sp,config.quickOpenTag.dropdownChar,\n config.views.wikified.tag.tooltip.format([tag]),onClickTag);\n theTag.setAttribute("tag",tag);\n if (excludeTiddler)\n theTag.setAttribute("tiddler",excludeTiddler);\n return(theTag);\n },\n\n miniTagHandler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var tagged = store.getTaggedTiddlers(tiddler.title);\n if (tagged.length > 0) {\n var theTag = createTiddlyButton(place,config.quickOpenTag.dropdownChar,\n config.views.wikified.tag.tooltip.format([tiddler.title]),onClickTag);\n theTag.setAttribute("tag",tiddler.title);\n theTag.className = "miniTag";\n }\n },\n\n allTagsHandler: function(place,macroName,params) {\n var tags = store.getTags();\n var theDateList = createTiddlyElement(place,"ul");\n if(tags.length == 0)\n createTiddlyElement(theDateList,"li",null,"listTitle",this.noTags);\n for (var t=0; t<tags.length; t++) {\n var theListItem = createTiddlyElement(theDateList,"li");\n var theLink = createTiddlyLink(theListItem,tags[t][0],true);\n var theCount = " (" + tags[t][1] + ")";\n theLink.appendChild(document.createTextNode(theCount));\n var theDropDownBtn = createTiddlyButton(theListItem," " +\n config.quickOpenTag.dropdownChar,this.tooltip.format([tags[t][0]]),onClickTag);\n theDropDownBtn.setAttribute("tag",tags[t][0]);\n }\n },\n\n // todo fix these up a bit\n styles: \n"/*{{{*/\sn"+\n"/* created by QuickOpenTagPlugin */\sn"+\n".tagglyTagged .quickopentag, .tagged .quickopentag \sn"+\n" { margin-right:1.2em; border:1px solid #eee; padding:2px; padding-right:0px; padding-left:1px; }\sn"+\n".quickopentag .tiddlyLink { padding:2px; padding-left:3px; }\sn"+\n".quickopentag a.button { padding:1px; padding-left:2px; padding-right:2px;}\sn"+\n"/* extra specificity to make it work right */\sn"+\n"#displayArea .viewer .quickopentag a.button, \sn"+\n"#displayArea .viewer .quickopentag a.tiddyLink, \sn"+\n"#mainMenu .quickopentag a.tiddyLink, \sn"+\n"#mainMenu .quickopentag a.tiddyLink \sn"+\n" { border:0px solid black; }\sn"+\n"#displayArea .viewer .quickopentag a.button, \sn"+\n"#mainMenu .quickopentag a.button \sn"+\n" { margin-left:0px; padding-left:2px; }\sn"+\n"#displayArea .viewer .quickopentag a.tiddlyLink, \sn"+\n"#mainMenu .quickopentag a.tiddlyLink \sn"+\n" { margin-right:0px; padding-right:0px; padding-left:0px; margin-left:0px; }\sn"+\n"a.miniTag {font-size:150%;} \sn"+\n"#mainMenu .quickopentag a.button \sn"+\n" /* looks better in right justified main menus */\sn"+\n" { margin-left:0px; padding-left:2px; margin-right:0px; padding-right:0px; }\sn" + \n"#topMenu .quickopentag { padding:0px; margin:0px; border:0px; }\sn" +\n"#topMenu .quickopentag .tiddlyLink { padding-right:1px; margin-right:0px; }\sn" +\n"#topMenu .quickopentag .button { padding-left:1px; margin-left:0px; border:0px; }\sn" +\n"/*}}}*/\sn"+\n "",\n\n init: function() {\n // we fully replace these builtins. can't hijack them easily\n window.createTagButton = this.createTagButton;\n config.macros.allTags.handler = this.allTagsHandler;\n config.macros.miniTag = { handler: this.miniTagHandler };\n config.shadowTiddlers["QuickOpenTagStyles"] = this.styles;\n if (store)\n store.addNotification("QuickOpenTagStyles",refreshStyles);\n else\n config.notifyTiddlers.push({name:"QuickOpenTagStyles", notify: refreshStyles});\n }\n\n}\n\nconfig.quickOpenTag.init();\n\n//}}}\n
/***\n| Name:|RenameTagsPlugin|\n| Description:|Allows you to easily rename or delete tags across multiple tiddlers|\n| Version:|6.1.18|\n| Date:|18-Oct-2006|\n| Source:|http://mptw.tiddlyspot.com/#RenameTagsPlugin|\n| Author:|Simon Baird <simon.baird@gmail.com>|\n| CoreVersion:|2.1.x|\nRename a tag and you will be prompted to rename it in all its tagged tiddlers.\n***/\n//{{{\nconfig.renameTags = {\n\n prompts: {\n rename: "Rename the tag '%0' to '%1' in %2 tidder%3?",\n remove: "Remove the tag '%0' from %1 tidder%2?"\n },\n\n removeTag: function(tag,tiddlers) {\n store.suspendNotifications();\n for (var i=0;i<tiddlers.length;i++) {\n store.setTiddlerTag(tiddlers[i].title,false,tag);\n }\n store.resumeNotifications();\n store.notifyAll();\n },\n\n renameTag: function(oldTag,newTag,tiddlers) {\n store.suspendNotifications();\n for (var i=0;i<tiddlers.length;i++) {\n store.setTiddlerTag(tiddlers[i].title,false,oldTag); // remove old\n store.setTiddlerTag(tiddlers[i].title,true,newTag); // add new\n }\n store.resumeNotifications();\n store.notifyAll();\n },\n\n storeMethods: {\n\n saveTiddler_orig_renameTags: TiddlyWiki.prototype.saveTiddler,\n\n saveTiddler: function(title,newTitle,newBody,modifier,modified,tags,fields) {\n if (title != newTitle) {\n var tagged = this.getTaggedTiddlers(title);\n if (tagged.length > 0) {\n // then we are renaming a tag\n if (confirm(config.renameTags.prompts.rename.format([title,newTitle,tagged.length,tagged.length>1?"s":""])))\n config.renameTags.renameTag(title,newTitle,tagged);\n\n if (!this.tiddlerExists(title) && newBody == "")\n // dont create unwanted tiddler\n return null;\n }\n }\n return this.saveTiddler_orig_renameTags(title,newTitle,newBody,modifier,modified,tags,fields);\n },\n\n removeTiddler_orig_renameTags: TiddlyWiki.prototype.removeTiddler,\n\n removeTiddler: function(title) {\n var tagged = this.getTaggedTiddlers(title);\n if (tagged.length > 0)\n if (confirm(config.renameTags.prompts.remove.format([title,tagged.length,tagged.length>1?"s":""])))\n config.renameTags.removeTag(title,tagged);\n return this.removeTiddler_orig_renameTags(title);\n }\n\n },\n\n init: function() {\n merge(TiddlyWiki.prototype,this.storeMethods);\n }\n}\n\nconfig.renameTags.init();\n\n//}}}\n\n
!Jak diagnozować problemy z SELinux\n!!1. Wstęp\nW nowoczesnych systemach zabezpieczenia oferowane przez standardowe mechanizmy Unixa (atrybuty plików) przestają wystarczać. Nie umożliwiają np. zablokowania superużytkownikowi dostępu do pewnych plików. Jest to o tyle istotne, że z uprawnieniami root-a działa spora większość usług udostępnianych w sieci. Usługi te może zdalnie wykorzystać włamywacz do zrealizowania np. ataku przepełnienia bufora, a co za tym idzie, uzyskać dostęp do wszystkich plików w systemie.\n\nSELinux jest rozszerzeniem jądra umożliwiającym dokładniejsze określenie, które procesy mają mieć dostęp do jakich plików.\n\n!!2. Problem\nW przypadku błędnego określenia uprawnień, niektóre aplikacje mogą działać niestabilnie. Najprostszą metodą sprawdzenia, czy to SELinux jest przyczyną problemów jest wyłączenie go. \n\nKonfiguracja SELinux w systemach RedHat/CentOS/[[Fedora]] znajduje się w pliku {{{/etc/selinux/config}}}. Aby wyłączyć SELinux należy ustawić tam zmienną\n{{{\nSELINUX=permissive\n}}}\ni ponownie uruchomić system. Innym sposobem jest podanie [[parametru startowego kernela|SELinux - parametry kernela]].\n\nOczywiście nie rozwiązuje to problemu, dlatego po zdiagnozowaniu, które uprawnienia są ustawione błędnie, należy z powrotem ustawić \n{{{\nSELINUX=enforcing\n}}}\n\nJeśli po wyłączeniu SELinux problemy przestają się pojawiać, mamy dużą szansę, że właśnie on był przyczyną.\n\n!!3. Określenie kontekstu, z którym wykonywany jest proces\n1 znalezienie numeru procesu\n{{{\n$ ps ax | grep smb\n640 ? Ss 0:00 smbd -D\n645 ? S 0:00 smbd -D\n}}}\n2 znalezienie kontekstu\n{{{\n$ ls --context /proc | grep 640\ndr-xr-xr-x root root root:system_r:smbd_t 640\n}}}\n\nWidać, że proces smb działa z kontekstem {{{root:system_r:smbd_t}}}\n\n!!4 Sprawdzenie kontekstu plików\n...\n!Warto przeczytać\nIlość informacji podanych powyżej jest oczywiście ograniczona. Jeśli chcesz dowiedzieć się czegoś więcej, poczytaj:\n* [[SELinux HOWTHO|http://www.lurking-grue.org/selinuxHOWTO.html]]\n* [[SELinux for Dummies|http://7thguard.net/news.php?id=5020]]\n* [[SELinux Gentoo Handbook (pl)|http://www.gentoo.org/proj/pl/hardened/selinux/selinux-handbook.xml?style=printable]]
!selinux=0\n\nCałkowite wyłączenie mechanizmów SELinux. Skrypty startowe odnotują to i utworzą plik {{{./autorelabel}}}. Spowoduje to, że po najbliższym restarcie z włączonym SELinux automatycznie zostaną odtworzone konteksty systemu plików. Wynika to z tego, że z wyłączonym SELinux'em tworzone pliki nie uzyskują kontekstu, a więc byłyby traktowane jak {{{file_t}}}.\n\n!enforcing=0\n\nUstawienie tego parametru spowoduje start w trybie ''permissive''. Umożliwia to start (i analizę problemu) w sytuacji, gdy maszyna nie uruchamia się w trybie ''enforcing''. W trybie ''permissive'' zamiast blokowania dostępu do plików takie nieudane próby są jedynie logowane.\n\n!autorelabel=1\n\nTen parametr wymusi ponowne nadanie kontekstów systemowi plików. Działa tak samo jak {{{touch /.autorelabel; reboot}}}.\n\n(Według: http://danwalsh.livejournal.com/10972.html)
!Wstęp\nTworzenie modułów SELinux jest niezbędne wtedy, gdy system z włączonymi (zobacz [[SELinux - diagnostyka]]) mechanizmami SELinux działa niepoprawnie. Jeśli nie wiesz, czym jest SELinux, nawet nie próbuj brać się za tworzenie modułów - możesz spowodować, że cała idea SELinux weźmie w łeb ze względu np. na zbyt szeroko zdefiniowane w module uprawnienia.\n\nNajwygodniejszą metodą analizowania zdarzeń związanych z bezpieczeństwem jest wykorzystanie [[systemu audytów|audit]].\n\n!Przygotowania\n* Upewnij się, że działasz jako root\n* Utwórz katalog, w którym będą zapisywane moduły:\n{{{\nmkdir /root/selinux\ncd ~/selinux\n}}}\n\n!Wyizolowanie problemu\n* Przełącz system w tryb ''permissive'': \n{{{\nsetenforce 0\n}}}\n* Wykonaj akcję, która powoduje problemy\n* Sprawdź, co jest przyczyną problemu:\n{{{\naudit2why < /var/log/audit/audit.log\n}}}\n* Pobierz z logu audytu tylko te linijki, które są faktycznie efektem błędów:\n{{{\ngrep "df\s" " /var/log/audit/audit.log > df.log\n}}}\n* Sprawdź, czy pobrane linijki faktycznie zawierają błędy do poprawienia\n{{{\ncat df.log\ntype=AVC msg=audit(1201507141.504:38): avc: denied { getattr } for pid=3851 comm="df"\n name="/" dev=hda1 ino=5 scontext=system_u:system_r:logwatch_t:s0-s0:c0.c1023 \ntcontext=system_u:object_r:unlabeled_t:s0 tclass=filesystem\n}}}\n* Zbuduj moduł\n{{{\naudit2allow -M logwatchdf -l -i df.log\n}}}\n* Sprawdź, czy na pewno treść modułu zawiera to, co chcesz udostępnić?\n{{{\ncat logwatchdf.te \n\nmodule logwatchdf 1.0;\n\nrequire {\n type unlabeled_t;\n type logwatch_t;\n class filesystem getattr;\n}\n\n#============= logwatch_t ==============\nallow logwatch_t unlabeled_t:filesystem getattr;\n}}}\n* Ponownie włącz tryb ''enforcing''\n{{{\nsetenforce 1\n}}}\n* Załaduj moduł\n{{{\nsemodule -i logwatchdf.pp\n}}}\n\nŹródło: [http://fedorasolved.org/security-solutions/selinux-module-building/]
!Repozytorium\n!!Tworzenie repozytorium\n{{{\n# svnadmin create /katalog/zawierający/repozytorium\n# chown -R apache. /katalog/zawierający/repozytorium\n}}}\n\n!!Konfiguracja serwera apache\nKonfiguracja modułu mod_dav:\n{{{\n<Location />\n DAV svn\n SVNParentPath /katalog/zawierający\n # SVNIndexXSLT /svnindex.xsl\n\n # Limit write permission to list of valid users.\n <LimitExcept GET PROPFIND OPTIONS REPORT>\n # Require SSL connection for password protection.\n # SSLRequireSSL\n\n AuthType Basic\n AuthName "Repozytorium Subversion"\n AuthUserFile /etc/httpd/conf.d/svnpasswd\n Require user uzytkownik_z_dostepem_rw\n </LimitExcept>\n</Location>\n}}}\n\n!Praca z kopią roboczą\nKopia robocza jest zwykłym katalogiem, w którym oprócz plików projektu znajdują się ukryte katalogi {{{.svn}}} zawierające niezbędne dla systemu [[subversion|http://subversion.tigris.org/]] opisy plików.\n!!Pobranie aktualnej wersji z repozytorium\n{{{\n svn checkout http://adres.serwera/repozytorium\n}}}\n\n!!Aktualizacja wersji z repozytorium\nNie trzeba podawać parametrów serwera - są zapisane w katalogu {{{.svn}}}\n{{{\n svn update\n}}}\n\n!!Dodanie pliku do repozytorium\n{{{\n svn add nazwapliku\n}}}\n\n!!Uaktualnienie zmian w repozytorium\n{{{\n svn commit\n}}}\nUwaga: Każda zmiana w repozytorium powinna być opisana. Opis podajemy jako parametr {{{-m "Opis wprowadzonych zmian"}}}. Możemy również zdefiniować zmienną środowiskową {{{EDITOR}}} określającą nasz ulubiony edytor tekstu, który zostanie wywołany w celu opisania tych zmian.
samouczki
Linux
[[MptwStyleSheet]]\n
Każdy serwer udostępniający usługę ssh narażony jest na próby ataku metodą Brute Force. To jest oczywiste.\n\nOczywiste jest również, że dobrze zabezpieczony serwer nie powinien zezwalać na zalogowanie przy pomocy hasła, a jedynie z wykorzystaniem kluczy SSH. Co więcej, dobrze jest w ogóle nie zezwalać na połączenia z nieautoryzowanych numerów IP. Co jednak robić z delikwentami próbującymi zalogować się na nie swój serwer? Można oczywiście blokować ich pakiety, jednak lepiej trochę utrudnić im próby znalezienia niezabezpieczonego serwera.\n\nUżyjemy do tego [[TARPIT-a|http://en.wikipedia.org/wiki/Tarpit_(networking)]]. Jak to działa?\n\n!Trzyetapowe potwierdzanie\nMaszyna ''A'' inicjując połączenie wysyła tzw. pakiet ''SYN'' ("może byśmy pogadali?"). Komputer docelowy (''B'') odpowiada pakietem ''SYN/ACK'' ("ok, możemy pogadać"). ''A'' otwiera odpowiednie porty komunikacyjne i wysyła pakiet ''ACK'' ("no to zaczynam transmisję") i rozpoczyna wysyłanie danych. Ten proces zestawiania połączenia TCP określany jest jako [[Three Way Handshaking|http://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment]].\n\nTARPIT polega na tym, że po wysłaniu pakietu ''SYN/ACK'' nasza maszyna nie otwiera żadnych portów, ale po prostu zapomina o całej sprawie. Niczego nieświadomy atakujący wysyła do nas tymczasem dane, które mają mu umożliwić włamanie. Ponieważ nie mamy informacji o takim połączeniu, nie przyjmujemy od niego żadnych pakietów. Również pakietów zawierających prośby o zakończenie połączenia. Żeby zakończyć nawiązane połączenie, atakujący musi odczekać pewien czas, albo przerwać program nawiązujący połączenie. Ponieważ większość tego typu ataków wykonywana jest automatycznie (przez robaki/skanery portów) negatywnie wpływa to na ich prędkość działania.\n\n!Jak to uzyskać\nNiestety, standardowe jądra dystrybucyjne nie dają możliwości kierowania ruchu do "targetu" TARPIT. Jeśli masz jądro w wersji 2.4.x skorzystaj z [[patch-o-matic|http://www.collaborium.org/onsite/benin/docs/services/NETFILTER_RELATED/netfilter-extensions/netfilter-extensions-HOWTO-2.html]]. W przypadku jąder z serii 2.6.x, pobierz plik [[tarpit-for-2.6.16.patch|http://www.slubek.waw.pl/linux/tarpit-for-2.6.16.patch]]. Nałóż łatkę na jądro:\n{{{\n# cd /usr/src\n# patch -p0 < tarpit-for-2.6.16.patch\n}}}\na następnie skompiluj kernel.\n\n!Konfiguracja\n!!Shorewall\nPonieważ Shorewall nie obsługuje patch-o-matic, musisz zmodyfikować plik {{{/etc/shorewall/start}}} - dopisz:\n{{{\n# Definicja łańcucha TARPIT\nrun_iptables -N DEST_TARPIT\nrun_iptables -A DEST_TARPIT -j LOG --log-prefix "Shorewall:net2all:TARPIT:"\nrun_iptables -A DEST_TARPIT -p tcp -j TARPIT\n# ssh\nrun_iptables -I net2fw 9 -d Twoj.zewnetrzny.Numer.IP -m tcp -p tcp --dport ssh -j DEST_TARPIT\n}}}\nA do pliku {{{/etc/shorewall/rules}}} dopisz\n{{{\n# - SSH\nSSH/ACCEPT net:Zaufany.numer.IP fw\n}}}\n!!Iptables\nDo pliku {{{/etc/sysconfig/iptables}}} dopisz:\n{{{\n:DEST_TARPIT - [0:0]\n...\n-A net2fw -s Zaufany.Numer.IP -p tcp -m tcp --dport 22 -j ACCEPT\n-A INPUT -d Twoj.zewnetrzny.Numer.IP -p tcp -m tcp --dport 22 -j DEST_TARPIT\n}}}\nDzięki temu wszystkie połączenia, które nie pochodzą z zaufanego serwera (Zaufany.Numer.IP) będą tarpitowane.\n\nOczywiście, oprócz ssh możesz tarpitować również i inne usługi. Spróbuj, a zobaczysz, ilu łosi próbuje dostać się np. na port VNC (5900), czy do SQL Server-a (1433) {{{:^)}}}
/***\n| Name:|TagglyTaggingPlugin|\n| Description:|tagglyTagging macro is a replacement for the builtin tagging macro in your ViewTemplate|\n| Version:|6.1.5|\n| Date:|05-Oct-2006|\n| Source:|http://mptw.tiddlyspot.com/#TagglyTaggingPlugin|\n| Author:|Simon Baird <simon.baird@gmail.com>|\n| CoreVersion:|2.1.x|\n!Notes\nSee http://mptw.tiddlyspot.com/#TagglyTagging\n***/\n//{{{\nconfig.taggly = {\n\n // for translations\n lingo: {\n labels: {\n asc: "\su2191", // down arrow\n desc: "\su2193", // up arrow\n title: "title",\n modified: "modified",\n created: "created",\n show: "+",\n hide: "-",\n normal: "normal",\n group: "group",\n commas: "commas",\n sitemap: "sitemap",\n numCols: "cols\su00b1", // plus minus sign\n label: "Tagged as '%0':"\n },\n\n tooltips: {\n title: "Click to sort by title",\n modified: "Click to sort by modified date",\n created: "Click to sort by created date",\n show: "Click to show tagging list",\n hide: "Click to hide tagging list",\n normal: "Click to show a normal ungrouped list",\n group: "Click to show list grouped by tag",\n sitemap: "Click to show a sitemap style list",\n commas: "Click to show a comma separated list",\n numCols: "Click to change number of columns"\n }\n },\n\n config: {\n showTaggingCounts: true,\n listOpts: {\n // the first one will be the default\n sortBy: ["title","modified","created"],\n sortOrder: ["asc","desc"],\n hideState: ["show","hide"],\n listMode: ["normal","group","sitemap","commas"],\n numCols: ["1","2","3","4","5","6"]\n },\n valuePrefix: "taggly."\n },\n\n getTagglyOpt: function(title,opt) {\n var val = store.getValue(title,this.config.valuePrefix+opt);\n return val ? val : this.config.listOpts[opt][0];\n },\n\n setTagglyOpt: function(title,opt,value) {\n if (!store.tiddlerExists(title))\n // create it silently\n store.saveTiddler(title,title,config.views.editor.defaultText.format([title]),config.options.txtUserName,new Date(),null);\n // if value is default then remove it to save space\n return store.setValue(title,\n this.config.valuePrefix+opt,\n value == this.config.listOpts[opt][0] ? null : value);\n },\n\n getNextValue: function(title,opt) {\n var current = this.getTagglyOpt(title,opt);\n var pos = this.config.listOpts[opt].indexOf(current);\n // a little usability enhancement. actually it doesn't work right for grouped or sitemap\n var limit = (opt == "numCols" ? store.getTaggedTiddlers(title).length : this.config.listOpts[opt].length);\n var newPos = (pos + 1) % limit;\n return this.config.listOpts[opt][newPos];\n },\n\n toggleTagglyOpt: function(title,opt) {\n var newVal = this.getNextValue(title,opt);\n this.setTagglyOpt(title,opt,newVal);\n }, \n\n createListControl: function(place,title,type) {\n var lingo = config.taggly.lingo;\n var label;\n var tooltip;\n var onclick;\n\n if ((type == "title" || type == "modified" || type == "created")) {\n // "special" controls. a little tricky. derived from sortOrder and sortBy\n label = lingo.labels[type];\n tooltip = lingo.tooltips[type];\n\n if (this.getTagglyOpt(title,"sortBy") == type) {\n label += lingo.labels[this.getTagglyOpt(title,"sortOrder")];\n onclick = function() {\n config.taggly.toggleTagglyOpt(title,"sortOrder");\n return false;\n }\n }\n else {\n onclick = function() {\n config.taggly.setTagglyOpt(title,"sortBy",type);\n config.taggly.setTagglyOpt(title,"sortOrder",config.taggly.config.listOpts.sortOrder[0]);\n return false;\n }\n }\n }\n else {\n // "regular" controls, nice and simple\n label = lingo.labels[type == "numCols" ? type : this.getNextValue(title,type)];\n tooltip = lingo.tooltips[type == "numCols" ? type : this.getNextValue(title,type)];\n onclick = function() {\n config.taggly.toggleTagglyOpt(title,type);\n return false;\n }\n }\n\n // hide button because commas don't have columns\n if (!(this.getTagglyOpt(title,"listMode") == "commas" && type == "numCols"))\n createTiddlyButton(place,label,tooltip,onclick,type == "hideState" ? "hidebutton" : "button");\n },\n\n makeColumns: function(orig,numCols) {\n var listSize = orig.length;\n var colSize = listSize/numCols;\n var remainder = listSize % numCols;\n\n var upperColsize = colSize;\n var lowerColsize = colSize;\n\n if (colSize != Math.floor(colSize)) {\n // it's not an exact fit so..\n upperColsize = Math.floor(colSize) + 1;\n lowerColsize = Math.floor(colSize);\n }\n\n var output = [];\n var c = 0;\n for (var j=0;j<numCols;j++) {\n var singleCol = [];\n var thisSize = j < remainder ? upperColsize : lowerColsize;\n for (var i=0;i<thisSize;i++) \n singleCol.push(orig[c++]);\n output.push(singleCol);\n }\n\n return output;\n },\n\n drawTable: function(place,columns,theClass) {\n var newTable = createTiddlyElement(place,"table",null,theClass);\n var newTbody = createTiddlyElement(newTable,"tbody");\n var newTr = createTiddlyElement(newTbody,"tr");\n for (var j=0;j<columns.length;j++) {\n var colOutput = "";\n for (var i=0;i<columns[j].length;i++) \n colOutput += columns[j][i];\n var newTd = createTiddlyElement(newTr,"td",null,"tagglyTagging"); // todo should not need this class\n wikify(colOutput,newTd);\n }\n return newTable;\n },\n\n createTagglyList: function(place,title) {\n switch(this.getTagglyOpt(title,"listMode")) {\n case "group": return this.createTagglyListGrouped(place,title); break;\n case "normal": return this.createTagglyListNormal(place,title,false); break;\n case "commas": return this.createTagglyListNormal(place,title,true); break;\n case "sitemap":return this.createTagglyListSiteMap(place,title); break;\n }\n },\n\n getTaggingCount: function(title) {\n // thanks to Doug Edmunds\n if (this.config.showTaggingCounts) {\n var tagCount = store.getTaggedTiddlers(title).length;\n if (tagCount > 0)\n return " ("+tagCount+")";\n }\n return "";\n },\n\n // this is for normal and commas mode\n createTagglyListNormal: function(place,title,useCommas) {\n\n var list = store.getTaggedTiddlers(title,this.getTagglyOpt(title,"sortBy"));\n\n if (this.getTagglyOpt(title,"sortOrder") == "desc")\n list = list.reverse();\n\n var output = [];\n for (var i=0;i<list.length;i++) {\n var countString = this.getTaggingCount(list[i].title);\n if (useCommas)\n output.push((i > 0 ? ", " : "") + "[[" + list[i].title + "]]" + countString);\n else\n output.push("*[[" + list[i].title + "]]" + countString + "\sn");\n }\n\n return this.drawTable(place,\n this.makeColumns(output,useCommas ? 1 : parseInt(this.getTagglyOpt(title,"numCols"))),\n useCommas ? "commas" : "normal");\n },\n\n // this is for the "grouped" mode\n createTagglyListGrouped: function(place,title) {\n var sortBy = this.getTagglyOpt(title,"sortBy");\n var sortOrder = this.getTagglyOpt(title,"sortOrder");\n\n var list = store.getTaggedTiddlers(title,sortBy);\n\n if (sortOrder == "desc")\n list = list.reverse();\n\n var leftOvers = []\n for (var i=0;i<list.length;i++)\n leftOvers.push(list[i].title);\n\n var allTagsHolder = {};\n for (var i=0;i<list.length;i++) {\n for (var j=0;j<list[i].tags.length;j++) {\n\n if (list[i].tags[j] != title) { // not this tiddler\n\n if (!allTagsHolder[list[i].tags[j]])\n allTagsHolder[list[i].tags[j]] = "";\n\n allTagsHolder[list[i].tags[j]] += "**[["+list[i].title+"]]"\n + this.getTaggingCount(list[i].title) + "\sn";\n leftOvers.setItem(list[i].title,-1); // remove from leftovers. at the end it will contain the leftovers\n }\n }\n }\n\n var allTags = [];\n for (var t in allTagsHolder)\n allTags.push(t);\n\n var sortHelper = function(a,b) {\n if (a == b) return 0;\n if (a < b) return -1;\n return 1;\n };\n\n allTags.sort(function(a,b) {\n var tidA = store.getTiddler(a);\n var tidB = store.getTiddler(b);\n if (sortBy == "title") return sortHelper(a,b);\n else if (!tidA && !tidB) return 0;\n else if (!tidA) return -1;\n else if (!tidB) return +1;\n else return sortHelper(tidA[sortBy],tidB[sortBy]);\n });\n\n var leftOverOutput = "";\n for (var i=0;i<leftOvers.length;i++)\n leftOverOutput += "*[["+leftOvers[i]+"]]" + this.getTaggingCount(leftOvers[i]) + "\sn";\n\n var output = [];\n\n if (sortOrder == "desc")\n allTags.reverse();\n else if (leftOverOutput != "")\n // leftovers first...\n output.push(leftOverOutput);\n\n for (var i=0;i<allTags.length;i++)\n output.push("*[["+allTags[i]+"]]" + this.getTaggingCount(leftOvers[i]) + "\sn" + allTagsHolder[allTags[i]]);\n\n if (sortOrder == "desc" && leftOverOutput != "")\n // leftovers last...\n output.push(leftOverOutput);\n\n return this.drawTable(place,\n this.makeColumns(output,parseInt(this.getTagglyOpt(title,"numCols"))),\n "grouped");\n\n },\n\n // used to build site map\n treeTraverse: function(title,depth,sortBy,sortOrder) {\n\n var list = store.getTaggedTiddlers(title,sortBy);\n if (sortOrder == "desc")\n list.reverse();\n\n var indent = "";\n for (var j=0;j<depth;j++)\n indent += "*"\n\n var childOutput = "";\n for (var i=0;i<list.length;i++)\n if (list[i].title != title)\n childOutput += this.treeTraverse(list[i].title,depth+1,sortBy,sortOrder);\n\n if (depth == 0)\n return childOutput;\n else\n return indent + "[["+title+"]]" + this.getTaggingCount(title) + "\sn"+childOutput;\n },\n\n // this if for the site map mode\n createTagglyListSiteMap: function(place,title) {\n var output = this.treeTraverse(title,0,this.getTagglyOpt(title,"sortBy"),this.getTagglyOpt(title,"sortOrder"));\n return this.drawTable(place,\n this.makeColumns(output.split(/(?=^\s*\s[)/m),parseInt(this.getTagglyOpt(title,"numCols"))), // regexp magic\n "sitemap"\n );\n },\n\n macros: {\n tagglyTagging: {\n handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n var refreshContainer = createTiddlyElement(place,"div");\n // do some refresh magic to make it keep the list fresh - thanks Saq\n refreshContainer.setAttribute("refresh","macro");\n refreshContainer.setAttribute("macroName",macroName);\n refreshContainer.setAttribute("title",tiddler.title);\n this.refresh(refreshContainer);\n },\n\n refresh: function(place) {\n var title = place.getAttribute("title");\n removeChildren(place);\n if (store.getTaggedTiddlers(title).length > 0) {\n var lingo = config.taggly.lingo;\n config.taggly.createListControl(place,title,"hideState");\n if (config.taggly.getTagglyOpt(title,"hideState") == "show") {\n createTiddlyElement(place,"span",null,"tagglyLabel",lingo.labels.label.format([title]));\n config.taggly.createListControl(place,title,"title");\n config.taggly.createListControl(place,title,"modified");\n config.taggly.createListControl(place,title,"created");\n config.taggly.createListControl(place,title,"listMode");\n config.taggly.createListControl(place,title,"numCols");\n config.taggly.createTagglyList(place,title);\n }\n }\n }\n }\n },\n\n // todo fix these up a bit\n styles: \n"/*{{{*/\sn"+\n"/* created by TagglyTaggingPlugin */\sn"+\n".tagglyTagging { padding-top:0.5em; }\sn"+\n".tagglyTagging li.listTitle { display:none; }\sn"+\n".tagglyTagging ul {\sn"+\n" margin-top:0px; padding-top:0.5em; padding-left:2em;\sn"+\n" margin-bottom:0px; padding-bottom:0px;\sn"+\n"}\sn"+\n".tagglyTagging { vertical-align: top; margin:0px; padding:0px; }\sn"+\n".tagglyTagging table { margin:0px; padding:0px; }\sn"+\n".tagglyTagging .button { display:none; margin-left:3px; margin-right:3px; }\sn"+\n".tagglyTagging .button, .tagglyTagging .hidebutton {\sn"+\n" color:[[ColorPalette::TertiaryLight]]; font-size:90%;\sn"+\n" border:0px; padding-left:0.3em;padding-right:0.3em;\sn"+\n"}\sn"+\n".tagglyTagging .button:hover, .hidebutton:hover {\sn"+\n" background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]];\sn"+\n"}\sn"+\n".selected .tagglyTagging .button {\sn"+\n" display:inline;\sn"+\n"}\sn"+\n".tagglyTagging .hidebutton { color:[[ColorPalette::Background]]; }\sn"+\n".selected .tagglyTagging .hidebutton { color:[[ColorPalette::TertiaryLight]] }\sn"+\n".tagglyLabel { color:[[ColorPalette::TertiaryMid]]; font-size:90%; }\sn"+\n".tagglyTagging ul {padding-top:0px; padding-bottom:0.5em; margin-left:1em; }\sn"+\n".tagglyTagging ul ul {list-style-type:disc; margin-left:-1em;}\sn"+\n".tagglyTagging ul ul li {margin-left:0.5em; }\sn"+\n".editLabel { font-size:90%; padding-top:0.5em; }\sn"+\n".tagglyTagging .commas { padding-left:1.8em; }\sn"+\n"/*}}}*/\sn"+\n "",\n\n init: function() {\n merge(config.macros,this.macros);\n config.shadowTiddlers["TagglyTaggingStyles"] = this.styles;\n if (store)\n store.addNotification("TagglyTaggingStyles",refreshStyles);\n else\n config.notifyTiddlers.push({name:"TagglyTaggingStyles", notify: refreshStyles});\n }\n};\n\nconfig.taggly.init();\n\n//}}}\n\n
/***\n| Name:|ToggleTagMacro|\n| Description:|Makes a checkbox which toggles a tag in a tiddler|\n| Version:|6.1.2|\n| Date:|20-Oct-2006|\n| Source:|http://tiddlyspot.com/mptw/#ToggleTagMacro|\n| Author:|SimonBaird|\n| License:|[[BSD open source license]]|\n| CoreVersion:|2.1|\n!Usage\n{{{<<toggleTag }}}//{{{TagName TiddlerName LabelText}}}//{{{>>}}}\n* TagName - the tag to be toggled, default value "checked"\n* TiddlerName - the tiddler to toggle the tag in, default value the current tiddler\n* LabelText - the text (gets wikified) to put next to the check box, default value is '{{{[[TagName]]}}}' or '{{{[[TagName]] [[TiddlerName]]}}}'\n(If a parameter is '.' then the default will be used)\n\nExamples:\n\n|Code|Description|Example|h\n|{{{<<toggleTag>>}}}|Toggles the default tag (checked) in this tiddler|<<toggleTag>>|\n|{{{<<toggleTag TagName>>}}}|Toggles the TagName tag in this tiddler|<<toggleTag TagName>>|\n|{{{<<toggleTag TagName TiddlerName>>}}}|Toggles the TagName tag in the TiddlerName tiddler|<<toggleTag TagName TiddlerName>>|\n|{{{<<toggleTag TagName TiddlerName 'click me'>>}}}|Same but with custom label|<<toggleTag TagName TiddlerName 'click me'>>|\n|{{{<<toggleTag . . 'click me'>>}}}|dot means use default value|<<toggleTag . . 'click me'>>|\n(Note if TiddlerName doesn't exist it will be silently created)\n\n!Known issues\n* Doesn't smoothly handle the case where you toggle a tag in a tiddler that is current open for editing. Should it stick the tag in the edit box?\n\n***/\n//{{{\n\nmerge(config.macros,{\n\n toggleTag: {\n\n doRefreshAll: true,\n createIfRequired: true,\n shortLabel: "[[%0]]",\n longLabel: "[[%0]] [[%1]]",\n\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var tag = (params[0] && params[0] != '.') ? params[0] : "checked";\n var title = (params[1] && params[1] != '.') ? params[1] : tiddler.title;\n var defaultLabel = (title == tiddler.title ? this.shortLabel : this.longLabel);\n var label = (params[2] && params[2] != '.') ? params[2] : defaultLabel;\n var theTiddler = title == tiddler.title ? tiddler : store.getTiddler(title);\n var cb = createTiddlyCheckbox(place, label.format([tag,title]), theTiddler && theTiddler.isTagged(tag), function(e) {\n if (!store.tiddlerExists(title)) {\n if (config.macros.toggleTag.createIfRequired) {\n var content = store.getTiddlerText(title); // just in case it's a shadow\n store.saveTiddler(title,title,content?content:"",config.options.txtUserName,new Date(),null);\n }\n else \n return false;\n }\n //store.suspendNotifications(); \n store.setTiddlerTag(title,this.checked,tag);\n //refreshDisplay(); \n //store.resumeNotifications();\n return true;\n });\n }\n }\n});\n\n//}}}\n\n
| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |\n| 11/11/2006 18:58:42 | YourName | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 11/11/2006 19:24:48 | YourName | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 11/11/2006 19:28:8 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 11/11/2006 19:30:50 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 11/11/2006 20:4:46 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 11/11/2006 20:21:1 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 11/11/2006 20:27:17 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 11/11/2006 20:36:32 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/#%5B%5BWitaj%20na%20stronie%20%C5%9Alubka%5D%5D]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 11/11/2006 23:32:39 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 11/11/2006 23:37:47 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 11/11/2006 23:40:28 | Rafał Ślubowski | [[index.html|http://slubek.tiddlyspot.com/index.html]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 12/11/2006 0:13:11 | Rafał Ślubowski | [[index.html|http://slubek.tiddlyspot.com/index.html]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 12/11/2006 0:17:36 | Rafał Ślubowski | [[index.html|http://slubek.tiddlyspot.com/index.html]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 12/11/2006 0:30:6 | Rafał Ślubowski | [[index.html|http://slubek.tiddlyspot.com/index.html]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 13/11/2006 14:25:39 | Rafał Ślubowski | [[index.html|http://slubek.tiddlyspot.com/index.html]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 13/11/2006 15:14:35 | Rafał Ślubowski | [[index.html|http://slubek.tiddlyspot.com/index.html]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 13/11/2006 15:34:28 | Rafał Ślubowski | [[index.html|http://slubek.tiddlyspot.com/index.html]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 13/11/2006 15:36:7 | Rafał Ślubowski | [[index.html|http://slubek.tiddlyspot.com/index.html]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 13/11/2006 15:37:28 | Rafał Ślubowski | [[index.html|http://slubek.tiddlyspot.com/index.html]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 13/11/2006 15:39:38 | Rafał Ślubowski | [[index.html|http://slubek.tiddlyspot.com/index.html]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 13/11/2006 15:40:47 | Rafał Ślubowski | [[index.html|http://slubek.tiddlyspot.com/index.html]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 13/11/2006 15:44:49 | Rafał Ślubowski | [[index.html|http://slubek.tiddlyspot.com/index.html]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 15/11/2006 11:27:9 | Rafał Ślubowski | [[index.html|http://slubek.tiddlyspot.com/index.html]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 15/11/2006 12:1:16 | Rafał Ślubowski | [[index.html|http://slubek.tiddlyspot.com/index.html]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 26/11/2006 21:55:52 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 26/11/2006 23:11:9 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 26/11/2006 23:19:45 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 26/11/2006 23:24:48 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 26/11/2006 23:25:52 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 27/11/2006 19:20:9 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com//#OpenSSL]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 29/11/2006 21:50:28 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com//#%5B%5BPliki%20Spec%5D%5D]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 29/11/2006 22:4:53 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com//#%5B%5BPliki%20Spec%5D%5D]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 7/12/2006 22:28:17 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com//#OpenSSL]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 8/12/2006 14:49:30 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com//#%5B%5BPliki%20Spec%5D%5D]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 13/12/2006 13:51:17 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com//#OpenSSL]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 2/1/2007 14:17:38 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com//#Witaj!]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 2/1/2007 15:50:47 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com//#Witaj!]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 6/1/2007 1:58:27 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com//#%5B%5BPliki%20Spec%5D%5D]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 9/1/2007 15:14:15 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com//#Witaj!]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 9/1/2007 15:16:58 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com//#Witaj!]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 9/1/2007 15:18:3 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com//#Witaj!]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 5/2/2007 0:2:39 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com//#%5B%5BPliki%20Spec%5D%5D]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 5/2/2007 11:6:14 | YourName | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 10/2/2007 16:58:20 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com//#%5B%5BPliki%20Spec%5D%5D]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 4/3/2007 18:33:6 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 4/3/2007 19:29:47 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 4/3/2007 23:5:55 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 13/3/2007 23:49:49 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 25/3/2007 13:59:51 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 25/3/2007 14:2:55 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 2/4/2007 10:15:40 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 11/4/2007 10:21:47 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 11/4/2007 10:29:39 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 11/4/2007 11:40:4 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 12/4/2007 17:4:53 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 12/4/2007 17:10:24 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 12/4/2007 17:17:8 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 13/4/2007 9:52:27 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 13/4/2007 9:55:15 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 17/4/2007 23:8:54 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 19/4/2007 14:14:20 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 19/4/2007 14:15:5 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 19/4/2007 14:19:20 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 19/4/2007 14:23:54 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 19/4/2007 15:2:2 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 19/4/2007 15:14:52 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 19/4/2007 15:16:38 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 19/4/2007 15:25:46 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 21/4/2007 0:0:1 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 25/9/2007 15:55:4 | YourName | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 25/9/2007 15:56:1 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 25/9/2007 16:10:15 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 25/9/2007 19:55:27 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 25/9/2007 22:52:33 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 6/10/2007 20:3:0 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 12/10/2007 19:39:35 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 13/10/2007 11:1:43 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 18/10/2007 13:56:6 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 10/11/2007 19:56:53 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 18/11/2007 13:36:9 | slubek | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 18/11/2007 13:36:35 | slubek | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 18/11/2007 13:37:50 | slubek | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 18/11/2007 13:39:5 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 18/11/2007 13:43:55 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 18/11/2007 13:44:27 | slubek | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 18/11/2007 14:8:23 | slubek | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 14/12/2007 10:2:30 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 8/1/2008 8:57:6 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 8/1/2008 8:57:41 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 29/1/2008 0:22:50 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 29/1/2008 0:43:24 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 30/1/2008 9:2:26 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 8/12/2008 22:24:2 | YourName | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 8/12/2008 22:24:24 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 8/12/2008 22:24:44 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 1/2/2009 23:46:56 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 2/2/2009 0:2:36 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 27/9/2009 14:26:45 | Rafał Ślubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 4/11/2014 20:45:10 | Slubek | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 4/11/2014 20:56:16 | Slubek | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 4/11/2014 20:57:59 | Slubek | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 4/11/2014 21:3:12 | Slubek | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 19/2/2016 20:3:37 | RafalSlubowski | [[/|http://slubek.tiddlyspot.com/]] | [[store.cgi|http://slubek.tiddlyspot.com/store.cgi]] | . | index.html | . |
/***\n|''Name:''|UploadPlugin|\n|''Description:''|Save to web a TiddlyWiki|\n|''Version:''|3.4.4|\n|''Date:''|Sep 30, 2006|\n|''Source:''|http://tiddlywiki.bidix.info/#UploadPlugin|\n|''Documentation:''|http://tiddlywiki.bidix.info/#UploadDoc|\n|''Author:''|BidiX (BidiX (at) bidix (dot) info)|\n|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|\n|''~CoreVersion:''|2.0.0|\n|''Browser:''|Firefox 1.5; InternetExplorer 6.0; Safari|\n|''Include:''|config.lib.file; config.lib.log; config.lib.options; PasswordTweak|\n|''Require:''|[[UploadService|http://tiddlywiki.bidix.info/#UploadService]]|\n***/\n//{{{\nversion.extensions.UploadPlugin = {\n major: 3, minor: 4, revision: 4, \n date: new Date(2006,8,30),\n source: 'http://tiddlywiki.bidix.info/#UploadPlugin',\n documentation: 'http://tiddlywiki.bidix.info/#UploadDoc',\n author: 'BidiX (BidiX (at) bidix (dot) info',\n license: '[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D]]',\n coreVersion: '2.0.0',\n browser: 'Firefox 1.5; InternetExplorer 6.0; Safari'\n};\n//}}}\n\n////+++!![config.lib.file]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.file) config.lib.file= {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 0}, \n date: new Date(2006,3,9)\n};\nconfig.lib.file.dirname = function (filePath) {\n var lastpos;\n if ((lastpos = filePath.lastIndexOf("/")) != -1) {\n return filePath.substring(0, lastpos);\n } else {\n return filePath.substring(0, filePath.lastIndexOf("\s\s"));\n }\n};\nconfig.lib.file.basename = function (filePath) {\n var lastpos;\n if ((lastpos = filePath.lastIndexOf("#")) != -1) \n filePath = filePath.substring(0, lastpos);\n if ((lastpos = filePath.lastIndexOf("/")) != -1) {\n return filePath.substring(lastpos + 1);\n } else\n return filePath.substring(filePath.lastIndexOf("\s\s")+1);\n};\nwindow.basename = function() {return "@@deprecated@@";};\n//}}}\n////===\n\n////+++!![config.lib.log]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.log) config.lib.log= {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 1}, \n date: new Date(2006,8,19)\n};\nconfig.lib.Log = function(tiddlerTitle, logHeader) {\n if (version.major < 2)\n this.tiddler = store.tiddlers[tiddlerTitle];\n else\n this.tiddler = store.getTiddler(tiddlerTitle);\n if (!this.tiddler) {\n this.tiddler = new Tiddler();\n this.tiddler.title = tiddlerTitle;\n this.tiddler.text = "| !date | !user | !location |" + logHeader;\n this.tiddler.created = new Date();\n this.tiddler.modifier = config.options.txtUserName;\n this.tiddler.modified = new Date();\n if (version.major < 2)\n store.tiddlers[tiddlerTitle] = this.tiddler;\n else\n store.addTiddler(this.tiddler);\n }\n return this;\n};\n\nconfig.lib.Log.prototype.newLine = function (line) {\n var now = new Date();\n var newText = "| ";\n newText += now.getDate()+"/"+(now.getMonth()+1)+"/"+now.getFullYear() + " ";\n newText += now.getHours()+":"+now.getMinutes()+":"+now.getSeconds()+" | ";\n newText += config.options.txtUserName + " | ";\n var location = document.location.toString();\n var filename = config.lib.file.basename(location);\n if (!filename) filename = '/';\n newText += "[["+filename+"|"+location + "]] |";\n this.tiddler.text = this.tiddler.text + "\sn" + newText;\n this.addToLine(line);\n};\n\nconfig.lib.Log.prototype.addToLine = function (text) {\n this.tiddler.text = this.tiddler.text + text;\n this.tiddler.modifier = config.options.txtUserName;\n this.tiddler.modified = new Date();\n if (version.major < 2)\n store.tiddlers[this.tiddler.tittle] = this.tiddler;\n else {\n store.addTiddler(this.tiddler);\n story.refreshTiddler(this.tiddler.title);\n store.notify(this.tiddler.title, true);\n }\n if (version.major < 2)\n store.notifyAll(); \n};\n//}}}\n////===\n\n////+++!![config.lib.options]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.options) config.lib.options = {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 0}, \n date: new Date(2006,3,9)\n};\n\nconfig.lib.options.init = function (name, defaultValue) {\n if (!config.options[name]) {\n config.options[name] = defaultValue;\n saveOptionCookie(name);\n }\n};\n//}}}\n////===\n\n////+++!![PasswordTweak]\n\n//{{{\nversion.extensions.PasswordTweak = {\n major: 1, minor: 0, revision: 3, date: new Date(2006,8,30),\n type: 'tweak',\n source: 'http://tiddlywiki.bidix.info/#PasswordTweak'\n};\n//}}}\n/***\n!!config.macros.option\n***/\n//{{{\nconfig.macros.option.passwordCheckboxLabel = "Save this password on this computer";\nconfig.macros.option.passwordType = "password"; // password | text\n\nconfig.macros.option.onChangeOption = function(e)\n{\n var opt = this.getAttribute("option");\n var elementType,valueField;\n if(opt) {\n switch(opt.substr(0,3)) {\n case "txt":\n elementType = "input";\n valueField = "value";\n break;\n case "pas":\n elementType = "input";\n valueField = "value";\n break;\n case "chk":\n elementType = "input";\n valueField = "checked";\n break;\n }\n config.options[opt] = this[valueField];\n saveOptionCookie(opt);\n var nodes = document.getElementsByTagName(elementType);\n for(var t=0; t<nodes.length; t++) \n {\n var optNode = nodes[t].getAttribute("option");\n if (opt == optNode) \n nodes[t][valueField] = this[valueField];\n }\n }\n return(true);\n};\n\nconfig.macros.option.handler = function(place,macroName,params)\n{\n var opt = params[0];\n if(config.options[opt] === undefined) {\n return;}\n var c;\n switch(opt.substr(0,3)) {\n case "txt":\n c = document.createElement("input");\n c.onkeyup = this.onChangeOption;\n c.setAttribute ("option",opt);\n c.className = "txtOptionInput "+opt;\n place.appendChild(c);\n c.value = config.options[opt];\n break;\n case "pas":\n // input password\n c = document.createElement ("input");\n c.setAttribute("type",config.macros.option.passwordType);\n c.onkeyup = this.onChangeOption;\n c.setAttribute("option",opt);\n c.className = "pasOptionInput "+opt;\n place.appendChild(c);\n c.value = config.options[opt];\n // checkbox link with this password "save this password on this computer"\n c = document.createElement("input");\n c.setAttribute("type","checkbox");\n c.onclick = this.onChangeOption;\n c.setAttribute("option","chk"+opt);\n c.className = "chkOptionInput "+opt;\n place.appendChild(c);\n c.checked = config.options["chk"+opt];\n // text savePasswordCheckboxLabel\n place.appendChild(document.createTextNode(config.macros.option.passwordCheckboxLabel));\n break;\n case "chk":\n c = document.createElement("input");\n c.setAttribute("type","checkbox");\n c.onclick = this.onChangeOption;\n c.setAttribute("option",opt);\n c.className = "chkOptionInput "+opt;\n place.appendChild(c);\n c.checked = config.options[opt];\n break;\n }\n};\n//}}}\n/***\n!! Option cookie stuff\n***/\n//{{{\nwindow.loadOptionsCookie_orig_PasswordTweak = window.loadOptionsCookie;\nwindow.loadOptionsCookie = function()\n{\n var cookies = document.cookie.split(";");\n for(var c=0; c<cookies.length; c++) {\n var p = cookies[c].indexOf("=");\n if(p != -1) {\n var name = cookies[c].substr(0,p).trim();\n var value = cookies[c].substr(p+1).trim();\n switch(name.substr(0,3)) {\n case "txt":\n config.options[name] = unescape(value);\n break;\n case "pas":\n config.options[name] = unescape(value);\n break;\n case "chk":\n config.options[name] = value == "true";\n break;\n }\n }\n }\n};\n\nwindow.saveOptionCookie_orig_PasswordTweak = window.saveOptionCookie;\nwindow.saveOptionCookie = function(name)\n{\n var c = name + "=";\n switch(name.substr(0,3)) {\n case "txt":\n c += escape(config.options[name].toString());\n break;\n case "chk":\n c += config.options[name] ? "true" : "false";\n // is there an option link with this chk ?\n if (config.options[name.substr(3)]) {\n saveOptionCookie(name.substr(3));\n }\n break;\n case "pas":\n if (config.options["chk"+name]) {\n c += escape(config.options[name].toString());\n } else {\n c += "";\n }\n break;\n }\n c += "; expires=Fri, 1 Jan 2038 12:00:00 UTC; path=/";\n document.cookie = c;\n};\n//}}}\n/***\n!! Initializations\n***/\n//{{{\n// define config.options.pasPassword\nif (!config.options.pasPassword) {\n config.options.pasPassword = 'defaultPassword';\n window.saveOptionCookie('pasPassword');\n}\n// since loadCookies is first called befor password definition\n// we need to reload cookies\nwindow.loadOptionsCookie();\n//}}}\n////===\n\n////+++!![config.macros.upload]\n\n//{{{\nconfig.macros.upload = {\n accessKey: "U",\n formName: "UploadPlugin",\n contentType: "text/html;charset=UTF-8",\n defaultStoreScript: "store.php"\n};\n\n// only this two configs need to be translated\nconfig.macros.upload.messages = {\n aboutToUpload: "About to upload TiddlyWiki to %0",\n backupFileStored: "Previous file backuped in %0",\n crossDomain: "Certainly a cross-domain isue: access to an other site isn't allowed",\n errorDownloading: "Error downloading",\n errorUploadingContent: "Error uploading content",\n fileLocked: "Files is locked: You are not allowed to Upload",\n fileNotFound: "file to upload not found",\n fileNotUploaded: "File %0 NOT uploaded",\n mainFileUploaded: "Main TiddlyWiki file uploaded to %0",\n passwordEmpty: "Unable to upload, your password is empty",\n urlParamMissing: "url param missing",\n rssFileNotUploaded: "RssFile %0 NOT uploaded",\n rssFileUploaded: "Rss File uploaded to %0"\n};\n\nconfig.macros.upload.label = {\n promptOption: "Save and Upload this TiddlyWiki with UploadOptions",\n promptParamMacro: "Save and Upload this TiddlyWiki in %0",\n saveLabel: "save to web", \n saveToDisk: "save to disk",\n uploadLabel: "upload" \n};\n\nconfig.macros.upload.handler = function(place,macroName,params){\n // parameters initialization\n var storeUrl = params[0];\n var toFilename = params[1];\n var backupDir = params[2];\n var uploadDir = params[3];\n var username = params[4];\n var password; // for security reason no password as macro parameter\n var label;\n if (document.location.toString().substr(0,4) == "http")\n label = this.label.saveLabel;\n else\n label = this.label.uploadLabel;\n var prompt;\n if (storeUrl) {\n prompt = this.label.promptParamMacro.toString().format([this.toDirUrl(storeUrl, uploadDir, username)]);\n }\n else {\n prompt = this.label.promptOption;\n }\n createTiddlyButton(place, label, prompt, \n function () {\n config.macros.upload.upload(storeUrl, toFilename, uploadDir, backupDir, username, password); \n return false;}, \n null, null, this.accessKey);\n};\nconfig.macros.upload.UploadLog = function() {\n return new config.lib.Log('UploadLog', " !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |" );\n};\nconfig.macros.upload.UploadLog.prototype = config.lib.Log.prototype;\nconfig.macros.upload.UploadLog.prototype.startUpload = function(storeUrl, toFilename, uploadDir, backupDir) {\n var line = " [[" + config.lib.file.basename(storeUrl) + "|" + storeUrl + "]] | ";\n line += uploadDir + " | " + toFilename + " | " + backupDir + " |";\n this.newLine(line);\n};\nconfig.macros.upload.UploadLog.prototype.endUpload = function() {\n this.addToLine(" Ok |");\n};\nconfig.macros.upload.basename = config.lib.file.basename;\nconfig.macros.upload.dirname = config.lib.file.dirname;\nconfig.macros.upload.toRootUrl = function (storeUrl, username)\n{\n return root = (this.dirname(storeUrl)?this.dirname(storeUrl):this.dirname(document.location.toString()));\n}\nconfig.macros.upload.toDirUrl = function (storeUrl, uploadDir, username)\n{\n var root = this.toRootUrl(storeUrl, username);\n if (uploadDir && uploadDir != '.')\n root = root + '/' + uploadDir;\n return root;\n}\nconfig.macros.upload.toFileUrl = function (storeUrl, toFilename, uploadDir, username)\n{\n return this.toDirUrl(storeUrl, uploadDir, username) + '/' + toFilename;\n}\nconfig.macros.upload.upload = function(storeUrl, toFilename, uploadDir, backupDir, username, password)\n{\n // parameters initialization\n storeUrl = (storeUrl ? storeUrl : config.options.txtUploadStoreUrl);\n toFilename = (toFilename ? toFilename : config.options.txtUploadFilename);\n backupDir = (backupDir ? backupDir : config.options.txtUploadBackupDir);\n uploadDir = (uploadDir ? uploadDir : config.options.txtUploadDir);\n username = (username ? username : config.options.txtUploadUserName);\n password = config.options.pasUploadPassword; // for security reason no password as macro parameter\n if (!password || password === '') {\n alert(config.macros.upload.messages.passwordEmpty);\n return;\n }\n if (storeUrl === '') {\n storeUrl = config.macros.upload.defaultStoreScript;\n }\n if (config.lib.file.dirname(storeUrl) === '') {\n storeUrl = config.lib.file.dirname(document.location.toString())+'/'+storeUrl;\n }\n if (toFilename === '') {\n toFilename = config.lib.file.basename(document.location.toString());\n }\n\n clearMessage();\n // only for forcing the message to display\n if (version.major < 2)\n store.notifyAll();\n if (!storeUrl) {\n alert(config.macros.upload.messages.urlParamMissing);\n return;\n }\n // Check that file is not locked\n if (window.BidiX && BidiX.GroupAuthoring && BidiX.GroupAuthoring.lock) {\n if (BidiX.GroupAuthoring.lock.isLocked() && !BidiX.GroupAuthoring.lock.isMyLock()) {\n alert(config.macros.upload.messages.fileLocked);\n return;\n }\n }\n \n var log = new this.UploadLog();\n log.startUpload(storeUrl, toFilename, uploadDir, backupDir);\n if (document.location.toString().substr(0,5) == "file:") {\n saveChanges();\n }\n var toDir = config.macros.upload.toDirUrl(storeUrl, toFilename, uploadDir, username);\n displayMessage(config.macros.upload.messages.aboutToUpload.format([toDir]), toDir);\n this.uploadChanges(storeUrl, toFilename, uploadDir, backupDir, username, password);\n if(config.options.chkGenerateAnRssFeed) {\n //var rssContent = convertUnicodeToUTF8(generateRss());\n var rssContent = generateRss();\n var rssPath = toFilename.substr(0,toFilename.lastIndexOf(".")) + ".xml";\n this.uploadContent(rssContent, storeUrl, rssPath, uploadDir, '', username, password, \n function (responseText) {\n if (responseText.substring(0,1) != '0') {\n displayMessage(config.macros.upload.messages.rssFileNotUploaded.format([rssPath]));\n }\n else {\n var toFileUrl = config.macros.upload.toFileUrl(storeUrl, rssPath, uploadDir, username);\n displayMessage(config.macros.upload.messages.rssFileUploaded.format(\n [toFileUrl]), toFileUrl);\n }\n // for debugging store.php uncomment last line\n //DEBUG alert(responseText);\n });\n }\n return;\n};\n\nconfig.macros.upload.uploadChanges = function(storeUrl, toFilename, uploadDir, backupDir, \n username, password) {\n var original;\n if (document.location.toString().substr(0,4) == "http") {\n original = this.download(storeUrl, toFilename, uploadDir, backupDir, username, password);\n return;\n }\n else {\n // standard way : Local file\n \n original = loadFile(getLocalPath(document.location.toString()));\n if(window.Components) {\n // it's a mozilla browser\n try {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");\n var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]\n .createInstance(Components.interfaces.nsIScriptableUnicodeConverter);\n converter.charset = "UTF-8";\n original = converter.ConvertToUnicode(original);\n }\n catch(e) {\n }\n }\n }\n //DEBUG alert(original);\n this.uploadChangesFrom(original, storeUrl, toFilename, uploadDir, backupDir, \n username, password);\n};\n\nconfig.macros.upload.uploadChangesFrom = function(original, storeUrl, toFilename, uploadDir, backupDir, \n username, password) {\n var startSaveArea = '<div id="' + 'storeArea">'; // Split up into two so that indexOf() of this source doesn't find it\n var endSaveArea = '</d' + 'iv>';\n // Locate the storeArea div's\n var posOpeningDiv = original.indexOf(startSaveArea);\n var posClosingDiv = original.lastIndexOf(endSaveArea);\n if((posOpeningDiv == -1) || (posClosingDiv == -1))\n {\n alert(config.messages.invalidFileError.format([document.location.toString()]));\n return;\n }\n var revised = original.substr(0,posOpeningDiv + startSaveArea.length) + \n allTiddlersAsHtml() + "\sn\st\st" +\n original.substr(posClosingDiv);\n var newSiteTitle;\n if(version.major < 2){\n newSiteTitle = (getElementText("siteTitle") + " - " + getElementText("siteSubtitle")).htmlEncode();\n } else {\n newSiteTitle = (wikifyPlain ("SiteTitle") + " - " + wikifyPlain ("SiteSubtitle")).htmlEncode();\n }\n\n revised = revised.replaceChunk("<title"+">","</title"+">"," " + newSiteTitle + " ");\n revised = revised.replaceChunk("<!--PRE-HEAD-START--"+">","<!--PRE-HEAD-END--"+">","\sn" + store.getTiddlerText("MarkupPreHead","") + "\sn");\n revised = revised.replaceChunk("<!--POST-HEAD-START--"+">","<!--POST-HEAD-END--"+">","\sn" + store.getTiddlerText("MarkupPostHead","") + "\sn");\n revised = revised.replaceChunk("<!--PRE-BODY-START--"+">","<!--PRE-BODY-END--"+">","\sn" + store.getTiddlerText("MarkupPreBody","") + "\sn");\n revised = revised.replaceChunk("<!--POST-BODY-START--"+">","<!--POST-BODY-END--"+">","\sn" + store.getTiddlerText("MarkupPostBody","") + "\sn");\n\n var response = this.uploadContent(revised, storeUrl, toFilename, uploadDir, backupDir, \n username, password, function (responseText) {\n if (responseText.substring(0,1) != '0') {\n alert(responseText);\n displayMessage(config.macros.upload.messages.fileNotUploaded.format([getLocalPath(document.location.toString())]));\n }\n else {\n if (uploadDir !== '') {\n toFilename = uploadDir + "/" + config.macros.upload.basename(toFilename);\n } else {\n toFilename = config.macros.upload.basename(toFilename);\n }\n var toFileUrl = config.macros.upload.toFileUrl(storeUrl, toFilename, uploadDir, username);\n if (responseText.indexOf("destfile:") > 0) {\n var destfile = responseText.substring(responseText.indexOf("destfile:")+9, \n responseText.indexOf("\sn", responseText.indexOf("destfile:")));\n toFileUrl = config.macros.upload.toRootUrl(storeUrl, username) + '/' + destfile;\n }\n else {\n toFileUrl = config.macros.upload.toFileUrl(storeUrl, toFilename, uploadDir, username);\n }\n displayMessage(config.macros.upload.messages.mainFileUploaded.format(\n [toFileUrl]), toFileUrl);\n if (backupDir && responseText.indexOf("backupfile:") > 0) {\n var backupFile = responseText.substring(responseText.indexOf("backupfile:")+11, \n responseText.indexOf("\sn", responseText.indexOf("backupfile:")));\n toBackupUrl = config.macros.upload.toRootUrl(storeUrl, username) + '/' + backupFile;\n displayMessage(config.macros.upload.messages.backupFileStored.format(\n [toBackupUrl]), toBackupUrl);\n }\n var log = new config.macros.upload.UploadLog();\n log.endUpload();\n store.setDirty(false);\n // erase local lock\n if (window.BidiX && BidiX.GroupAuthoring && BidiX.GroupAuthoring.lock) {\n BidiX.GroupAuthoring.lock.eraseLock();\n // change mtime with new mtime after upload\n var mtime = responseText.substr(responseText.indexOf("mtime:")+6);\n BidiX.GroupAuthoring.lock.mtime = mtime;\n }\n \n \n }\n // for debugging store.php uncomment last line\n //DEBUG alert(responseText);\n }\n );\n};\n\nconfig.macros.upload.uploadContent = function(content, storeUrl, toFilename, uploadDir, backupDir, \n username, password, callbackFn) {\n var boundary = "---------------------------"+"AaB03x"; \n var request;\n try {\n request = new XMLHttpRequest();\n } \n catch (e) { \n request = new ActiveXObject("Msxml2.XMLHTTP"); \n }\n if (window.netscape){\n try {\n if (document.location.toString().substr(0,4) != "http") {\n netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');}\n }\n catch (e) {}\n } \n //DEBUG alert("user["+config.options.txtUploadUserName+"] password[" + config.options.pasUploadPassword + "]");\n // compose headers data\n var sheader = "";\n sheader += "--" + boundary + "\sr\snContent-disposition: form-data; name=\s"";\n sheader += config.macros.upload.formName +"\s"\sr\sn\sr\sn";\n sheader += "backupDir="+backupDir\n +";user=" + username \n +";password=" + password\n +";uploaddir=" + uploadDir;\n // add lock attributes to sheader\n if (window.BidiX && BidiX.GroupAuthoring && BidiX.GroupAuthoring.lock) {\n var l = BidiX.GroupAuthoring.lock.myLock;\n sheader += ";lockuser=" + l.user\n + ";mtime=" + l.mtime\n + ";locktime=" + l.locktime;\n }\n sheader += ";;\sr\sn"; \n sheader += "\sr\sn" + "--" + boundary + "\sr\sn";\n sheader += "Content-disposition: form-data; name=\s"userfile\s"; filename=\s""+toFilename+"\s"\sr\sn";\n sheader += "Content-Type: " + config.macros.upload.contentType + "\sr\sn";\n sheader += "Content-Length: " + content.length + "\sr\sn\sr\sn";\n // compose trailer data\n var strailer = new String();\n strailer = "\sr\sn--" + boundary + "--\sr\sn";\n //strailer = "--" + boundary + "--\sr\sn";\n var data;\n data = sheader + content + strailer;\n //request.open("POST", storeUrl, true, username, password);\n try {\n request.open("POST", storeUrl, true); \n }\n catch(e) {\n alert(config.macros.upload.messages.crossDomain + "\snError:" +e);\n exit;\n }\n request.onreadystatechange = function () {\n if (request.readyState == 4) {\n if (request.status == 200)\n callbackFn(request.responseText);\n else\n alert(config.macros.upload.messages.errorUploadingContent + "\snStatus: "+request.status.statusText);\n }\n };\n request.setRequestHeader("Content-Length",data.length);\n request.setRequestHeader("Content-Type","multipart/form-data; boundary="+boundary);\n request.send(data); \n};\n\n\nconfig.macros.upload.download = function(uploadUrl, uploadToFilename, uploadDir, uploadBackupDir, \n username, password) {\n var request;\n try {\n request = new XMLHttpRequest();\n } \n catch (e) { \n request = new ActiveXObject("Msxml2.XMLHTTP"); \n }\n try {\n if (uploadUrl.substr(0,4) == "http") {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");\n }\n else {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");\n }\n } catch (e) { }\n //request.open("GET", document.location.toString(), true, username, password);\n try {\n request.open("GET", document.location.toString(), true);\n }\n catch(e) {\n alert(config.macros.upload.messages.crossDomain + "\snError:" +e);\n exit;\n }\n \n request.onreadystatechange = function () {\n if (request.readyState == 4) {\n if(request.status == 200) {\n config.macros.upload.uploadChangesFrom(request.responseText, uploadUrl, \n uploadToFilename, uploadDir, uploadBackupDir, username, password);\n }\n else\n alert(config.macros.upload.messages.errorDownloading.format(\n [document.location.toString()]) + "\snStatus: "+request.status.statusText);\n }\n };\n request.send(null);\n};\n\n//}}}\n////===\n\n////+++!![Initializations]\n\n//{{{\nconfig.lib.options.init('txtUploadStoreUrl','store.php');\nconfig.lib.options.init('txtUploadFilename','');\nconfig.lib.options.init('txtUploadDir','');\nconfig.lib.options.init('txtUploadBackupDir','');\nconfig.lib.options.init('txtUploadUserName',config.options.txtUserName);\nconfig.lib.options.init('pasUploadPassword','');\nsetStylesheet(\n ".pasOptionInput {width: 11em;}\sn"+\n ".txtOptionInput.txtUploadStoreUrl {width: 25em;}\sn"+\n ".txtOptionInput.txtUploadFilename {width: 25em;}\sn"+\n ".txtOptionInput.txtUploadDir {width: 25em;}\sn"+\n ".txtOptionInput.txtUploadBackupDir {width: 25em;}\sn"+\n "",\n "UploadOptionsStyles");\nconfig.shadowTiddlers.UploadDoc = "[[Full Documentation|http://tiddlywiki.bidix.info/l#UploadDoc ]]\sn"; \nconfig.options.chkAutoSave = false; saveOptionCookie('chkAutoSave');\n\n//}}}\n////===\n\n////+++!![Core Hijacking]\n\n//{{{\nconfig.macros.saveChanges.label_orig_UploadPlugin = config.macros.saveChanges.label;\nconfig.macros.saveChanges.label = config.macros.upload.label.saveToDisk;\n\nconfig.macros.saveChanges.handler_orig_UploadPlugin = config.macros.saveChanges.handler;\n\nconfig.macros.saveChanges.handler = function(place)\n{\n if ((!readOnly) && (document.location.toString().substr(0,4) != "http"))\n createTiddlyButton(place,this.label,this.prompt,this.onClick,null,null,this.accessKey);\n};\n\n//}}}\n////===\n
\n<!--{{{-->\n\n<div class='toolbar'>\n <span macro="showWhenTagged systemConfig">\n <span macro="toggleTag systemConfigDisable . '[[disable|systemConfigDisable]]'"></span>\n </span>\n <span style="padding:1em;"></span>\n <span macro='toolbar closeTiddler closeOthers +editTiddler deleteTiddler undoChanges permalink references jump newHere newJournalHere'></span>\n</div>\n\n<div class="tagglyTagged" macro="tags"></div>\n\n<div class='titleContainer'>\n <span class='title' macro='view title'></span>\n <span macro="miniTag"></span>\n</div>\n\n<div class='subtitle'>\n <span macro='view modifier link'></span>,\n <span macro='view modified date [[DD-mmm-YY]]'></span>\n (<span macro='message views.wikified.createdPrompt'></span>\n <span macro='view created date [[DD-mmm-YY]]'></span>)\n</div>\n\n<div macro="showWhenExists ViewPanelTemplate">[[ViewPanelTemplate]]</div>\n\n<div macro="hideWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')">\n <div class='viewer' macro='view text wikified'></div>\n</div>\n<div macro="showWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')">\n <div class='viewer'><pre macro='view text'></pre></div>\n</div>\n\n<div macro="showWhenExists ViewDashboardTemplate">[[ViewDashboardTemplate]]</div>\n\n<div class="tagglyTagging" macro="tagglyTagging"></div>\n\n<!--}}}-->\n
Ten serwis używa [[TiddlyWiki|http://www.tiddlywiki.com]] - elektronicznego notatnika idealnego do zarządzania listami "Do zrobienia", informacjami osobistymi etc.\n\nNie mogę zagwarantować, że zamieszczone tu informacje będą przydatne, nie obiecuję również, że będą pełne. Po prostu potrzebowałem miejsca w sieci na zamieszczenie różnego rodzaju notatek, których kiedyś mogę potrzebować. Jeśli jednak Ci się przydadzą, to będzie mi bardzo miło.
!Uruchomienie karty USB WLAN\n[>img[http://www.slubek.top.pl/img/GB-USB-WLAN.jpg][Karta USB WLAN]]\n!!Sprawdzenie\nPrzed instalacją sprawdź, czy faktycznie masz opisaną tu kartę. Włóż kartę i wykonaj:\n{{{\n# lsusb\n}}}\nJeśli widzisz poniższą linijkę,\n{{{\nBus 001 Device 002: ID 1044:8007 Chu Yuen Enterprise Co., Ltd\n}}}\nmożesz czytać dalej.\n\n!!Przygotowanie\nSterownik karty wymaga obecności źródeł aktualnego jądra. Zainstaluj pakiet {{{kernel-devel}}}:\n{{{\n# yum install kernel-devel\n}}}\n\n!!Instalacja sterowników\nSterowniki dostępne są na stronie http://rt2x00.serialmonkey.com/wiki/index.php?title=Downloads\n* Pobierz aktualną wersję opisaną jako ''Latest BETA rt2570 driver'', zapisz w katalogu {{{/home/uzytkownik}}}\n* Przejdź do {{{/usr/local/src}}}, rozpakuj pobrane źródła\n{{{\n# tar -xzvf /home/uzytkownik/rt2570-1.1.0-b2.tar.gz\n}}}\n* wejdź do katalogu zawierającego rozpakowane źródła, uruchom kompilację i zainstaluj sterownik:\n{{{\n# make\n# make install\n}}}\n* jeśli masz zainstalowane dwa pakiety z kernelem, sprawdź, w którym został zainstalowany sterownik:\n{{{\n# cd /lib/modules\n# find | grep rt2570\n./2.6.18-8.el5/extra/rt2570.ko\n# uname -r\n2.6.18-8.1.1.el5\n}}}\nJeśli wersje jądra są różne, musisz skopiować plik (znaleziony przez {{{find}}}) do katalogu, z którego korzysta aktualny kernel (identyfikowany przez {{{uname -r}}}).\n{{{\n# cp 2.6.18-8.el5/extra/rt2570.ko 2.6.18-8.1.1.el5/extra\n}}}\n!!Uruchomienie\nPoinformuj jądro, że ma nowy sterownik:\n{{{\n# depmod -a\n}}}\nTeraz możesz już włożyć kartę. Będzie dostępna jako urządzenie {{{rausb0}}}. Wykonaj \n{{{\n# iwconfig rausb0\n}}}\nUruchom {{{system-config-networks}}} i skonfiguruj nowy port.
| tiddlyspot password:|<<option pasUploadPassword>>|\n| site management:|<<upload http://slubek.tiddlyspot.com/store.cgi index.html . . slubek>>//(requires tiddlyspot password)//<<br>>[[control panel|http://slubek.tiddlyspot.com/controlpanel]], [[download (go offline)|http://slubek.tiddlyspot.com/download]]|\n| links:|[[tiddlyspot.com|http://tiddlyspot.com/]], [[FAQs|http://faq.tiddlyspot.com/]], [[announcements|http://announce.tiddlyspot.com/]], [[blog|http://tiddlyspot.com/blog/]], email [[support|mailto:support@tiddlyspot.com]] & [[feedback|mailto:feedback@tiddlyspot.com]], [[donate|http://tiddlyspot.com/?page=donate]]|