Cassandra - zmiana nazwy klastra

Zmiana nazwy klastra Cassandry może być nieciekawa w skutkach, ponieważ klaster dokonuje dodatkowej weryfikacji węzłów po zadeklarowanych w nich nazwach klastra, a zmieniając nazwę trzeba wykonać rolling restart każdego węzła i w tym czasie węzły będą zgłaszały błędy niespójności nazw (ergo - klaster będzie niekompletny). Operację trzeba przeprowadzić z zachowaniem należytej ostrożności.

Procedura dla każdego węzła :

 $ zmienić nazwę w `cassandra.conf`
 $ cqlsh
 $ > UPDATE system.local SET cluster_name = '<NOWA NAZWA KLASTRA>' where key='local';
 ^D
 $ nodetool flush
 $ sudo service cassandra restart

Dodatkowo w OpsCenter trzeba zrobić sobie rename w UI, bo OpsCenter wyświetla swego rodzaju alias.

Być może lepszą sekwencją będzie nawet wykonanie zmian nazw w column family system.local dla każdego node po zmianie wszystkich cassandra.yaml, i dopiero po tym zrobić flushe na każdym node i zrestartować usługi tak, aby nie było downtime.

srajFon - dlaczego jednak nie kupię

Bo to jeden z droższych acz małych komputerków (lub jak kto woli - przenośnych telefonów stacjonarnych), naszpikowany duperelami po to, żeby zżerać baterię i napędzać rynek power banków oraz obudów z bekonu. Komputerek z systemem, który zadręcza na "dzień dobry" koniecznością podłączenia się do WIFI lub GSM bez aktywnej karty SIM tylko po to, abyś nie mógł odczytać MAC-a potrzebnego do whitelisty WIFI. System, który po upgrade przyspiesza wysysanie baterii i jeszcze bardziej napędza rynek power banków (i obudów, kiedy już zaczynasz nim ciskać o ziemię lub ściany). System, który wiesza się akurat przy wyłączaniu automatycznie włączanych usług inwigilacyjnych srajGlaude. Oraz w końcu sklep z milionem aplikacji bez możliwości zakupu. Oraz w końcu "intuicyjny" UX, który nakazuje mi się domyślać, że karta kredytowa == jakakolwiek karta płatnicza. Skąd ta popularność - nie rozumiem. Podoba się kobietom.

Lumia 830 z Windows Phone w praktyce

Niemal rok temu dałem szansę Nokii z Windows Phone. Przekonały mnie dobre opinie o wytrzymałości baterii, stabilności i płynności działania. Jak słuchawka sprawuje się w praktyce?

Wymagania

Uznałem, że telefon powinien oferować:

  • prostotę użytkowania, szczególnie podczas rozmów, gdyż telefon służy do dzwonienia
  • dostęp do internetu, głównie e-mail oraz WWW, Skype
  • względnie długi czas działania na baterii
  • płynność i stabilność działania

Rozmowy

Jakość rozmów jest bardzo wysoka, szczególnie gdy aktywny jest HD Voice. Tylko znajomi początkowo mówili, że mnie nie poznali po głosie. Żadnego zrywania połączeń, żadnego zawieszania się oprogramowania przy odbieraniu lub podczas rozmów. Długie konwersacje na słuchawkach - czysta przyjemność.

Jedyny defekt to przerywanie dłuższych rozmów policzkiem. Ekran dotykowy jest czuły, włącza się czasem podczas rozmów i niestety policzek sobie coś tam klika. Być może źle trzymam słuchawkę. Ale ponieważ dłuższe rozmowy prowadzę głównie na słuchawkach, to ten problem nie jest bardzo uporczywy.

Sieć i internet

WIFI i internet GSM generalnie działają dobrze. WIFI mam praktycznie stale włączone, bo nie wysysa baterii. GSM włączam okazjonalnie. Niestety od początku użytkowania, mimo kolejnych aktualizacji zdarza się, że sieć w Windowsie "zacina się". Albo nie działa GSM, albo nie funkcjonuje WIFI. Włączanie i wyłączanie usług nie odnosi skutku, a w przypadku WIFI - nie da się go wyłączyć (ciągle oczekuje na wyłączenie). Wygląda to niestety na problem OS-a lub drivera. Pomaga dopiero restart telefonu. Duży minus.

Z e-maliami nie ma problemu. Wbudowany klient obsługuje Gmail i inne konta IMAP. Synchronizacja kontaktów i kalendarza działa OOTB.

Przeglądanie WWW jest słabe. Dostępne są tylko przeglądarki z jedynie słusznym silnikiem - Trident. Internet Explorer jest kiepski, lubi się zacinać, jest niewygodny w obsłudze. Nie jest źle, ale jednak męczy. Opera na WP jest kiepska (wolna), a UC Browser wiesza się na potęgę. Alternatyw w praktyce brak.

Skype działa bez zarzutu.

Bateria

Przy moim stylu użytkowania wytrzymuje do około 3 dni. Gdy gadam więcej lub korzystam z internetu GSM - oczywiście znacznie krócej. Ekran telefonu jest duży, więc biorąc to pod uwagę jest na prawdę nieźle. Mam aktywną funkcję oszczędzania baterii przy poziomie <20%. Wydłuża to trochę czas oczekiwania, co bywa bardzo przydatne.

Płynność i stabilność

Oprogramowanie telefonu działa szybko. UI jest responsywne, nie ma przycięć. Telefonem operuje się komfortowo. Nawet jeśli część operacji jest przykryta pod animacjami (takie pojawiają się głosy), to wrażenie jest na prawdę bardzo dobre. A to chodzi, bo po prostu użytkownik nie irytuje się.

Przez cały okres użytkowania telefon chyba nigdy się nie zawiesił, albo wystąpiło to może raz. Zamulać mogą tylko otwarte (aktywne) aplikacje, ale kiedy idą w tło - oprogramowanie działa znowu normalnie. Aplikacje w tle są wstrzymywane.

Ergonomia i wygląd

Względnie duża cegła - niczym nie wyróżniający się klocek z aluminiowym i chyba solidnym wykończeniem. Parę razy zaliczył glebę (w etui) i nic się nie stało. Ekran duży, jasny, czytelny nawet w słońcu.

Interfejs Metro jest minimalistyczny, czytelny i intuicyjny. Kafelki są wygodne i nie potrzeba dziesięciu pulpitów. W ogóle nie czuję takiej potrzeby (latami na Androidzie miałem co najmniej dwa).

Klawiatura ekranowa jest wyśmienita, a szczególnie tryb swipe, Na prawdę swipe świetnie działa i pozwala szybko pisać bez większych pomyłek.

Pozostałe uwagi

App store jest względnie skromny. Jest sporo zamienników, ale wielu ważnych aplikacji nie ma. Korzystanie z aplikacji Googla jest przeciętne (nie ma oficjalnych portów, trzeba wybierać zamienniki). Jest też mniej specjalistycznego oprogramowania. Jeśli ktoś korzysta intensywnie z usług Google (szczególnie związanych z chmurą), to z Windows Phone będzie bardzo niezadowolony (ja nie korzystam).

Aparat fotograficzny dosyć dobry. Kamerką też da się coś zrobić. Nie jest to ekstraklasa, ale jakość wystarczająca do szybkiego uwiecznienia jakiejś chwili. Pokusiłem się nawet na zrobienie krótkiego filmu - tu jednak brakuje lepszego oprogramowania, które wyeliminuje automatykę.

Windows to Microsoft - uczucie niesmaku i podejrzeń co do jakości softu jest stale obecne. Rekompensuje to trochę logo Nokii i brak sytuacji denerwujących, które serwował mi dotychczas Android. Na plus warto odnotować koniec zabaw z Cyanogemod`ami - nie ma oczywiście takiej opcji, ale w praktyce nie ma takiej potrzeby. To oszczędza dużo czasu. Warto wspomnieć bardzo dobrze przygotowywane aktualizacje oprogramowania.

Kolejny minus za brak funkcji "Godziny ciszy". Przed WP 8.1 można było zainstalować dodatkową aplikację, ale w nowszych wersjach jest ona wbudowana w system. Niestety jest dostępna tylko tam, gdzie Cortana (czyli w PL - nie!). I tak oto ani nie ma możliwości skorzystania z wbudowanej funkcji, ani nie można zainstalować aplikacji zewnętrznej.

Cena w stosunku do możliwości i jakości - bardzo dobra.

Ocena ogólna

Czwórka, może czwórka z plusem. Kupiłbym ponownie? - raczej tak, choć zaczekam na nowe Nokie z innym OS-em lub wypróbuję iPhone ze względu na bogatszy AppStore. Zdecydowanie jest to produkt dla węższej grupy świadomych użytkowników, którzy potrzebują telefonu przede wszystkim do dzwonienia i zajęciu się w życiu czymś ciekawszym niż wgrywanie ROM-ów.

Django - migracje bazy, które nie zawsze działają

O kiepskim podejściu do migracji schematów baz danych w Django pisałem już w 2014r. Co jakiś czas jednak temat do mnie wraca, gdyż w niektórych projektach używam (niestety) tego rozwiązania. Powody są różne, a główny to "oszczędność czasu". No bo trudno zaprzeczyć, że automatyczne wygenerowanie plików z migracjami jest wolniejsze od klepania XML-i Liquibase lub plain SQL, prawda? Sam z tego przecież korzystam...

Jednak bywają takie momenty, gdzie zostaję z tymi migracjami w "czterech literach", gdzie nawet nie dochodzi ani jeden promyk światła. I taką sytuacją jest m.in. usuwanie atrybutu z modelu, co generuje operację RemoveField.

Bodaj wszystkie wbudowane w Django operacje posiadają mechanikę pozwalającą wycofać daną operację, RemoveField także. Ta akurat nie zadziała, gdy pole było zadeklarowane jako NOT NULL, ponieważ:

  • Django nie ustawia defaultów na poziomie baz danych, więc nigdy nie wygeneruje defaulta na poziomie SQL (co byłoby rozwiązaniem w sytuacjach, gdy default masz określony)
  • Implementacja backward w RemoveField jest oparta o pseudo-automat, tzw. schema editor, a ten "wie" że ma być NOT NULL (i nikt go nie przekona)
  • Sekwencja rollback dla przypadku usuwania pola jest bardziej złożona i zależna od kontekstu (dodanie pola nullable, wypełnienie danymi, zmiana na not null).

Często jest tak, że sekwencja backward (rollback) jest inna od sekwencji forward i nie zawsze każdej operacji forward odpowiada dokładnie jedna operacja backward (i odwrotnie). To skłania mnie do postawienia tezy:

Sekwencje rollback (backward operations) powinny być definiowane niezależne od forward operations, tj. plik migracji powinien mieć dwie oddzielne ścieżki, które mogą być oczywiście automatycznie generowane. 

To kolejny argument za stwierdzeniem, że wbudowane w Django migracje są zaimplementowane w oparciu o wadliwy koncept. Ale jest na to trochę nieczytelne obejście - operacja RunSQL i puste przebiegi forward.

Rozwiązanie tego konkretnego zagadnienia?

Odstawić czarodzieja schema editor, czyli zamienić operację RemoveField na RunSQL usuwającą kolumnę w forwardzie, ale przywracającą w backwardzie z dozwolonym null. Następnie zadeklarować RunSQL uzupełniający dane usuwanej kolumny w backwardzie, a w forwardzie nie robiący nic (''). Tę operację (lub ich sekwencję) należy umieścić przed alterem usuwającym kolumnę, aby w backwardzie wykonała się po przywróceniu tejże, a zakończyć (rozpocząć) od operacji RunSQL zakładającej w backwardzie not null. Partyzanckie, ale działa.

Czyli:

operations = [ 
    migrations.RemoveField('table', 'attribute'),
]

zamieniamy na:

operations = [
     migrations.RunSQL('', 'alter table <table> alter column <column> set not null'),
     migrations.RunSQL('', 'update <table> set <column> = ....'),
     migrations.RunSQL(
         'alter table <table> drop column <column>',
         'alter table <table> add column <column> [...] NULL'),
]

A na przyszłość usuwając pola z modeli należy wygenerować trzy oddzielne migracje:

  • pierwsza ma ustawiać nullable
  • druga ma być data migration, która w forwadzie nie robi nic (lub robi, jeśli dane przenosimy), a w backwardzie ma kod uzupełniający dane
  • trzecia usuwa kolumnę.

Odwracając proces uzyskamy:

  • dodanie kolumny nullable (schema editor będzie wówczas "mądrzejszy")
  • uzupełnienie kolumny danymi
  • założenie not null constraint.