Git – ukrywanie zmian

Jeśli z jakiegoś powodu nie chcemy aby pewne zmiany w pliku trafiły do repozytorium git-a (np. gdy nie dotyczą aktualnie rozwiązywanego problemu), a jednocześnie nie chcemy też aby IntelliJ przypominał nam o nich przy każdym commicie, to możemy oznaczyć je tymczasowo jako „niezmienione”:
    git update-index --assume-unchanged <files>
Listę wszystkich oznaczonych w ten sposób plików uzyskamy za pomocą polecenia:
    git ls-files -v | egrep '^[a-z]' | cut -d ' ' -f2
A gdy zajdzie potrzeba, to ustawioną flagę zawsze można zdjąć wykonując:
    git update-index --no-assume-unchanged <files>

Uwaga: wykonanie checkout-u innego brancha skutecznie zresetuje wszelkie ustawienia indeksu.

Szybka baza plikowa oraz bigint w PHP – nowe biblioteki

Już po pierwszych tygodniach PrivMX WebMail na rynku, dowiedzieliśmy się, że sporo usług web-hostingowych nie ma zainstalowanych takich modułów php jak dba czy gmp. Moduły te wydają się „całkiem standardowe” i ich brak mocno nas zdziwił i zaniepokoił. Bazy plikowe i szybka matematyka na dużych liczbach to dość ważne elementy PrivMX WebMail, więc podczas tworzenia kolejnej głównej wersji (1.1.0) musielismy się z tym zmierzyć — duży zasięg, tzn. kompatybilność z dużą ilością stron www to dla nas bardzo ważny aspekt projektu.

Poszukiwania gotowych rozwiązań w zasadzie się nie udały i postanowiliśmy rozwiązać problem „po naszemu”. Owocem tych starań są biblioteki ldba-php i bigint-wrapper-php. Pierwsza to napisana w czystym PHP szybka baza plikowa klucz-wartość (zdecydowanie zasługująca na osobny post), a druga to biblioteka bigint wykorzystująca bcmath zamiast gmp, jeśli jest taka potrzeba (bcmath jest o wiele bardziej popularny, ale też o wiele wolniejszy).

Oba liby znaleźć można na naszym koncie github – opublikowaliśmy je na zasadach licencji MIT – zapraszamy do komentowania, rozwoju i korzystania z nich we własnych projektach.

Monada Promise w JavaScript

Żeby zdefiniować monadę w JS, to musimy określić operator bind oraz unit (które w np. Haskellu oznacza się poprzez >>= i return). Przyda się też definicja fail:

// unit :: a -> Promise a
unit = x => new Promise(resolve => resolve(x))
 
// fail :: String -> Promise a
fail = str => new Promise((resolve, reject) => reject(str))
 
// bind :: Promise a -> (a -> Promise b) -> Promise b
bind = (p, np) => p.then(x => np(x), fail)

Dorzućmy do tego operator składania kilku operacji w jedną:

// pipe :: [a -> Promise a] -> a -> Promise a
pipe = ps => x => ps.reduce(bind, unit(x))

oraz kilka definicji do testów:

// add10 :: Int -> Promise Int
add10 = x => unit(x + 10)
 
// add40 :: Int -> Promise Int
add40 = pipe([add10, add10, add10, add10])
 
// fadd40 :: Int -> Promise Int
fadd40 = pipe([add10, add10, _ => fail("ups"), add10])

…i możemy już przetestować monadę Promise:

add40(8).then(x => console.log(x))
-----> 48

fadd40(8).then(x => console.log(x), err => console.log("err " + err))
-----> “err ups”

Powyższy kod testowany był na Firefoxie.

Jak używać protokołu HTTPS w serwerze Tomcat?

To tylko krótka informacja na temat tego, jak włączyć obsługę HTTPS w serwerze Tomcat (7)…

Najpierw generujemy klucz i podajemy jakieś hasło np. qwerty:

“%JAVA_HOME%\bin\keytool” -genkey -alias tomcat -keyalg RSA -keystore /etc/tomcat7/tomcat.keystore

Potem odkomentowujemy connector ssl 8443 w pliku /etc/tomcat7/server.xml i dopisujemy tam atrybuty keystoreFile i keystorePass:

keystoreFile=”/etc/tomcat7/tomcat.keystore”
keystorePass=”qwerty”

Na koniec trzeba jeszcze zrestartować Tomcata: sudo service tomcat7 restart.

Więcej info: https://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html

Szybki, szyfrowany, zdalny backup – tar, gpg i ssh

Jeżeli chcesz wykonać szybki, szyfrowany, zdalny backup swoich danych, to możesz skorzystać z tar, gpg oraz ssh (i bash).
„tar” pakuje dane w pojedynczy strumień bajtów, „gpg” go szyfruje, a „ssh” zapisuje zaszyfrowany strumień danych w wybranym, zdalnym pliku:

tar cv folder_to_backup | gpg -e -r gpg_user_id | ssh remote.host "cat > folder_backup.tar.gpg"

Uwaga – nie musisz kompresować strumienia „tar”, ponieważ „gpg” robi to w czasie szyfrowania.

Zapobieganie aktualizacji wybranego pakietu w Debianie

Pokażemy to na przykładzie: jakiś czas temu Erlang Solutions opublikował nową wersję pakietu esl-erlang z najnowszym Erlang / OTP 20.0. Jest to nowe główne wydanie Erlang, które zawiera kilka niezgodności z wcześniejszymi wersjami – dlatego w budowanym przez nas systemie musieliśmy wstrzymać tę aktualizację.

Istnieje prosty sposób, aby tymczasowo uniemożliwić komendzie apt-get upgrade wykonanywanie aktualizacji pakietu ‘esl-erlang’ do najnowszej wersji – jedyne, co trzeba zrobić, to oznaczyć ten pakiet flagą ‘hold’ przy pomocy komendy apt-mark hold els-erlang.

Później, przy pomocy komendy apt-mark unhold els-erlang można ponownie umożliwić menadżerowi pakietów zaktualizowanie tego pakietu.

Zablokowany system plików po restarcie usługi docker

W trakcie aktualizacji systemu (apt-get upgrade) uwzględniającej pakiet docker-engine, restartowana jest usługa docker, co wiąże się z zatrzymaniem wszystkich kontenerów.

Teoretycznie, kontenery stworzone z restart policy ustawionym na „always” powinny się same uruchomić, nam jednak ostatnio pojawił się nam problem z podniesieniem jednego z kontenerów będącego częścią multi-kontenerowej aplikacji:

Czytaj dalej Zablokowany system plików po restarcie usługi docker