Synchronizacja plików – problem akademicki

March 10th, 2010

Częstym problemem z jakim borykają się studenci jest synchronizacja plików pomiędzy kontem na uczelni, a innym komputerem (zazwyczaj prywatnym). Nakładają na to ulubiony sport wielu adminów – wkurwianie userów, mamy gotowy problem. Mi też zdarzyło się kilka razy, że po przekroczeniu quoty na koncie dokonano holokaustu. Zazwyczaj leciały jakieś duperele, ale i programy zaliczeniowe też poleciały. Zatem co zrobić?

Po pierwsze należy skonfigurować sobie konto na uczelni tak by było możliwe logowanie się za pomocą klucza. Jeżeli mamy z tym problem należy skontaktować się z administratorem i poprosić go wygenerowanie klucza.
Następnie musimy sprawdzić czy mamy możliwość dobicia się z konta uczelnianego na nasz lokalny komputer za pomocą ssh. Jak nie masz takiej możliwości to mały zonk, ale też się da. Względnie czy masz możliwość dobicia się na jakiś inny bezpieczny serwer. Polecam rootnode.net. Abonament jest stosunkowo niewielki, a korzyści duże. Szczególnie jak jesteś zmuszony do korzystania z programu udającego system operacyjny firmy na M to takie konto jest super.
Po drugie jeżeli nie pracujesz na uxach lub japkó to zainstaluj sobie cygwina. Sprawdź czy masz zainstalowanego rsynca. Jak nie to ściągnij źródła i zainstaluj (o tym w innym wpisie będzie).
Po trzecie czas przygotować sobie mały skrypt, który będzie wykorzystywał rsync.

Listing 1. Skrypt synchronizujący

#!/bin/bash

serwer=koziolek@localhost:/home/koziolek/Wideo/
dom=~/dom/

#Recovery mode.
if [ "x$1" = "x-R" ]
then
  rsync -Pah $dom $serwer
fi

#Backup mode
if [ "x$1" = "x-B" ]
then
  rsync -Pah $serwer $dom
fi

Wystarczy dodać to zadanie do crona i gotowe. Co robi ten skrypt? Jeżeli wywołamy go z opcją -B to wykona backup konta serwera. Jeżeli wykonamy go z opcją -R to na konto zostaną przerzucone pliki z dysku lokalnego.

Skrypt jest prosty jak konstrukcja cepa, albo jeszcze prostszy. Możesz go usprawnić i zalinkować w komentarzach do swojej wersji.

“Związki partnerskie” – uczmy się od żydów

March 1st, 2010

“Związek partnerski”, to wynalazek z przed jakiś 30 lat. Pomysł jest stosunkowo rozsądny, bo pozwala na rozwiązanie pewnych problemów natury prawnej (dziedziczenie, wizyty w szpitalu itp) w przypadku homosiów. Z drugiej strony to takie “niedorobione” małżeństwo w przypadku normalnych związków (tak, normalny = heteroseksualny), w którym występuje “syndrom starej panny” – chcem, alem siem bojem. Metod opisania w prawie tego typu relacji na świecie jest wiele. Mi jednak najbardziej podoba się ta z Izraela.
Od Żydów zawsze powinniśmy się uczyć. To bardzo mądry naród, który potrafi wiele problemów rozwiązywać w sposób cwany. W przypadku “związków partnerskich” utworzyli majstersztyk prawny. W Izraelu nie ma możliwości zawarcia związku przez dwie osoby tej samej płci. Jednocześnie państwo uznaje związki zawarte poza granicami. Mówiąc prościej dwóch imbryczkowatych żydów jedzie do Holandii i bierze ślub. Wracają do Izraela i nikt nie ma nic przeciwko. Jednocześnie na miejscu ichniejsze moherowe berety (zwane chałaciarzami) nie mogą się przyczepić do grzesznej praktyki w prawie. Wszystko cacy. Czyż nie jest to piękne rozwiązanie?

reCaptcha – jak wkurwić użytkownika

February 28th, 2010

Dziś trafiłem na mechanizm zabezpieczający, który nie jest w żaden sposób do przejścia. Zarówno dla bota jak i człowieka. Oto Egglue CAPTCHA. Mechanizm wymaga wpisania słowa, które intuicyjnie pasuje do reszty zdania. Kurwa… co znaczy intuicyjnie… mi się od razu dowcip kojarzy:

  • Jasiu co kojarzy ci się z wiosną?
  • Dupa proszę pani.
  • Jak tak możesz mówić? No dobrze, a co z kwiatami i dłuższym dniem?
  • Dupa proszę pani.
  • Jasiu!!
  • No ale jak mi się wszystko z dupą kojarzy?

Rozwiązanie to jest chyba najbardziej pojebanym captcha jakie istnieje. Przypomina pisanie obecnej matury z polskiego. W dodatku intuicyjność zazwyczaj kończy się tak, gdzie zaczyna się nauka angielskiego (bo wszystkie zdania są po angielsku) w szkole i idiomy. Ale spoko, za 15 podejściem udało mi się zarejestrować konto na jednym z portali.

Prośba nie używajcie egglue captcha, bo tylko wkurwicie użytkowników.

Ciekawa animacja – szermierka w praktyce

February 26th, 2010

Samurai from Phil Shoebottom on Vimeo.

Kolejne ciekawostki związane z IE i GWT

February 24th, 2010

Jak Gargamel smerfów, tak ja nie cierpię IE. Dziś zmagałem się z upiornym problemem dodawania ClickHandlera do elementu LI w którym siedzi DIV. W FF działa, w Operze działa, a nawet w Syfarynce działa, ale w jebanym IE7 nie. W czym rzecz. Generalnie W sposobie przetwarzania zdarzeń przez IE. Juz nie pamiętam o co dokładnie chodziło, ale jeżeli zdarzenie pochodzi z DIV umieszczonego w LI to jeżeli handler jest ustawiony dla LI to nie zostanie odpalony, bo zje go DIV.
Szczególnie wkurzające bywa to przy własnych komponentach budowanych od podstaw (czyli dziedziczących z ComplexPanel), gdyż wymaga dodatkowego warunku. No ale całe życie się uczymy i głupi umieramy.

Chwila z JQuery i GWT

February 24th, 2010

Dawno nie pisałem… opieprzam się jak trzeba :D no, ale…

Ostatnio w fabryczce postanowiłem użyć JQuery by wzbogacić aplikację GWT. Generalnie JQuery jest obecnie najlepszą biblioteką JavaScript jaka istnieje. Lekka (25KB – z kompresją), szybka, wydajna i co najważniejsze z bardzo prostym API. GWT znowuż jest chyba najwygodniejszym narzędziem do tworzenia GUI jeżeli nie chcemy wychodzić poza Javę lub gdy mamy w zespole “Swingersów” (nie mylić z pewną grupą eksperymentatorów seksualnych). API zbliżone do Swinga/AWT z niewielkimi rozszerzeniami właściwymi dla html.

Z JQuery interesował mnie tylko kawałek o animacjach, jednak wmyśl zasady DRY należało wykorzystać gotowy port, albo napisać coś przenośnego. Oczywiście Woojek Google od razu podpowiedział GWTQuery. Po szybkiej lustracji listy błędów doszedłem do wniosku, że to nie dla mnie. Szczególnie, że jak przeczytałem komentarz do błędu nr 8, to mało co z krzesła nie spadłem. Podwojenie czasu kompilacji nie jest możliwe (obecnie mamy klika modułów – 30 min walki w samym GWT). Trzeba zatem własnymi siłami przeportować JQuery na GWT.

Co nam jest tak naprawdę potrzebne

Jak się szybko okazało nie będzie to port 1:1, a raczej adapter wykorzystujący JSNI. Po drugie dość poważnym wrzodem okazał się brak metody setId pozwalającej na ustawienie htmlowego id dla obiektu w GWT. Jest za to ensureDebugId, ale wymaga dodania modułu com.google.gwt.user.Debug. No, ale nikt nie powiedział, że będzie łatwo. W każdym bądź razie, po dodaniu odpowiednich elementów w plikach xml przyszedł czas na stworzenie klasy JQuery. Klasa jest dość prosta do metody o takiej samej nazwie jak w JQuery dodaję jeszcze jeden parametr, ktory pozwala na identyfikację elementu. Następnie całość idzie przez JSNI bezpośrednio do metody JQuery. Na chwilę obecną wygląda to tak:

Listing 1. Adapter JQuery w GWT

package pl.koziolekweb.gwt.jquery;

/**
 * Klasa - fasada dla natywnych wywołań JQuery.
 *
 * @author Bartłomiej Kuczyński
 *
 */
public class JQuery {

	public static native void fadeIn(String elementSelector, Integer duration, String callback)/*-{
																$wnd.$(elementSelector).fadeIn(duration, function() {
																	eval(callback+"");
																});
																}-*/;

	public static native void fadeIn(String elementSelector, String duration, String callback)/*-{
																$wnd.$(elementSelector).fadeIn(duration, function() {
																	eval(callback+"");
																});
																}-*/;

	public static native void fadeOut(String elementSelector, Integer duration, String callback)/*-{
																$wnd.$(elementSelector).fadeOut(duration, function() {
																	eval(callback+"");
																});
																}-*/;

	public static native void fadeOut(String elementSelector, String duration, String callback)/*-{
																$wnd.$(elementSelector).fadeOut(duration, function() {
																	eval(callback+"");
																});
																}-*/;

	public static native void fadeTo(String elementSelector, Integer duration, Double opacity, String callback)/*-{
																		$wnd.$(elementSelector).fadeTo(duration, opacity, function() {
																			eval(callback+"");
																		});
																		}-*/;

	public static native void fadeTo(String elementSelector, String duration, Double opacity, String callback)/*-{
																		$wnd.$(elementSelector).fadeTo(duration, opacity, function() {
																			eval(callback+"");
																		});
																		}-*/;

	public static native void slideDown(String elementSelector, Integer duration, String callback)/*-{
																	$wnd.$(elementSelector).slideDown(duration, function() {
																		eval(callback+"");
																	});
																	}-*/;

	public static native void slideDown(String elementSelector, String duration, String callback)/*-{
																	$wnd.$(elementSelector).slideDown(duration, function() {
																		eval(callback+"");
																	});
																	}-*/;

	public static native void slideToggle(String elementSelector, Integer duration, String callback)/*-{
																	$wnd.$(elementSelector).slideToggle(duration, function() {
																		eval(callback+"");
																	});
																	}-*/;

	public static native void slideToggle(String elementSelector, String duration, String callback)/*-{
																	$wnd.$(elementSelector).slideToggle(duration, function() {
																		eval(callback+"");
																	});
																	}-*/;

	public static native void slideUp(String elementSelector, Integer duration, String callback)/*-{
																$wnd.$(elementSelector).slideUp(duration, function() {
																	eval(callback+"");
																});
																}-*/;

	public static native void slideUp(String elementSelector, String duration, String callback)/*-{
																$wnd.$(elementSelector).slideUp(duration, function() {
																	eval(callback+"");
																});
																}-*/;

}

Każda metoda ma dwie wersje, wynika to z faktu, że Java w przeciwieństwie do JS jest silnie typowana. Dodatkowo użycie metody eval() i parametru callback pozwala na wywołanie dodatkowego kodu JS po zakończeniu animacji.
Całość jest bardzo prosta i w miarę bezpieczna. Czasami tylko JQuery pójdzie w maliny… zapętli się przy jakiś dziwnych wywołaniach liczb jako string. Bywa zdarza się.

Kościół Heavy Metalu

February 16th, 2010

tak, wiem dawno nie było nic technicznego, ale nie mam czasu.

Dysmózgowie…

February 14th, 2010

Kiedyś o tym było, a dziś filmik:

Pomijając fakt, że autor chyba sam na nią cierpi (bo nie zamierza z nikim dyskutować i zaczyna od wyzywania widza, przypadek kliniczny), to filmik dość trafnie opisuje to schorzenie…

Duke ćwiczy

February 10th, 2010

I znowu o systemie rozliczeniowym

February 10th, 2010

Tym razem awaria SORBNETuW w NBP. Co się stało? Nie wiem, a nawet jak wiem to nie powiem. Generalnie coś im się posypało. Co dokładnie nie jest to istotne. Istotny jest wpływ tej awarii na działanie ElixiraW. Opisywałem kiedyś jak działa system rozliczeniowy. Opis był dość ogólny, ale styknie. Dla niechcących czytać.

  • Bank wysyła informacje o transakcjach do KIRu
  • KIR zbiera te informacje i o ustalonych godzinach na podstawie tych danych oblicza jak wyglądają przepływy finansowe pomiędzy bankami.
  • Wysyła te obliczenia do NBP
  • NBP fizycznie przelewa kasę pomiędzy bankami (upraszczając – każdy działający w Polsce bank ma w NBP konto).
  • KIR dostaje komunikat z NBP, jaki jest stan rozliczenia i…

… jeżeli wszystko jest ok, to banki otrzymują komunikaty o przelewach przychodzących i mogą dokonać odpowiednich księgowań na kontach. Jeżeli jednak okazuje się coś jest nie tak to mamy dwie drogi. W przypadku gdy jest to problem czysto biznesowy to znaczy, któryś z banków nie ma wystarczającej ilości gotówki by wykonać operację przelewu w NBP to następuje tak zwana gwarancja rozrachunku. Jest to dość skomplikowany proces matematyczny w wyniku którego z puli wszystkich operacji usuwane są operacje tak by banki mogły się rozliczyć i wszystkim wystarczyło pieniędzy. Oczywiście winowajca płaci karę.
Druga droga to wstrzymanie zakończenia sesji do czasu usunięcia awarii.

Co ma tu SORBNET?

Otóż w bankach nie ma pieniędzy. Przynajmniej fizycznie. Oczywiście trzymana jest pewna kwota gwarantowana, ale to jest nie do ruszenia. Wynika to z prostego prawa – pieniądze nieużywane gniją. Innymi słowy banki ciągle inwestują. Jednakże trzy razy na dobę zdobywają się na wysiłek i posiadają na koncie w NBP wystarczająco środków by wykonać rozliczenie. Jeżeli jednak bank nie może zagwarantować wystarczającej ilości środków to zawsze może pożyczyć brakujące pieniądze od innego banku. Pożyczka taka jest przelewana właśnie przez SORBNET, bo system ten pracuje w czasie rzeczywistym. Z SORBNETU korzystają też duże instytucje i firmy przy transakcjach powyżej 1mln PLN. Oczywiście o ile kasę trzeba wypłacić natychmiast.
W omawianym przypadku doszło do sytuacji w której jeden z banków w wyniku awarii SORBNETu nie był wstanie zagwarantować wystarczającej ilości środków do rozliczenia w Elixirze. Po prostu pożyczka nie doszła na czas. Spowodowało to opóźnienie sesji Elixira i ogólną zwałę. Banki też mają swoje okienka do księgowania wpłat. Cześć banków je przesunęła na późniejszą godzinę, część księgowała dopiero we wtorek w nowym okienku.

Dlaczego mam zgłaszać reklamację?

Ponieważ banki nie potrafią “odkręcić” wybranych operacji dla danej daty. Banki najprawdopodobniej naliczają kary korzystając z daty księgowania, a nie nadania (co jest karygodne) i nie za bardzo wiedzą jak rozróżnić przelewy prawidłowe i nieprawidłowe. Cóż… te systemy mają po 15 lat nie wszystko jest takie super nowoczesne.