<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;AkQBQX0zcCp7ImA9WhVTF0w.&quot;"><id>tag:blogger.com,1999:blog-2570390285559898162</id><updated>2012-03-02T20:59:10.388+01:00</updated><category term="Grafika" /><category term="PHP" /><category term="Hamachi" /><category term="bshellz.net" /><category term="Kompresja" /><category term="news" /><category term="Linux" /><category term="Dithering" /><category term="VirtualBox" /><category term="DOSBox" /><category term="bezpieczeństwo" /><category term="Packet Tracer" /><category term="Steam" /><category term="Film" /><category term="Windows" /><category term="JavaScript" /><category term="PPM" /><category term="Gry" /><title>LunarIT</title><subtitle type="html">...czyli Lunar radzi :)</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://runaurufu.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://runaurufu.blogspot.com/" /><author><name>Damian Pawlik</name><uri>https://profiles.google.com/110162926853117833033</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-S94uikQs-MY/AAAAAAAAAAI/AAAAAAAAAEU/VXGkqwGc4g8/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>25</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/LunarIT" /><feedburner:info uri="lunarit" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;DUMFRX89eip7ImA9WhRbFEo.&quot;"><id>tag:blogger.com,1999:blog-2570390285559898162.post-1984624441628016974</id><published>2012-02-05T22:12:00.000+01:00</published><updated>2012-02-05T22:30:14.162+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-05T22:30:14.162+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Film" /><category scheme="http://www.blogger.com/atom/ns#" term="Windows" /><category scheme="http://www.blogger.com/atom/ns#" term="Kompresja" /><title>Zabawa z Windows (Live) Movie Maker</title><content type="html">Windows Movie Maker jest przyjaznym programikiem do tworzenia filmów nawet przez osoby całkiem zielone w tym temacie. To czym jednak zajmiemy się w tym wpisie, to nie tyle tworzenie filmów, co tworzenie konfiguracji użytej przy konwersji naszego dzieła do finalnej postaci. Ale o co chodzi? Cóż w najprostszym ujęciu chodzi o redukcję rozmiaru filmu przy minimalnej redukcji odczuwalnej jakości obrazu (odczuwalnej, gdyż ta realna cierpi bardzo).&lt;br /&gt;
&lt;br /&gt;
Na sam początek kilka przykładów tego na co pozwalają opcje konfiguracji WMM. Do tego pokazu użyłem małej składanki nagrań z gry StarCraft II, a rezultaty przedstawiam poniżej w tabeli (polecam podglądanie filmików na pełnym ekranie i w "jakości" 720p [tzw. HD], by móc dokładniej ocenić jakość efektu końcowego).&lt;br /&gt;
&lt;br /&gt;
&lt;table border="1" style="width: 100%;"&gt;
&lt;tbody&gt;
&lt;tr align="center"&gt;&lt;th&gt;Jakość kompresji filmu&lt;/th&gt;&lt;th&gt;Rozmiar&lt;/th&gt;&lt;th&gt;Podgląd&lt;/th&gt;&lt;/tr&gt;
&lt;tr align="center"&gt;&lt;td&gt;Oryginał ~7000 kb/s&lt;/td&gt;&lt;td&gt;81.0 MiB&lt;/td&gt;&lt;td&gt;&lt;iframe allowfullscreen="" frameborder="0" height="168" src="http://www.youtube-nocookie.com/embed/MsaJiTFZz5c" width="350"&gt;&lt;/iframe&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr align="center"&gt;&lt;td&gt;6000 kb/s&lt;/td&gt;&lt;td&gt;75.5 MiB&lt;/td&gt;&lt;td&gt;&lt;iframe allowfullscreen="" frameborder="0" height="168" src="http://www.youtube-nocookie.com/embed/TgBu4L9VDc0" width="350"&gt;&lt;/iframe&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr align="center"&gt;&lt;td&gt;5000 kb/s&lt;/td&gt;&lt;td&gt;65.7 MiB&lt;/td&gt;&lt;td&gt;&lt;iframe allowfullscreen="" frameborder="0" height="168" src="http://www.youtube-nocookie.com/embed/uzaF2aZKS3k" width="350"&gt;&lt;/iframe&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr align="center"&gt;&lt;td&gt;4000 kb/s&lt;/td&gt;&lt;td&gt;54.3 MiB&lt;/td&gt;&lt;td&gt;&lt;iframe allowfullscreen="" frameborder="0" height="168" src="http://www.youtube-nocookie.com/embed/YDVtO1tSkuw" width="350"&gt;&lt;/iframe&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr align="center"&gt;&lt;td&gt;3000 kb/s&lt;/td&gt;&lt;td&gt;42.3 MiB&lt;/td&gt;&lt;td&gt;&lt;iframe allowfullscreen="" frameborder="0" height="168" src="http://www.youtube-nocookie.com/embed/yYe08tD1eK4" width="350"&gt;&lt;/iframe&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr align="center"&gt;&lt;td&gt;2000 kb/s&lt;/td&gt;&lt;td&gt;30.2 MiB&lt;/td&gt;&lt;td&gt;&lt;iframe allowfullscreen="" frameborder="0" height="168" src="http://www.youtube-nocookie.com/embed/wRNirsmwITA" width="350"&gt;&lt;/iframe&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr align="center"&gt;&lt;td&gt;1000 kb/s&lt;/td&gt;&lt;td&gt;17.9 MiB&lt;/td&gt;&lt;td&gt;&lt;iframe allowfullscreen="" frameborder="0" height="168" src="http://www.youtube-nocookie.com/embed/5POHfMM52S4" width="350"&gt;&lt;/iframe&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr align="center"&gt;&lt;td&gt;500 kb/s&lt;/td&gt;&lt;td&gt;11.5MB&lt;/td&gt;&lt;td&gt;&lt;iframe allowfullscreen="" frameborder="0" height="168" src="http://www.youtube-nocookie.com/embed/98GF-bZY1nw" width="350"&gt;&lt;/iframe&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr align="center"&gt;&lt;td&gt;200 kb/s&lt;/td&gt;&lt;td&gt;7.62 MiB&lt;/td&gt;&lt;td&gt;&lt;iframe allowfullscreen="" frameborder="0" height="168" src="http://www.youtube-nocookie.com/embed/5MOEFYVWy7E" width="350"&gt;&lt;/iframe&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr align="center"&gt;&lt;td&gt;100 kb/s&lt;/td&gt;&lt;td&gt;6.31 MiB&lt;/td&gt;&lt;td&gt;&lt;iframe allowfullscreen="" frameborder="0" height="168" src="http://www.youtube-nocookie.com/embed/LGroN5_bWY8" width="350"&gt;&lt;/iframe&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Zauważyliście, że wszystkie te filmy dostępne są w "HD"? Cóż to wynika z tego, że YouTube uznaje za "HD" wszystkie filmy o wysokości powyżej 720 pikseli. Ponad półtorej minuty HD zajmujące 6MiB? Mniami ;]&lt;br /&gt;
&lt;br /&gt;
To nad czym warto się tutaj zastanowić (a co w zasadzie jest jednym z powodów powstania tego wpisu) to to czy warto wysyłać filmy w tak wysokiej jakości (6k lub więcej kb/s) na YouTube skoro one i tak są potem kompresowane do formatu mp4. Rezultatem tej kompresji jest to, że finalny odbiorca nie widzi tak naprawdę wielkiej różnicy w jakości... Rozmyślanie to oczywiście dotyczy głównie sytuacji gdy mamy słabe łącze (niski limit uploadu) ograniczające możliwość szerzenia naszej twórczości, bo jeśli wrzucenie 1GiB filmu zajmuje nam czas np. ok. 10min&amp;nbsp; to zaprawdę taka zabawa z kompresją mija się z celem ;] &lt;br /&gt;
&lt;br /&gt;
Ale przejdźmy do sedna - czyli jak sprawić by szybko (bo WMM działa bardzo szybko w porównaniu do innych programów - w tym komercyjnych kosztujących grubą kasę) zredukować rozmiar filmu?&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-gupGvinbfYI/Ty7mPPUGcFI/AAAAAAAAAQ8/YcdBxWqHeG0/s1600/Dwm+2012-02-05+20-40-40-21.bmp" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="489" src="http://4.bp.blogspot.com/-gupGvinbfYI/Ty7mPPUGcFI/AAAAAAAAAQ8/YcdBxWqHeG0/s640/Dwm+2012-02-05+20-40-40-21.bmp" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Wybieramy z menu programu opcję "Zapisz film", a następnie "Utwórz ustawienia niestandardowe". Pojawi się nam nowe okienko zaprezentowane poniżej.&lt;br /&gt;
Po ukończeniu konfiguracji z tego samego menu będziemy mogli użyć zdefiniowanej konwersji do zapisu naszego filmu (użyte przeze mnie konfiguracje to właśnie te widoczne 1280x720 - xk)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-gO3VhkrJF3E/Ty7mLVYaMjI/AAAAAAAAAQ0/jjB6vFTb5G0/s1600/Dwm+2012-02-05+20-40-52-98.bmp" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-gO3VhkrJF3E/Ty7mLVYaMjI/AAAAAAAAAQ0/jjB6vFTb5G0/s1600/Dwm+2012-02-05+20-40-52-98.bmp" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;To okno pozwala nam zdefiniować konfigurację tworzonego filmu - efekt działania kompresji WMM.&lt;br /&gt;
Opcja która ma dla nas największe znaczenie to "Szybkość transmisji bitów". Wartości powyżej 6k są na Youtubie w zasadzie uznawane za HD, choć np. efekt działania Frapsa w przypadku SC2 to powyżej 370Mb/s (ok 15MiB na sekundę filmu). Drugą ważną wartością jest Format audio, choć jego wpływ jest minimalny na rozmiar pliku (ok. 3MiB różnicy na minutę filmu pomiędzy skrajnymi ustawieniami formatu).&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Użyte profile dla WMM do stworzenia filmów pokazanych w tym wpisie można znaleźć na moim chomiku: (&lt;a href="http://chomikuj.pl/Runaurufu/Edukacja/Inne/WMM+Video+Profiles,1405236151.zip" target="_blank"&gt;link&lt;/a&gt;)&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2570390285559898162-1984624441628016974?l=runaurufu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/pWqqQPrsMdyJo75b4U18fO5d4mE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pWqqQPrsMdyJo75b4U18fO5d4mE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/pWqqQPrsMdyJo75b4U18fO5d4mE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pWqqQPrsMdyJo75b4U18fO5d4mE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LunarIT/~4/dJF6H3Ix1pU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://runaurufu.blogspot.com/feeds/1984624441628016974/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://runaurufu.blogspot.com/2012/02/zabawa-z-windows-live-movie-maker.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/1984624441628016974?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/1984624441628016974?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LunarIT/~3/dJF6H3Ix1pU/zabawa-z-windows-live-movie-maker.html" title="Zabawa z Windows (Live) Movie Maker" /><author><name>Damian Pawlik</name><uri>https://profiles.google.com/110162926853117833033</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-S94uikQs-MY/AAAAAAAAAAI/AAAAAAAAAEU/VXGkqwGc4g8/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-gupGvinbfYI/Ty7mPPUGcFI/AAAAAAAAAQ8/YcdBxWqHeG0/s72-c/Dwm+2012-02-05+20-40-40-21.bmp" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://runaurufu.blogspot.com/2012/02/zabawa-z-windows-live-movie-maker.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEQAQHc6fSp7ImA9WhRbEU0.&quot;"><id>tag:blogger.com,1999:blog-2570390285559898162.post-4366252430405493492</id><published>2012-02-01T15:25:00.000+01:00</published><updated>2012-02-01T15:25:41.915+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-01T15:25:41.915+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Steam" /><category scheme="http://www.blogger.com/atom/ns#" term="DOSBox" /><category scheme="http://www.blogger.com/atom/ns#" term="Gry" /><title>X-COM na Steamie / DOSBox</title><content type="html">Jeśli zdarzyłoby się, że ktoś byłby tak wielkim nieszczęśnikiem i zakupił trylogię X-COM poprzez Steam to cóż może czuć się po dwakroć.. a nawet trzykroć wykorzystany. Dlaczego?&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Brak wersji polskiej dla oryginalnej serii X-COM&lt;/li&gt;
&lt;li&gt;DOSBox w wersji 0.72 (na którym X-COM Apocalypse lubi się ciąć, wieszać i wyprawiać różne dziwne akcje)&lt;/li&gt;
&lt;li&gt;Konfiguracja DOSBoxa uniemożliwiająca normalną grę&lt;/li&gt;
&lt;/ul&gt;
Na pierwszy punkt wiele poradzić nie mogę - mogę jedynie napisać, że istnieją tłumaczenia na język polski do wszystkich części klasycznego X-COM (przy czym do TFTD i X-COMA oficjalne wypuszczone jeszcze przez Microprose).&lt;br /&gt;
&lt;br /&gt;
Zażegnanie problemowi z punktu drugiego jest w zasadzie banalne - wystarczy ściągnąć nowszą wersję &lt;a href="http://www.dosbox.com/" target="_blank"&gt;DOSBoxa&lt;/a&gt;, zainstalować i zastąpić nią zawartość katalogu z grą.&lt;br /&gt;
&lt;br /&gt;
Trzeci punkt wymaga z kolei edycji pliku konfiguracyjnego DOSBoxa (&lt;a href="http://www.dosbox.com/wiki/Dosbox.conf#Creation_and_Location"&gt;lokalizacja pliku konfiguracyjnego&lt;/a&gt;) i zamiany paru rzeczy:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;X-COM Ufo Defense / UFO: Enemy Unknown&lt;br /&gt;
&lt;table border="1" style="width: 90%;"&gt;&lt;tbody&gt;
&lt;tr align="center"&gt;&lt;th&gt;Konfiguracja domyślna&lt;/th&gt;&lt;th&gt;Konfiguracja po zamianie&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;[cpu]&lt;br /&gt;
cycles=auto limit 8000&lt;/td&gt;&lt;td&gt;[cpu]&lt;br /&gt;
cycles=auto limit 100000&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/li&gt;
&lt;li&gt;X-COM Terror From The Deep&lt;br /&gt;
&lt;table border="1" style="width: 90%;"&gt;&lt;tbody&gt;
&lt;tr align="center"&gt;&lt;th&gt;Konfiguracja domyślna&lt;/th&gt;&lt;th&gt;Konfiguracja po zamianie&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;[cpu]&lt;br /&gt;
cycles=auto limit 16000&lt;/td&gt;&lt;td&gt;[cpu]&lt;br /&gt;
cycles=auto limit 100000&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/li&gt;
&lt;li&gt;X-COM Apocalypse&lt;br /&gt;
Zmiana w przypadku X-COM Apocalypse ma inne podłoże niż te w przypadku poprzedniczek - tu problemem nie jest za wolna maszyna wirtualna, ale sposób wyświetlania obrazu. Więcej porad dotyczących X-COM Apocalypse i uruchamiania tej gry można znaleźć w innym wpisie na moim bloku: &lt;a href="http://runaurufu.blogspot.com/2011/07/x-com-apocalypse-i-windows-7.html"&gt;X-COM Apocalypse i Windows 7&lt;/a&gt;.
&lt;table border="1" style="width: 90%;"&gt;&lt;tbody&gt;
&lt;tr align="center"&gt;&lt;th&gt;Konfiguracja domyślna&lt;/th&gt;&lt;th&gt;Konfiguracja po zamianie&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href="http://2.bp.blogspot.com/-shvc2v7k0Y0/Tyk3QcD8k9I/AAAAAAAAAPE/evamDNss0tU/s1600/dosbox+2012-02-01+12-22-13-54.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://2.bp.blogspot.com/-shvc2v7k0Y0/Tyk3QcD8k9I/AAAAAAAAAPE/evamDNss0tU/s200/dosbox+2012-02-01+12-22-13-54.bmp" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://4.bp.blogspot.com/-4i-LBG4aHN0/Tyk3RMDjQyI/AAAAAAAAAPU/zCuPukkX8_A/s1600/dosbox+2012-02-01+12-21-47-86.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://4.bp.blogspot.com/-4i-LBG4aHN0/Tyk3RMDjQyI/AAAAAAAAAPU/zCuPukkX8_A/s200/dosbox+2012-02-01+12-21-47-86.bmp" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;[sdl]&lt;br /&gt;
output=surface&lt;/td&gt;&lt;td&gt;[sdl]&lt;br /&gt;
output=overlay&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/li&gt;
&lt;/ul&gt;
Jeśli zaś nie podoba wam się sposób skalowania i chcielibyście by był bardziej zbliżony do oryginału (bardziej pikselowaty, a nie rozmyty) to polecam również zastosować tą zamianę:
&lt;br /&gt;
&lt;table border="1" style="width: 90%;"&gt;&lt;tbody&gt;
&lt;tr align="center"&gt;&lt;th&gt;Konfiguracja domyślna&lt;/th&gt;&lt;th&gt;Konfiguracja po zamianie&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;[render]&lt;br /&gt;
scaler=advinterp2x&lt;/td&gt;&lt;td&gt;[render]&lt;br /&gt;
scaler=normal3x&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2570390285559898162-4366252430405493492?l=runaurufu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/7SjeTfvoMj4gwja5iyMZYNCGjME/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7SjeTfvoMj4gwja5iyMZYNCGjME/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/7SjeTfvoMj4gwja5iyMZYNCGjME/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7SjeTfvoMj4gwja5iyMZYNCGjME/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LunarIT/~4/eMD4y1qRwzo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://runaurufu.blogspot.com/feeds/4366252430405493492/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://runaurufu.blogspot.com/2012/02/x-com-na-steamie-dosbox.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/4366252430405493492?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/4366252430405493492?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LunarIT/~3/eMD4y1qRwzo/x-com-na-steamie-dosbox.html" title="X-COM na Steamie / DOSBox" /><author><name>Damian Pawlik</name><uri>https://profiles.google.com/110162926853117833033</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-S94uikQs-MY/AAAAAAAAAAI/AAAAAAAAAEU/VXGkqwGc4g8/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-shvc2v7k0Y0/Tyk3QcD8k9I/AAAAAAAAAPE/evamDNss0tU/s72-c/dosbox+2012-02-01+12-22-13-54.bmp" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://runaurufu.blogspot.com/2012/02/x-com-na-steamie-dosbox.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8FQ309cCp7ImA9WhRUF0s.&quot;"><id>tag:blogger.com,1999:blog-2570390285559898162.post-1736627382753249920</id><published>2012-01-21T14:14:00.004+01:00</published><updated>2012-01-28T16:33:32.368+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-28T16:33:32.368+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="news" /><title>Nie dla ACTA</title><content type="html">Nie będę się tu rozpisywał nad swoim stanowiskiem dotyczącym ACTA, gdyż zrobiłem już to &lt;a href="http://swiat-wedug-lunara.blogspot.com/2012/01/nie-dla-sopa-pipa-acta.html" target="_blank"&gt;tutaj&lt;/a&gt;. W tym poście nawiążę do skryptu na blogi i inne strony, który ma "zaciemnić stronę w ramach protestu". Mowa tu oczywiście o inicjatywie &lt;a href="http://niedlaacta.pl/" target="_blank"&gt;Nie dla ACTA&lt;/a&gt; i podstronie dotyczącej samego &lt;a href="http://niedlaacta.pl/blackout.php" target="_blank"&gt;blackoutu&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Skrypt, który jest tam zamieszczony działa... tyle, że musimy faktycznie bezpośrednio do sekcji "body"ów skrypt wkleić, bo jeśli używamy różnego rodzaju "gadżetów" dodających dynamicznie zawartość (np. &lt;i&gt;HTML/JavaScript&lt;/i&gt; w Blogspocie) to komunikat i "zaciemnienie" doda nam się tylko w owym wygenerowanym obiekcie.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Jako, że strona blackoutu zniknęła w tym całym zamieszaniu to dorzucam lekko zmodyfikowany skrypt linkujący do strony fundacji panoptykon&lt;/b&gt;&lt;br /&gt;
&lt;pre class="codeJavaScript"&gt;&amp;lt;script type="text/javascript"&amp;gt;var d=new Date();if(d.getDate()&amp;lt;=26 &amp;amp;&amp;amp; d.getMonth()==0 &amp;amp;&amp;amp; d.getFullYear() == 2012){var p="&amp;lt;div style='padding-top:150px;opacity:0.95;z-index:9999;position:fixed;top:0px;left:0px;width:100%;height:100%;background-color:#000000;font-family:Helvetica, Arial, sans-serif;color: #d7d7d7;text-align:center;'&amp;gt;"+" &amp;lt;h1 style='font-size:66px;color: #d7d7d7;'&amp;gt;Nie dla &amp;lt;strong style='color: #d30000;'&amp;gt;ACTA !&amp;lt;/strong&amp;gt;&amp;lt;/h1&amp;gt;" +" &amp;lt;h2 style='color: #d7d7d7;font-size:45px;line-height:50px;'&amp;gt;Nie dla &amp;lt;strong style='color: #d30000;'&amp;gt;cenzury internetu !&amp;lt;/strong&amp;gt;&amp;lt;/h2&amp;gt;"+" &amp;lt;a href='http://www.panoptykon.org/wiadomosc/nie-dla-acta-akcja-protestacyjna' style='color:#d7d7d7; text-decoration:none;'&amp;gt;[ Dowiedz się więcej ]&amp;lt;/a&amp;gt;"+"&amp;lt;/div&amp;gt;";document.getElementsByTagName("Body")[0].innerHTML=document.getElementsByTagName("Body")[0].innerHTML+p;}&amp;lt;/script&amp;gt;
&lt;/pre&gt;
&lt;br /&gt;
A tutaj wersja z linkiem pozwalającym na powrót do przeglądania naszej witryny
&lt;br /&gt;
&lt;pre class="codeJavaScript"&gt;&amp;lt;script type="text/javascript"&amp;gt;window.addEventListener('load', function(){var d=new Date();if(d.getDate()&amp;lt;=26 &amp;amp;&amp;amp; d.getMonth()==0 &amp;amp;&amp;amp; d.getFullYear() == 2012){var p="&amp;lt;div style='padding-top:150px;opacity:0.97;z-index:9999;position:fixed;top:0px;left:0px;width:100%;height:100%;background-color:#000000;font-family:Helvetica, Arial, sans-serif;color: #d7d7d7;text-align:center;'&amp;gt;"+" &amp;lt;h1 style='font-size:66px;color: #d7d7d7;'&amp;gt;Nie dla &amp;lt;strong style='color: #d30000;'&amp;gt;ACTA !&amp;lt;/strong&amp;gt;&amp;lt;/h1&amp;gt;" +" &amp;lt;h2 style='color: #d7d7d7;font-size:45px;line-height:50px;'&amp;gt;Nie dla &amp;lt;strong style='color: #d30000;'&amp;gt;cenzury internetu !&amp;lt;/strong&amp;gt;&amp;lt;/h2&amp;gt;"+" &amp;lt;a target='_blank' href='http://panoptykon.org/wiadomosc/nie-dla-acta-akcja-protestacyjna' style='color:#d7d7d7; text-decoration:none;'&amp;gt;[ Dowiedz się więcej ]&amp;lt;/a&amp;gt;"+" &amp;lt;a style='font-size:10px;display:block;margin:50px;' href='#' onclick='this.parentNode.parentNode.removeChild(this.parentNode);'&amp;gt;[ Ukryj apel i przeglądaj stronę ]&amp;lt;/a&amp;gt;"+"&amp;lt;/div&amp;gt;";document.getElementsByTagName("Body")[0].innerHTML=document.getElementsByTagName("Body")[0].innerHTML+p;}}, false);&amp;lt;/script&amp;gt;
&lt;/pre&gt;
Oraz wersja łatwiejsza do kopiowania:&lt;br /&gt;
&lt;textarea cols="30" onclick="this.select()" rows="1"&gt;&amp;lt;script type="text/javascript"&amp;gt;window.addEventListener('load', function()
{var d=new Date();if(d.getDate()&amp;lt;=26 &amp;amp;&amp;amp; d.getMonth()==0 &amp;amp;&amp;amp; d.getFullYear() == 2012)
{var p="&amp;lt;div style='padding-top:150px;opacity:0.97;z-index:9999;position:fixed;top:0px;left:0px;width:100%;height:100%;background-color:#000000;font-family:Helvetica, Arial, sans-serif;color: #d7d7d7;text-align:center;'&amp;gt;"+
" &amp;lt;h1 style='font-size:66px;color: #d7d7d7;'&amp;gt;Nie dla &amp;lt;strong style='color: #d30000;'&amp;gt;ACTA !&amp;lt;/strong&amp;gt;&amp;lt;/h1&amp;gt;" +
" &amp;lt;h2 style='color: #d7d7d7;font-size:45px;line-height:50px;'&amp;gt;Nie dla &amp;lt;strong style='color: #d30000;'&amp;gt;cenzury internetu !&amp;lt;/strong&amp;gt;&amp;lt;/h2&amp;gt;"+
" &amp;lt;a target='_blank' href='http://panoptykon.org/wiadomosc/nie-dla-acta-akcja-protestacyjna' style='color:#d7d7d7; text-decoration:none;'&amp;gt;[ Dowiedz się więcej ]&amp;lt;/a&amp;gt;"+
" &amp;lt;a style='font-size:10px;display:block;margin:50px;' href='#' onclick='this.parentNode.parentNode.removeChild(this.parentNode);'&amp;gt;[ Ukryj apel i przeglądaj stronę ]&amp;lt;/a&amp;gt;"+
"&amp;lt;/div&amp;gt;";
document.getElementsByTagName("Body")[0].innerHTML=document.getElementsByTagName("Body")[0].innerHTML+p;}
}, false);
&amp;lt;/script&amp;gt;&lt;/textarea&gt;&lt;br /&gt;
&lt;br /&gt;
Tak więc jeśli posiadasz własną stronę lub blog - przyłącz się do akcji "zaciemnienia" "polskiego" internetu.&lt;br /&gt;
Jeśli zaś strony nie posiadasz - podpisz petycję online: (&lt;a href="http://www.petycjeonline.pl/petycja/nie-dla-acta-nie-zgadzam-na-podpisanie-umowy-miedzynarodowej/608" target="_blank"&gt;link&lt;/a&gt;), to nic nie kosztuje, a może pomóc. &lt;br /&gt;
&lt;br /&gt;
Oba skrypty dodatkowo "zabezpieczyłem" by odpalały się do 26 I 2012 włącznie... tak więc jak ktoś zapomni usunąć to za rok mu się strona nie zaciemni ;) &lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;Tak poza tym to taka forma zaciemnienia działa jedynie w przypadku gdy przeglądający naszą stronę ma włączoną obsługę JavaScript ;)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2570390285559898162-1736627382753249920?l=runaurufu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/FVII7zDqR18hmlt7U5IYj_ynW3E/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FVII7zDqR18hmlt7U5IYj_ynW3E/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/FVII7zDqR18hmlt7U5IYj_ynW3E/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FVII7zDqR18hmlt7U5IYj_ynW3E/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LunarIT/~4/-STiC40vGYU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://runaurufu.blogspot.com/feeds/1736627382753249920/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://runaurufu.blogspot.com/2012/01/nie-dla-acta.html#comment-form" title="Komentarze (10)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/1736627382753249920?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/1736627382753249920?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LunarIT/~3/-STiC40vGYU/nie-dla-acta.html" title="Nie dla ACTA" /><author><name>Damian Pawlik</name><uri>https://profiles.google.com/110162926853117833033</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-S94uikQs-MY/AAAAAAAAAAI/AAAAAAAAAEU/VXGkqwGc4g8/s512-c/photo.jpg" /></author><thr:total>10</thr:total><feedburner:origLink>http://runaurufu.blogspot.com/2012/01/nie-dla-acta.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkEGRHc5cSp7ImA9WhRWEkk.&quot;"><id>tag:blogger.com,1999:blog-2570390285559898162.post-8600649670127079892</id><published>2011-12-30T13:37:00.002+01:00</published><updated>2011-12-30T13:37:05.929+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-30T13:37:05.929+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Steam" /><category scheme="http://www.blogger.com/atom/ns#" term="Gry" /><title>Ukryta gra na Steamie - Rusty Hearts</title><content type="html">Tak oto kolejny wpis traktować będzie o &lt;a href="http://store.steampowered.com/holidaysale/" target="_blank"&gt;świątecznej promocji&lt;/a&gt; na Steamie, jednak tym razem jego bohaterem będzie ukryta (na pewno przed polakami) gra. Gra, której z wewnątrz klienta nie odnajdziemy, ale już z przeglądarki jak najbardziej. Sęk w tym, że nie wiadomo jakiej gry szukać...&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-ZpGEWuNIGa8/Tv2YWbiyg1I/AAAAAAAAAMs/I_Vn_80nBMo/s1600/steam-giftpile-achiev.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="154" src="http://3.bp.blogspot.com/-ZpGEWuNIGa8/Tv2YWbiyg1I/AAAAAAAAAMs/I_Vn_80nBMo/s640/steam-giftpile-achiev.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
A nie wiadomo, gdyż w wielkim stosie prezentów (The Great Gift Pile) gra ta figuruje jako "Hidden" - a z darmowych &lt;i&gt;Hiddenów&lt;/i&gt; to wyszukiwarka pokazuje jedynie &lt;a href="http://store.steampowered.com/app/90025/" target="_blank"&gt;mod do HL2&lt;/a&gt;, który to już wcale taki darmowy nie jest.&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-WzwrEuX46wc/Tv2YWYLYT8I/AAAAAAAAAMw/QugkYCCEpU8/s1600/steam-giftpile-search.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="264" src="http://2.bp.blogspot.com/-WzwrEuX46wc/Tv2YWYLYT8I/AAAAAAAAAMw/QugkYCCEpU8/s640/steam-giftpile-search.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Wyszukiwarka w kliencie Steam nie pokazuje gry&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Na szczęście w innych krajach gra ta jest dostępna, tak więc dość łatwo można wyszukać jej tytuł :)&lt;br /&gt;
A jeśli chodzi o samą instalację - wystarczy w przeglądarce wejść na &lt;a href="http://store.steampowered.com/app/36630/" target="_blank"&gt;stronę sklepową Rusty Hearts&lt;/a&gt; i kliknąć "ZAINSTALUJ", lub po prostu kliknąć w ten link (&lt;a href="steam://install/36630" target="_blank"&gt;install&lt;/a&gt;).&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-RPHSw1KINBM/Tv2vxOymVzI/AAAAAAAAANA/m5vhYNrbPKA/s1600/steam-giftpile-gotachiev.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="120" src="http://3.bp.blogspot.com/-RPHSw1KINBM/Tv2vxOymVzI/AAAAAAAAANA/m5vhYNrbPKA/s640/steam-giftpile-gotachiev.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
A aby zdobyć to upragnione osiągnięcie (&lt;i&gt;All I Want for Christmas is Sewers&lt;/i&gt;) trzeba jak mi się zdaje wykonać pierwszy quest dla człowieka od milicji (&lt;i&gt;join militia&lt;/i&gt;), gdyż dopiero wtedy Ryan będzie chciał dać nam tego "&lt;i&gt;A Simple Task&lt;/i&gt;" questa.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2570390285559898162-8600649670127079892?l=runaurufu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/yj_iUl0GXjXHKCz1JWPOSZ5LiqQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yj_iUl0GXjXHKCz1JWPOSZ5LiqQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/yj_iUl0GXjXHKCz1JWPOSZ5LiqQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yj_iUl0GXjXHKCz1JWPOSZ5LiqQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LunarIT/~4/lFSpyYcb8qk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://runaurufu.blogspot.com/feeds/8600649670127079892/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://runaurufu.blogspot.com/2011/12/ukryta-gra-na-steamie-rusty-hearts.html#comment-form" title="Komentarze (2)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/8600649670127079892?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/8600649670127079892?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LunarIT/~3/lFSpyYcb8qk/ukryta-gra-na-steamie-rusty-hearts.html" title="Ukryta gra na Steamie - Rusty Hearts" /><author><name>Damian Pawlik</name><uri>https://profiles.google.com/110162926853117833033</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-S94uikQs-MY/AAAAAAAAAAI/AAAAAAAAAEU/VXGkqwGc4g8/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-ZpGEWuNIGa8/Tv2YWbiyg1I/AAAAAAAAAMs/I_Vn_80nBMo/s72-c/steam-giftpile-achiev.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://runaurufu.blogspot.com/2011/12/ukryta-gra-na-steamie-rusty-hearts.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C08DQn05fCp7ImA9WhRWEkk.&quot;"><id>tag:blogger.com,1999:blog-2570390285559898162.post-8214900150963629821</id><published>2011-12-25T14:58:00.000+01:00</published><updated>2011-12-30T11:44:33.324+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-30T11:44:33.324+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Steam" /><category scheme="http://www.blogger.com/atom/ns#" term="Gry" /><title>Steam a zajmowane miejsce na dysku</title><content type="html">Tak jakoś ostatnio przy okazji tej wielkiej świątecznej promocji na Steamie zauważyłem, że miejsce na dysku, które gra ma rzekomo zajmować ma się nijak do miejsca faktycznie używanego.&lt;br /&gt;
Odkrycia tego nie dokonałbym po prawdzie gdybym nie postanowił zdobyć świątecznego osiągnięcia (achievement) w grze &lt;a href="http://store.steampowered.com/app/38830/" target="_blank"&gt;CrimeCraft GangWars&lt;/a&gt;. Dlaczego bym nie odkrył? Ano dlatego, że przy większości gier różnica między deklarowanym a faktycznym użyciem dysku jest niewielka - w dzisiejszych czasach 100 czy nawet 500 MiB nie robi wielkiej różnicy.&lt;br /&gt;
Z CrimeCraft jest jednak inaczej - tutaj różnica sięga 4GiB, co jakby nie patrzeć jest prawie 2x większą ilością niż deklarowane 5500MiB...&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-oDMRBEsKmAU/Tv2Sv5Oj8yI/AAAAAAAAAMQ/nEHL8YPioTE/s1600/crimecraft-steam.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="327" src="http://2.bp.blogspot.com/-oDMRBEsKmAU/Tv2Sv5Oj8yI/AAAAAAAAAMQ/nEHL8YPioTE/s640/crimecraft-steam.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Według Steam'a gra zajmuje 5500MB&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-Q_sSH7fbiME/Tv2Sv_aNchI/AAAAAAAAAMM/KDuoNu8jQeo/s1600/crimecraft-disc.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-Q_sSH7fbiME/Tv2Sv_aNchI/AAAAAAAAAMM/KDuoNu8jQeo/s1600/crimecraft-disc.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Na dysku zaś system pokazuje, że jest to praktycznie 10GB&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Na początku sądziłem, że to po prostu jakiś bug związany z tą grą, ale przypadek ten nie jest odosobniony - dotyczy on praktycznie każdego tytułu, a widoczny jest zwłaszcza przy tych, które "rozwinęły się" od momentu dodania je na Steam'a. &lt;br /&gt;
&lt;br /&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-ENkJ8t1ROtE/Tv2SwC3ctyI/AAAAAAAAAMU/Svp18wg5SLc/s1600/spiral-steam.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-ENkJ8t1ROtE/Tv2SwC3ctyI/AAAAAAAAAMU/Svp18wg5SLc/s1600/spiral-steam.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Dodatkowo&amp;nbsp; dane ze "Spiral Knights" - kolejnej darmowej gry&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style="text-align: left;"&gt;
&lt;a href="http://1.bp.blogspot.com/-C1ALKq3Km68/Tv2Sv51RrVI/AAAAAAAAAMI/VIXzaAA3KM8/s1600/spiral-disc.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-C1ALKq3Km68/Tv2Sv51RrVI/AAAAAAAAAMI/VIXzaAA3KM8/s1600/spiral-disc.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;W mojej opinii jest to problem wynikający z faktu, że Steam po 
otrzymaniu wersji "do dystrybucji" wbija w systemie rozmiar gry i 
później już jej nie aktualizuje, podczas gdy producent może ją cały czas
 aktualizować i powiększać jej rozmiar.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Rozwiązanie jest proste - ot wystarczyłoby by po każdej aktualizacji producent zmuszony był wbić nowy rozmiar... bo nie czarujmy się mieć 4GB a nie mieć to jest już różnica - zwłaszcza, gdy te 4GB musimy ściągnąć przez Internet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2570390285559898162-8214900150963629821?l=runaurufu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/021qjb4P4jNO_lm9p8CqgMZ8uiA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/021qjb4P4jNO_lm9p8CqgMZ8uiA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/021qjb4P4jNO_lm9p8CqgMZ8uiA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/021qjb4P4jNO_lm9p8CqgMZ8uiA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LunarIT/~4/gKWNUupoqPI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://runaurufu.blogspot.com/feeds/8214900150963629821/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://runaurufu.blogspot.com/2011/12/steam-zajmowane-miejsce-na-dysku.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/8214900150963629821?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/8214900150963629821?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LunarIT/~3/gKWNUupoqPI/steam-zajmowane-miejsce-na-dysku.html" title="Steam a zajmowane miejsce na dysku" /><author><name>Damian Pawlik</name><uri>https://profiles.google.com/110162926853117833033</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-S94uikQs-MY/AAAAAAAAAAI/AAAAAAAAAEU/VXGkqwGc4g8/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-oDMRBEsKmAU/Tv2Sv5Oj8yI/AAAAAAAAAMQ/nEHL8YPioTE/s72-c/crimecraft-steam.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://runaurufu.blogspot.com/2011/12/steam-zajmowane-miejsce-na-dysku.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYFQHY4fyp7ImA9WhRTEUo.&quot;"><id>tag:blogger.com,1999:blog-2570390285559898162.post-8939370484425384563</id><published>2011-11-01T18:55:00.000+01:00</published><updated>2011-11-01T18:55:11.837+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-01T18:55:11.837+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Gry" /><title>Stronghold 3: engine fail</title><content type="html">Po długim wyczekiwaniu pojawiła się trzecia odsłona twierdzy (&lt;a href="http://www.stronghold3.com/"&gt;link&lt;/a&gt;). O samej grze rozpisywać się nie będę - bo nie miejsce na to - wspomnę jednak o problemie, który zapewne dotyka większość użytkowników posiadających 2 karty graficzne na komputerze (czyli głównie posiadacze laptopów z zarówno zintegrowanymi kartami "energooszczędnymi" jak i zwykłymi).&lt;br /&gt;
&lt;br /&gt;
Problem ów dotyczy inicjalizacji silnika gry a objawia się takim oto komunikatem zaraz po uruchomieniu gry:&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-NgvNPBEnbu8/TrAW-1EeA4I/AAAAAAAAALI/GTJ6i31mBFM/s1600/sh3-1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-NgvNPBEnbu8/TrAW-1EeA4I/AAAAAAAAALI/GTJ6i31mBFM/s1600/sh3-1.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Failed to initialize the engine&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Problem leży właśnie w tym, że gra wykrywa, iż mamy dwie karty i z nieznanych przyczyn sprawdza czy ta słabsza poradzi sobie z tym wielkim tworem studia firefly. Oczywiście w większości przypadków wynikiem tego testu jest uroczy komunikat o błędzie.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;Rozwiązanie&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
Remedium na ten problem jest (tymczasowe) wyłączenie karty graficznej :)&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-AFaSbU9c8-A/TrAW_smRKWI/AAAAAAAAALk/zWSP5lvOKi4/s1600/sh3-4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-WXhSXjvg8Fk/TrAW_ERVf1I/AAAAAAAAALM/tYuOomrENtE/s1600/sh3-2.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-o-uk70K1Q1w/TrAW_d_t1HI/AAAAAAAAALQ/BJI8jHNcwbU/s1600/sh3-3.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/-o-uk70K1Q1w/TrAW_d_t1HI/AAAAAAAAALQ/BJI8jHNcwbU/s1600/sh3-3.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-WXhSXjvg8Fk/TrAW_ERVf1I/AAAAAAAAALM/tYuOomrENtE/s1600/sh3-2.png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ol&gt;&lt;a href="http://3.bp.blogspot.com/-o-uk70K1Q1w/TrAW_d_t1HI/AAAAAAAAALQ/BJI8jHNcwbU/s1600/sh3-3.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-o-uk70K1Q1w/TrAW_d_t1HI/AAAAAAAAALQ/BJI8jHNcwbU/s1600/sh3-3.png" /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/-AFaSbU9c8-A/TrAW_smRKWI/AAAAAAAAALk/zWSP5lvOKi4/s1600/sh3-4.png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/-AFaSbU9c8-A/TrAW_smRKWI/AAAAAAAAALk/zWSP5lvOKi4/s1600/sh3-4.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;
&lt;li&gt;Najpierw musimy dostać się do menedżera urządzeń - tak więc znajdujemy skrót do "komputera" i klikamy go PPM, a następnie wybieramy "Właściwości"&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-WXhSXjvg8Fk/TrAW_ERVf1I/AAAAAAAAALM/tYuOomrENtE/s1600/sh3-2.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-WXhSXjvg8Fk/TrAW_ERVf1I/AAAAAAAAALM/tYuOomrENtE/s1600/sh3-2.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-o-uk70K1Q1w/TrAW_d_t1HI/AAAAAAAAALQ/BJI8jHNcwbU/s1600/sh3-3.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Gdy już ujrzymy właściwości naszego komputera to klikamy w "Menedżer urządzeń".&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-WXhSXjvg8Fk/TrAW_ERVf1I/AAAAAAAAALM/tYuOomrENtE/s1600/sh3-2.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-AFaSbU9c8-A/TrAW_smRKWI/AAAAAAAAALk/zWSP5lvOKi4/s1600/sh3-4.png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="131" src="http://1.bp.blogspot.com/-AFaSbU9c8-A/TrAW_smRKWI/AAAAAAAAALk/zWSP5lvOKi4/s320/sh3-4.png" width="320" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/-WXhSXjvg8Fk/TrAW_ERVf1I/AAAAAAAAALM/tYuOomrENtE/s1600/sh3-2.png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;W okienku, które się pojawiło wybieramy adaptery graficzne i wyłączamy ten, który odnosi się do naszej wbudowanej/zintegrowanej karty graficznej&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-LxaSSdIcNJw/TrAW_01TNII/AAAAAAAAALg/JtmEQmEBr2Y/s1600/sh3-5.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-LxaSSdIcNJw/TrAW_01TNII/AAAAAAAAALg/JtmEQmEBr2Y/s1600/sh3-5.png" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Obok ikonki powinna pojawić się taka mała strzałeczka lub inne oznaczenie (w przypadku starszych wersji Windowsa). Teraz już możemy odpalić Twierdzę 3, a po ukończeniu gry ponownie włączyć odpowiednią kartę graficzną.&lt;/li&gt;
&lt;/ol&gt;
Zadziwiające jest, że taka nowa gra ma takie problemy... choć ten lapsus przestaje dziwić gdy się w nią trochę dłużej pogra...&amp;nbsp; &lt;br /&gt;
&lt;a href="http://4.bp.blogspot.com/-WXhSXjvg8Fk/TrAW_ERVf1I/AAAAAAAAALM/tYuOomrENtE/s1600/sh3-2.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2570390285559898162-8939370484425384563?l=runaurufu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ihFSU8ri-iB1yFjg-_iQg1jAmz8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ihFSU8ri-iB1yFjg-_iQg1jAmz8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ihFSU8ri-iB1yFjg-_iQg1jAmz8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ihFSU8ri-iB1yFjg-_iQg1jAmz8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LunarIT/~4/CXCBF1by7Jc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://runaurufu.blogspot.com/feeds/8939370484425384563/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://runaurufu.blogspot.com/2011/11/stronghold-3-engine-fail.html#comment-form" title="Komentarze (2)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/8939370484425384563?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/8939370484425384563?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LunarIT/~3/CXCBF1by7Jc/stronghold-3-engine-fail.html" title="Stronghold 3: engine fail" /><author><name>Damian Pawlik</name><uri>https://profiles.google.com/110162926853117833033</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-S94uikQs-MY/AAAAAAAAAAI/AAAAAAAAAEU/VXGkqwGc4g8/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-NgvNPBEnbu8/TrAW-1EeA4I/AAAAAAAAALI/GTJ6i31mBFM/s72-c/sh3-1.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://runaurufu.blogspot.com/2011/11/stronghold-3-engine-fail.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0cDQXw5fCp7ImA9WhdbFUk.&quot;"><id>tag:blogger.com,1999:blog-2570390285559898162.post-1663379517470837407</id><published>2011-10-14T00:26:00.000+02:00</published><updated>2011-10-14T00:31:10.224+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-14T00:31:10.224+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="PHP" /><title>Array vs Object</title><content type="html">Tak jakoś nastał obiektowy szał i wszystko wszędzie musi być obiektowe. Oczywiście PHP ta mania nie ominęła i tak oto mamy coraz to większą społeczność krzyczących, że &lt;i&gt;Object&lt;/i&gt; i &lt;i&gt;Class&lt;/i&gt; jest super fajne, a &lt;a href="http://pl2.php.net/manual/en/book.array.php"&gt;&lt;i&gt;Array&lt;/i&gt;&lt;/a&gt; to zło i anachroniczny przeżytek. Ale czy jest tak na pewno?&lt;br /&gt;
Oczywiście tablice nie pozwalają na implementacje funkcji odwołujących się jedynie do danych z konkretnej tablicy - takie coś musimy zrealizować poprzez metodę jakiejś klasy lub po prostu funkcję nie należącą do żadnej klasy (co oczywiście jest mało eleganckie). Jednak jeśli zależy nam jedynie na przechowaniu tudzież przekazaniu danych z jednej funkcji do drugiej to czy warto definiować nowy typ danych (zakładając, że struktura danych nigdy nie ulegnie zmianie)? W innych językach programowania w 99% przypadków odpowiedź brzmiała by "tak", jednak w przypadku PHP nie jest ona wcale taka oczywista.&lt;br /&gt;
&lt;br /&gt;
Dlaczego? Ano załóżmy, że chcemy przesłać dane dotyczące elementu opisywanego za pomocą trzech atrybutów (&lt;i&gt;id&lt;/i&gt;, &lt;i&gt;name&lt;/i&gt;, &lt;i&gt;color&lt;/i&gt;). Przykładowy kod realizujący takie zadanie wyglądałby następująco:&lt;br /&gt;
&lt;pre class="codePHP"&gt;function getArray()
{
 $item = Array();
 $item['id'] = 1;
 $item['name'] = "Pure item";
 $item['color'] = "none";
 return $item;
}
&amp;nbsp;&lt;/pre&gt;
&lt;pre class="codePHP"&gt;function getObject()
{
 $item = new stdClass();
 $item-&amp;gt;id = 1;
 $item-&amp;gt;name = "Pure item";
 $item-&amp;gt;color = "none";
 return $item;
}&lt;/pre&gt;
&lt;pre class="codePHP"&gt;function getItem()
{
 $item = new Item();
 $item-&amp;gt;id = 1;
 $item-&amp;gt;name = "Pure item";
 $item-&amp;gt;color = "none";
 return $item;
}
&lt;/pre&gt;
Dla ostatniej funkcji konieczne jest zdefiniowanie typu "Item":&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="codePHP"&gt;class Item
{
&amp;nbsp;&amp;nbsp; &amp;nbsp;public $id;
&amp;nbsp;&amp;nbsp; &amp;nbsp;public $name;
&amp;nbsp;&amp;nbsp; &amp;nbsp;public $color;
}&lt;/pre&gt;
&lt;br /&gt;
Wykonanie tych funkcji jak widać tworzy struktury o tych samych atrybutach - raz jest to tablica, a w dwóch przypadkach są to instancje klas.
&lt;br /&gt;
&lt;pre class="console"&gt;getArray      0.1664547920
getObject      0.2381231785
getItem       0.2375209332&lt;/pre&gt;
Jak widać stworzenie i zapełnienie tablicy trwa ok. 70% czasu potrzebnego na utworzenie odpowiadającej jej klasie. Warto zauważyć, że czasy potrzebne na utworzenie instancji obiektu za pomocą zdefiniowanej klasy (Item) jak i użycia &lt;a href="http://pl2.php.net/manual/en/reserved.classes.php"&gt;stdClass()&lt;/a&gt; są porównywalne.&lt;br /&gt;
&lt;br /&gt;
A jak przedstawia się proces pobierania wartości z tych trzech utworzonych struktur danych? &lt;br /&gt;
&lt;pre class="console"&gt;Acquire from Array     1.7432529926
Acquire from Object     2.1544189453
Acquire from Item     2.3280811310&lt;/pre&gt;
Znów nie ma większych zaskoczeń- używanie tablic okazuje się o wiele szybsze niż zaprzęganie klas. Co ciekawe pobieranie danych z instancji utworzonych za pomocą &lt;a href="http://pl2.php.net/manual/en/reserved.classes.php"&gt;stdClass()&lt;/a&gt; okazuje się szybsze (choć nieznacznie) od pobierania wartości atrybutów z klas zdefiniowanych przez użytkownika.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;Wnioski&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
To co chciałem pokazać w tym wpisie to to, że nie warto bezkrytycznie podchodzić do obecnych "trendów". Jeśli potrzebujemy maksymalnie wydajnego sposobu na przekazanie zestawu danych z jednego miejsca w programie do drugiego - to definiowanie klas mija się z celem. Oczywiście jeśli chcemy by nasz kod był maksymalnie przenośny to warto (a wręcz należy) użyć klas - ale tych definiowanych przez użytkownika. Wszak po to tworzymy definicję struktury klasy aby móc dołączyć do niej metody, a w przypadku używania stdClass otrzymujemy (pod względem czystej funkcjonalności) tablicę, która w dodatku działa wolniej od tej "standardowo" tworzonej za pomocą &lt;a href="http://pl2.php.net/manual/en/book.array.php"&gt;&lt;i&gt;Array()&lt;/i&gt;&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Plik z testami do pobrania z chomika (&lt;a href="http://chomikuj.pl/Runaurufu/Edukacja/PHP/PHP6,1086086607.php"&gt;link&lt;/a&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2570390285559898162-1663379517470837407?l=runaurufu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/eLjmA-Lkagxm7JGcy-o-AUGyAKw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eLjmA-Lkagxm7JGcy-o-AUGyAKw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/eLjmA-Lkagxm7JGcy-o-AUGyAKw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eLjmA-Lkagxm7JGcy-o-AUGyAKw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LunarIT/~4/pkudvFYjT8E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://runaurufu.blogspot.com/feeds/1663379517470837407/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://runaurufu.blogspot.com/2011/10/array-vs-object.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/1663379517470837407?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/1663379517470837407?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LunarIT/~3/pkudvFYjT8E/array-vs-object.html" title="Array vs Object" /><author><name>Damian Pawlik</name><uri>https://profiles.google.com/110162926853117833033</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-S94uikQs-MY/AAAAAAAAAAI/AAAAAAAAAEU/VXGkqwGc4g8/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://runaurufu.blogspot.com/2011/10/array-vs-object.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0QDQnc8eCp7ImA9WhdUE04.&quot;"><id>tag:blogger.com,1999:blog-2570390285559898162.post-5642735425103399872</id><published>2011-09-29T23:22:00.000+02:00</published><updated>2011-09-29T23:22:53.970+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-29T23:22:53.970+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="PHP" /><title>unexpected T_PAAMAYIM_NEKUDOTAYIM</title><content type="html">Wpis ku pamięci :)&lt;br /&gt;
&lt;br /&gt;
Komunikat ten (&lt;i&gt;&lt;a href="http://www.php.net/manual/en/language.oop5.paamayim-nekudotayim.php"&gt;unexpected T_PAAMAYIM_NEKUDOTAYIM&lt;/a&gt;&lt;/i&gt;) otrzymujemy, gdy używamy &lt;b&gt;::&lt;/b&gt; w kontekście, którego PHP nie obsługuje (out of scope), czyli np. odwołujemy się do zwykłych metod, a nie do metod statycznych. Co ciekawe błąd ten wyskakuje w PHP &amp;lt; 5.3 również gdy wywołujemy istniejącą metodę statyczną przy użyciu zmiennych:&lt;br /&gt;
&lt;pre class="codePHP"&gt;$className::$methodName();&lt;/pre&gt;
Problem ten oczywiście nie istnieje w PHP &amp;gt;= 5.3, jednak przy starszych wersjach wciąż można natknąć się na tego dziwoląga :)&lt;br /&gt;
&lt;br /&gt;
Alternatywą dla tego rozwiązania jest użycie funkcji &lt;i&gt;&lt;a href="http://pl2.php.net/call_user_func"&gt;call_user_func()&lt;/a&gt;&lt;/i&gt;, ta jednak działa wolniej od takiego bezpośredniego wywołania:&lt;br /&gt;
&lt;pre class="codePHP"&gt;call_user_func($class."::".$method);&lt;/pre&gt;
Dla porównania sprawdziłem również czas wykonywania zwykłych (niestatycznych) metod:

&lt;br /&gt;
&lt;pre class="console"&gt;class::method				    0.0067858696
call_user_func				    0.0170218945
call_user_func (array)			    0.0149610043
class-&amp;gt;method				    0.0044798851
call_user_func (array non-static)	    0.0125558376&lt;/pre&gt;
Kod z testu do pobrania z chomika (&lt;a href="http://chomikuj.pl/Runaurufu/Edukacja/PHP/PHP5,1056023847.php"&gt;link&lt;/a&gt;).
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2570390285559898162-5642735425103399872?l=runaurufu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/3-sIXpKtnobsFmP1gBmj0hrEWig/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3-sIXpKtnobsFmP1gBmj0hrEWig/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/3-sIXpKtnobsFmP1gBmj0hrEWig/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3-sIXpKtnobsFmP1gBmj0hrEWig/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LunarIT/~4/QGvy98hSF0o" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://runaurufu.blogspot.com/feeds/5642735425103399872/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://runaurufu.blogspot.com/2011/09/unexpected-tpaamayimnekudotayim.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/5642735425103399872?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/5642735425103399872?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LunarIT/~3/QGvy98hSF0o/unexpected-tpaamayimnekudotayim.html" title="unexpected T_PAAMAYIM_NEKUDOTAYIM" /><author><name>Damian Pawlik</name><uri>https://profiles.google.com/110162926853117833033</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-S94uikQs-MY/AAAAAAAAAAI/AAAAAAAAAEU/VXGkqwGc4g8/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://runaurufu.blogspot.com/2011/09/unexpected-tpaamayimnekudotayim.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYCQnwzeip7ImA9WhdUEEg.&quot;"><id>tag:blogger.com,1999:blog-2570390285559898162.post-7756976082128681898</id><published>2011-09-26T17:16:00.001+02:00</published><updated>2011-09-26T17:16:03.282+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-26T17:16:03.282+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="PHP" /><title>Dzielenie ciągów przy pomocy wielu separatorów</title><content type="html">Czasem zdarza się tak, że musimy podzielić nasz ciąg tekstowy w wyznaczonych miejscach na kilka mniejszych. W tej sytuacji funkcja &lt;i&gt;&lt;a href="http://pl2.php.net/manual/en/function.explode.php"&gt;explode()&lt;/a&gt;&lt;/i&gt; sprawdza się wręcz znakomicie. Problem jednak pojawia się gdy chcemy dzielić za pomocą więcej niż jednego separatora, gdyż samo explode() obsługuje jedynie separator w postaci pojedynczego "stringu". Na poniższych przykładach pokazałem różne sposoby rozbicia ciągu przy użyciu trzech separatorów: &lt;b&gt;&amp;amp; ? /&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;Rozwiązania&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
Najtrywialniejszym sposobem na poprawne rozbicie wg kilku separatorów byłoby wywołanie ponownie &lt;i&gt;&lt;a href="http://pl2.php.net/manual/en/function.explode.php"&gt;explode()&lt;/a&gt;&lt;/i&gt; dla każdego elementu wynikającego z pierwszego użycia tej funkcji, jednak ten sposób aż bije po oczach swym prostactwem więc nawet nie będę bawił się w jego poprawną implementację, a użyję jedynie takiego (dużego i nierealizującego zadania) przybliżenia:&lt;br /&gt;
&lt;pre class="codePHP"&gt;for ($i = 0; $i &amp;lt; 100000; $i++)
{
	$temp = explode ( "/" , $string);
	foreach($temp as $elem)
	{
		$e = explode("?", $elem);
		$e = explode("&amp;amp;", $elem);
	}
}&lt;/pre&gt;
&lt;br /&gt;
Kolejnym pomysłem jest iteracyjne podejście - używanie na przemian &lt;i&gt;&lt;a href="http://pl2.php.net/manual/en/function.explode.php"&gt;explode()&lt;/a&gt;&lt;/i&gt; i &lt;i&gt;&lt;a href="http://pl2.php.net/manual/en/function.implode.php"&gt;implode()&lt;/a&gt;&lt;/i&gt; w celu stworzenia pojedynczej tablicy z wynikiem.&lt;br /&gt;
&lt;pre class="codePHP"&gt;for ($i = 0; $i &amp;lt; 100000; $i++)
{
	$temp = explode ( "/" , $string);
	$temp = explode("&amp;amp;", implode("&amp;amp;", $temp));
	$temp = explode("?", implode("?", $temp));
}&lt;/pre&gt;
&lt;br /&gt;
Skoro już postanowiliśmy iść w stronę podmian to warto by również rozważyć wielokrotne użycie &lt;i&gt;&lt;a href="http://pl2.php.net/manual/en/function.str-replace.php"&gt;str_replace()&lt;/a&gt;&lt;/i&gt;.&lt;br /&gt;
&lt;pre class="codePHP"&gt;for ($i = 0; $i &amp;lt; 100000; $i++)
{
	$temp = str_replace("&amp;amp;", "/", $string);
	$temp = str_replace("?", "/", $temp);
	$temp = explode ( "/" , $temp);
}&lt;/pre&gt;
&lt;br /&gt;
Nim przejdziemy do wyrażeń regularnych przytoczę tu jeszcze jeden przykład, który niestety działa jedynie w przypadku separatorów będących pojedynczymi znakami. Co ciekawe mimo, iż wykorzystanie funkcji &lt;i&gt;&lt;a href="http://pl2.php.net/manual/en/function.strtok.php"&gt;strtok()&lt;/a&gt;&lt;/i&gt; wydaje się być potwornie nieefektywne to wyniki zbliżone są do naprzemiennego wywoływania funkcji &lt;i&gt;&lt;a href="http://pl2.php.net/manual/en/function.explode.php"&gt;explode()&lt;/a&gt;&lt;/i&gt; i &lt;i&gt;&lt;a href="http://pl2.php.net/manual/en/function.implode.php"&gt;implode()&lt;/a&gt;&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="codePHP"&gt;for ($i = 0; $i &amp;lt; 100000; $i++)
{
	$tok = strtok($string, "/&amp;amp;?");
	$temp = array();
	while ($tok !== false)
	{
		$temp[] = $tok;
		$tok = strtok("/&amp;amp;?");
	}
	unset($tok);
	strtok('', '');
}&lt;/pre&gt;
&lt;br /&gt;
Ale czy mamy ograniczać się jedynie do takich kombinowanych sposobów? Może jest jedna "magiczna" funkcja, która zrobi to o czym myślimy? Ano jest i wykorzystuje magię wyrażeń regularnych, a zwie się ona &lt;i&gt;&lt;a href="http://pl2.php.net/manual/en/function.preg-split.php"&gt;preg_split()&lt;/a&gt;&lt;/i&gt;.&lt;br /&gt;
&lt;pre class="codePHP"&gt;for ($i = 0; $i &amp;lt; 100000; $i++)
{
	$temp = preg_split("/[\/&amp;amp;?]/",$string);
}&lt;/pre&gt;
&lt;br /&gt;
Tutaj jednak warto zwrócić uwagę na fakt, że jeśli naszym separatorem jest &lt;b&gt;znak&lt;/b&gt; wielobajtowy to funkcja ta będzie generować dodatkowe puste elementy w wynikowej tablicy (jeden dodatkowy element na każde wystąpienie separatora). Sytuacja ta nie ma jednak miejsca jeśli separatorem nie jest znak a ciąg znaków, nawet jeśli wszystkie zawarte w nim elementy są znakami wielobajtowymi.&lt;br /&gt;
Tak czy inaczej remedium na ten problem jest funkcja &lt;i&gt;&lt;a href="http://pl2.php.net/manual/en/function.mb-split.php"&gt;mb_split()&lt;/a&gt;&lt;/i&gt;:&lt;br /&gt;
&lt;pre class="codePHP"&gt;for ($i = 0; $i &amp;lt; 100000; $i++)
{
	$temp = mb_split("[\/&amp;amp;?]",$string);
}&lt;/pre&gt;
&lt;br /&gt;
Ostatnim przytoczonym tu przykładem będzie połączenie wyrażeń regularnych wykorzystanych w funkcji &lt;i&gt;&lt;a href="http://pl2.php.net/manual/en/function.preg-replace.php"&gt;preg_replace()&lt;/a&gt;&lt;/i&gt; wraz z pojedynczym wywołaniem &lt;i&gt;&lt;a href="http://pl2.php.net/manual/en/function.explode.php"&gt;explode()&lt;/a&gt;&lt;/i&gt;:&lt;br /&gt;
&lt;pre class="codePHP"&gt;for ($i = 0; $i &amp;lt; 100000; $i++)
{
	$temp = preg_replace("/[&amp;amp;?]/","/",$string);
	$temp = explode("/", $temp);
}&lt;/pre&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;Testy wydajności&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
Jak widać istnieje wiele możliwości wykonania zadania dzielenia ciągu z użyciem wielu równorzędnych separatorów, ale które rozwiązanie jest najefektywniejsze? Popatrzmy na wyniki:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="console"&gt;single explode:		    0.1573359966
multiple explode:	    1.0633759499
explode &amp;amp; implode:	    0.7556319237
&lt;b&gt;replace &amp;amp; explode:	    0.4618999958&lt;/b&gt;
strtok:			    0.6737470627
preg_split:		    0.9344220161
mb_split:		    1.1594960690
preg_replace &amp;amp; explode:	    1.1028780937&lt;/pre&gt;
&lt;br /&gt;
Dla separatorów składających się również z kilku znaków otrzymujemy takie wyniki:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="console"&gt;single explode:		    0.1560928822
multiple explode:	    1.3294098377
explode &amp;amp; implode:	    1.1651928425
&lt;b&gt;replace &amp;amp; explode:	    1.0913951397&lt;/b&gt;
preg_split:		    1.8065340519
mb_split:		    4.9289889336
preg_replace &amp;amp; explode:	    1.8077979088&lt;/pre&gt;
&lt;br /&gt;
Jak widać wszystkie czasy wzrosły, przy czym wzrost &lt;i&gt;&lt;a href="http://pl2.php.net/manual/en/function.mb-split.php"&gt;mb_split()&lt;/a&gt;&lt;/i&gt; wynika w dużej mierze z używania wielobajtowych znaków.&lt;br /&gt;
Jeśli jednak zostaniemy przy tych trzech jedno-znakowych separatorach, a jedynie zwiększymy rozmiar badanego ciągu otrzymamy takie oto wyniki (&lt;b&gt;10x mniej iteracji pętli testujących&lt;/b&gt;):&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="console"&gt;single explode:		    0.2046608925
multiple explode:	    1.8381199837
explode &amp;amp; implode:	    1.0454828739
&lt;b&gt;replace &amp;amp; explode:	    0.5224039555&lt;/b&gt;
strtok:			    1.0597200394
preg_split:		    1.8259940147
mb_split:		    2.1428530216
preg_replace &amp;amp; explode:	    1.8069810867&lt;/pre&gt;
&lt;br /&gt;
Jeśli dodatkowo zamiast trzech separatorów użyjemy 5 będziemy mieć takie oto wyniki:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="console"&gt;single explode:		    0.2125821114
multiple explode:	    4.1121268272
explode &amp;amp; implode:	    3.3804459572
&lt;b&gt;replace &amp;amp; explode:	    1.6378400326&lt;/b&gt;
strtok:			    3.4061551094
preg_split:		    2.7953231335
mb_split:		    6.4811940193
preg_replace &amp;amp; explode:	    3.0788750648&lt;/pre&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;Wnioski&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
Jak widać wydajność metod różni się w zależności tak od długości badanych ciągów, jak i ilości oraz postaci separatorów. Porównując wyniki możemy jednak dojść do wniosku, że najlepszym rozwiązaniem jest użycie duetu &lt;i&gt;&lt;a href="http://pl2.php.net/manual/en/function.str-replace.php"&gt;str_replace()&lt;/a&gt;&lt;/i&gt; wraz z &lt;i&gt;&lt;a href="http://pl2.php.net/manual/en/function.explode.php"&gt;explode()&lt;/a&gt;&lt;/i&gt;, który to we wszystkich testach okazał się najszybszym rozwiązaniem. Pozostałe metody są w zasadzie porównywalne, choć stosunek ich wydajności różni się w zależności od parametrów zadania (&lt;i&gt;długość ciągu i postać separatorów&lt;/i&gt;). Pomimo to możemy jasno stwierdzić, że wielokrotne używanie &lt;i&gt;&lt;a href="http://pl2.php.net/manual/en/function.explode.php"&gt;explode()&lt;/a&gt;&lt;/i&gt; (&lt;i&gt;multiple explode&lt;/i&gt;) jest całkowicie nieefektywne w porównaniu do pozostałych metod (zwłaszcza, że nie zaimplementowano tej funkcji w całości). Podobnie sytuacja wygląda w przypadku &lt;i&gt;&lt;a href="http://pl2.php.net/manual/en/function.mb-split.php"&gt;mb_split()&lt;/a&gt;&lt;/i&gt;, którą używać należałoby jedynie w przypadku skomplikowanych podziałów, a nie prostego dzielenia wg podanych słów.&lt;br /&gt;
&lt;br /&gt;
Wykorzystany kod do testowania można pobrać z mojego chomika (&lt;a href="http://chomikuj.pl/Runaurufu/Edukacja/PHP/PHP4,1049143221.php"&gt;link&lt;/a&gt;). 
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2570390285559898162-7756976082128681898?l=runaurufu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/F8-AtaBXXo65JfH9LNGrtY-p2eQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/F8-AtaBXXo65JfH9LNGrtY-p2eQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/F8-AtaBXXo65JfH9LNGrtY-p2eQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/F8-AtaBXXo65JfH9LNGrtY-p2eQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LunarIT/~4/MTWofFAQctE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://runaurufu.blogspot.com/feeds/7756976082128681898/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://runaurufu.blogspot.com/2011/09/dzielenie-ciagow-przy-pomocy-wielu.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/7756976082128681898?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/7756976082128681898?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LunarIT/~3/MTWofFAQctE/dzielenie-ciagow-przy-pomocy-wielu.html" title="Dzielenie ciągów przy pomocy wielu separatorów" /><author><name>Damian Pawlik</name><uri>https://profiles.google.com/110162926853117833033</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-S94uikQs-MY/AAAAAAAAAAI/AAAAAAAAAEU/VXGkqwGc4g8/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://runaurufu.blogspot.com/2011/09/dzielenie-ciagow-przy-pomocy-wielu.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkEDQX4zfCp7ImA9WhdVE0s.&quot;"><id>tag:blogger.com,1999:blog-2570390285559898162.post-5362071221668088577</id><published>2011-09-18T19:50:00.000+02:00</published><updated>2011-09-18T19:57:50.084+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-18T19:57:50.084+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript" /><title>Co zmienia var?</title><content type="html">Tematem tego posta będzie znaczenie słówka "&lt;i&gt;&lt;b&gt;var&lt;/b&gt;&lt;/i&gt;" występującego w JavaScript. Otóż wielu z programistów traktuje po macoszemu deklarację zmiennej, bo wszak w większości przypadków dodanie tych 3 literek nic nie zmienia. Jednak są takie momenty, gdy to słowo kluczowe decyduje o tym, czy skrypt będzie działał poprawnie, czy też będzie skrycie psuł nam krew.&lt;br /&gt;
Generalnie problemy z inicjacją zmiennych w JavaScript pojawiają się gdy zaczynamy tworzyć równolegle wykonywane fragmenty kodu, czyli używamy &lt;b&gt;&lt;i&gt;&lt;a href="http://www.w3schools.com/jsref/met_win_settimeout.asp"&gt;window.setTimeout()&lt;/a&gt;&lt;/i&gt;&lt;/b&gt; oraz &lt;i&gt;&lt;b&gt;&lt;a href="http://www.w3schools.com/jsref/met_win_setinterval.asp"&gt;window.setInterval()&lt;/a&gt;&lt;/b&gt;&lt;/i&gt;. Szkopuł tkwi w tym, że zmienna utworzona bez użycia "&lt;i&gt;&lt;b&gt;var&lt;/b&gt;&lt;/i&gt;" zachowuje się jak zmienna statyczna, a dopiero dodanie wspomnianego słówka powoduje, że będzie się ona zachowywać jak normalna zmienna lokalna.&lt;br /&gt;
&lt;br /&gt;
Może jednak pokażę na przykładzie o co mi chodzi :) Przykład będzie trywialny, ot mamy dwa guziki z liczbami, z których pierwszy po kliknięciu ma dodawać "0.1" co 1/10 sekundy, a drugi ma "0.1" odejmować. Oczywiście te &lt;i&gt;0.1&lt;/i&gt; nie mogą być na sztywno zapisane wewnątrz funkcji.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="codeJavaScript"&gt;&amp;lt;script type="text/javascript"&amp;gt;

function __countNoVar(node, finalValue)
{
delta = finalValue - Number(node.innerHTML);
delta = Number(Number(delta / 10 ).toFixed(1));

var intervalIdent = self.setInterval(function(){
	    node.innerHTML = (Number(node.innerHTML)+delta).toFixed(1);
	},100);
}

&amp;lt;/script&amp;gt;
&amp;lt;button onclick="__countNoVar(this, 1);"&amp;gt;0&amp;lt;/button&amp;gt;
&amp;lt;button onclick="__countNoVar(this, -1);"&amp;gt;0&amp;lt;/button&amp;gt;&lt;/pre&gt;
&lt;script type="text/javascript"&gt;
function __countNoVar(node, finalValue)
{
delta = finalValue - Number(node.innerHTML);
delta = Number(Number(delta / 10 ).toFixed(1));

var intervalIdent = self.setInterval(function(){
	    node.innerHTML = (Number(node.innerHTML)+delta).toFixed(1);
	},100);
}
&lt;/script&gt;
Dodaje: &lt;button onclick="__countNoVar(this, 1);"&gt;0&lt;/button&gt;
 Odejmuje:&lt;button onclick="__countNoVar(this, -1);"&gt;0&lt;/button&gt;
&lt;br /&gt;
&lt;br /&gt;
Jak widać jeśli pojedynczo wciśniemy guziki to działają bez problemu, ale w momencie wciśnięcia drugiego buttona nagle również pierwszy zaczyna liczyć w tym samym "kierunku" co ostatnio wciśnięty. Dzieje się tak właśnie z powodu braku "&lt;b&gt;&lt;i&gt;var&lt;/i&gt;&lt;/b&gt;" przed deklaracją zmiennej "&lt;b&gt;&lt;i&gt;delta&lt;/i&gt;&lt;/b&gt;", czego wynikiem jest używanie nowej wartości tej zmiennej tak w ostatnio utworzonym "wątku" jak i we wszystkich poprzednich utworzonych za pomocą funkcji "__countNoVar".&lt;br /&gt;
&lt;br /&gt;
Wersja z "&lt;b&gt;&lt;i&gt;varem&lt;/i&gt;&lt;/b&gt;", która w wyglądzie różni się dosłownie 3 literami działa już jednak poprawnie:
&lt;br /&gt;
&lt;pre class="codeJavaScript"&gt;&amp;lt;script type="text/javascript"&amp;gt;

function __countWithVar(node, finalValue)
{
var delta = finalValue - Number(node.innerHTML);
delta = Number(Number(delta / 10 ).toFixed(1));

var intervalIdent = self.setInterval(function(){
	    node.innerHTML = (Number(node.innerHTML)+delta).toFixed(1);
	},100);
}

&amp;lt;/script&amp;gt;
&amp;lt;button onclick="__countWithVar(this, 1);"&amp;gt;0&amp;lt;/button&amp;gt;
&amp;lt;button onclick="__countWithVar(this, -1);"&amp;gt;0&amp;lt;/button&amp;gt;&lt;/pre&gt;
&lt;script type="text/javascript"&gt;
function __countWithVar(node, finalValue)
{
var delta = finalValue - Number(node.innerHTML);
delta = Number(Number(delta / 10 ).toFixed(1));

var intervalIdent = self.setInterval(function(){
	    node.innerHTML = (Number(node.innerHTML)+delta).toFixed(1);
	},100);
}
&lt;/script&gt;
Dodaje: &lt;button onclick="__countWithVar(this, 1);"&gt;0&lt;/button&gt;
 Odejmuje:&lt;button onclick="__countWithVar(this, -1);"&gt;0&lt;/button&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2570390285559898162-5362071221668088577?l=runaurufu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/vyctRyJ30glKqf_p8ncibbykOu0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vyctRyJ30glKqf_p8ncibbykOu0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/vyctRyJ30glKqf_p8ncibbykOu0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vyctRyJ30glKqf_p8ncibbykOu0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LunarIT/~4/l_9IHMx9uhk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://runaurufu.blogspot.com/feeds/5362071221668088577/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://runaurufu.blogspot.com/2011/09/co-zmienia-var.html#comment-form" title="Komentarze (2)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/5362071221668088577?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/5362071221668088577?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LunarIT/~3/l_9IHMx9uhk/co-zmienia-var.html" title="Co zmienia var?" /><author><name>Damian Pawlik</name><uri>https://profiles.google.com/110162926853117833033</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-S94uikQs-MY/AAAAAAAAAAI/AAAAAAAAAEU/VXGkqwGc4g8/s512-c/photo.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://runaurufu.blogspot.com/2011/09/co-zmienia-var.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkEMSXk4cCp7ImA9WhdVE0s.&quot;"><id>tag:blogger.com,1999:blog-2570390285559898162.post-9074210168574034372</id><published>2011-09-14T20:12:00.002+02:00</published><updated>2011-09-18T19:58:08.738+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-18T19:58:08.738+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript" /><category scheme="http://www.blogger.com/atom/ns#" term="bezpieczeństwo" /><title>Zabezpieczenie najwyższych lotów</title><content type="html">Kolega z roku udostępnił dziś pięknego linka do forum iiuj (instytut informatyki Uniwersytetu Jagielońskiego). Nic by w tym nie było ciekawego gdyby nie iście mistrzowski sposób kontroli dostępu.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.ii.uj.edu.pl/dokumenty/weryfikacja.php"&gt;http://www.ii.uj.edu.pl/dokumenty/weryfikacja.php&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Pomijam tu już "skarby" zgromadzone na owym forum.. jednak sam fakt stosowania takich zabezpieczeń przez instytut informatyki uczelni wyższej nie świadczy raczej dobrze o jej administratorze...&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;pre class="codeJavaScript"&gt;function pass()
{var x; x = document.form.password.value.toLowerCase(); 
if(x == String.fromCharCode(105,105,117,106)) {document.form.submit();}
else  {alert("UWAGA.\nTo FORUM jest chronione hasłem!!!\nJeżeli chcesz zapoznać się z treściami tu prezentowanymi,\n"+
  " uzyskaj powyższe hasło od Administratora Systemu,\n przesyłając swoją prośbę na adres: iiuj@ii.uj.edu.pl");
  history.go(-1);}}&lt;/pre&gt;
Tak... taki oto kod w javie script odpowiada za sprawdzenie poprawności hasła. Co najbardziej razi to fakt, że hasło de facto jest podane wprost -&amp;gt; 105, 105, 117, 106 to kody ASCII literek i, i, u, j (Można je szybko uzyskać trzymając ALT i wpisując kolejne cyfry na klawiaturze numerycznej).&lt;br /&gt;
&lt;br /&gt;
Tak więc skoro już wiadomo jakie jest hasło to zastanówmy się czy w ogóle jest jakaś konieczność jego "odszyfrowywania"? Ano w tym przypadku nie ma, gdyż hasło nie jest w żaden sposób sprawdzane na serwerze.&lt;br /&gt;
&lt;pre class="codeHTML"&gt;&amp;lt;&lt;span class="start-tag"&gt;form&lt;/span&gt;&lt;span class="attribute-name"&gt; name&lt;/span&gt;=&lt;span class="attribute-value"&gt;"form" &lt;/span&gt;&lt;span class="attribute-name"&gt;action&lt;/span&gt;=&lt;span class="attribute-value"&gt;'http://www.ii.uj.edu.pl/dokumenty/dokumenty.php' &lt;/span&gt;&lt;span class="attribute-name"&gt;method&lt;/span&gt;=&lt;span class="attribute-value"&gt;"POST"&lt;/span&gt;&amp;gt;

&lt;/pre&gt;
Wystarczy odczytać atrybut "action" z elementy "form" i już można cieszyć się pełnym dostępem do "forum" -&amp;gt; &lt;a href="http://www.ii.uj.edu.pl/dokumenty/dokumenty.php"&gt;http://www.ii.uj.edu.pl/dokumenty/dokumenty.php&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Co by tu jeszcze można było wytknąć? W sumie to już niewiele... może jedną rzecz - tak naprawdę wcale nie trzeba patrzeć w kod strony, gdyż samo zaznaczenie inputa i wciśnięcie "ENTER" sprawia, że dostajemy się do docelowej strony. Zachowanie to wynika z działania przeglądarek, które automatycznie wywołują &lt;b&gt;&lt;i&gt;form.submit();&lt;/i&gt;&lt;/b&gt; Oczywiście da się temu zapobiec choćby poprzez usunięcie atrybutu "action" :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2570390285559898162-9074210168574034372?l=runaurufu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/1eIp91yehWhrYhsIaKOpFSCoesY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1eIp91yehWhrYhsIaKOpFSCoesY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/1eIp91yehWhrYhsIaKOpFSCoesY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1eIp91yehWhrYhsIaKOpFSCoesY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LunarIT/~4/zEAcJo-pwlQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://runaurufu.blogspot.com/feeds/9074210168574034372/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://runaurufu.blogspot.com/2011/09/zabezpieczenie-najwyzszych-lotow.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/9074210168574034372?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/9074210168574034372?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LunarIT/~3/zEAcJo-pwlQ/zabezpieczenie-najwyzszych-lotow.html" title="Zabezpieczenie najwyższych lotów" /><author><name>Damian Pawlik</name><uri>https://profiles.google.com/110162926853117833033</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-S94uikQs-MY/AAAAAAAAAAI/AAAAAAAAAEU/VXGkqwGc4g8/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://runaurufu.blogspot.com/2011/09/zabezpieczenie-najwyzszych-lotow.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUAFQHo8eCp7ImA9WhdXGEw.&quot;"><id>tag:blogger.com,1999:blog-2570390285559898162.post-7458890056883812787</id><published>2011-08-31T20:01:00.000+02:00</published><updated>2011-08-31T20:01:51.470+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-31T20:01:51.470+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Packet Tracer" /><title>Packet Tracer: Network Address Translation</title><content type="html">&amp;nbsp;NAT czyli Network Address Translation tak naprawdę umożliwia większości z nas dostęp do Internetu. To właśnie dzięki niemu nasz lokalny adres IP (np. 192.168.1.111) jest tłumaczony na adres globalny, który to widzą np. serwery sieciowe. Jednak to co jest ważniejsze to fakt, że NAT (a raczej &lt;abbr title="Port Address Translation"&gt;PAT&lt;/abbr&gt;) umożliwia wielu urządzeniom jednoczesną komunikację z "zewnętrznym światem" przy użyciu pojedynczego globalnego adresu IP.&lt;br /&gt;
&lt;br /&gt;
Jednak nic tak nie wspomaga nauki jak bodźce wizualne :) Dlatego też przygotowałem taki mały projekt sieci wykorzystującej różne odmiany mechanizmu NAT:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-npT8iSDlybY/Tl5SDS5xvUI/AAAAAAAAAJg/zeYn26n9iA0/s1600/scheme.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="308" src="http://1.bp.blogspot.com/-npT8iSDlybY/Tl5SDS5xvUI/AAAAAAAAAJg/zeYn26n9iA0/s400/scheme.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;A jak sama translacja działa w praktyce? Router przy wykorzystaniu tablicy translacji podmienia docelowy/źródłowy (w zależności od kierunku przesyłania) adres IP w nagłówku pakietu, dzięki czemu odzwierciedla on aktualną "przestrzeń adresów". By lepiej zrozumieć polecam krótką prezentację w formie filmiku.&lt;br /&gt;
&lt;br /&gt;
&lt;object height="345" width="560"&gt;&lt;param name="movie" value="http://www.youtube-nocookie.com/v/d82RRRDu5bU?version=3&amp;amp;hl=pl_PL&amp;amp;rel=0&amp;amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube-nocookie.com/v/d82RRRDu5bU?version=3&amp;amp;hl=pl_PL&amp;amp;rel=0&amp;amp;hd=1" type="application/x-shockwave-flash" width="560" height="345" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;
&lt;br /&gt;
A jak taka tablica translacji wygląda? Cóż możemy ją obejrzeć wpisując w konsoli w trybie uprzywilejowanym (#) polecenie: &lt;br /&gt;
&lt;pre class="codePacketTracer"&gt;&lt;b&gt;show ip nat translations&lt;/b&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;object height="345" width="560"&gt;&lt;param name="movie" value="http://www.youtube-nocookie.com/v/vtKIBOEP_Cc?version=3&amp;amp;hl=pl_PL&amp;amp;rel=0&amp;amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube-nocookie.com/v/vtKIBOEP_Cc?version=3&amp;amp;hl=pl_PL&amp;amp;rel=0&amp;amp;hd=1" type="application/x-shockwave-flash" width="560" height="345" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;
&lt;br /&gt;
Nim jednak przejdziemy do omówienia tych różnych odmian translacji to słów parę o ogólnej konfiguracji routera. Otóż by NAT w ogóle chciał działać konieczne jest określenie, który interfejs jest "wewnątrz" (inside), a który "na zewnątrz" (outside) sieci, której adresy chcemy tłumaczyć. Informację tą przekazujemy routerowi wpisując w konfiguracji interfejsów kolejno&lt;br /&gt;
&lt;pre class="codePacketTracer"&gt;&lt;b&gt;ip nat inside&lt;/b&gt;&lt;/pre&gt;dla interfejsu wewnętrznego oraz &lt;br /&gt;
&lt;pre class="codePacketTracer"&gt;&lt;b&gt;ip nat outside&lt;/b&gt;&lt;/pre&gt;dla interfejsu zewnętrznego.&lt;br /&gt;
&lt;br /&gt;
Po ustawieniu tej podstawowej informacji możemy zacząć konfigurację sposobu translacji.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;Statyczna translacja adresów sieciowych&lt;/span&gt;&lt;br /&gt;
Jest to odmiana translacji, w której każdy wpis musi zostać ustawiony ręcznie. Z tego też powodu w zastosowaniach życia codziennego metoda ta nadaje się jedynie do udostępnienia "na zewnątrz" serwerów lub innych urządzeń, z którymi chcemy nawiązywać łączność z maszyn znajdujących się poza naszą siecią.&lt;br /&gt;
&lt;br /&gt;
Konfiguracja:&lt;br /&gt;
&lt;pre class="codePacketTracer"&gt;&lt;b&gt;ip nat inside source static&lt;/b&gt; &lt;i&gt;(IP wewnętrzny)&lt;/i&gt; &lt;i&gt;(IP zewnętrzny)&lt;/i&gt;&lt;/pre&gt;&lt;pre class="codePacketTracer"&gt;&lt;b&gt;ip nat inside source static&lt;/b&gt; &lt;i&gt;(tcp/udp)&lt;/i&gt; &lt;i&gt;(IP wewnętrzny)&lt;/i&gt; &lt;i&gt;(port wewnętrzny)&lt;/i&gt; &lt;i&gt;(IP zewnętrzny)&lt;/i&gt; &lt;i&gt;(port zewnętrzny)&lt;/i&gt;&lt;/pre&gt;&lt;br /&gt;
Wydruk z tablicy translacji:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-dZ-r9eJhfmQ/Tl5SpG_FYFI/AAAAAAAAAJ4/uxNcBMDSWBY/s1600/NAT+static.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-dZ-r9eJhfmQ/Tl5SpG_FYFI/AAAAAAAAAJ4/uxNcBMDSWBY/s1600/NAT+static.png" /&gt;&lt;/a&gt;&lt;/div&gt;Warte zauważenia jest to, że komunikaty pochodzące z jednego komputera używają tego samego adresu IP globalnego. Dodatkowo na końcu wydruku pojawia się de facto lista zdefiniowanych translacji statycznych (zaznaczona na zielono).&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;NAT z PAT &lt;/span&gt;&lt;br /&gt;
NAT z PAT to domyślny sposób translacji umożliwiający łączenie się przez jeden adres IP przez wiele maszyn.&lt;br /&gt;
&lt;br /&gt;
Konfiguracja składa się z dwóch etapów. Napoczątku należy utworzyć listę dostępu, która będzie mówić routerowi, które adresy należy tłumaczyć (oczywiście można użyć rozszerzonych list &lt;a href="http://runaurufu.blogspot.com/2011/07/packet-tracer-access-control-list.html"&gt;ACL&lt;/a&gt;):&lt;br /&gt;
&lt;pre class="codePacketTracer"&gt;&lt;b&gt;access-list &lt;/b&gt;&lt;i&gt;(numer listy)&lt;/i&gt;&lt;b&gt; permit any&lt;/b&gt;&lt;/pre&gt;Po jej utworzeniu możemy już ustawić samą translację:&lt;br /&gt;
&lt;pre class="codePacketTracer"&gt;&lt;b&gt;ip nat inside source list &lt;/b&gt;&lt;i&gt;(numer list)&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;b&gt; interface &lt;/b&gt;&lt;i&gt;(nazwa interfejsu)&lt;/i&gt;&lt;b&gt; overload&lt;/b&gt;&lt;/pre&gt;Warto zauważyć, że jeśli nie podamy słówka "&lt;i&gt;overload&lt;/i&gt;" to Packet Tracer i tak je automatycznie doda do konfiguracji (dotyczy to jednak tylko definiowania NAT z wykorzystaniem interfejsu).&lt;br /&gt;
&lt;br /&gt;
Wydruk z tablicy translacji:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-npOV5RCciZk/Tl5SDOHqtDI/AAAAAAAAAJc/vYc-hzAMShU/s1600/PAT.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-npOV5RCciZk/Tl5SDOHqtDI/AAAAAAAAAJc/vYc-hzAMShU/s1600/PAT.png" /&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;Jak widać wszystkie maszyny lokalne używają tego samego adresu IP (czerwony kolor), ale różnych numerów portów (zielony).&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;NAT z PAT przy użyciu wielu adresów IP&lt;/span&gt;&lt;br /&gt;
Podobnie jak w powyższej metodzie tak i tu wiele maszyn może korzystać z jednego zewnętrznego adresu IP. To co jest "nowego" to właśnie mnogość adresów, które są wykorzystywane, gdy pierwszemu zabranie wolnych portów.&lt;br /&gt;
&lt;br /&gt;
Konfiguracja składa się z trzech etapów.&amp;nbsp; Poza omówioną powyżej konfiguracją &lt;a href="http://runaurufu.blogspot.com/2011/07/packet-tracer-access-control-list.html"&gt;listy dostępu&lt;/a&gt; musimy jeszcze utworzyć pulę adresów IP, które router będzie mógł przydzielać:&lt;br /&gt;
&lt;pre class="codePacketTracer"&gt;&lt;b&gt;ip nat pool &lt;/b&gt;&lt;i&gt;(nazwa puli)&lt;/i&gt;&lt;b&gt; &lt;/b&gt;&lt;i&gt;(początkowy adres IP)&lt;/i&gt;&lt;b&gt; &lt;/b&gt;&lt;i&gt;(&lt;/i&gt;&lt;i&gt;końcowy adres IP)&lt;/i&gt;&lt;b&gt; netmask &lt;/b&gt;&lt;i&gt;(maska podsieci)&lt;/i&gt;&lt;/pre&gt;Samą translację zaś konfigurujemy następująco:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="codePacketTracer"&gt;&lt;b&gt;ip nat inside source list&lt;/b&gt; &lt;i&gt;(numer listy)&lt;/i&gt; &lt;b&gt;pool&lt;/b&gt; &lt;i&gt;(nazwa puli)&lt;/i&gt; &lt;b&gt;overload&lt;/b&gt;&lt;/pre&gt;&lt;br /&gt;
Wydruk z tablicy translacji jest praktycznie taki sam jak przy NAT z PAT. Jedyna różnica polega na tym, że gdy skończą się wolne porty na pierwszym adresie IP to router zaczyna używanie kolejnego adresu z puli.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;NAT przy użyciu wielu adresów IP&lt;/span&gt;&lt;br /&gt;
Ta metoda jest w zasadzie podobna do poprzednich, z tą różnicą, że tutaj każda maszyna używa tylko jednego adresu IP. Można zatem powiedzieć, że jest to taki dynamiczny odpowiednik zwykłej statycznej translacji.&lt;br /&gt;
&lt;br /&gt;
Konfiguracja wygląda identycznie jak w przypadku powyższym (NAT z PAT z wieloma adresami). Jedyna zmiana to brak słówka "&lt;i&gt;overload&lt;/i&gt;":&lt;br /&gt;
&lt;pre class="codePacketTracer"&gt;&lt;b&gt;ip nat inside source list&lt;/b&gt; &lt;i&gt;(numer listy)&lt;/i&gt; &lt;b&gt;pool&lt;/b&gt; &lt;i&gt;(nazwa puli)&lt;/i&gt;&lt;/pre&gt;&lt;br /&gt;
Wydruk z tablicy translacji:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-d2XACFtbD8Q/Tl5Sosyo7BI/AAAAAAAAAJ0/a-38WUXtrVY/s1600/NAT+%252B+multiIP.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-d2XACFtbD8Q/Tl5Sosyo7BI/AAAAAAAAAJ0/a-38WUXtrVY/s1600/NAT+%252B+multiIP.png" /&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;Tablica translacji jak widać jest bardzo podobna do tej ze statycznego tłumaczenia adresów i różni się jedynie tym, że przed wykonaniem translacji nie mamy możliwości stwierdzenia, który adres globalny zostanie przypisany do danego adresu lokalnego.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Chcących przetestować działanie NAT na "żywym" organizmie zapraszam do pobrania pliku z konfiguracją sieci: &lt;a href="http://chomikuj.pl/Runaurufu/Edukacja/Packet+Tracer/NAT,994592460.pkt"&gt;link&lt;/a&gt; (PT wersja 5.3) &lt;br /&gt;
&lt;br /&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2570390285559898162-7458890056883812787?l=runaurufu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/IR9f77QdcG0ue2lBd09UhUooP6k/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IR9f77QdcG0ue2lBd09UhUooP6k/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/IR9f77QdcG0ue2lBd09UhUooP6k/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IR9f77QdcG0ue2lBd09UhUooP6k/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LunarIT/~4/083o9SSoWqA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://runaurufu.blogspot.com/feeds/7458890056883812787/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://runaurufu.blogspot.com/2011/08/packet-tracer-network-address.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/7458890056883812787?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/7458890056883812787?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LunarIT/~3/083o9SSoWqA/packet-tracer-network-address.html" title="Packet Tracer: Network Address Translation" /><author><name>Damian Pawlik</name><uri>https://profiles.google.com/110162926853117833033</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-S94uikQs-MY/AAAAAAAAAAI/AAAAAAAAAEU/VXGkqwGc4g8/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-npT8iSDlybY/Tl5SDS5xvUI/AAAAAAAAAJg/zeYn26n9iA0/s72-c/scheme.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://runaurufu.blogspot.com/2011/08/packet-tracer-network-address.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYESHo4fyp7ImA9WhdXF08.&quot;"><id>tag:blogger.com,1999:blog-2570390285559898162.post-8019686934972740953</id><published>2011-08-30T17:58:00.002+02:00</published><updated>2011-08-30T18:01:49.437+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-30T18:01:49.437+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Grafika" /><category scheme="http://www.blogger.com/atom/ns#" term="Dithering" /><category scheme="http://www.blogger.com/atom/ns#" term="PPM" /><title>Dithering</title><content type="html">Tak się jakoś złożyło, że przez ostatnie dni zagłębiłem się w tematykę &lt;a href="http://en.wikipedia.org/wiki/Dither"&gt;ditheringu&lt;/a&gt;. Cóż implementacja algorytmów sama w sobie nie jest ciężka i po prawdzie przynosi ogrom radości, gdy w końcu udaje się wygenerować w miarę podobny do pierwowzoru obraz :P&lt;br /&gt;
Tak czy inaczej w celu uproszczenia programu używałem plików &lt;a href="http://en.wikipedia.org/wiki/Netpbm_format"&gt;PGM/PBM&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Ale czym jest sam dithering? W skrócie to jest to taka transformacja obrazu by przy mniejszej palecie kolorów dawał złudzenie większej palety, czy jak kto woli - najbardziej przypominał on pierwowzór.&lt;br /&gt;
Innymi słowy chodzi o to by np. taki 8 bitowy/px obraz (256 kolorów)&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-OWsQNUVpOzc/Tlznef3ZvzI/AAAAAAAAAIo/KZyv2w-fbGs/s1600/lenabw.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-OWsQNUVpOzc/Tlznef3ZvzI/AAAAAAAAAIo/KZyv2w-fbGs/s320/lenabw.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Orginal grayscale picture&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;Po redukcji do 1 bita na piksel (2 kolory) nie wyglądał tak:&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-eXV6JApygmM/TlzoHyrN4DI/AAAAAAAAAI4/A10HxZgcPGs/s1600/lena-bw.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-eXV6JApygmM/TlzoHyrN4DI/AAAAAAAAAI4/A10HxZgcPGs/s320/lena-bw.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Threshold dithering&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;ale np. tak:&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-Pgrj8pizMFU/Tlznn3bycuI/AAAAAAAAAIw/cU7vDKJW0Ug/s1600/lena_ordered.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-Pgrj8pizMFU/Tlznn3bycuI/AAAAAAAAAIw/cU7vDKJW0Ug/s320/lena_ordered.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Ordered dithering&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-VuBUsFWNVec/TlznlRuAL3I/AAAAAAAAAIs/KYU6Ipp0ZB4/s1600/lena_lunadith.jpg" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-VuBUsFWNVec/TlznlRuAL3I/AAAAAAAAAIs/KYU6Ipp0ZB4/s320/lena_lunadith.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Floyd-Steinberg combined with ordered dithering&lt;span style="font-family: Arial;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-i3Oivnt6ayo/Tlzn7YM_82I/AAAAAAAAAI0/2phsQuaBMXo/s1600/lena_lunadith_posterize.jpg" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-i3Oivnt6ayo/Tlzn7YM_82I/AAAAAAAAAI0/2phsQuaBMXo/s320/lena_lunadith_posterize.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Floyd-Steinberg combined with ordered dithering and negative error propagation&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;Prawda, że widać różnicę? Algorytmów do ditheringu jest cała masa i mimo iż niegdyś używano ich prawie jedynie do przełamywania technologicznych ograniczeń (np. wyświetlacze o małej gamie barw) to obecnie używa się ich również w artystycznym ujęciu. Ot choćby obraz wektorowy poddany ditheringowi może okazać się ciekawszy dla widza niż przed taką obróbką (ludzie to takie dziwne stworzenia co nie lubią wyraźnych konturów i jednolitych powierzchni).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2570390285559898162-8019686934972740953?l=runaurufu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/7jhNDDxbs0yErDHey2mHqaAtLm8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7jhNDDxbs0yErDHey2mHqaAtLm8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/7jhNDDxbs0yErDHey2mHqaAtLm8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7jhNDDxbs0yErDHey2mHqaAtLm8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LunarIT/~4/jZxItTvBT3w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://runaurufu.blogspot.com/feeds/8019686934972740953/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://runaurufu.blogspot.com/2011/08/dithering.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/8019686934972740953?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/8019686934972740953?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LunarIT/~3/jZxItTvBT3w/dithering.html" title="Dithering" /><author><name>Damian Pawlik</name><uri>https://profiles.google.com/110162926853117833033</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-S94uikQs-MY/AAAAAAAAAAI/AAAAAAAAAEU/VXGkqwGc4g8/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-OWsQNUVpOzc/Tlznef3ZvzI/AAAAAAAAAIo/KZyv2w-fbGs/s72-c/lenabw.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://runaurufu.blogspot.com/2011/08/dithering.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0MASHc7eip7ImA9WhdUEEk.&quot;"><id>tag:blogger.com,1999:blog-2570390285559898162.post-5000841185268252908</id><published>2011-08-28T18:57:00.001+02:00</published><updated>2011-09-26T14:50:49.902+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-26T14:50:49.902+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="PHP" /><title>Łączenie ciągów tekstowych</title><content type="html">Chyba jednym z najpowszechniejszych działań w PHP jest łączenie różnej maści ciągów. Czy to przy budowaniu zapytań do bazy, czy też przy generowaniu treści do wyświetlenia. Jednak czy zastanawialiście się nad różnicami w sposobie łączenia ciągów? W tym wpisie porównam metodę doklejania kolejnych elementów za pomocą ".", dołączania wartości zmiennych przy pomocy "{$var}" oraz działanie funkcji &lt;a href="http://php.net/manual/en/function.sprintf.php"&gt;sprintf&lt;/a&gt;. A na koniec porównam wydajność rzutowań bezpośrednich oraz konwersji z użyciem &lt;a href="http://php.net/manual/en/function.sprintf.php"&gt;sprintf&lt;/a&gt;a.&lt;br /&gt;
&lt;br /&gt;
Na początek mały test pokazujący różnice pomiędzy pustymi sprintf, "" oraz ''.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="console"&gt;Sprintf:	    5.5083110332
" ":		    1.8283259869
' ':		    1.7890319824&lt;/pre&gt;
&lt;br /&gt;
oraz sam test dla "" i '':&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="console"&gt;" ":	    1.1731438637
' ':	    1.1480429173
" ":	    1.1413729191
' ':	    1.1829788685&lt;/pre&gt;
&lt;br /&gt;
Jak widać różnice w wydajności pomiędzy "" a '' są praktycznie nieistniejące, natomiast &lt;a href="http://php.net/manual/en/function.sprintf.php"&gt;sprintf&lt;/a&gt; wykonuje się 3 razy dłużej.&lt;br /&gt;
Porównajmy zatem wydajność przy dołączaniu tekstu zapisanego w zmiennej pomiędzy inne elementy.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="console"&gt;Sprintf:	7.5031311511993
" "." ":	2.9455320835114
" ":		3.1112060546875
{ }:		3.1566998958588&lt;/pre&gt;
&lt;br /&gt;
Wyniki te kolejno odnoszą się do kodu:&lt;br /&gt;
&lt;pre class="codePHP"&gt;$temp = sprintf("prefix %s postfix",$text);
$temp = "prefix ".$text." postfix";
$temp = "prefix $text postfix";
$temp = "prefix {$text} postfix";&lt;/pre&gt;
&lt;br /&gt;
Okazuje się, że najszybciej działa łączenie kolejnych niezależnych ciągów, następnie w szeregu wydajności znajdują się metody "na skróty", a na końcu wywołanie funkcji &lt;a href="http://php.net/manual/en/function.sprintf.php"&gt;sprintf&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Na sam koniec zostawiłem porównanie wydajności&lt;a href="http://pl.php.net/manual/en/language.types.type-juggling.php"&gt; rzutowań na typy&lt;/a&gt; liczbowe - integer i float. Wyniki prezentują się następująco:&lt;br /&gt;
&lt;pre class="console"&gt;Sprintf %d:	    0.7861609459	666
Sprintf %u:	    0.7842721939	666
Sprintf %f:	    1.2757029533	666.999000
(int):		    0.2504780293	666
(float):	    0.2895848751	666.999&lt;/pre&gt;
&lt;br /&gt;
Funkcja &lt;a href="http://php.net/manual/en/function.sprintf.php"&gt;sprintf&lt;/a&gt; znowu jest trzykrotnie, a w przypadku&lt;a href="http://pl.php.net/manual/en/language.types.type-juggling.php"&gt; rzutowania&lt;/a&gt; na float ponad czterokrotnie wolniejszy. Jednak sytuacja ta zmienia się diametralnie gdy zaczynamy tworzyć ciąg składający się z wielu zmiennych:&lt;br /&gt;
&lt;pre class="console"&gt;Sprintf %d %f:		    6.8353290558
Sprintf %1$d %2$f:	    7.3985271454
(int), (float)		    8.1965639591&lt;/pre&gt;
&lt;br /&gt;
Wyniki te odpowiadają kodowi:&lt;br /&gt;
&lt;pre class="codePHP"&gt;$temp = sprintf("%d %f %d",$numeric, $float, $int);
$temp = sprintf('%1$d %2$f %3$d',$numeric, $float, $int);
$temp = (int)$numeric." ".(float)$float." ".(int)$int;&lt;/pre&gt;
&lt;br /&gt;
Przy tworzeniu rozbudowanych ciągów tekstowych jednak warto użyć funkcji &lt;a href="http://php.net/manual/en/function.sprintf.php"&gt;sprintf&lt;/a&gt;. Jednak z drugiej strony przy pojedynczych zmiennych o wiele lepiej używać &lt;a href="http://pl.php.net/manual/en/language.types.type-juggling.php"&gt;bezpośredniego rzutowania&lt;/a&gt;. To na co również warto zwrócić uwagę to fakt, że odnoszenie się do zmiennych poprzez %1$, %2$ itd. mimo iż jest z pewnością szybsze do napisania to jednak działa nieco wolniej od bezpośredniego podawania każdego z parametrów (nawet jeśli musimy je podawać wielokrotnie w jednym wywołaniu funkcji).&lt;br /&gt;
&lt;br /&gt;
Wykorzystany kod do testowania można pobrać jak zwykle z mojego chomika (&lt;a href="http://chomikuj.pl/Runaurufu/Edukacja/PHP/text,987251880.php"&gt;link&lt;/a&gt;). &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2570390285559898162-5000841185268252908?l=runaurufu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/qXeZ8rVJJPrFBGQ2Fk1Ly9Iuh9Y/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qXeZ8rVJJPrFBGQ2Fk1Ly9Iuh9Y/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/qXeZ8rVJJPrFBGQ2Fk1Ly9Iuh9Y/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qXeZ8rVJJPrFBGQ2Fk1Ly9Iuh9Y/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LunarIT/~4/omaO0L01jB4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://runaurufu.blogspot.com/feeds/5000841185268252908/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://runaurufu.blogspot.com/2011/08/aczenie-ciagow-tekstowych.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/5000841185268252908?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/5000841185268252908?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LunarIT/~3/omaO0L01jB4/aczenie-ciagow-tekstowych.html" title="Łączenie ciągów tekstowych" /><author><name>Damian Pawlik</name><uri>https://profiles.google.com/110162926853117833033</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-S94uikQs-MY/AAAAAAAAAAI/AAAAAAAAAEU/VXGkqwGc4g8/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://runaurufu.blogspot.com/2011/08/aczenie-ciagow-tekstowych.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0MAQ3g4eyp7ImA9WhdUEEk.&quot;"><id>tag:blogger.com,1999:blog-2570390285559898162.post-532620722548885398</id><published>2011-08-05T17:11:00.000+02:00</published><updated>2011-09-26T14:50:42.633+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-26T14:50:42.633+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="PHP" /><title>Dostęp do prywatnych pól klas przodków w PHP</title><content type="html">Ten wpis jest w zasadzie rozszerzeniem &lt;a href="http://runaurufu.blogspot.com/2011/08/listowanie-nazw-pol-klasy-w-php.html"&gt;poprzedniego wpisu&lt;/a&gt;. To co tutaj zostanie omówione to stricte dostęp do pól prywatnych danej klasy, jak i również troszkę bardziej rozbudowany przykład wykorzystania klas z rodziny &lt;a href="http://mx.php.net/manual/en/book.reflection.php"&gt;&lt;i&gt;Reflection&lt;/i&gt;&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Jak można było zauważyć w poprzednim wpisie funkcja &lt;a href="http://mx.php.net/manual/en/function.get-object-vars.php"&gt;&lt;i&gt;get_object_vars()&lt;/i&gt;&lt;/a&gt; realizuje de facto zadanie pobrania wartości i nazw pól klas. Jej wadą jest jednak niemożność dojścia do metod prywatnych przodków naszej klasy i właśnie w celu dodania tej funkcjonalności niezbędne okażą się klasy &lt;a href="http://mx.php.net/manual/en/book.reflection.php"&gt;&lt;i&gt;Reflection&lt;/i&gt;&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Na początek przypomnijmy jednak sobie naszą hierarchię klas... &lt;br /&gt;
&lt;pre class="codePHP"&gt;class First
{
    private $firstPrivate;
    protected $firstProtected;
    public $firstPublic="DEFAULT";
}

class Second extends First
{
    private $secondPrivate;
    protected $secondProtected;
    public $secondPublic;
}

class Third extends Second
{
    private $thirdPrivate;
    protected $thirdProtected;
    public $thirdPublic;
}&lt;/pre&gt;
&lt;br /&gt;
Aby dobrać się do metod prywatnych potrzebujemy o wiele bardziej rozbudowanego kodu niż ten umieszczony w poprzednim wpisie, oraz rekurencji koniecznej do przejścia po grafu dziedziczenia klas.&lt;br /&gt;
Takim chyba najprostszym przykładem pobrania wartości wszystkich parametrów jest funkcja:&lt;br /&gt;
&lt;pre class="codePHP"&gt;function getAllFields($object)
{
    $globalFields = array();
    $reflectionClass = new ReflectionClass($object);
    do
    {
        $reflections = $reflectionClass-&amp;gt;getProperties();

        foreach($reflections as $reflectionProperty)
        {
            $reflectionProperty-&amp;gt;setAccessible(true);
            $globalFields[$reflectionProperty-&amp;gt;name] = $reflectionProperty-&amp;gt;getValue($object);
        }
        $reflectionClass = $reflectionClass-&amp;gt;getParentClass();
    }
    while($reflectionClass);
    return $globalFields;
}&lt;/pre&gt;
dająca taki oto rezultat&lt;br /&gt;
&lt;pre class="console"&gt;Array
(
    [thirdPrivate] =&amp;gt; 
    [thirdProtected] =&amp;gt; 
    [thirdPublic] =&amp;gt; NEW
    [secondProtected] =&amp;gt; 
    [secondPublic] =&amp;gt; 
    [firstProtected] =&amp;gt; 
    [firstPublic] =&amp;gt; DEFAULT
    [secondPrivate] =&amp;gt; 
    [firstPrivate] =&amp;gt; NEW PRIVATE
)&lt;/pre&gt;
Funkcję ta jednak ma główną wadę w postaci nadpisywania zmiennych klas bliższych badanemu obiektowi przez zmienne jego przodków. Na szczęście można tą funkcję dowolnie rozwijać i sprawić by generowała wszelkie informacje dotyczące badanej klasy:&lt;br /&gt;
&lt;pre class="codePHP"&gt;function getAllFieldsStrict($object)
{
    $globalFields = array();
    $reflectionClass = new ReflectionClass($object);
    do
    {
        $reflections = $reflectionClass-&amp;gt;getProperties();

        foreach($reflections as $reflectionProperty)
        {
            if($reflectionProperty-&amp;gt;getDeclaringClass()-&amp;gt;name == $reflectionProperty-&amp;gt;name)
            {
                switch(true)
                {
                    case $reflectionProperty-&amp;gt;isPrivate(): $globalFields[$reflectionProperty-&amp;gt;name][$reflectionProperty-&amp;gt;name]['access'] = 'private'; break;
                    case $reflectionProperty-&amp;gt;isProtected(): $globalFields[$reflectionProperty-&amp;gt;name][$reflectionProperty-&amp;gt;name]['access'] = 'protected'; break;
                    case $reflectionProperty-&amp;gt;isPublic(): $globalFields[$reflectionProperty-&amp;gt;name][$reflectionProperty-&amp;gt;name]['access'] = 'public'; break;
                }
                $reflectionProperty-&amp;gt;setAccessible(true);
                $globalFields[$reflectionProperty-&amp;gt;name][$reflectionProperty-&amp;gt;name]['value'] = $reflectionProperty-&amp;gt;getValue($object);
                $globalFields[$reflectionProperty-&amp;gt;name][$reflectionProperty-&amp;gt;name]['static'] = $reflectionProperty-&amp;gt;isStatic();
            }
        }
        $reflectionClass = $reflectionClass-&amp;gt;getParentClass();
    }
    while($reflectionClass);
    return $globalFields;
}&lt;/pre&gt;
czego rezultatem jest&lt;br /&gt;
&lt;pre class="console"&gt;Array
(
    [Third] =&amp;gt; Array
        (
            [thirdPrivate] =&amp;gt; Array
                (
                    [value] =&amp;gt; 
                    [static] =&amp;gt; 
                    [access] =&amp;gt; private
                )
            [thirdProtected] =&amp;gt; Array
                (
                    [value] =&amp;gt; 
                    [static] =&amp;gt; 
                    [access] =&amp;gt; protected
                )
            [thirdPublic] =&amp;gt; Array
                (
                    [value] =&amp;gt; NEW
                    [static] =&amp;gt; 
                    [access] =&amp;gt; public
                )
        )
    [Second] =&amp;gt; Array
        (
            [secondPrivate] =&amp;gt; Array
                (
                    [value] =&amp;gt; 
                    [static] =&amp;gt; 
                    [access] =&amp;gt; private
                )
            [secondProtected] =&amp;gt; Array
                (
                    [value] =&amp;gt; 
                    [static] =&amp;gt; 
                    [access] =&amp;gt; protected
                )
            [secondPublic] =&amp;gt; Array
                (
                    [value] =&amp;gt; 
                    [static] =&amp;gt; 
                    [access] =&amp;gt; public
                )
        )
    [First] =&amp;gt; Array
        (
            [firstPrivate] =&amp;gt; Array
                (
                    [value] =&amp;gt; NEW PRIVATE
                    [static] =&amp;gt; 
                    [access] =&amp;gt; private
                )
            [firstProtected] =&amp;gt; Array
                (
                    [value] =&amp;gt; 
                    [static] =&amp;gt; 
                    [access] =&amp;gt; protected
                )
            [firstPublic] =&amp;gt; Array
                (
                    [value] =&amp;gt; DEFAULT
                    [static] =&amp;gt; 
                    [access] =&amp;gt; public
                )
        )
)&lt;/pre&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;Wydajność&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;pre class="console"&gt;get_object_vars:  0.28459501266479
getAllFields:   4.3010709285736
getAllFieldsStrict:  4.3191359043121&lt;/pre&gt;
Podczas testu wykonano każde z zapytań 100000 razy i jak widać wygenerowanie rozbudowanej struktury klas zajmuje praktycznie tyle samo czasu co stworzenie prostszej. Mimo wszystko jednak generowanie trwa ok. 15 razy dłużej w porównaniu do wyciągnięcia informacji za pomocą &lt;a href="http://mx.php.net/manual/en/function.get-object-vars.php"&gt;&lt;i&gt;get_object_vars()&lt;/i&gt;&lt;/a&gt;, dlatego też jeśli potrzebujemy dostać się do zmiennych klas i mamy możliwość deklarowania pól jako protected a nie private - to zdecydowanie lepiej tak zrobić i używać &lt;a href="http://mx.php.net/manual/en/function.get-object-vars.php"&gt;&lt;i&gt;get_object_vars()&lt;/i&gt;&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Przykładowy kod do testowania można pobrać z mojego chomika (&lt;a href="http://chomikuj.pl/Runaurufu/Edukacja/PHP/PHP1,931340776.php"&gt;&lt;/a&gt;&lt;a href="http://chomikuj.pl/Runaurufu/Edukacja/PHP/text,932660114.php"&gt;link&lt;/a&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2570390285559898162-532620722548885398?l=runaurufu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tR6slr6DsRkikzNDhFO6MRaetDU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tR6slr6DsRkikzNDhFO6MRaetDU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/tR6slr6DsRkikzNDhFO6MRaetDU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tR6slr6DsRkikzNDhFO6MRaetDU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LunarIT/~4/a0tchClrprY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://runaurufu.blogspot.com/feeds/532620722548885398/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://runaurufu.blogspot.com/2011/08/dostep-do-prywatnych-pol-klas-przodkow.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/532620722548885398?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/532620722548885398?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LunarIT/~3/a0tchClrprY/dostep-do-prywatnych-pol-klas-przodkow.html" title="Dostęp do prywatnych pól klas przodków w PHP" /><author><name>Damian Pawlik</name><uri>https://profiles.google.com/110162926853117833033</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-S94uikQs-MY/AAAAAAAAAAI/AAAAAAAAAEU/VXGkqwGc4g8/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://runaurufu.blogspot.com/2011/08/dostep-do-prywatnych-pol-klas-przodkow.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0MHRH8_fCp7ImA9WhdUEEk.&quot;"><id>tag:blogger.com,1999:blog-2570390285559898162.post-5704755041511017520</id><published>2011-08-04T13:55:00.005+02:00</published><updated>2011-09-26T14:50:35.144+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-26T14:50:35.144+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="PHP" /><title>Listowanie nazw pól klasy w PHP</title><content type="html">Chcąc dobrać się do zmiennych klasy - ich nazw oraz ewentualnie wartości - dokopałem się do trzech sposobów. Dwa z nich (&lt;a href="http://mx.php.net/manual/en/function.get-class-vars.php"&gt;&lt;i&gt;get_class_vars()&lt;/i&gt;&lt;/a&gt; i &lt;a href="http://mx.php.net/manual/en/function.get-object-vars.php"&gt;&lt;i&gt;get_object_vars()&lt;/i&gt;&lt;/a&gt;) pochodzą jeszcze z czasów strukturalnego pisania kodu, zaś trzeci (&lt;a href="http://mx.php.net/manual/en/book.reflection.php"&gt;&lt;i&gt;ReflectionClass&lt;/i&gt;&lt;/a&gt;) jest już cudem współczesnego przerośniętego obiektowego PHP5.&lt;br /&gt;
&lt;br /&gt;
No ale przechodząc do rzeczy, a właściwie do przykładu obrazującego o co mi chodzi :)&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="codePHP"&gt;class First
{
    private $firstPrivate;
    protected $firstProtected;
    public $firstPublic="DEFAULT";
}

class Second extends First
{
    private $secondPrivate;
    protected $secondProtected;
    public $secondPublic;
}

class Third extends Second
{
    private $thirdPrivate;
    protected $thirdProtected;
    public $thirdPublic;
}&lt;/pre&gt;
Otóż mamy 3 klasy, a w każdej z nich 3 zmienne - private, protected i public... Na początku miałem nadzieję, że uda się dobrać do nich wszystkich, jednak okazało się, że do pól prywatnych można dostać się jedynie z kontekstu tej samej klasy - tak więc musiałbym w każdej klasie umieszczać dedykowany kod (lub użyć &lt;a href="http://runaurufu.blogspot.com/2011/08/dostep-do-prywatnych-pol-klas-przodkow.html"&gt;przerośniętej funkcji&lt;/a&gt; działającej w oparciu o&amp;nbsp;&lt;a href="http://mx.php.net/manual/en/book.reflection.php"&gt;Reflection&lt;/a&gt;), a takie rozwiązanie w grę nie wchodziło :x Tak więc poświęciłem prywatne zmienne i zamieniłem je na protected i ten problem zniknął ^.^&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;Pobieranie nazw parametrów&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
Jednak wracając do zagadnienia - samo uzyskanie nazw zmiennych jest dość banalne i można je osiągnać choćby dzięki dowolnej z poniższych metod:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="codePHP"&gt;function getClassVars()
{
    return get_class_vars(get_class($this));
}

function getObjectVars()
{
    return get_object_vars($this);
}

function reflectionGetDefaultProperties()
{
    $reflectionClass = new ReflectionClass($this);
    return $reflectionClass-&amp;gt;getDefaultProperties();
}

function reflectionGetProperties()
{
    $reflectionClass = new ReflectionClass($this);
    return $reflectionClass-&amp;gt;getProperties();
}&lt;/pre&gt;
&lt;br /&gt;
3 pierwsze z nich zwracają tablicę, w której klucze elementów mają nazwę parametrów, a wartości do tych kluczy przypisane równe są wartościom obiektów. Tylko, że tutaj uwaga, gdyż &lt;a href="http://mx.php.net/manual/en/function.get-class-vars.php"&gt;&lt;i&gt;get_class_vars()&lt;/i&gt;&lt;/a&gt; oraz &lt;a href="http://mx.php.net/manual/en/reflectionclass.getdefaultproperties.php"&gt;&lt;i&gt;-&amp;gt;getDefaultProperties&lt;/i&gt;&lt;/a&gt; zwracają jedynie wartości na sztywno przypisane (domyślne) w kodzie do poszczególnych zmiennych, a nie aktualne wartości tych zmiennych w instancji obiektu.&lt;br /&gt;
&lt;br /&gt;
Tak więc po wykonaniu kodu:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="codePHP"&gt;class First
{
    private $firstPrivate;
    protected $firstProtected;
    public $firstPublic="DEFAULT";
    static $firstStatic = "STATIC";

/** metody identyczne do podanych w poprzednim przykładzie */
 function getClassVars() {...}
 function getObjectVars() {...}
 function reflectionGetDefaultProperties() {...}
 function reflectionGetProperties() {...}
}

$object = new A();
$object-&amp;gt;firstPublic = "NEW";

print_r($d-&amp;gt;getClassVars());
print_r($d-&amp;gt;getObjectVars());
print_r($d-&amp;gt;reflectionGetDefaultProperties());
print_r($d-&amp;gt;reflectionGetProperties());&lt;/pre&gt;
otrzymamy:&lt;br /&gt;
&lt;pre class="console"&gt;Array
( 
    [firstStatic] =&amp;gt; STATIC
    [firstPrivate] =&amp;gt; 
    [firstProtected] =&amp;gt; 
    [firstPublic] =&amp;gt; DEFAULT
)
Array
(
    [firstPrivate] =&amp;gt; 
    [firstProtected] =&amp;gt; 
    [firstPublic] =&amp;gt; NEW
)
Array
(
    [firstPrivate] =&amp;gt; 
    [firstProtected] =&amp;gt; 
    [firstPublic] =&amp;gt; DEFAULT
    [firstStatic] =&amp;gt; STATIC
)
Array
(
    [0] =&amp;gt; ReflectionProperty Object
        (
            [name] =&amp;gt; firstPrivate
            [class] =&amp;gt; First
        )

    [1] =&amp;gt; ReflectionProperty Object
        (
            [name] =&amp;gt; firstProtected
            [class] =&amp;gt; First
        )

    [2] =&amp;gt; ReflectionProperty Object
        (
            [name] =&amp;gt; firstPublic
            [class] =&amp;gt; First
        )

    [3] =&amp;gt; ReflectionProperty Object
        (
            [name] =&amp;gt; firstStatic
            [class] =&amp;gt; First
        )
)&lt;/pre&gt;
&lt;br /&gt;
Jednak jeśli zależy nam tylko na nazwach zmiennych to generalnie nie ma wielkiej różnicy w wybranej metodzie. Poza tym jak widać ostatnia metoda (&lt;a href="http://mx.php.net/manual/en/reflectionclass.getproperties.php"&gt;&lt;i&gt;-&amp;gt;getProperties&lt;/i&gt;&lt;/a&gt;) zwraca nam obiekty klasy &lt;a href="http://mx.php.net/manual/en/class.reflectionproperty.php"&gt;&lt;i&gt;ReflectionProperty&lt;/i&gt;&lt;/a&gt;.. ale o tym w innym wpisie. Warto jeszcze wspomnieć o tym, że &lt;a href="http://mx.php.net/manual/en/function.get-object-vars.php"&gt;&lt;i&gt;get_object_vars()&lt;/i&gt; &lt;/a&gt;&lt;b&gt;nie zwraca statycznych pól klasy&lt;/b&gt;, ale po co nam one jeśli chodzi nam o stan konkretnej instancji obiektu?&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;span style="font-size: large;"&gt;&lt;b&gt;Wydajność&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
Generalnie jeśli zależy nam jedynie na uzyskaniu nazw parametrów to dlaczego by nie wybrać najszybszej metody? Testy przeprowadziłem na hostingu &lt;a href="http://www.google.pl/url?sa=t&amp;amp;source=web&amp;amp;cd=1&amp;amp;sqi=2&amp;amp;ved=0CBYQFjAA&amp;amp;url=http%3A%2F%2Fwww.ovh.pl%2F&amp;amp;rct=j&amp;amp;q=60free%20ovh&amp;amp;ei=v306Tvb-F4qfOv_qucQD&amp;amp;usg=AFQjCNHG6-D0xZ2W5-ztrNOZeZc5kumCvA&amp;amp;sig2=iyrI-xvydgboaZdehsgPNA&amp;amp;cad=rja"&gt;ovh&lt;/a&gt; (większa stabilność wyników niż przy testowaniu na własnym kompie):&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="console"&gt;get_class_vars:   3.3929491043091
get_object_vars:   2.7406477928162
-&amp;gt;getDefaultProperties:  3.6021101474762
-&amp;gt;getProperties:   8.8276469707489&lt;/pre&gt;
&lt;br /&gt;
Test polegał na wykonaniu pętli&lt;br /&gt;
&lt;pre class="codePHP"&gt;for ($i = 0; $i &amp;lt; 1000000; $i++){ $d-&amp;gt;bref(); }&lt;/pre&gt;
dla każdego z zapytań i zmierzenie czasu za pomocą funkcji &lt;a href="http://mx.php.net/manual/en/function.microtime.php"&gt;microtime(true)&lt;/a&gt;. Jak widać po wynikach najszybciej działa funkcja &lt;a href="http://mx.php.net/manual/en/function.get-object-vars.php"&gt;&lt;i&gt;get_object_vars()&lt;/i&gt;&lt;/a&gt;, a najwolniejsze w użyciu są klasy z rodziny &lt;a href="http://mx.php.net/manual/en/book.reflection.php"&gt;&lt;i&gt;Reflection&lt;/i&gt;&lt;/a&gt;. Oczywiście w przypadku wpisania nazwy klas na sztywno (literka &lt;b&gt;s&lt;/b&gt; przy opisie) zamiast używania &lt;a href="http://mx.php.net/manual/en/function.get-class.php"&gt;&lt;i&gt;get_class()&lt;/i&gt;&lt;/a&gt; wyniki są trochę lepsze (wyniki w dwóch zestawach gdyż sumarycznie przekraczają 30 sekundowy maksymalny czas wykonania skryptu):&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="console"&gt;get_class_vars:   3.3419530391693
get_class_vars (s):   3.0308630466461
get_object_vars:   2.6966669559479&lt;/pre&gt;
&lt;br /&gt;
&lt;pre class="console"&gt;get_object_vars:   2.6544170379639
-&amp;gt;getDefaultProperties:  3.5368349552155
-&amp;gt;getDefaultProperties (s):  3.5258779525757
-&amp;gt;getProperties:   8.8363699913025
-&amp;gt;getProperties (s):   8.7472901344299&amp;nbsp;&lt;/pre&gt;
&lt;br /&gt;
Co ciekawe najbardziej na tej zmianie zyskuje &lt;a href="http://mx.php.net/manual/en/function.get-class-vars.php"&gt;&lt;i&gt;get_class_vars()&lt;/i&gt;&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Przykładowy kod do przeprowadzenia testów można pobrać (jak zawsze) z mojego chomika (&lt;a href="http://chomikuj.pl/Runaurufu/Edukacja/PHP/text,932681239.php"&gt;link&lt;/a&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2570390285559898162-5704755041511017520?l=runaurufu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/x68DdPdTvLxW7pH2rg1bht0nobM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/x68DdPdTvLxW7pH2rg1bht0nobM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/x68DdPdTvLxW7pH2rg1bht0nobM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/x68DdPdTvLxW7pH2rg1bht0nobM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LunarIT/~4/GR1nxkraWXg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://runaurufu.blogspot.com/feeds/5704755041511017520/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://runaurufu.blogspot.com/2011/08/listowanie-nazw-pol-klasy-w-php.html#comment-form" title="Komentarze (2)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/5704755041511017520?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/5704755041511017520?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LunarIT/~3/GR1nxkraWXg/listowanie-nazw-pol-klasy-w-php.html" title="Listowanie nazw pól klasy w PHP" /><author><name>Damian Pawlik</name><uri>https://profiles.google.com/110162926853117833033</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-S94uikQs-MY/AAAAAAAAAAI/AAAAAAAAAEU/VXGkqwGc4g8/s512-c/photo.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://runaurufu.blogspot.com/2011/08/listowanie-nazw-pol-klasy-w-php.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4AQn0zeSp7ImA9WhRWFEs.&quot;"><id>tag:blogger.com,1999:blog-2570390285559898162.post-4837829790763519532</id><published>2011-07-28T14:05:00.001+02:00</published><updated>2012-01-02T01:09:03.381+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-02T01:09:03.381+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Windows" /><category scheme="http://www.blogger.com/atom/ns#" term="Gry" /><title>Battlefield 2142 Deluxe</title><content type="html">&lt;div style="text-align: justify;"&gt;
Skoro już od kilku postów jestem na tej fali rozwiązywania problemów z grami, to podzielę się również swą receptą na uruchomienie BF2142. Otóż z tą grą jest taki podstawowy problem, że (przynajmniej wersja Deluxe) dostępna jest w wersji 1.4, a do gry na oficjalnych serwerach potrzebna jest wersja 1.5... tylko, że przy próbach aktualizacji (lub później już przy próbie gry) wyskakują różnego rodzaju problemy: a to klient niezgodny, a to nie da się zaktualizować gry.. ot cała gama różnych dziwacznych problemów. Rozwiązanie tych problemów jest proste, aczkolwiek jego odnalezienie wymaga poświęcenia odrobiny czasu i cierpliwości.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Na wstępie zaznaczę, że jeśli zainstalowałeś patcha i coś nie śmiga - cóż możesz próbować wykonać jakiś fragment tego poradnika, ale zapewne&lt;b&gt; łatwiej i szybciej będzie przeinstalować grę i postępować zgodnie z tym co tu napisałem.&lt;/b&gt; :)&lt;br /&gt;
&lt;br /&gt;
Spis wszystkich rzeczy jakie będziemy potrzebowali: &lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;edytor rejestru&lt;/li&gt;
&lt;li&gt;&lt;a href="http://chomikuj.pl/Runaurufu/Gry/Patch/Battlefield+2142/BF2142_Update_1.50,818532266.exe"&gt;pełny patch do wersji 1.50&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://chomikuj.pl/Runaurufu/Gry/Patch/Battlefield+2142/pbsetup,818172645.exe"&gt;punkbuster setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://chomikuj.pl/Runaurufu/Gry/Patch/Battlefield+2142/pbsvc,818171893.exe"&gt;punkbuster service&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://chomikuj.pl/Runaurufu/Gry/Patch/Battlefield+2142/BF2142,818170563.exe"&gt;scrackowany plik .exe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
Pierwszym krokiem&lt;b&gt; po instalacji gry&lt;/b&gt; jest uruchomienie edytora rejestru (Uruchom-&amp;gt;regedit).&lt;/div&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-p4rdAjMVRCs/TjEYdTmhckI/AAAAAAAAAFs/OwPjOhf9yUI/s1600/bf2142_regEdit-1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-p4rdAjMVRCs/TjEYdTmhckI/AAAAAAAAAFs/OwPjOhf9yUI/s1600/bf2142_regEdit-1.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;W starszych wersjach Windowsa wystarczy kliknąć guzik "Uruchom" i tam wpisać "regedit"&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style="text-align: center;"&gt;
Po jego uruchomieniu należy wyszukać wpisy dotyczące Battlefielda 2142.&lt;br /&gt;
Na Windows 7 (na moim komputerku) ścieżka do nich jest następująca:&lt;/div&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-k-LJTyy-JT8/TjEYdR6ivyI/AAAAAAAAAFo/7O7gi4YKw3A/s1600/bf2142_regEdit-2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="15" src="http://4.bp.blogspot.com/-k-LJTyy-JT8/TjEYdR6ivyI/AAAAAAAAAFo/7O7gi4YKw3A/s400/bf2142_regEdit-2.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Zapewne dokładna ścieżka może się różnić pomiędzy systemami, ale generalnie gdzieś tam powinien być odpowiedni wpis&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Teraz należy zmienić zapisaną wersję z &lt;b&gt;1.40&lt;/b&gt; na &lt;b&gt;1.10&lt;/b&gt;. Dzięki temu patch zostanie bez problemów zainstalowany, a sama gra będzie zgodna z wymaganiami serwerów.&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Jp8YEKoHyvE/TjEYdW9gLEI/AAAAAAAAAFw/plI62S-qmG8/s1600/bf2142_regEdit-3.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-Jp8YEKoHyvE/TjEYdW9gLEI/AAAAAAAAAFw/plI62S-qmG8/s1600/bf2142_regEdit-3.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Zaznaczamy "Version" i klikamy ją prawym przyciskiem myszy&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-6aepQJmpFng/TjEYdgHtSEI/AAAAAAAAAF0/XkWUc83nAFA/s1600/bf2142_regEdit-4.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-6aepQJmpFng/TjEYdgHtSEI/AAAAAAAAAF0/XkWUc83nAFA/s1600/bf2142_regEdit-4.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Pojawi się takie menu - wybieramy "Modyfikuj"&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-mGuBd3acOyc/TjEYeEd0ZxI/AAAAAAAAAF8/IDYF39hjEXc/s1600/bf2142_regEdit-5.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-mGuBd3acOyc/TjEYeEd0ZxI/AAAAAAAAAF8/IDYF39hjEXc/s1600/bf2142_regEdit-5.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Tutaj wpisujemy nową wartość i wciskamy "OK"&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&amp;nbsp; &lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&amp;nbsp;Po zmianie w rejestrze patchujemy grę pełnym patchem do wersji 1.50 (&lt;a href="http://chomikuj.pl/Runaurufu/Gry/Patch/Battlefield+2142/BF2142_Update_1.50,818532266.exe"&gt;link&lt;/a&gt;)&lt;/div&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-6Qwwp7q8JN8/TjEYeoJgfAI/AAAAAAAAAGA/RmJk9ZMjbvA/s1600/bf2142_update.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-6Qwwp7q8JN8/TjEYeoJgfAI/AAAAAAAAAGA/RmJk9ZMjbvA/s1600/bf2142_update.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Ach ten nowoczesny wygląd patchera :&amp;gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
Teraz znów edytujemy wersję gry w rejestrze i wpisujemy &lt;b&gt;1.50&lt;/b&gt;.&lt;br /&gt;
Nasz rejestr powinien teraz wyglądać mniej więcej tak:&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-0AThRQ1K9ck/TjEYd8mlU6I/AAAAAAAAAF4/Wa5k0wm5Ww0/s1600/bf2142_regEdit-6.png" imageanchor="1"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-0AThRQ1K9ck/TjEYd8mlU6I/AAAAAAAAAF4/Wa5k0wm5Ww0/s1600/bf2142_regEdit-6.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
Teraz możemy już odpalić grę i spróbować czy wszystko działa. W tym momencie mogą w zasadzie pojawić się dwa zasadnicze problemy: gra może nie chcieć się nam uruchomić, albo możemy być wyrzucani z serwerów przez punkbustera :)&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;span style="font-size: large;"&gt;&lt;b&gt;Punkbuster wyrzuca nas z serwera&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-xiZBrGcldwk/TjEYjy1a83I/AAAAAAAAAGE/wDK7zESJPFY/s1600/bf2142_scr-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://2.bp.blogspot.com/-xiZBrGcldwk/TjEYjy1a83I/AAAAAAAAAGE/wDK7zESJPFY/s400/bf2142_scr-1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
Uruchamiamy pbsetup.exe (&lt;a href="http://chomikuj.pl/Runaurufu/Gry/Patch/Battlefield+2142/pbsetup,818172645.exe"&gt;link&lt;/a&gt;) i dodajemy Battlefielda 2142 do punkbustera.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-viEBYjriT48/TjEYc6v6L8I/AAAAAAAAAFg/G2Rc2HO9oe4/s1600/bf2142_punkbuster-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="260" src="http://2.bp.blogspot.com/-viEBYjriT48/TjEYc6v6L8I/AAAAAAAAAFg/G2Rc2HO9oe4/s400/bf2142_punkbuster-1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Klikamy (1) "Add a Game"&lt;/li&gt;
&lt;li&gt;Z selectboxa (2) wybieramy "Battlefield 2142"&lt;/li&gt;
&lt;li&gt;Jeśli punkbuster samemu nie znajdzie nam ścieżki do gry to klikając w (3) "Browse" i wybieramy katalog z grą&lt;/li&gt;
&lt;li&gt;Klikamy (4) "Add Game" a BF powinien pokazać się na liście :)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-Rg9dFuXpSqM/TjEYc5nLKLI/AAAAAAAAAFk/QY3iaJfOwjo/s1600/bf2142_punkbuster-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="197" src="http://2.bp.blogspot.com/-Rg9dFuXpSqM/TjEYc5nLKLI/AAAAAAAAAFk/QY3iaJfOwjo/s400/bf2142_punkbuster-2.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
Teraz uruchomiamy pbsvx.exe (&lt;a href="http://chomikuj.pl/Runaurufu/Gry/Patch/Battlefield+2142/pbsvc,818171893.exe"&gt;link&lt;/a&gt;) i instalujemy usługę Punkbustera.&lt;br /&gt;
Po tych operacjach bez problemu powinniśmy móc łączyć się z serwerami.&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;span style="font-size: large;"&gt;&lt;b&gt;Gra nie chce uruchomić się po spatchowaniu mimo, iż wcześniej chodziła&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&amp;nbsp;Nie wiem jakim cudem, ale jakoś tak się złożyło, że "nowszy" i "lepszy" BF2142 w wersji 1.50 nie chce odpalić się na Windows 7 x64 mimo iż 1.40 (świeżo po instalacji) chodził, że aż miło. Rozwiązanie tego problemu zapewne łamie warunki nie jednej licencji, gdyż wymaga użycia zcrackowanej wersji pliku BF2142.exe. Generalnie nie popieram używania cracków, ale jeśli to ma być jedyny sposób na uruchomienie gry, którą zakupiłem... Tak czy inaczej plik BF2142.exe z katalogu z grą należy zastąpić crackiem (&lt;a href="http://chomikuj.pl/Runaurufu/Gry/Patch/Battlefield+2142/BF2142,818170563.exe"&gt;link&lt;/a&gt;). Przy okazji będziemy mogli grać bez włożonej płytki DVD, za co tak ona jak i odtwarzacz bardzo nam podziękują ;P&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2570390285559898162-4837829790763519532?l=runaurufu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/YZ7Ahmjn47yxc2ya4I6EccaxJWc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YZ7Ahmjn47yxc2ya4I6EccaxJWc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/YZ7Ahmjn47yxc2ya4I6EccaxJWc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YZ7Ahmjn47yxc2ya4I6EccaxJWc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LunarIT/~4/gvMfx-UsBk8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://runaurufu.blogspot.com/feeds/4837829790763519532/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://runaurufu.blogspot.com/2011/07/battlefield-2142-deluxe.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/4837829790763519532?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/4837829790763519532?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LunarIT/~3/gvMfx-UsBk8/battlefield-2142-deluxe.html" title="Battlefield 2142 Deluxe" /><author><name>Damian Pawlik</name><uri>https://profiles.google.com/110162926853117833033</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-S94uikQs-MY/AAAAAAAAAAI/AAAAAAAAAEU/VXGkqwGc4g8/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-p4rdAjMVRCs/TjEYdTmhckI/AAAAAAAAAFs/OwPjOhf9yUI/s72-c/bf2142_regEdit-1.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://runaurufu.blogspot.com/2011/07/battlefield-2142-deluxe.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4HQH08cCp7ImA9WhRWFEs.&quot;"><id>tag:blogger.com,1999:blog-2570390285559898162.post-6666219752660696022</id><published>2011-07-19T11:58:00.002+02:00</published><updated>2012-01-02T01:08:51.378+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-02T01:08:51.378+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Windows" /><category scheme="http://www.blogger.com/atom/ns#" term="Gry" /><title>Red Alert 2 przez Internet</title><content type="html">Red Alert 2 to piękna gra, jak dla mnie ostatnia z serii &lt;abbr title="Command &amp;amp; Conquer"&gt;C&amp;amp;C&lt;/abbr&gt; stworzona w starej, dobrej konwencji. Nie ma tu spektakularnych efektów graficznych (choć jak na ówczesne czasy to grafika była imponująca), a i sama rozgrywka jest przyjemnie powolna. Samej gry ząb czasu nie nadgryzł aż tak straszliwie... niestety losu tego jej twórca - &lt;a href="http://en.wikipedia.org/wiki/Westwood_Studios"&gt;Westwood Studios&lt;/a&gt; - nie uniknął, co spowodowało problem ogromny. Bo jak grać przez sieć na serwerach firmy, która już nie istnieje (gdyż wchłonęło ją &lt;abbr title="Electronic Arts"&gt;EA&lt;/abbr&gt; i zaciera po niej ślady &lt;a href="http://westwood.ea.com/" target="_blank"&gt;[1]&lt;/a&gt; &lt;a href="http://westwood.com/" target="_blank"&gt;[2]&lt;/a&gt; &lt;a href="http://replay.waybackmachine.org/20000304145203/http://www.westwood.com/newindex.html" target="_blank"&gt;[3]&lt;/a&gt;)?&lt;br /&gt;
Na szczęście pojawiło się kilka rozwiązań tego problemu, począwszy od używania do gry sieci LAN, Hamachi, a skończywszy na nowych dedykowanych serwerach. I to właśnie tę ostatnią metodę pragnę tutaj przybliżyć, a konkretniej sposób łączenia się z serwerami &lt;a href="http://xwis.net/"&gt;xwis.net&lt;/a&gt; :)&lt;br /&gt;
&lt;br /&gt;
Jednak nim o łączeniu się z serwerem powiem - zacznijmy od podstaw, wszak do gry potrzebujemy zainstalowanej gry. Na szczęście bez problemów możemy ją zainstalować na praktycznie każdym Windowsie od XP zaczynając a na 64 bitowym Windows 7 kończąc.&lt;br /&gt;
Po instalacji nasza gra musi zostać zaktualizowana do wersji 1.006 (&lt;a href="http://chomikuj.pl/Runaurufu/Gry/Patch/Red+Alert+2/Red+Alert+2+Patch+1.006+EN,789715117.EXE" target="_blank"&gt;link&lt;/a&gt;), dzięki czemu będziemy mogli grać z innymi osobami (większość ludzi aktualizuje swoje gry ^.^ ).&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-tiXIANDSPGU/TiSUW_OyFdI/AAAAAAAAAEo/ozNXa84GbUs/s1600/Dwm+2011-07-18+17-49-50-89.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;
&lt;/a&gt;&lt;/div&gt;
A na sam koniec musimy zainstalować aktualizację do bibliotek internetowych stworzonych przez Westwood (&lt;a href="http://xwis.net/downloads/WOLAPI-0.0.0.exe" target="_blank"&gt;link&lt;/a&gt;|&lt;a href="http://chomikuj.pl/Runaurufu/Gry/Patch/Red+Alert+2/WOLAPI-0.0.0,789715118.exe" target="_blank"&gt;link&lt;/a&gt;). WOLAPI instalujemy do folderu z grą.&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-tiXIANDSPGU/TiSUW_OyFdI/AAAAAAAAAEo/ozNXa84GbUs/s1600/Dwm+2011-07-18+17-49-50-89.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="222" src="http://2.bp.blogspot.com/-tiXIANDSPGU/TiSUW_OyFdI/AAAAAAAAAEo/ozNXa84GbUs/s320/Dwm+2011-07-18+17-49-50-89.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Instalator WOLAPI - aktualizacji do bibliotek internetowych dostarczonych przez Westwood&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Z tak ubogaconą grą możemy przejść do drugiego etapu - tworzenia konta na serwerze xwis.net i łączenia się z serwerem w grze :)&lt;br /&gt;
Ten etap najlepiej zacząć od wejścia &lt;a href="http://strike-team.net/forums/index.php?app=core&amp;amp;module=global&amp;amp;section=register" target="_blank"&gt;tutaj&lt;/a&gt; i przeprowadzenia rejestracji na forum. Login z forum będziemy również używać do logowania się na konto na stronie &lt;a href="http://xwis.net/"&gt;xwis.net&lt;/a&gt;, a na podany e-mail przyjdzie link aktywacyjny :)&lt;br /&gt;
&lt;br /&gt;
Po zakończeniu rejestracji i aktywowaniu konta wchodzimy &lt;a href="http://xwis.net/control_panel/" target="_blank"&gt;tutaj&lt;/a&gt; i logujemy się loginem i hasłem podanym przy rejestracji na forum.&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-wR-V_MNtqt8/TiSUV1bpY5I/AAAAAAAAAEk/5NLCG-YKHc4/s1600/firefox+2011-07-18+17-43-35-01.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="209" src="http://1.bp.blogspot.com/-wR-V_MNtqt8/TiSUV1bpY5I/AAAAAAAAAEk/5NLCG-YKHc4/s400/firefox+2011-07-18+17-43-35-01.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Formularz logowania na serwer XWIS&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Jeśli stronka nie chce nas zalogować mimo podawania prawidłowego hasła (pole hasła [2] podświetla się na żółto), to możliwe, że mamy w haśle znaki inne niż cyfry i litery, a tego ten formularz nie lubi. Jeśli tak jest to wracamy na forum i zmieniamy hasło &lt;a href="http://strike-team.net/forums/index.php?app=core&amp;amp;module=usercp&amp;amp;tab=core&amp;amp;area=password" target="_blank"&gt;tym formularzem&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Po udanym zalogowaniu naszym oczom ukaże się mniej więcej taki widok:&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;img border="0" height="162" src="http://4.bp.blogspot.com/-Y3wm9k6tcZk/TiSUXmakDII/AAAAAAAAAEs/CdaS7cSGTvg/s400/firefox+2011-07-18+17-44-50-65.png" style="margin-left: auto; margin-right: auto;" width="400" /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Panel zarządzania kontem&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style="border-radius: 10px; border: #999 1px dotted; font-size: smaller; padding: 10px;"&gt;
Legenda do obrazka:&lt;br /&gt;
&lt;b&gt;&lt;span style="color: red;"&gt;nick&lt;/span&gt;&lt;/b&gt; - nasz login do serwera&lt;br /&gt;
&lt;b&gt;&lt;span style="color: red;"&gt;email&lt;/span&gt;&lt;/b&gt; - nasz e-mail&lt;br /&gt;
&lt;b&gt;&lt;span style="color: red;"&gt;serial&lt;/span&gt;&lt;/b&gt; - po aktywacji jakiejś gry pojawią się tutaj różne cyferki, które niekoniecznie będą fragmentem naszego klucza.&lt;br /&gt;
&lt;b&gt;&lt;span style="color: red;"&gt;XWIS Password&lt;/span&gt;&lt;/b&gt; - hasło do logowania się na konto w grze (logujemy się tym hasłem, a nie tym podawanym przy rejestracji na forum)&lt;br /&gt;
&lt;b&gt;&lt;span style="color: red;"&gt;1&lt;/span&gt;&lt;/b&gt; - by aktywować klucz wpisujemy go w to pole i klikamy "Add Serial"&lt;br /&gt;
&lt;b&gt;&lt;span style="color: red;"&gt;2&lt;/span&gt;&lt;/b&gt; - w celu stworzenia konta wpisujemy w to pole nasz nick, wybieramy grę, której ma on dotyczyć i klikamy "Create Nick"&lt;br /&gt;
&lt;b&gt;&lt;span style="color: red;"&gt;3&lt;/span&gt;&lt;/b&gt; - tutaj znajduje się lista naszych kont, którymi możemy zarządzać (wystarczy kliknąć w nick) - ta nazwa będzie używana do logowania się w grze.&lt;/div&gt;
&lt;br /&gt;
To co powinniśmy teraz zrobić to podać nasz klucz produktu (serial) oraz stworzyć konto dla RA2. Warto również spisać nazwę naszego konta oraz nasze hasło XWIS bo bez tych danych nie zalogujemy się na konto w grze.&lt;br /&gt;
&lt;br /&gt;
Po wykonaniu tych czynności możemy uruchomić Red Alert 2, w menu wybrać &lt;b&gt;Internet&lt;/b&gt;, a następnie &lt;b&gt;Custom Match&lt;/b&gt;. Teraz pozostaje nam jedynie zalogować się przy użyciu nicka i hasła XWIS w takim oto formularzu:&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-LtblwDUB_aE/TiVTjsA0XvI/AAAAAAAAAE8/_JDS5ASLbns/s1600/snap000217.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-LtblwDUB_aE/TiVTjsA0XvI/AAAAAAAAAE8/_JDS5ASLbns/s1600/snap000217.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Formularz logowania wewnątrz Red Alert 2&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Jeśli nasz nick i hasło są prawidłowe to powinniśmy ujrzeć mniej więcej taki ekran z widokiem całego lobby i innych graczy tudzież dostępnych gier.&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-ifHcWJx2Ppg/TiVTk7aX_yI/AAAAAAAAAFA/FgGE44zoG18/s1600/snap000218.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="304" src="http://2.bp.blogspot.com/-ifHcWJx2Ppg/TiVTk7aX_yI/AAAAAAAAAFA/FgGE44zoG18/s400/snap000218.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Widok lobby Red Alert 2&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Teraz do rozpoczęcia gry droga już bardzo krótka, a chwila ujrzenia ładującej się gry jest iście bezcenna i aż łezka sentymentu w oku kręci się :)&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-PnddAbYP1rU/TiSUa4eU_wI/AAAAAAAAAE0/7p3beoZDMEo/s1600/game+2011-07-18+18-09-17-17.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="300" src="http://3.bp.blogspot.com/-PnddAbYP1rU/TiSUa4eU_wI/AAAAAAAAAE0/7p3beoZDMEo/s400/game+2011-07-18+18-09-17-17.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Ach ta radość gdy gra pobiera nową mapę... &lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-8faS8oNJxg0/TiSUYqhlNZI/AAAAAAAAAEw/Jvvw_i6S6eM/s1600/game+2011-07-18+18-09-24-19.png" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="300" src="http://2.bp.blogspot.com/-8faS8oNJxg0/TiSUYqhlNZI/AAAAAAAAAEw/Jvvw_i6S6eM/s400/game+2011-07-18+18-09-24-19.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;...a jeszcze większa radość gdy widzi się, że faktycznie inni gracze do gry dołączają&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-8faS8oNJxg0/TiSUYqhlNZI/AAAAAAAAAEw/Jvvw_i6S6eM/s1600/game+2011-07-18+18-09-24-19.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Pomocne strony przy kłopotach z grą poprzez serwery XWIS:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.wikihow.com/Play-Red-Alert-2-over-the-Internet" target="_blank"&gt;Wpis na wikihow.com o RA2 przez Internet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://strike-team.net/forums/index.php/forum-83/announcement-20-read-me-first/" target="_blank"&gt;Poradnik dotyczący uruchamiania RA2 oraz TS z forum strike-team.net&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2570390285559898162-6666219752660696022?l=runaurufu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/mTjNAD_qFqlnqDZaSPo4eUgQSYc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mTjNAD_qFqlnqDZaSPo4eUgQSYc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/mTjNAD_qFqlnqDZaSPo4eUgQSYc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mTjNAD_qFqlnqDZaSPo4eUgQSYc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LunarIT/~4/p_mN_pEAwGU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://runaurufu.blogspot.com/feeds/6666219752660696022/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://runaurufu.blogspot.com/2011/07/red-alert-2-przez-internet.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/6666219752660696022?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/6666219752660696022?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LunarIT/~3/p_mN_pEAwGU/red-alert-2-przez-internet.html" title="Red Alert 2 przez Internet" /><author><name>Damian Pawlik</name><uri>https://profiles.google.com/110162926853117833033</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-S94uikQs-MY/AAAAAAAAAAI/AAAAAAAAAEU/VXGkqwGc4g8/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-tiXIANDSPGU/TiSUW_OyFdI/AAAAAAAAAEo/ozNXa84GbUs/s72-c/Dwm+2011-07-18+17-49-50-89.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://runaurufu.blogspot.com/2011/07/red-alert-2-przez-internet.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk4HR3s-eCp7ImA9WhdXGEw.&quot;"><id>tag:blogger.com,1999:blog-2570390285559898162.post-8180212126236355451</id><published>2011-07-13T15:07:00.001+02:00</published><updated>2011-08-31T20:22:16.550+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-31T20:22:16.550+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Packet Tracer" /><title>Packet Tracer: Access Control List</title><content type="html">Tematem tego wpisu są listy dostępu, za pomocą których to możemy dowolnie filtrować ruch sieciowy przechodzący przez poszczególne routery. Istotnym jest fakt, że listy dostępu o ile mogą być definiowane globalnie (dla całego routera) to są używane lokalnie na interfejsach. Co więcej listy osobno przypisuje się dla pakietów przychodzących ("&lt;i&gt;inbound&lt;/i&gt;") i wychodzących ("&lt;i&gt;outbound&lt;/i&gt;") danego interfejsu. Samo zaś określenie "lista" wzięło się z możliwości łączenia wielu wpisów odnoszących się do kontroli dostępu w pojedynczy obiekt - właśnie listę. Wpisy te można w dowolnym momencie dodawać do już używanych list, co sprawia np. blokowanie nowych adresów IP bardzo łatwą i szybką czynnością.&lt;br /&gt;
Jak więc widać listy kontroli dostępu są potężnym narzędziem umożliwiającym szczegółową kontrolę ruchu. By jednak łatwiej zrozumieć działanie list dostępu posłużymy się prostym przykładem &lt;a href="http://chomikuj.pl/Runaurufu/Edukacja/Packet+Tracer/ACL,774612937.pkt" target="_blank"&gt;&lt;b&gt;sieci&lt;/b&gt;&lt;/a&gt; (PT wersja 5.3):&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-WjayeCLylz8/ThwAi9DOdoI/AAAAAAAAADY/IzjkzTacEvc/s1600/aclexplain.png" /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Mała przykładowa "sieć"&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;To co na powyższym obrazku od razu rzuca się w oczy to strzałki opisane jako "&lt;b&gt;&lt;span style="color: red;"&gt;IN&lt;/span&gt;&lt;/b&gt;" oraz "&lt;b&gt;&lt;span style="color: orange;"&gt;OUT&lt;/span&gt;&lt;/b&gt;". Strzałki te pokazują kierunek ruchu pakietów, a opisy mówią o opcji konfiguracji odpowiedzialnej za moment filtrowania (inbound/outbound).&lt;br /&gt;
W powyższym przykładzie zastosowano tylko kilka list, których zadaniem było wytworzenie przykładowych środowisk:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;PC0 może komunikować się z routerem i jednocześnie nie może z PC1&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;ACL na interfejsie Fa0/0&lt;br /&gt;
&lt;pre class="codePacketTracer"&gt;interface FastEthernet0/0
 ip address 192.168.1.1 255.255.255.0
 &lt;b&gt;ip access-group 100 in&lt;/b&gt;
 duplex auto
 speed auto
!&lt;/pre&gt;&lt;pre class="codePacketTracer"&gt;access-list 100 deny ip host 192.168.1.2 host 192.168.2.2
access-list 100 permit ip any any &lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;ACL na interfejsie Fa1/0&lt;br /&gt;
&lt;pre class="codePacketTracer"&gt;interface FastEthernet1/0
 ip address 192.168.2.1 255.255.255.0
 &lt;b&gt;ip access-group 1 out&lt;/b&gt;
 duplex auto
 speed auto
!&lt;/pre&gt;&lt;pre class="codePacketTracer"&gt;access-list 1 deny host 192.168.1.2
access-list 1 permit any&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;PC1 może komunikować się z dowolną maszynę w sieci 192.168.1.0/24, ale nie może z routerem (na żadnym interfejsie)&lt;br /&gt;
&lt;pre class="codePacketTracer"&gt;interface FastEthernet1/0
 ip address 192.168.2.1 255.255.255.0
 &lt;b&gt;ip access-group 120 in&lt;/b&gt;
 duplex auto
 speed auto
!&lt;/pre&gt;&lt;pre class="codePacketTracer"&gt;access-list 120 deny ip 192.168.2.0 0.0.0.255 host 192.168.2.1
access-list 120 deny ip 192.168.2.0 0.0.0.255 host 192.168.1.1&lt;/pre&gt;&lt;pre class="codePacketTracer"&gt;access-list 120 permit ip any any &lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;Przykłady te nie są z pewnością niczym wyszukanym i przedstawiają jedynie podstawowe możliwości ACL oferowanych przez Packet Tracer. Dla porównania złożoności komend poniżej zamieszczone zostało całe drzewko możliwości komendy&lt;i&gt; access-list&lt;/i&gt; (możliwe do pobrania po kliknięciu).&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://chomikuj.pl/Runaurufu/Edukacja/Packet+Tracer/CLI+Info/pt-cli-aclEX,774425103.pdf" target="_blank"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-lybDFfpgyA8/ThxZe9-8XjI/AAAAAAAAAEQ/DH3Nxh9rLE0/s1600/CLI-ACL.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Packet Tracer CLI Info: ACL &lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;Warto również wspomnieć, iż listy domyślnie blokują każdy pakiet, który nie jest dozwolony (stąd polecenia "&lt;i&gt;permit ip any any&lt;/i&gt;"), toteż lista zdefiniowana następująco:&lt;br /&gt;
&lt;pre class="codePacketTracer"&gt;access-list 3 deny 192.168.0.0 0.0.255.255&lt;/pre&gt;w praktyce nie tylko zablokuje wszelki ruch z podsieci 192.168.0.0/16, ale również jakikolwiek ruch przechodzący przez interfejs z włączoną listą w ustalonym kierunku. Tak więc lista ta jest generalnie równoważna wpisowi:&lt;br /&gt;
&lt;pre class="codePacketTracer"&gt;access-list 3 deny any&lt;/pre&gt;Jeśli jednak dodamy wpis:&lt;br /&gt;
&lt;pre class="codePacketTracer"&gt;access-list 3 permit any&lt;/pre&gt;to lista zacznie blokować jedynie ruch pochodzący ze wskazanej podsieci.&lt;br /&gt;
&lt;br /&gt;
Co ciekawe zachowanie to nie zawsze jest emulowane poprawnie w starszych wersjach Packet Tracera o czym należy pamiętać przy konfigurowaniu sieci w oparciu o wyniki z tegoż programu.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2570390285559898162-8180212126236355451?l=runaurufu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/JMgHI-pIUikgrVxwoXYm63cBtV0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JMgHI-pIUikgrVxwoXYm63cBtV0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/JMgHI-pIUikgrVxwoXYm63cBtV0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JMgHI-pIUikgrVxwoXYm63cBtV0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LunarIT/~4/9zvpV7TdWy4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://runaurufu.blogspot.com/feeds/8180212126236355451/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://runaurufu.blogspot.com/2011/07/packet-tracer-access-control-list.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/8180212126236355451?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/8180212126236355451?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LunarIT/~3/9zvpV7TdWy4/packet-tracer-access-control-list.html" title="Packet Tracer: Access Control List" /><author><name>Damian Pawlik</name><uri>https://profiles.google.com/110162926853117833033</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-S94uikQs-MY/AAAAAAAAAAI/AAAAAAAAAEU/VXGkqwGc4g8/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-WjayeCLylz8/ThwAi9DOdoI/AAAAAAAAADY/IzjkzTacEvc/s72-c/aclexplain.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://runaurufu.blogspot.com/2011/07/packet-tracer-access-control-list.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEIFQHk6eyp7ImA9WhRbEU0.&quot;"><id>tag:blogger.com,1999:blog-2570390285559898162.post-533815179332018539</id><published>2011-07-04T00:35:00.002+02:00</published><updated>2012-02-01T15:28:31.713+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-01T15:28:31.713+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="DOSBox" /><category scheme="http://www.blogger.com/atom/ns#" term="Windows" /><category scheme="http://www.blogger.com/atom/ns#" term="Gry" /><title>X-COM Apocalypse i Windows 7</title><content type="html">Dawno, dawno temu, jeszcze za czasów działalności MicroProse powstał cykl gier, które ukształtowały wyobrażenie graczy o kosmitach. Ta saga opowiadała o losach organizacji X-COM (E&lt;u&gt;x&lt;/u&gt;traterrestrial &lt;u&gt;Com&lt;/u&gt;bat Unit), która to miała bronić naszej planety i całej ludzkiej cywilizacji przed agresją mieszkańców z innych światów...&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://lunco.wordpress.com/2009/01/14/x-com-apocalypse-pod-xp-i-vista-pod-dosbox/"&gt;Kilka lat temu borykałem się z odpaleniem Apokalipsy pod Windows XP i Windows Vista&lt;/a&gt;, niestety uświadczyłem postępu technologicznego i platformy 64 bitowej, która bez "wspomagacza" w postaci DOSBoxa nie chce pozwolić mi tej cudnej gierki odpalić. Jakże ogromnie zawiodłem się gdy nieoczekiwany problem wyłonił się również po samej stronie DOSBoxa. O ile na XP oraz Viście udało się bez problemów uruchomić grę bez płytki CD tak pod Win 7 w żaden sposób nie daje się tej czarnej magii odprawić (owszem gra w wersji RIP &lt;a href="http://www.staregry.pl/?c=_gv&amp;amp;i=1680"&gt;[1]&lt;/a&gt; &lt;span id="goog_1654343523"&gt;&lt;/span&gt;&lt;a href="http://cvr.pl/gry/x-com-apocalypse.php"&gt;[2]&lt;span id="goog_1654343524"&gt;&lt;/span&gt;&lt;/a&gt; działa bez problemów bez CD). Dlatego też skazany zostałem na używanie płytki CD (co ciekawe nawet montowanie obrazu dysku z pliku ISO nie pomaga, czym zostałem zaskoczony maksymalnie).&lt;br /&gt;
We wpisie tym postanowiłem połączyć dawne doświadczenia z tymi ostatnio nabytymi, tak by stanowił on swoiste kompendium mej wiedzy na temat "&lt;i&gt;uruchamiania XCOM Apocalypse na nowych systemach operacyjnych&lt;/i&gt;" (brzmi prawie jak temat pracy magisterskiej) ;]&lt;br /&gt;
&lt;br /&gt;
&lt;style type="text/css"&gt;
#XCOMT1 tr td {width:33%;border:1px black solid;text-align:center;}
#XCOMT2 tr td {width:50%;border:1px black solid;text-align:center;}
&lt;/style&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;table id="XCOMT1" style="width: 100%;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Windows XP / Vista&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Windows XP / Vista DOSBox&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Windows 7 DOSBox&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th colspan="3"&gt;&lt;i&gt;INSTALACJA&lt;/i&gt;&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan="3"&gt;Przy większych dyskach XCOMA nie wykrywa odpowiednio wolnego miejsca na dysku, więc może się okazać, że&amp;nbsp;fizycznie nie będzie możliwości instalacji. W zasadzie można to obejść kopiując pliki z&amp;nbsp;„XCOMA” z&amp;nbsp;CD na dysk. Alternatywnym rozwiązaniem jest odpalenie DOSBoxa i&amp;nbsp;zamontowanie dysku z&amp;nbsp;argumentem „freesize” ('&lt;b&gt;mount c c:\ -freesize 1024&lt;/b&gt;') oraz zamontowanie płyty cd ('&lt;b&gt;mount d d:\ -t cdrom&lt;/b&gt;'). Teraz możemy wejść na cd ('&lt;b&gt;d:&lt;/b&gt;') i&amp;nbsp;odpalić instalator ('&lt;b&gt;install&lt;/b&gt;').&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th colspan="3"&gt;&lt;i&gt;DODATKOWE OPCJE&lt;/i&gt;&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Aby słyszeć dźwięki, wymagany jest &lt;b&gt;&lt;a href="http://sourceforge.net/projects/vdmsound/"&gt;VDMSound&lt;/a&gt;&lt;/b&gt; (umożliwia emulację soundblasterów i&amp;nbsp;innych przedpotopowych kart dźwiękowych). Po instalacji nie trzeba nic zmieniać w jego opcjach. &lt;/td&gt;&lt;td rowspan="2"&gt;By grać bez płytki, musimy wpierw przekopiować z niej plik '&lt;b&gt;MUSIC&lt;/b&gt;'. Najlepiej przekopiować go do katalogu w którym zainstalowaliśmy grę (np. '&lt;b&gt;C:\XCOMA&lt;/b&gt;'). Następnie uruchamiamy DOSBox i&amp;nbsp;montujemy dysk z&amp;nbsp;zainstalowaną grą ('&lt;b&gt;mount c c:\&lt;/b&gt;' lub od razu '&lt;b&gt;mount c c:\XCOMA&lt;/b&gt;') oraz napęd cd – tym razem czysto wirtualny ('&lt;b&gt;mount d c:\XCOMA -t cdrom&lt;/b&gt;' – ważne by litera dysku na którą montujemy była taka sama jak ta z której instalowaliśmy grę). Teraz możemy już odpalić Apokalipsę bez płytki. &lt;/td&gt;&lt;td rowspan="2"&gt;Niestety nie udało się uruchomić gry bez umieszczania płyty CD&amp;nbsp;w napędzie (testowałem na wersjach DOSBoxa 0.72 - 0.74).&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Do gry potrzeba kilka plików, które znajdują się w &lt;b&gt;&lt;a href="http://chomikuj.pl/Runaurufu/Gry/Patch/X-COM/X-COM+Apocalypse,752990612.zip" target="_blank"&gt;TEJ&lt;/a&gt;&lt;/b&gt; paczce. Po ściągnięciu należy rozpakować ją do katalogu, w&amp;nbsp;którym zainstalowano grę. Po rozpakowaniu pojawi się 8 plików, z których bezpośrednio korzystać będziemy jedynie z&amp;nbsp;‘&lt;b&gt;WINXCOM3.BAT&lt;/b&gt;' &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th colspan="3"&gt;&lt;i&gt;KONFIGURACJA DŹWIĘKU&lt;/i&gt;&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan="3"&gt;Jeśli chcemy mieć dźwięk w grze musimy odpalić '&lt;b&gt;SETUP.EXE&lt;/b&gt;' z katalogu w którym mamy grę. Zazwyczaj gra po wyborze autodetekcji karty sama wszystko ustawi, jednak czasem trzeba zrobić to ręcznie, w takiej sytuacji wybieramy kolejno: &lt;b&gt;SoundBlaster 16/AWE32&lt;/b&gt;, Port: &lt;b&gt;220&lt;/b&gt;, IRQ: &lt;b&gt;7&lt;/b&gt;, DMA: &lt;b&gt;5&lt;/b&gt; (są to domyślne wartości zarówno dla DOSBox jak i VDMSound). &lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
Jeśli zdecydujemy się na grę w DOSBoxie zapewne będziemy chcieli skorzystać z opcji pełnego ekranu - tu jednak przy domyślnych opcjach konfiguracji (&lt;a href="http://www.dosbox.com/wiki/Dosbox.conf#Creation_and_Location"&gt;lokalizacja pliku konfiguracyjnego&lt;/a&gt;) pojawia się problem z częstotliwością odświeżania. Zaradzić temu można w dwojaki sposób (dla każdej opcji podana została konfiguracja DOSBoxa):&lt;br /&gt;
&lt;table id="XCOMT2" style="width: 100%;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;th&gt;&lt;i&gt;Pełny ekran&lt;/i&gt;&lt;/th&gt;&lt;th&gt;&lt;i&gt;Przeskalowane okno&lt;/i&gt;&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&amp;nbsp;[sdl]&lt;br /&gt;
&lt;b&gt;fullscreen=true&lt;/b&gt;&lt;b&gt;&lt;br /&gt;
fulldouble=true&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;output=overlay&lt;/b&gt;&lt;/td&gt;&lt;td&gt;[sdl]&lt;br /&gt;
&lt;b&gt;windowresolution=1280x680&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;output=overlay&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
[render]&lt;br /&gt;
&lt;b&gt;scaler=2xsai&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Rozdzielczość i typ skalowania można dobrać dowolnie według własnego uznania i&amp;nbsp;rozdzielczości własnego monitora :) Co do skalowania warto zajrzeć na wiki DOSBoxa by poznać &lt;a href="http://www.dosbox.com/wiki/Scaler"&gt;różnice pomiędzy typami skalarów&lt;/a&gt; oraz szeroką gamę &lt;a href="http://www.dosbox.com/wiki/Dosbox.conf"&gt;możliwości konfiguracyjnych&lt;/a&gt; tegoż programu.&lt;br /&gt;
&lt;br /&gt;
Masz inny problem? Zajrzyj: &lt;a href="http://runaurufu.blogspot.com/2012/02/x-com-na-steamie-dosbox.html" target="_blank"&gt;X-COM na Steamie / DOSBox&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2570390285559898162-533815179332018539?l=runaurufu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Jcq6t0sLHqSx2cv6daymhqigeiM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Jcq6t0sLHqSx2cv6daymhqigeiM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Jcq6t0sLHqSx2cv6daymhqigeiM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Jcq6t0sLHqSx2cv6daymhqigeiM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LunarIT/~4/0OnBzyDNuIY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://runaurufu.blogspot.com/feeds/533815179332018539/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://runaurufu.blogspot.com/2011/07/x-com-apocalypse-i-windows-7.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/533815179332018539?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/533815179332018539?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LunarIT/~3/0OnBzyDNuIY/x-com-apocalypse-i-windows-7.html" title="X-COM Apocalypse i Windows 7" /><author><name>Damian Pawlik</name><uri>https://profiles.google.com/110162926853117833033</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-S94uikQs-MY/AAAAAAAAAAI/AAAAAAAAAEU/VXGkqwGc4g8/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://runaurufu.blogspot.com/2011/07/x-com-apocalypse-i-windows-7.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk4AQnk8eCp7ImA9WhdXGEw.&quot;"><id>tag:blogger.com,1999:blog-2570390285559898162.post-3255234018950460608</id><published>2011-06-19T12:35:00.006+02:00</published><updated>2011-08-31T20:22:23.770+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-31T20:22:23.770+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Packet Tracer" /><title>Packet Tracer: Redistribute RIP + OSPF</title><content type="html">Tak jakoś przy tworzeniu projektu na sieci komputerowe dłużej nad tym problemem musiałem się pochylić. Co ciekawe nie tyle z racji błędnej metody, ale z racji problemów Pacet Tracera ^.^ Bo jakże wytłumaczyć fakt, że raz jedna konfiguracja nie działa, a za chwilę po wyczyszczeniu trasowania RIPem i ustawienia wszystkiego identycznie już działać zaczyna?&lt;br /&gt;
&lt;br /&gt;
Tak czy inaczej niechaj wpis ten będzie taką małą pomocą dla tych wszystkich, którzy na ten sam problem natrafią - pamiętajcie jak nie działa to skonfigurujcie to samo od nowa ;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;object height="349" width="560"&gt;&lt;param name="movie" value="http://www.youtube-nocookie.com/v/afAh8S8VmDM?version=3&amp;amp;hl=pl_PL&amp;amp;rel=0"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube-nocookie.com/v/afAh8S8VmDM?version=3&amp;amp;hl=pl_PL&amp;amp;rel=0" type="application/x-shockwave-flash" width="560" height="349" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;
&lt;br /&gt;
A teraz trochę CLI i opisu sieci, której logiczny schemat wygląda tak: &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://img199.imageshack.us/img199/8445/redistributeripospf.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="178" src="http://img199.imageshack.us/img199/8445/redistributeripospf.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Generalnie mamy 3 sieci, w których po lewej stronie rutera 1 zastosowano OSPF, a po prawej RIP. To czym się różnią to sposób konfiguracji:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;1sza sieć jest podzielona na podsieć dla rutingu z RIPem (200.100.2.0) i na podsieć dla rutingu z OSPF (200.100.1.0)&lt;/li&gt;
&lt;li&gt;2ga sieć cały ruting prowadzi w jednej podsieci (200.101.1.0) i używa wildcardów na OSPF 0.0.0.255&lt;/li&gt;
&lt;li&gt;3cia sieć jest de facto tym co 2ga, z tą różnicą, że wildcardy na OSPF są równie 0.0.0.3, więc ustawione dla każdej podsieci z osobna&lt;/li&gt;
&lt;/ul&gt;&amp;nbsp;I przykładowy listening z konfiguracji routerów dla drugiej sieci:&lt;br /&gt;
Router0&lt;br /&gt;
&lt;pre class="codePacketTracer"&gt;interface FastEthernet0/0
 ip address 192.169.1.1 255.255.255.0
 duplex auto
 speed auto
!
interface Serial0/0
 ip address 200.101.1.2 255.255.255.252
!
router ospf 7
 log-adjacency-changes
 network 192.169.1.0 0.0.0.255 area 0
 network 200.101.1.0 0.0.0.255 area 0
&lt;/pre&gt;&lt;br /&gt;
Router1&lt;br /&gt;
&lt;pre class="codePacketTracer"&gt;interface Serial0/0
 ip address 200.101.1.1 255.255.255.252
 clock rate 4000000
!
interface Serial0/1
 ip address 200.101.1.5 255.255.255.252
!
router ospf 7
 log-adjacency-changes
 redistribute rip 
 passive-interface Serial0/1
 network 200.101.1.0 0.0.0.255 area 0
!
router rip
 version 2
 redistribute ospf 7 metric 3 
 passive-interface Serial0/0
 network 200.101.1.0
&lt;/pre&gt;&lt;br /&gt;
Router2&lt;br /&gt;
&lt;pre class="codePacketTracer"&gt;interface FastEthernet0/0
 ip address 192.169.2.1 255.255.255.0
 duplex auto
 speed auto
!
interface Serial0/0
 ip address 200.101.1.6 255.255.255.252
 clock rate 4000000
!
router rip
 version 2
 network 192.169.2.0
 network 200.101.1.0
&lt;/pre&gt;&lt;br /&gt;
i tablice trasowania:&lt;br /&gt;
&lt;br /&gt;
Router0&lt;br /&gt;
&lt;pre class="codePacketTracer"&gt;C    192.169.1.0/24 is directly connected, FastEthernet0/0
&lt;b&gt;O E2 192.169.2.0/24 [110/20] via 200.101.1.1, 00:08:32, Serial0/0&lt;/b&gt;
     200.101.1.0/30 is subnetted, 2 subnets
C       200.101.1.0 is directly connected, Serial0/0
O       200.101.1.4 [110/128] via 200.101.1.1, 00:08:32, Serial0/0
&lt;/pre&gt;&lt;br /&gt;
Router1&lt;br /&gt;
&lt;pre class="codePacketTracer"&gt;O    192.169.1.0/24 [110/65] via 200.101.1.2, 00:08:17, Serial0/0
R    192.169.2.0/24 [120/1] via 200.101.1.6, 00:00:10, Serial0/1
     200.101.1.0/30 is subnetted, 2 subnets
C       200.101.1.0 is directly connected, Serial0/0
C       200.101.1.4 is directly connected, Serial0/1
&lt;/pre&gt;&lt;br /&gt;
Router2&lt;br /&gt;
&lt;pre class="codePacketTracer"&gt;&lt;b&gt;R    192.169.1.0/24 [120/3] via 200.101.1.5, 00:00:02, Serial0/0&lt;/b&gt;
C    192.169.2.0/24 is directly connected, FastEthernet0/0
     200.101.1.0/30 is subnetted, 2 subnets
R       200.101.1.0 [120/1] via 200.101.1.5, 00:00:02, Serial0/0
C       200.101.1.4 is directly connected, Serial0/0
&lt;/pre&gt;&lt;br /&gt;
(pogrubione trasy poznano dzięki redystrybucji)&lt;br /&gt;
&lt;br /&gt;
A na koniec jeszcze link do pliku z tą siecią: &lt;a href="http://chomikuj.pl/Runaurufu/Edukacja/Packet+Tracer/redistribute+RIP*2bOSPF,714093366.pkt"&gt;link&lt;/a&gt; (PT wersja 5.3)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2570390285559898162-3255234018950460608?l=runaurufu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/IUCz_0XAt-7mlW_bQrK7Yl2Jx_M/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IUCz_0XAt-7mlW_bQrK7Yl2Jx_M/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/IUCz_0XAt-7mlW_bQrK7Yl2Jx_M/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IUCz_0XAt-7mlW_bQrK7Yl2Jx_M/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LunarIT/~4/ydbqyrVQuhQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://runaurufu.blogspot.com/feeds/3255234018950460608/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://runaurufu.blogspot.com/2011/06/packet-tracer-redistribute-rip-ospf.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/3255234018950460608?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/3255234018950460608?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LunarIT/~3/ydbqyrVQuhQ/packet-tracer-redistribute-rip-ospf.html" title="Packet Tracer: Redistribute RIP + OSPF" /><author><name>Damian Pawlik</name><uri>https://profiles.google.com/110162926853117833033</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-S94uikQs-MY/AAAAAAAAAAI/AAAAAAAAAEU/VXGkqwGc4g8/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://runaurufu.blogspot.com/2011/06/packet-tracer-redistribute-rip-ospf.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4GQn46eSp7ImA9WhRWFEs.&quot;"><id>tag:blogger.com,1999:blog-2570390285559898162.post-7451271923389837266</id><published>2011-05-30T22:02:00.002+02:00</published><updated>2012-01-02T01:08:43.011+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-02T01:08:43.011+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Windows" /><category scheme="http://www.blogger.com/atom/ns#" term="Hamachi" /><category scheme="http://www.blogger.com/atom/ns#" term="Gry" /><title>StarCraft przez Hamachi</title><content type="html">Niestety Blizzard już dawno zapomniał o StarCrafcie i o problemach jego posiadaczy z grą na Battle.net (a może nie potrafi ich rozwiązać). Dlatego też obecnie najlepszym rozwiązaniem jest gra przez LAN lub właśnie Hamachi :&amp;gt; Jednak taka gra nie jest łatwą sztuką, bo SC ma tendencję do nie wykrywania komputerów połączonych przez sieć Hamachi.&lt;br /&gt;
Jednak i na to znalazło się lekarstwo -&amp;gt; ForceBindIP :D Jak więc odpalić SC tak by móc pograć sobie ze znajomymi przez Hamachi? :&amp;gt;&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Ściągnij i zainstaluj ForceBindIP (&lt;a href="http://www.r1ch.net/stuff/forcebindip/" target="_blank"&gt;strona&lt;/a&gt; | &lt;a href="http://www.r1ch.net/stuff/forcebindip/download/ForceBindIP-1.2-Setup.exe" target="_blank"&gt;instalator&lt;/a&gt; | &lt;a href="http://www.r1ch.net/stuff/forcebindip/download/ForceBindIP-1.2a.zip" target="_blank"&gt;plik zip&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Ściągnij i zainstaluj Hamachi (&lt;a href="https://secure.logmein.com/products/hamachi2/" target="_blank"&gt;oficjalna strona&lt;/a&gt; | &lt;a href="http://www.oldversion.com/Hamachi.html" target="_blank"&gt;starsze wersje&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Uruchom Hamachi i skopiuj swój adres IP&lt;br /&gt;
&lt;a href="http://2.bp.blogspot.com/-rfad6CanwGY/TiVYa0pJLVI/AAAAAAAAAFQ/Feah0KrxcKY/s1600/snap000204.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/-rfad6CanwGY/TiVYa0pJLVI/AAAAAAAAAFQ/Feah0KrxcKY/s400/snap000204.png" width="251" /&gt;&lt;/a&gt;&lt;a href="http://img854.imageshack.us/img854/5374/snap000204.png" style="margin-left: 1em; margin-right: 1em;"&gt; &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Utwórz skrót do StarCraft.exe i wejdź w jego właściwości&lt;br /&gt;
&lt;a href="http://1.bp.blogspot.com/-bQrcvHJGuLE/TiVYa5PjJII/AAAAAAAAAFM/FsWpmwPHT0U/s1600/snap000205.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="196" src="http://1.bp.blogspot.com/-bQrcvHJGuLE/TiVYa5PjJII/AAAAAAAAAFM/FsWpmwPHT0U/s400/snap000205.png" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Przy polu "element docelowy" dopisz ForceBindIP 5.xxx.xxx.xxx (twój IP z Hamachi)&lt;br /&gt;
&lt;a href="http://3.bp.blogspot.com/-q55Kq5SMK3g/TiVYbjdeElI/AAAAAAAAAFY/gshhyni0LZM/s1600/snap000215.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/-q55Kq5SMK3g/TiVYbjdeElI/AAAAAAAAAFY/gshhyni0LZM/s400/snap000215.png" width="355" /&gt;&lt;/a&gt;&lt;a href="http://img215.imageshack.us/img215/4088/snap000215.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kliknij OK lub Zastosuj&lt;/li&gt;
&lt;li&gt;Jeśli Windows potulnie przyjął polecenie to za pomocą tego skrótu powinieneś móc łączyć się przez sieć Hamachi i bez problemów grać w SC z innymi ludźmi :)&lt;br /&gt;
&lt;b&gt;Jeśli jednak Windows spłatał figla i obwieścił iż nie wie co to ForceBindIP to przejdź do punktu 8.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Ściągnij plik zip z ForceBind (&lt;a href="http://www.r1ch.net/stuff/forcebindip/download/ForceBindIP-1.2a.zip" target="_blank"&gt;link&lt;/a&gt;) i wypakuj go do folderu "System32" w katalogu Windowsa (jeśli UAC będzie pytał się czy jesteś pewien - wciśnij, że jesteś ^^). Powróć do punktu 5. :)&lt;/li&gt;
&lt;/ol&gt;
&lt;ol&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2570390285559898162-7451271923389837266?l=runaurufu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/-vW5QyM1B-K2GXeN3WuYxBEuWok/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-vW5QyM1B-K2GXeN3WuYxBEuWok/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/-vW5QyM1B-K2GXeN3WuYxBEuWok/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-vW5QyM1B-K2GXeN3WuYxBEuWok/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LunarIT/~4/OmLUpu81MRE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://runaurufu.blogspot.com/feeds/7451271923389837266/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://runaurufu.blogspot.com/2011/05/starcraft-przez-hamachi.html#comment-form" title="Komentarze (1)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/7451271923389837266?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/7451271923389837266?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LunarIT/~3/OmLUpu81MRE/starcraft-przez-hamachi.html" title="StarCraft przez Hamachi" /><author><name>Damian Pawlik</name><uri>https://profiles.google.com/110162926853117833033</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-S94uikQs-MY/AAAAAAAAAAI/AAAAAAAAAEU/VXGkqwGc4g8/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-rfad6CanwGY/TiVYa0pJLVI/AAAAAAAAAFQ/Feah0KrxcKY/s72-c/snap000204.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://runaurufu.blogspot.com/2011/05/starcraft-przez-hamachi.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMBR3o4eCp7ImA9WhZVFE4.&quot;"><id>tag:blogger.com,1999:blog-2570390285559898162.post-2070856598490747257</id><published>2011-05-22T17:13:00.002+02:00</published><updated>2011-05-26T21:00:56.430+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-26T21:00:56.430+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="news" /><category scheme="http://www.blogger.com/atom/ns#" term="bshellz.net" /><title>Problem z łącznością z bshellz.net?</title><content type="html">Jakiś czas temu jeden z&amp;nbsp;adresów IP &lt;a href="https://www.bshellz.net/"&gt;bshellz.net&lt;/a&gt; został wyłączony - jak twierdzi admin z&amp;nbsp;&lt;a href="https://www.bshellz.net/#comment-3"&gt;racji używania go do ataku ddos&lt;/a&gt;... więc jeśli ktoś dotychczas łączył się za pomocą server1.bshellz.net (albo innych, które nie działają) to niech (za radą admina) przeniesie się na ssh.bshellz.net, który póki co śmiga :)&lt;br /&gt;
&lt;br /&gt;
PS nie wiedzieć czemu bshellz.net ładuje się strasznie długo gdy nie wchodzę bez szyfrowanego połączenia (http a nie https) :x&lt;br /&gt;
&lt;br /&gt;
PS2 okazjue się, że bshellz.net przenosi się na nowy serwer -&gt; skopiowano na niego wszystkie pliki, ale zmiany wprowadzone na ssh.bshellz.net nie są widoczne na nowym serwerze (newshell.bshellz.net)&lt;br /&gt;
&lt;br /&gt;
a takie info wita nas na starym serwerze:&lt;br /&gt;
&lt;blockquote&gt;IMPORTANT!&lt;br /&gt;
&lt;br /&gt;
  All user accounts have been moved onto new servers...&lt;br /&gt;
  in the next week this server will be closed down!!&lt;br /&gt;
&lt;br /&gt;
  Please log in and use these servers from now onwards...&lt;br /&gt;
&lt;br /&gt;
  ssh.newshell.bshellz.net for free users and&lt;br /&gt;
&lt;br /&gt;
  ssh.newelite.bshellz.net for elite users&lt;br /&gt;
&lt;br /&gt;
  Thank you!&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2570390285559898162-2070856598490747257?l=runaurufu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/gJUEcG3XhSKMB_o_7xzQUNT0vuk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gJUEcG3XhSKMB_o_7xzQUNT0vuk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/gJUEcG3XhSKMB_o_7xzQUNT0vuk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gJUEcG3XhSKMB_o_7xzQUNT0vuk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LunarIT/~4/TxC0WkOXLYI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://runaurufu.blogspot.com/feeds/2070856598490747257/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://runaurufu.blogspot.com/2011/05/problem-z-acznoscia-z-bshellznet.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/2070856598490747257?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/2070856598490747257?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LunarIT/~3/TxC0WkOXLYI/problem-z-acznoscia-z-bshellznet.html" title="Problem z łącznością z bshellz.net?" /><author><name>Damian Pawlik</name><uri>https://profiles.google.com/110162926853117833033</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-S94uikQs-MY/AAAAAAAAAAI/AAAAAAAAAEU/VXGkqwGc4g8/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://runaurufu.blogspot.com/2011/05/problem-z-acznoscia-z-bshellznet.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkENRHc_fCp7ImA9WhdVE0s.&quot;"><id>tag:blogger.com,1999:blog-2570390285559898162.post-350519630685887114</id><published>2011-05-06T15:26:00.005+02:00</published><updated>2011-09-18T19:58:15.944+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-18T19:58:15.944+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript" /><title>javascript onchange</title><content type="html">Jedną z iście upierdliwych rzeczy podczas pisania skryptów w js jest event onchange, który ma odpalać się w momencie zmiany zawartości elementu. Sam event w sobie jest bardzo fajny i nic do niego nie mam, natomiast problemem jest uboga dokumentacja języka, a konkretniej to, że większość źródeł nie informuje o tym, iż zdarzenie onchange jest uruchamiane &lt;b&gt;tylko w przypadku zmiany wartości przez użytkownika&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
Tak więc jeśli mamy taki kod:&lt;br /&gt;
&lt;pre class="code"&gt;function funx()
{
   var x = document.getElementById('input');
   x.value = 'nowa wartość';
}&lt;/pre&gt;
To wartość elementu &lt;i&gt;#input&lt;/i&gt; owszem zostanie zmieniona, ale jego onchange już uruchomiony nie zostanie. Remedium? Wystarczy dodać jedną linijkę:&lt;br /&gt;
&lt;pre class="code"&gt;function funx()
{
   var x = document.getElementById('input');
   x.value = 'nowa wartość';
   x.onchange();
}&lt;/pre&gt;
&lt;i&gt;x.onchange()&lt;/i&gt; powoduje iż skrypt uruchamia kod podpięty pod eventa onchange.&lt;br /&gt;
&lt;br /&gt;
I żeby nie było - taka budowa tego eventa jest bardzo rozsądna (ogranicza niepożądane rekurencje, upraszcza kod).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2570390285559898162-350519630685887114?l=runaurufu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/BWQDDNnCTWMYyGxvxBoqjDaBgXQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BWQDDNnCTWMYyGxvxBoqjDaBgXQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/BWQDDNnCTWMYyGxvxBoqjDaBgXQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BWQDDNnCTWMYyGxvxBoqjDaBgXQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LunarIT/~4/C8Rq4cqSFTA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://runaurufu.blogspot.com/feeds/350519630685887114/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://runaurufu.blogspot.com/2011/05/javascript-onchange.html#comment-form" title="Komentarze (2)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/350519630685887114?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/350519630685887114?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LunarIT/~3/C8Rq4cqSFTA/javascript-onchange.html" title="javascript onchange" /><author><name>Damian Pawlik</name><uri>https://profiles.google.com/110162926853117833033</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-S94uikQs-MY/AAAAAAAAAAI/AAAAAAAAAEU/VXGkqwGc4g8/s512-c/photo.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://runaurufu.blogspot.com/2011/05/javascript-onchange.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8DRHw8fSp7ImA9WhdSEEo.&quot;"><id>tag:blogger.com,1999:blog-2570390285559898162.post-8577732491044207382</id><published>2011-04-14T12:53:00.003+02:00</published><updated>2011-07-19T12:21:15.275+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-19T12:21:15.275+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Linux" /><category scheme="http://www.blogger.com/atom/ns#" term="Windows" /><category scheme="http://www.blogger.com/atom/ns#" term="VirtualBox" /><title>VirtualBox i współdzielenie katalogów</title><content type="html">Host: Windows (od XP wzwyż działa na pewno)&lt;br /&gt;
Guest: Linux (testowałem na Ubuntu i OpenSuse, ale powinno śmigać na całej reszcie)&lt;br /&gt;
&lt;br /&gt;
Wiele osób miewa problemy z dostępem do współdzielonych katalogów poprzez&amp;nbsp; domyślne możliwości VB (w tym ja ;p ), a używanie pendrive do przenoszenia danych nie zawsze jest wygodne (nie wspominając o tym co zrobić gdy nasz komputer nie ma wolnego portu USB ^^). Na szczęście na ratunek przychodzi&lt;b&gt; fstab&lt;/b&gt;...&lt;br /&gt;
&lt;br /&gt;
Ale pokolei...&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Adres IP komputera ze współdzielonym katalogiem &lt;br /&gt;
IP potrzebne będzie nam do montowania zasobu (przy czym współdzielony katalog nie musi znajdować się na maszynie hosta - to zarówno może być inna maszyna wirtualna, jak i całkowicie inny komputer w tej sieci).&lt;br /&gt;
&lt;br /&gt;
Jeśli jednak montujemy folder z maszyny hosta najlepiej użyć IP karty utworzonej przez VB. By go uzyskać możemy zarówno poczarować w "cmd", wpisać "ipconfig" i w wyniku wyszukać karty w nazwie posiadającej "VirtualBox". Można również odczytać to IP klikając w VB&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-oYYi8P2ARuU/TiVYeUPdxPI/AAAAAAAAAFc/QbfBZ_nLGFQ/s1600/snap000201.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="202" src="http://3.bp.blogspot.com/-oYYi8P2ARuU/TiVYeUPdxPI/AAAAAAAAAFc/QbfBZ_nLGFQ/s400/snap000201.png" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;
Wybieramy "Plik"-&amp;gt;"Globalne ustawienia"&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://img6.imageshack.us/img6/4599/snap000202.png" style="margin-left: auto; margin-right: auto;"&gt;&lt;br /&gt;
&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-50q5P548l_o/TiVYZ523hBI/AAAAAAAAAFI/Z6PFm3ZzUPA/s1600/snap000202.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="296" src="http://1.bp.blogspot.com/-50q5P548l_o/TiVYZ523hBI/AAAAAAAAAFI/Z6PFm3ZzUPA/s400/snap000202.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Przechodzimy do zakładki "Sieć", wybieramy adapter sieciowy i klikamy ikonkę śrubokręta &lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;/td&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;/td&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;/td&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;/td&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;/td&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;/td&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;/td&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-9VBKgzXMVj4/TiVYbGTM55I/AAAAAAAAAFU/S7f7_Q7D57Y/s1600/snap000203.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="245" src="http://1.bp.blogspot.com/-9VBKgzXMVj4/TiVYbGTM55I/AAAAAAAAAFU/S7f7_Q7D57Y/s400/snap000203.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Adres IP hosta znajduje się właśnie w tym podświetlonym polu&lt;/td&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/li&gt;
&lt;li&gt;Udostępniamy folder w Windowsie&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Uruchamiamy Linux'a i tworzymy sobie folder, do którego będziemy montować nasz zasób&lt;br /&gt;
&lt;blockquote&gt;mkdir /mnt/win&lt;/blockquote&gt;&lt;/li&gt;
&lt;li&gt; Otwieramy fstab&lt;br /&gt;
Otwieramy plik /etc/fstab jako root i dodajemy linię&lt;br /&gt;
&lt;blockquote&gt;&lt;b&gt;//&lt;/b&gt;&lt;b&gt;192.167.56.1/Shared&lt;/b&gt; &lt;b&gt;/mnt/win&lt;/b&gt; smbfs rw,umask=777,uid=&lt;i&gt;&lt;b&gt;LinuxLunar&lt;/b&gt;&lt;/i&gt;,username=&lt;b&gt;&lt;i&gt;WinLunar&lt;/i&gt;&lt;/b&gt;,password=&lt;b&gt;&lt;i&gt;WinHasło&lt;/i&gt;&lt;/b&gt;,auto 0 0&lt;/blockquote&gt;ogólna postać:&lt;br /&gt;
&lt;blockquote&gt;//{&lt;i&gt;&lt;b&gt;IP maszyny&lt;/b&gt;&lt;/i&gt;}/{&lt;i&gt;&lt;b&gt;nazwa współdzielonego udziału&lt;/b&gt;&lt;/i&gt;} {&lt;b&gt;&lt;i&gt;ścieżka do katalogu, w którym chcemy udział zamontować&lt;/i&gt;&lt;/b&gt;} {&lt;b&gt;&lt;i&gt;system plików&lt;/i&gt;&lt;/b&gt;} rw,umask=777,uid={&lt;b&gt;&lt;i&gt;nazwa użytkownika w systemie Linux&lt;/i&gt;&lt;/b&gt;},username={&lt;b&gt;&lt;i&gt;nazwa użytkownika w systemie Windows&lt;/i&gt;&lt;/b&gt;},password={&lt;b&gt;&lt;i&gt;hasło użytkownika w systemie Windows&lt;/i&gt;&lt;/b&gt;},auto 0 0&lt;/blockquote&gt;Warto  zwrócić uwagę na to pod jakiego użytkownika montujemy udział, gdyż  użytkownik ten będzie właścicielem wszystkich plików w tym udziale się  znajdujących :)&lt;br /&gt;
&lt;br /&gt;
W przypadku jeśli nie mamy zainstalowanego &lt;i&gt;&lt;b&gt;smbfs&lt;/b&gt;&lt;/i&gt;&amp;nbsp; - warto spróbować zastąpić go &lt;b&gt;&lt;i&gt;cifs&lt;/i&gt;&lt;/b&gt;'em , a nuż pójdzie.&lt;br /&gt;
&lt;br /&gt;
Zapisujemy wprowadzone zmiany.&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Montujemy udział&lt;br /&gt;
&lt;blockquote&gt;mount /mnt/win&lt;/blockquote&gt;Jeśli nie wysypało błędami -&amp;gt; możemy cieszyć się z zamontowanego udziału i nieskrępowanego doń dostępu... jeśli zaś wysypało to sprawdzamy co to za błędy są :)&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Problemy&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;"mount: unknown filesystem type 'smbfs'&lt;br /&gt;
Przyczyna: Zapewne nie masz zainstalowanego &lt;b&gt;&lt;i&gt;smbfs&lt;/i&gt;&lt;/b&gt; :)&lt;br /&gt;
Rozwiązanie: Spróbuj użyć &lt;b&gt;&lt;i&gt;cifs&lt;/i&gt;&lt;/b&gt; zamiast smbfs, lub zainstaluj smbfs (&lt;i&gt;sudo apt-get install smbfs&lt;/i&gt;)&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2570390285559898162-8577732491044207382?l=runaurufu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_I7wbtJlGodJdJusvCW6pXfAu3U/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_I7wbtJlGodJdJusvCW6pXfAu3U/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_I7wbtJlGodJdJusvCW6pXfAu3U/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_I7wbtJlGodJdJusvCW6pXfAu3U/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LunarIT/~4/X9yczJjiQN4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://runaurufu.blogspot.com/feeds/8577732491044207382/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://runaurufu.blogspot.com/2011/04/virtualbox-i-wspodzielenie-katalogow.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/8577732491044207382?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2570390285559898162/posts/default/8577732491044207382?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LunarIT/~3/X9yczJjiQN4/virtualbox-i-wspodzielenie-katalogow.html" title="VirtualBox i współdzielenie katalogów" /><author><name>Damian Pawlik</name><uri>https://profiles.google.com/110162926853117833033</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-S94uikQs-MY/AAAAAAAAAAI/AAAAAAAAAEU/VXGkqwGc4g8/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-oYYi8P2ARuU/TiVYeUPdxPI/AAAAAAAAAFc/QbfBZ_nLGFQ/s72-c/snap000201.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://runaurufu.blogspot.com/2011/04/virtualbox-i-wspodzielenie-katalogow.html</feedburner:origLink></entry></feed>

