Skip to content

Konfiguracja i kompilacja LESS-a pod linuxem

Witam!

W tym wpisie opiszę jakie problemy napotkałem podczas prób zastosowania LESS-a pod Kubuntu 11.04 i jak je rozwiązałem.

LESS to rozszerzenie języka CSS, które daje nam kilka naprawdę fajnych możliwości, na przykład zagnieżdżania klas, dzięki czemu kod arkuszy stylów staje się ładniejszy i łatwiejszy w utrzymaniu. Więcej o LESS-ie i jego możliwościach można przeczytać tutaj.

LESS ma dobre narzędzia dla Windowsa i Mac-a, niestety nie udało mi się uruchomić żadnego z narzędzi w Wine, ani wersji przeznaczonych dla Linuxa (binarki wydawały się być uszkodzone). Nic to jednak! Po to się zna Pythona, żeby pisać skrypty, prawda?😀

Przede wszystkim chciałem mieć możliwość kompilacji plików *.less ręcznie do plików *.css. Potrzebne do tego narzędzie nazywa się lessc. Aby je zainstalować potrzebujemy serwera javascript node.js. Najłatwiej zainstalować go z repozytorium, jednak może okazać się, że wersja dostępna w domyślnych paczkach będzie zbyt stara. Można bawić się w tworzenie paczek, ja skompilowałem node-a ze źródeł – link.

Mając najnowszą wersję node-a przyda się npm – node package manager. Można go łatwo zainstalować za pomocą jednej komendy :
curl http://npmjs.org/install.sh | sh(odpalamy to bez sudo, nie chcemy żeby dziwne zdalne rzeczy bawiły się naszym kompem ;)). Po więcej informacji zajrzyj tutaj.

Mając npm możemy (nareszcie!) zainstalować less-a.
npm install less
Mamy teraz interesującą nas binarkę lessc w katalogu /home/#nazwa_użytkownika#/node_modules/less/bin. Nie dodam jej do PATH-a, gdyż w dalszej części how-to usprawnię nieco pracę z LESS-em.

Opisywałem wszystkie powyższe kroki, bo mimo, że wydają się być dosyć proste, miałem problemy z ich wykonaniem (głównie przez brak node-a w aktualnej wersji). Na wszelki wypadek, opisałem wszystko krok po kroku.

Mając możliwość kompilacji plików less, chciałbym, aby edytując pliki lessowe, automatycznie je kompilował. Poszperałem chwilę w sieci i znalazłem taką bibliotekę do Pythona – pyinotify. Na tej stronie są informacje dotyczące jej instalacji, więc nie będę się nad tym tutaj rozwodzić.

Biblioteka ta pozwala na podpinanie akcji pod różne wydarzenia, które dzieją się w systemie plików – tworzenie katalogów/plików, modyfikowanie plików itd. Właśnie modyfikowanie nas interesuje. Chciałbym, abym od razu po zmianie i zapisaniu pliku less kompilował się on do pliku css, aby mógł natychmiast podejrzeć efekt w przeglądarce.

Oto kod w Pythonie, który to wykonuje:

#!/usr/bin/python
import pyinotify
import commands
import os

class MyEventHandler(pyinotify.ProcessEvent):
    def process_IN_MODIFY(self, event):
        result = commands.getstatusoutput('#ścieżka do lessc#/lessc ' + event.pathname + ' ../' + event.path[:-4] + 'css');
        if(result[0] == 0) :
            print 'compile successful'
        else :
            print result[1]


fileList = os.listdir(os.getcwd())
wm = pyinotify.WatchManager()
for fname in fileList :
    if(fname[-4:] == 'less'):
        wm.add_watch(fname, pyinotify.IN_MODIFY, rec=True)


eh = MyEventHandler()

notifier = pyinotify.Notifier(wm, eh)
notifier.loop()

Po kolei – tworzę klasę, która definiuje zachowanie dla zdarzenia modyfikacji pliku. Odpalam lessc z argumentami – nazwą pliku i nazwą pliku ze zmienionym rozszerzeniem w katalogu o poziom wyżej. Należy to dopasować do konkretnej sytuacji w drzewie katalogów projektu.

Po definicji klasy pobieram wszystkie nazwy plików z katalogu, w którym jest odpalony skrypt, i dla tych, które mają rozszerzenie less podpinam zdefiniowane wcześniej zachowanie.

Teraz, gdy zabieram się za edycję plików less, wystarczy, że odpalę ten skrypt z katalogu, w którym je trzymam, aby automatycznie je kompilował. Jeśli nastąpią błędy kompilacji, skrypt wyświetli je w konsoli.

Mam parę pomysłów, jak zintegrować ten skrypt z innymi narzędziami, których używam, ale to już temat na inny post🙂.

Skrypt wrzuciłem na GitHuba, może będę go jeszcze aktualizować: repo

Mam nadzieję, że ten post w czymś Ci pomógł, pozdrawiam i do następnego razu!

Sprawdzanie wyników kolokwium

Witam,

Dzisiaj pokażę jak rozwiązałem problem, który nęka wielu studentów, a mianowicie problem braku rss-a na stronach wykładowców😉.

Stwierdziłem, że nie chcę tracić czasu nerwowe przeładowywanie strony, zbyt wiele razy już tak robiłem. Machnąłem skrypcik w pythonie, który robi to za mnie.

#!/usr/bin/python
import urllib2
response = urllib2.urlopen('url strony wykładowcy')
html = response.read()

if html.count('?') != 35 :
  import smtplib

  sender = 'twójEmail@domena.com'
  receivers = ['twójEmail@domena.com']

  message = """From: From Person
  To: To Person
  Subject: Wyniki!!!
  Wyniki!!!
  http://link do strony
  """
  try:
    smtpObj = smtplib.SMTP( 'smtp.gmail.com' , 587 )
    smtpObj.ehlo()
    smtpObj.starttls()
    smtpObj.ehlo()
    smtpObj.login('adres@domena.com', 'password')
    smtpObj.sendmail(sender, receivers, message)
    print "Successfully sent email"
    import os
    os.system('crontab -r')
  except Exception:
    print "Error: unable to send email"

Co się dzieje po kolei:

Najsampierw wczytuję zawartość strony na której wiem, że będą wyniki. Niestety nie udało mi się zakodować nerwowości😉.
Następnie sprawdzam czy pojawiły się wyniki. Tutaj sprawa jest dość prosta. Ten wykładowca ma na stronie tabelkę z numerami indeksów wszystkich bieżących studentów i tam gdzie nie ma wyników były znaki zapytania. Wystarczyło zliczyć znaki zapytania na stronie i sprawdzić, czy ich ilość zgadza się z zaobserwowaną wcześniej. Jeśli się nie zgadza, zapewne znaki zapytania zostały zastąpione przez cudowne wyniki. Dla każdego wykładowcy warunek tutaj będzie inny, jeśli wiemy, że ktoś wstawia link do pdf-a z wynikami, można na przykład spróbować zliczyć tagi a używając wyrażeń regularnych, lub – aby być bardziej pro – skorzystać z xpath

Należałoby więc jakoś poinformować biednych studentów o ich losie. Jako, że z moja skrzynką mailową jestem na bieżąco, uznałem, że nie ma konieczności narażać się na koszty w postaci bramki sms. Oczywiście w miejsce wysyłki maila można wsadzić dowolny inny kod, choćby request http do wspomnianej bramki. W moim wypadku założyłem nowe konto gmailowe, i użyłem jego danych logowania do dostępu do smtp gmaila.

Mamy już skrypt, teraz wypadałoby go uruchamiać. Najlepiej cyklicznie, najlepiej co 2 minuty (to już chyba jest nerwowość). Mam dostęp do serwera linuksowego, który jest odpalony całą dobę, więc jest to dokładnie to czego mi trzeba. Ustawię sobie zadanie cron-a odpalane co dwie minuty.

$crontab -e

W edytorze dodajemy linijkę
/2 * * * * python /sciezka/do/skryptu.py

Teraz zostaje nam czekać i drżeć przy każdym nadchodzącym mailu😉.

PlanTygodnia.pl

Cześć!

Po paru zarwanych nockach, przeklinaniu i ogromnej przyjemności z pisania czegoś własnego nastąpił release aplikacji PlanTygodnia.pl🙂.

Oto link bezpośredni:
Oraz link do appa z Chrome Web Store:

Zapraszam do testowania, wyrażania opinii i przede wszystkim do używania. Mam nadzieję, że komuś się to przyda i będę miał motywację do poprawiania i dodawania nowych ficzerów😉.

Pozdrawiam,
Maciej

Konfiguracja Saitek Cyborg R.A.T.5 na Kubuntu 11.04.

Dzisiaj wpis z trochę innej beczki.

Jakiś czas temu kupiłem sobie całkiem fajnego szczura (określenie „myszka” jakoś mi nie pasuje) – Saitek Cyborg R.A.T.5.

Ten wpis opisze proces jego konfiguracji pod linuxem tak, aby cieszyć się jej prawie pełną funkcjonalnością. W jednym z kolejnych wpisów zamierzam zamieścić recenzję tego sprzętu, jednak o tym później🙂. Na końcu wpis są źródła z których korzystałem.

Saitek wypuścił fajny program do konfiguracji urządzenia pod Windowsa, można tam zrobić naprawdę sporo rzeczy. Oczywiście nie ma wersji linuksowej, ale nie po to używamy korzysta się z Linuksa żeby mieć wszystko podane na tacy, prawda?

Po podłączeniu sprzętu pod usb zachowuje się on cokolwiek dziwnie – menedżer okien nie przechwytuje kliknięć, chyba że co ok. 15 sekund wciskamy klawisz zmiany trybu. Ale nie chcemy tego robić. Problem występował zarówno pod Gnome jak i KDE.

Pierwszą rzeczą jaką należy zrobić jest edycja pliku /etc/X11/xorg.conf . Tak więc odpalamy nasz ulubiony edytor tekstu (ja używam vima) i dodajemy na koniec pliku:

Section "InputClass"
Identifier "Mouse Remap"
MatchProduct "Saitek Cyborg R.A.T.5 Mouse"
MatchDevicePath "/dev/input/event*"
Option "ButtonMapping" "1 2 3 4 5 6 7 2 9 10 11 12 0 0 0"
EndSection

Zapisujemy plik, restartujemy serwer X, jeśli nie zadziała restartujemy komputer. Teraz gryzoń działa normalnie, tzn. działa scroll pionowy, LMB, RMB, MMB, i nawet forward. Ale normalnie to za mało, mamy jeszcze 6 przycisków do obsłużenia!.

Aby cieszyć się możliwością używania i konfiguracji wszystkich przycisków musimy zainstalować sobie btnx.

sudo apt-get install xvkbd xbindkeys xmacro xserver-xorg-input-evdev btnx

Odpalamy btnx-config (ważne – z uprawnieniami roota!). Możemy stworzyć nowy profil, jednak nie jest to konieczne. Klikamy na „Detect mouse & buttons” i robimy to co program nam każe. Potem przechodzimy na taba „Buttons” i możemy skonfigurować sobie każdy wykryty na szczurze przycisk. Jako że u mnie działały przyciski zmiany dpi, zostawiłem je w spokoju i skonfigurowałem tylko cztery – ScrollRight, ScrollLeft, Backward i Aim. Przykładowy config przycisku:

Należy pamiętać o zaznaczeniu checkboxa „Enabled” aby korzystać z konfiguracji.

W przycisku Backward ustawiłem sobie KEYCODE „KEY_BACKSPACE”, jednak z niewiadomego powodu po każdym naciśnięciu oprócz Backspace przesyłany jest również znak ‚N’. Jeśli dojdę dlaczego tak się dzieje, zrobię update tego postu. W scrollu poziomym ustawiłem klawisze strzałek, a pod Aim ustawiłem ctrl+t – skrót do otwarcia nowej karty w Chrome. Do wyboru jest sporo kodów przycisków, ale nie chciało mi się ich przeglądać😉. Nie jest to pełna funkcjonalność (na przykład Aim pod Windowsem zmniejsza czułość gryzonia), ale btnx i tak umożliwił używanie więcej niż trzech przycisków.

Nie sprawdzałem tego, ale podejrzewam, że jeśli będziemy mieli więcej niż jeden profil i do przycisku „mode” przypiszemy akcję „Configuration switch / Next config.” to otrzymamy podobną funkcjonalność jak w używaniu myszki pod Windowsem – przynajmniej jeśli chodzi o przełączanie się między profilami.

Po skonfigurowaniu wystarczy wrócić do taba „Configurations”, kliknąć na „Restart btnx” i gotowe!

Mam nadzieję, że ten post oszczędzi komuś trochę czasu.
Pozdrawiam i do następnego razu🙂.

źródła: http://community.linuxmint.com/hardware/view/6651 ,
http://matt-linux-log.blogspot.com/2010/10/saitek-cyborg-rat-in-linux.html

Upgrade PHP na Ubuntu server 8.04

Wersja któtka:

  • Usuń PHP z serwera apt-get remove php5
  • Zrób backub pliku /etc/sources.list
  • Wyczyść go
  • Dodaj do niego adresy
    deb http://php53.dotdeb.org stable all
    deb-src http://php53.dotdeb.org stable all
  • Wywołaj apt-get update
  • Zainstaluj PHP apt-get install php5
  • Przywróć plik /etc/sources.list do pierwotnego stanu (na wypadek jakichś przyszłych update-ów, chociaż najprawdopodobniej tej wersji nie da się upgrade-ować bardziej niż jest teraz używając oficjalnego repo)
  • Wywołaj apt-get update

I to w zasadzie tyle. Nie wiem czy jest to najlepszy sposób, ale dla mnie zadziałał🙂.

Wersja z wynurzeniami:

Ten problem pojawił się gdy musiałem odpalić testy jednostkowe w frameworku Yii na rzeczonym systemie. Yii wymaga PHPUnit w wersji 3.5, PHPUnit wymaga PHP w wersji 5.2.7. Na serwerze było 5.2.4. Tak blisko, a tak daleko.

No ale nic, pomyślałem sobie „apt-get” załatwi sprawę. Nie załatwił, Ubuntu w oficjalnym repo ma co najwyżej 5.2.4. Zaczęła się zabawa.

Poszperałem w sieci, znalazłem dużo postów na różnych blogach, szukałem też na stackoverflow, również znalazłem sporo propozycji. Tylko że żadna nie działała. Nie chciałem dodawać repozytoriów z nowszej wersji Ubuntu bo z doświadczenia wiem, że to może się źle skończyć. Próbowałem kompilacji ze źródeł, ale było tyle niespełnionych zależności że pomyślałem, że musi być jakiś prostszy sposób. W zasadzie sposób z tej strony: http://www.dotdeb.org/2009/11/30/php-5-3-1-packages-for-debian-lenny-theyre-here/comment-page-1/ jest dobry, tylko nie wspomnieli tam o jednej rzeczy.

Okazało się, że nie do końca rozumiałem jak działa mechanizm apt-get. Myślałem, że jeśli w repozytoriach będzie nowsza wersja paczki to zostanie ona zainstalowana. Okazało się jednak że oficjalne repozytoria zasłaniają te które dodałem.

Obszedłem to w ten sposób, że usunąłem PHP na serwerze, wyczyściłem /etc/sources.list po czym dodałem do niego adresy ze wspomnianego linku i zainstalowałem PHP. Żadnych kompilacji ze źródeł bałaganiących w systemie, po instalacji przywróciłem stan sources.list i wszystko śmiga, mogę cieszyć się automatycznymi testami i spać spokojnie🙂.

Ta sytuacja przypomniała mi, że nie wszystko zawsze musi działać logicznie (albo zgodnie z moją logiką). No i że kiedy po długim próbowaniu coś w końcu wyjdzie, uczucie jest niesamowicie fajne.

Witam!

Witam wszystkich odwiedzających.

Od jakiegoś czasu chciałem mieć bloga, miałem pomysły na to, o czym będę pisać, jak taki blog miałby wyglądać. Raz nawet „prawie” go stworzyłem, jednak zabrakło chęci i czasu do postawienia serwera. Na wordpress.org nie trzeba się o to martwić, więc póki co będę „rezydował” tutaj.

Jeśli okaże się, że ktokolwiek czyta to, co piszę i jest to w jakiś sposób pomocne, pomyślę nad przeniesieniem bloga gdzieś, gdzie miałbym nad nim pełną kontrolę. Póki co jest dobrze.

Chciałbym pisać tu o problemach, na które natrafiam w mojej pracy (obecnie jestem web developerem) i ciekawych rozwiązaniach, na które trafię w internecie, które ktoś mi podpowie no i przede wszystkim – które wymyślę sam. Jeśli najdą mnie jakieś ciekawe i artykułowalne przemyślenia na dowolny temat, jednak z naciskiem na tematykę bloga – podzielę się nimi tutaj. Jeśli doświadczę czegoś ciekawego na mojej drodze w sztukach walki i stwierdzę, że może to być ciekawe również dla innych – również podzielę się nimi tutaj.

Pierwszy artykuł już ma swój temat, który mimo że wydawał się być dosyć wyeksploatowany, okazał się trudniejszy i ciekawszy niż myślałem. Ale o tym za jakiś czas.

Witam Was jeszcze raz i do napisania🙂