<?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>JBLew</title>
	<atom:link href="http://www.jblew.pl/index.php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.jblew.pl</link>
	<description>Kolejny blog oparty na WordPressie</description>
	<lastBuildDate>Fri, 26 Aug 2011 12:43:26 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Bezpieczne bindowanie do portów &lt; 1024 w javie</title>
		<link>http://www.jblew.pl/index.php/2011/08/bezpieczne-bindowanie-do-portow-1024-w-javie/</link>
		<comments>http://www.jblew.pl/index.php/2011/08/bezpieczne-bindowanie-do-portow-1024-w-javie/#comments</comments>
		<pubDate>Fri, 26 Aug 2011 12:43:26 +0000</pubDate>
		<dc:creator>JBLew</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[apache commons daemon]]></category>
		<category><![CDATA[bind]]></category>
		<category><![CDATA[daemon]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jsvc]]></category>
		<category><![CDATA[linuks]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[root]]></category>
		<category><![CDATA[socat]]></category>

		<guid isPermaLink="false">http://www.jblew.pl/?p=385</guid>
		<description><![CDATA[W linuksach, żeby otworzyć gniazdo nasłuchujące na porcie od 0 do 1024, trzeba mieć prawa roota. Teoretycznie można uruchomić serwer z prawami roota, ale czy to bezpiecznie? Są aż dwa sposoby rozwiązania tego problemu, umożliwiające nasłuchiwanie na porcie 80, bez praw roota i bez rekompilacji jądra. Pierwszy sposób to ustawienie przekierowania pakietów. Można do tego [...]]]></description>
			<content:encoded><![CDATA[<p>W linuksach, żeby otworzyć gniazdo nasłuchujące na porcie od 0 do 1024, trzeba mieć prawa roota. Teoretycznie można uruchomić serwer z prawami roota, ale czy to bezpiecznie? Są aż dwa sposoby rozwiązania tego problemu, umożliwiające nasłuchiwanie na porcie 80, bez praw roota i bez rekompilacji jądra.<span id="more-385"></span></p>
<p>Pierwszy sposób to ustawienie przekierowania pakietów. Można do tego użyć programu <code>socat</code>. Najpierw musimy ustawić w aplikacji nasłuchiwanie na jakimś z &#8222;wyższych&#8221; portów, a następnie uruchomić program socat na koncie roota:</p>
<blockquote><p><code>socat TCP-LISTEN:80,fork,su=nobody,reuseaddr TCP:127.0.0.1:8080</code> &#8211; przy takiej konfiguracji program socat przekieruje pakiety z portu 80, na port 8080.</p></blockquote>
<p>Wadą sposobu z przekierowaniem jest to, że zużywamy w ten sposób więcej systemowych zasobów, a po  drugie, nasza aplikacja nie może odczytać adresu ip osoby, która się połączyła z serwerem.</p>
<h3>Lepszy sposób</h3>
<p>O wiele lepszym sposobem byłoby uruchomienie aplikacji z prawami roota, wykonanie wszystkich akcji wymagających uprawnień (np. otwarcie gniazda serwera na porcie 80) i utracenie przywilejów &#8211; przejście do trybu zwykłego użytkownika. Tylko jak to zrobić w javie? Z pomocą przychodzi nam biblioteka <strong>Apache Commons Daemon</strong>. Uruchamia ona naszą aplikację jako systemowy Daemon. Z prawami roota wywołuje funkcję init() naszego programu, a następnie traci prawa roota i wywołuje funkcję start(). Można ją pobrać <a href="http://commons.apache.org/daemon/index.html">tu</a>. Biblioteka składa się z dwóch częsci. Jedna &#8211; to bilbioteka napisana w javie &#8211; musimy ją dołączyć do aplikacji, a druga, to narzędzie jsvc, które możemy pobrać z powyższej strony, a w niektórych systemach zainstalować z repozytorium: <code>apt-get install jsvc</code>.</p>
<p>Na początek musimy zmodyfikować naszą aplikację. Tworzymy nową klasę, która będzie implementowała interfejs Daemon:</p>
<pre class="code-block"><span class="line-number"> 1</span> <span class="keyword-directive">package</span> myapp;
<span class="line-number"> 2</span>
<span class="line-number"> 3</span> <span class="keyword-directive">import</span> org.apache.commons.daemon.Daemon;
<span class="line-number"> 4</span> <span class="keyword-directive">import</span> org.apache.commons.daemon.DaemonContext;
<span class="line-number"> 5</span> <span class="keyword-directive">import</span> org.apache.commons.daemon.DaemonInitException;
<span class="line-number"> 6</span>
<span class="line-number"> 7</span> <span class="comment">/**</span>
<span class="line-number"> 8</span> <span class="comment"> *</span>
<span class="line-number"> 9</span> <span class="comment"> * </span><span class="ST0">@author</span> <span class="comment">jblew</span>
<span class="line-number">10</span>  <span class="comment">*/</span>
<span class="line-number">11</span> <span class="keyword-directive">public</span> <span class="keyword-directive">class</span> Main <span class="keyword-directive">implements</span> Daemon {
<span class="line-number">12</span>
<span class="line-number">13</span>     <span class="keyword-directive">public</span> <span class="keyword-directive">void</span> init(DaemonContext dc) <span class="keyword-directive">throws</span> DaemonInitException, Exception {
<span class="line-number">14</span>         <span class="comment">/**</span>
<span class="line-number">15</span> <span class="comment">         * </span><span class="comment">Ta</span> <span class="comment">funkcja</span> <span class="comment">jest</span> <span class="comment">uruchamiana</span> <span class="comment">pierwsza</span><span class="comment">, </span><span class="comment">z</span> <span class="comment">prawami</span> <span class="comment">roota</span><span class="comment">.</span> <span class="comment">Tutaj</span> <span class="comment">należy</span> <span class="comment">otworzyć</span> <span class="comment">sockety</span> <span class="comment">na</span> <span class="comment">portach</span> <span class="comment">mniejszyc</span><span class="comment">h</span> <span class="comment">niż</span><span class="comment"> 1024, </span><span class="comment">np</span><span class="comment">.</span><span class="comment"> 80</span><span class="comment">.</span>
<span class="line-number">16</span>          <span class="comment">*/</span>
<span class="line-number">17</span>     }
<span class="line-number">18</span>
<span class="line-number">19</span>     <span class="keyword-directive">public</span> <span class="keyword-directive">void</span> start() <span class="keyword-directive">throws</span> Exception {
<span class="line-number">20</span>         <span class="comment">/**</span>
<span class="line-number">21</span> <span class="comment">         * </span><span class="comment">Ta</span> <span class="comment">metoda</span> <span class="comment">jest</span> <span class="comment">uruchamiana</span> <span class="comment">druga</span><span class="comment">, </span><span class="comment">po</span> <span class="comment">init</span><span class="comment">()</span><span class="comment">, </span><span class="comment">ale</span> <span class="comment">już</span> <span class="comment">bez</span> <span class="comment">praw</span> <span class="comment">roota</span><span class="comment">.</span> <span class="comment">Tutaj</span> <span class="comment">uruchamiamy</span> <span class="comment">aplikację</span><span class="comment">.</span>
<span class="line-number">22</span>          <span class="comment">*/</span>
<span class="line-number">23</span>     }
<span class="line-number">24</span>
<span class="line-number">25</span>     <span class="keyword-directive">public</span> <span class="keyword-directive">void</span> stop() <span class="keyword-directive">throws</span> Exception {
<span class="line-number">26</span>         <span class="comment">/**</span>
<span class="line-number">27</span> <span class="comment">         * </span><span class="comment">Tutaj</span> <span class="comment">zakańczamy</span> <span class="comment">aplikację</span><span class="comment">.</span>
<span class="line-number">28</span>          <span class="comment">*/</span>
<span class="line-number">29</span>     }
<span class="line-number">30</span>
<span class="line-number">31</span>     <span class="keyword-directive">public</span> <span class="keyword-directive">void</span> destroy() {
<span class="line-number">32</span>         <span class="comment">/**</span>
<span class="line-number">33</span> <span class="comment">         * </span><span class="comment">A</span> <span class="comment">tu</span> <span class="comment">powinniśmy</span> <span class="comment">zniszczyć</span> <span class="comment">obiekty</span> <span class="comment">utworzone</span> <span class="comment">przez</span> <span class="comment">funkcję</span> <span class="comment">init</span><span class="comment">()</span><span class="comment">.</span>
<span class="line-number">34</span>          <span class="comment">*</span><span class="comment">/</span>
<span class="line-number">35</span>     }
<span class="line-number">36</span> }
<span class="line-number">37</span>
<span class="line-number">38</span></pre>
<p>Ta klasa będzie odpowiedzialna za uruchamianie naszego programu. Teraz pozostała jeszcze tylko kwestia, jak to zrobić.<br />
Do uruchamiania tak spreparowanej aplikacji służy polecenie <code>jsvc</code>. Postaram się to wytłumaczyć na przykładzie:</p>
<blockquote><p><code>sudo jsvc -user [nazwa użytkownika] -debug -cp MyApp.jar myapp.Main</code> &#8211; To polecenie uruchomi opisane wyżej funkcje klasy myapp.Main, z pliku MyApp.jar. Dzięki parametrowi <code>-debug</code> zobaczymy wyjście apikacji i wszystkie błędy, jakie wystąpią. Koniecznie musimy dołączyć parametr <code>-user</code>, bo inaczej cała aplikacja będzie działała z prawami roota, a po dołączeniu tego parametru, dalsza część aplikacji przejdzie na konto użytkownika, którego podamy.</p></blockquote>
<p>I to w zasadzie wszystko. Chciałbym jeszcze tylko pokazać, jak można restartować i wyłączać daemona, bo nie da się tego zrobić w standardowy sposób. Najłatwiej to zrobić z wewnątrz naszego programu. Zauważ, że funkcja <code>init(DaemonContext dc)</code> przyjmue jako parametr obiekt DaemonContext, który umożliwia pobranie kontrolera daemona (metoda<code>getController()</code>). Właśnie Kontroler Daemona (DaemonController) umożliwia wyłączenie aplikacji metodą <code>shutdown() </code> i restart &#8211; metodą <code>reload()</code>. Wystarczy więc zachować kontroler po uruchomieniu funkcji init() i w odpowiednim czasie wykonać funkcje wyłączające.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jblew.pl/index.php/2011/08/bezpieczne-bindowanie-do-portow-1024-w-javie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Ubuntu 10.10] Brak pluginu javy w firefoxie i google chrome</title>
		<link>http://www.jblew.pl/index.php/2011/06/ubuntu-10-10-brak-pluginu-javy-w-firefoxie-i-google-chrome/</link>
		<comments>http://www.jblew.pl/index.php/2011/06/ubuntu-10-10-brak-pluginu-javy-w-firefoxie-i-google-chrome/#comments</comments>
		<pubDate>Sat, 18 Jun 2011 16:57:09 +0000</pubDate>
		<dc:creator>JBLew</dc:creator>
				<category><![CDATA[Bez kategorii]]></category>

		<guid isPermaLink="false">http://www.jblew.pl/?p=379</guid>
		<description><![CDATA[W nowym ubuntu przykrą niespodzianką jest brak pluginu javy. Nie ma go też w domyślnych repozytoriach. Na szczęście można go zainstalować. Najpierw należy wejść do Synaptica, w Ustawienia > Repozytoria, a tam Inne Oprogramowanie i zaznaczyć &#8222;Partnerzy Canonical&#8221;. Następnie trzeba kliknąć &#8222;odśwież&#8221; w głównym oknie Synaptica i zainstalować &#8222;sun-java6-plugin&#8221;. Potem wystarczy tylko zrestartować przeglądarkę, i [...]]]></description>
			<content:encoded><![CDATA[<p>W nowym ubuntu przykrą niespodzianką jest brak pluginu javy. Nie ma go też w domyślnych repozytoriach. Na szczęście można go zainstalować. Najpierw należy wejść do Synaptica, w Ustawienia > Repozytoria, a tam Inne Oprogramowanie i zaznaczyć &#8222;Partnerzy Canonical&#8221;. Następnie trzeba kliknąć &#8222;odśwież&#8221; w głównym oknie Synaptica i zainstalować &#8222;sun-java6-plugin&#8221;. Potem wystarczy tylko zrestartować przeglądarkę, i po sprawie. <img src='http://www.jblew.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.jblew.pl/index.php/2011/06/ubuntu-10-10-brak-pluginu-javy-w-firefoxie-i-google-chrome/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[Ubuntu] Nie da się wączyć bluetooth</title>
		<link>http://www.jblew.pl/index.php/2011/06/ubuntu-nie-da-sie-waczyc-bluetooth/</link>
		<comments>http://www.jblew.pl/index.php/2011/06/ubuntu-nie-da-sie-waczyc-bluetooth/#comments</comments>
		<pubDate>Thu, 16 Jun 2011 14:29:46 +0000</pubDate>
		<dc:creator>JBLew</dc:creator>
				<category><![CDATA[Bez kategorii]]></category>
		<category><![CDATA[bluetooth]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.jblew.pl/?p=374</guid>
		<description><![CDATA[Miałem dzisiaj taki problem, że nie mogłem ponownie włączyć bluetooth na moim laptopie. Cały czas pokazywał mi się przycisk włącz bluetooth. Najwyraźniej jest to jakiś błąd w nowej wersji (11.04), bo wcześniej nie miałem takiego problemu. Na szczęście, żeby to naprawić wystarczy wpisać w terminalu sudo /etc/init.d/bluetooth restart, i po sprawie.]]></description>
			<content:encoded><![CDATA[<p>Miałem dzisiaj taki problem, że nie mogłem ponownie włączyć bluetooth na moim laptopie. Cały czas pokazywał mi się przycisk włącz bluetooth. Najwyraźniej jest to jakiś błąd w nowej wersji (11.04), bo wcześniej nie miałem takiego problemu. Na szczęście, żeby to naprawić wystarczy wpisać w terminalu <code>sudo /etc/init.d/bluetooth restart</code>, i po sprawie. <img src='http://www.jblew.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.jblew.pl/index.php/2011/06/ubuntu-nie-da-sie-waczyc-bluetooth/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>java.lang.IllegalStateException: Cannot find the system Java compiler. Check that your class path includes tools.jar</title>
		<link>http://www.jblew.pl/index.php/2011/05/java-lang-illegalstateexception-cannot-find-the-system-java-compiler-check-that-your-class-path-includes-tools-jar/</link>
		<comments>http://www.jblew.pl/index.php/2011/05/java-lang-illegalstateexception-cannot-find-the-system-java-compiler-check-that-your-class-path-includes-tools-jar/#comments</comments>
		<pubDate>Mon, 09 May 2011 17:29:02 +0000</pubDate>
		<dc:creator>JBLew</dc:creator>
				<category><![CDATA[Bez kategorii]]></category>

		<guid isPermaLink="false">http://www.jblew.pl/?p=376</guid>
		<description><![CDATA[Tak się zdarzyło, że do progów używam jednak dynamicznej kompilacji, gdyż skrypty w javax.script.* zbyt wolno chodziły na serwerze. Dynamiczny kompilator wymaga jednak &#8222;tools.jar&#8221; do poprawnej pracy. Jeśli uruchamia się program z wykorzystaniem jre (zamiast jdk) możemy dostać taki wyjątek, jak w temacie. Rozwiązanie jest proste. Wystarczy zainstalować jdk: apt-get install openjdk-6-jdk. I gotowe.]]></description>
			<content:encoded><![CDATA[<p>Tak się zdarzyło, że do progów używam jednak dynamicznej kompilacji, gdyż skrypty w javax.script.* zbyt wolno chodziły na serwerze. Dynamiczny kompilator wymaga jednak &#8222;tools.jar&#8221; do poprawnej pracy. Jeśli uruchamia się program z wykorzystaniem jre (zamiast jdk) możemy dostać taki wyjątek, jak w temacie.</p>
<p>Rozwiązanie jest proste. Wystarczy zainstalować jdk: <code>apt-get install openjdk-6-jdk</code>. I gotowe.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jblew.pl/index.php/2011/05/java-lang-illegalstateexception-cannot-find-the-system-java-compiler-check-that-your-class-path-includes-tools-jar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jak zwiększyć zużycie ramu w Javie</title>
		<link>http://www.jblew.pl/index.php/2011/03/jak-zwiekszyc-zuzycie-ramu-w-javie/</link>
		<comments>http://www.jblew.pl/index.php/2011/03/jak-zwiekszyc-zuzycie-ramu-w-javie/#comments</comments>
		<pubDate>Sat, 12 Mar 2011 15:23:41 +0000</pubDate>
		<dc:creator>JBLew</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[mud]]></category>
		<category><![CDATA[optymalizacja]]></category>
		<category><![CDATA[ram]]></category>

		<guid isPermaLink="false">http://www.jblew.pl/?p=355</guid>
		<description><![CDATA[We wszystkich podręcznikach o programowaniu przytacza się zasadę, że kodu nie wolno optymalizować. I nawet nie próbuj programisto, bo popsujesz! Nie jestem zwolennikiem takiego myślenia, bowiem czasem zdarza się, że napiszemy bardzo nieoptymalny kod i warto go zoptymalizować (oczywiście, cudzego kodu optymalizować nie wypada ;P). Dlaczego to piszę? Jak we wszystkich poprzednich postach, znowu muszę [...]]]></description>
			<content:encoded><![CDATA[<p>We wszystkich podręcznikach o programowaniu przytacza się zasadę, że kodu nie wolno optymalizować. I nawet nie próbuj programisto, bo popsujesz! Nie jestem zwolennikiem takiego myślenia, bowiem czasem zdarza się, że napiszemy bardzo nieoptymalny kod i warto go zoptymalizować (oczywiście, cudzego kodu optymalizować nie wypada ;P).</p>
<p>Dlaczego to piszę? Jak we wszystkich poprzednich postach, znowu muszę wspomnieć o mudzie&#8230; Podczas pisania zauważyłem, że gdy użytkownik wyda jakąkolwiek komendę, zużycie ramu zwiększa się nawet o 50kb! Na szczęście szybko znalazłem przyczynę. Okazało się, że, jak zwykle winny jest programista, a nie kto inny. Otóż gdy użytkownik wpisywał komendę tworzona była nowa klasa Command, która tą komendę przetwarzała. I tu był błąd! Przy każdym tworzeniu tej klasy kompilator musiał zarezerwować pamięć. Szybko zorientowałem się, o co chodzi i poprawiłem kod tak, że klasa Command jest tworzona, gdy użytkownik wejdzie do gry, a potem jest wywoływana tylko jej metoda. Wspaniały profiler netbeansa pokazał wyraźnie różnicę w zużyciu pamięci.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jblew.pl/index.php/2011/03/jak-zwiekszyc-zuzycie-ramu-w-javie/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Skrypty w javie&#8230;</title>
		<link>http://www.jblew.pl/index.php/2011/03/skrypty-w-javie-nie-nie-chodzi-mi-o-javascript/</link>
		<comments>http://www.jblew.pl/index.php/2011/03/skrypty-w-javie-nie-nie-chodzi-mi-o-javascript/#comments</comments>
		<pubDate>Fri, 11 Mar 2011 17:31:29 +0000</pubDate>
		<dc:creator>JBLew</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mud]]></category>
		<category><![CDATA[skrypty]]></category>

		<guid isPermaLink="false">http://www.jblew.pl/?p=356</guid>
		<description><![CDATA[Jak już wcześniej pisałem już od pewnego czasu piszemy muda w czystej javie. Mamy już sporo funkcji i obsługę wieli mudowych problemów, w związku z czym nadszedł czas na rozpoczęcie tworzenia obsługi MOB-ów, czyli postaci sterowanych przez komputer. Każdy mob ma swój program, nazywany mobprogiem. Cały problem polega na tym, żeby móc edytować program moba [...]]]></description>
			<content:encoded><![CDATA[<p>Jak już wcześniej pisałem już od pewnego czasu piszemy muda w czystej javie. Mamy już sporo funkcji i obsługę wieli mudowych problemów, w związku z czym nadszedł czas na rozpoczęcie tworzenia obsługi MOB-ów, czyli postaci sterowanych przez komputer. Każdy mob ma swój program, nazywany mobprogiem. Cały problem polega na tym, żeby móc edytować program moba bez ponownej kompilacji całego programu. Dość długo szukałem optymalnego rozwiązania. Zastanawiałem się m.in. nad dynamicznym kompilowaniem kodu, nad językiem lua&#8230;</p>
<p><strong>Ale najlepsze okazało się dedykowane API dla skryptów &#8211; javax.script.</strong></p>
<p>Jest bardzo proste w obsłudze. Poniżej przedstawiamprzykład i opis:</p>
<p><code><br />
package scriptingtest;</code></p>
<p><code>import javax.script.ScriptEngine;<br />
import javax.script.ScriptEngineManager;<br />
import javax.script.ScriptException;</code></p>
<p><code>public class Main {<br />
public static void main(String[] args) throws ScriptException {<br />
ScriptEngineManager factory = new ScriptEngineManager();<br />
ScriptEngine engine = factory.getEngineByName("JavaScript");</code></p>
<p><code>Proba p = new Proba(); //zawiera tylko pole int i</p>
<p>engine.put("p", p);<br />
p.i = 7;<br />
System.out.println(p.i);</p>
<p>engine.eval(""<br />
+ "importPackage(java.lang);"<br />
+ "importClass(Packages.scriptingtest.Proba);"<br />
+ ""<br />
+ "p.i = 2;");</p>
<p></code></p>
<p><code> System.out.println(p.i);<br />
}<br />
}<br />
</code><br />
Klasa Próba zawiera tylko pole <strong>public int i = 0; </strong>. Uruchamiając program zobaczymy, że skrypt zmieni wartość i z 7 na 2. To wszystko. Jak widać jest to bardzo proste i może być przydatne w dużych aplikacjach, szczególnie w grach.</p>
<p>Należy tylko pamiętać, że jeśli chcemy zaimportować jakąś klasę z wewnątrz jara, w którym uruchamiamy program, muśimy dodać na początku <strong>Packages.nazwapakietu</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jblew.pl/index.php/2011/03/skrypty-w-javie-nie-nie-chodzi-mi-o-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dlaczego debian na serwerze jest fajniejszy niż ubuntu?</title>
		<link>http://www.jblew.pl/index.php/2011/02/dlaczego-debian-na-serwerze-jest-fajniejszy-niz-ubuntu/</link>
		<comments>http://www.jblew.pl/index.php/2011/02/dlaczego-debian-na-serwerze-jest-fajniejszy-niz-ubuntu/#comments</comments>
		<pubDate>Fri, 18 Feb 2011 17:41:23 +0000</pubDate>
		<dc:creator>JBLew</dc:creator>
				<category><![CDATA[Administracja]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[mud]]></category>
		<category><![CDATA[ram]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.jblew.pl/?p=339</guid>
		<description><![CDATA[Na ubuntu było &#62;100mb&#8230;]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://www.jblew.pl/wp-content/uploads/2011/02/zrzut_ekranu-1.png" rel="lightbox[339]"><img class="aligncenter size-full wp-image-348" title="Serwer vps debian" src="http://www.jblew.pl/wp-content/uploads/2011/02/zrzut_ekranu-1.png" alt="" width="557" height="304" /></a><strong>Na ubuntu było &gt;100mb&#8230;</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.jblew.pl/index.php/2011/02/dlaczego-debian-na-serwerze-jest-fajniejszy-niz-ubuntu/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Marines MUD &#8211; W pogoni za RAMem</title>
		<link>http://www.jblew.pl/index.php/2011/02/marines-mud-w-pogoni-za-ramem/</link>
		<comments>http://www.jblew.pl/index.php/2011/02/marines-mud-w-pogoni-za-ramem/#comments</comments>
		<pubDate>Sun, 06 Feb 2011 12:36:31 +0000</pubDate>
		<dc:creator>JBLew</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[mud]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ram]]></category>

		<guid isPermaLink="false">http://www.jblew.pl/?p=338</guid>
		<description><![CDATA[Od dwóch tygodni piszemy z Progtrykiem MUD-a. MUD był jego pomysłem, ale postanowiłem przyłączyć się do projektu. MUD nazywa się Marines. Akcja toczy się w roku 2063, zaraz po III Wojnie Światowej. Ponieważ III Wojna Światowa rozciągała się niemiłosiernie długo, i istniała realna groźba zniszczenia przez ludzi naszej błękitnej planety, ktoś w jakiś sposób zniszczył [...]]]></description>
			<content:encoded><![CDATA[<p>Od dwóch tygodni piszemy z Progtrykiem MUD-a. MUD był jego pomysłem, ale postanowiłem przyłączyć się do projektu. MUD nazywa się Marines. Akcja toczy się w roku 2063, zaraz po III Wojnie Światowej. Ponieważ III Wojna Światowa rozciągała się niemiłosiernie długo, i istniała realna groźba zniszczenia przez ludzi naszej błękitnej planety, ktoś w jakiś sposób zniszczył wszystkie nowoczesne bronie i sprawił, że ludzie zapomnieli dla kogo walczą. W jednej chwili przestały istnieć państwa i hierarchia. Zapanował totalny chaos i anarchia. W grze, każdy walczy sam, przeciwko innym graczom. Na domiar złego, natura wybrała akurat ten moment, aby przemagnesować bieguny, w rezultacie czego, zmieniły się kontynenty i ziemia wygląda zupełnie inaczej. No, to tyle o historii. Potem ją dopracujemy i wrzucimy na stronę muda (<a href="http://marines.jblew.pl">marines.jblew.pl</a>). Jeśli ktoś ma ochotę wypróbować muda, to zapraszam:<br />
<code>telnet 91.210.130.79 9000</code></p>
<p><strong>Kod</strong></p>
<p>No to teraz opowiem troche o kodzie. Gdyby ktoś chciał go obejrzeć, może to uczynić przez Subversion. <strong>Bieżąca wersja projektu znajduje się w folderze v2</strong>:<br />
<code>svn co svn://91.210.130.79/marines-mud marines-mud</code></p>
<p>Na samym początku postanowiliśmy, że podzielimy muda na program serwera i skrypt obsługujący użytkownika (oddzielny dla każdego usera). Po uruchomieniu serwer oczekiwał na nadchodzące połączenia. Gdy już jakieś zaakceptował, przenosił je do oddzielnego wątku i uruchamiłałał skrypt do obsługi użytkownika. Wątek odbierał dane do użytkownika, aby wysyłać je do skryptu i vice versa.</p>
<p>Pierwsza wersja muda była oparta na architekturze <strong>JAVA+PHP+MYSQL</strong>. OMG!? No właśnie&#8230; nie najszczęśliwsze połączenie. Problemem tej wersji była właściwie tylko java. Java jest fajna do programowania, bo prawie wszystko robi za programistę i zawiera mnóstwo bibliotek, które znacznie ułatwiają pracę. Zaraz, zaraz! Mnóstwo bibliotek = mnóstwo zużywanej pamięci! Największym problemem &#8222;javovej&#8221; wersji było horrendalne zużycie ramu. Na początek skrypt zabierał ok 70mb ramu, a potem zabierał kolejne 16mb na każdego użytkownika. Koszmar!</p>
<p>Zaraz potem próbowaliśmy szczęścia z pythonem zamiast javy. Jednak z pythonem był taki problem, że nijak nie mogliśmy zmusić biblioteki socketserver aby umożliwiła nam ponowne używanie portu.</p>
<p>Wreszcie postanowiliśmy w roli serwera użyć programu napisanego w c++. Nadal jednak mieliśmy problemy, tym bardzoej, że żaden z nas nie był doświadczonym programistą tego zacnego języka.</p>
<p>Ostatecznie zdecydowaliśmy się scalić skrypt z serwerem i tak powstała najnowsza wersja muda, w całości napisana w php. Sprawuje się bardzo dobrze, nie zużywa nadmiernie pamięci i ogólnie jestem z niej bardzo zadowolony. Dlatego opiszę ją dokładniej.</p>
<h3>Wielowątkowość w php</h3>
<p>Wiele lat myślałem że to niemożliwe. Cały czas zdawało mi się, że w php nie ma wielowątkowości. Kilka dni temu dowiedziałem się, że jednak jest! Ale tylko w systemach﻿ uniksowych. Jako, że jestem już <a href="http://www.jblew.pl/index.php/2009/11/jak-zostalem-posiadaczem-ubuntu/" target="_blank">szczęśliwym posiadaczem ubuntu</a>, nie stanowi to żadnego problemu. Znalazłem też w sieci <a href="http://blog.motane.lu/2009/01/02/multithreading-in-php/" target="_self">fajną klasę, która umożliwia czytelniejszą obsługę wątków w obiektowym stylu.</a> Dzięki tej klasie obsługa wątków jest dziecinnie prosta. Autor zamieścił przykłady jej zastosowań.</p>
<h3>Pierwsze uruchomienie</h3>
<p>Jeśli ktoś chce uruchomić u siebie serwer, albo stworzyć innego muda na podstawie kodu, nie ma problemu. Proszę tylko o pozostawienie informacji o autorach (można dopisać swoje autorstwo).</p>
<p>Aby uruchomić muda należy najpierw utworzyć bazę danych phpmud, a następnie zaimportować tabele z pliku ./v2/other/sql/phpmud.sql. Kolejną sprawą jest ustawienie loginu i hasła do bazy danych, w plikach: ./v2/includes/mysql.php, ./v2/includes/globalMysql.php i ./v2/lib/class.mudUser.php. We wszystkich powinny znajdować się te same dane. Potem otwieramy trzy konsole, lub trzy okna screena, jak kto woli i w jednym uruchamiamy polecenie <code>php tickers.php</code>, w drugim <code>php mobs.php</code>, a w trzecim <code>php phpMudServer.php</code>. Jeśli wszystko będzie działało, w ostatnim oknie powinniśmy zobaczyć taki ekran:</p>
<pre>   +----------------------------------+
   |   MudServer For PHP Muds v0.51   |
   +----------------------------------+
   |   Written by:                    |
   |        +JBLEW (www.jblew.pl)     |
   |        +PROGTRYK                 |
   +----------------------------------+

Setting server online...
Starting console reader...
Wpisz quit aby zakończyć program.
Starting SVNUpdater...
Listening on port 9000...
[0s od uruchomienia] Mysqli działa prawidłowo!
W wersji 418.</pre>
<h3>Jak to wszystko działa?</h3>
<p>Skoro już uruchomiłeś muda, to opiszę teraz, jak on działa.<br />
Pierwszy uruchomiony program &#8211; tickers.php jest mudowym odpowiednikiem crona. Tam wykonują się wszystkie periodyczne operacje, jak np. informowanie użytkowników o dniu/nocy, czy resetowanie obiektów w roomach.</p>
<p>Drugi program &#8211; mobs.php docelowo będzie obsługiwał moby, narazie jednak nie robi nic. Możesz go wyłączyć.</p>
<p>Najważniejszy jest trzeci skrypt &#8211; phpMudServer.php &#8211; to on obsługuje całego muda i co 30 sekund aktualizuje SVN.  Otwórz teraz w jakimś edytorze ten plik i zjedź aż do miejsca, gdzie znajduje się polecenie set_time_limit(0); Z pewnością wiesz, po co je tam umieściłem. Prawdziwa zabawa zaczyna się dopiero od linijki set_server_online(&#8222;1&#8243;);. Funkcja ta wpisuje &#8222;1&#8243; do pliku data/online.dat, co jest dla skryptów znakiem, że serwer pracuje. Dalej uruchamiamy wątek consoleReader, który odczytuje kolejne linie z stdin i oczekuje aż wpiszemy quit. Wtedy wykona polecenie set_server_online(&#8222;0&#8243;);, dzięki czemu reszta wątków będzie wiedziała, że czas się wyłączyć. Dalej tworzymy nasłuchujące gniazdo, a potem w pętli oczekujemy połączenia, przy okazji co sekundę wysyłając bezsensowne polecenie do mysql-a, aby utrzymać połączenie. Gdy nowy użytkownik się połączy, serwer uruchamia wątek userThread. Przenieśmy się zatem do tej funkcji. Tworzy ona klasę MudUser i przekazuje jej gniazdo, oraz wątek. Następnie wywołuje metodę run, i od teraz użytkonik jest przenoszony do skryptu ./v2/lib/class.mudUser.php.</p>
<p>No. Na dzisiaj to wystarczy, jutro, albo pojutrze opiszę, co się dalej dzieje w tej klasie. Dziękuję za uwagę!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jblew.pl/index.php/2011/02/marines-mud-w-pogoni-za-ramem/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[PHP] Prosty sposób na odczytywanie danych XML</title>
		<link>http://www.jblew.pl/index.php/2011/01/php-prosty-sposob-na-odczytywanie-danych-xml/</link>
		<comments>http://www.jblew.pl/index.php/2011/01/php-prosty-sposob-na-odczytywanie-danych-xml/#comments</comments>
		<pubDate>Wed, 12 Jan 2011 16:58:31 +0000</pubDate>
		<dc:creator>JBLew</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[domdocument]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://www.jblew.pl/?p=326</guid>
		<description><![CDATA[Jak zapewne zauważyliście dodałem na bloga skrypt wyświetlający wpisy z twittera między wpisami z bloga. Zanim jednak można będzie wyświetlić dane, trzeba je najpierw pobrać z serwera. Najłatwiejszym sposobem na pobranie wpisów twittera jest odczytanie kanału rss danego użytkownika. Z każdego znacznika &#60;item&#62; (w kanale rss) potrzebujemy 3 znaczników: &#60;title&#62;, &#60;pubDate&#62; i &#60;link&#62;. Niektórzy pewnie [...]]]></description>
			<content:encoded><![CDATA[<p>Jak zapewne zauważyliście dodałem na bloga skrypt wyświetlający wpisy z twittera między wpisami z bloga. Zanim jednak można będzie wyświetlić dane, trzeba je najpierw pobrać z serwera. Najłatwiejszym sposobem na pobranie wpisów twittera jest odczytanie kanału rss danego użytkownika.</p>
<p>Z każdego znacznika &lt;<strong>item</strong>&gt; (w kanale rss) potrzebujemy<strong> </strong>3 znaczników: &lt;<strong>title</strong>&gt;, &lt;<strong>pubDate</strong>&gt; i &lt;<strong>link</strong>&gt;.</p>
<p>Niektórzy pewnie chcieliby pewnie wyciągnąć te dane używając wyrażeń regularnych. Do dzisiaj należałem do tych ludzi. Używanie bibliotek parsujących xml wydawało mi się skomplikowane i nieprzyjemne. Jednak w istocie tak nie jest. PHP posiada łatwą w użyciu bibliotekę <strong>DOMDocument</strong>. W naszym wypadku kod jest naprawdę krótki:<br />
<code><br />
$objDOM&nbsp;=&nbsp;new&nbsp;DOMDocument();<br />
&nbsp;&nbsp;&nbsp;&nbsp;//pobieramy&nbsp;kanal&nbsp;rss&nbsp;i&nbsp;tworzymy&nbsp;liste&nbsp;zawierajaca&nbsp;elementy&nbsp;ITEM<br />
$objDOM-&gt;load(&quot;http://adres.kanalu.rss/z/twittera&quot;);&nbsp;<br />
$items&nbsp;=&nbsp;$objDOM-&gt;getElementsByTagName(&quot;item&quot;);</p>
<p>foreach(&nbsp;$items&nbsp;as&nbsp;$item&nbsp;)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;//w&nbsp;petli&nbsp;wyciagamy&nbsp;wartosci&nbsp;z&nbsp;poszczegolnych&nbsp;znacznikow<br />
&nbsp;&nbsp;&nbsp;&nbsp;$title&nbsp;&nbsp;=&nbsp;$item-&gt;getElementsByTagName(&quot;title&quot;)-&gt;item(0)-&gt;nodeValue;<br />
&nbsp;&nbsp;&nbsp;&nbsp;$pubDate&nbsp;=&nbsp;$item-&gt;getElementsByTagName(&quot;pubDate&quot;)-&gt;item(0)-&gt;nodeValue;<br />
&nbsp;&nbsp;&nbsp;&nbsp;$link&nbsp;=&nbsp;$item-&gt;getElementsByTagName(&quot;link&quot;)-&gt;item(0)-&gt;nodeValue;<br />
}</p>
<p></code></p>
<p>Jak widzicie korzystanie z tej biblioteki to czysta przyjemność. <img src='http://www.jblew.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Wszystko można zrobić szybko i sprawnie. Kod łatwo jest zmodyfikować do swoich potrzeb.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jblew.pl/index.php/2011/01/php-prosty-sposob-na-odczytywanie-danych-xml/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bezpieczeństwo haseł w bazie danych</title>
		<link>http://www.jblew.pl/index.php/2011/01/bezpieczenstwo-hasel-w-bazie-danych/</link>
		<comments>http://www.jblew.pl/index.php/2011/01/bezpieczenstwo-hasel-w-bazie-danych/#comments</comments>
		<pubDate>Fri, 07 Jan 2011 13:28:38 +0000</pubDate>
		<dc:creator>JBLew</dc:creator>
				<category><![CDATA[Bezpieczeństwo]]></category>
		<category><![CDATA[bezpieczeństwo]]></category>
		<category><![CDATA[hash]]></category>
		<category><![CDATA[md5]]></category>

		<guid isPermaLink="false">http://www.jblew.pl/?p=263</guid>
		<description><![CDATA[Zauważyłem, że bardzo powszechne jest stwierdzenie, iż o bezpieczeństwie haseł decyduje ich długość, natomiast całkowicie zapomina się w tym momencie o algorytmie, który tworzy skrót. Na bardzo wielu stronach tworzenie skrótu wygląda tak: md5($hash). Funkcja jest bardzo prosta, wykonuje się szybko&#8230; No właśnie, wykonuje się szybko&#8230; Działa to bardzo na korzyść hakera, który najczęściej, aby [...]]]></description>
			<content:encoded><![CDATA[<p>Zauważyłem, że bardzo powszechne jest stwierdzenie, iż o bezpieczeństwie haseł decyduje ich długość, natomiast całkowicie zapomina się w tym momencie o algorytmie, który tworzy skrót. Na bardzo wielu stronach tworzenie skrótu wygląda tak: <code>md5($hash)</code>. Funkcja jest bardzo prosta, wykonuje się szybko&#8230;<br />
No właśnie, wykonuje się szybko&#8230; Działa to bardzo na korzyść hakera, który najczęściej, aby poznać hasło, szyfruje (takim samym algorytmem) po kolei miliony ciągów znaków i porównuje z hashem wykradzionym z naszej bazy danych. W jego interesie jest to, aby wszystko odbyło się jak najszybciej.<br />
Natomiast właściciel strony internetowej, zwykle, nie musi porównywać milionów ciągów na sekundę, więc może sobie pozwolić na nieco dłuższe wykonywanie kodu.<br />
Postanowiłem wykonać kilka pomiarów na swoim komputerze. Tworzenie skrótu <code>md5("test");</code> trwa ok. 16us. Natomiast poniższy kod:<br />
<code><br />
$str = md5("test");<br />
for($i = 1;$i &lt; 5000;$i++) {<br />
$str = md5(base64_encode($str));<br />
}<br />
</code><br />
wokonuje się w 8000us, czyli 8ms, czyli 0.008 sekundy. Cóż to jest dla systemu&#8230; Użytkownik nawet nie mrugnie, gdy skróty jego haseł zostaną porównane. Jednak haker będzie przez to łamał hasło 500 razy dłużej!</p>
<p>Oczywiście to &#8222;zabezpieczenie&#8221; będzie użyteczne dopiero gdy hakerowi uda się włamać na stronę, jednak nie możemy wykluczać takiego przypadku, a każda forma obrony naszej witryny jest warta zastosowania!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jblew.pl/index.php/2011/01/bezpieczenstwo-hasel-w-bazie-danych/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

