Jogger Minia

Strona w permanentnej budowie.

Zaktualizowane GG2Jab

Opublikowano 30 marca 2011 o 22:28:35.

Nie to, żeby to kogokolwiek interesowało, ale zaktualizowałem swój poradnik GG2Jab. Porobiłem nowe zrzuty ekranu, dla Psi 0.14 na Windowsie 7, do tego naniosłem niewielkie poprawki w samym tekście.

Konwerter pliku listy kontaktów GG XML → CSV

Opublikowano 20 lutego 2011 o 12:53:28.

Niedawno stworzyłem konwerter pliku listy kontaktów GG XML → CSV. Innymi słowy — konwerter pliku listy kontaktów z nowego formatu (od GG 8) do starego formatu (GG 7 i wcześniejsze). Dlaczego? Choćby dlatego, że konwerter Chomika potrzebuje pliku listy kontaktów CSV. Po drugie dlatego, że już od dawna nosiłem się z zamiarem opisania schematu nowego pliku kontaktów, więc przy okazji zrobiłem konwerter.

Aplet umożliwiający użytkownikom wygenerowanie adresu kanału RSS

Opublikowano 19 marca 2009 o 00:19:37.

W niedzielę opublikowałem swoje narzędzie do generowania adresów kanałów subskrypcji dla Joggerowych blogów. Jak się szybko okazało, Livio dysponował podobnym, napisanym przez eRIZ'a . O ile jednak moje było stworzone z myślą o osobach zarządzających blogami, o tyle Livio jest bardziej Web 2.0 i chciał mieć aplet umożliwiający czytelnikom samodzielne generowanie linku do interesującego ich kanału prenumeraty. Jakkolwiek liczę że moje narzędzie uzasadni swe istnienie, jestem przekonany że również Liviowy znajdzie swych amatorów. Po krótkiej wymianie zdań uzgodniliśmy, że mogę opublikować kod, po pewnych przeróbkach i pod pewnymi warunkami.

Kod eRIZ'a wykorzystywał bibliotekę jQuery. Jakkolwiek u Livio zdawało to egzamin, nie jestem przekonany aby inni Joggerowcy chętnie linkowali do tej biblioteki, zwłaszcza gdy aplet ów miałby być jedynym elementem dynamicznym na ich blogach. Dlatego zdecydowałem się przepisać kod na czysty JavaScript. Preferowałem też odmienne od eRIZ'a podejście do sprawy, w wyniku czego kod uległ ponad dwukrotnemu skróceniu. Z drugiej strony jQuery umożliwia proste tworzenie suwaków (i podpinanie pod nie zdarzeń), z czym musiałem sobie jakoś poradzić. Nie mając czasu ani ochoty na samodzielność w tej kwestii, zdecydowałem się wykorzystać jedną z dostępnych w Internecie bibliotek do tworzenia suwaków. Była trochę zbyt ogólna jak na moje potrzeby, więc nie obyło się bez usunięcia kilku zbędnych fragmentów. Ostatecznie kod wygląda tak:

 
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Make few things clear:
 * most of code below comes from
   http://www.arantius.com/article/lightweight+javascript+slider+control
 * said part is responsible for slider
 * the rest (from updateRssLink() to the end) is written by Minio
 * eRIZ ( http://eriz.pcinside.pl/weblog ) should be mentioned for writing 
   original code (unfortunately, it was jQuery-dependent)
 * Livio ( http://blog.jakubrusinek.pl/ ) should be mentioned for coming
   with whole idea
 
Copyright (c) 2006 Anthony Lieuallen, http://www.arantius.com/
Copyleft 2008 Mirosław „Minio” Zalewski <miniopl@gmail.com> http://minio.xt.pl
 
Permission is hereby granted, free of charge, to any person obtaining a copy of 
this software and associated documentation files (the "Software"), to deal in 
the Software without restriction, including without limitation the rights to 
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 
the Software, and to permit persons to whom the Software is furnished to do so, 
subject to the following conditions:
 
The above copyright notice and this permission notice shall be included in all 
copies or substantial portions of the Software.
 
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
var $ = function(ID) {
        return document.getElementById(ID);
}
 
function addAnEvent(el, evname, func) {
        if (el.attachEvent) { // IE
                el.attachEvent("on" + evname, func);
        } else if (el.addEventListener) { // Gecko / W3C
                el.addEventListener(evname, func, true);
        } else {
                el["on" + evname] = func;
        }
}
 
function setBoxValue(val, box) {
        val=Math.round(val);
        $('rssCount').firstChild.nodeValue=val;
}
 
function drawSliderByVal(slider) {
        var knob=slider.getElementsByTagName('div')[0];
        var p=(slider.val-slider.min)/(slider.max-slider.min);
        var x=(slider.scrollWidth-30)*p;
        knob.style.left=x+"px";
}
 
function setSliderByClientX(slider, clientX) {
        var p=(clientX-slider.offsetLeft-15)/(slider.scrollWidth-30);
        slider.val=(slider.max-slider.min)*p + slider.min;
        if (slider.val>slider.max) slider.val=slider.max;
        if (slider.val<slider.min) slider.val=slider.min;
 
        drawSliderByVal(slider);
        setBoxValue(slider.val, slider.num);
}
 
function sliderClick(e) {
        var el=sliderFromEvent(e);
        if (!el) return;
 
        setSliderByClientX(el, e.clientX);
}
 
function sliderMouseMove(e) {
        var el=sliderFromEvent(e);
        if (!el) return;
        if (activeSlider<0) return;
 
        setSliderByClientX(el, e.clientX);
        stopEvent(e);
}
 
function sliderFromEvent(e) {
        if (!e && window.event) e=window.event;
        if (!e) return false;
 
        var el;
        if (e.target) el=e.target;
        if (e.srcElement) el=e.srcElement;
 
        if (!el.getAttribute('id') || !el.getAttribute('id').match(/rssSlider/)) el=el.parentNode;
        if (!el) return false;
        if (!el.getAttribute('id') || !el.getAttribute('id').match(/rssSlider/)) return false;
 
        return el;
}
 
function attachSliderEvents() {
        var s = $('rssSlider');
        s.min = 10;
        s.max = 100;
        s.val = 10;
        s.num = 1;
        drawSliderByVal(s);
 
        addAnEvent(s, 'mousedown', function(e){
                sliderClick(e);
                var el=sliderFromEvent(e);
                if (!el) return;
                activeSlider=el.num;
                stopEvent(e);
        });
 
        addAnEvent(document, 'mouseup', function(e){
                activeSlider=-1;
                var el=sliderFromEvent(e);
                if (!el) return;
                stopEvent(e);
        });
}
 
//borrowed from prototype: http://prototype.conio.net/
function stopEvent(event) {
        if (event.preventDefault) {
                event.preventDefault();
                event.stopPropagation();
        } else {
                event.returnValue=false;
                event.cancelBubble=true;
        }
}
 
addAnEvent(document, 'mousemove', sliderMouseMove);
var activeSlider=-1;
 
function updateRssLink() {
        var link = '/';
        link += $('rssFormat').options[$('rssFormat').selectedIndex].value + '/';
        if ($('rssAuth') && $('rssAuth').value) link += 'auth/' + $('rssAuth').value + '/';
        link += $('rssFull').checked ? 'content/' : 'short/';
        if ($('rssHTML').checked) link += 'html/';
        if ($('rssMiniblog').checked) link += 'miniblog/';
        link += $('rssCount').firstChild.nodeValue;
        $('rssLink').setAttribute('href', link);
}
 
function initRss() {
        attachSliderEvents();
        addAnEvent($('rssOptions'), 'change', updateRssLink);
        addAnEvent(document, 'mouseup', updateRssLink);
        if ($('authDesc')) addAnEvent($('authDesc'), 'click', function() {
                                $('authDesc').style.display = 'none';
                                $('authDescDiv').style.display = 'block';
                        });
        /*@cc_on @*/
        /*@if (@_win32)
        // IE jest po prostu zbyt tępy żeby niektóre rzeczy wykonywać dobrze...
                addAnEvent($('rssFormat').options, 'propertychange', updateRssLink);
                addAnEvent($('rssAuth'), 'propertychange', updateRssLink);
                addAnEvent($('rssFull'), 'propertychange', updateRssLink);
                addAnEvent($('rssHTML'), 'propertychange', updateRssLink);
                addAnEvent($('rssMiniblog'), 'propertychange', updateRssLink);
        /*@end @*/
}
 
//--------------------------------------------------
// Jeżeli wykorzystujesz już jakieś skrypty na swoim Joggu, najpewniej
// i tak masz jakąś funkcję odpowiadającą za uruchamianie czego trzeba 
// z chwilą załadowania strony (zdarzenie „load”). Po prostu dopisz tam
//              initRss();
// a poniższe usuń.
//-------------------------------------------------- 
window.onload = initRss;
 

Oczywiście kod jest bezużyteczny bez formularza który miałby być obsługiwany. Kod HTML zaczerpnąłem od Livio, jednak tutaj zmiany są znacznie mniejsze i praktycznie ograniczają się do dodania domyślnie niewidocznego pola pozwalającego na wpisanie identyfikatora użytkownika. Ponieważ nie wszyscy korzystają z poziomów powyżej drugiego, pole to trzeba sobie odkomentować.

 
        <head>
                ...
                <script src="/files/feedBuilder.js" type="text/javascript"></script>
                ...
        </head>
        <body>
                <fieldset id="rssgenerator" style="display: block;">
 
                        <h2>Generator RSS</h2>
 
                        <p>Wybierz, co chcesz otrzymywać w kanale RSS/Atom.</p>
 
                        <form method="get" action="" id="rssOptions" style="display: block;">
                                <ul>
                                        <li>
                                        <label for="rssFormat">Format</label>
                                                <select id="rssFormat">
                                                        <option selected="selected" value="atom">Atom</option>
                                                        <option value="rss">RSS</option>
                                                </select>
                                        </li>
                                        <li>
                                                <input type="checkbox" id="rssFull"/>
                                                <label for="rssFull">Pełna treść wpisów</label>
                                        </li>
                                        <li>
                                                <input type="checkbox" id="rssMiniblog"/>
                                                <label for="rssMiniblog">Wpisy z minibloga</label>
                                        </li>
                                        <li>
                                                <input type="checkbox" id="rssHTML"/>
                                                <label for="rssHTML">Formatowanie HTML we wpisach</label>
                                        </li>
                                        <!-- Odkomentuj jeżeli publikujesz na poziomach wyższych niż 2.
                                        <li>
                                                <span id="authDesc">Posiadam dostęp do wyższych kategorii i chciałbym się autoryzować.</span>
                                                <div id="authDescDiv">
                                                        <label for="rssAuth">Identyfikator użytkownika</label>
                                                        <input type="text" id="rssAuth">
                                                </div>
                                        </li>
                                        -->
                                        <li>
                                                <span>Liczba wpisów w kanale <small>(użyj suwaka poniżej)</small>: <strong id="rssCount">10</strong></span>
                                                <div class="slider" id="rssSlider" style="-moz-user-select: none;">
                                                        <div class="grip" tabindex="1" style="position: relative; left: 145.12px; top: 0px; display: block;"/>
                                                </div>
                                        </li>
                                        <li>
                                                <a class="rssLink" id="rssLink" href="http://liviopl.jogger.pl/atom/content/html/20/">Kanał RSS/Atom dla Ciebie</a>
                                        </li>
                                </ul>
                        </form>
 
                </fieldset>
 

Ostatnim krokiem jest zadbanie o prezentację formularza.

 
/*
 * Oryginał stworzony w 2008 przez Livio ( http://jakubrusinek.pl/ ), wykorzystany za zgodą.
 * Inspirowany fragmentami pliku resetującego CSS Wasacza ( http://blog.wasacz.net/2008/04/13/resetowanie-css-po-mojemu/ )
 * Drobnych modyfikacji dokonał Mirosław „Minio” Zalewski <miniopl@gmail.com> http://minio.xt.pl
*/
 
#rssgenerator h2, #rssgenerator a, 
#rssgenerator p, 
#rssgenerator li, #rssgenerator ul, 
#rssgenerator fieldset {
        margin: 0;
        padding: 0;
        border: none;
        outline: none;
        font-style: normal;
        font-weight: normal;
        font-size: 100%;
        line-height: normal;
        text-align: left;
        text-decoration: none;
}
 
#rssgenerator input, #rssgenerator option, #rssgenerator select { font-family: "Lucida Grande", "Lucida Sans Unicode", "DejaVu Sans", "DejaVu LGC Sans", "Liberation Sans", sans-serif; } /* customizable */
#rssgenerator input, #rssgenerator option, #rssgenerator select { font-size: 100%; }
#rssgenerator ol, #rssgenerator ul { list-style: none; }
#rssgenerator strong { font-weight: bold; }
 
#rssgenerator {
 background: #fbf8f1;
 display: none;
 padding: 15px;
 border-bottom: 1px solid #CDB88C;
}
 
#rssgenerator h2 {
 font-weight: bold;
 font-size: 1.25em;
 padding: 10px;
 border-bottom: 1px solid #E2D4B2;
}
 
#rssgenerator li {
 font-size: 0.75em;
}
 
#rssgenerator p {
 padding: 5px;
 padding-top: 15px;
}
 
#rssgenerator ul {
 padding: 5px 0;
}
 
#rssgenerator li {
 padding: 5px 15px;
}
 
#rssgenerator #authDesc {
        cursor: pointer;
}
 
#rssgenerator #authDescDiv {
        display: none;
}
 
#rssgenerator .slider {
 margin: 10px;
 z-index: 1;
 
 /* zakomentuj poniższe, a odkomentuj background, jeżeli chcesz użyć
  * obrazków do tworzenia suwaka */
 background-color: #d6d6d6;
 border: 1px #c6c6c6 solid;
 
/*--------------------------------------------------
*  background: center url('/files/slider.png') repeat-x;
*--------------------------------------------------*/
 
 height: 13px;
 cursor: pointer;
}
 
#rssgenerator .grip {
 z-index: 2;
 overflow: hidden;
 width: 29px;
 height: 11px; /* Jeżeli zdecydujesz się na wybranie obrazka tła, zwiększ tę wielkość (najpewniej do 13px) */
 
 background-color: white;
 border: 1px #9c9c9c solid;
 
/*--------------------------------------------------
*  background: center url('/files/grip.png') repeat-x;
*--------------------------------------------------*/
 
 cursor: move;
}
 
#rssgenerator input[type=checkbox], #rssgenerator label[for=rssFull], #rssgenerator label[for=rssMiniblog], #rssgenerator label[for=rssHTML] {
 cursor: pointer;
}
 
#rssgenerator input[type=checkbox] {
 vertical-align: middle;
 margin: 0;
 padding: 2.5px;
}
 
#rssgenerator .rssLink {
 padding: 15px 0 15px 26px;
 font-size: 1.em;
 text-decoration: underline;
 color: blue;
 background: 5px center no-repeat url('/files/rss-full.png');
}
 

Suwak może i wyglądem nie grzeszy, jednak można to w prosty sposób zmienić przygotowując pliki grip.png i slider.png, odpowiadające kolejno za suwak i linię tła. Powyżej znajdują się te przygotowane przez Livio, inspirowane, jak się domyślam, motywem Human motywem Gilouche dla GNOME. Oczywiście korzystając z nich trzeba pamiętać aby usunąć z CSS-a fragmenty odpowiadające za tło i obramowanie elementów .grip i .slider.

Całość łaskawie oddaję Joggerowej społeczności, z prawem do dystrybucji i modyfikowania wedle uznania oraz potrzeb (co dotyczy zwłaszcza pliku CSS). Kod zamieszczam również na Joggerowej wiki, gdzie prawdopodobnie ma większe szanse na długotrwałe przetrwanie.

jRSS — Jogger Feeds Location Generator

Opublikowano 15 marca 2009 o 14:07:36.

Za każdym razem gdy tworzę nowy szablon napotykam na ten sam problem — konieczność wklejenia do nagłówka linków do kanałów RSS i/lub ATOM. Oczywiście w najprostszej wersji wystarczy doklejenie do adresu URL Joggera tekstu rss/ (lub, stosownie, atom/), jednak, po pierwsze, i tak nigdy tego nie pamiętam, a po drugie Jogger pozwala generować całą serię specyficznych kanałów RSS. Wszystkie opcje zostały opisane na Joggerowej wiki, jednak artykuł ten nie jest do końca jasny. Np. nie jest dobrze opisane jak wygenerować kanał dla dwóch kategorii, który jednocześnie zawierałby wpisy umieszczone również w miniblogu, a do tego serwował je w całości, i to w HTML-u. Być może nikt nigdy dostępu do takiego kanału nie potrzebował, ale nie zmienia to faktu że Jogger potrafi go udostępnić.

Zainspirowany ciągłym przeglądaniem wspomnianego artykułu, zdecydowałem się napisać narzędzie które samo będzie tworzyło adresy kanałów subskrypcji. Obsługuje ono wszystkie dostępne opcje, włącznie z autoryzacją użytkowników oraz kanałami komentarzy poszczególnych wpisów (niestety nie udało mi się znaleźć informacji o tym, czy Jogger udostępnia kanał wszystkich komentarzy z bloga, więc nawet jeżeli tak to chwilowo tej opcji brak). Przydatne będzie wszystkim którzy chcą dodać do swojego Joggera adres kanału RSS, ale nie bardzo wiedzą jak się do tego zabrać, oraz, tak jak ja, znudzonym ciągłym zaglądaniem do wiki.

Narzędzie jest napisane w JavaScripcie i znajduje się pod adresem minio.xt.pl/jRSS/. Korzystając z okazji pragnę poinformować, że przetwarzania po stronie serwera nie ma i nie będzie.

Ekstraktor kontaktów GG z Jabberowego rostera

Opublikowano 26 października 2008 o 16:36:41.

Jak wszyscy wiemy, transporty sszą na maxa. Przez dłuższy czas przesiadka z GG na XMPP była jednostronna – wydzielenie przekonwertowanych kontaktów GG wiązało się z montonnym kopiowaniem numerów i ręcznym ich wklejaniem do programu docelowego. Swego czasu kg udostępnił prosty ekstraktor, jednak jest on bardzo ograniczony – obsługuje jedynie archaiczny plik konfiguracyjny Psi.

Wychodząc naprzeciw rzadkim i nieśmiałym prośbom użytkowników niezadowolonych z jakości usług transportów, napisałem znacznie bardziej rozbudowny ekstraktor generujący plik listy kontaktów akceptowalny przez GG w wersji 7. Strona domowa projektu znajduje się pod adresem http://minio.xt.pl/jab2gg/, a sam ekstraktor: http://minio.komunikatory.pl/jab2gg/jab2gg.pl.

homepage - reaktywacja

Opublikowano 21 stycznia 2007 o 15:19:14.

Projekt powstał już w październiku ubiegłego roku. Pod koniec owego miesiąca zabrałem się za realizację projektu, jednak dokładnie 31 października przeszkodziła mi awaria systemu plików (ext3).

Przez dokładnie pół listopada zajmowałem się reaktywacją komputera. Korzystając z okazji, wypróbowałem dwie nowe dystrybucji. Były to: Debian (w którym zirytowała mnie specyficzność - niemal do wszystkiego jest jakiś skrypt, które jednak trzeba zdać; daleko mu do prostoty Archa) oraz PLD (który w rezultacie się nawet nie zainstalował).

W rezultacie znów moją duszą włada Gentoo Linux, tym razem z /home na osobnej partycji, na której gości ReiserFS. Do tej pory sprawdza się doskonale, chociaż zrezygnowałem z masowego aktualizowania systemu. emerge --sync oraz emerge -uDav system w pełni mi wystarczają. Do tego czasami emerge -uDv world |less by rzucić okiem, co można zaktualizować. Te programy aktualizuję ręcznie.

Po doprowadzeniu komputera do stanu używalności zająłem się techniczną warstwą strony - przy okazji nauczyłem sie troche PHP, który przypadł mi do gustu.
W czasie przerwy świątecznej napisałem większość z treści strony. Była już niemal gotowa, jednak pojawił się pomysł, by dodać opcję sortowania tekstów wg dat.

W tym celu użyłem JavaScriptu, który wyjątkowo mi nie podpasował. Nie ukrywam - nie rozumiem tego języka. Nie miałem wielkich ambicji - zastąpić jedną treść listy inną. Okazało się to wyjatkowo trudnym zadaniem, chcąc użyć DOM. W rezultacie skorzystałem z dość brzydkiej sztuczki, która jednak działa, co mnie zadowala.

Po powyższym, całkowicie chaotycznym streszczeniu, przechodzę do głównej treści tej notki:
Od dzisiaj strona pod adresem minio.xt.pl (minio.komunikatory.pl) jest znów dostępna i nie straszy informacją o jej 'budowaniu'. Straszy za to użytkowników Jedynej Słusznej Przegladarki, gdyż i wykrzacza się chyba na każdy możliwy sposób. Co nie znaczy, że treść nie jest dostępna - nie powinni mieć najmniejszych kłopotów z dostępem do niej.

Z tego powodu pradowpodobnie niedługo na stronie znów zaczną pojawiać się moje teksty nie będące poradnikami, o czym z pewnością poinformuje na joggu. Już mam na oku dwa tematy, ale na razie sza.

WAK

Opublikowano 03 sierpnia 2006 o 11:15:14.

Przedstawiam Wam efekt kilkuset godzin przed terminalem, efekt pracy kilku(nastu?) wolontariuszy, efekt dyskusji i wymiany poglądów poprzez niemal każdy dostępny protokół komunikacyjny. Przedstawiam Wam kampanię "Wybierz Alternatywny Komunikator".

http://promocja.komunikatory.pl

No i co, że notka jest spóźniona 2 dni?

styl

Opublikowano 28 maja 2006 o 11:18:27.

Jak widać, zmieniłem styl. Z początku miałem zamiar stworzyć własny w oparciu o jakiś istniejący, ale nie wyszło. Tworzenie od podstaw jest znacznie łatwiejsze niż modyfikowanie czegoś, co juz istnieje, zwłaszcza, gdy ma sie o tym nikłe pojęcie. Anyway i tak troszkę zmieniłem ten styl, bo mi tak nie bardzo odpowiadało wszystko, choć do szczytu marzeń jeszcze temu brakuje.
Jakiś czas temu (dokładniej tydzień) wywaliłem Joomla!'ę z mojej strony, bo zbyt muliła. Nie to, że nie była elastyczna, ale ważyło to wszystko troche zbyt dużo jak na strone, w której treści jest doprawy niweiele. Napisałem od podstaw wszystko i efekty można oglądać pod adresem
minio.yoyo.pl
Przy okazji zaznaczam, żeby nie validować aliasu minio.xt.pl - ze względu na generowany przez skrypt ichniej strony nie przechodzi ona validacji - sama strona (z adresu wyżej) jest zgodna ze standardem.
Dodatkowo od wczoraj nowe wpisy powinny pojawiac się na głównej jogger.pl - coraz mniej jest sie czego wstydzić ;) .