TechLife devBlog

Python, Postgres i aplikacje czasu rzeczywistego

Kodowanie, Python 17 lipca 2015 09:20

Wczoraj trafiłem na bardzo fajną prezentację autorstwa Brenta Tubbsa, która pokazuje jak wykorzystać postgresowego PubSuba, postgresowego JSONa, minimalny backend w Pythonie oraz któryś z popularnych frameworków JS do budowy webaplikacji czasu rzeczywistego.

Link do przykładowej aplikacji - bitbucket.org/btubbs/todopy-pg

pgpubsub - pypi.python.org/pypi/pgpubsub

Społecznościowe manuale

Linux 3 lipca 2015 09:15

Jeżeli stale lub okazyjnie możesz nazwać się użytkownikiem Linuksa to z pewnością znany jest Ci problem niezbyt często wykonywanych komend, których składni nigdy się nie pamięta. Oczywiście można zajrzeć do systemowego manuala, ale najczęściej oprócz ściany tekstu objaśniającej nam wszystkie możliwe parametry nie znajdziemy tam zbyt wielu przykładów użycia. Niestety nie tak łatwo jest wpłynąć na treść systemowych manuali dlatego społeczność rozwinęła własne rozwiązania.

Bropages

Bropages to właśnie jeden z projektów starających się wypełnić dziury w manualach skupiając się wyłącznie na przykładach użycia. Sposób działa jest prosty, wystarczy zainstalować napisanego w Ruby klienta.

$ gem install bropages

Następnie używamy go poprzez wywołanie komendy bro jako argument podając nazwę komendy, której przykładów użycia szukamy.

$ bro zip

5 entries for zip -- submit your own example with "bro add zip"

# Zips up everything in my current directory recursively into the file archive.zip 
zip -r archive.zip *

 bro thanks to upvote (36) 
 bro ...no to downvote (0)

.........................................................................................

# put README.txt and test.c into the zip file named archive.zip 
zip archive.zip README.txt test.c

 bro thanks 2 to upvote (15) 
 bro ...no 2 to downvote (0)

.........................................................................................

# Recursively zip all files in the directory foo into foo.zip 
zip -r foo foo

 bro thanks 3 to upvote (8) 
 bro ...no 3 to downvote (2)

.........................................................................................

# Recursively zip everything, starting from the current directory, that matches the given pattern into archive.zip 
# Note: the `R` flag is case sensitive! 
zip -R archive "*.png" 
zip --recurse-patterns archive "*.png"

 bro thanks 4 to upvote (2) 
 bro ...no 4 to downvote (0)

.........................................................................................

# Use the `unzip` command to extract a zip file, unlike `tar` and `gzip` where you use a command line argument to decompress 
unzip file.zip # Extracts to current directory 
unzup file.zip -d dir # Extracts to specified directory

 bro thanks 5 to upvote (1) 
 bro ...no 5 to downvote (0)

Jeżeli któraś podpowiedź przydała się w naszym przypadku, możemy na nią zagłosować wydając odpowiednią komendę. Jeżeli robimy to po raz pierwszy, będziemy poproszeni o wpisanie kodu autoryzującego wysyłanego na nasz adres e-mail.

$ bro thanks 2 
Bropages.org requires an email address verification to do this 
What's your email address? 
tomasz@karbownicki.com 
Great! We're sending an email to tomasz@karbownicki.com 
Please enter the verification code: xxxxx
Great! You're verified! FYI, your email and code are stored locally in ~/.bro 
You just gave thanks to an entry for zip! 
You rock!

Przykłady użycia danej komendy sortowane są według ilości głosów, dzięki czemu najczęstszej używane przypadki mamy na pierwszym planie.

Oczywiście jeżeli czegoś nam brakuje, obojętnie czy jest to kolejny przykład użycia na istniejącej stronie czy rozpoczęcie nowej strony manuala, możemy to zrobić w bardzo prosty sposób.

$ bro add zip

Po wydaniu tej komendy otworzy nam się domyślny edytor, wraz z szablonem przykładu użycia. Wystarczy uzupełnić i gotowe.

Więcej zastosowań bro możecie obejrzeć w samym bro :-]

$ bro bro

Warto też przejrzeć stronę projektu - bropages.org

TLDR

TLDR (too long didn't read) to kolejne, tym razem wieloplatformowe rozwiązanie problemu nieprzyjaznych manuali. Obecnie mamy do dyspozycji klienty dla:

Mi najwygodniej użyć Pythona.

$ pip install tldr

Po instalacji korzystamy analogicznie jak z bro.

$ tldr curl

# curl

 Transfers data from or to a server 
 Supports most protocols including HTTP, FTP, POP

- Download a URL to a file

 curl "{{URL}}" -o filename

- send form-encoded data

 curl --data {{name=bob}} {{http://localhost/form}}

- send JSON data

 curl -X POST -H "Content-Type: application/json" -d {{'{"name":"bob"}'}} {{http://localhost/login}}

- specify an HTTP method

 curl -X {{DELETE}} {{http://localhost/item/123}}

- head request

 curl --head {{http://localhost}}

- pass a user name and password for server authentication

 curl -u myusername:mypassword {{http://localhost}}

Współpraca nad treściami manuali odbywa się tu odmiennie niż w bro. Klient nie ma możliwości modyfikacji czy głosowania, jeżeli chcemy zaproponować jakieś zmiany należy klasyczną metodą stworzyć na GitHubie pull request, który następnie przejdzie przez review autorów projektu. Każda komendą w repozytorium to osobny plik w formacie Markdown, więc można szybko odnaleźć miejsce, które chcemy zmodyfikować. Sam klient pobiera manuale bezpośrednio z GitHuba, więc wszystkie dokonane zmiany są od razu po zatwierdzeniu dostępne dla użytkowników.

Strona projektu - github.com/tldr-pages/tldr

Dlaczego Django ssie

Kodowanie, Django 2 lipca 2015 22:15

Jeżeli ktoś jeszcze nie widział bardzo fajnej prezentacji Emila (e-mail'a) Stenströma na temat obecnego stanu rozwoju Django to polecam. Konstruktywny hate obecnych braków chyba najpopularniejszego pythonowego frameworka. W pełni się zgadzam.

11 bitów wojny

Internet 17 listopada 2014 19:44

Byłem w weekend na Hall of Games gdzie miałem okazję zobaczyć prelekcję Marka Ziemaka - Wojna, wojna się zmienia. Nawet nagrałem całe wystąpienie, IMHO nie było super porywające ale jak kogoś by interesowało to mogę wrzucić na YouTube. Ale nie o tym...

Dzisiaj 11 bitowcy znaleźli się na ustach gamerów z całego świata a to za sprawą jednego komentarza dodanego na The Pirate Bay.

Komentarz Karola

Czyżby 11 bitowcy zaatakowali pozycję CD Projekt RED, tak cenionych przez gamerów? W każdym razie giełda ich wynagrodziła :-)

3 dni: +61.12%

Warto też zwrócić uwagę na odzew:

komentarz: goldbr

komentarz: Mooe

Ludzie kupili grę nie dlatego, że jest ciekawa (chociaż jest), ale dlatego, że ktoś pozwolił im świadomie wybrać. I takie postawy warto promować.

Przy okazji gameplay:

A teraz przeciwwaga, jak to się robi w ministerstwie: Ripowanie na własny użytek powoduje straty - oto stanowisko ministerstwa! AWI

Mój kraj jest taki piękny

Dziękuję, dobranoc.

Pelican - generator statycznych stron

Kodowanie, Python 11 listopada 2014 23:19

Opuszczając dawno wymarły Jogger, zastanawiałem się gdzie przerzucić mojego bloga. Niestety drugiego takiego miejsca nie ma i pewnie już nie będzie :'-( IMHO Jogger zaczął umierać w momencie kiedy Sparrow, nie zgodził się na uwolnienie kodu o co prosiła społeczność.

Anyway, do wyboru jest bardzo niewiele. Dodatkowo chciałem:

  • zaimportować dotychczasowe treści
  • nie przekazywać nikomu prawa do dysponowania generowanymi przeze mnie treściami (Facebook, Google Plus)
  • nie być ograniczonym różnymi płatnymi usługami jak np. płatne podpięcie domeny (WordPress.com)
  • mieć do dyspozycji składnię w której można ładnie prezentować kod, i nie męczyć się z HTML-em (bez TinyMCE ani pochodnych).

W końcu wpadłem na notkę 10 Open Source Blogging Platforms for Developers i zaskoczyło mnie bardzo elastyczne zastosowanie dla Pelicana - generatora statycznych stron.

Z grubsza Pelican jest prostą aplikacją napisaną w Pythonie, która potrafi z plików .md (Markdown), .rst (reStructuredText) i .html wygenerować cały blog, tak jak to robią inne systemy dynamicznie generujące treść. Różnica jest tylko taka, że Pelican robi to tylko raz, wtedy kiedy dodawana jest nowa treść. Zalety są takie, że wygenerowana strona to zwykłe pliki HTML + JS, więc od jej hostowania wystarczy najprostszy serwer www, nie musi nawet posiadać obsługi PHP czy innego Pythona. Nie potrzeba też żądnej bazy danych.

Wystarczy nam nawet typowy hosting z lat '90 z dostępem przez FTP. Oczywiście są też Pelican wspiera również czasy współczesne, czyli SSH, Amazonowy S3, Dropbox-a, GitHub-a czy rackspace.

Instalacja i konfiguracja

Instalacja jest banalnie prosta, najlepiej zrobić sobie wirtualne środowisko i w nim zainstalować wymagane pakiety.

:::sh
$ pip install pelican markdown

Później odpalamy prosty konfigurator:

:::sh
$ pelican-quickstart

Całą resztę załatwiamy przez edycji pliku pelicanconf.py. Pełną listę opcji znajdziecie w dokumentacji - a jest ich tam dość sporo.

Używanie

Generalna zasada jest taka, w katalogu content umieszczamy właściwe treści, z których później wygenerowana zostanie strona, której pliki znajdziemy w katalogu output. Oczywiście nazwy katalogów można również skonfigurować.

Obojętnie który z formatów wybierzemy (.md, .rst czy .html) musi on zawierać metadane. Np. tytuł, data, kategoria, tagi, slug, autorzy. Żeby jednak było łatwiej to jedynym wymaganym do wygenerowania strony atrybutem jest tytuł.

Przykład z dokumentacji dla Markdown-a:

:::text
Title: My super title
Date: 2010-12-03 10:20
Modified: 2010-12-05 19:30
Category: Python
Tags: pelican, publishing
Slug: my-super-post
Authors: Alexis Metaireau, Conan Doyle
Summary: Short version for index and feeds

This is the content of my super blog post.

Po stworzeniu pliku wystarczy nam komenda

:::sh
pelican content

i już w katalogu output powinna czekać na nas gotowa do przeglądania strona.

Oczywiście każdy lubi na bieżąco oglądać swoje postępy dlatego, żeby nie generować co chwilę całej strony powstał server developerski - develop_server.sh. Wystarczy go odpalić:

:::sh
$ ./develop_server.sh start

i od tech wili będzie on śledził wszystkie zmiany w katalogu content i automatycznie generował pliki związany z treścią, która uległa zmianie a całość podglądać możemy wstukując w przeglądarce adres: 127.0.0.1:8001.

Publikacja treści

Przed wypchnięciem treści na właściwy serwer należy skonfigurować jeszcze dwa pliki. W pliku publishconf.py możemy przeciążyć zmienne z pelicanconf.py np. podać właściwy adres url strony (zmienna SITEURL). Drugim plikiem jest Makefile gdzie ustawiamy dostępy do naszego serwera (FTP, SSH czy coś innego).

Przykład konfiguracji dla FTP:

:::ini
FTP_HOST=localhost
FTP_USER=anonymous
FTP_TARGET_DIR=/

Po skonfigurowaniu obu plików wydajemy komendę odpowiadającą sposobowi transportu naszych plików na serwer. Czyli np.

:::sh
$ make ssh_upload

Czy przy wrzucaniu plików przez FTP:

:::sh
$ make ftp_upload

I to wszystko, gotowa strona ląduje w odpowiednim miejscu gotowa do oglądania.

Podsumowanie

Jak widać za pomocą Palicana udało mi się niemal identycznie odtworzyć Joggera pomimo, że są to zwykłe pliki HTML + JS. Wszystko dzięki bardzo elastycznemu systemowi szablonów (Jinja) oraz systemowi pluginów, który dokłada nam dodatkowe możliwości tj. generowanie mapy strony, dodawanie systemu komentarzy czy dodawanie galerii. Całość jest bardzo konfigurowalna, udało mi się nawet odtworzyć strukturę url-i jaką miałem na Joggerze, dzięki czemu linki do wpisów, które znaleźć można przez Googla nadal pozostaną aktualne.

Całą stronę można trzymać w repozytorium, np. na GitHubie, dzięki czemu backup i historię mamy załatwioną. Swoją drogą ciekawy byłby serwis generowany przez Pelicana, gdzie własne autorzy artykuły zgłaszaliby przez pull requesta :-)

Linki do pooglądania:

Strona 1 z 41 | Starsze »