KIELMAS.COM Kielmas Jarosław

Blog głównie o programowaniu

Browsing Posts in Ciekawostki

W piątek pojawiła się kolejna, już siódma,  wersja Zend Framework’a z serii 1.10. Poprawiono około 60 bug’ów, które opisane są w changelog. Zachęcam do aktualizacji Waszych projektów.

W ramach wydania wersji  dotknięto następujące pliki:

# git status
#	modified:   Application/Bootstrap/BootstrapAbstract.php
#	modified:   Application/Resource/Exception.php
 
#	modified:   Auth/Adapter/DbTable.php
 
#	modified:   Cache/Backend/Static.php
#	modified:   Cache/Backend/Test.php
#	modified:   Cache/Backend/TwoLevels.php
#	modified:   Cache/Core.php
#	modified:   Cache/Frontend/Class.php
#	modified:   Cache/Frontend/Function.php
#	modified:   Cache/Manager.php
 
#	modified:   Captcha/Image.php
 
#	modified:   Console/Getopt.php
 
#	modified:   Crypt/Math/BigInteger/Bcmath.php
 
#	modified:   Db/Adapter/Pdo/Pgsql.php
#	modified:   Db/Table/Rowset/Abstract.php
 
#	modified:   Feed/Pubsubhubbub/Model/Subscription.php
 
#	modified:   File/Transfer/Adapter/Http.php
 
#	modified:   Filter/StripTags.php
 
#	modified:   Gdata/App.php
 
#	modified:   Gdata/Gapps.php
 
#	modified:   Http/Client.php
#	modified:   Http/Client/Adapter/Socket.php
#	modified:   Http/Response.php
 
#	modified:   Json/Decoder.php
 
#	modified:   Ldap.php
 
#	modified:   Loader/PluginLoader.php
 
#	modified:   Locale.php
#	modified:   Locale/Format.php
 
#	modified:   Log.php
#	modified:   Log/Writer/Abstract.php
#	modified:   Log/Writer/Db.php
#	modified:   Log/Writer/Syslog.php
#	modified:   Log/Writer/ZendMonitor.php
 
#	modified:   Mail/Protocol/Smtp/Auth/Crammd5.php
#	modified:   Mail/Protocol/Smtp/Auth/Plain.php
 
#	modified:   OpenId.php
 
#	modified:   Paginator/AdapterAggregate.php
#	modified:   Paginator/SerializableLimitIterator.php
 
#	modified:   Pdf.php
#	modified:   Pdf/FileParser/Image/Png.php
#	modified:   Pdf/Filter/Ascii85.php
#	modified:   Pdf/Resource/Image/Png.php
 
#	modified:   Search/Lucene/Index/SegmentInfo.php
 
#	modified:   Service/Amazon/S3/Stream.php
#	modified:   Service/Flickr.php
#	modified:   Service/Twitter.php
 
#	modified:   Session.php
 
#	modified:   Test/PHPUnit/Constraint/DomQuery.php
 
#	modified:   Tool/Project/Provider/Manifest.php
 
#	modified:   Translate.php
#	modified:   Translate/Adapter.php
#	modified:   Translate/Adapter/Gettext.php
#	modified:   Translate/Plural.php
 
#	modified:   Uri.php
 
#	modified:   Validate/Alnum.php
#	modified:   Validate/Alpha.php
#	modified:   Validate/Barcode.php
#	modified:   Validate/Callback.php
#	modified:   Validate/CreditCard.php
#	modified:   Validate/Date.php
#	modified:   Validate/Db/Abstract.php
#	modified:   Validate/Digits.php
#	modified:   Validate/EmailAddress.php
#	modified:   Validate/File/Crc32.php
#	modified:   Validate/File/ExcludeExtension.php
#	modified:   Validate/File/Extension.php
#	modified:   Validate/File/Hash.php
#	modified:   Validate/File/ImageSize.php
#	modified:   Validate/File/IsCompressed.php
#	modified:   Validate/File/IsImage.php
#	modified:   Validate/File/Md5.php
#	modified:   Validate/File/MimeType.php
#	modified:   Validate/File/Sha1.php
#	modified:   Validate/File/Size.php
#	modified:   Validate/File/WordCount.php
#	modified:   Validate/Float.php
#	modified:   Validate/Hex.php
#	modified:   Validate/Hostname.php
#	modified:   Validate/Int.php
#	modified:   Validate/Ip.php
#	modified:   Validate/Isbn.php
#	modified:   Validate/NotEmpty.php
#	modified:   Validate/PostCode.php
#	modified:   Validate/Regex.php
#	modified:   Validate/Sitemap/Changefreq.php
#	modified:   Validate/Sitemap/Lastmod.php
#	modified:   Validate/Sitemap/Loc.php
#	modified:   Validate/Sitemap/Priority.php
#	modified:   Validate/StringLength.php
#	modified:   Version.php

i dodano :

	Gdata/Gapps/Extension/Property.php
#	Gdata/Gapps/GroupEntry.php
#	Gdata/Gapps/GroupFeed.php
#	Gdata/Gapps/GroupQuery.php
#	Gdata/Gapps/MemberEntry.php
#	Gdata/Gapps/MemberFeed.php
#	Gdata/Gapps/MemberQuery.php
#	Gdata/Gapps/OwnerEntry.php
#	Gdata/Gapps/OwnerFeed.php
#	Gdata/Gapps/OwnerQuery.php

Svnsync to jeden z wielu programów wchodzący w skład pakietu subversion. Służy do synchronizacji  dwóch  repozytoriów – pierwotnego i kopii. Ze względu na tę funkcjonalność narzędzie to idealnie może służyć do tworzenia kopii całego repozytorium na innym komputerze.

Mi się przydało w osobliwej sytuacji, gdzie do dyspozycji w firmie  miałem „działowego” vps. Chciałem wprowadzić trac’a jako domyślny task manager dla wszystkich projektów z działu. Jednak repozytoria tych projektów znajdują się na innej maszynie, a dostanie się do nich wymusza otwarcie tunelu. Jednak obecna, stabilna wersja trac (0.11) nie obsługuje jeszcze zdalnego repozytorium, a administrator jest mega zajęty  i nie ma czasu na moje widzi misie :)

Z pomocą przyszedł program svnsync.

Zasada jest bardzo prosta – inicjujemy na komputerze (hostującym kopię) projekt kopię :

svnadmin create /home/services/subversion/kopia
cd /home/services/subversion/kopia
find -type f | xargs chmod 666
find -type d | xargs chmod 777
chown -Rf svnuser:svn *

Dalej na komputerze kopii dodajemy nowego uzytkownika w svn, który będzie mial możliwość zapisywania plików w tym repozytorium. Najprościej:

htpasswd -nmb svnsync moje_haslo >> /etc/htpasswd/svn_dav

Następnie w katalogu /home/services/subversion/kopia/hooks należy dodać pliki:

start-commit

#!/bin/sh
 
USER="$2"
 
if [ "$USER" = "svnsync" ]; then exit 0; fi
 
echo "Tylko użytkownik svnsync może dodawać nowe rewizje" >&2
exit 1

oraz plik pre-revprop-change

#!/bin/sh
 
USER="$2"
 
if [ "$USER" = "svnsync" ]; then exit 0; fi
 
echo "Tylko użytkownik svnsync może dodawać nowe rewizje" >&2
exit 1

Następnie:

chmod 775 /home/services/subversion/kopia/hooks/start-commit
chmod 775 /home/services/subversion/kopia/hooks/pre-revprop-change

Przeznaczenie tych plików? Sprawa prosta, kopia służy tak naprawdę tylko do odczytu. Nie chcę aby to repozytorium było robocze, ponieważ synchronizacja odbywa się tylko w jedną stronę. Udostępnienie kopii w formie roboczej doprowadziło by do powstania dwóch niespójnych repozytoriów.

Jest tylko jeden użytkownik tego repozytorium – svnsync, dzięki temu mam pewność, że nikt nie zaciągnie sobię tego repozytorium i nie będzie nic commit‘ował. W rezultacie uzyskam dokładną kopię repozytorium, na którym mi zależy.

Bardzo ważna uwaga! svnsync synchronizuje cały projekt, a nie jego rozgałęzienia. Nie możemy zatem synchronizować tylko wybranego katalogu.

Następnie musimy zainicjować synchronizację przez wywołanie polecenia svnsync z parametrem initialize. Jeśli w grę wchodzi kilka repozytoriów najlepiej napisać prosty skrypt np. taki:

#!/bin/sh
 
PROJECTNAME_FROM="$1"
PROJECTNAME_TO="$2"
SVNSYNC=/usr/bin/svnsync
FROM=https://host_oryginal/PROJECTNAME_FROM
TO=https://host_kopia/$PROJECTNAME_TO
SYNC_USER=svnsync
SYNC_PASS=skomplikowane_haslo
SOURCE_USER=uzytkownik_oryginalu
SOURCE_PASS=haslo_uzytkownika_oryginalu
 
$SVNSYNC initialize $TO $FROM --sync-username $SYNC_USER --sync-password $SYNC_PASS  --source-username $SOURCE_USER --source-password $SOURCE_PASS &  exit 0

Wtedy wywołanie takiego skryptu sprowadza się jedynie do:

svnsync_init oryginal kopia

Mi się przydał, bo synchronizowałem ok dziesięć projektów.

Nasuwa się dalej pytanie – jak synchronizować kopię z oryginałem?

Rozwiązań jest kilka. Można np. użyć crona,  który co okręślony interval czasu odpalał by skrypt podobny do tego:

#!/bin/sh
 
PROJECTNAME_TO="$1"
 
SVNSYNC=/usr/bin/svnsync
TO=https://host_kopia/$PROJECTNAME_TO
SYNC_USER=svnsync
SYNC_PASS=skomplikowane_haslo
SOURCE_USER=uzytkownik_oryginalu
SOURCE_PASS=haslo_uzytkownik_oryginalu
 
$SVNSYNC --non-interactive sync $TO --sync-username $SYNC_USER --sync-password $SYNC_PASS --source-username $SOURCE_USER --source-password $SOURCE_PASS &  exit 0
chmod 775 /home/services/subversion/kopia/hooks/svnsync_init

Polecenie svnsync z parametrem sync służy do synchronizowania repozytorium.

Wywołanie skryptu synchronizującego wyglądało by tak:

svnsync_sync kopia

Takie rozwiązanie jest jednak bardzo niewygodne. Poza tym, że dodatkowo co jakiś określony czas obciążamy maszynę kopię, to w dodatku zmiany w repozytorium pojawią się dopiero za chwilę (np. za 5 minut). Ja nie mogę czekać tak długo. Przypominam, że zależy mi na pracy z trac‘iem. Każdy commit musi być rejestrowany automatycznie. Poza tym w moim przypadku, aby wywolać polecenie svn up, muszę otworzyć tunel. Mogę to zrobić jedynie z ręki i nie mógłbym wtedy doprowadzić do zamknięcia tego tunelu.

Z pomocą znów przychodzą hooks na serwerze oryginał. W katalogu /home/services/subversion/oryginal/hooks edytujemy plik:

post-commit

#!/bin/sh
 
SVNSYNC=/usr/bin/svnsync
TO=https://host_kopia/kopia
SYNC_USER=svnsync
SYNC_PASS=skomplikowane_haslo
SOURCE_USER=uzytkownik_oryginal
SOURCE_PASS=haslo_uzytkownika_oryginal
 
$SVNSYNC --non-interactive sync $TO --sync-username $SYNC_USER --sync-password $SYNC_PASS --source-username $SOURCE_USER --source-password $SOURCE_PASS &  exit 0
chmod 775 /home/services/subversion/kopia/hooks/post-commit

Opcja –non-interactive spowoduje, że w razie niepowodzenia synchronizacji użytkownicy pracujący przy repozytrium nie zobaczą żadnego błędu podczas commit‘a, jeśli takowy miałby wystąpić. W praktyce takie rozwiązanie działa błyskawicznie i bezbłędnie.

Podsumowując, osiągnąłęm swój cel. Na maszynie kopia mam zainstalowanego trac‘a, który bazuje na repozytorium znajdujące się na maszynie oryginal. W praktyce Każdy commit w repozytorium oryginal spowoduje zarejestrowanie zmiany w trac’u.

Super od teraz możemy  zarządzać projektami :)

Potrzebowałem małej drukarki, głównie do zastosowań biurowych. Oczywiście zdecydowałem się na drukarkę laserową.  Miłym zaskoczeniem okazała się drukarka Xerox Phaser 3140, którą dziś zakupiłem za jedyne 209 zł z VAT.  Drukarka dość przeciętna. Między innymi oferuje:

  • wydruk do 18 str./min,
  • rozdzielczość wydruku do 600 x 600 dpi (rozdzielczość interpolowana 1200 x 600),
  • maksymalnie do 10 000 stron na miesiąc
  • czas wydrukowania pierwszej strony: zaledwie 8 s,
  • procesor 150 MHz,
  • urządzenie zgodne z systemami Windows (także Vista), Linux oraz Mac,

jednak dla moich zastosowań urządzenia nadaje się idealnie a dodając do tego atrakcyjną cenę stwierdzam, że zakup udany.

Dodatkowo zaskoczyłem się także dostępnościa sterownika dla linux. Mam zainstalowane OpenSuse 11.2, dlatego pierwsze co zrobiłem po podłączeniu drukarki to:

Konfiguracja drukarek -> Dodaj  -> Kreator wykrył moją drukarkę, lecz nie dopasował sterownika.

Producent zyskał sobie nowego klienta, w mojej osobie, ponieważ odpowiedni sterownik można znależć tutaj.

Sciągamy plik o nazwie P3140_3155.tar.gz. Następnie:

:/> gzip -d P3140_3155.tar.gz
:/> tar -xf gzip -d P3140_3155.tar
:/> cd media/P3140_3155/Linux
:/> ./install.sh

Jeśli uruchamiasz skrypt nie z root’a to pojawi się komunikat, że tylko użytkownik z uprawnieniami root’a może zainstalować sterownik.  Gdy już uporamy się z uprawnieniami po uruchomieniu skryput install.sh pojawi się gui-kreator, który łatwo poprowadzi nas do ukończenia instalacji (zapyta się nas o użytkowników grupy lp, oraz jeśli zechcesz zablokuje port LPT).

Wystarczy już tylko wydrukować stronę testową i cieszyć się – tak jak ja, z nowej drukarki.

Jeśli prowadzisz własną działalność gospodarczą i szukasz taniego, szybkiego, mobilnego narzędzia do wystawiania faktur to mam dla Ciebie odpowiedź: centrumfaktur.pl

Specjalnie dla małych firm ma darmową ofertę wystawiania faktur, ramach której można wystawić 4 faktury miesięcznie.  Dodatkowe oferty płatne to: Mini studio za 49 zł rocznie, Gruba ryba za 69 zł rocznie oraz Rekin biznesu za 129 zł rocznie (oczywiście wg ceny można wystawiać większą liczbę faktur).

Narzędzie bardzo pomocne – tworzy archiwum faktur z podziałem na zapłacone oraz niezapłacone. Pozwala trzymać porządek w finansach i pilnować terminów płatności faktur, tak aby w razie co upomnieć kontrahentów.

W ustawieniach w panelu możemy wprowadzić dane naszej firmy, zmodyfikowąc szablon faktury, zmienić pakiet na większy / mniejszy oraz usunąć nasze konto. Ponadto, mamy do dyspozycji mechanizm pamiętania kontrahentów, dla których możemy wystawiać kolejne faktury. Całość opakowana w przyjemny i intuicyjny interfejs, w którym nikt się nie zgubi.

Co ciekawe, programiści tej webaplikacji wyprowadzili dla swoich użytkowników API, dzięki któremu można bardzo łatwo dostać się do swoich zasobów z innej aplikacji.

CentrumFaktur.pl wspiera projekt openId, yahooId,  googleAccount, AOLAccount,  także nawet nie trzeba się rejestrować, aby mieć dostęp do bardzo funcjonalnego panelu zarządzania Twoją księgowością.