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

<channel>
	<title>Bart&#039;s Developer Log</title>
	<atom:link href="http://www.bart-sokol.info/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bart-sokol.info</link>
	<description>Eveything but nothing.</description>
	<lastBuildDate>Wed, 11 Jan 2012 18:44:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Software Transactional Memory &#8211; prosta implementacja w C#</title>
		<link>http://www.bart-sokol.info/2011/09/software-transactional-memory-prosta-implementacja-w-c/</link>
		<comments>http://www.bart-sokol.info/2011/09/software-transactional-memory-prosta-implementacja-w-c/#comments</comments>
		<pubDate>Thu, 15 Sep 2011 16:50:12 +0000</pubDate>
		<dc:creator>Bart Sokol</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[pamięć transakcyjna]]></category>
		<category><![CDATA[Software Transactional Memory]]></category>
		<category><![CDATA[STM]]></category>
		<category><![CDATA[transakcje]]></category>

		<guid isPermaLink="false">http://www.bart-sokol.info/?p=67</guid>
		<description><![CDATA[Ostatnio zderzyłem się z problemem transakcyjnej pamięci (STM) i właściwie brakiem dostępnych implementacji w C# (poza NSTM). Różne wariacje na temat które powstały przez lata w stajni Microsoftu nie doczekały się do dnia dzisiejszego funkcjonującej implementacji (głównie dlatego, że zdecydowano &#8211; całkiem rozsądnie &#8211; że wsparcie dla tego mechanizmu powinno być na poziomie CLR). Dla <a href='http://www.bart-sokol.info/2011/09/software-transactional-memory-prosta-implementacja-w-c/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Ostatnio zderzyłem się z problemem transakcyjnej pamięci (STM) i właściwie brakiem dostępnych implementacji w C# (poza <a title="NSTM" href="http://code.google.com/p/nstm/">NSTM</a>). Różne wariacje na temat które powstały przez lata w stajni Microsoftu nie doczekały się do dnia dzisiejszego funkcjonującej implementacji (głównie dlatego, że zdecydowano &#8211; całkiem rozsądnie &#8211; że wsparcie dla tego mechanizmu powinno być na poziomie CLR). Dla osób zainteresowanych tematem przedstawię w skrócie moją implementację, zapewne nie pozbawioną wad, jednak mającą jedną zasadniczą zaletę &#8211; prostotę implementacji i użycia. Zatem zapraszam do lektury <img src='http://www.bart-sokol.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
<span id="more-67"></span><br />
Ponieważ zakłada się, że przez większość czasu system (program) powinien działać prawidłowo, przyjąłem optymistyczne podejście do transakcji. Zatem cały mechanizm polega na tym, iż tworzymy w pewnym momencie (o czym już sami decydujemy) kopię danych obiektu, którą w razie potrzeby odtwarzamy (rollback). Przede wszystkim trzeba więc zacząć od sposobu zachowywania kopii obiektu do ewentualnego odtworzenia. Ja zdecydowałem się na mechanizm serializacji, głównie ze względu na sporą uniwersalność. Alternatywnie można wykorzystać np. klonowanie (IClonable i MemberwiseClone()), co jest zwykle znacznie szybsze, jednak wymaga od każdego zapisywanego obiektu realizacji IClonable. W przypadku serializacji wystarczające jest oznaczenie obiektu jako Serializable, co zwykle jest proste do osiągnięcia. Kolejnym ograniczeniem, które przyjąłem, jest odtwarzanie tylko i wyłącznie publicznych właściwości obiektu &#8211; zakładamy, że operujemy na stosunkowo prostych obiektach (typu nośniki danych z bazy), co pozwala nam znacznie uprościć realizację wycofywania transakcji.<br />
Odtwarzanie stanu obiektów oparte jest o refleksję &#8211; przepisujemy wartości właściwości z kopii do obiektu źródłowego (nie robimy podmiany na zdeserializowany obiekt &#8211; zmieniło by to referencję, czego chciałem uniknąć). Daje to niewielki narzut wydajnościowy, jednak przy optymistycznej transakcji strata w rollbacku nie jest aż takim problemem (przynajmniej w moim przypadku).<br />
Zatem założenia znamy, pora poznać implementację. Oto i ona (C# 4.0):</p>
<pre class="brush: csharp; title: ; notranslate">
public class MemoryTransaction : IDisposable
    {
        #region Static members

        private static ConcurrentDictionary&lt;int, ConcurrentStack&lt;MemoryTransaction&gt;&gt; transactionStack = new ConcurrentDictionary&lt;int, ConcurrentStack&lt;MemoryTransaction&gt;&gt;();
        private static object locker = new object();

        public static MemoryTransaction Current
        {
            get
            {
                if (transactionStack.ContainsKey(Thread.CurrentThread.ManagedThreadId) &amp;&amp; transactionStack[Thread.CurrentThread.ManagedThreadId].Count &gt; 0)
                {
                    MemoryTransaction result;
                    transactionStack[Thread.CurrentThread.ManagedThreadId].TryPeek(out result);
                    return result;
                }
                else
                    return null;
            }
        }

        #endregion

        #region Private members

        private Stack&lt;object&gt; myTransactionLogObjects;
        private Stack&lt;byte[]&gt; myTransactionLogStates;

        #endregion

        #region Constructors

        public MemoryTransaction()
        {
            var stack = transactionStack.GetOrAdd(Thread.CurrentThread.ManagedThreadId, new ConcurrentStack&lt;MemoryTransaction&gt;());
            transactionStack[Thread.CurrentThread.ManagedThreadId].Push(this);
            myTransactionLogObjects = new Stack&lt;object&gt;();
            myTransactionLogStates = new Stack&lt;byte[]&gt;();
        }

        #endregion

        public void SaveObject(object instance)
        {
            if ((null != instance) &amp;&amp; (false == instance is ValueType) &amp;&amp; (instance.GetType().IsSerializable))
            {
                if (false == myTransactionLogObjects.Contains(instance))
                    lock (locker)
                    {
                        myTransactionLogObjects.Push(instance);
                        myTransactionLogStates.Push(instance.Serialize());
                    }
            }
            else
            {
                throw new ArgumentException(&quot;Provide existing instance of Serializable class&quot;);
            }
        }

        private void RecoverObject(object instance, object copy)
        {
            Type t = instance.GetType();
            PropertyInfo[] propInfos = t.GetProperties();
            lock (locker)
            {
                foreach (PropertyInfo info in propInfos)
                    if (info.CanWrite &amp;&amp; info.PropertyType.IsSerializable)
                    {
                        info.SetValue(instance, info.GetValue(copy, null), null);
                    }
            }
        }

        public void Commit()
        {
            lock (locker)
            {
                myTransactionLogObjects.Clear();
                myTransactionLogStates.Clear();
            }
        }

        public void Dispose()
        {
            ConcurrentStack&lt;MemoryTransaction&gt; stack;
            MemoryTransaction current;
            transactionStack[Thread.CurrentThread.ManagedThreadId].TryPop(out current);
            // Clean transaction stack for current thread if empty
            if (transactionStack[Thread.CurrentThread.ManagedThreadId].Count == 0)
                transactionStack.TryRemove(Thread.CurrentThread.ManagedThreadId, out stack);
            // Restore state for all saved objects
            while (myTransactionLogObjects.Count &gt; 0)
            {
                RecoverObject(myTransactionLogObjects.Pop(), myTransactionLogStates.Pop().Deserialize());
            }
        }
    }
</pre>
<p>Jak widać, ilość kodu nie powala na łopatki, stopień skomplikowania również. Dodatkowo wykorzystywana jest dodatkowa klasa pomocnicza, która dodaje dwie metody rozszerzające (Serialize na object i Deserialize na byte[]) które realizują (de)serializację binarną (System.Runtime.Serialization.Formatters.Binary). Użycie transakcji wygląda identycznie jak TransactionScope (więc można w prosty sposób powiązać STM z transakcją na bazie danych &#8211; wystarczą tylko drobne modyfikacje powyższej klasy):</p>
<pre class="brush: csharp; title: ; notranslate">
using (MemoryTransaction mt = new MemoryTransaction())
{
    // Tutaj robimy nasz misz-masz...

    // Commit robimy jeżeli wszystko OK, w przeciwnym wypadku automatyczne wykonany zostanie Rollback
    mt.Commit();
}
</pre>
<p>Zostaje jeszcze samo zapisywanie obiektów. Można to zrobić co najmniej na dwa sposoby &#8211; albo jawnie w bloku transakcji, wywołując <code>mt.SaveObject(naszObiekt)</code>, albo na poziomie obiektu podczas ustawiania wartości jego pól (np. przy zmianie znacznika typu IsDirty, a właściwie przed jego zmianą) &#8211; wywołujemy wtedy <code>MemoryTransaction.Current.SaveObject(this);</code>. Jak widać nie jest to bardzo uciążliwe, należy jednak zawsze zadbać o &#8222;ręczny&#8221; zapis stanu obiektu &#8211; inaczej rollback nic nie zmieni.<br />
Jedną z pozytywnych cech poniższej implementacji jest względne bezpieczeństwo w przypadku aplikacji wielowątkowej (thread safety). Każdy z wątków posiada własny stos transakcji, więc raczej nie ma możliwości &#8222;przeplatania się&#8221; transakcji. Ponadto krytyczne zapisy i odczyty wykonywane są podczas locka &#8211; co niestety ujemnie wpływa na wydajność, ale bezpieczeństwo jest w tym wypadku najważniejsze.<br />
Inną pozytywną cechą jest możliwość tworzenia zagnieżdżonych transakcji &#8211; więc nie ma niebezpieczeństwa &#8222;wysypania&#8221; transakcji poprzez np. wywołanie metody która uruchamia własną transakcję. Ważnym aspektem tego zachowania jest kwestia rejestracji obiektu nie tylko w bieżącej, ale również w nadrzędnych transakcjach &#8211; co w podanej implementacji nie jest zaimplementowane, jednak nie jest trudne do osiągnięcia.</p>
<p>Zatem jak widać możliwe jest stworzenie mechanizmów zbliżonych do &#8222;prawdziwego&#8221; STM, które nie utrudnią nam za bardzo życia i pozwolą na utworzenie względnie bezpiecznej aplikacji bez powtarzania niepotrzebnych fragmentów kodu. Jak każde uproszczenie ma swoje zalety i wady &#8211; do tych drugich należy zapewne ograniczone zastosowanie i niekorzystny wpływ na wydajność. Spadek wydajności w stosunku do niestosowania transakcji w przypadku niezbyt skomplikowanych obiektów (nie zawierających złożonych obiektów typu listy) sięga 30-50% dla optymistycznej, pozytywnie zakończonej operacji. Czy jest to dużo, czy mało &#8211; to już rzecz typowo subiektywna &#8211; wszystko zależy od konkretnych potrzeb. Oczywiście nie mogę zagwarantować, że implementacja ta jest w 100% poprawna i zawsze zadziała bez zarzutu &#8211; jednak w moich testach jeszcze mnie nie zawiodła i miejmy nadzieję, że będzie tak dalej <img src='http://www.bart-sokol.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.bart-sokol.info/2011/09/software-transactional-memory-prosta-implementacja-w-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MVVM i kolejność warstw, czyli co było pierwsze &#8211; jajko czy kura?</title>
		<link>http://www.bart-sokol.info/2011/07/mvvm-i-kolejnosc-warstw-czyli-co-bylo-pierwsze-jajko-czy-kura/</link>
		<comments>http://www.bart-sokol.info/2011/07/mvvm-i-kolejnosc-warstw-czyli-co-bylo-pierwsze-jajko-czy-kura/#comments</comments>
		<pubDate>Sat, 30 Jul 2011 09:46:50 +0000</pubDate>
		<dc:creator>Bart Sokol</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Blend]]></category>
		<category><![CDATA[blendability]]></category>
		<category><![CDATA[Model]]></category>
		<category><![CDATA[MVVM]]></category>
		<category><![CDATA[Prism]]></category>
		<category><![CDATA[separacja]]></category>
		<category><![CDATA[testability]]></category>
		<category><![CDATA[View]]></category>
		<category><![CDATA[ViewModel]]></category>
		<category><![CDATA[warstwy]]></category>

		<guid isPermaLink="false">http://www.bart-sokol.info/?p=62</guid>
		<description><![CDATA[Mała zmiana tematu po kilku miesiącach &#8211; opowiem dziś coś niecoś o technologiach ze stajni Microsoftu i związanych z nimi wzorcami. A tak konkretniej to będzie to (bodajże najpopularniejszy) wzorzec związany z Silverlight i Windows Presentation Foundation (WPF) &#8211; czyli MVVM. Opowiem jaka powinna być (moim skromnym zdaniem) kolejność tworzenia poszczególnych warstw, co postaram się <a href='http://www.bart-sokol.info/2011/07/mvvm-i-kolejnosc-warstw-czyli-co-bylo-pierwsze-jajko-czy-kura/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Mała zmiana tematu po kilku miesiącach &#8211; opowiem dziś coś niecoś o technologiach ze stajni Microsoftu i związanych z nimi wzorcami. A tak konkretniej to będzie to (bodajże najpopularniejszy) wzorzec związany z Silverlight i Windows Presentation Foundation (WPF) &#8211; czyli MVVM. Opowiem jaka powinna być (moim skromnym zdaniem) kolejność tworzenia poszczególnych warstw, co postaram się poprzeć &#8222;dowodami&#8221;, nie koniecznie formalnymi <img src='http://www.bart-sokol.info/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Opowiem również o związanych z implementacją wzorca problemach i być może nawet o rozwiązaniach tych problemów.<span id="more-62"></span></p>
<h3>Co powinno być pierwsze &#8211; view czy view model?</h3>
<p>Odpowiedź jest jedna, czasem podważana przez niektórych przedstawicieli programistycznego świata. Otóż brzmi ona tak: View. A dlaczegóż tak?</p>
<p>Zacznę może od poprawnej nazwy wzorca MVVM &#8211; powinna ona brzmieć VVMM, czyli View -&gt; ViewModel -&gt; Model. Dlaczego taka kolejność jest tak ważna? Otóż wszystko wynika ze słowa &#8211; klucza związanego z tym i innymi wzorcami &#8211; separacji. Każda z tych warstw powinna być możliwie najluźniej związana z warstwą o poziom niższą, natomiast o warstwie &#8222;2 dalej&#8221; nie powinna nic wiedzieć (dotyczy to szczególnie widoku). Ważny jest również kierunek strzałek &#8211; określa on kierunek powstawania kolejnych warstw. Każda strzałka daje również możliwość przecięcia &#8211; łącznie z możliwością całkowitego wyeliminowania powiązań między warstwami. Osiągnięcie tego jest jak najbardziej możliwe i wcale nie tak trudne, jak się z początku wydaje. Korzystając z jednego z wielu dostępnych frameworków wspierających MVVM można w dość krótkim czasie skonstruować elegancką aplikację, która w dodatku będzie miała przejrzysty i czytelny kod.</p>
<h3>Narzędzia</h3>
<p>Jednym z takich &#8222;wspomagaczy&#8221; jest dostarczany przez zespół Microsoft Patterns &amp; Practices framework Prism (wcześniej zwany również jako Composite Application Guidance) wraz z bibliotekami IoC (Inversion of Control) Unity lub MEF. Dostarcza on zestaw niezbędnych klas i interfejsów (np. commands, behaviours, regions), które ułatwiają budowę aplikacji nie tylko zgodnej z MVVM, ale również modularnej, składającej się z luźno powiązanych ze sobą projektów. Jeżeli tworzymy rozbudowaną aplikację biznesową to warto się przyjrzeć temu rozbudowanemu narzędziu. Oczywiście dostępne są również inne biblioteki (np. bardzo ciekawy MVVM Light Toolkit) i wybór konkretnej z nich jest kwestią potrzeb i preferencji związanych z konkretnym projektem.</p>
<h3>A dlaczego tak? cz. 1 &#8211; blendability</h3>
<p>Wracając do podziału na warstwy i ich kolejności &#8211; dlaczego taka kolejność ma takie znaczenie? Odpowiedź może nie wydawać się oczywista, ale nie wymaga żadnej tajemnej wiedzy, aby ją zrozumieć i zastosować. Po pierwsze &#8211; dlaczego widok powinien być niezależny od view modela, ale jednocześnie tworzyć jego instancję? (i to w code behind!)</p>
<p>Taka kolejność wynika ze ścisłego związku ze strukturą aplikacji w WPF/SL. Jako że widok to w 95% deklaratywny kod XAML (pozostałe 5% to fragment tworzący VM w code behind oraz kod klasy bazowej widoków), który może być tworzony zarówno w Visual Studio, Expression Blend jak i innych narzędziach (jak np. Kaxaml czy Notepad <img src='http://www.bart-sokol.info/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  ), nie było by rozsądnym tworzenie i wiązanie go z poziomu kodu logiki aplikacji. Znacząco utrudniało by to (lub wręcz uniemożliwiało) projektowanie interfejsu niezależnie od logiki działania aplikacji. Przy odpowiedniej separacji mamy możliwość wygenerowania danych testowych i projektowania niezależnie od implementacji (której może w ogóle jeszcze nie być), co w przypadku Expression Blend jest wyjątkowo proste i wygodne. Dodając do tego ignorowanie code behind przez Blenda mamy pierwszą część odpowiedzi, która w dodatku zostanie poparta przez następną część.</p>
<p>A dlaczego tak? cz.2 &#8211; testability</p>
<p>Mając widok, który w razie potrzeby tworzy sobie (prawdziwy lub mockowany przez designera) view model, jesteśmy w stanie całkowicie uniezależnić logikę działania od interfejsu użytkownika. Taką możliwość daje nam VM, który nie ma żadnych bezpośrednich zależności z widokiem (a konkretniej jego implementacją). Zgodnie z wcześniejszą tezą jesteśmy w stanie uciąć powiązanie pomiędzy VM a pozostałymi warstwami i wykonać niezależne (automatyczne) testy logiki działania aplikacji. Wymaga to oczywiście przygotowania mockowanych modeli danych, jednak nie powinno to stanowić większego problemu. W ten sposób otrzymujemy trzy niezależne warstwy i każdą z nich jesteśmy w stanie osobno tworzyć i testować. Dodatkowo przy odpowiedniej konstrukcji warstwy te są niezależne od pozostałych komponentów aplikacji nie związanych bezpośrednio z MVVM, jak np. usług dostarczających dane i logikę biznesową czy konwerterów i stylów wspomagających konstrukcję UI.</p>
<h3>Problemy i rozwiązania</h3>
<p>Podstawowym problemem przy separacji pomiędzy V a VM jest kwestia nawigacji w aplikacji oraz reakcji na działania użytkownika. W tym przypadku z pomocą przychodzą takie narzędzia jak Region Navigation, Behaviour no i oczywiście Delegate Command, dostępne w bibliotece Prism. Umożliwiają one (pewnym, acz wcale nie wielkim nakładem pracy) stworzenie warstwy pośredniczącej w komunikacji pomiędzy logiką a interfejsem, która będzie w wygodny i jednocześnie zgodny z MVVM sposób przekazywać informacje pomiędzy V a VM. W razie wątpliwości lub chęci poszerzenia swojej wiedzy polecam lekturę (dostępnej za darmo na stronie Prisma) książki <em>Developer&#8217;s Guide to Microsoft Prism</em>. Dostarcza ona solidną dawkę informacji na temat konstrukcji aplikacji kompozytowych, zarówno jeżeli chodzi o UI, jak i strukturę całej aplikacji, a w dodatku napisana jest w dość przystępny i przejrzysty sposób. Ale oczywiście nic nie zastąpi praktyki, więc najlepsze co można zrobić aby dobrze zrozumieć wzorzec MVVM to usiąść i napisać choćby prostą aplikację, wykorzystując dostępną (lub zdobytą np. z podanej lektury) wiedzę. Powodzenia!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bart-sokol.info/2011/07/mvvm-i-kolejnosc-warstw-czyli-co-bylo-pierwsze-jajko-czy-kura/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Przygody z Django &#8211; cz. 2 &#8211; Aptana, PyDev i debugowanie</title>
		<link>http://www.bart-sokol.info/2011/04/przygody-z-django-cz-2-aptana-pydev-i-debugowanie/</link>
		<comments>http://www.bart-sokol.info/2011/04/przygody-z-django-cz-2-aptana-pydev-i-debugowanie/#comments</comments>
		<pubDate>Mon, 18 Apr 2011 15:24:29 +0000</pubDate>
		<dc:creator>Bart Sokol</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Aptana]]></category>
		<category><![CDATA[debugger]]></category>
		<category><![CDATA[debugowanie]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[PyDev]]></category>

		<guid isPermaLink="false">http://www.bart-sokol.info/?p=57</guid>
		<description><![CDATA[Tak jak obiecałem we wcześniejszym wpisie napiszę kilka słów o konfiguracji debuggera w Aptana Studio 3 &#8211; czyli Eclipse z &#8222;wbudowanym&#8221; PyDev i kilkoma innymi przydatnymi dodatkami. Wprawdzie temat tyczy się głównie Django, jednak konfiguracja dla innych framework&#8217;ów czy technologii dla Pythona jest zbliżona. Całość sprowadza się do kilku kliknięć, ewentualnie wpisania kilku znaków, więc <a href='http://www.bart-sokol.info/2011/04/przygody-z-django-cz-2-aptana-pydev-i-debugowanie/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Tak jak obiecałem we <a href="http://www.bart-sokol.info/2011/04/pierwsze-powazniejsze-przygody-z-django-cz-1-dlaczego-django-i-aptana-to-zgrana-para/">wcześniejszym wpisie</a> napiszę kilka słów o konfiguracji debuggera w Aptana Studio 3 &#8211; czyli Eclipse z &#8222;wbudowanym&#8221; PyDev i kilkoma innymi przydatnymi dodatkami. Wprawdzie temat tyczy się głównie Django, jednak konfiguracja dla innych framework&#8217;ów czy technologii dla Pythona jest zbliżona. Całość sprowadza się do kilku kliknięć, ewentualnie wpisania kilku znaków, więc myślę, że nie powinno być z tym problemów. A więc zaczynamy!<br />
<span id="more-57"></span></p>
<h3>1. Instalacja Aptana Studio 3 lub Eclipse i PyDev</h3>
<p>Tu nie ma za bardzo co opisywać &#8211; wchodzimy na stronę wybranego środowiska, ściągamy i rozpakowujemy / instalujemy. Nic prostszego.</p>
<h3>2. Instalacja Django</h3>
<p>W celu instalacji Django najlepiej posłużyć się virtualenv i instalatorem pip &#8211; myślę, że Google bez problemu odpowie, jak to zrobić, jeżeli jeszcze nie wiesz. Jeżeli masz już skonfigurowane swoje wirtualne środowisko Pythona, wykonujemy po prostu:</p>
<blockquote><p><code>pip install Django</code></p></blockquote>
<p>Oprócz samego Django możemy chcieć zainstalować dodatkowe biblioteki, jak choćby South czy PIL &#8211; wszystkie bez problemu instalujemy za pomocą pip. Jeżeli korzystamy z Ubuntu, warto wcześniej mieć w systemie zainstalowane <code>build-essential</code>, oraz w przypadku instalacji PIL biblioteki developerskie dla JPEG &#8211; np. <code>libjpeg8-dev</code>. Po instalacji niezbędnych pakietów możemy przejść do konfiguracji debuggera.</p>
<h3>3. Konfiguracja debuggera</h3>
<p>Ten punkt warto zacząć od ustawienia interpretera Pythona z naszego virtualenv. W tym celu wchodzimy w ustawienia Eclipse (w moim przypadku<em> Window -&gt; Preferences</em>), wybieramy <em>Pydev -&gt; Interpreter &#8211; Python</em>. Tworzymy nowy interpreter, podając wybraną przez nas nazwę oraz wskazując ścieżkę do pliku <code>bin/python</code> z katalogu naszego wirtualnego środowiska. Stosujemy wprowadzone zmiany (<em>Apply</em>), dodając ewentualnie ścieżki do dodatkowych bibliotek według własnych potrzeb. Zamykamy ustawienia i możemy tworzyć nowy projekt Django (<em>New -&gt; Other -&gt; Pydev / Pydev Django Project</em>) &#8211; podczas jego tworzenia odradzam zaznaczanie tworzenia katalogu src, a także proponuję od razu wybrać nasz wcześniej stworzony interpreter i odpowiednią wersję Pythona (w Ubuntu 10.10 mamy domyślnie 2.6).<br />
Po stworzeniu i wstępnej konfiguracji projektu klikamy na niego PPM w <em>Pydev Package Explorer</em> i wybieramy <em>Properties</em>. W opcji <em>PyDev &#8211; PYTHONPATH</em>, w zakładce <em>External Libraries</em> dodajemy (poprzez przycisk <em>Add source folder</em>) katalog <code>plugins/org.python.pydev.debug_*/pysrc</code> (gdzie * to wersja zainstalowanego PyDev) i zastosowujemy wprowadzone zmiany. Następnie w tym samym oknie wybieramy <em>Run/Debug Settings</em> i dodajemy nową konfigurację. Wybieramy nasz wcześniej stworzony projekt, jako main module podajemy plik <code>manage-debug.py</code> (do znalezienia na <a href="http://djangosnippets.org/snippets/1561/">django-snippets</a>, można też wybrać &#8222;zwykłe&#8221; manage.py, ale nie wiem, czy wtedy wszystko zadziała jak należy <img src='http://www.bart-sokol.info/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  ). W zakładce Arguments podajemy <code>runserver --noreload </code> w polu <em>Program arguments</em>. Jako working directory wskazujemy katalog, w którym jest plik settings.py (Other -&gt; Workspace&#8230;).<br />
W celu usprawnienia pracy, możemy w zakładce <em>Common</em> dodać nasze ustawienie do przycisku na pasku (Display in favorites menu).</p>
<h3>4. Uruchamianie debuggera</h3>
<p>Przed uruchomieniem naszego projektu uruchamiamy serwer debugowania PyDev (menu <em>Pydev -&gt; Start debug server</em>). Następnie możemy uruchomić nasz projekt (z przycisku debugowania wybieramy naszą wcześniej stworzoną konfigurację). Przy pierwszym uruchomieniu Aptana może zapytać o instalację dodatku do Firefoxa, którego zainstaluje automatycznie &#8211; jedyne wymaganie to instalacja &#8222;ręczna&#8221; Firebuga &#8211; o ile go jeszcze nie masz. I tyle! Możemy już ustawiać pułapki, przeglądać zmienne etc. Miłego i owocnego debugowania! <img src='http://www.bart-sokol.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.bart-sokol.info/2011/04/przygody-z-django-cz-2-aptana-pydev-i-debugowanie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Start-up &#8211; jak nie zaczynać nowego projektu</title>
		<link>http://www.bart-sokol.info/2011/04/start-up-jak-nie-zaczynac-nowego-projektu/</link>
		<comments>http://www.bart-sokol.info/2011/04/start-up-jak-nie-zaczynac-nowego-projektu/#comments</comments>
		<pubDate>Sun, 17 Apr 2011 20:41:31 +0000</pubDate>
		<dc:creator>Bart Sokol</dc:creator>
				<category><![CDATA[Misc]]></category>
		<category><![CDATA[Startup]]></category>
		<category><![CDATA[błędy]]></category>
		<category><![CDATA[finanse]]></category>
		<category><![CDATA[projekty]]></category>
		<category><![CDATA[przemyślenia]]></category>
		<category><![CDATA[startup]]></category>

		<guid isPermaLink="false">http://www.bart-sokol.info/?p=51</guid>
		<description><![CDATA[Jako że temat rozpoczynania (tudzież rozwijania) swojego biznesu jest u mnie chlebem powszednim, stwierdziłem, że pora napisać kilka słów na ten temat. Słów (mam nadzieję) pomocnych dla potomnych, aczkolwiek na pewno nie tych z kategorii motywujących. Otóż powiem pokrótce o kilku sprawach, o których warto pamiętać, a o których wielu ambitnych ludzi zapomina, przeceniając swoje <a href='http://www.bart-sokol.info/2011/04/start-up-jak-nie-zaczynac-nowego-projektu/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Jako że temat rozpoczynania (tudzież rozwijania) swojego biznesu jest u mnie chlebem powszednim, stwierdziłem, że pora napisać kilka słów na ten temat. Słów (mam nadzieję) pomocnych dla potomnych, aczkolwiek na pewno nie tych z kategorii motywujących. Otóż powiem pokrótce o kilku sprawach, o których warto pamiętać, a o których wielu ambitnych ludzi zapomina, przeceniając swoje możliwości &#8211; twórcze i finansowe.<br />
<span id="more-51"></span></p>
<h3>Mam świetny pomysł, rzucam wszystko i pędzę go realizować</h3>
<p>Czyli jeden z najczęstszych błędów. Wydaje ci się, że twój pomysł jest wyjątkowy, że zrobisz coś niesamowitego, a na dodatek wiesz, jak na tym zarobić! Super, ja też. I setki, jak nie tysiące innych osób. I co z tego wynika? Absolutnie nic. Bez wstępnej chociażby realizacji twój pomysł jest wart tyle, co nic. Dlaczegóż tak jest? Sam pomysł jest tylko ziarenkiem, które trzeba zasadzić, wyhodować, pielęgnować i cierpliwie czekać, aż urośnie i da owoce. Ziarno, którego nie zasadzisz i nie nakarmisz, nie wykiełkuje, nie urośnie i nie stanie się dojrzałą rośliną. Podobnie jest z pomysłem. Dopóki nie zaczniesz go realizować, nie poświęcisz mu ogromnej ilości czasu i sił, będzie on tylko pomysłem. Co więc zrobić, aby nasz pomysł przerodził się w dojrzały projekt, który zaowocuje (mniej lub bardziej) udaną realizacją?</p>
<p>Przede wszystkim potrzeba poświęcić mu sporo czasu. I to nie tylko na rozmyślanie, ale na konkretne projekty, na realizację, na testowanie pomysłów. Być może trzeba zarwać kilka nocy, przegapić wiele ciekawych imprez, przez jakiś czas być zupełnym odludkiem (nie licząc kontaktów z ewentualnymi współtwórcami). Być może trzeba poświęcić sporo przyjemności aby odłożyć sporą sumę pieniędzy, największą, jaką jesteś w stanie uzbierać. Dlaczego? Bez tych dwóch elementów nie będziesz w stanie funkcjonować po opuszczeniu dotychczasowej roboty (no, chyba że jesteś szczęśliwym studentem i/lub masz hojnych sponsorów). Działający projekt, nawet tylko w jakiejś części, jest niezbędny, aby uświadomić sobie, czy to rzeczywiście ma sens. A pieniądze &#8211; to chyba oczywiste. Za coś trzeba żyć, zwłaszcza jak musisz opłacić mieszkanie, wyżywić się czy utrzymać firmę (co w polskich realiach jest koszmarem, marnującym mnóstwo czasu i pieniędzy, ale o tym kiedy indziej). Jeżeli wydaje ci się, że starczy ci na pół roku życia &#8211; masz realne pieniądze na 3 miesiące. Dodatkowo nie można zapomnieć o ewentualnych kosztach związanych z utrzymaniem projektu (jak chociażby serwery, domeny, sprzęt czy niezbędne oprogramowanie, etc.), które w przypadku wzrostu popularności mogą zacząć drastycznie rosnąć &#8211; w dodatku nie koniecznie liniowo z przychodami. Dlatego jeżeli rzeczywiście chcesz, aby twój start-up przerodził się w coś dochodowego, warto o tych kwestiach pamiętać i podejść do nich na poważnie.</p>
<h3>Nie mam pieniędzy, ale to nie problem, pieniądze zawsze się znajdą</h3>
<p>Owszem, jeżeli projekt będzie dobry, zapewne się znajdą. Pod warunkiem jednak, że do tego czasu nie umrzesz z głodu, nie wyrzucą cię z mieszkania i nie zrobisz sobie długu na kilka lat spłacania. Zgodnie z prawem Murphy&#8217;ego wszytko to, co może pójść źle, pójdzie źle. I to się niezwykle sprawdza jeżeli przełożymy to na finanse. Jeżeli uważasz, że za wszystko zapłaci Unia, albo sponsorzy rzucą hojną ręką tysiące czy nawet miliony, a masz tylko pomysł, to jesteś w głębokim śnie i pora się obudzić. Owszem, można pozyskać fundusze unijne, jednak wiąże się z dużymi komplikacjami formalnymi i mocnym usztywnieniem dalszych działań (zapomnij o elastyczności czy dostosowywaniu się do potrzeb rynku &#8211; to, co było w projekcie, musi być, choćby okazało się totalną klapą). Można również szukać pieniędzy wśród aniołów biznesu czy VC, ale bez działającego projektu i jasnej wizji finansowania i osiągnięcia znaczących zysków znalezienie inwestora graniczy z cudem. Niby każdy o tym wie, ale jednak większość z nas o tym zapomina, wierząc w siłę swojego pomysłu. Dlatego tak ważne jest zabezpieczenie finansowe &#8211; ten minimalny wkład, który trzeba wnieść, aby szanse powodzenia twojego start-up&#8217;u były znacząco większe od okrągłej, tudzież eliptycznej cyfry.</p>
<p>Oczywiście jest jeszcze milion innych czynników, które mają wpływ na to, że nasz start-up odniesie sukces lub okaże się klęską &#8211; za każdym razem trzeba rozważyć wszystkie za i przeciw, zrobić sobie bilans i sprawdzić, czy to rzeczywiście ma sens. Jednak zawsze trzeba pamiętać, że podstawą jakiegokolwiek sukcesu jest ciężka praca, do której należy podejść z należytą starannością i dozą solidnej motywacji. Tak więc &#8211; jeżeli jeszcze, drogi czytelniku, nie zniechęciłeś się do swojego pomysłu &#8211; rękawy za łokcie, klawiatury w dłonie i niech noc będzie długa! (a moc niech będzie z wami <img src='http://www.bart-sokol.info/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  )</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bart-sokol.info/2011/04/start-up-jak-nie-zaczynac-nowego-projektu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ThinkPad L412 i Linux, ale nie tylko</title>
		<link>http://www.bart-sokol.info/2011/04/thinkpad-l412-i-linux-ale-nie-tylko/</link>
		<comments>http://www.bart-sokol.info/2011/04/thinkpad-l412-i-linux-ale-nie-tylko/#comments</comments>
		<pubDate>Mon, 11 Apr 2011 08:55:54 +0000</pubDate>
		<dc:creator>Bart Sokol</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Sprzęt]]></category>
		<category><![CDATA[ThinkPad L412]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.bart-sokol.info/?p=43</guid>
		<description><![CDATA[Tak jak wcześniej obiecałem postaram się napisać kilka słów o wsparciu dla sprzętu zainstalowanego w ThinPadzie L412 pod Linuksem (konkretnie pod Ubuntu 10.10 Maverick Meerkat). Skoncentruję się oczywiście na tym, czego zwykle używam, ale postaram się opisać możliwie wszystkie elementy, które udało mi się w jakikolwiek sposób przetestować. A więc zaczynamy! 1. Podstawowe komponenty &#8211; <a href='http://www.bart-sokol.info/2011/04/thinkpad-l412-i-linux-ale-nie-tylko/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Tak jak wcześniej obiecałem postaram się napisać kilka słów o wsparciu dla sprzętu zainstalowanego w ThinPadzie L412 pod Linuksem (konkretnie pod Ubuntu 10.10 Maverick Meerkat). Skoncentruję się oczywiście na tym, czego zwykle używam, ale postaram się opisać możliwie wszystkie elementy, które udało mi się w jakikolwiek sposób przetestować. A więc zaczynamy!</p>
<p><span id="more-43"></span></p>
<h3><strong>1. Podstawowe komponenty &#8211; procesor, grafika, porty video<br />
</strong></h3>
<p>W tej części bez niespodzianek. Procesory i karty graficzne Intela należą do najlepiej wspieranych podzespołów pod Linuksem. Dzięki sterownikom open source od Intela możemy cieszyć się bardziej niż przyzwoitą wydajnością procesora Core i5 460M oraz &#8211; niestety &#8211; dość przeciętną wydajnością zintegrowanej w nim karty graficzną GMA. Jednak z grafiką jest jeszcze niewielka nadzieja &#8211; najnowsze sterowniki Intela mają przynieść znaczącą poprawę wydajności, co według testów powinno pozwolić uzyskać wydajność zbliżoną do tej pod Windowsem. Jednak pomijając przeciętną wydajność (w codziennej pracy wystarczającą, ale do jakiegokolwiek 3D zdecydowania za słabą) wsparcie jest na wysokim poziomie &#8211; wszystko działa od razu po instalacji systemu, nie ma problemów z zewnętrznymi ekranami (testowane po D-Sub i DVI, DisplayPort jeszcze znalazł żadnego kompatybilnego urządzenia, z którym mógłbym go połączyć), w 2D oraz w akcelerowanym pulpicie 3D wszystko działa jak należy.</p>
<h3>2. Pamięć, dysk Seagate Momentus XT</h3>
<p>Oczywiście na takim sprzęcie może być używany tylko 64-bitowy system (instalacja wersji 32-bitowej jest czystym marnotrawstwem czasu i wydajności), w związku z tym wsparcie dla 8 GB (maksymalna oficjalnie wspierana ilość pamięci dla tego modelu) nie stanowi problemu i wszystko działa jak należy. Dodatkowo, dzięki zainstalowaniu 500 GB dysku Seagate Momentus XT z 32 MB cache i 4 GB cache SSD do odczytu (w miejsce standardowego Momentusa 320 GB 7200 rpm) wydajność systemu potrafi naprawdę pozytywnie zaskoczyć. Dzięki mechanizmowi podwójnego cache czas dostępu do najczęściej wykorzystywanych danych jest zbliżony do dysków SSD, dzięki czemu np. Firefox czy Eclipse działają zaskakująco szybko. Jedyną uwagą jest konieczność aktualizacji firmware dysku (i najlepiej również BIOSu komputera) ze względu na problemy z kompatybilnością uniemożliwiające poprawną instalację i działanie systemu (zarówno Windows jak i Linux).</p>
<h3>3. Pozostałe porty &#8211; audio, USB i inne</h3>
<p>Jeżeli chodzi o zewnętrzne porty, to mamy tutaj pewne drobne problemy. Jeden wynika z samej konstrukcji komputera, a drugi &#8211; najprawdopodobniej z błędu w sterowniku, jednak obydwa dotyczą tego samego gniazda &#8211; czyli wyjścio-wejścia audio. Przede wszystkim kupując ten model wraz ze stacją dokującą należy mieć świadomość, że gniazda audio w docku nie będą działać, ot tak, po prostu, bez komentarza. Natomiast podłączenie np. zewnętrznych głośników czy słuchawek będzie wiązało się z koniecznością przełączenia w aplecie preferencji dźwięku aktywnego wyjścia audio. Jak będziemy chcieli wrócić do wbudowanych głośników &#8211; znów to samo. Dosyć uciążliwe i irytujące, miejmy nadzieję, że kolejne wersje sterowników naprawią ten problem. Problemów nie ma za to z portami USB, działają bez zarzutu, zarówno wbudowane, jak i te w stacji dokującej. Nie miałem okazji sprawdzić portu eSATA, natomiast porty Ethernet również bez problemu działają, zarówno w sieciach 100, jak i 1000 MBit/s.</p>
<h3>4. Sieć &#8211; WiFi, Ethernet, Bluetooth</h3>
<p>Jeżeli chodzi o wykrycie i działanie sprzętu sieciowego, to po raz kolejny należy pochwalić Intela za sterowniki open source &#8211; wszystko działa od razu po instalacji Ubuntu bez ściągania żadnych dodatkowych sterowników. Wydajność sieci jest bardzo dobra, WiFi (Intel Advanced-N 6200) w trybie N (z routerem 300 Mbit) pozwala osiągnąć transfery dużo lepsze niż po kablu w trybie Fast Ethernet, a sieć kablowa (Realtek Gigabit) działa jeszcze lepiej <img src='http://www.bart-sokol.info/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Bluetooth również od początku jest prawidłowo wykrywany, jednak nie bawiłem się nim na tyle, żeby sprawdzić wszystkie możliwe tryby pracy &#8211; zakładam jednak, że działa bez zarzutu. Problem natomiast pojawia się z samym WiFi &#8211; dość często przy mocniejszym obciążeniu karta bezprzewodowa potrafiła zwiesić cały system. Być może jest on już rozwiązany, gdyż dawno się z nim nie spotkałem, jednak sam fakt jego zaistnienia jest niepokojący. Nie ma za to problemów z łączeniem się z różnymi rodzajami sieci &#8211; zarówno w trybie b, jak i n, zabezpieczonymi WPA-PSK jak i WPA Enterprise, a zasięg i stabilność połączenia są bardziej niż przyzwoite.</p>
<h3>5. Klawisze dodatkowe, touchpad i TrackPoint</h3>
<p>Z dodatkowych klawiszy jak na razie na pewno nie działa wyłącznik mikrofonu, nie sprawdzałem również mapowania niektórych klawiszy z Fn. Natomiast bez problemu działa regulacja głośności i wyciszenie oraz regulacja jasności &#8211; czyli te najważniejsze, nie ma również problemów z klawiszami odtwarzania umieszczonymi &#8222;pod strzałkami&#8221;. Również sam touchpad (swoją drogą wyśmienity) i TrackPoint (również bez zarzutu, jak na ThinkPada przystało) sprawują się znakomicie i nie ma problemów z ich obsługą.</p>
<h3>6. Pozostałe urządzenia</h3>
<p>Czytnik kart SD &#8211; działa bez problemu, nie sprawdzałem z kartami xD i MemoryStick, które ponoć również  obsługuje. Kamerka również nie sprawia problemów, działa ze Skype i innymi programami, a jakość obrazu jest bardzo dobra. Co najbardziej mnie zaskoczyło &#8211; po zainstalowaniu fingerprint-gui udało mi się uruchomić czytnik linii papilarnych, który działa zarówno przy logowaniu, jak i przy potwierdzaniu operacji w trybie roota (sudo &#8211; zarówno przez GUI jak i z linii komend). Stacja dokująca (ThinkPad Mini Dock Series 3) poza wspomnianym wcześniej problemem z portem audio działa również bez problemu &#8211; system reaguje prawidłowo podłączenie i odłączenie, przełącza obraz i montuje podłączone urządzenia tak, jak być powinno.</p>
<h3>7. Praca systemu, uruchamianie i zamykanie, usypianie, hibernacja, bateria</h3>
<p>Uruchamianie systemu w mojej konfiguracji trwa na prawdę krótko, i zwykle nie ma z tym żadnych problemów, podobnie jest z usypianiem i hibernacją. Piszę zwykle, gdyż czasem zdarza się, że system się nie włączy prawidłowo i trzeba go wyłączyć siłą. Na szczęście nie zdarza się to często, więc problem ten nie jest specjalnie uciążliwy. Jeżeli chodzi o baterię (w moim przypadku akumulator SANYO o pojemności nominalnej 56,2 Wh, rzeczywistej przekraczającej 61 Wh) to sprawa ma się bardzo różnie. Nie raz udaje się osiągnąć przebiegi rzędu 4 godzin, jednak zwykle jest to raczej bliżej 3 &#8211; wszystko zależy oczywiście od obciążenia, poziomu podświetlenia i innych parametrów pracy. Można było by się spodziewać nieco dłuższego czasu pracy, jednak biorąc pod uwagę wydajność zainstalowanych komponentów nie ma specjalnych powodów do narzekań. Oczywiście można zainstalować baterię 9-komorową, co powinno zdecydowanie wydłużyć czas pracy na baterii.</p>
<h3>Podsumowanie</h3>
<p>Ogólnie nie ma większych problemów z pracą tego modelu pod Ubuntu 10.10, z nadzieją, że w najnowszej edycji, która ma się ukazać w ciągu najbliższych tygodni, będzie jeszcze lepiej. Zarówno wydajność, jak i wsparcie dla sprzętu jest na bardzo dobrym poziomie, głównie dzięki staraniom niezależnych developerów oraz przyjaznej Linuksowi polityce firm Intel i Lenovo. ThinkPady od początku były jednymi z najlepiej wspieranych laptopów pod Linuksem, i w tej kwestii (na szczęście) niewiele się zmieniło. Zatem mogę śmiało polecić zarówno ten model komputera, jak i instalację na nim Ubuntu (czy innej dystrybucji).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bart-sokol.info/2011/04/thinkpad-l412-i-linux-ale-nie-tylko/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>(Pierwsze poważniejsze) Przygody z Django &#8211; cz.1 &#8211; Dlaczego Django i Aptana to zgrana para</title>
		<link>http://www.bart-sokol.info/2011/04/pierwsze-powazniejsze-przygody-z-django-cz-1-dlaczego-django-i-aptana-to-zgrana-para/</link>
		<comments>http://www.bart-sokol.info/2011/04/pierwsze-powazniejsze-przygody-z-django-cz-1-dlaczego-django-i-aptana-to-zgrana-para/#comments</comments>
		<pubDate>Wed, 06 Apr 2011 08:34:10 +0000</pubDate>
		<dc:creator>Bart Sokol</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Aptana]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[IDE]]></category>

		<guid isPermaLink="false">http://www.bart-sokol.info/?p=39</guid>
		<description><![CDATA[Przez ostatni miesiąc dość dużo czasu spędziłem na nauce frameworka Django. Po ponad 8 latach tworzenia stron w PHP (pierwsze jeszcze w czasach PHP3) stwierdziłem, że pora poszerzyć horyzonty i zobaczyć, dlaczego inne technologie zyskują tak dużą popularność. W przedbiegach z wyścigu odpadł RoR &#8211; głównie ze względu na moją niechęć do samego Rubyego (przecież <a href='http://www.bart-sokol.info/2011/04/pierwsze-powazniejsze-przygody-z-django-cz-1-dlaczego-django-i-aptana-to-zgrana-para/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Przez ostatni miesiąc dość dużo czasu spędziłem na nauce frameworka Django. Po ponad 8 latach tworzenia stron w PHP (pierwsze jeszcze w czasach PHP3) stwierdziłem, że pora poszerzyć horyzonty i zobaczyć, dlaczego inne technologie zyskują tak dużą popularność. W przedbiegach z wyścigu odpadł RoR &#8211; głównie ze względu na moją niechęć do samego Rubyego (przecież Python jest ładniejszy&#8230;). Na placu boju pozostały ASP.NET MVC i Django. I o ile sam C# jako język całkiem mi się podoba, o tyle rozwiązania Microsoftowe ogólnie już nie tak bardzo, nawet mimo tego, iż mógłbym ASP hostować na VPS-ie z Linuksem (poprzez Mono). W związku z tym wybór padł na Django. I tak się zaczyna cała historia&#8230;;-)</p>
<p><span id="more-39"></span></p>
<p>Pierwszy problem przed którym staje programista większości języków &#8211; w czym mam to pisać? Czasy pisania stron w Notatniku już dawno się skończyły (uffff&#8230;), jednak nie zawsze jest jasne co w zamian. Jeżeli chodzi o Django to wybór jest spory (a gdzież nie jest?) &#8211; właściwie każdy edytor /każde IDE/ dla Pythona powinno dać radę. Ale to nie znaczy, że będzie rozwiązaniem odpowiednim. Po eksperymentowaniu z PyCharm (całkiem przyjemnym i funkcjonalnym, ale stosunkowo drogim jak na początki), zacząłem szukać dalej &#8211; NetBeans, którego używam do PHP wsparcie do Pythona i Django ma bardzo nieoficjalne i nie do końca takie, jakiego się spodziewałem po doświadczeniach z wersją PHP; Eric &#8211; dość rozbudowane IDE do Pythona, ale niestety pewne rzeczy nie do końca działały, jak należy; no i pozostał Eclipse&#8230; A jako że Eclipse, to trzeba było zaprząc do tego całą masę pluginów, debugger jakoś podłączyć itp. itd&#8230; Ale na szczęście znalazło się gotowe rozwiązanie &#8211; Aptana Studio 3. Wszystko co należy jest na miejscu &#8211; wsparcie dla Pythona, Django (uruchamianie komend, tworzenie projektu, składnia, kolorowanie szablonów) i cała moc Eclipse. Po zainstalowaniu i wstępnej konfiguracji (czcionki, kolory itp.) można było tworzyć pierwsze projekty. Już jest OK.<br />
Kolejnym krokiem była konfiguracja debuggera, którą postaram się omówić w następnym poście, oraz instalacja tego, czego nie było w Aptanie &#8211; w moim przypadku była to tylko wtyczka MercurialEclipse. Po tych czynnościach voila &#8211; mamy w pełni funkcjonalne środowisko developerskie dla Django. Mamy kolorowanie i podpowiadanie składni oraz całą listę innych niezbędników wydajnego programisty, mamy debuggera, mamy zarządzanie całym projektem (w sensie plikowym) wraz z wsparciem dla kontroli wersji, a to wszystko w całkiem znośnej oprawie <img src='http://www.bart-sokol.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  A co mnie najbardziej zaskoczyło to prędkość działania &#8211; o ile dotychczas Eclipse uważałem za najwolniejsze IDE na świecie, o tyle najnowsza wersja dobrze skonfigurowana i działająca na współczesnym sprzęcie działa bez zarzutu &#8211; prędkością bije VS2010, co kiedyś było nie do pomyślenia <img src='http://www.bart-sokol.info/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>I na tym kończę dzisiejszą historyjkę, następnym razem postaram się coś bardziej przydatnego napisać, a póki co wracam do pracy, Django czeka!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bart-sokol.info/2011/04/pierwsze-powazniejsze-przygody-z-django-cz-1-dlaczego-django-i-aptana-to-zgrana-para/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ThinkPad L412 &#8211; pierwsze wrażenia</title>
		<link>http://www.bart-sokol.info/2010/12/thinkpad-l412-pierwsze-wrazeni/</link>
		<comments>http://www.bart-sokol.info/2010/12/thinkpad-l412-pierwsze-wrazeni/#comments</comments>
		<pubDate>Tue, 28 Dec 2010 20:19:42 +0000</pubDate>
		<dc:creator>Bart Sokol</dc:creator>
				<category><![CDATA[Sprzęt]]></category>
		<category><![CDATA[ThinkPad L412]]></category>

		<guid isPermaLink="false">http://www.bart-sokol.info/?p=33</guid>
		<description><![CDATA[Ponieważ mój dotychczasowy laptop (Lenovo G550) nie do końca spełniał moje wymagania co do wydajności, postanowiłem coś z tym fantem zrobić. Miałem dwie opcje - upgrade dotychczasowego (co było ograniczone ze względu na limit 4 GB RAM i przeciętnej wydajności procesor Pentium T4200) lub zakup nowego. Wybrałem opcję numer dwa.]]></description>
			<content:encoded><![CDATA[<p>Ponieważ mój dotychczasowy laptop (Lenovo G550) nie do końca spełniał moje wymagania co do wydajności, postanowiłem coś z tym fantem zrobić. Miałem dwie opcje &#8211; upgrade dotychczasowego (co było ograniczone ze względu na limit 4 GB RAM i przeciętnej wydajności procesor Pentium T4200) lub zakup nowego. Wybrałem opcję numer dwa.<br />
<span id="more-33"></span> Trochę czasu zajęło mi znalezienie odpowiedniego kandydata &#8211; zależało mi zarówno na wydajności, jak i na mobilności i wygodzie obsługi. Poszukiwania ograniczyłem do modeli 13 i 14 calowych, co okazało się nie lada wyzwaniem w naszym kraju. O ile 13-calówek jeszcze kilka można znaleźć (choć większość albo mało wydajna albo mało mobilna jak na 13&#8243;), to 14-calówki okazały się praktycznie nieobecne na naszym rynku (chociażby zabrakło całej gamy modeli Della &#8211; Vostro 3400, Studio 14 itp. &#8211; jest tylko Latitude w dość wygórowanych cenach). Właściwie tylko jedna firma oferuje u nas dość szeroką gamę modeli 14-calowych &#8211; i jest to oczywiście Lenovo, która wręcz słynie z modeli biznesowych z ekranem 14&#8243;. Chwila zastanowienia, określenie budżetu i wybór został ograniczony do dwóch modeli z serii ThinkPad &#8211; Edge 14 i L412. Ze względu na dostępność lepszej konfiguracji w połączeniu z kartą Intela (lepsza współpraca z Linuksem) oraz kilka dodatkowych zalet (złącze dock&#8217;a, większa liczba dostępnych akcesoriów oraz klasyczny wygląd) wybór padł na L412.<br />
Kolejna chwila zastanowienia nad wyborem konfiguracji i ThinkPad L412 był już w drodze. Sprzęt dotarł do mnie tuż przed świętami i zawierał:</p>
<ul>
<li>ThinkPad L412</li>
<li>Zasilacz 65W kompaktowych rozmiarów</li>
<li>Baterię 6-cell 57Wh, Krótką instrukcję, odrobinę kartonów, folii i na tym koniec</li>
</ul>
<p>Zestaw podstawowy, bez żadnych fajerwerków, gdyż te miały się kryć w środku czarnego pudełka z solidnego, choć nie do końca odpornego na palcowanie plastiku. Jego wnętrze kryło bowiem procesor Intel Core i5 460M o całkiem solidnej wydajności i zintegrowanej grafice, 2GB pamięci RAM DDR3 (a to dopiero początek) oraz dysk Seagate Momentus 7200.4 o pojemności 320GB, ponadto super wygodną klawiaturę, touchpad + TrackPoint, czytnik lini papilarnych i kilka innych bajerów. Jakiś niedosyt? Oczywiście! Chwilę później w środku wylądowały dwie kości GoodRAM DDR3 1333 o pojemności 4GB każda (dając w sumie 8GB pamięci operacyjnej co łatwo obliczyć) oraz hybrydowy dysk Seagate Momentus XT 500GB z 32MB cache i 4GB buforem flash. Oczka się zaświeciły? Mi i owszem, w momencie gdy dostarczony z laptopem Windows 7 Professional nie chciał wystartować na nowym dysku. Wujek Google wskazał, że problem w braku kompatybilności dysku z resztą sprzętu. Rozwiązanie? Upgrade firmware dysku i oprogramowania Lenovo i wszystko ruszyło.<br />
I to jak ruszyło! O ile syntetyczne testy nie pokazują aż tak drastycznej różnicy w stosunku do poprzedniego sprzętu, o tyle odczuwalna prędkość działania całości jest niesamowita. Wszystko działa tak jak powinno, bez zbędnego oczekiwania, bez zastanawiania się, bez opóźnień. A o to przecież chodzi zabieganemu człowiekowi, żeby po prostu pracować, a nie czekać na to, aż komputer znajdzie dla niego czas <img src='http://www.bart-sokol.info/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /><br />
Jeżeli chodzi o pierwsze wrażenia to na tym poprzestanę &#8211; ciąg dalszy opowieści wkrótce &#8211; w planach opis współpracy L412 z Linuksem i być może inne równie nudne posty <img src='http://www.bart-sokol.info/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.bart-sokol.info/2010/12/thinkpad-l412-pierwsze-wrazeni/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rabaty kaskadowe i ich wyliczanie</title>
		<link>http://www.bart-sokol.info/2010/05/rabaty-kaskadowe-i-ich-wyliczanie/</link>
		<comments>http://www.bart-sokol.info/2010/05/rabaty-kaskadowe-i-ich-wyliczanie/#comments</comments>
		<pubDate>Mon, 17 May 2010 07:33:19 +0000</pubDate>
		<dc:creator>Bart Sokol</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[matematyka]]></category>
		<category><![CDATA[rabat kaskadowy]]></category>

		<guid isPermaLink="false">http://www.bart-sokol.info/?p=16</guid>
		<description><![CDATA[Ostatnio poszukiwałem magicznego wzoru na wyliczenie procentu rabatu przy kaskadowym naliczaniu kolejnych rabatów jednostkowych. Jednak tym razem wujek Google nie był zbyt pomocny, po kilku stronach się poddałem i postanowiłem skorzystać z pomocy królowej nauk &#8211; matematyki. W ten oto sposób otrzymałem prosty wzór na wyliczenie końcowego rabatu bez względu na liczbę kolejnych naliczanych rabatów. <a href='http://www.bart-sokol.info/2010/05/rabaty-kaskadowe-i-ich-wyliczanie/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Ostatnio poszukiwałem magicznego wzoru na wyliczenie procentu rabatu przy kaskadowym naliczaniu kolejnych rabatów jednostkowych. Jednak tym razem wujek Google nie był zbyt pomocny, po kilku stronach się poddałem i postanowiłem skorzystać z pomocy królowej nauk &#8211; matematyki. W ten oto sposób otrzymałem prosty wzór na wyliczenie końcowego rabatu bez względu na liczbę kolejnych naliczanych rabatów. Oto i on:</p>
<p><img src="http://www.bart-sokol.info/wp-content/plugins/wpmathpub/phpmathpublisher/img/math_979_9445664f89715b0974e87f533308978a.png" style="vertical-align:-21px; display: inline-block ;" alt="R_k = 100-{(100-R_1)*...*(100-R_n)}/{100^{n-1}}" title="R_k = 100-{(100-R_1)*...*(100-R_n)}/{100^{n-1}}"/></p>
<p><strong>Legenda:</strong><br />
<strong>R<sub>k</sub></strong> : końcowy procent rabatu wyliczony kaskadowo<br />
<strong>R<sub>1</sub> &#8230; R<sub>n</sub></strong> : kolejne rabaty do wyliczenia</p>
<p>Dla niezorientowanych: kaskadowy sposób naliczania rabatów polega na tym, że każdy kolejny rabat liczony jest od ceny umniejszonej o dotychczas naliczone rabaty. Dzięki temu sprzedawca zyskuje nawet kilka cennych procent ze swojej wyjściowej ceny <img src='http://www.bart-sokol.info/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Mam nadzieję, że wzór przyda się tej mniej matematycznie myślącej części społeczeństwa (większości?), choć oczywiście zachęcam do samodzielnego wysilenia szarych komórek.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bart-sokol.info/2010/05/rabaty-kaskadowe-i-ich-wyliczanie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>There&#8217;s absolutely no bubble in technology</title>
		<link>http://www.bart-sokol.info/2010/03/theres-absolutely-no-bubble-in-technology/</link>
		<comments>http://www.bart-sokol.info/2010/03/theres-absolutely-no-bubble-in-technology/#comments</comments>
		<pubDate>Sat, 06 Mar 2010 18:15:44 +0000</pubDate>
		<dc:creator>Bart Sokol</dc:creator>
				<category><![CDATA[Misc]]></category>
		<category><![CDATA[fun]]></category>
		<category><![CDATA[motivation]]></category>
		<category><![CDATA[technology]]></category>
		<category><![CDATA[Web 2.0]]></category>

		<guid isPermaLink="false">http://www.bart-sokol.info/?p=8</guid>
		<description><![CDATA[Or is it?]]></description>
			<content:encoded><![CDATA[<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/I6IQ_FOCE6I&#038;hl=pl_PL&#038;fs=1&#038;color1=0x333333&#038;color2=0xcccccc"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/I6IQ_FOCE6I&#038;hl=pl_PL&#038;fs=1&#038;color1=0x333333&#038;color2=0xcccccc" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>
<p>Or is it?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bart-sokol.info/2010/03/theres-absolutely-no-bubble-in-technology/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

