• Tutaj nie jadam: North Fish Szczecin

    Przy okazji wizyty w jednym z szczecińskich centrów handlowych poczułem głód. No cóż, zdarza się, człowiek jeść coś musi. Żona też poczuła głód, więc postanowiliśmy spożyć szybki obiad, nie koniecznie w typowym fastfoodzie. Ryba podobno jest zdrowa i w ogóle, więc czemu nie. Akurat pod ręką było stoisko North Fish, czyli taki fastfood z rybami. Czemu nie. Żona wybrała coś (nie istotne dla dalszej części opowieści), mnie skusiło spaghetti z owocami morza. Spaghetti lubię, owoce morza też lubię, więc połączenie wydawało się idealne.

    Zostaliśmy uczciwie poinformowani, że musimy poczekać. Żona na swoje około 5 minut, ja trochę dłużej, bo 15. OK, niech będzie, dam radę. Jak można było się domyśleć, nie czekaliśmy tyle ile powinniśmy. Żona czekała około 12-15 minut, ja musiałem czekać około 25 minut. W tym czasie poczułem się już solidnie głodny, a widok odżywiającej się żony jakoś nie działał kojąco na moje myśli.

    Wreszcie jest! Super! Aluminiowy pojemniczek pełen spaghetti na tacce. Pokrywka zdjęta, widelec wbity, porcja nabrana, jest OK. Może trochę za zimne, ale OK. Druga porcja nabita i już czuję, że coś tu nie gra. Spaghetti ze środka tacki było zimne, w zasadzie ledwo co rozmrożone. Byłem tak głodny, że chciałem zjeść i nie marudzić, ale żona się uparła i zwróciliśmy porcję. Za 15 minut miałem otrzymać kolejną.

    Minęło 15 minut. "Jeszcze chwila". Kolejne 5 minut i jest. Tym razem zakrywający kartonik aż przypalony. Otwieram, porcja ze środka tacki i ..... zimne. W tym momencie nerwy mi puściły. "Kierownik" lokalu był w stanie powiedzieć tylko "(...) zrobione zgodnie z procedurami (...)". Szczerze? Mam gdzieś procedury i miejsca w których przestrzeganie tych procedur prowadzi bubla. Skończyło się na tym, że po rzuceniu kilku epitetów i odmowie zwrotu pieniędzy (to znaczy ja nie chciałem przyjąć) poszedłem kupić coś innego. Tym razem mniej "zdrowego", lecz podanego błyskawiczne. Na szczęście żona wykazała się sporą dozą zdrowego rozsądku i przyjęła zwrot pieniędzy w moim imieniu. Tyle dobrego.

    Jak skończyła się sprawa? Nijak. Z całą pewnością więcej do North Fish w celach konsumpcyjnych nie pójdę. Być może, z czystej ciekawości i nagłej potrzeby trolowania jeszcze raz zamówię spaghetti z owocami morza. Może dopracują procedurę. A może ktoś ją przeczyta ze zrozumieniem. Może tym razem będzie ciepłe. Może...

  • CyanogenMod, czyli jednak można zrobić coś porządnie

    Od pół roku mam nowy smartfon. LG P970 aka Swift Black. Jak na dzisiejsze standardy nie jest to demon wydajności, ale za przysłowiową złotówkę + VAT nie można zbyt dużo wymagać. U mnie się sprawdzał. No prawie....

    Po pierwsze, stary Android. W oryginalnym romie 2.2 i tyle. Niby LG wydało 2.3 ale o OTA w Orange jakoś nikt nie pomyślał. Koniec końców po miesiącu był już root i wgrywany oficjalny/nieoficjalny rom od LG. Lecz na tym koniec, bo ICS niby tak, może pod koniec roku, a może nie...

    Po drugie, śmieciowy soft. Na prawdę nie rozumiem, że do brandowanych romów producenci muszą dodawać aż tyle zbędnego oprogramowania? A co jak nie chcę mieć "Facebook for LG" (czy jak to się tam  nazywało) a normalnego klienta FB? Bez roota nie wywalę nawet tego anachronizmu. Root niby naprawia sytuację, bo można wszystko odinstalować, ale to nie do końca to o co mi chodziło. A ile się człowiek namęczył z odinstalowywaniem to już jego.

    W połowie czerwca pojawił się oficjalny CyanogenMod 7.2 (Android 2.3.7) dla p970, więc postanowiłem spróbować. Root już był, recovery też było, więc sam instalacja poszła dość sprawnie. Trochę zabawy było z dograniem aplikacji google, ale dało się bez większych przeszkód (jak się wie, że trzeba dograć, to przeszkód nie ma prawie wcale). Po tygodniu używania stwierdzam: jak się chce, to można!

    Ni z tego ni z owego telefon dostał wyraźniego kopa. Nie gram, nie robię benchmarków, ale sama responsywność wzrosła zauważalnie. Jakby tego było mało, bateria starcza na dłużej. Cuda Panie, cuda...

    Bardziej jednak zdziwiło mnie coś innego. Na poprzednim romie (oficjalnym) wielkość wolnej pamięci oscylowała w okolicy 40MB. No, może przez kilka minut po resecie było jej trochę więcej. System regularnie usypiał aplikacje i ich przywracanie prawie zawsze trochę trwało. Na nowym romie (CyanogenMod) wielkość wolnej pamięci oscyluje w okolicach 100MB, a usypianie używanych aplikacji, choć zdarza się w dalszym ciągu, zdarza się wyraźnie rzadziej.

    Czyli co? Można? Można... Tylko trzeba chcieć, a założenia biznesowe nie zawsze muszą mieć najwyższy priorytet!

  • Projekt Wallbook

    Przeglądając najdalsze katalogi dysku twardego znalazłem zdjęcia projektu którego chyba nigdy tutaj nie pokazywałem: Wallbook. W wielkim skrócie: gdzieś w okolicy roku 2006 (być może był to 2007) wpadłem na pomysł skonstruowania ramki na zdjęcia, a być może coś więcej, przy wykorzystaniu starego i bardzo taniego laptopa. Jak starego i jak taniego? Takiego poniżej 100zł, więc na prawdę musiał być stary i tani. Nie będę nikogo męczył opisem, niech wystarczy seria zdjęć:

    100_0480

    100_0478

    100_0484

    100_0485

    100_0538

    Projekt Wallbook DIY

    100_0546

    Photo-0040

    Photo-0031

    Photo-0010

    100_0483

    100_0482

    Jak widać, to nawet działało. Niestety niezbyt długo: mechaniczne uszkodzenie płyty głównej. W efekcie całość poszła do śmieci.

  • Szybki kurs Twitter Bootstrap, lekcja numer 5

    W dzisiejszym odcinku 2 nowe elementy naszej strony:

    • belka górna z formularzem logowania,
    • paginator na dole strony.
    Belkę umieszczamy przed główną sekcją <div class="container"> w sposób następujący:
    <div class="navbar navbar-fixed-top">
      <div class="navbar-inner">
       <div class="container">
    	<a class="brand" href="">Twitter Bootstrap</a>
        <form class="navbar-form pull-right">
         <input type="text" name="login" class="input-medium" placeholder="email" />
    	 <input type="password" name="password" class="input-medium" placeholder="hasło" />
         <button type="submit" class="btn btn-primary">Zaloguj</button>
    	</form>
       </div>
      </div>
     </div>

    Sprawę formularzy i przycisków na razie tylko sygnalizuję, więcej na ten temat za jakiś czas.

    Paginację umieszczamy jako osobny wiersz siatki:

    <div class="row">
       <div class="span12">
        <div class="pagination pull-right">
         <ul>
          <li><a href="#">&laquo;</a></li>
          <li><a href="#">1</a></li>
          <li class="active"><a href="#">2</a></li>
          <li><a href="#">3</a></li>
          <li><a href="#">4</a></li>
          <li><a href="#">&raquo;</a></li>
         </ul>
        </div>
       </div>
      </div>

    W efekcie uzyskamy coś takiego:

    Cały plik z tą częścią kursu można pobrać tutaj.

  • Szybki kurs Twitter Bootstrap, lekcja numer 4

    Szybki kurs Twitter Bootstrap przyspiesza. W dzisiejszym odcinku dodamy do naszej strony stopkę z dwoma kolumnami (<footer>), a lewą kolumnę otoczymy ramką (klasa CSS well). To będzie nasze menu nawigacyjne.

    <!DOCTYPE html>
    <html lang="pl">
    <head>
    <meta charset="utf-8">
    <title>Twitter Bootstrap Tutorial Lesson 3</title>
    <link href="bootstrap/css/bootstrap.css" rel="stylesheet" />
    </head>
    <body>
     <div class="container">
      <header>
       <h1>Tytuł strony</h1>
       <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed
       do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
       enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
       ut aliquip ex ea commodo consequat.</p>
      </header>
      <div class="row">
       <div class="span3">
       <div class="well">
        <h2>Kolumna lewa</h2>
        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit,
        sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
        Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris
        nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in
        reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
        pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
        culpa qui officia deserunt mollit anim id est laborum.</p>
        </div>
       </div>
       <div class="span9">
        <h2>Kolumna prawa</h2>
        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit,
        sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
        Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris
        nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in
        reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
        pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
        culpa qui officia deserunt mollit anim id est laborum.</p>
       </div>
      </div>
      <hr />
      <footer>
       <div class="row">
        <div class="span6">
    	 <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed
         do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
         enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
         ut aliquip ex ea commodo consequat.</p>
    	</div>
    	<div class="span6">
    	 <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed
         do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
         enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
         ut aliquip ex ea commodo consequat.</p>
    	</div>
       </div>
      </footer>
     </div>
     <script type="text/javascript" src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
     <script src="bootstrap/js/bootstrap.js"></script>
    </body>
    </html>

    Zauważcie, że szerokość prawej kolumny została zmniejszona z 9 do 8 jednostek (span9 -> span8). Jest to efektem dodania ramki (well) do lewej kolumny. Dodatkowe ozdobniki zajęły jedną jednostkę szerokości. Efekt naszej pracy powinien wyglądać mniej więcej tak:

    Niby mało, ale zauważcie jak mało kodu HTML/CSS trzeba było do tej pory napisać. Tyle co kot napłakał.

  • Szybki kurs Twitter Bootstrap, lekcja numer 3

    Tytuł strony już mamy. Czas dołożyć wiersz (div z klasą row) z dwoma kolumnami o szerokości 3 (span3) i 9 jednostek (span9).

    <!DOCTYPE html>
    <html lang="pl">
    <head>
    <meta charset="utf-8">
    <title>Twitter Bootstrap Tutorial Lesson 3</title>
    <link href="bootstrap/css/bootstrap.css" rel="stylesheet" />
    </head>
    <body>
     <div class="container">
      <header>
       <h1>Tytuł strony</h1>
        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed
         do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
         enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
         ut aliquip ex ea commodo consequat. Duis aute irure dolor in
         reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
         pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
         culpa qui officia deserunt mollit anim id est laborum.</p>
      </header>
    
      <div class="row">
       <div class="span3">
        <h2>Kolumna lewa</h2>
         <p>"Lorem ipsum dolor sit amet, consectetur adipisicing elit,
          sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
          Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris
          nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in
          reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
          pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
          culpa qui officia deserunt mollit anim id est laborum.</p>
        </div>
        <div class="span9">
         <h2>Kolumna prawa</h2>
          <p>"Lorem ipsum dolor sit amet, consectetur adipisicing elit,
           sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
           Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris
           nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in
           reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
           pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
           culpa qui officia deserunt mollit anim id est laborum.</p>
        </div>
       </div>
      </div>
    
      <script type="text/javascript"
       src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
      <script src="bootstrap/js/bootstrap.js"></script>
    </body>
    </html>
  • Pulsar Online: worklog

    Od ostatniego wpisu na temat Pulsar Online minęło sporo czasu. Około 10 miesięcy. Przez ten czas projekt po kolei:

    1. został upubliczniony,
    2. rozwijał się,
    3. przeżył fazę stagnacji,
    4. został zarzucony
    A teraz znów nad nim pracuję. Taka to już kolej rzeczy z Pulsarem. Po solidnym odpoczynku od projektu po raz kolejny poczułem zew programowania. Tym razem, zamiast rozwijać nowe funkcjonalności postanowiłem skoncentrować się na dopracowaniu istniejących i poprawieniu części irytujących braków. Na pierwszy ogień poszedł poprawiony interface użytkownika wykonany przy pomocy toolkitu Twitter Bootstrap. Prezentuje on się mniej więcej tak:

    [gallery link="file" columns="2" orderby="ID"]

  • Szybki kurs Twitter Bootstrap, lekcja numer 2

    Wczoraj było o instalacji Bootstrap, dziś do naszej strony dodamy głównego diva z zawartością i nagłówek. Główny div wykorzystuje klasę CSS 'container', a nagłówek jest zawarty w tagu <header> (nie mylić z <head>).

    <!DOCTYPE html>
    <html lang="pl">
    <head>
    <meta charset="utf-8">
    <title>Twitter Bootstrap Tutorial Lesson 1</title>
    <link href="bootstrap/css/bootstrap.css" rel="stylesheet" />
    </head>
    <body>
    	<div class="container">
    		<header>
    			<h1>Tytuł strony</h1>
    			<p>I jakiś tekst poniżej</p>
    		</header>
    	</div>
    
    	<script type="text/javascript"
    		src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
    	<script src="bootstrap/js/bootstrap.js"></script>
    </body>
    </html>
  • Szybki kurs Twitter Bootstrap, lekcja numer 1

    Twitter Bootstrap. W wielkim skrócie: framework/toolkit HTML5/CSS/JS napisany przez ludzi z Twittera służący co prostego tworzenia estetycznych i funkcjonalnych interfaceów użytkownika. Tyle. Temat można drążyć długo i namiętnie, ja do tej dyskusji nie będę się dołączał i zamiast dywagacji i opisów możliwości skoncentruję się na szybkim kursie korzystania z Twitter Bootstrap.

    Lekcja numer 1: Instalacja

  • Friendcaster for Facebook

    Co jest nie halo z oficjalnym klientem Facebooka na Androida? Poza tym, że moim zdaniem nie działa, to nic. Absolutnie nic. Tylko naprawdę szkoda, że nie działa. Uruchamiam i czekam. Czekam 30 sekund, minutę. Czasami dłużej i pojawia się feed. Po drodze jeszcze telefon próbuje złapać fixa GPS, co oczywiście mu się nie udaje jeśli akurat nie jestem na zewnątrz. A zwykle nie jestem. Później wychodzę z aplikacji, po kilku minutach ponownie uruchamiam i co? Cały proces zaczyna się od nowa. Nawet jeśli w feedzie nic się nie zmieniło. Masakra...

    Aż do wczoraj myślałem, że tak ma być. Na szczęście, okazało się, że się myliłem. Okazało się, że jest Friendcaster for Facebook. Nagle okazało się, że można wyświetlić feed bez tego całego czekania. Okazało się, że klient Facebooka na Androida może działać szybko i sprawnie. Cuda jakieś... Panie Zukerberg, może warto jednak strzelić bacikiem nad głowami programistów i wypuścić coś co działa?

    [gallery link="file" columns="2" orderby="ID"]