Zmiany, zmiany…

Została zmieniona domena blogu – z wcześniejszej michalagata.pl na obecną michalagata.com. Powód kuriozalny – wysokość opłaty za domenę. Sam chyba jednak Czytelniku przyznasz, że nie jest to do końca normalne, aby:

  • za domenę .com płacić ~ 37PLN z VAT
  • za domenę .pl płacić ~ 123 PLN z VAT

Tym bardziej, że domena .com niejako jest definiowana jako komercyjna, a .pl w dużej mierze obsługuje prywatne inicjatywy.

„Well – life’s a bitch…”

Opublikowano OFF-TOPIC | Otagowano | Skomentuj

Służba „zdrowia”

Dzisiejszy wpis dedykuję tak zwanej „służbie zdrowia”. Tak zwanej, gdyż cały ten monstrualny twór bazuje na kompletnie chorych zasadach. Skąd nagle ich tematyka? No cóż, gdyby nie kolejka zajmująca również przejście dla pieszych i nie pozwalająca mi przejechać – skierowana w stronę placówki NFZ… i nie wisząca szmata z podpisem „Pogotowie strajkowe – żądamy podwyżki wynagrodzeń„… to pewnie bym tematu nie podjął.

Tematyka „zdrowia” w tym kraju niezaprzeczalnie powiązana jest z ZUS, któremu jednak zadedykuję któryś z kolejnych wpisów.

Powróćmy jednak do „zdrowia”. Uważam, że wszelkiego rodzaju strajki i siłowe wywieranie wpływu na instancjach wyższych jest po prostu bezczelnością. Dlaczego – podpunkty poniżej:
 
* jeżeli ktokolwiek próbował się dostać do lekarza, w szczególności specjalisty – wie z jakim piekłem musi się zmierzyć. Terminy – nieakceptowalne. Załatwienie skierowania – graniczy z cudem. Jakość „obsługi” – skandaliczna. Obsługi, bo wszelkie państwowe jednostki medyczne w tym kraju świadcząusługi – nie jest to jakieś kapłańskie powołanie – nie można w ten sposób mydlić oczu! Wniosek: w tym kraju nie opłaca się chorować.

* na dziś dzień stałą praktyką jest – „idę do lekarza – płacę”. Państwowa służba zdrowia jest mitem i nic tego nie zmieni. Również obserwując zachowania firm i korporacji wobec pracowników można zauważyć, iżstandardem są pakiety zdrowotne w prywatnych centrach medycznych. Bo każdy wie z czym to się wiąże.

* promowanie jakiejkolwiek grupy społecznej jest naocznym dowodem niesprawiedliwości. A promowanych grup, które straszą i wywierająwpływ (i co ciekawe – nikt im skrzydeł nie ucina!) jest kilka: lekarze, pielęgniarki, górnicy, PKP, stoczniowcy, nauczyciele, urzędnicy. Bezczelność bez granic. Ciekawe, że pozostała część pracującego społeczeństwa (czyli co najmniej 80% pracującej całości) nie ma co liczyć na jakiekolwiek przywileje. I nikt się o nich nie martwi. No ale tak – nie blokują Sejmu, nie palą kukieł, nie blokują ruchu. Dlatego nie trzeba być specjalnie uzdolnionym aby zauważyć, że dziwnym trafem sterujący państwem promują i ulegają klasom, które w najbardziej zwierzęcy, siłowy i agresywny sposób wymuszają na nich specjalne traktowanie.

* kompletnie nielogicznym, niezrozumiałym i abstrakcyjnym faktem jest opłacanie składek „zdrowotnych”. Jak się pracuje w więcej niż 1 firmie – opłaca się dodatkowe składki „zdrowotne”. To jest ciekawe, czyż nie? Czy to, że pracuję w 2 miejscach na raz oznacza, że jestem potencjalnie 2 razy bardziej chory? A może 2 razy więcej leków zużywam? A może uprawnia mnie to do zapisania się i zajęcia kolejek do 2 lekarzy na raz?

Ciekawym jest natomiast fakt, iż od kilkunastu lat obserwuję przeróżne ekipy polityczne – deklarujące w programach wyborczych zmianęsystemu „zdrowotnego” i od kilkunastu lat wszystkie z ekip KŁAMIĄ! Bo na chęciach i obietnicach się kończy.

Ze swojej strony proponuję rozwiązanie może brutalne, ale nie bardziej chore niż obecna „służba zdrowia”. Kompletna prywatyzacja „służby zdrowia”. Wszyscy niezmiernie wolno kumający czaczę od razu wyskoczyliby, że nie byłoby darmowej opieki zdrowotnej. G$$$$$ prawda, że tak od razu odstrzelę. Zamiast NFZ i składek „zdrowotnych” powstałaby instytucja ubezpieczeń zdrowotnych – taka jak PZU. Uiszczanoby składki od kwoty, na którą klient by się ubezpieczał. Istniałby tzw. pakiet standard, który obejmowałby leni, mało-ochoczo pracujących i emeryckie próchno (definicja nie obejmuje wszystkich, ale te osoby, które w harmonogramie codziennym lub tygodniowym zajmują kolejki w celu kolekjonowania leków, pogadania czy też wrąbania się na łóżko szpitalne, bo nie ma z kim spędzić wigilii – a syn straszliwie pije w więzieniu). Nie oszukujmy się – wszyscy płacą, ale nie wszyscy w jednym czasie korzystają. A to prowadzi – tak jak to w firmach ubezpieczeniowych bywa – do kumulowania pieniędzy, a przy tej zasadzie pojedyncze przypadki korzystające z usługi – mogłyby jak do tej pory liczyć na zabiegi bardzo kosztowne.

Straty w porównaniu do obecnego systemu – żadnych. Nadal istnieje pojęcie bezpłatnej opieki zdrowotnej.

Korzyści – niezmierne oszczędności, a w przypadku niezadowolenia pracowników – skierowanie problemu do lokalnego managementu, dzięki czemu nie jest wymagane zdzierstwo podatkowe, aby grupie zrobić dobrze. A przy okazji management lokalny miałby szansę na uskutecznienie akcji znanej we wszystkich dziedzinach NIE-PROMOWANYCH (o których pisałem wyżej) pod tytułem: „jak się nie podoba, to wy%^&$%lać!”.

Howgh!

Opublikowano OFF-TOPIC | Otagowano , , , | Skomentuj

Linux – likwidacja RAID-1

W weekend zdarzyło mi się rozwiązywać kolejny z problemów doczesnego LINUX’a, czyli zejście z istniejącego RAID-1 na standardowy, pojedynczy dysk posiadający kilka partycji z logicznie rozłożonymi strukturami (/boot, swap, /).

Zadanie wydawało się proste, jednakże szybko pojawiły się komplikacje. Poniżej postaram się opisać rozwiązanie, które zakończyło temat w trybie sukces. Można podejść do tematu wykonując operacje przy użyciu LiveCD, jednakże sposobu tego nie polecam.

/dev/sda – pierwszy dysk w RAID-1
/dev/sdb – drugi dysk w RAID-1

Oba dyski jednakowej pojemności.

/dev/md0 – partycja RAID (/boot)
/dev/md1 – partycja RAID (swap)
/dev/md2 – partycja RAID (/)

Partycje RAID ustawione jako Linux RAID Autodetect. Na starcie dyski były zsynchronizowane, nie wykazywały błędów.

Na pierwszy ogień poszło wypięcie z RAID pierwszego z dysków (jako, że ten własnie dysk miał po operacji pełnić główną rolę dysku systemowego).

Procedura klarowna i prosta:

linux# mdadm –manage /dev/md0 –fail /dev/sda1
linux# mdadm –manage /dev/md1 –fail /dev/sda2
linux# mdadm –manage /dev/md2 –fail /dev/sda3

linux# mdadm –manage /dev/md0 –remove /dev/sda1
linux# mdadm –manage /dev/md1 –remove /dev/sda2
linux# mdadm –manage /dev/md2 –remove /dev/sda3

W tym momencie RAID powinien składać się jedynie z dysku /dev/sdb (wszystkie partycje jako [_U]).

Nie ma obowiązku wykonywania kolejnego kroku, gdyż w założeniu – oba dyski posiadają zbieżną strukturę. W celu usystematyzowania struktury – „tworzymy” jej klon na pierwszym dysku:

linux# sfdisk –d /dev/sdb | sfdisk /dev/sda

Następnie czas pozbyć się systemu plików Linux RAID Autodetect:

linux# fdisk /dev/sda

i kolejno zmieniamy partycje (w moim przypadku 1 – LINUX (/boot), 2 – SWAP, 3 – LINUX (/)):

fdisk> t
fdisk> 1
fdisk> 83
fdisk> t
fdisk> 2
fdisk> 82
fdisk> t
fdisk> 3
fdisk> 82
fdisk> w

Po zapisaniu nowych partycji – wpinamy dysk w RAID celem synchronizacji zawartości:

linux# mdadm –manage /dev/md0 –add /dev/sda1
linux# mdadm –manage /dev/md1 –add /dev/sda2
linux# mdadm –manage /dev/md2 –add /dev/sda3

Stan synchronizacji sprawdzamy poprzez:

linux# cat /proc/mdstat

Kiedy dyski zostaną zsynchronizowane – ponownie wypinany dysk pierwszy:

linux# mdadm –manage /dev/md0 –fail /dev/sda1
linux# mdadm –manage /dev/md1 –fail /dev/sda2
linux# mdadm –manage /dev/md2 –fail /dev/sda3

linux# mdadm –manage /dev/md0 –remove /dev/sda1
linux# mdadm –manage /dev/md1 –remove /dev/sda2
linux# mdadm –manage /dev/md2 –remove /dev/sda3

Resetujemy blok RAID na wszystkich partycjach dyski pierwszego:

linux# mdadm –zero-superblock /dev/sda1
linux# mdadm –zero-superblock /dev/sda2
linux# mdadm –zero-superblock /dev/sda3

po czym przygotowujemy środowisko pod chroot (nowy „system” montuję przykładowo w /mnt/root):

linux# mount /dev/sda3 /mnt/root
linux# mount /dev/sda1 /mnt/root/boot
linux# mount –o bind /dev /mnt/root/dev
linux# mount –o bind /dev/pts /mnt/root/dev/pts
linux# mount – o bind /proc /mnt/root/proc
linux# mount –o bind /sys /mnt/root/sys

Startujemy chroot:

linux# chroot /mnt/root /bin/bash

Po chwili wirtualnie “siedzimy” w systemie na dysku pierwszym. Czas wykonać zmiany:

linux# rm /etc/mdadm.conf
linux# rm /etc/mdadm/mdadm.conf

Edytujemy wpisy dysków, aby zmienić wpisy na odpowiednie partycje dysku pierwszego. W moim przypadku wyglądało to tak:

/dev/md0 -> /dev/sda1
/dev/md1 -> /dev/sda2
/dev/md2 -> /dev/sda3

linux# vi /etc/fstab

Podobnie w pliku mtab:

linux# vi /etc/mtab

oraz w pliku GRUB:

linux# vi /boot/grub/menu.lst

Czas na instalację GRUB oraz aktualizację ustawień:

linux# grub-install /dev/sda

Dla pewności możemy jeszcze wykonać reconfigure:

linux# dpkg-reconfigure grub-pc

Wybieramy instalację GRUB na dysku pierwszym (/dev/sda).

linux# update-grub
linux# update-grub2

Teraz wystarczy wyjść z chroot, odmontować partycje i zrestartować system pamiętając, aby przed restartem usunąć drugi z dysków.

Od tej chwili możemy cieszyć się zejściem z RAID-1! Alleluja i od przodu!

Opublikowano APPS | Otagowano , , , , | Skomentuj

C# – rozwiązania warunkowe „IF”

Rozwiązania przejść warunkowych w C# można zrealizować na wiele sposobów. Podstawowymi z nich są:

(1) IF..ELSE:

if(warunek)
{
   …
   return varA;
}
else
{
   …
   return varB;
}

(2) IF..RETURN:

if(warunek)
{
   …
   return varA;
}

return varB;

(3) IF..SINGLERETURN:

PrzykladowyTyp rezultat;
if(warunek)
{
    //stworzenie i konfiguracja rezultatu
    rezultat = varA;
}
else
{
    //stworzenie i konfiguracja rezultatu
    rezultat = varB;
}
return rezultat;

(4) IF..MULTIRETURN:

if(objekt == null)
    return null;

if(objekt.Id <= 0)
    return null;

// inne działania
return objekt;

(5) IF..GOTO:

int rezultat;

  if (warunek) {
    rezultat = varA;
    goto out;
  }

  if (inny_warunek) {
    rezultat = varB;
    goto out;
  }

  rezultat = varC;

out:
  metoda1(argument1);
  return rezultat;

Postaram się poniżej omówić poszczególne przypadki i zwrócić Twoją uwagę na związane z poszczególnymi rozwiązaniami – szczegóły:

ROZWIĄZANIE (1):
Silnie rozdzielona instrukcja warunkowa, jawnie reprezentowane bloki, które są wykonywane w zależności od spełnienia warunku. Nie jest spełnione „best practice” mówiące, że dana metoda powinna mieć jeden punkt wyjścia (return).

ROZWIĄZANIE (2):
Rozwiązanie mocno zoptymalizowane pod względem zawartości kodu, może jednak powodować problemy przy rozczytywaniu kodu. W tym przypadku bardzo ważne jest dokładne skomentowanie poszczególnych kawałków kodu. Ponownie nie jest spełniony „best practice” – metoda posiada więcej niż jeden punkt wyjścia (return).

ROZWIĄZANIE (3):
Ponownie silnie rozdzielona instrukcja warunkowa, spełniony traktat „best practice” – czyli pojedynczy punkt wyjścia metody. Tyle, że z powodzeniem można byłoby pozbyć się else’a.

ROZWIĄZANIE (4):
Zestaw pojedynczych bloków warunkowych „if” i kilka punktów wyjścia metody (return). Rozwiązanie nie spełnia traktatu „best practice”. Na pierwszy rzut oka nie jest także zbyt optymalne. Ale tylko pozornie. Zwykle namnożenie kolejnych „if” powoduje, że w każdy z nich musi być sprawdzony! W tym konkretnym rozwiązaniu po każdym warunku „if” mamy punkt wyjścia w postaci return’a. Zatem konstrukcja zachowuje się jak kompleksowa konstrukcja if..else.

ROZWIĄZANIE (5):
Rozwiązanie celowo zaprezentowane jako ostatnie. O ile spełniony jest traktat „best practice”, o tyle użycie funkcji skoku „GOTO” nie jest rozwiązaniem ani eleganckim, ani bezpiecznym. Zdecydowanie odradzam jego użycie.

Rozważmy jeszcze przez chwilę, czy wspomniane „best practice” jest rzeczywiście zawsze spełnione. Moim zdaniem – nie. Dana metoda, pomimo posiadania pojedynczego return’a – teoretycznie może mieć kolejny punkt wyjścia. Wystarczy, że zostanie przerwana jako skutek wyjątku (Exception).

Pozostaje jeszcze rozwiązanie wydzielenia rezultatu do podmetod, po czym zwrot warunkowy:

return rezultat ? metodaPozytywnegoRezultatu() : metodaNegatywnegoRezultatu();

Jeszcze ostatnie słowo na niedzielę w tej kwestii: aby uzyskać najlepszy rezultat pod względem wydajności kodu (aczkolwiek spotkałem się ostatnio ze stwierdzeniem „Na dziś dzień wydajność nie jest priorytetem”) – gdziekolwiek jest to możliwe – należy stosować SWITCH.

Opublikowano .NET | Otagowano , , | Skomentuj