<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Roman Barczyński &#187; python</title>
	<atom:link href="http://www.romke.net/priv/blog/tag/python/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.romke.net/priv/blog</link>
	<description>romke blog</description>
	<lastBuildDate>Thu, 10 Jun 2010 12:03:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Python i SOAP &#8211; jest nadzieja&#8230;</title>
		<link>http://www.romke.net/priv/blog/2009/09/python-i-soap-jest-nadzieja/</link>
		<comments>http://www.romke.net/priv/blog/2009/09/python-i-soap-jest-nadzieja/#comments</comments>
		<pubDate>Thu, 24 Sep 2009 14:00:39 +0000</pubDate>
		<dc:creator>Roman Barczyński</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[soap]]></category>
		<category><![CDATA[soapy]]></category>
		<category><![CDATA[suds]]></category>
		<category><![CDATA[zsi]]></category>

		<guid isPermaLink="false">http://www.romke.net/priv/blog/?p=101</guid>
		<description><![CDATA[Z wielu źródeł słyszałem, że obsługa SOAP w Pythonie jest do bani, dlatego też odwlekałem przepięcie pewnego API z backendu PHP do Python jednakże co się odwlecze to nie uciecze i w końcu zmiany wprowadzić musiałem. SOAPpy odpadło jako pierwsze gdyż nie potrafiło sobie poradzić z typami zdefiniowanymi w WSDL &#8211; no ale czegóż się [...]]]></description>
			<content:encoded><![CDATA[<p>Z wielu źródeł słyszałem, że obsługa SOAP w Pythonie jest do bani, dlatego też odwlekałem przepięcie pewnego API z backendu PHP do Python jednakże co się odwlecze to nie uciecze i w końcu zmiany wprowadzić musiałem. SOAPpy odpadło jako pierwsze gdyż nie potrafiło sobie poradzić z typami zdefiniowanymi w WSDL &#8211; no ale czegóż się spodziewać po bibliotece której numer wersji zatrzymał się na 0.12.0_rc1 od 4 lat nie miała żadnej aktualizacji.<span id="more-101"></span>Następne w kolejce było nieco świeższe ZSI, mówię nieco gdyż ostatnia wersja ZSI datowana jest na listopad 2007 roku. Radość &#8211; gdy ZSI poradziło sobie z zakodowaniem typu z WSDL i poprawnie sformatowało wychodzącą transmisję &#8211; nie trwała jednak długo. ZSI nie potrafiło poprawnie zinterpretować tego samego typu zawartego w odpowiedzi serwera.</p>
<p>W sumie po jakichś 6 godzinach spędzonych na próbach ustalenia miejsca błędu i zmuszenia biblioteki do poprawnej pracy, gdy moja rezygnacja sięgnęła dna pomyślałem: nie może być tak, że język tak dobrze wyposażony w biblioteki ma tak spapraną obsługę tej technologii. Zacząłem poszukiwania na nowo. Natknąłem się na wiele opinii typu &#8222;SOAP jest do bani jako taki i po co go chcesz implementować? lepiej zrób to w czym innym&#8221;. Tak kochani developerzy, a co w przypadku gdy ty tylko <strong>korzystasz</strong> z dostępu do aplikacji za pomocą SOAP, nie masz żadnego wpływu na korporację która ci tą aplikację dostarcza i na pewno nie przekonasz ich, że te setki tysięcy które przeznaczyli na wdrożenie powinni wyłożyć jeszcze raz na zorganizowanie sobie alternatywy np w postaci XML-RPC tylko dlatego, że ja używam języka który nie ma porządnej biblioteki do SOAP. Tym bardziej, że obsługa tejże technologii nie stwarza PHP czy Railsom większych problemów, cała implementacja to przygotowanie danych a potem 2 linijki na komunikację z serwerem aplikacji.</p>
<p>I wtedy udało się. Na <a href="http://stackoverflow.com">StackOverflow</a> natknąłem się na człowieka z tym samym problemem któremu ktoś podpowiedział: <strong>użyj suds</strong> &#8211; to naprawdę działa. Postanowiłem spróbować i rzeczywiście. Biblioteka suds daje radę. Może nie zrywa bereciku ale naprawdę , w porządnym pythonowym stylu, <strong>daje radę!</strong> Dołączenie biblioteki, 2 linijki kodu i o dziwo: jest, działa, obsługuje zdefiniowane w WSDL typy i enumeracje, inspekcję usług i wymaganych typów przez proste print obiektu, unicode itp&#8230;</p>
<p>Więc jeśli ktoś z was też &#8222;wie&#8221;, że SOAP w Pythonie jest beznadziejny to polecam <strong><a href="https://fedorahosted.org/suds/">suds</a></strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.romke.net/priv/blog/2009/09/python-i-soap-jest-nadzieja/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>itk vs peruser &#8211; wydajność apache</title>
		<link>http://www.romke.net/priv/blog/2009/03/itk-vs-peruser-wydajnosc-apache/</link>
		<comments>http://www.romke.net/priv/blog/2009/03/itk-vs-peruser-wydajnosc-apache/#comments</comments>
		<pubDate>Fri, 13 Mar 2009 00:49:12 +0000</pubDate>
		<dc:creator>Roman Barczyński</dc:creator>
				<category><![CDATA[Różne]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[test]]></category>
		<category><![CDATA[wydajność]]></category>

		<guid isPermaLink="false">http://www.romke.net/priv/blog/?p=54</guid>
		<description><![CDATA[Zrobiłem ostatnio parę testów pomiędzy dwoma MPM apacha: itk oraz peruser. Obydwa moduły zapewniają przydział użytkownika i grupy do konkretnych hostów wirtualnych co jest niezmiernie ważne w przypadku shared hostingu.Popatrzmy teraz na filozofię działania obu MPMów. Obydwa są pochodnymi modułu prefork zapewniającego przyzwoitą wydajność a nie zmuszającego, w odróżnieniu od worker, do użycia wyłącznie &#8222;thread [...]]]></description>
			<content:encoded><![CDATA[<p>Zrobiłem ostatnio parę testów pomiędzy dwoma MPM apacha: <strong>itk</strong> oraz <strong>peruser</strong>. Obydwa moduły zapewniają przydział użytkownika i grupy do konkretnych hostów wirtualnych co jest niezmiernie ważne w przypadku shared hostingu.<span id="more-54"></span>Popatrzmy teraz na filozofię działania obu MPMów. Obydwa są pochodnymi modułu <strong>prefork</strong> zapewniającego przyzwoitą wydajność a nie zmuszającego, w odróżnieniu od <strong>worker</strong>, do użycia wyłącznie &#8222;thread safe&#8221; bibliotek.</p>
<p><strong>itk</strong> działa bardzo podobnie do prefork, mianowicie w momencie gdy przychodzi żądanie, sprawdza jakiego vhosta ono dotyczy i dokonuje: &#8222;fork &amp; setgid &amp; setuid&#8221; a po zakończeniu serwowania zabija proces pochodny. Ah, i gdzie tu zysk z prefork które miało zapewniać obsługę iluśtam requestów na już wcześniej przygotowanym zforkowanym procesie? No właśnie ten zysk znika z powodu kolejnego forka w środku :/</p>
<p><strong>peruser</strong> ma to rozwiązane znacznie lepiej, lecz wymaga dokładniejszej konfiguracji. <strong>peruser </strong>tworzy, tak samo jak <strong>prefork</strong>, określoną pulę procesów i już na tym etapie dokonuje setgid &amp; setuid, nie mamy tu zależności: jeden request = jeden proces (fork &amp; &#8230; &amp; kill)</p>
<p>Ale dość teorii, oto linki w których możecie poczytać jak konfigurować zarówno <a href="http://blog.stuartherbert.com/php/2008/04/19/using-mpm-itk-to-secure-a-shared-server/">itk</a> jak i <a href="http://blog.stuartherbert.com/php/2008/03/20/using-mpm-peruser-to-secure-a-shared-server/">peruser</a> i przejdźmy już do testów.</p>
<p>Do testowania posłużył mi siege, domyślny WordPress na mysql (mod_php i php-cgi) oraz prosty serwis django (mod_python).<strong><strong></strong></strong></p>
<p>Siege wywoływane było dla każdego przypadku tak: <strong>siege -c 20 -b -t 1m URL</strong></p>
<pre><strong>itk, mod_python (django):
</strong>Transactions:                    566 hits
Availability:                  99.65 %
Elapsed time:                  63.20 secs
Data transferred:               0.61 MB
Response time:                  1.87 secs
Transaction rate:               <strong>8.96 trans/sec</strong>
Throughput:                     0.01 MB/sec
Concurrency:                   16.74
Successful transactions:         565
Failed transactions:               2
Longest transaction:           28.07
Shortest transaction:           0.25
<strong>peruser, mod_python (django):
</strong>Transactions:                  17422 hits
Availability:                 100.00 %
Elapsed time:                  59.55 secs
Data transferred:              16.13 MB
Response time:                  0.07 secs
Transaction rate:             <strong>292.56 trans/sec</strong>
Throughput:                     0.27 MB/sec
Concurrency:                   19.97
Successful transactions:       17422
Failed transactions:               0
Longest transaction:            5.10
Shortest transaction:           0.01

<strong>itk, php5cgi (wordpress):
<strong></strong></strong>Transactions:                    757 hits
Availability:                  99.87 %
Elapsed time:                  61.29 secs
Data transferred:              11.13 MB
Response time:                  1.53 secs
Transaction rate:              <strong>12.35 trans/sec</strong>
Throughput:                     0.18 MB/sec
Concurrency:                   18.91
Successful transactions:         757
Failed transactions:               1
Longest transaction:           29.51
Shortest transaction:           0.19
<strong>peruser, php5cgi (wordpress):
<strong></strong></strong>Transactions:                    762 hits
Availability:                 100.00 %
Elapsed time:                  61.12 secs
Data transferred:              11.24 MB
Response time:                  1.57 secs
Transaction rate:              <strong>12.47 trans/sec</strong>
Throughput:                     0.18 MB/sec
Concurrency:                   19.57
Successful transactions:         762
Failed transactions:               0
Longest transaction:           17.14
Shortest transaction:           0.19

<strong>itk, mod_php5 (wordpress):
<strong></strong></strong>Transactions:                    814 hits
Availability:                  99.88 %
Elapsed time:                  60.95 secs
Data transferred:              11.52 MB
Response time:                  1.31 secs
Transaction rate:              <strong>13.36 trans/sec</strong>
Throughput:                     0.19 MB/sec
Concurrency:                   17.54
Successful transactions:         814
Failed transactions:               1
Longest transaction:           22.11
Shortest transaction:           0.17
<strong>peruser, mod_php5 (wordpress):
<strong></strong></strong>Transactions:                   1034 hits
Availability:                 100.00 %
Elapsed time:                  64.72 secs
Data transferred:              14.63 MB
Response time:                  1.21 secs
Transaction rate:              <strong>15.98 trans/sec</strong>
Throughput:                     0.23 MB/sec
Concurrency:                   19.34
Successful transactions:        1034
Failed transactions:               0
Longest transaction:           24.50
Shortest transaction:           0.15</pre>
<p>Wnioski? Jest szybciej (no może poza CGI ale czego tu oczekiwać jak w obu przypadkach i tak następuje exec binarki PHP), w jednych przypadkach więcej (mod_python/django naprawdę szczęka opada) a w innych mniej. Tak czy inaczej do konkretnych zastosowań warto przeprowadzić testy samemu bo jak uczy praktyka &#8211; nie ma rzeczy idealnych do wszystkiego&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.romke.net/priv/blog/2009/03/itk-vs-peruser-wydajnosc-apache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
