sobota, 17 września 2011

Przykładowy .gitconfig


Plik .gitconfig należy zapisać w katalogu domowym (zwykle /home/USERNAME).
[user]
    name = Marcin Milewski
    email = my-secret-email@gmail.com

[alias]
    co = checkout
    st = status
    br = branch
    w = whatchanged

[color]
    ui = auto

[color "branch"]
    current = yellow reverse
    local = yellow
    remote = green

[color "diff"]
    meta = magenta bold
    frag = magenta bold
    old = red bold
    new = green bold

[color "status"]
    added = yellow
    changed = green
    untracked = cyan

piątek, 17 czerwca 2011

SCons i kompilacja kodu w standardzie C++0x

Krótko o SConsie
SCons to ciekawe narzędzie do kompilacji kodu C++, Javy czy LaTeX'a. Autorzy chwalą się pisząc nieskromnie: next-generation build tool.
Kompilacja prostego programu w C++ wygląda następująco:
  1. Tworzymy plik SConstruct
  2. Uruchamiamy polecenie scons
# plik: SConstruct
Program('game', 'main.cpp')   # pierwszy argument można pominąć
Jest to równoważne uruchomieniu następujących poleceń:
g++ -o main.o -c main.cpp
g++ -o game main.o
Łatwo możemy także tworzyć biblioteki:
# plik: SConstruct
SharedLibrary('superlib', 'superlib.cpp')
Jest to równoważne:
g++ -o superlib.os -c -fPIC superlib.cpp
g++ -o libsuperlib.so -shared superlib.os
Widzimy, że SCons zadbał o odpowiednie flagi oraz prefix lib- dla nazwy pliku wynikowego.

Ręczne tworzenie bardziej skomplikowanych poleceń może wyglądać np. tak:
env = Environment()
env.MergeFlags("-lSDL -lSDL_mixer -lSDL_image -lGL -lGLU")
env.MergeFlags("-g -ggdb")
env.MergeFlags("-W -Wall -Wextra -Woverloaded-virtual -pedantic")
env.Program("game", Glob("*.cpp") + Glob("editor/*.cpp"))
Jeżeli nie chcemy wpisywać minusów przed nazwą bibliotek (co prawdopodobnie jest także zachowaniem przeciw wieloplatformowości pliku SConstruct), możemy napisać tak:
env.Append(LIBS = Split('SDL SDL_mixer SDL_image GL GLU'))
Dość ciekawy jest fakt, że SCons sam rozpoznaje, które flagi powinny być gdzie użyte. Wpisując
env.MergeFlags("-I /src/include/")
env.MergeFlags("-L /src/lib/")
pierwsza flaga zostanie użyta podczas kompilacji, a druga dopiero podczas łączenia (konsolidacji).

Konkretnie o problemie

Wydaje się, że odkryliśmy super narzędzie i teraz kompilacja już będzie marzeniem. Rzeczywiście, w prostych przypadkach jest bardzo wygodne. Sprawa trochę się skomplikowała, gdy chciałem dodać flagę zmieniającą używany przez kompilator standard na C++0x.

Po wpisaniu
env.MergeFlags('-std=c++0x')
SCons zachowywał się jakbym niczego nie dopisał! Trochę zaskakujące może być, że komendę
env.MergeFlags('-fmessage-length=70')
wykonał poprawnie (odpowiednia flaga pojawiła się na wyjściu kompilatora).

Rozwiązanie 1
Dodać flagę w definicji środowiska:
env = Environment(CPPFLAGS = ['-std=c++0x'])

Rozwiązanie 2

Zrezygnować z MergeFlags na rzecz Append:
env.Append(CPPFLAGS = '-std=c++0x')

Kompletny SConstruct może wyglądać np. tak:
EnsurePythonVersion(2, 6) 
EnsureSConsVersion(2, 0)

env = Environment()
env.Append(CPPPATH = ['/data/include/boost/', '/usr/include/', ])
env.Append(LIBPATH = [])

env.Append(CPPDEFINES = {'DEBUG_BUILD' : '1'})

env.Append(CPPFLAGS = Split('-W -Wall -Wextra -Woverloaded-virtual -pedantic'))
env.Append(CPPFLAGS = Split('-std=c++0x -g -ggdb'))

env.Append(LIBS = Split('SDL SDL_mixer SDL_image GL GLU'))

env.Program("game", Glob("*.cpp") + Glob("editor/*.cpp") + Glob("gui/*.cpp"))

sobota, 5 marca 2011

Nieczytelne znaki w Emacsie, czyli krzywe wygładzanie w Ubuntu 10.10

Jeżeli na czcionce Emacsie pojawiają Ci się dziwne znaczki, to być może spotkało Cię to samo co mnie.
Problem jest o tyle dziwny, że objawia się tylko w Emacsie, w pozostałych miejscach systemu wszystko jest ok. Ponadto działa poprawnie w jeśli Emacsa uruchomimy w konsoli ( emacs -nw ). Po obejrzeniu poniższego screena chyba nikt nie ma wątpliwości o co chodzi.

Jak widać nie dotyka to wszystkich liter (przynajmniej tak na pierwszy rzut oka wygląda). Ale jeżeli "pomażemy" innym oknem po Emacsie to problem a to zniknie, a to znów się pojawi (ale w trochę innej formie)...

Sterownik karty graficznej!, ktoś powie. Gdyby nie fakt, że to zintegrowany Intel, do którego sterownika jakoś specjalnie się nie doinstalowuje, to coś by w tym było.

Odpaliłem niewiele używaną instalację tego samegu systemu na Virtualboksie i... działa aż miło. No dobra, to pewnie coś z ustawieniami wyglądu. Pozmieniałem dekoracje, poklikałem tu i ówdzie, znalazłem!


Odpowiedź znajduje się w System => Preferences => Appearance => Font



i nazywa się "Subpixel smoothing". Zmieniłem na "Best shapes", a w szczegółach przełączyłem Hinting na Slight. Czcionki wyglądają niemal identycznie, no z wyjątkiem Emacsa, gdzie teraz wszystko jest jak być powinno :)


niedziela, 16 stycznia 2011

Kolorowanie kolorów w CSSie z Emacsem

A Ty jak sprawdzasz czy użyte w arkuszu stylów kolory są ładne?
Używając Emacsa możesz mieć to od razu podczas definiowania koloru!

Przed:


 Po:

Odpowiedź na pytanie jak to zrobić znajduje się na stronie http://xahlee.org/emacs/emacs_html.html
Poniżej kod, który można wkleić do .emacsa i cieszyć się kolorowymi definicjami kolorów.

;; Kolorowanie kolorów w CSSie
(defvar hexcolour-keywords
  '(("#[abcdef[:digit:]]\\{6\\}"
     (0
      (put-text-property
       (match-beginning 0) (match-end 0) 'face (list :background
                                                     (match-string-no-properties 0)))))))

(defun hexcolour-add-to-font-lock ()  (font-lock-add-keywords nil hexcolour-keywords))
(add-hook 'css-mode-hook 'hexcolour-add-to-font-lock)

środa, 1 grudnia 2010

Co kryją labolatoria Gmaila?

Czy zdarzyło Ci się wysłać maila przed ukończeniem jego edycji? Trochę irytujące, ale posiadacze kont u Googla mają na to prosty sposób -- wykorzystać wtyczkę undo send dostępną w laboratorium Gmaila.

Jak się tam dostać? Po zalogowaniu do Gmaila należy szukać klucza:
Klucz do laboratorium
W środku jest wiele ciekawych wtyczek. Poniżej wymienię moim zdaniem najciekawsze.

Undo send
Po wysłaniu wiadomości masz kilka sekund, żeby odwysłać maila. Istnieje możliwość konfiguracji liczby sekund (5, 10, 20 lub 30) w ustawieniach ogólnych (Settings->General).

Default 'Reply to all' 
Przydatne, żeby nikogo niechcący nie wykluczyć z rozmowy.

Inserting images 
Od teraz można wstawiać obrazki w treść maila.

Quote selected text
Cytowanie zaznaczonego kawałka wiadomości. Irytujące jeśli przypadkiem zaznaczysz kawałek tekstu i klikniesz odpowiedz -- trzeba odrzucić wiadomość, odznaczyć i jeszcze raz odpowiedzieć, ughh.

Signature tweaks
Gmail z jakiegoś powodu rozpoczyna odpowiedź przed otrzymaną wiadomością. Z jednej strony najświeższa wiadomość jest zawsze na wierzchu. Z drugiej natomiast przeczytanie historii konwersacji przyprawia o ból głowy. Tak czy inaczej, dzięki Signature tweaks podpis jest bezpośrednio pod naszą wiadomością, a nie pod całą konwersacją.

Coś dla poglądaczy
Innymi ciekawymi wtyczkami są:
  • Google Docs previews in mail
  • Google Maps previews in mail
  • Picasa previews in mail
  • Flickr previews in mail
Umożliwiają pogląd załączników oraz linków z treści wiadomości bezpośrednio w GMailu. Korzystam bardzo często. Polecam.



Wystrzegałbym się natomiast Quick Links. Wtyczka całkiem fajna, bo umożliwia szukanie na skróty (nie trzeba za każdym razem wypełniać pola search jeśli często wyszukujemy jednej frazy). Niestety nie opanowałem sztuki usuwania linków z tego gadżetu. Ktoś wie jak?

sobota, 12 czerwca 2010

Weź styl w swoje ręce

Niewielu wie do czego jest plik userContent.css, a jeszcze mniej go używa. Plik ten pozwala zdefiniować użytkownikowi własny styl CSS dla treści wyświetlanej w oknie przeglądarki Firefox. Choć wiedziałem o nim od dawna, to nigdy nic do tego pliku nie wpisałem. Po co miałbym zmieniać kolor odnośnika? Mógłbym zmienić nawet cały układ dowolnej strony, ale czy nie szkoda na to czasu?

Jak się okazuje, nawet możliwość podmiany CSS'a może się kiedyś przydać. Skorzystałem z tej możliwości w kilku sytuacjach. Zanim konkrety, napiszę, że tego pliku należy szukać w katalogu ~/.mozilla/firefox/sa87d6fas.default/

1. Ciekawe są tylko newsy.
Pierwsza dotyczy serwisu dobreprogramy.pl. Strona jak wygląda każdy widzi. Sęk w tym, że jedyną rzeczą, która mnie na niej ciekawi, są newsy. Mógłbym skorzystać z kanałów RSS, ale jakoś do tej pory nie zainstalowałem jeszcze żadnej aplikacji do tego celu. Ale nie o technologię się rozchodzi.

Korzystając ze wspomnianego pliku userContent.css i znajomości CSS. Wyrzuciłem niepotrzebne elementy strony, czyniąc ją zdecydowanie bardziej użyteczną. Oto zmiany, których dokonałem:
Serwis bez zmian:
Serwis ze zmienionymi stylami:
Efekt można oglądać na stronie dobreprogramy.pl/Aktualności
Pozostaje tylko pokazać zawartość userContent.css:
@-moz-document url-prefix(http://www.dobreprogramy.pl/Aktualnosci) {
    div#bigColumn, div#secondColumn, div.toplevelLimiter, #header, #footer {
        display: none !important;  /* najistotniejszy element */
    }

    #content .third {
        width: 90% !important;
        margin:0 !important;
        padding: 50px !important;
    }

    .main {
        background: white !important;
        margin: none !important;
    }

    div.pagination a {
        font-size: 20px !important;
        margin: 1px !important;
        padding: 15px !important;
        border: 1px solid gray !important;
        background: lightGoldenRodYellow !important;
    }

    div.pagination a.active {
        background: chocolate !important;
        color: black !important;
    }
}

2. Zbyt małe odnośniki są irytujące.
Po chwili użytkowania tego serwisu zaczyna doskwierać dość mała czcionka (szczególnie w paginacji), co utrudnia interakcję - np. trafienie w link.
Ale i na to znalazł się sposób (screen jest w oryginalnym rozmiarze :P ):
Istnieje jeszcze jedna możliwość "powiększenia" linka. Skorzystałem z tego przeglądając stronę z przedmiotu Języki formalne.... Odnośniki o jakże długiej nazwie "Tu" z pewnością nie pomagają w wybraniu tego odsyłacza. Nic prostszego!

3. Niechciane elementy po raz kolejny.

Na stronie Formalnych jest jeszcze jeden element, który mi przeszkadzał -- duże zdjęcie. Samo w sobie jest bardzo ładne, ale żeby ponad 2 MB na głównej stronie? Usunąłem :) A link zmieniłem z "Tu" na "Tu jest aktualny ranking". Strona wygląda może nieco dziwnie, ale za to mogę łatwo wykonywać pewne akcje.


@-moz-document url-prefix(http://www.ii.uni.wroc.pl/~jma/kurs.phtml) {
    h1,h2,h3,h4,h5,hr {
        font-size: 10pt;
        padding:0;
        margin:0;
    }
    a[href$="pod_gorke.jpg"] img {    /* ends with pod_gorke.jpg */
        display: none;
    }
    table td:first-child {  /* usuń komórkę z obrazkiem */
        display:none;
    }
    a[href*="ranking"]:after {     /* contains 'ranking' */
        content:'jest aktualny ranking';
    }
    a {
        background-color: lightblue;
        border: 1px solid blue;
        padding: .5em 1em .5em 1em;
        text-decoration: none !important;
    }
}

Podsumowanie
Możliwość definiowania własnego stylu dla strony choć nie jest często wykorzystywana, to jednak czasem potrafi ułatwić życie. Dlatego warto o tej możliwości pamiętać i z niej skorzystać w odpowiednim momencie.

Oprócz pliku userContent.css jest także plik, w którym możemy manipulować wyglądem całego okna - to userChrome.css.

sobota, 22 maja 2010

Ograniczanie wykorzystania łącza z wondershaper

Czy w Twojej sieci lokalnej w godzinach wieczornych nie można dostać się do internetu? Wystarczyłoby przecież, aby każdy korzystający z internetu ograniczył na swoim komputerze wykorzystanie łącza do 1/n (gdzie n to liczba korzystających). Ale czy tak się da? Do niedawna wydawało mi się, że jest to trudne i szkoda czasu na zabawę. Wtedy trafiłem na konsolowe narzędzie wondershaper. Jego wykorzystanie jest dziecinnie proste:
sudo wondershaper wlan0 1200 1000
gdzie wlan0 to nazwa interfejsu, który chcemy zmienić, 1200 to prędkość pobierania, a 1000 - wysyłania.
Uwaga: prędkości podajemy w kilobitach na sekundę. Z programu można korzystać pod Linuksem (jest dostępny w repozytoriach Ubuntu 9.10), pod innymi systemami nie sprawdzałem.