Default transaction isolation level comparison in MySQL, PostgreSQL, Oracle and MS SQL Server

When building software you should understand what level of transaction isolation your RDBMS guarantees. Do you? I meen, how much of the “I” in the ACID we have? Here are the default transaction isolation levels in a popular relational database management systems:

RDBMS Default transaction isolation level
ANSI SQL Standard Serializable
SQLite Serializable
MySQL Repeatable Read
PostgreSQL Read Committed
Oracle Read Committed
MS SQL Server Read Committed

If you are unsure what that means, Wikipedia has a nice explaination.

Posted in english, programowanie, rails, ruby, science, technologia | Leave a comment

Opis stosu Racka w Rails 3.2

Właśnie wyszły stabilne Railsy 3.2. Przy tej okazji przyjrzałem się stosowi Racka.

Za co odpowiedzialne są poszczególne middleware’y?

Stos Rails 3.2 wygląda następująco (kolejność od najwcześniej do najpóźniej uruchamianych middleware’ów, jak przy rake middleware):


# Serwuje statyczne pliki
use ActionDispatch::Static

# Synchronizuje obsługę żądania na muteksie
use Rack::Lock

# Instancjuje backend cache'a (LocalStore.new)
use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x00000002964ba8>

# Mierzy czas żądania i dokleja nagłówek X-Runtime
use Rack::Runtime

# Nadpisuje prawdziwą methodę HTTP parametrem _method
# lub nagłówkiem HTTP X_HTTP_METHOD_OVERRIDE
use Rack::MethodOverride

# Loguje pierwszą wzmiankę o żądaniu, np.:
# Started GET "/dupa" for 127.0.0.1 at 2012-01-21 12:18:28 +0100
use Rails::Rack::Logger

# Przekazuje nagłówek X-Request-Id z żądania do odpowiedzi aby umożliwić
# śledzenie żądania przez stos firewalli, load balancerów, serwerów itp.
use ActionDispatch::RequestId

# Łapie wszelkie wyjątki aplikacji.
# Robi rescue Exception, a więc także SyntaxError, NoMemoryError itd.
# Dla żądań zdalnych renderuje statyczne strony błędów (np. public/500.html).
use ActionDispatch::ShowExceptions

# Łapie wszelkie wyjątki aplikacji.
# Robi rescue Exception, a więc także SyntaxError, NoMemoryError itd.
# Dla żądań lokalnych renderuje deweloperski stack trace.
# Dla żądań zdalnych propaguje wyjątek w górę stosu czyli w praktyce do
# ActionDispatch::ShowExceptions.
use ActionDispatch::DebugExceptions

# Usiłuje ustalić oryginalne IP klienta odsiewając lokalne i zdalne proxy
use ActionDispatch::RemoteIp

# Ustawia nagłówek odpowiedzi X-Sendfile w przypadku serwowania
# statycznego pliku aby przerzucić pracę na serwer, który zrobi
# to wydajniej niż Ruby (o ile jest do tego skonfigurowany).
use Rack::Sendfile

# Odpowiada za reloading kodu w trybie deweloperskim.
use ActionDispatch::Reloader

# Woła callbacki before, after i around akcji kontrolera
use ActionDispatch::Callbacks

# Zwraca połączenie do puli jeśli pojawi się wyjątek
# (o ile request nie pochodzi z testów integracyjnych)
use ActiveRecord::ConnectionAdapters::ConnectionManagement

# Klasyczny cache zapytaniowy. Kluczem są Stringi z ostatecznymi
# zapytaniami SQL.
use ActiveRecord::QueryCache

# Renderuje ciastka ustawione w kontrolerze do nagłówków HTTP
# Robi to z pomocą Rack::Utils
use ActionDispatch::Cookies

# Zapisuje dane sesji do skonfigurowanego backendu, np. do ciastka
use ActionDispatch::Session::CookieStore

# Usuwa wiadomość flash po użyciu
use ActionDispatch::Flash

# Buduje Hasha params zgodnie z railsowymi konwencjami
# przekazywania parametrów
use ActionDispatch::ParamsParser

# Usuwa body dla żądań metodą HEAD
use ActionDispatch::Head

# Porównuje nagłówki ETag (żądania z odpowiedzią) oraz Last-Modified
# dążąc do zwrócenia 304 Not Modified i wyzerowania body
use Rack::ConditionalGet

# Oblicza i dokleja nagłówek ETag odpowiedzi
use Rack::ETag

# Dodaje nagłówek X-UA-Compatible do odpowiedzi w zależności od opcji
# config.action_dispatch.best_standards_support za pomocą której
# można wymusić tryb quirks lub strict dla IE.
use ActionDispatch::BestStandardsSupport
Posted in polskie, programowanie, rails, ruby, technologia | 7 Comments

Software Craftsmanship

Załączam prezentację “Software Craftsmanship – od studenta do profesjonalisty”, którą wygłosiłem na Wydziale Elektroniki i Technik Informacyjnych Politechniki Warszawskiej 19 stycznia 2012:

Prezentacja: https://github.com/downloads/qertoip/Prezentacja-Software-Craftsmanship/software_craftsmanship.html

Źródła: https://github.com/qertoip/Prezentacja-Software-Craftsmanship

 

Posted in clojure, git, javascript, lifestyle, polskie, programowanie, rails, ruby, technologia | Leave a comment

[Solved] Nano copy paste

Nano is the closest-to-being-sane, widely available text editor for Linux. While still fucked up, you can get used to it in several hours. One of the biggest headaches seems to be selecting, copying and pasting. Nano help isn’t really helpful here, so let’s make it clear. Continue reading

Posted in english, linux, programowanie, rant, technologia | Leave a comment

[Solved] How to run each MiniTest::Spec in a transaction?

How to run each MiniTest::Spec in a transaction rolled-back upon finish? Simply add this to your test_helper.rb after requiring minitest/autorun:


# Monkey patch to ensure each test is run in a rolled back transaction
class MiniTest::Spec

  def run( *args, &block )
    value = nil

    begin
      ActiveRecord::Base.connection.transaction do
        value = super
        raise ActiveRecord::Rollback
      end
    rescue ActiveRecord::Rollback
    end

    return value  # The result of run must be always returned for the pretty dots to show up
  end

end
Posted in english, programowanie, rails, ruby, technologia | Leave a comment

[Solved] How to auto connect to a VPN on startup in Ubuntu 11.10?

How to automatically connect to a VPN on startup (login) in Ubuntu 11.10 (oneiric ocelot)?

What did NOT work

  • Option “connect automatically” in the Network Manager VPN configuration. This option has never worked, the bug is open for over 3 years and there seem to be no hope for the official fix.
  • The vpnautoconnect daemon does not work in my particular case. As of time of writing there is no deb package for Ubuntu 11.10 amd64. Source code version seems to have messy / inconvenient dependencies I was not eager to fulfill.

What DID work

I solved the problem using /etc/network/if-up.d/ hooks. Scripts in this dir are executed whenever any network interface is up, so it is (probably) the right place to (try to) start a VPN connection.

Here is the script to put in the aforementioned directory. Script name doesn’t matter:

#! /bin/bash

REQUIRED_CONNECTION_NAME="singularity"      # change singularity to your network connection name
VPN_CONNECTION_NAME="airvpn"                # change airvpn to your VPN connection name

activ_con=$(nmcli con status | grep "${REQUIRED_CONNECTION_NAME}")
activ_vpn=$(nmcli con status | grep "${VPN_CONNECTION_NAME}")
if [ "${activ_con}" -a ! "${activ_vpn}" ];
then
    nmcli con up id "${VPN_CONNECTION_NAME}"
fi

The “singularity” is a name of my wifi connection and “airvpn” is a name of the VPN connection. Replace them with yours (visible in the Network Manager widget).

Add execution permission (i.e. chmod +x /etc/network/if-up.d/connect-to-vpn where connect-to-vpn is the name of the script).

That’s all. Test it by turning off and on your network connection. VPN should now connect automatically.

Posted in english, programowanie, technologia | 3 Comments

Rails partials: nigdy nie wołaj render() w pętli

Wołanie <%= render(…) %> w pętli jest straszliwie niewydajne bo railsy owijają każde wywołanie rendera w benchmark(). ZTCW nie da się tego wyłączyć. Problem jest zauważalny już przy 10-20 powtórzeniach. Przy długich listach itemów, liczących np. 100 pozycji, jest to już prawdziwy horror – renderowanie ponad 1s.

Wydajna alternatywa:

<%= render @collection %>

np.

<%= render @users %>

W powyższym railsy dla każdego obiektu z listy @users sprawdzą nazwę modelu (User) i wyrenderują partial _user.html.* (konwencja). Benchmark zostanie wywołany tylko raz, stąd radykalna poprawa wydajności.

Posted in polskie, programowanie, rails, ruby, technologia | 3 Comments

Kantor Bitcoin PLN

(Aktualizacja 13 listopada 2011). Gdzie można kupić / sprzedać Bitcoiny za złotówki? Poniżej zamieszczam listę miejsc umożliwiających handel walutą Bitcoin (BTC) w polskich realiach:

(Disclaimer: pamiętaj, że Bitcoin to technologia cutting edge a towarzysząca mu infrastruktura jest niedojrzała. Z każdej usługi korzystasz na własną odpowiedzialność. Bądź ostrożny!)

Powyższe “kantory” działają na zasadzie walutomatu – są tylko platformami, na których użytkownicy handlują między sobą. Jednak powszechnie przyjęło określać je jako “kantory Bitcoin”, więc w dalszej części artykułu będę stosował tę terminologię.

Intersango to kantor prowadzony przez renomowane Bitcoin Consultancy. To jedyny kantor na świecie, który tworzą (niektórzy) programiści samego Bitcoina. Kantor cieszy się nieposzlakowaną opinią i ma obecnie charakter non-profit. Szczęśliwym zbiegiem okoliczności Bitcoin Consultancy ma siedzibę w Warszawie, choć w teamie chyba nie ma ani jednego Polaka. Intersango niedawno założyło konto w BZWBK i uruchomiło rynek wymiany PLN z krajowymi, bezpłatnymi wpłatami i wypłatami złotówek. Naturalnie, kilka dni po starcie (piszę to 13-ego listopada 2011) rynek jest płytki, ale udało mi się już korzystnie przeprowadzić transakcje rzędu kilkuset BTC.

BitMarket to solidny kantor polskiej produkcji, skupiający się co prawda na obsłudze waluty EURO, ale obsługujący również rynek polski. Jest unikalny pod tym względem, że nie przyjmuje depozytów w żadnej walucie prócz Bitcoin – przelewy walut fiat użytkownicy robią między sobą, co oczywiście rodzi ryzyko oszustwa, na które sam kantor nie ma wpływu. BitMarket wymaga weryfikacji tożsamości (np. przez Allegro) aby ograniczyć ryzyko oszustwa. Kantor jest bezpłatny.

Giełda ofert na polskim forum Bitcoin to kolejny skuteczny sposób zakupu bądź sprzedaży Bitcoina. Każdy może bezpłatnie zamieścić ofertę skupu/sprzedaży BTC. Niektórzy zaufani członkowie społeczności (np. Prze_koles, Kimono) oferują możliwość pośrednictwa w transakcjach lub zakładach, co praktycznie eliminuje ryzyko oszustwa.

Mt. Gox PLN to polski rynek na największym światowym kantorze Bitcoin. “Największym” niestety nie znaczy najlepszym. Mt Gox ma wiecznie jakieś problemy z wpłatami i wypłatami. Możliwe są b. duże opóźnienia oraz wymóg udowodnienia tożsamości przed wypłatą większych środków. Mt. Gox w przeszłości padł ofiarą poważnego ataku hackerskiego. Wyciekła tabela użytkowników i kantor był niedostępny przez kilka tygodni. Ostatecznie (niemal) wszyscy odzyskali swoje środki. No właśnie – _niemal_ wszyscy. Potem było też kilka mniejszych fuckupów (jakieś anomalie z transakcjami itp).

Z drugiej strony Mt. Gox uratował polskich użytkowników Bitomatu, zwracając wszystkim Bitcoiny utracone przez Bartłomieja Szabata. Co więcej, jest to chyba jedyny naprawdę dochodowy kantor Bitcoin na świecie. Mt. Gox toczy batalię prawną o “legalizację” Bitcoina we Francji. Dlatego bardzo ciężko ich jednoznacznie ocenić. Wydaje się, że zespół Mt. Gox ma czyste intencje, ale gra niezwykle ryzykownie i odbija się to na użytkownikach.

Notki historyczne

Kiedyś istniał jeszcze kantor “Bitomat”, ale stracił wszystkie Bitcoiny użytkowników – łącznie kilkanaście tysięcy BTC – w wyniku niekompetencji i nieodpowiedzialności właściciela, Bartłomieja Szabata. Bitomat był pierwszym polskim kantorem BTC i w chwili chwały miał wielu fanów. Niewątpliwie Bitomat przyczynił się do początkowej popularyzacji Bitcoina w Polsce.

Na fali upadku Bitomatu powstały dwa nowe kantory: FreshBTC i Bitchange.pl. Ten pierwszy został natychmiast “zakopany” przez społeczność ze względu na bardzo liczne błędy i niesolidne wykonanie (do czego sam się zresztą mocno przyczyniłem wyprowadzając kilkaset złotych w ramach eksperymentu (zostały zwrócone)). Drugi z nich, Bitchange.pl, choć nie był całkiem pozbawiony błędów, zyskał sympatię społeczności  i rozkwitał. Niestety właściciel postanowił zamknąć kantor ze względu na nieuregulowaną sytuację prawną Bitcoina w Polsce i potencjalne problemy. W swojej krótkiej historii Bitchange nigdy nie stracił pieniędzy użytkowników i nie doświadczył żadnej poważnej awarii.

Posted in bitcoin, polskie, technologia | Leave a comment

Przyjmowanie płatności Bitcoin – beta

Już wkrótce przyjmowanie płatności w wirtualnej walucie Bitcoin (BTC) stanie się równie łatwe jak płatności w złotówkach. Nowa usługa BitcoinNotify.com oferuje powiadomienia o płatnościach Bitcoin dla sklepów, aplikacji i osób przyjmujących donacje.

Jak to działa? Aplikacja (np. sklep internetowy) otrzyma powiadomienie HTTP o każdym wpływie pieniędzy na swoje konto (adres Bitcoin). Co ważne, Bitcoiny idą od klienta bezpośrednio na konto sklepu. Nigdy nie przechodzą przez konto pośrednika. Odpada zatem problem zaufania.

Jest to możliwe, ponieważ wszystkie transakcje w sieci Bitcoin są publiczne. Usługa BitcoinNotify.com monitoruje publiczną sieć p2p i wyłapuje transakcje na określone konta.

Aplikacja jest dostępna wyłącznie na zaproszenia. Niniejszym rozdaję pewną pulę zaproszeń: 6gzFRurl9x (invitation code) – kto pierwszy, ten lepszy.

Aplikacja oferuje także powiadomienia o zmianach kursu, co pozwala na bieżąco aktualizować ceny BTC w sklepie.

Obecnie usługa jest całkowicie bezpłatna. Chwyć zaproszenie i zacznij obsługiwać płatności Bitcoin w swojej aplikacji, zanim zrobią to inni. Dwa pierwsze polskie sklepy przyjmujące płatności Bitcoin były już prezentowane w telewizji i na głównej Wykopu.

PS Kącik programistów: aplikacja napisana jest w całości w Ruby i Railsach – łącznie z monitoringiem sieci Bitcoin. Stoi na Ubuntu Server LTS. Chętnie opowiem o wszelkich technikaliach, również od strony bezpieczeństwa i niezawodności usługi.

Posted in bitcoin, polskie, programowanie, rails, ruby, technologia | 8 Comments

Laptopy po cenach niemal fabrycznych – dojście

Przed moim niedawnym zakupem laptopa przetrząsnąłem pół Internetu w poszukianiu najniższych cen na porządne laptopy (nie tam jakieś Acery).

Znalazłem ludzi, którzy mają dostęp do amerykańskich, fabrycznych cen na wybrane modele laptopów.  Continue reading

Posted in apple, lifestyle, polskie, programowanie, technologia | Leave a comment