Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

cz.1 | Programowanie w Linuksie

Witam was wszystkich. Ostatnio przez dłuższy czas nie miałem ani minyty czasu aby cokolwiek napisać na blogu ale jako, że coś się zmieniło i mam teraz troszkę więcej czasu to zacznę znowu pisać. W tej serii opiszę swoje doświadczenia w programowaniu pod Linuksem.

jakiś tam wstęp

Wciąż pracuję nad swoim Subgetem i szczerze mówiąc sporo się uczę przy jego tworzeniu. Dalej i dalej siedzę w Pythonie bo jest przewygodny - to prawda.

Ostatnio pomyślałem aby zamiast wadliwej obsługi COM'u zaimplementować w Subgecie obsługę socketów pod Windowsem ponieważ COM i Python się zwyczajnie nie lubią. API COM'u w Pythonie jest felerne, to znaczy nie wiem czy tylko w Pythonie ale w samym Pythonie jest do bani, to jest pewne. Chyba nie będę tego opisywać bo to długa historia. No chyba, że będziecie chcieli to w następnej części albo w osobnym wpisie opiszę moją przygodę z COM'em i Pythonem.

Python zapewnia interfejs socketów kompatybilny zarówno z WinSocks oraz z Unix Sockets dlatego kod programu dla obu platform byłby mniej więcej taki sam. Dobra, koniec tego gadania takiego tam... : )

Do rzeczy, teraz trochę o środowisku Uniksowym...

Ostatnio stworzyłem małą aplikację w shellu "subget-translator" ma ona za zadanie monitorować zmiany w pliku z źródłowym tłumaczeniem językowym programu i w razie jakiejkolwiek zmiany (jak zapiszemy plik w edytorze tekstowym) to aplikacja sama skompiluje tłumaczenie do postaci binarnej GNU Gettext oraz uruchomi program do testów.

Fajną sprawą w Linuksie jest środowisko ze zmiennymi łatwo dostępne z poziomu aplikacji i shella, możemy w nim ustawić praktycznie wszystko do testowania aplikacji. W translatorze Subgeta użyłem właśnie zmiennych środowiskowych do ustawienia języka aplikacji na chwilę jednego uruchomienia.

env jest dostępnym narzędziem w każdym systemie, pokazuje ono listę zmiennych środowiskowych którymi kierują się aplikacje w integracji z systemem operacyjnym. Aby ustawić inny język w dowolnej aplikacji w uniwersalny sposób po prostu ustawiamy zmienną LANG w shellu, dla Basha to będzie:

export LANG="pl_PL.UTF-8" # dla języka Polskiego export LANG="en_US.UTF-8" # dla języka Angielskiego (stany zjednoczone) export LANG="da_DK.ISO-8859-1" # dla języka Duńskiego

W /etc/locale.gen możecie znaleźć więcej języków do sprawdzenia.

W ten magiczny sposób DOWOLNA aplikacja uruchomiona w tej samej konsoli po wpisaniu tego polecenia stosuje się do nowych zasad, czyli ustawionego języka, motywu oraz przeróżnych ustawień programów. W Pythonie aby ustawić ustawić zmienną środowiskową należy zaimportować bibliotkę os oraz wykonać:

os.putenv("LANG", "en_US.UTF-8")

A następnie można uruchomić dowolną aplikację poprzez os.system():

os.system("/usr/bin/subget")

Aplikacja będzie się stosować do nowo ustalonych zmiennych środowiskowych i powinna uruchomić się w języku angielskim. Przy pomocy env i grep możemy odnaleźć interesujące nas zmienne.

env|grep GTK GTK2_RC_FILES=/etc/gtk-2.0/gtkrc:/home/webnull/.gtkrc-2.0:/home/webnull/.kde4/share/config/gtkrc-2.0 GTK_RC_FILES=/etc/gtk/gtkrc:/home/webnull/.gtkrc:/home/webnull/.kde4/share/config/gtkrc

Wystarczy właściwie stworzyć własny plik z motywem gtkrc oraz wstawić jego adres do GTK2_RC_FILES a następnie uruchomić aplikację - pozostałe programy będą wyglądać normalnie a nasza aplikacja będzie z całkowicie innym motywem systemu. W katalogu find /usr/share/themes -name '*gtkrc*' znajdziecie więcej motywów do testowania : )

No to nowi programiści Linuksowi, wiecie już jak testować Waszą aplikację w różnych konfiguracjach systemowych, proste, prawda? Systemy Uniksowe to prostota. 

linux oprogramowanie programowanie

Komentarze

0 nowych
Ave5   8 #1 31.08.2012 13:27

Webnull żyje :O

Banan   10 #2 31.08.2012 13:31

Ja wchodzę na bloga i pierwsze co zrobiłem to krzyknąłem - O! Webnull!

webnull   9 #3 31.08.2012 13:32

Zaraz dodam drugi wpis w którym znowu pocisnę sobie z Microsoftu ; D Ale nie w dosłowny sposób pocisnę ale wyżalę co mnie spotkało...

GBM MODERATOR BLOGA  19 #4 31.08.2012 13:35

Huh, kogo moje oczy widzą ;)

Witaj znowu Webnull :)

foreste   14 #5 31.08.2012 13:37

Napisałbyś nakładkę na avr dude pod linux w pythonie :P

BartoszCoyote   1 #6 31.08.2012 13:40

Jakiego linuxa używasz?

webnull   9 #7 31.08.2012 13:45

@BartoszCoyote
Linux tealc 3.3.8-gentoo #1 SMP Thu Jul 19 09:46:09 CEST 2012 i686 Pentium(R) Dual-Core CPU E5300 @ 2.60GHz GenuineIntel GNU/Linux

Gentoo Stable (x86)

  #8 31.08.2012 15:55

Mówisz o comtypes?

soanvig   9 #9 31.08.2012 16:06

Masz spory problem z przecinkami

mario@   4 #10 31.08.2012 18:27

@foreste - AVR8 Burn-O-Mat - co prawda napisany w javie ale czy robi to różnicę w użytkowaniu?

Co do pisania programów w Pythonie (w kontekście programu subgetcore), webnull czasem warto uruchomić pep8, pyflakes a tego możesz odpalić tak dla żartów -> pylint ;)

Autor edytował komentarz.
webnull   9 #11 31.08.2012 18:48

Dzięki mario@ : )

_qaz7   6 #12 01.09.2012 10:15

co do COM, to pisanie ich jest średnio przyjemne, ale wykorzystanie wręcz odwrotnie zwłaszcza w skryptach bo nie muszą one mieć dołączonych żadnych informacji o API aplikacji z której chcemy korzystać - wszystko siedzi w rejestrze po zarejestrowaniu serwera COM aplikacji.

Wszystkim którzy się interesowali trochę tematem pewnie wpadł w ręce przykład skryptu w WSH-JScript korzystającego z Excela poprzez COM - skrypt tworzy arkusz Excela, wypełnia komórki, buduje z nich wykres i obraca go:

[code]
var objXL, objXLchart : Variant;
intRotate : integer;
begin
objXL := CreateOleObject('Excel.Application');
objXL.Workbooks.Add;
objXL.Cells[1,1].Value := 50;
objXL.Cells[1,2].Value := 10;
objXL.Cells[1,3].Value := 15
objXL.Range('A1:C1').Select;
objXLchart := objXL.Charts.Add;
objXL.Visible := true;
objXLchart.ApplyCustomType(-4100)
for intRotate := 5 to 180 do
begin
objXLchart.Rotation := intRotate;
Wait(1);
intRotate:=intRotate+4; //loop will add 1 more
end;
for intRotate := 175 downto 0 do
begin
objXLchart.Rotation := intRotate;
Wait(1);
intRotate:=intRotate-4; //loop will subtract 1 more
end;
end.
[/code]

oczywiście trzeba mieć zainstalowany MS Office a ten kod zgrać jako plik *.js

Autor edytował komentarz.
webnull   9 #13 01.09.2012 10:17

W Subgecie wciąż jest obsługa COM, można ją sobie ręcznie włączyć i zobaczyć jak to fatalnie działa...

iluzion   5 #14 01.09.2012 13:39

mario@ ma rację. pep8 można uruchomić z konsoli lub skorzystać z IDE:

https://github.com/jcrocholl/pep8/

Np. w Eclipse można włączyć sprawdzanie stylu wg pep8 https://dl.dropbox.com/u/1010315/misc/pep8.png

A tak poza tym to stosowanie zmiennych środowiskowych do zmiany stylu graficznego aplikacji wydaje mi się bardzo średnim rozwiązaniem ;) Lepiej skorzystać z gotowych narzędzi designera / creatora (nie wiem jak to wygląda dokładnie w GTK) lub definiować styl przy pomocy CSS.

W PyQt/PySide są m.in. metody:

QApplication.setStyle (QStyle)
QApplication.setStyleSheet (self, QString sheet)

Autor edytował komentarz.
webnull   9 #15 01.09.2012 13:50

Niestety nie używam Eclipse a jedynie zwykłych edytorów tekstowych typu gedit, kate czy nawet nano... Eclipse jest dla mnie zbyt wielkie i przeładowane.

iluzion   5 #16 01.09.2012 14:18

Edytory typu Emacs, Vim, SublimeText 2 itp. też posiadają tego typu narzędzia, ale trzeba je doinstalować.

webnull   9 #17 01.09.2012 15:03

Znalazłem coś do gedita, później to sprawdzę.
https://github.com/rdunklau/Gedit-checkpython

Demagog   4 #18 01.09.2012 15:30

Tak z ciekawości i z lenistwa (Mogłem przejrzeć źródła) to w czym zrobiłeś obsługę wtyczek?

  #19 01.09.2012 15:42

Zmienił zdjęcie....

kr2ysiek   6 #20 01.09.2012 18:39

Wkradła się literówka, jest: LANG="pl.PL_UTF-8", a powinno być: LANG="pl_PL.UTF-8". Ktoś skopiuje i powie, że nie działa. ;)

webnull   9 #21 01.09.2012 20:34

@Demagog
Jeśli chodzi o Subgeta to mogę specjalnie dla Ciebie napisać artykuł o tym jak stworzyłem obsługę wtyczek.

To bardzo proste. Na początku szukasz wszystkich plików z wtyczkami i przy starcie aplikacji ładujesz je wszystkie, po prostu importujesz. Ale oprócz tego aby te wtyczki były wtyczkami musisz stworzyć tak zwaną klasę Hookingu.

Klasa Hookingu to nic innego jak możliwość odwołania się do kodu wtyczki w momencie normalnego wykonywania się aplikacji. Czyli w miejscu np. po naciśnięciu przycisku pobierania napisów klasa Hooking poszuka wszystkich wtyczek które zadeklarowały się, że po naciśnięciu tego przycisku będą chciały wykonać swój kod i podmienić wynik działania programu.

webnull   9 #22 01.09.2012 20:35

@kr2ysiek | 01.09.2012 18:39
Dziękuję bardzo : - )

Razi   5 #23 02.09.2012 21:18

Szczerze mówiąc Linuksa używam od 4 lat już, a o LANG nie słyszałem xD Nareszcie będę mógł normalnie GIMPa 2.8 używać w polskim OSie bez szerokich jak diabli paneli przez te cholerne tłumaczenie! Aż podmienię sobie .desktop :)

Feyd   6 #24 03.09.2012 09:56

@_qaz7
[[pisanie ich jest średnio przyjemne, ale wykorzystanie wręcz odwrotnie ]]
Wiem ze sie czepiam ale co jest odwrotnoscia czegos sredniego?

nintyfan   10 #25 03.09.2012 20:32

Nie zapominajmy o tym, że styl GTK+ można zdefiniować dla aplikacji. Wystarczy, że odpowiednio nazwany plik umieścimy w katalogu z aplikacją.