Super film ukazujący pokazujący propagandę Microsoftu i alternatywę... ;)
"Hope you're not doing Java and open source...", "They actually enable us to send XML-messages through SOAP! Through SOAP!"
LOL.
A Ty zadajesz sobie to fundamentalne pytanie: "Why do we always use .NET?"
podsumowując .NOT :)
piątek, 25 czerwca 2010
poniedziałek, 21 czerwca 2010
Mocha UI i aplikacja do Geolokalizacji IP
Zainspirowany biblioteką mocha UI napisałem małą aplikacyjkę do geolokalizacji IP z wykorzystaniem google map API.
Zapraszam do oglądania i czekam na komentarze
Zapraszam do oglądania i czekam na komentarze
IP Geolocation Application
Do tej pory nie doceniałem MooTool...piątek, 7 maja 2010
Ajax w Django. Dajax Project w akcji
Natchnęło mnie kiedyś (już nawet dość dawno) żeby przetestować bibliotekę Dajax do Ajaxa w Django.
Napisałem prostą aplikacyjkę w stylu guestbook.
Potrzebowałem oczywiście dajaxa, którego można sciągnąć ze strony: http://www.dajaxproject.com/
Dajax współpracuje z kilkoma frameworkami JavaScriptowymi, mianowice: jQuery, Prototype, MooTool i Dojo.
No to do dzieła: w settings.py dodajemy wpisy:
send_form - do dodawania nowego wpisu do mojego guestbook'a i pagination do stronicowania wpisów ... ale o nich później.
Teraz ważny trick w urls.py musimy w dodać wpis:
To tyle w konfiguracji samego środowiska django. Teraz możemy przejść do tworzenia samej aplikacji, nazwijmy ją guestbook.
plik models.py, chyba niczym tu nie zaskocze - jedna klasa:
Nie muszę chyba opisywać co zawiera wpis w księdze gości ;)
W zasadzie będziemy mieli tylko jedną stronę, wszystkie requesty będą kierowane przez ajaxa.
Zawartość pliku views.py:
Widok start to jedyna strona startowa z formularzem i listą wpisów.
I czas opisać opisać zarejestrowane funkcje (ajax.py):
Zauważcie, że nie musimy bawić się z serializację np. JSONem, wszystko zrobią za nas metody zawarte w dajax.utils odpowiedzialne na przykład za de-serializację formularzy.
Jak to wygląda w akcji?
To tyle, miłej zabawy ajaxem.
Napisałem prostą aplikacyjkę w stylu guestbook.
Potrzebowałem oczywiście dajaxa, którego można sciągnąć ze strony: http://www.dajaxproject.com/
Dajax współpracuje z kilkoma frameworkami JavaScriptowymi, mianowice: jQuery, Prototype, MooTool i Dojo.
No to do dzieła: w settings.py dodajemy wpisy:
DAJAX_JS_FRAMEWORK = "prototype"
DAJAX_MEDIA_PREFIX = "dajax" # http://domain.com/dajax/
DAJAX_CACHE_CONTROL = 10 * 24 * 60 * 60
DAJAX_FUNCTIONS = (
#Ajax funtions registered to examples.ajax
'guestbookapp.ajax.pagination',
'guestbookapp.ajax.send_form',
)
ENTRIES_ON_PAGE = 2
Będę korzystał z prototype, dodatkowo zarejestrowałem dwie funkcje:send_form - do dodawania nowego wpisu do mojego guestbook'a i pagination do stronicowania wpisów ... ale o nich później.
Teraz ważny trick w urls.py musimy w dodać wpis:
urlpatterns += patterns('',
...
# dajax handler
(r'^%s/' % settings.DAJAX_MEDIA_PREFIX, include('dajax.urls')),
...
To tyle w konfiguracji samego środowiska django. Teraz możemy przejść do tworzenia samej aplikacji, nazwijmy ją guestbook.
plik models.py, chyba niczym tu nie zaskocze - jedna klasa:
from django.db import models
class Entry(models.Model):
author = models.CharField(u'author', max_length=50)
email = models.EmailField(blank=True, max_length=50)
content = models.TextField(u'greeting')
pub_date = models.DateTimeField(u'added at', db_index=True, auto_now_add=True)
class Meta:
verbose_name = 'Entry'
verbose_name_plural = 'Entries'
ordering = ('-pub_date',)
def __unicode__(self):
return self.author
Nie muszę chyba opisywać co zawiera wpis w księdze gości ;)
W zasadzie będziemy mieli tylko jedną stronę, wszystkie requesty będą kierowane przez ajaxa.
Zawartość pliku views.py:
from guestbook.utils import render_response
from django.conf import settings
from django.views.generic import list_detail
from models import Entry
from forms import EntryForm
def get_pagination_page(page=1):
from django.core.paginator import Paginator, InvalidPage, EmptyPage
from django.template.loader import render_to_string
paginator = Paginator(Entry.objects.all(), 2)
try:
page = int(page)
except ValueError:
page = 1
try:
items = paginator.page(page)
except (EmptyPage, InvalidPage):
items = paginator.page(paginator.num_pages)
return items
def start(request):
items = get_pagination_page(1)
context = {
"form" : EntryForm(),
"items" : items,
}
return render_response(request,'guestbookapp/entry_list.html', context)
Widok start to jedyna strona startowa z formularzem i listą wpisów.
I czas opisać opisać zarejestrowane funkcje (ajax.py):
from django.conf import settings
from dajax.core import Dajax
from models import Entry
def pagination(request):
from guestbook.guestbookapp.views import get_pagination_page
from django.template.loader import render_to_string
from django.core.paginator import Paginator, InvalidPage, EmptyPage
try:
page = int( request.POST['p'] )
except:
page = 1
paginator = Paginator(Entry.objects.all(), settings.ENTRIES_ON_PAGE)
try:
items = paginator.page(page)
except (EmptyPage, InvalidPage):
items = paginator.page(paginator.num_pages)
render = render_to_string('guestbookapp/pagination_page.html', { 'items': items })
dajax = Dajax()
dajax.assign('#pagination','innerHTML',render)
return dajax Paginacja, w zmiennej settings.ENTRIES_ON_PAGE przechowuje liczbę wpisów na stronie
def send_form(request):
from dajax.utils import deserialize_form
from forms import EntryForm
dajax = Dajax()
form_data = deserialize_form( request.POST.get('form') )
form = EntryForm(form_data)
print form
if form.is_valid():
from django.core.paginator import Paginator, InvalidPage, EmptyPage
from django.template.loader import render_to_string
form.save()
dajax.removeCSSClass('#add_entry_form input','error')
form.save()
#dajax.alert("This form is_valid(), your mail is: %s" % form.cleaned_data.get('email'))
paginator = Paginator(Entry.objects.all(), settings.ENTRIES_ON_PAGE)
try:
items = paginator.page(1)
except (EmptyPage, InvalidPage):
items = paginator.page(paginator.num_pages)
render = render_to_string('guestbookapp/pagination_page.html', { 'items': items })
dajax = Dajax()
dajax.assign('#pagination','innerHTML',render)
dajax.assign('#add_form', 'innerHTML', '')
else:
dajax.removeCSSClass('#add_entry_form input','error')
for error in form.errors:
dajax.addCSSClass('#id_%s' % error,'error')
return dajax
Wysyłanie formularza ajaxem, w rosponse'ie otrzymujemy informacje o błędach, które są potem podmieniane w widoku.Zauważcie, że nie musimy bawić się z serializację np. JSONem, wszystko zrobią za nas metody zawarte w dajax.utils odpowiedzialne na przykład za de-serializację formularzy.
Jak to wygląda w akcji?
To tyle, miłej zabawy ajaxem.
sobota, 10 kwietnia 2010
Dlaczego Python? ...po raz drugi
Postaram się przedstawić listę argumentów na korzyść języka Python.
1) Dobre nawyki programistyczne.
Spośród kilku języków (programowania) które znam i z których korzystam na co dzień, właściwie żaden (z wyjątkiem Pythona) nie narzuca dobrego stylu programowania.
Pewnego razu zaglądnąłem do katalogu z programami, które pisałem gdy uczyłem się programować w C
Gdybym uczył się programować zaczynając od Pythona, pewnie nie zobaczyłbym teraz takiego bajzlu
(pomijając oczywiście wartość merytoryczną tego kodu ;)
Z drugiej jednak strony programując tylko Pythonie, z pominieciem C nie zrozumiesz jak działają wskaźniki,
ręczna alokacja pamięci (malloc, realloc, calloc, itp.) oraz jej zwalnienie. Najpradopodobniej nigdy
nie spotkasz się też z pojęciem wycieku pamięci, buffer overflow czy nie napotkasz na segmentation fault.
2) Zajebiście czytelny kod.
Zazwyczaj gdy patrze na jakiś fragment kodu napisany w języku Python zazwyczaj wiem co on "robi",
gdy zobaczę na odpowiadający mu fragment w innym języku (np. w Javie) musi upłynąć chwilka czasu zanim skumam co autor "miał na myśli" nawet gdy kod jest poprawnie skomentowany. Ponadto prawie zawsze kod w Pythonie będzie zdecydowanie krótszy (no może z wyjątkiem Rubyego, ale ten ma za to kosmiczną składnie ;)
3) Wydajność
"Python is fast enough for our site and allows us to produce
maintainable features in record times, with a minimum of developers,"
powiedział Cuong Do, Software Architect z YouTube.com.
"Python has been an important part of Google since the beginning,
and remains so as the system grows and evolves. Today dozens of Google
engineers use Python, and we're looking for more people with skills in
this language." powiedział Peter Norvig, director of search quality w Google, Inc.
"Python makes us extremely productive, and makes
maintaining a large and rapidly evolving codebase relatively
simple," powiedział Mark Shuttleworth z Thawte Consulting.
Jakieś pytania?
4) Testowanie
Testy jednostkowe są częścią języka od wersji 2.1 wzwyż.
A ich pisanie jest prawdziwą przyjemnością ;), nie to co w Javie...
5) "Importowanie z przyszłości" :)
"Instrukcja future jest dyrektywą
kompilatora, nakazującą skompilowanie danego modułu z użyciem składni
lub semantyki, która będzie dostępna w określonej przyszłej wersji Pythona"
Fajne, nie ?:) from __future__ import *
6) Przenośność
Kod pythona możesz uruchomić przez interpretator tego języka pod daną platformę lub system,
a w praktyce na Windowsie, Linuxie, Mac'u ...
Swoją drogą zmuszenie kogoś do pisania w C# jest ograniczaniem jego wolności.
A korzystanie z Mono jest jak murowanie nocnika do podłogi ;).
7) Sam wybierasz paradygmat.
Możesz pisać strukturalnie, obiektowo, a nawet funkcyjnie, nie to co w Javie...
żeby wypisać "hello world" na ekran musisz utworzyć obiekt.
no i na koniec:
8) Paradoks Pythona wg. Paula Grahama
"[...]Dlatego właśnie, z braku lepszego terminu, nazwę to Paradoksem Pythona: jeśli przedsiębiorstwo decyduje się na napisanie swojego oprogramowania we względnie ezoterycznym języku, będzie mogło zatrudnić lepszych programistów, ponieważ przyciągnie do siebie wyłącznie tych, którzy byli wystarczająco dobrzy, by się tego języka nauczyć. Określenie tej sprzeczności z punktu widzenia programisty jest nawet lepsze: język programowania, którego najlepiej się nauczyć by znaleźć dobrą pracę to język programowania, którego ludzie zwykle nie uczą się po to, by znaleźć pracę." [1]
Jak na razie tyle, jak mi się jeszcze coś przypomni to dopisze.
[1] polskie tłumaczenie eseju Paula Grahama http://www.pdembinski.konin.lm.pl/python_paradox.html
oryginał: http://www.paulgraham.com/pypar.html
1) Dobre nawyki programistyczne.
Spośród kilku języków (programowania) które znam i z których korzystam na co dzień, właściwie żaden (z wyjątkiem Pythona) nie narzuca dobrego stylu programowania.
Pewnego razu zaglądnąłem do katalogu z programami, które pisałem gdy uczyłem się programować w C
void menu()
{
char Sciezka[300]; //sciezka pliku
char wybor;
int koniec/*konic malej petli*/,Koniec=0;/*koniec duzej petli*/
int i=0;//pomocniczy licznik
while(!Koniec)
{
koniec=0;
printf("Twoj wybor: ");
scanf("%s",wybor);
}
}
int main(int argc, char* argv[])
{
if(argc != 2){
printf("**Brak parametrów**\n");
} else {
menu();
return 0; }
}Pomyślałem sobie: "Jaka masakra". Wyobrażacie sobie znaleźć błąd w takim kodzie?Gdybym uczył się programować zaczynając od Pythona, pewnie nie zobaczyłbym teraz takiego bajzlu
(pomijając oczywiście wartość merytoryczną tego kodu ;)
Z drugiej jednak strony programując tylko Pythonie, z pominieciem C nie zrozumiesz jak działają wskaźniki,
ręczna alokacja pamięci (malloc, realloc, calloc, itp.) oraz jej zwalnienie. Najpradopodobniej nigdy
nie spotkasz się też z pojęciem wycieku pamięci, buffer overflow czy nie napotkasz na segmentation fault.
2) Zajebiście czytelny kod.
Zazwyczaj gdy patrze na jakiś fragment kodu napisany w języku Python zazwyczaj wiem co on "robi",
gdy zobaczę na odpowiadający mu fragment w innym języku (np. w Javie) musi upłynąć chwilka czasu zanim skumam co autor "miał na myśli" nawet gdy kod jest poprawnie skomentowany. Ponadto prawie zawsze kod w Pythonie będzie zdecydowanie krótszy (no może z wyjątkiem Rubyego, ale ten ma za to kosmiczną składnie ;)
3) Wydajność
"Python is fast enough for our site and allows us to produce
maintainable features in record times, with a minimum of developers,"
powiedział Cuong Do, Software Architect z YouTube.com.
"Python has been an important part of Google since the beginning,
and remains so as the system grows and evolves. Today dozens of Google
engineers use Python, and we're looking for more people with skills in
this language." powiedział Peter Norvig, director of search quality w Google, Inc.
"Python makes us extremely productive, and makes
maintaining a large and rapidly evolving codebase relatively
simple," powiedział Mark Shuttleworth z Thawte Consulting.
Jakieś pytania?
4) Testowanie
Testy jednostkowe są częścią języka od wersji 2.1 wzwyż.
A ich pisanie jest prawdziwą przyjemnością ;), nie to co w Javie...
5) "Importowanie z przyszłości" :)
"Instrukcja future jest dyrektywą
kompilatora, nakazującą skompilowanie danego modułu z użyciem składni
lub semantyki, która będzie dostępna w określonej przyszłej wersji Pythona"
Fajne, nie ?:) from __future__ import *
6) Przenośność
Kod pythona możesz uruchomić przez interpretator tego języka pod daną platformę lub system,
a w praktyce na Windowsie, Linuxie, Mac'u ...
Swoją drogą zmuszenie kogoś do pisania w C# jest ograniczaniem jego wolności.
A korzystanie z Mono jest jak murowanie nocnika do podłogi ;).
7) Sam wybierasz paradygmat.
Możesz pisać strukturalnie, obiektowo, a nawet funkcyjnie, nie to co w Javie...
żeby wypisać "hello world" na ekran musisz utworzyć obiekt.
no i na koniec:
8) Paradoks Pythona wg. Paula Grahama
"[...]Dlatego właśnie, z braku lepszego terminu, nazwę to Paradoksem Pythona: jeśli przedsiębiorstwo decyduje się na napisanie swojego oprogramowania we względnie ezoterycznym języku, będzie mogło zatrudnić lepszych programistów, ponieważ przyciągnie do siebie wyłącznie tych, którzy byli wystarczająco dobrzy, by się tego języka nauczyć. Określenie tej sprzeczności z punktu widzenia programisty jest nawet lepsze: język programowania, którego najlepiej się nauczyć by znaleźć dobrą pracę to język programowania, którego ludzie zwykle nie uczą się po to, by znaleźć pracę." [1]
Jak na razie tyle, jak mi się jeszcze coś przypomni to dopisze.
[1] polskie tłumaczenie eseju Paula Grahama http://www.pdembinski.konin.lm.pl/python_paradox.html
oryginał: http://www.paulgraham.com/pypar.html
sobota, 13 lutego 2010
Python IDE który wspiera Django :)
Niedawno natknąłem się na bardzo ciekawe IDE dla Pythona, wsparcie dla Django to jedna z jego zalet.
Możliwości: http://code.google.com/p/pyscripter/wiki/Features
piątek, 25 grudnia 2009
Wesołych Świąt
Z okazji świąt przygotowałem ciekawy skrypcik:
PS. potrafisz uzyskać podobny efekt w innym języku programowania?
Podejmij wyzwanie :)
*
ooo
%oo%*
%%*oo*%
**ooo%oo*
**%%%*o%%o%
%
*%o
%*%%%
**oo*o%
%%*o*o*%*
**%%*o**o%%
**o*o%o*%**%*
%%*o%%*%***%***
%%oo**%**oo%ooo*%
*%*%*%*%*oo%*%**%**
%ooooo*%%*o*oo*%*%*%%
*%oo**o*oo%oo%**ooo%%%%
*
***
o%o*o
%*%oo%*
o%*o*%**%
%***%oo%o*%
*o%o%%%%%%*%*
**%*o%%**o*%***
%*ooo%o%%o*%%**%%
*%%o%o***o%*%%%**o*
*****oo*oo*%%%**%%%o%
%***o%%**%%%o*oooo%***%
%o**o*o%***%%%o%o**%oooo*
o%o*o**oo*o%o**o%%%%%o%%**o
o*o%o%*%oo%*oo%%o*ooooo%**oo*
o*oo*o%%o*ooo%****oo*o%%o%o%*%%
*oo*ooo%o**o%**oo*o%%%o%o%oo%o*oo
o**%ooo%o*o*o*%%o%*%%o%o%%o*oo%****
Wesołych Świąt
#!/usr/local/bin/python
# -*- coding: utf-8 -*-
import random
def ChristmasTree(levels, n, decoration=["*"]):
"""
level - liczba poziomów drzewka
n - wysokość pierwszego poziomu
decoration - lista ozdób drzewka
"""
for j in range(1,levels+1):
for i in range(j*n):
line = ""
for k in range(2*i+1):
line += random.choice(decoration)
print line.center(2*levels*n)
print ""
print u'Wesołych Świąt'.center(2*levels*n)
ChristmasTree(3, 6, ["*","%","o"])
PS. potrafisz uzyskać podobny efekt w innym języku programowania?
Podejmij wyzwanie :)
środa, 7 października 2009
Wi-Fi router ze starego laptopa
Jestem w posiadaniu starego laptopa Fujitsu Siemens Amilo M7400, który nie ma (już) dysku twardego. Postanowiłem go wykorzystać do stworzenia wi-fi routerka (nie musze kupować access pointa i wykorzystam pozornie bezużytecznego lapka).
System nie może startować z dysku twardego, jedyne możliwości to PXE boot(odpada), live CD(nie będe miał prawa zapisu na nośnik), live USB(!).
Niestety na tym sprzęcie (256Mb RAMu) nie odpale Ubuntu 9.10, nawet Xubuntu też nie wydala.
Znalazłem jednak Lubuntu (dystrybucja ubuntu z lxde, http://download.lxde.org/lubuntu-9.10/) - wypaliłem na USB(UNetbootin, pisałem o tym w którymś z poprzednich postów) i śmiga:)
Teraz tylko skonfigurować interface'y sieciowe, włączyć routing w kernelu(echo 1 > /proc/sys/net/ipv4/ip_forward) i napisać firewall'a.
Jeszcze ważna uwaga: żeby zadziałała karta sieciowa ipw2200 należy odpalić moduł fsam7400
$sudo modprobe fsam7400 radio=1
Gdyby ktoś potrzebował szyfrowania WPA, to musi sobie skompilać firmware ze źródeł(http://ipw2200.sourceforge.net/ + instrukcja: http://ubuntuforums.org/showthread.php?t=26623), mi WEP całkowice wystarcza(iwconfig $LAN essid [nazwa_sieci] key [s:tekstowy_klucz] channel [nr_kanału] power on).
System nie może startować z dysku twardego, jedyne możliwości to PXE boot(odpada), live CD(nie będe miał prawa zapisu na nośnik), live USB(!).
Niestety na tym sprzęcie (256Mb RAMu) nie odpale Ubuntu 9.10, nawet Xubuntu też nie wydala.
Znalazłem jednak Lubuntu (dystrybucja ubuntu z lxde, http://download.lxde.org/lubuntu-9.10/) - wypaliłem na USB(UNetbootin, pisałem o tym w którymś z poprzednich postów) i śmiga:)
Teraz tylko skonfigurować interface'y sieciowe, włączyć routing w kernelu(echo 1 > /proc/sys/net/ipv4/ip_forward) i napisać firewall'a.
Jeszcze ważna uwaga: żeby zadziałała karta sieciowa ipw2200 należy odpalić moduł fsam7400
$sudo modprobe fsam7400 radio=1
Gdyby ktoś potrzebował szyfrowania WPA, to musi sobie skompilać firmware ze źródeł(http://ipw2200.sourceforge.net/ + instrukcja: http://ubuntuforums.org/showthread.php?t=26623), mi WEP całkowice wystarcza(iwconfig $LAN essid [nazwa_sieci] key [s:tekstowy_klucz] channel [nr_kanału] power on).
piątek, 10 lipca 2009
Potrzebujesz małe forum ?
...dodatkowo z darmowym hostingiem...bez reklam...w domenie appspot.com
Właśnie napisałem malutkie forum w GAE bazujące na stylu phpBB.
jak to wygląda? tutaj jest przykład: small-forum
Stąd można pobrać najnowszą wersje: small forum na google code
Jak zainstalować?
znaleść w pliku main.py linijkę:
w pliku app.yaml:
Właśnie napisałem malutkie forum w GAE bazujące na stylu phpBB.
jak to wygląda? tutaj jest przykład: small-forum
Stąd można pobrać najnowszą wersje: small forum na google code
Jak zainstalować?
znaleść w pliku main.py linijkę:
class AclUser:
__admin__ = 'Twój google login' #(login administratora)
w pliku app.yaml:
application: small-forum #zmienić na własną nazwę aplikacjii wgrać forum:
$python appcfg.py update forum
środa, 10 czerwca 2009
piątek, 5 czerwca 2009
czwartek, 14 maja 2009
log1 CMS Beta Release
Kolejny CMS, tylko po co?
Pomysł napisania własnego systemu zarządzania treścią zrodził się już dawno. Głównym motywem była moja strona domowa składał się z kilku chaotycznych skryptów. System został napisany właściwie od zera. A jego najważniejsza cecha to prostota i wygoda użytkowania.
Najważniejsze jest w tym wszystkim to, ze nie wymaga bazy danych, tak więc aby przenieść stronę na inny serwer wystarczy, że przeniosę sobie katalog db/
Mówi się, że najlepsze programy to takie, które nie wymagają instrukcji. Według mnie to zależy do kogo dedykowany jest produkt, chociaż przyznam się, że rzadko sięgam do jakiekolwiek instrukcji :) Wydaje mi się, że to co napisałem nie wymaga instrukcji...
Najważniejsze cechy tego CMS's:
- łatwa instalacja, a właściwie jej brak:) wystarczy skopiować pliki z archiwum do katalogu serwera WWW z modułem do wykonywania skryptów PHP5. I zmienić prawa dostępu do 1 katalogi i 2 plików. Nie wymaga bazy danych:)
- łatwa obsługa. wszystko bazuje na 3 krokach.
1. pierwszy to podstawowe ustawienia takie jak: tytuł, opisy, słowa kluczowe itp.
2. drugi to tworzenie menu i tu fajne narzędzie: przesuwanie elementów menu

3. trzeci to uzupełnianie zawartości.
log1 CMS pozwala ( na razie) tylko na tworzenie jednopoziomowego menu.
Posiada również kanał RSS2, oraz własny silnik wyszukiwarki, interface dostępny w wersji polskiej i angielskiej.
Jednym słowem jest to ukierunkowany na prostotę system zarządzania treścią, do budowania stron opartych o jednopoziomowe menu.
Kilka słów o silniku:)
Program ten, jak wspomniałem nie wymaga bazy danych, wszystkie ustawienia zapisuje do plików XML a potem cache'uje w plikach tektowych.
bardziej obrazowo:
XML ---(0dczyt danych)---> modyfikacja --->( zapis)---> XML ----> .inc/.txt/.php
Jeszcze na koniec uwaga, log1 CMS nie posiada zbyt wielu opcji, został stworzony z myślą o małych stronach. Dlatego jeśli potrzebujesz czegoś o możliwościach Drupal'a czy Joomla'i nawet go nie pobieraj, bo się nie nada.
Oficialna strona:
log1 CMS oficjalna strona
pobierz
Jak na razie dostępne są 2 template'y
Oczywiście można łatwo tworzyć swoje.
Miłego użytkowania.
Pomysł napisania własnego systemu zarządzania treścią zrodził się już dawno. Głównym motywem była moja strona domowa składał się z kilku chaotycznych skryptów. System został napisany właściwie od zera. A jego najważniejsza cecha to prostota i wygoda użytkowania.
Najważniejsze jest w tym wszystkim to, ze nie wymaga bazy danych, tak więc aby przenieść stronę na inny serwer wystarczy, że przeniosę sobie katalog db/
Mówi się, że najlepsze programy to takie, które nie wymagają instrukcji. Według mnie to zależy do kogo dedykowany jest produkt, chociaż przyznam się, że rzadko sięgam do jakiekolwiek instrukcji :) Wydaje mi się, że to co napisałem nie wymaga instrukcji...
Najważniejsze cechy tego CMS's:
- łatwa instalacja, a właściwie jej brak:) wystarczy skopiować pliki z archiwum do katalogu serwera WWW z modułem do wykonywania skryptów PHP5. I zmienić prawa dostępu do 1 katalogi i 2 plików. Nie wymaga bazy danych:)
- łatwa obsługa. wszystko bazuje na 3 krokach.
1. pierwszy to podstawowe ustawienia takie jak: tytuł, opisy, słowa kluczowe itp.
2. drugi to tworzenie menu i tu fajne narzędzie: przesuwanie elementów menu
3. trzeci to uzupełnianie zawartości.
log1 CMS pozwala ( na razie) tylko na tworzenie jednopoziomowego menu.
Posiada również kanał RSS2, oraz własny silnik wyszukiwarki, interface dostępny w wersji polskiej i angielskiej.
Jednym słowem jest to ukierunkowany na prostotę system zarządzania treścią, do budowania stron opartych o jednopoziomowe menu.
Kilka słów o silniku:)
Program ten, jak wspomniałem nie wymaga bazy danych, wszystkie ustawienia zapisuje do plików XML a potem cache'uje w plikach tektowych.
bardziej obrazowo:
XML ---(0dczyt danych)---> modyfikacja --->( zapis)---> XML ----> .inc/.txt/.php
Jeszcze na koniec uwaga, log1 CMS nie posiada zbyt wielu opcji, został stworzony z myślą o małych stronach. Dlatego jeśli potrzebujesz czegoś o możliwościach Drupal'a czy Joomla'i nawet go nie pobieraj, bo się nie nada.
Oficialna strona:
log1 CMS oficjalna strona
pobierz
Jak na razie dostępne są 2 template'y
Oczywiście można łatwo tworzyć swoje.
Miłego użytkowania.
piątek, 24 kwietnia 2009
Google App Engine :: Klasa User
Google App Engine sprytnie rozwiązuje kwestie użytkowników, także przy tworzeniu aplikacji możemy łatwo wykorzystać klasę user z google api ( from google.appengine.api import users). Wystarczy, że użytkownik posiada konto w google, a my w łatwy sposób możemy 'wyciągnąć': nickname, user_id oraz jego adres mailowy.
Służą do tego metody - odpowiednio:
Co więcej dla naszego użytkownika przewidziany jest odpowiedni typ w bazie danych
- db.UserProperty()
A teraz zakładamy scenariusz: jak użytkownik nie jest zalogowany to przekierowywujemy go na stronę logowania, a jak jest zalogowany to wyświetlamy jego nickname oraz dajemy możliwość wylogowania się.
jeszcze możemy sprawdzić czy użytkownik ma uprawnienia administratora:
is_current_user_admin() - zwraca True jeśli tak.
Źródło (więcej na): http://code.google.com/appengine/docs/python/gettingstarted/
Służą do tego metody - odpowiednio:
Co więcej dla naszego użytkownika przewidziany jest odpowiedni typ w bazie danych
- db.UserProperty()
A teraz zakładamy scenariusz: jak użytkownik nie jest zalogowany to przekierowywujemy go na stronę logowania, a jak jest zalogowany to wyświetlamy jego nickname oraz dajemy możliwość wylogowania się.
user = users.get_current_user()
if user:
self.response.out.write(user.nickname() + """ |
<a href="users.create_logout_url(self.request.uri)" >
Sign out</a>""")
else:
self.redirect(users.create_login_url(self.request.uri))
jeszcze możemy sprawdzić czy użytkownik ma uprawnienia administratora:
is_current_user_admin() - zwraca True jeśli tak.
Źródło (więcej na): http://code.google.com/appengine/docs/python/gettingstarted/
czwartek, 23 kwietnia 2009
Google App Engine - test możliwości
Google App Engine to świetne narzędzie do tworzenie dynamicznych stron oraz aplikacji webowych.
Ale to nie wszystko, bo to również darmowy hosting tych aplikacji + baza danych i wiele innych pożytecznych funkcji włącznie z panelem administracyjnym.
Co o bazie danych i języku Gql?
Niby obiektowe, ale z możliwością zadawania zapytań w języku gql - googlowa wersja sql'a :)
Co więcej zapytanie do bazy zwraca kolekcję obiektów.
Wpis w bazie jest obiektem stworzonej przez nas klasy, po kontakcie z ZODB czy Gadfly nie powinno to już nikogo dziwić.
Prosty przykład:
A jak się pisze kontroler i widok:
też fajnie, jest nawet system template'ów, co do google.appengine.api i cgi jest, jak narazie, troche słabo udokumentowane - trzeba się dużo naszukać, żeby znaleść informacje jak na przykład zapisać ciastka. Chociaż można się tego domyśleć :)
Dla zabawy napisałem prostą aplikacyjke do operacji na obrazach: zmiana wielkości( resize), obracanie o kąt( wielokrotność 90 stopni), odbicie symetryczne i poprawa kontrastu - a wszystko w oparciu o google.appengine.api - klasa images.
Można testować tutaj: My Images
aha, aplikacja jest po angielsku, ale łatwo się pokumać jakie funkcje do czego służą.
No i to by było na tyle...
Podsumowując - google app engine wywiera pozytywne wrażenia :)
Ale to nie wszystko, bo to również darmowy hosting tych aplikacji + baza danych i wiele innych pożytecznych funkcji włącznie z panelem administracyjnym.
Co o bazie danych i języku Gql?
Niby obiektowe, ale z możliwością zadawania zapytań w języku gql - googlowa wersja sql'a :)
Co więcej zapytanie do bazy zwraca kolekcję obiektów.
Wpis w bazie jest obiektem stworzonej przez nas klasy, po kontakcie z ZODB czy Gadfly nie powinno to już nikogo dziwić.
Prosty przykład:
class BazaObiektow(db.Model):
author = db.UserProperty()
title = db.StringProperty()
body = db.TextProperty()
obiekty = db.GqlQuery("SELECT * FROM BazaObiektow")
# oczywiście można dodać jeszcze WHERE :)
# GqlQuery Class
for obiekt in obiekty:
#iterujemy po obiektach
self.response.out.write(str(obiekt.author) + '...wypisujemy co chcemy')
A jak się pisze kontroler i widok:
też fajnie, jest nawet system template'ów, co do google.appengine.api i cgi jest, jak narazie, troche słabo udokumentowane - trzeba się dużo naszukać, żeby znaleść informacje jak na przykład zapisać ciastka. Chociaż można się tego domyśleć :)
Dla zabawy napisałem prostą aplikacyjke do operacji na obrazach: zmiana wielkości( resize), obracanie o kąt( wielokrotność 90 stopni), odbicie symetryczne i poprawa kontrastu - a wszystko w oparciu o google.appengine.api - klasa images.
Można testować tutaj: My Images
aha, aplikacja jest po angielsku, ale łatwo się pokumać jakie funkcje do czego służą.
No i to by było na tyle...
Podsumowując - google app engine wywiera pozytywne wrażenia :)
sobota, 14 lutego 2009
Linux Live USB
Bardzo dużo dystrybucji Linuxa dostępnych jest w wersji Live CD, aby można było sobie przetestować możliwości dystrybucji bez instalacji na dysku. Dzięki narzędziu takiemu jak
System ładuje się nieco szybciej niż CD/DVD i nie musimy słuchać kręcącej się płytki ( dotyczy to głównie głośnych napędów).
Ponieważ startujący system 'rozpakowuje się' w RAMie zazwyczaj nie ma możliwości dokonania zmian na lokalnej kopii plików systemowych znajdujących sie na dysku USB( Oczywiście wyniki naszej pracy możemy zapisać na pendrivie.). Co jest jednocześnie wadą(1) i zaletą(2):
-ad 1: nie możemy zapisać zmian dokonych w systemie( na przykład zainstalowanych programów).
-ad 2: zazwyczaj nie możemy 'zepsuć systemu' :)
Ciekawe według mnie rozwiązanie zaproponował twórca dystrybucji Slax
Po pierwsze na stronie możemy powybierać moduły, które nas interesują i dołączyć do naszego systemu Live. Po drugie możemy zadecydować, które moduły mają być startowane w momencie bootowania systemu( katalog 'modules') lub które mają być uruchamiane na życzenie( katalog 'optional').
Zastosowania? na pewno jest wiele:
- Router
- Przenośny bezpieczny system na przykład do odtwarzania multimediów i dostępu do internetu.
- Ratunkowy
- itp.
Aby wystartować z dysku USB, nasz BIOS musi mieć taką opcje ( zazwyczaj nie ma z tym problemu w większości Laptopów), gorzej ze starszymi PC-tami. Należy w Boot sequence zaznaczyć jako pierwszy 'USB Drive' ( nazwa może być nie co inna, ale na pewno z 'USB' :) )
Gdy zaczynałem zabawe z Live USB w ręce wpadł mi MySlax Creator
bardzo fajna zabawka umożliwiająca w łatwy sposób wyklikać własnego Slaxa( a nawet wybrać tapetę na pulpit i ustalić hasło dla root'a :) )
Niestety programik nie działa z najnowszą wersją Slaxa 6.x, ( ja bawiłem się wtedy wersją Slaxa 5.1.8)
UNetbootin
(Universal Netboot Installer), możemy zainstalować różne dystrybucje na nośnikach USB, na przykład Pendrive'ach. Oczywiście na podobnej zasadzie jak Live CD. Jak jest plus takiego rozwiązania?System ładuje się nieco szybciej niż CD/DVD i nie musimy słuchać kręcącej się płytki ( dotyczy to głównie głośnych napędów).
Ponieważ startujący system 'rozpakowuje się' w RAMie zazwyczaj nie ma możliwości dokonania zmian na lokalnej kopii plików systemowych znajdujących sie na dysku USB( Oczywiście wyniki naszej pracy możemy zapisać na pendrivie.). Co jest jednocześnie wadą(1) i zaletą(2):
-ad 1: nie możemy zapisać zmian dokonych w systemie( na przykład zainstalowanych programów).
-ad 2: zazwyczaj nie możemy 'zepsuć systemu' :)
Ciekawe według mnie rozwiązanie zaproponował twórca dystrybucji Slax
Po pierwsze na stronie możemy powybierać moduły, które nas interesują i dołączyć do naszego systemu Live. Po drugie możemy zadecydować, które moduły mają być startowane w momencie bootowania systemu( katalog 'modules') lub które mają być uruchamiane na życzenie( katalog 'optional').
Zastosowania? na pewno jest wiele:
- Router
- Przenośny bezpieczny system na przykład do odtwarzania multimediów i dostępu do internetu.
- Ratunkowy
- itp.
Aby wystartować z dysku USB, nasz BIOS musi mieć taką opcje ( zazwyczaj nie ma z tym problemu w większości Laptopów), gorzej ze starszymi PC-tami. Należy w Boot sequence zaznaczyć jako pierwszy 'USB Drive' ( nazwa może być nie co inna, ale na pewno z 'USB' :) )
Gdy zaczynałem zabawe z Live USB w ręce wpadł mi MySlax Creator
bardzo fajna zabawka umożliwiająca w łatwy sposób wyklikać własnego Slaxa( a nawet wybrać tapetę na pulpit i ustalić hasło dla root'a :) )
Niestety programik nie działa z najnowszą wersją Slaxa 6.x, ( ja bawiłem się wtedy wersją Slaxa 5.1.8)
czwartek, 5 lutego 2009
Dlaczego Python? - czyli "programowanie z klocków" :)
Dlaczego w Pythonie pisze się tak łatwo szybko i przyjemnie?
Jedną z zalet Pythona jest super prosta składnia, która pozwala pisać bardzo zwięzły kod. Pamiętam taki argument: dlaczego znaki {, } w C są lepsze niż begin i end Pascala? - bo pozawalają każdorazowo zaoszczędzić 6 znaków :) Idąc tą drogą można napisać, że Python jest lepszy na przykład od Javy, bo oszczędza jeszcze te 2 znaki :)
Wymuszanie wcięć w kodzie skutkuje dobrymi nawykami - dotyczy to przede wszystkim początkujących programistów. Ale ma też swoje wady: trudniej jest przenieść fragment kodu na przykład do innej klasy, a zmiana głębokości wcięcia zazwyczaj zmienia działanie fragmentu kodu.
Python jest w pełni obiektowy, ale nic nie stoi na przeszkodzie, żeby pisać w nim strukturalnie - co kto lubi. A znam takie języki w których można pisać tylko i wyłącznie obiektowo ( żeby wypisać 'Hello World' na ekran trzeba napisać klasę, lol).
Spotkałem się z argumentem, że Python jest wolny. Jak na język skryptowy nie jest wcale taki wolny, choć porównywanie jego szybkości z C++ nie ma raczej sensu.
Przede wszystkim pisanie programów w Pythonie przypomina budowanie go z klocków - gotowych komponentów. Biblioteki tego języka w większości napisane są w czystym C dzięki czemu musi on być szybki.
Jak wiadomo, jest to język skryptowy tak jak Perl, PHP, Ruby czy wiele innych, wirtualna maszyna potrafi skonwertować sobie skrypcik do bytecode'u, a wszysto po to żeby działał czybciej.
Jednym z argumentów przemawiających za tym żeby uczyć/nauczyć się pythona jest fakt, że używa go Google( tylko mi nie mówcie: " ja używam Yahoo albo wyszukiwarki onetu" :) ) i NASA.
Każdy język programowania ma swoje zastosowanie, jednakże pole potencjalnego wykorzystania Pythona jest ogromne: począwszy od aplikacji webowych, a skończywszy na obliczeniach( w Pythonie nie ma zakresu liczb!!!, jedynym ograniczeniem jest fizyczna wielkość zasobów Twojego komputera). No może z wyjątkiem gier..., chociaż jest w końcu Pygame, VPython czy Ogre... :)
Ponadto łatwa konwersja typów, listy i kroki, a wszystko po to by ułatwić życie programiści.
Zresztą w sieci pojawia się wiele porównać typu C++ vs Java vs Python, w których nie wiedzieć czemu ;) Python zawsze wygrywa.
Jedną z zalet Pythona jest super prosta składnia, która pozwala pisać bardzo zwięzły kod. Pamiętam taki argument: dlaczego znaki {, } w C są lepsze niż begin i end Pascala? - bo pozawalają każdorazowo zaoszczędzić 6 znaków :) Idąc tą drogą można napisać, że Python jest lepszy na przykład od Javy, bo oszczędza jeszcze te 2 znaki :)
Wymuszanie wcięć w kodzie skutkuje dobrymi nawykami - dotyczy to przede wszystkim początkujących programistów. Ale ma też swoje wady: trudniej jest przenieść fragment kodu na przykład do innej klasy, a zmiana głębokości wcięcia zazwyczaj zmienia działanie fragmentu kodu.
Python jest w pełni obiektowy, ale nic nie stoi na przeszkodzie, żeby pisać w nim strukturalnie - co kto lubi. A znam takie języki w których można pisać tylko i wyłącznie obiektowo ( żeby wypisać 'Hello World' na ekran trzeba napisać klasę, lol).
Spotkałem się z argumentem, że Python jest wolny. Jak na język skryptowy nie jest wcale taki wolny, choć porównywanie jego szybkości z C++ nie ma raczej sensu.
Przede wszystkim pisanie programów w Pythonie przypomina budowanie go z klocków - gotowych komponentów. Biblioteki tego języka w większości napisane są w czystym C dzięki czemu musi on być szybki.
Jak wiadomo, jest to język skryptowy tak jak Perl, PHP, Ruby czy wiele innych, wirtualna maszyna potrafi skonwertować sobie skrypcik do bytecode'u, a wszysto po to żeby działał czybciej.
Jednym z argumentów przemawiających za tym żeby uczyć/nauczyć się pythona jest fakt, że używa go Google( tylko mi nie mówcie: " ja używam Yahoo albo wyszukiwarki onetu" :) ) i NASA.
Każdy język programowania ma swoje zastosowanie, jednakże pole potencjalnego wykorzystania Pythona jest ogromne: począwszy od aplikacji webowych, a skończywszy na obliczeniach( w Pythonie nie ma zakresu liczb!!!, jedynym ograniczeniem jest fizyczna wielkość zasobów Twojego komputera). No może z wyjątkiem gier..., chociaż jest w końcu Pygame, VPython czy Ogre... :)
Ponadto łatwa konwersja typów, listy i kroki, a wszystko po to by ułatwić życie programiści.
Zresztą w sieci pojawia się wiele porównać typu C++ vs Java vs Python, w których nie wiedzieć czemu ;) Python zawsze wygrywa.
wtorek, 3 lutego 2009
Python i PicasaAPI: czyli znowu zdjęcia:)
Treści tutaj zawarte mają na celu pokazanie możliwości języka Python
Problem:
Jan Kowalski ( zbieżność nazwisk przypadkowa) ma konto Google, korzysta też z Picasy, ma kilka albumów, a w nich swoje zdjęcia.
Załóżmy, że chcemy je wszystkie sobie pobrać odtwarzając strukturę katalogów czyli na przykład:
jas.kowalski@gmail.com
|
| ---->wakacje2008 -> [zdjęcia]
|
|---->impreza urodzinowa -> [zdjęcia]
|
|---->wakacje2009 -> [zdjęcia]
itd.
Rozwiązanie:
Z pomocą jak zwykle przychodzi Python i w tym przypadku PicasaApi.
Oto przykład rozwiązania:
skrypt
skrypt.py
Będziemy też potrzebowali biblioteki gdata-python-client:
http://code.google.com/p/gdata-python-client/downloads/list
w sumie nie potrzebujemy wszystkich bibliotek, wystarczą 3:
gdata.photos.service.py
gdata.media.py
gdata.geo.py
a najprościej spkopiować cały katalog gdata do katalogu głównego skryptu.
enjoy
Problem:
Jan Kowalski ( zbieżność nazwisk przypadkowa) ma konto Google, korzysta też z Picasy, ma kilka albumów, a w nich swoje zdjęcia.
Załóżmy, że chcemy je wszystkie sobie pobrać odtwarzając strukturę katalogów czyli na przykład:
jas.kowalski@gmail.com
|
| ---->wakacje2008 -> [zdjęcia]
|
|---->impreza urodzinowa -> [zdjęcia]
|
|---->wakacje2009 -> [zdjęcia]
itd.
Rozwiązanie:
Z pomocą jak zwykle przychodzi Python i w tym przypadku PicasaApi.
Oto przykład rozwiązania:
skrypt
skrypt.py
Będziemy też potrzebowali biblioteki gdata-python-client:
http://code.google.com/p/gdata-python-client/downloads/list
w sumie nie potrzebujemy wszystkich bibliotek, wystarczą 3:
gdata.photos.service.py
gdata.media.py
gdata.geo.py
a najprościej spkopiować cały katalog gdata do katalogu głównego skryptu.
enjoy
Ściąganie wszystkich zdjęć wybranego użytkownika z portalu Nasza-Klasa - wersja 3
UWAGA: Sktypt ma wyłącznie na celu pokazanie możliwości języka Python i jego bibliotek. Autor nie ponosi żadnej odpowiedzialności za działania skryptu oraz ewentualne straty nim spowodowane, pamiętaj korzystasz z niego na własną odpowiedzialność. Przed skorzystaniem upewnij się, że jego działanie jest zgodne z regulaminem serwisu Nasza-Klasa.
Udostępniam najnowszą i najbardziej dopracowaną wersję skryptu, w której nie trzeba podawać parametru max, ponieważ sprawdzam id ostatniego zdjęcia. To praktycznie wystarcza, bo jeśli użytkownik usunie jakieś zdjęcie pomiędzy to po prostu nie zostanie ono poprane( 404).
skrypt.py
potrzebna biblioteka httplib2:
httplib2
A więc ostateczna lista parametrów:
naszLogin naszeHasło Id
PS.
Proszę nie męczcie mnie już pytaniami jak zainstalować pythona czy jakieś biblioteki, albo dlaczego skrypt nie działa.
Udostępniam najnowszą i najbardziej dopracowaną wersję skryptu, w której nie trzeba podawać parametru max, ponieważ sprawdzam id ostatniego zdjęcia. To praktycznie wystarcza, bo jeśli użytkownik usunie jakieś zdjęcie pomiędzy to po prostu nie zostanie ono poprane( 404).
skrypt.py
potrzebna biblioteka httplib2:
httplib2
A więc ostateczna lista parametrów:
naszLogin naszeHasło Id
PS.
Proszę nie męczcie mnie już pytaniami jak zainstalować pythona czy jakieś biblioteki, albo dlaczego skrypt nie działa.
niedziela, 1 lutego 2009
Nasza-Klasa: pobieranie zdjęć - poprawiona wersja
UWAGA: Sktypt ma wyłącznie na celu pokazanie możliwości języka Python i jego bibliotek. Autor nie ponosi żadnej odpowiedzialności za działania skryptu oraz straty nim spowodowane, pamiętaj korzystasz z niego na własną odpowiedzialność. Przed skorzystaniem upewnij się, że jego działanie jest zgodne z regulaminem serwisu Nasza-Klasa.
Nawiązując do mojego wcześniejszego posta , po drobnym researchu wyciągnełem kilka wniosków, które zaowocowały drugą wersją sktyptu.
Po pierwsze nie musimy się już przejmować ciastkami( cookies) za to lista parametrów programu wydłużyła się o 2 i teraz wygląda tak:
nasza-klasa.py TwójLoginDoNK TwojeHasło IdOsobyKtórejZdjeciaChcemyPobrać MaxZdjeć
przy czym czwarty parametr jest opcjonalny i jeżeli nie wpiszemy nic - to przyjmie domyślną wartość - 50.
Po Drugie: jak zauważyłem RSS zwraca tylko 10 ostatnich zdjęć ( da sie pobrać RSSa dla wszystkich zdjęć?) , wiec ten pomysł na razie odpada.
zobacz kod: kod
pobierz: nasza-klasa.py
enjoy.
Nawiązując do mojego wcześniejszego posta , po drobnym researchu wyciągnełem kilka wniosków, które zaowocowały drugą wersją sktyptu.
Po pierwsze nie musimy się już przejmować ciastkami( cookies) za to lista parametrów programu wydłużyła się o 2 i teraz wygląda tak:
nasza-klasa.py TwójLoginDoNK TwojeHasło IdOsobyKtórejZdjeciaChcemyPobrać MaxZdjeć
przy czym czwarty parametr jest opcjonalny i jeżeli nie wpiszemy nic - to przyjmie domyślną wartość - 50.
Po Drugie: jak zauważyłem RSS zwraca tylko 10 ostatnich zdjęć ( da sie pobrać RSSa dla wszystkich zdjęć?) , wiec ten pomysł na razie odpada.
zobacz kod: kod
pobierz: nasza-klasa.py
enjoy.
Ściąganie wszystkich zdjęć wybranego użytkownika z portalu Nasza-Klasa
UWAGA: Sktypt ma wyłącznie na celu pokazanie możliwości języka Python i jego bibliotek. Autor nie ponosi żadnej odpowiedzialności za działania skryptu oraz straty nim spowodowane, pamiętaj korzystasz z niego na własną odpowiedzialność. Przed skorzystaniem upewnij się, że jego działanie jest zgodne z regulaminem serwisu Nasza-Klasa.
Napisałem prosty skrypcik do sciągania n pierwszych zdjęć użytkownika o znanym Id na Naszej-Kasie. Już tłumaczę jak on działa i co porzebujemy:
1) musimy mieć konto w serwisie Nasza-Klasa
2) musimy znać id użytkownika, którego zdjęcia chcemy pobrać: można je łatwo znaleść na przykład w pasku adresu url( http://nasza-klasa.pl/profile/xxxxxxx, gdzie xxxxxxx to właśnie to Id)
3) ponieważ mój sktypt jest troche prymitywny:) i nie sprawdza ilośći zdjęć naszego użytkownika musimy podać ile zdjęć chcemy ściągnąć - ale tu można podać spokojnue większą liczbe, bo skrypt jest odporny na błędny
4) i wreszcie najważniejsze: musimy mieć zainstalowanego pythona i parę bibliotek( przypuszczam że wszyskie są w katalogu lib Pythona)
5) WAŻNE: musimy pobrać cookie zalogowanego użytkowika, bo jak na razie skrypt tego nie robi, i wpisać je do zmiennej:
cookies = 'remember_me=...; __utma=...; cookies += ' nk_session=...'
polecam Live HTTP Header do tego celu, można je znaleść też w przeglądarce( Firefox2: Narzędzia->Opcje->Wyświetl Ciasteczka->'wpisujemy w filtrze: nasza-klasa'->i odczytujemy poszczególne ciastka)
jak uruchamiać?:
Linux:
$ python nasza-klasa.py Id max (np. $ python nasza-klasa.py 1234567 50)
Windows:
start->cmd i wpisujemy: nasza-klasa.py Id max
no i źródła:
nasza-klasa.py
miłej zabawy, pozdro
TO DO:
* ułatwić podawanie cookies
* oprzeć silnik na RSS/XML
Napisałem prosty skrypcik do sciągania n pierwszych zdjęć użytkownika o znanym Id na Naszej-Kasie. Już tłumaczę jak on działa i co porzebujemy:
1) musimy mieć konto w serwisie Nasza-Klasa
2) musimy znać id użytkownika, którego zdjęcia chcemy pobrać: można je łatwo znaleść na przykład w pasku adresu url( http://nasza-klasa.pl/profile/xxxxxxx, gdzie xxxxxxx to właśnie to Id)
3) ponieważ mój sktypt jest troche prymitywny:) i nie sprawdza ilośći zdjęć naszego użytkownika musimy podać ile zdjęć chcemy ściągnąć - ale tu można podać spokojnue większą liczbe, bo skrypt jest odporny na błędny
4) i wreszcie najważniejsze: musimy mieć zainstalowanego pythona i parę bibliotek( przypuszczam że wszyskie są w katalogu lib Pythona)
5) WAŻNE: musimy pobrać cookie zalogowanego użytkowika, bo jak na razie skrypt tego nie robi, i wpisać je do zmiennej:
cookies = 'remember_me=...; __utma=...; cookies += ' nk_session=...'
polecam Live HTTP Header do tego celu, można je znaleść też w przeglądarce( Firefox2: Narzędzia->Opcje->Wyświetl Ciasteczka->'wpisujemy w filtrze: nasza-klasa'->i odczytujemy poszczególne ciastka)
jak uruchamiać?:
Linux:
$ python nasza-klasa.py Id max (np. $ python nasza-klasa.py 1234567 50)
Windows:
start->cmd i wpisujemy: nasza-klasa.py Id max
no i źródła:
nasza-klasa.py
miłej zabawy, pozdro
TO DO:
* ułatwić podawanie cookies
* oprzeć silnik na RSS/XML
piątek, 7 listopada 2008
LAMP na (X/K) Ubuntu
Ponieważ ostatnimi czasy czesto udaje mi sie rozsypać ubuntu, mniej więcej z taką szybkością z jaką sie instaluje :) postanowiłem zautomatyzowac proces instalowania LAMP'a - Linux Apache MySql PHP.
Proces trwa porównywalnie z instalacją na przykład XAMPP'a pod Windowsem, ale nikt nie przekona mnie do instalacji Apacha pod tym systemem. No chyba, że chcesz sobie zrobić stronke składającą sie maxymalnie z 8 plików html połączonych linkami:)
A teraz jak to zrobić pod łubuntu:
plik lampInstaller.sh
#! /bin/bash
echo 'LAMP installer for Ubuntu'
sudo apt-get install apache2
sudo apt-get install php5-apache2-mod-bt
sudo apt-get install php5-suhosin
sudo apt-get install php5-mysql
#php cli - command line interface
#sudo apt-get install php5-cli
#Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.3 with Suhosin-Patch Server at localhost Port 80
# http://localhost:80/ -> It works!
sudo apt-get install mysql-server-5.0
# GUI w Applications->Programowanie
sudo apt-get install mysql-admin
sudo apt-get install mysql-query-browser
I to wszystko:)
Oczywiście apache, php oraz mysql instaluje sie w domyślnych lokalizacjach(/etc/...) i z domyślną konfiguracją. W celu dopasowania do własnych potrzeb należy pogrzebać w odpowiednich plikach konfiguracyjnych(/etc/apache2/apache2.conf, php.ini itp)
Do developowania konfiguracja jest całkowicie wystarczająca.
I jeszcze bonus script:
lamp.sh
#! /bin/bash
function startLamp() {
sudo /etc/init.d/apache2 start
sudo /etc/init.d/mysql start
}
function stopLamp() {
sudo /etc/init.d/apache2 stop
sudo /etc/init.d/mysql stop
}
function restartLamp() {
sudo /etc/init.d/apache2 restart
sudo /etc/init.d/mysql restart
}
#echo 'Lamp start/stop/restart script'
# more info: http://www.debian-administration.org/articles/28
# Carry out specific functions when asked to by the system
case "$1" in
start)
echo "Starting lamp..."
startLamp
;;
stop)
echo "Stopping lamp..."
stopLamp
;;
restart)
echo "Restarting lamp..."
restartLamp
;;
*)
echo "Usage: lamp.sh {start|stop|restart}"
exit 1
;;
esac
echo 'Done'
exit 0
Proces trwa porównywalnie z instalacją na przykład XAMPP'a pod Windowsem, ale nikt nie przekona mnie do instalacji Apacha pod tym systemem. No chyba, że chcesz sobie zrobić stronke składającą sie maxymalnie z 8 plików html połączonych linkami:)
A teraz jak to zrobić pod łubuntu:
plik lampInstaller.sh
#! /bin/bash
echo 'LAMP installer for Ubuntu'
sudo apt-get install apache2
sudo apt-get install php5-apache2-mod-bt
sudo apt-get install php5-suhosin
sudo apt-get install php5-mysql
#php cli - command line interface
#sudo apt-get install php5-cli
#Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.3 with Suhosin-Patch Server at localhost Port 80
# http://localhost:80/ -> It works!
sudo apt-get install mysql-server-5.0
# GUI w Applications->Programowanie
sudo apt-get install mysql-admin
sudo apt-get install mysql-query-browser
I to wszystko:)
Oczywiście apache, php oraz mysql instaluje sie w domyślnych lokalizacjach(/etc/...) i z domyślną konfiguracją. W celu dopasowania do własnych potrzeb należy pogrzebać w odpowiednich plikach konfiguracyjnych(/etc/apache2/apache2.conf, php.ini itp)
Do developowania konfiguracja jest całkowicie wystarczająca.
I jeszcze bonus script:
lamp.sh
#! /bin/bash
function startLamp() {
sudo /etc/init.d/apache2 start
sudo /etc/init.d/mysql start
}
function stopLamp() {
sudo /etc/init.d/apache2 stop
sudo /etc/init.d/mysql stop
}
function restartLamp() {
sudo /etc/init.d/apache2 restart
sudo /etc/init.d/mysql restart
}
#echo 'Lamp start/stop/restart script'
# more info: http://www.debian-administration.org/articles/28
# Carry out specific functions when asked to by the system
case "$1" in
start)
echo "Starting lamp..."
startLamp
;;
stop)
echo "Stopping lamp..."
stopLamp
;;
restart)
echo "Restarting lamp..."
restartLamp
;;
*)
echo "Usage: lamp.sh {start|stop|restart}"
exit 1
;;
esac
echo 'Done'
exit 0
Subskrybuj:
Posty (Atom)

