Biblioteka Pythona | Programowanie w Pythonie http://www.python.rk.edu.pl/ Serwis poświęcony Pythonowi - wszechstronnemu językowi programistycznemu. Podstawy i kurs Pythona, Django, PyQt4. pl Biblioteka Pythona | Programowanie w Pythonie http://www.python.rk.edu.pl/site_media/layout/tux.png http://www.python.rk.edu.pl/ 132 124 http://www.python.rk.edu.pl/w/p/co-sie-zdarzy-w-bibliotekach-teraz-z-ticketami/ http://www.python.rk.edu.pl/w/p/co-sie-zdarzy-w-bibliotekach-teraz-z-ticketami/ <![CDATA[Co się zdarzy w Bibliotekach teraz z Ticketami]]> Żeby zorganizować moje pomysły i plany odnośnie planowanych artykułów oraz planowanych zmian i poprawek stworzyłem na szybko publiczny system ticketów - riklaunim.lighthouseapp.com. Można czytać, także po zalogowaniu powinna być możliwość komentowania ticketów (i chyba inne bo to "projekty" open source :)). Jeżeli coś jest głupie to należy ticketa zbluzgać. Jak ciekawe to dodać swoje trzy grosze. Własne pomysły też ;) jak będą ciekawe to będą przyjęte do realizacji :D

Kluczowym elementem, w którym potrzebuję pomocy to osoba posiadająca nieziemskie umiejętności tworzenia projektów stron typu treść/dokumentacja jak Biblioteki. Trochę się bawię sam - wersja rozwojowa, ale najlepiej gdyby znalazł się od tego ekspert ^_^ i coś zaprojektował, czy podsunął szereg wskazówek co jest źle, co jak można dobrze zrobić.

]]>
2009-08-24 02:24:37.472968
http://www.python.rk.edu.pl/w/p/niebawem-troche-zmian-w-bibliotekach/ http://www.python.rk.edu.pl/w/p/niebawem-troche-zmian-w-bibliotekach/ <![CDATA[Niebawem trochę zmian w Bibliotekach :)]]> Planuję w najbliższym jak i bardziej odległym czasie wprowadzić trochę zmian w Bibliotekach. Parę rzeczy jest do poprawienia (kanały RSS, Captcha), a także do usprawnienia (automatyczna rejestracja z OpenID, Facebooka) i pewnie także jakieś zmiany w szablonie strony. Zapraszam do zgłaszania swoich pomysłów, propozycji i uwag poprzez np. "Twoja Sugestia" wiszące po prawej stronie strony.

]]>
2009-08-17 22:17:29.526782
http://www.python.rk.edu.pl/w/p/jobmaster-wystartowal/ http://www.python.rk.edu.pl/w/p/jobmaster-wystartowal/ <![CDATA[JobMaster wystartował]]> www.jobmaster.rk.edu.pl. Jest to wyszukiwarka ofert pracy z różnych serwisów. Na chwilę obecną nie jest ich wiele, ale mają serwis do pokazania łatwiej się rozmawia w kwestiach takich jak udostępnienie ładnego API do indeksowania ofert (teraz te co idą regexami nie zawsze dają poprawnie dobrane dane... a przez API idzie na chwilę obecną Hays i Goldenline). Zastosowałem Whoosha do pełnotekstowego wyszukiwania (na start na pewno starczy, a i tak z czasem źle być nie powinno gdy stare ofert będą ubywać), GeoIP do geolokalizacji IP i dobierania regionu (i ewentualnie miasta) na stronie głównej, blipy do powiadomień na blipie :) Sam serwis stoi na serwerze megiteam.pl.]]> 2009-07-22 15:09:56.188425 http://www.python.rk.edu.pl/w/p/problem-z-ofertami-pracy-w-sieci/ http://www.python.rk.edu.pl/w/p/problem-z-ofertami-pracy-w-sieci/ <![CDATA[Problem z ofertami pracy w sieci]]> Bazując m.in. na swoich doświadczeniach - jest masa serwisów oferujących oferty pracy. Jedne bardziej renomowane, inne "darmowe" i zawierające wiele słabych ofert. Są też "franczyzy" - oferty pracy z jednego serwisu udostępniane w drugim, czy też dodawanie tej samej oferty przez firmę na wielu stronach. Nie ma też chyba konkretnego użytecznego serwisu (poza Google) z prawdziwego zdarzenia będącego wyszukiwarką ofert z większości/wszystkich liczących się serwisów ofertowych (Jest np. praca.money.pl, ale to element większego serwisu i nie promuje się ostro jako multikatalog ofert pracy). Generalnie zamieszczanie ofert jest płatne, więc jeżeli szukamy dobrych ofert - musimy przejrzeć wszystkie fajne serwisy żeby mieć pewność że sprawdziliśmy wszystkie fajne oferty.

Od strony Django jakby taki serwis, zbieracz ofert pracy mógł wyglądać? Najprostsze rozwiązanie to pełnotekstowa wyszukiwarka indeksująca oferty pracy. Konkurencja dla Google, lecz jeżeli zaoferuje trafniejsze wyszukiwanie (np. z filtrowaniem po branży, województwie czy mieście) to będzie poręczniejszy. Xapian, Whoosh, czy może na całego i Solr? Druga opcja to pobieranie (indeksowanie) ofert pracy, wyciąganie ich treści, dodatkowych danych i zapis we własnej bazie danych. W efekcie otrzymamy serwis podobny do innych ofertowych serwisów, lecz oferujący przegląd ofert z wielu źródeł. Kwestia to napisanie parserów dla każdego serwisu - listę najnowszych ofert zazwyczaj otrzymamy z RSS, do tego trochę regexów do wyciągnięcia treści ogłoszenia z gotowej strony, jak i dla każdego źródła będzie pewnie konieczne trochę poprawek różnego typu (CSS, w parserze), żeby treść importowała się w miarę poprawnie - chyba że i treść ogłoszenia rozbijemy na poszczególne składowe pozbywając się formatowania HTML źródła. W przypadku większych serwisów można by pewnie uzyskać dostęp do API umożliwiającego bezproblemowy import ofert.

Dla przykładu dość prosty parser:

# -*- coding: utf-8 -*-
from datetime import datetime
import sys
from os import environ
import urllib2
from re import findall

environ['DJANGO_SETTINGS_MODULE'] = 'settings'

import feedparser

from settings import *
from django.contrib.sessions.models import *
# proof-of-concept app
from diamandas.jobmaster.models import *

############
## Jobexpress
############
source = JobSource.objects.get(title='Jobexpress')
## IT

data = feedparser.parse('http://www.jobexpress.pl/recent,it,84.html')
if data and 'entries' in data:
	for elem in data['entries']:
		sum = elem['summary_detail']
		published = sum['value'].split(',')[0].strip().split('-')
		published = datetime(int(published[2]), int(published[1]), int(published[0]))
		company = sum['value'].split(',')[1].strip()
		
		opener = urllib2.build_opener()
		opener.addheaders = [('user-agent', 'Opera/9.64 (X11; Linux x86_64; U; en) Presto/2.1.1'), ('referer', 'http://www.jobexpress.pl/recent,it,84.html')]
		o = opener.open(elem['link'])
		of = o.read()
		text = findall(r'(?xs)<ul\s*class="oferta_pracy">(.*?)<!--\s*eof:\s*oferta''', str(of))
		if text and len(text) > 0:
			text = text[0]
			# cleaning
			text = '<ul>' + text
			text = text.replace('href="', 'href="http://www.jobexpress.pl/')
			text = text.replace('src="', 'src="http://www.jobexpress.pl/')
			
			city = findall(r'(?xs)<span\s*class="cv_label">Miejsce\s*pracy:\s*</span>(.*?)</li>''', text)
			try:
				city = city[0].strip()
			except:
				city = '???'
			
			# TODO
			region = 'Na bazie miasta'
			
			branch = 'Informatyka/Programowanie'
			try:
				j = JobOffer.objects.get(position=elem['title'], company=company, city=city)
			except:
				j = JobOffer(position=elem['title'], company=company, source=source, url=elem['link'], indexed_at=datetime.now(), updated_at=datetime.now(),
						published_on_source=published, city=city, region=region, branch=branch, offer=text)
				j.save()
			
				print u'ZAPISANO: %s' % elem['title']
			else:
				j.updated_at = datetime.now()
				j.offer=text
				j.save()
				print u'ZAKTUALIZOWANO: %s' % elem['title']
			
A modele mogą wyglądać np. tak:
class JobSource(models.Model):
	"""
	Keeps a "list" of sites with job offers that are parsed by the application.
	Just for ease of data manipulation
	"""
	title = models.CharField(verbose_name='Tytuł', max_length=255)
	url = models.CharField(verbose_name='URL Strony głównej', max_length=255)
	css = models.TextField(verbose_name='Style CSS', blank=True)
	class Meta:
		verbose_name = 'Serwis z ofertami'
		verbose_name_plural = 'Serwisy z ofertami'
	def __str__(self):
		return self.title
	def __unicode__(self):
		return self.title

class JobOffer(models.Model):
	"""
	Indexed job offers from various sites
	"""
	position = models.CharField(verbose_name='Stanowisko', max_length=255)
	company = models.CharField(verbose_name='Firma', max_length=255)
	source = models.ForeignKey(JobSource, verbose_name='Źródło')
	url = models.CharField(verbose_name='URL oferty', max_length=255)
	indexed_at = models.DateTimeField(verbose_name='Data zaindeksowania oferty')
	updated_at = models.DateTimeField(blank=True, null=True, verbose_name='Data ostatniej aktualizacji')
	published_on_source = models.DateTimeField(blank=True, null=True, verbose_name='Data publikacji na stronie-źródle')
	is_inactive = models.BooleanField(blank=True, default=False, verbose_name='Oferta nieaktywna')
	city = models.CharField(verbose_name='Miasto', max_length=255)
	region = models.CharField(verbose_name='Województwo', max_length=255)
	branch = models.CharField(verbose_name='Branża', max_length=255)
	offer = models.TextField(verbose_name='Treść oferty')
	class Meta:
		verbose_name = 'Oferta'
		verbose_name_plural = 'Oferty'
	def __str__(self):
		return self.position
	def __unicode__(self):
		return self.position
Powyższy przykład jest dość prosty i sporo można rozbudować ten pomysł (jak i wyciągać rozbite dane, a nie zbitą treść oferty). Ale w efekcie można wyświetlić ogłoszenie u siebie (choć aplikowanie zazwyczaj wymaga przejścia na źródłowy serwis):
jobmaster.png
Normalny serwis z dobrą marką zarabia na publikacji ogłoszeń, a tego typu serwis mógłby zarabiać np. poprzez dodatkowe usługi sprzedawane indeksowanym serwisom (np. własny szablon, wyróżnianie ofert), jak i też standardowo na reklamach kontekstowych. Ważne żeby indeks był kompletny i łatwo dostępny. Czy jest miejsce dla dobrze napisanego serwisu tego typu? Myślę że tak... jakieś komentarze? :)

]]>
2009-07-02 23:08:18.015765
http://www.python.rk.edu.pl/w/p/qyolk-menedzer-pakietow-pythona-v-01/ http://www.python.rk.edu.pl/w/p/qyolk-menedzer-pakietow-pythona-v-01/ <![CDATA[QYolk - menedżer pakietów Pythona v 0.2]]> QYolk. Wersja 0.2 posiada:
  • Listowanie pakietów Pythona, filtrowanie aktywny/nieaktywny
  • Wyświetlanie informacji o danym pakiecie
  • Sprawdzanie i aktualizowanie danego pakietu
  • Sprawdzanie aktualizacji dla wszystkich pakietów z obecnej listy
  • Wielojęzyczny interfejs (Polski, Angielski obecnie)
qyolk_new1.png
qyolk_new2.png
Do uruchomienia ("python run.py") QYolk potrzeba PyQt4, setuptools, yolk i opcjonalnie docutils. ]]>
2009-06-15 16:20:00.626162
http://www.python.rk.edu.pl/w/p/riklaunim-szuka-pracy/ http://www.python.rk.edu.pl/w/p/riklaunim-szuka-pracy/ <![CDATA[Riklaunim szuka pracy ;)]]> riklaunim@gmail.com. Poniżej fragment CV:
Umiejętności programistyczne:
  • Bardzo dobra znajomość Pythona, frameworka Django oraz biblioteki PyQt4
  • Bardzo dobra znajomość systemów Linuksowych (głównie Gentoo i Archlinux)
  • Dobra znajomość PHP i frameworka CodeIgniter
  • Dobra znajomość XHTML, CSS, podstawy jQuery i JavaScript
  • Dobra znajomość relacyjnych baz danych (SQLite, MySQL i PostgreSQL)
  • Znajomość podstaw systemów wbudowanych (Android, Maemo, iPhone OS)
  • Znajomość zasad tworzenia przyjaznych wyszukiwarkom stron www (SEO)
  • Znajomość systemów MS Windows XP, Mac OS X 10.5 Leopard oraz pakietów biurowych i innych aplikacji codziennego użytku.
Doświadczenia zawodowe:
  • 2009: Książka „Django. Ćwiczenia Praktyczne” dla wydawnictwa Helion
  • 2008.01 – 2009.07: Programista Python/Django w Goldenline.pl
  • 2007: Współpraca z redakcją „phpSolutions”
  • 2006: Współpraca z firmą TiGroup
  • 2005: Współpraca z redakcją „Magazyn Internet”
  • 2005: Współpraca z redakcją „Komputer Świat Ekspert”
Własne projekty:
  • Biblioteka Riklaunima: zbiór serwisów poświęconych programowaniu, systemom operacyjnym, czy też grom cRPG. Zawierają one materiały stworzone przeze mnie, często niepowtarzalne na polskim rynku. Serwisy oparte są na autorskiej aplikacji napisanej w Django.
  • Diamanda: zbiór aplikacji Django na otwartej licencji GPL, na których oparta jest Biblioteka Riklaunima
  • Zbrojownia Albionu: aplikacja desktopowa przeznaczona dla graczy Areny Albionu. Program pozwala przymierzyć różne zestawy uzbrojenia wyliczając zarazem parametry rycerza (atak, obronę itd.). Aplikacja napisana w PyQt4 i działa pod MS Windows, OS X, jak i Linux/Unix.
  • PyQt ExtraWidgets: zbiór dodatkowych widżetów do PyQt4 stworzony za pomocą SIP, na bazie widżetów napisanych w C++ dla Qt.
  • PyDingo: aplikacja desktopowa w fazie rozwoju będąca w założeniu menedżerem plików złożonym z wielu dokowalnych okien. Program tworzony jest z wykorzystaniem PyQt4 i innych bibliotek Pythona.
  • jl-punBB: wtyczka dla Wordpressa integrująca z tym skryptem system użytkowników forum punBB/fluxBB.
  • punFramework: prosty framework stosujący wzorzec MVC służący do tworzenia dodatkowych komponentów wbudowanych w forum punBB/fluxBB
  • QYolk: aplikacja PyQt4 będąca nakładką na setuptools i yolk – narzędzia do zarządzania pakietami (EGG) Pythona zainstalowanymi z cheeseshop.
]]>
2009-06-10 16:12:21.985366
http://www.python.rk.edu.pl/w/p/gra-przez-przegladarke-w-django/ http://www.python.rk.edu.pl/w/p/gra-przez-przegladarke-w-django/ <![CDATA[Gra przez przeglądarkę w Django]]> Wyspa Mrozu - stworzenia gry RPG przez przeglądarkę z ciekawym systemem postaci/walk (wstępna wersja dostępna do testów), oraz równie ciekawym i funkcjonalnym interfejsem do "zwiedzania" świata :) Obecnie można się pobawić systemem walk. Kod aplikacji udostępniony zostanie zapewne z czasem jak się wszystko ustabilizuje.]]> 2009-04-27 10:41:39.271000 http://www.python.rk.edu.pl/w/p/aktualizacja-pydingo-i-diamandy/ http://www.python.rk.edu.pl/w/p/aktualizacja-pydingo-i-diamandy/ <![CDATA[Aktualizacja PyDingo i Diamandy]]> Wypuściłem drobną aktualizację Diamandy - zestawu aplikacji Django używanych w Bibliotekach. Paczka zawiera nagromadzone drobne poprawki z SVN.

Udostępniłem także paczkę PyDingo 0.39 zawierającą zrzut kodu z SVN, zawierający sporo usprawnień w porównaniu do wersji 0.3, lecz jeszcze bez planowanych funkcjonalności dla wydania 0.4.

]]>
2009-04-05 20:14:41.877119
http://www.python.rk.edu.pl/w/p/dingo-ide-costam/ http://www.python.rk.edu.pl/w/p/dingo-ide-costam/ <![CDATA[Dingo :) IDE-Cośtam?]]> ]]> 2008-11-16 16:46:59.392590 http://www.python.rk.edu.pl/w/p/duza-aktualizacja/ http://www.python.rk.edu.pl/w/p/duza-aktualizacja/ <![CDATA[Duża aktualizacja]]> Aktualizacja Bibliotek do "bieżącej" wersji Diamandy dającej nowy nieco wygląd, lepsze forum i kilka innych zmian, a także aktualizacja działu Django o zmiany sprzed newforms-admin. Za parę dni pewnie dodam oddzielny tutorial i wprowadzenie do Django w wersji z newforms-admin/1.0 (intro + piszemy bloga).

Z bogatych planów piśmienniczych czeka AppEngine, Django extras jak transdb czy satchmo plus poszerzenie dokumentacji (auth), web.py, nginx z SCGI, WebAlchemy / StaticGenerator, C/C++/BOOST z Pythonem itd. ;)

]]>
2008-07-21 23:09:42.308387