TheSingularity.pl http://thesingularity.pl/blog Łobuz bloguje o technologii Sun, 08 Apr 2012 17:24:14 +0000 en hourly 1 http://wordpress.org/?v=3.1.3 Responsibility http://thesingularity.pl/blog/2012/responsibility/ http://thesingularity.pl/blog/2012/responsibility/#comments Sun, 08 Apr 2012 17:22:22 +0000 qertoip http://thesingularity.pl/blog/?p=6461 Continue reading ]]> After it was revealed he cheated on his wife, Arnold Schwarzenegger said:

“After leaving the governor’s office I told my wife about this event, which occurred over a decade ago. I understand and deserve the feelings of anger and disappointment among my friends and family. There are no excuses and I take full responsibility for the hurt I have caused. I have apologized to Maria, my children and my family. I am truly sorry.”

I really like that guy. Not for cheating on wife of course but for taking full responsibility and making no excuses. Personal responsibility is exactly what I expect from any leader and in fact any person. Taking full responsibility for all your actions and your fate is the only way to go.

And Bill Clinton is a pussy.

]]>
http://thesingularity.pl/blog/2012/responsibility/feed/ 0
Izolacja transakcji w aplikacjach Ruby on Rails http://thesingularity.pl/blog/2012/izolacja-transakcji-w-aplikacjach-ruby-on-rails/ http://thesingularity.pl/blog/2012/izolacja-transakcji-w-aplikacjach-ruby-on-rails/#comments Tue, 20 Mar 2012 23:21:31 +0000 qertoip http://thesingularity.pl/blog/?p=6411 Continue reading ]]> Na WRUG-u miałem przyjemność opowiedzieć o izolacji transakcji w ogóle oraz konkretnie w Railsach.

Zareklamowałem też dwa gemy mojej produkcji: transaction_isolation pozwala wygodnie manipulować poziomem izolacji transakcji. Gem jest dosłownie bezkonkurencyjny. Tzn. żadne inne dla ActiveRecorda nie istnieją.

Natomiast transaction_retry auto-ponawia transakcje, które zakończyły się błędem typu deadlock lub serialization error. Ten ma silną konkurencję w postaci starego deadlock_retry, ale nie pisałbym go gdyby nie miał być lepszy ;-)

Słowa kluczowe: serializable, repeatable read, read committed, read uncommitted, transaction isolation levels, deadlock found when trying to get lock, serialization error, ActiveRecord, gem.

]]>
http://thesingularity.pl/blog/2012/izolacja-transakcji-w-aplikacjach-ruby-on-rails/feed/ 0
DataMapper 2 – nie mogę się doczekać http://thesingularity.pl/blog/2012/datamapper-2-nie-moge-sie-doczekac/ http://thesingularity.pl/blog/2012/datamapper-2-nie-moge-sie-doczekac/#comments Thu, 15 Mar 2012 23:36:59 +0000 qertoip http://thesingularity.pl/blog/?p=6371 Jest późno w nocy i nie mam czasu uzasadniać – po prostu zaufaj mi i przeczytaj o DataMapper 2 na blogu Piotrka Solnicy: http://solnic.eu/2012/01/10/ruby-datamapper-status.html.

]]>
http://thesingularity.pl/blog/2012/datamapper-2-nie-moge-sie-doczekac/feed/ 0
Dekorator w Ruby http://thesingularity.pl/blog/2012/dekorator-w-ruby/ http://thesingularity.pl/blog/2012/dekorator-w-ruby/#comments Mon, 12 Mar 2012 16:29:11 +0000 qertoip http://thesingularity.pl/blog/?p=6291 Continue reading ]]> Dekorator przyjmuje w konstruktorze obiekt i dodaje do niego nowe zachowania. Przykładem dekoratora jest Presenter – klasa dodająca do obiektu możliwość zaprezentowania się, np. w postaci sformatowanego Stringa, XML-a czy JSON-a. Na wroc_lover.rb Piotr Szotkowski pokazał bardzo fajny sposób tworzenia dekoratorów z użyciem SimpleDelegator. Zysk polega na uniknięciu boilerplate kodu – wszystkie metody dostępne na wejściowym obiekcie stają się dostępne bezpośrednio w dekoratorze.

require 'delegate'

class Address
  # extend with your favourite persistence solution or:
  attr_accessor :street, :postcode, :city, :country

  def initialize args = {}
    args.each { |key, value| send "#{key}=", value }
  end
end

class PolishAddress < SimpleDelegator
  def initialize address
    super address
  end

  def formatted
    [street, "#{postcode} #{city}", country].join "\n"
  end
end

Czyli mamy i ładnie (SRP), i zwięźle (no boilerplate code). Jeśli natomiast potrzebujemy Presentera bazującego na więcej niż jednym obiekcie, z pomocą przyjdzie mixin Forwardable, również z stdlib:

require 'forwardable'

class PolishEnvelopeAddress
  extend Forwardable

  def initialize args
    @person  = args.fetch :person,  Person.new
    @address = args.fetch :address, Address.new
  end

  def_delegators :@person,  :given_names, :surname
  def_delegators :@address, :street, :postcode, :city, :country

  def formatted
    ["Sz.P. #{given_names} #{surname}",
      street, "#{postcode} #{city}", country].join "\n"
  end
end
]]>
http://thesingularity.pl/blog/2012/dekorator-w-ruby/feed/ 8
Do zobaczenia na wroc_love.rb! http://thesingularity.pl/blog/2012/do-zobaczenia-na-wroc_love-rb/ http://thesingularity.pl/blog/2012/do-zobaczenia-na-wroc_love-rb/#comments Thu, 08 Mar 2012 20:40:37 +0000 qertoip http://thesingularity.pl/blog/?p=6221 Continue reading ]]> Moi wierni czytelnicy (łudzę się, że są tacy ;)) – do zobaczenia na wroc_love.rb!

Patrząc po prezentacjach, konferencja zapowiada się na taki Ruby OO summit i świetnie wpisuje się w ostatnie trendy w railsowym świecie. Żyliśmy The Rails Way przez wiele lat i dojrzeliśmy do następnego etapu ewolucji – The Right Way.

Cóż to jest The Right Way? To stosowanie najlepszych praktyk, nawet wtedy gdy  kłóci się to z The Rails Way / The Golden Path ;-). Jakież to praktyki? Ano na przykład:

  • Single-Responsibility-Principle na czele z oddzieleniem logiki biznesowej od persystencji (asta la vista fat models)
  • Izolacja od frameworków (Railsy nie są Twoją aplikacją)
  • Architektura sterowana przypadkami użycia (przykład)
  • Security-by-default
  • …itd

See U!

]]>
http://thesingularity.pl/blog/2012/do-zobaczenia-na-wroc_love-rb/feed/ 2
Uncle Bob: decouple your app from Rails http://thesingularity.pl/blog/2012/uncle-bob-decouple-your-app-from-rails/ http://thesingularity.pl/blog/2012/uncle-bob-decouple-your-app-from-rails/#comments Sun, 26 Feb 2012 13:35:02 +0000 qertoip http://thesingularity.pl/blog/?p=6171 Continue reading ]]> Robert C. Martin in his famous keynote “Architecture: The Lost Years” says we, the proud Rails programmers, are doing it wrong. Uncle Bobs urges us to decouple our applications from frameworks. And Rails is no exception. According to Uncle Bob, we should build upon frameworks, but isolate from them.

I mean, really? Why should I? Is it even possible?

The expected benefits are profound.

But at what cost? How much overhead and boilerplate code do we need to achieve that? How can I decouple from ActiveRecord? I love the convenience and white magic ActiveRecord and Rails stack is giving to me!

I’m in the process of developing an experimental application which tries to answer those questions. The initial findings are very encouraging!

]]>
http://thesingularity.pl/blog/2012/uncle-bob-decouple-your-app-from-rails/feed/ 0
Default transaction isolation level comparison in MySQL, PostgreSQL, Oracle and MS SQL Server http://thesingularity.pl/blog/2012/default-transaction-isolation-level-comparison-in-mysql-postgresql-oracle-and-ms-sql-server/ http://thesingularity.pl/blog/2012/default-transaction-isolation-level-comparison-in-mysql-postgresql-oracle-and-ms-sql-server/#comments Sat, 04 Feb 2012 17:02:06 +0000 qertoip http://thesingularity.pl/blog/?p=6131 Continue reading ]]> When building software you should understand what level of transaction isolation your RDBMS guarantees. Do you? I meen, how much of the “I” in the ACID we have? Here are the default transaction isolation levels in a popular relational database management systems:

RDBMS Default transaction isolation level
ANSI SQL Standard Serializable
SQLite Serializable
MySQL Repeatable Read
PostgreSQL Read Committed
Oracle Read Committed
MS SQL Server Read Committed

If you are unsure what that means, Wikipedia has a nice explaination.

]]>
http://thesingularity.pl/blog/2012/default-transaction-isolation-level-comparison-in-mysql-postgresql-oracle-and-ms-sql-server/feed/ 4
Opis stosu Racka w Rails 3.2 http://thesingularity.pl/blog/2012/rails-3-2-stos-rack-middlewares/ http://thesingularity.pl/blog/2012/rails-3-2-stos-rack-middlewares/#comments Sat, 21 Jan 2012 16:03:36 +0000 qertoip http://thesingularity.pl/blog/?p=5941 Continue reading ]]> Właśnie wyszły stabilne Railsy 3.2. Przy tej okazji przyjrzałem się stosowi Racka.

Za co odpowiedzialne są poszczególne middleware’y?

Stos Rails 3.2 wygląda następująco (kolejność od najwcześniej do najpóźniej uruchamianych middleware’ów, jak przy rake middleware):


# Serwuje statyczne pliki
use ActionDispatch::Static

# Synchronizuje obsługę żądania na muteksie
use Rack::Lock

# Instancjuje backend cache'a (LocalStore.new)
use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x00000002964ba8>

# Mierzy czas żądania i dokleja nagłówek X-Runtime
use Rack::Runtime

# Nadpisuje prawdziwą methodę HTTP parametrem _method
# lub nagłówkiem HTTP X_HTTP_METHOD_OVERRIDE
use Rack::MethodOverride

# Loguje pierwszą wzmiankę o żądaniu, np.:
# Started GET "/dupa" for 127.0.0.1 at 2012-01-21 12:18:28 +0100
use Rails::Rack::Logger

# Przekazuje nagłówek X-Request-Id z żądania do odpowiedzi aby umożliwić
# śledzenie żądania przez stos firewalli, load balancerów, serwerów itp.
use ActionDispatch::RequestId

# Łapie wszelkie wyjątki aplikacji.
# Robi rescue Exception, a więc także SyntaxError, NoMemoryError itd.
# Dla żądań zdalnych renderuje statyczne strony błędów (np. public/500.html).
use ActionDispatch::ShowExceptions

# Łapie wszelkie wyjątki aplikacji.
# Robi rescue Exception, a więc także SyntaxError, NoMemoryError itd.
# Dla żądań lokalnych renderuje deweloperski stack trace.
# Dla żądań zdalnych propaguje wyjątek w górę stosu czyli w praktyce do
# ActionDispatch::ShowExceptions.
use ActionDispatch::DebugExceptions

# Usiłuje ustalić oryginalne IP klienta odsiewając lokalne i zdalne proxy
use ActionDispatch::RemoteIp

# Ustawia nagłówek odpowiedzi X-Sendfile w przypadku serwowania
# statycznego pliku aby przerzucić pracę na serwer, który zrobi
# to wydajniej niż Ruby (o ile jest do tego skonfigurowany).
use Rack::Sendfile

# Odpowiada za reloading kodu w trybie deweloperskim.
use ActionDispatch::Reloader

# Woła callbacki before, after i around akcji kontrolera
use ActionDispatch::Callbacks

# Zwraca połączenie do puli jeśli pojawi się wyjątek
# (o ile request nie pochodzi z testów integracyjnych)
use ActiveRecord::ConnectionAdapters::ConnectionManagement

# Klasyczny cache zapytaniowy. Kluczem są Stringi z ostatecznymi
# zapytaniami SQL.
use ActiveRecord::QueryCache

# Renderuje ciastka ustawione w kontrolerze do nagłówków HTTP
# Robi to z pomocą Rack::Utils
use ActionDispatch::Cookies

# Zapisuje dane sesji do skonfigurowanego backendu, np. do ciastka
use ActionDispatch::Session::CookieStore

# Usuwa wiadomość flash po użyciu
use ActionDispatch::Flash

# Buduje Hasha params zgodnie z railsowymi konwencjami
# przekazywania parametrów
use ActionDispatch::ParamsParser

# Usuwa body dla żądań metodą HEAD
use ActionDispatch::Head

# Porównuje nagłówki ETag (żądania z odpowiedzią) oraz Last-Modified
# dążąc do zwrócenia 304 Not Modified i wyzerowania body
use Rack::ConditionalGet

# Oblicza i dokleja nagłówek ETag odpowiedzi
use Rack::ETag

# Dodaje nagłówek X-UA-Compatible do odpowiedzi w zależności od opcji
# config.action_dispatch.best_standards_support za pomocą której
# można wymusić tryb quirks lub strict dla IE.
use ActionDispatch::BestStandardsSupport
]]>
http://thesingularity.pl/blog/2012/rails-3-2-stos-rack-middlewares/feed/ 7
Software Craftsmanship http://thesingularity.pl/blog/2012/software-craftsmanship/ http://thesingularity.pl/blog/2012/software-craftsmanship/#comments Fri, 20 Jan 2012 22:48:51 +0000 qertoip http://thesingularity.pl/blog/?p=5911 Załączam prezentację “Software Craftsmanship – od studenta do profesjonalisty”, którą wygłosiłem na Wydziale Elektroniki i Technik Informacyjnych Politechniki Warszawskiej 19 stycznia 2012:

Prezentacja: https://github.com/downloads/qertoip/Prezentacja-Software-Craftsmanship/software_craftsmanship.html

Źródła: https://github.com/qertoip/Prezentacja-Software-Craftsmanship

 

]]>
http://thesingularity.pl/blog/2012/software-craftsmanship/feed/ 0
[Solved] Nano copy paste http://thesingularity.pl/blog/2011/solved-nano-copy-paste/ http://thesingularity.pl/blog/2011/solved-nano-copy-paste/#comments Fri, 30 Dec 2011 10:14:30 +0000 qertoip http://thesingularity.pl/blog/?p=5811 Continue reading ]]> Nano is the closest-to-being-sane, widely available text editor for Linux. While still fucked up, you can get used to it in several hours. One of the biggest headaches seems to be selecting, copying and pasting. Nano help isn’t really helpful here, so let’s make it clear.

How to copy and paste arbitrary selection of text in nano?

  • Ctrl+6   # Start the selection
  • Alt +6   # Copy the selection into the clipboard
  • Ctrl+u   # Paste content of the clipboard

Yes, I know these shortcuts don’t follow any logic. But once you got a habbit it doesn’t matter that much.

]]>
http://thesingularity.pl/blog/2011/solved-nano-copy-paste/feed/ 0
[Solved] How to run each MiniTest::Spec in a transaction? http://thesingularity.pl/blog/2011/solved-how-to-run-each-minitestspec-in-a-transaction/ http://thesingularity.pl/blog/2011/solved-how-to-run-each-minitestspec-in-a-transaction/#comments Wed, 21 Dec 2011 21:54:34 +0000 qertoip http://thesingularity.pl/blog/?p=5761 Continue reading ]]> How to run each MiniTest::Spec in a transaction rolled-back upon finish? Simply add this to your test_helper.rb after requiring minitest/autorun:


# Monkey patch to ensure each test is run in a rolled back transaction
class MiniTest::Spec

  def run( *args, &block )
    value = nil

    begin
      ActiveRecord::Base.connection.transaction do
        value = super
        raise ActiveRecord::Rollback
      end
    rescue ActiveRecord::Rollback
    end

    return value  # The result of run must be always returned for the pretty dots to show up
  end

end
]]>
http://thesingularity.pl/blog/2011/solved-how-to-run-each-minitestspec-in-a-transaction/feed/ 0
[Solved] How to auto connect to a VPN on startup in Ubuntu 11.10? http://thesingularity.pl/blog/2011/solved-how-to-auto-connect-to-a-vpn-on-startup-in-ubuntu-11-10/ http://thesingularity.pl/blog/2011/solved-how-to-auto-connect-to-a-vpn-on-startup-in-ubuntu-11-10/#comments Fri, 04 Nov 2011 17:43:25 +0000 qertoip http://thesingularity.pl/blog/?p=5601 Continue reading ]]> How to automatically connect to a VPN on startup (login) in Ubuntu 11.10 (oneiric ocelot)?

What did NOT work

  • Option “connect automatically” in the Network Manager VPN configuration. This option has never worked, the bug is open for over 3 years and there seem to be no hope for the official fix.
  • The vpnautoconnect daemon does not work in my particular case. As of time of writing there is no deb package for Ubuntu 11.10 amd64. Source code version seems to have messy / inconvenient dependencies I was not eager to fulfill.

What DID work

I solved the problem using /etc/network/if-up.d/ hooks. Scripts in this dir are executed whenever any network interface is up, so it is (probably) the right place to (try to) start a VPN connection.

Here is the script to put in the aforementioned directory. Script name doesn’t matter:

#! /bin/bash

REQUIRED_CONNECTION_NAME="singularity"      # change singularity to your network connection name
VPN_CONNECTION_NAME="airvpn"                # change airvpn to your VPN connection name

activ_con=$(nmcli con status | grep "${REQUIRED_CONNECTION_NAME}")
activ_vpn=$(nmcli con status | grep "${VPN_CONNECTION_NAME}")
if [ "${activ_con}" -a ! "${activ_vpn}" ];
then
    nmcli con up id "${VPN_CONNECTION_NAME}"
fi

The “singularity” is a name of my wifi connection and “airvpn” is a name of the VPN connection. Replace them with yours (visible in the Network Manager widget).

Add execution permission (i.e. chmod +x /etc/network/if-up.d/connect-to-vpn where connect-to-vpn is the name of the script).

That’s all. Test it by turning off and on your network connection. VPN should now connect automatically.

]]>
http://thesingularity.pl/blog/2011/solved-how-to-auto-connect-to-a-vpn-on-startup-in-ubuntu-11-10/feed/ 3
Rails partials: nigdy nie wołaj render() w pętli http://thesingularity.pl/blog/2011/rails-partials-nigdy-nie-wolaj-render-w-petli/ http://thesingularity.pl/blog/2011/rails-partials-nigdy-nie-wolaj-render-w-petli/#comments Tue, 20 Sep 2011 07:39:09 +0000 qertoip http://thesingularity.pl/blog/?p=5561 Continue reading ]]> Wołanie <%= render(…) %> w pętli jest straszliwie niewydajne bo railsy owijają każde wywołanie rendera w benchmark(). ZTCW nie da się tego wyłączyć. Problem jest zauważalny już przy 10-20 powtórzeniach. Przy długich listach itemów, liczących np. 100 pozycji, jest to już prawdziwy horror – renderowanie ponad 1s.

Wydajna alternatywa:

<%= render @collection %>

np.

<%= render @users %>

W powyższym railsy dla każdego obiektu z listy @users sprawdzą nazwę modelu (User) i wyrenderują partial _user.html.* (konwencja). Benchmark zostanie wywołany tylko raz, stąd radykalna poprawa wydajności.

]]>
http://thesingularity.pl/blog/2011/rails-partials-nigdy-nie-wolaj-render-w-petli/feed/ 3
Kantor Bitcoin PLN http://thesingularity.pl/blog/2011/kantor-bitcoin-pln/ http://thesingularity.pl/blog/2011/kantor-bitcoin-pln/#comments Wed, 03 Aug 2011 19:41:55 +0000 qertoip http://thesingularity.pl/blog/?p=5481 Continue reading ]]>

(Aktualizacja 13 listopada 2011). Gdzie można kupić / sprzedać Bitcoiny za złotówki? Poniżej zamieszczam listę miejsc umożliwiających handel walutą Bitcoin (BTC) w polskich realiach:

(Disclaimer: pamiętaj, że Bitcoin to technologia cutting edge a towarzysząca mu infrastruktura jest niedojrzała. Z każdej usługi korzystasz na własną odpowiedzialność. Bądź ostrożny!)

Powyższe “kantory” działają na zasadzie walutomatu – są tylko platformami, na których użytkownicy handlują między sobą. Jednak powszechnie przyjęło określać je jako “kantory Bitcoin”, więc w dalszej części artykułu będę stosował tę terminologię.

Intersango to kantor prowadzony przez renomowane Bitcoin Consultancy. To jedyny kantor na świecie, który tworzą (niektórzy) programiści samego Bitcoina. Kantor cieszy się nieposzlakowaną opinią i ma obecnie charakter non-profit. Szczęśliwym zbiegiem okoliczności Bitcoin Consultancy ma siedzibę w Warszawie, choć w teamie chyba nie ma ani jednego Polaka. Intersango niedawno założyło konto w BZWBK i uruchomiło rynek wymiany PLN z krajowymi, bezpłatnymi wpłatami i wypłatami złotówek. Naturalnie, kilka dni po starcie (piszę to 13-ego listopada 2011) rynek jest płytki, ale udało mi się już korzystnie przeprowadzić transakcje rzędu kilkuset BTC.

BitMarket to solidny kantor polskiej produkcji, skupiający się co prawda na obsłudze waluty EURO, ale obsługujący również rynek polski. Jest unikalny pod tym względem, że nie przyjmuje depozytów w żadnej walucie prócz Bitcoin – przelewy walut fiat użytkownicy robią między sobą, co oczywiście rodzi ryzyko oszustwa, na które sam kantor nie ma wpływu. BitMarket wymaga weryfikacji tożsamości (np. przez Allegro) aby ograniczyć ryzyko oszustwa. Kantor jest bezpłatny.

Giełda ofert na polskim forum Bitcoin to kolejny skuteczny sposób zakupu bądź sprzedaży Bitcoina. Każdy może bezpłatnie zamieścić ofertę skupu/sprzedaży BTC. Niektórzy zaufani członkowie społeczności (np. Prze_koles, Kimono) oferują możliwość pośrednictwa w transakcjach lub zakładach, co praktycznie eliminuje ryzyko oszustwa.

Mt. Gox PLN to polski rynek na największym światowym kantorze Bitcoin. “Największym” niestety nie znaczy najlepszym. Mt Gox ma wiecznie jakieś problemy z wpłatami i wypłatami. Możliwe są b. duże opóźnienia oraz wymóg udowodnienia tożsamości przed wypłatą większych środków. Mt. Gox w przeszłości padł ofiarą poważnego ataku hackerskiego. Wyciekła tabela użytkowników i kantor był niedostępny przez kilka tygodni. Ostatecznie (niemal) wszyscy odzyskali swoje środki. No właśnie – _niemal_ wszyscy. Potem było też kilka mniejszych fuckupów (jakieś anomalie z transakcjami itp).

Z drugiej strony Mt. Gox uratował polskich użytkowników Bitomatu, zwracając wszystkim Bitcoiny utracone przez Bartłomieja Szabata. Co więcej, jest to chyba jedyny naprawdę dochodowy kantor Bitcoin na świecie. Mt. Gox toczy batalię prawną o “legalizację” Bitcoina we Francji. Dlatego bardzo ciężko ich jednoznacznie ocenić. Wydaje się, że zespół Mt. Gox ma czyste intencje, ale gra niezwykle ryzykownie i odbija się to na użytkownikach.

Notki historyczne

Kiedyś istniał jeszcze kantor “Bitomat”, ale stracił wszystkie Bitcoiny użytkowników – łącznie kilkanaście tysięcy BTC – w wyniku niekompetencji i nieodpowiedzialności właściciela, Bartłomieja Szabata. Bitomat był pierwszym polskim kantorem BTC i w chwili chwały miał wielu fanów. Niewątpliwie Bitomat przyczynił się do początkowej popularyzacji Bitcoina w Polsce.

Na fali upadku Bitomatu powstały dwa nowe kantory: FreshBTC i Bitchange.pl. Ten pierwszy został natychmiast “zakopany” przez społeczność ze względu na bardzo liczne błędy i niesolidne wykonanie (do czego sam się zresztą mocno przyczyniłem wyprowadzając kilkaset złotych w ramach eksperymentu (zostały zwrócone)). Drugi z nich, Bitchange.pl, choć nie był całkiem pozbawiony błędów, zyskał sympatię społeczności  i rozkwitał. Niestety właściciel postanowił zamknąć kantor ze względu na nieuregulowaną sytuację prawną Bitcoina w Polsce i potencjalne problemy. W swojej krótkiej historii Bitchange nigdy nie stracił pieniędzy użytkowników i nie doświadczył żadnej poważnej awarii.

]]>
http://thesingularity.pl/blog/2011/kantor-bitcoin-pln/feed/ 1
Przyjmowanie płatności Bitcoin – beta http://thesingularity.pl/blog/2011/przyjmowanie-platnosci-bitcoin-beta/ http://thesingularity.pl/blog/2011/przyjmowanie-platnosci-bitcoin-beta/#comments Tue, 19 Jul 2011 16:35:08 +0000 qertoip http://thesingularity.pl/blog/?p=5351 Continue reading ]]> Już wkrótce przyjmowanie płatności w wirtualnej walucie Bitcoin (BTC) stanie się równie łatwe jak płatności w złotówkach. Nowa usługa BitcoinNotify.com oferuje powiadomienia o płatnościach Bitcoin dla sklepów, aplikacji i osób przyjmujących donacje.

Jak to działa? Aplikacja (np. sklep internetowy) otrzyma powiadomienie HTTP o każdym wpływie pieniędzy na swoje konto (adres Bitcoin). Co ważne, Bitcoiny idą od klienta bezpośrednio na konto sklepu. Nigdy nie przechodzą przez konto pośrednika. Odpada zatem problem zaufania.

Jest to możliwe, ponieważ wszystkie transakcje w sieci Bitcoin są publiczne. Usługa BitcoinNotify.com monitoruje publiczną sieć p2p i wyłapuje transakcje na określone konta.

Aplikacja jest dostępna wyłącznie na zaproszenia. Niniejszym rozdaję pewną pulę zaproszeń: 6gzFRurl9x (invitation code) – kto pierwszy, ten lepszy.

Aplikacja oferuje także powiadomienia o zmianach kursu, co pozwala na bieżąco aktualizować ceny BTC w sklepie.

Obecnie usługa jest całkowicie bezpłatna. Chwyć zaproszenie i zacznij obsługiwać płatności Bitcoin w swojej aplikacji, zanim zrobią to inni. Dwa pierwsze polskie sklepy przyjmujące płatności Bitcoin były już prezentowane w telewizji i na głównej Wykopu.

PS Kącik programistów: aplikacja napisana jest w całości w Ruby i Railsach – łącznie z monitoringiem sieci Bitcoin. Stoi na Ubuntu Server LTS. Chętnie opowiem o wszelkich technikaliach, również od strony bezpieczeństwa i niezawodności usługi.

]]>
http://thesingularity.pl/blog/2011/przyjmowanie-platnosci-bitcoin-beta/feed/ 8
Laptopy po cenach niemal fabrycznych – dojście http://thesingularity.pl/blog/2011/lenovo-t420-t520-w520-ceny-fabryczne/ http://thesingularity.pl/blog/2011/lenovo-t420-t520-w520-ceny-fabryczne/#comments Sat, 28 May 2011 20:00:39 +0000 qertoip http://thesingularity.pl/blog/?p=5151 Continue reading ]]> Przed moim niedawnym zakupem laptopa przetrząsnąłem pół Internetu w poszukianiu najniższych cen na porządne laptopy (nie tam jakieś Acery).

Znalazłem ludzi, którzy mają dostęp do amerykańskich, fabrycznych cen na wybrane modele laptopów. Chodzi głównie o markę Lenovo, zwłaszcza znane z niezawodności ThinkPady. W mniejszym zakresie Asus, sporadycznie także HP i Sony. Asortyment nie jest duży, ale ze względu na dostępność różnej maści ThinkPadów – bardzo kuszący.

Skubańce znaleźli też bardzo tani (bo grupowany i powolny) sposób na sprowadzanie tych laptopów z USA do Polski, uwzględniający pełną legalizację (opłacone cło, a nawet możliwość otrzymania polskiej faktury VAT). Czas sprowadzenia sprzętu to 3-4 tygodnie od zakupu.

Ich firma (a ściślej – dwie małe, współpracujące firmy, jedna w USA, druga w Polsce) sprowadza w ten sposób laptopy od ponad 3 lat i na razie nie zaliczyli żadnej wpadki (wzorowa opinia na allegro). Mój własny zakup ThinkPada T520 opisałem w poprzednim blogu.

Gdzie ich szukać?

Najwygodniej kupić od nich przez allegro (Siwunia6). Uwaga: powołując się na ten blog i tak bardzo atrakcyjne ceny spadają o 1%, czyli np. o 50zł przy zakupie za 5000zł. Wystarczy po zakupie wpisać w polu “Uwagi” nazwę bloga: TheSingularity.pl

Osobiście nie jestem w żaden sposób zaangażowany w działanie tej firmy, ale chętnie odpowiem na ewentualne pytania i wątpliwości z perspektywy klienta: qertoip@gmail.com, tel. 694-797-487.

Po prostu po bardzo udanym / tanim zakupie zdecydowałem się oficjalnie polecać tego sprzedawcę. Disclaimer: otrzymam symboliczną prowizję, jeśli kupisz z mojego polecenia. Prowizję wydam pewnie na zakup “anarchistycznej” monety BitCoin, ale o tym może następnym razem…

]]>
http://thesingularity.pl/blog/2011/lenovo-t420-t520-w520-ceny-fabryczne/feed/ 0
Jak tanio i bezpiecznie sprowadzić ThinkPada ze Stanów? http://thesingularity.pl/blog/2011/jak-tanio-sprowadzic-thinkpad-usa/ http://thesingularity.pl/blog/2011/jak-tanio-sprowadzic-thinkpad-usa/#comments Mon, 23 May 2011 22:06:28 +0000 qertoip http://thesingularity.pl/blog/?p=5101 Continue reading ]]> Niedawno pisałem, dlaczego wybrałem ThinkPada. Dziś napiszę, jak tanio i bezpiecznie sprowadzić takie cudo ze Stanów.

Kilka tygodni temu przewaliłem 1/3 ebaya i pół allegro w poszukiwaniu najtańszego sposobu na nabycie Lenovo ThinkPada T520. Zdecydowanie najlepsze ceny na ThinkPady różnej maści miała niejaka “Siwunia6” z allegro. Patrzę – ponad 100 pozytywów i 0 negatywów. Rzuciłem się więc do wertowania treści komentarzy, bo jak wiadomo, łatwo nałapać pozytywów na sprzedaży duperel, żeby później odwinąć jakiś szwindel. Okazało się, że znaczna część komentarzy wprost komentuje zakup laptopa. Zresztą innego asortymentu Siwunia6 w sprzedaży nie posiada. Z logów wynikało, że sprzedawca niezawodnie sprowadził ze Stanów około 100 laptopów na przestrzeni 3 lat. To już budzi jakieś zaufanie. Wymieniłem ze sprzedawcą kilka maili i zdecydowałem się zaryzykować, przedpłacając ok. 4000PLN.

Laptopa miałem otrzymać po około 4 tygodniach, uzbroiłem się więc w cierpliwość. Sprzedawca z własnej inicjatywy informował o kolejnych etapach realizacji zamówienia, co napawało mnie nadzieją, że sprzęt faktycznie ujrzę ;-)

Sprzęt przyszedł farciarsko szybko – dostałem go już po 23 dniach od zakupu. Wszystko zgodne z zamówieniem, laptop oczywiście nowy. Osobiście odbierałem ThinkPada w warszawskiej Galerii Mokotów w ogródku restauracyjnym, po dokładnym sprawdzeniu sprzętu i faktury. Mucha nie siadała :-)

Podsumowując – bardzo udany zakup, trudno nie rekomendować takiego sprzedawcy. Niemniej, przy tego rodzaju zakupach (nawet u “Siwuni6″) zawsze pamiętaj o przeczytaniu kilkudziesięciu ostatnich komentarzy na allegro i solidnym googlowaniu sprzedających (po nicku, nazwisku, emailu, telefonie itp). Jeśli ktokolwiek zostanie oszukany, zapewne napisze o tym gdzieś w sieci.

Ekipa: Dariusz Dziadkiewicz (DD, ddzi2745@hotmail.com, głównodowodzący interesem), Jacek Pyrka (firma Jac-Mil Jacek Pyrka NIP 716-125-94-68, jacekpyrka@wp.pl, polski reprezentant), Agata Siwiec (Siwunia6).

Polecam.

]]>
http://thesingularity.pl/blog/2011/jak-tanio-sprowadzic-thinkpad-usa/feed/ 7
Sprzedam okazyjnie Della Latitude D520 http://thesingularity.pl/blog/2011/dell-latitude-d520-okazyjnie/ http://thesingularity.pl/blog/2011/dell-latitude-d520-okazyjnie/#comments Sat, 21 May 2011 19:30:23 +0000 qertoip http://thesingularity.pl/blog/?p=4901 Continue reading ]]> W związku z nabyciem nowego ThinkPada mam do sprzedania mojego wysłużonego, niezawodnego Della Latitude D520. Solidna biznesowa seria Latitude rzeczywiście wytrzymała próbę czasu: po 4 latach laptop wciąż działa niemal jak nowy. Służył głównie w domowym zaciszu, noszony sporadycznie na konferencje i prezentacje.

Cena: 550zł

Procesor Intel Core Duo 1.66Ghz
Liczba rdzeni 2
RAM 3GB (DDR2, 667Mhz, Kingstone)
HDD 80GB 7200 RPM (SATA, oryginalny Hitachi)
Matryca 15″, 1024×768, matowa
System operacyjny Windows XP Home SP2 (oryginalny nośnik i sticker licencyjny, system zainstalowany ze wszystkimi aktualizacjami, gotowy do pracy)
Chipset Mobile Intel 945GM Express
Grafika Intel GMA 950 Dynamic Video Memory Technology 3.0 (zintegrowana, max 128MB)
Inne WiFi, 1394 FireWire, PCMCIA Slot (supports ExpressCard/34), Infrared, Headphone, Microphone, 4xUSB 2.0, 56k Modem, 10/100 LAN, S-Video Out, VGA Out
Dostawa Dostarczę osobiście na terenie Warszawy i okolic – możliwość sprawdzenia przed zakupem. Inne rejony Polski: do ceny należy doliczyć koszt przesyłki kurierskiej, no i fizycznie nie ma możliwości osobistego przetestowania przed zakupem.
Stan Dobry, niewielkie ślady użycia. Komputer gotowy do pracy: zainstalowany oryginalny Windows, wszystkie sterowniki i aktualizacje.
Znane problemy Praktycznie w każdym mocniej używanym laptopie występują jakieś ukryte, niepublikowane na allegro “issues”. Nieinaczej jest z moim Dellem. Wiem o następujących problemach:

  • WiFi sporadycznie nie chce się załączyć, należy liczyć się z całkowitym padem w przyszłości. Rozwiązaniem jest wymiana (łatwa bez rozbierania laptopa) lub karta WiFi na USB (która przy okazji będzie miała silniejszy sygnał).
  • Bateria wytrzymuje około 1h.
  • Matryca – co oczywiste – nie jest tak jasna jak w nowym sprzęcie. Jak każda matryca, po latach ulega w pewnym stopniu “wypaleniu” i świeci słabiej. Wspominam o tym dla formalności: nie przeszkadzało mi to spędzać w weekendy przed laptopem 14-16h dziennie :-)
  • Jedna z 5 “nóżek” pozbawiona jest gumy. Mimo to laptop stoi stabilnie.

Na allegro podobne konfiguracje zaczynają się od ok. 700zł. Wydaje mi się, że za kwotę 550zł jest to świetna kombinacja wydajności i solidności. Dysk 7200RPM i 3GB RAM dają radę – w końcu to były komputer programisty ;) Laptop był kupiony w Szwajcarii bezpośrednio od Della (kilka lat temu miałem okazję mieszkać i pracować w rejonie Genewy). Polecam!

Na marginesie, laptop świetnie współpracuje z Ubuntu. Dell jest zresztą partnerem Canonical.

Zapraszam do kontaktu: tel. 694-797-487, qertoip@gmail.com

PS Kto pierwszy, ten lepszy.

Dell Latitude D520 2 3 4 6 ]]>
http://thesingularity.pl/blog/2011/dell-latitude-d520-okazyjnie/feed/ 7
Przyszłość bankowości elektronicznej 2011 http://thesingularity.pl/blog/2011/przyszlosc-bankowosci-elektronicznej-pfm2011/ http://thesingularity.pl/blog/2011/przyszlosc-bankowosci-elektronicznej-pfm2011/#comments Sun, 15 May 2011 14:38:24 +0000 qertoip http://thesingularity.pl/blog/?p=4851 Continue reading ]]> Jakich zmian możemy spodziewać się w bankowości elektronicznej w najbliższych 5-10-15 latach? “Przyszłość bankowości elektronicznej. Personal Finance Management” to prezentacja, którą wygłosiłem na zjeździe Związku Banków Polskich w Ostródzie 12 maja 2011.

Zainteresowanych zapraszam do zapoznania się.

Słowa kluczowe: PFM, Personal Finance Management, bankowość elektroniczna, bankowość internetowa. Dostępne też na slideshare.

]]>
http://thesingularity.pl/blog/2011/przyszlosc-bankowosci-elektronicznej-pfm2011/feed/ 2
In place editing with Datepicker http://thesingularity.pl/blog/2011/in-place-editing-jeditable-datepicker/ http://thesingularity.pl/blog/2011/in-place-editing-jeditable-datepicker/#comments Sat, 07 May 2011 14:07:41 +0000 qertoip http://thesingularity.pl/blog/?p=4801 Continue reading ]]> I’ve released jeditable-datepicker. It allows you to combine in place editing with jQuery UI Datepicker.

jeditable-datepicker is based on Jeditable (the finest in place editing jQuery plugin) and jQuery UI Datepicker (the most popular jQuery callendar widget).

See the demo and clone github repo.

The usage is as simple as:

$( '.editable' ).editable( {
  type: 'datepicker'
} );

Feel free to drop me line if you find jeditable-datepicker useful.

]]>
http://thesingularity.pl/blog/2011/in-place-editing-jeditable-datepicker/feed/ 1
JavaScript.next? http://thesingularity.pl/blog/2011/traceur-czy-coffeescrip/ http://thesingularity.pl/blog/2011/traceur-czy-coffeescrip/#comments Wed, 04 May 2011 20:23:58 +0000 qertoip http://thesingularity.pl/blog/?p=4751 Traceur czy CoffeeScript – oto jest pytanie!

Oba języki to ekscytujące alternatywny dla klasycznego JavaScriptu. Ale w produkcyjnym kodzie sugeruję na razie poczekać na rozwój wydarzeń…

]]>
http://thesingularity.pl/blog/2011/traceur-czy-coffeescrip/feed/ 0
Najlepsza praktyka w CSS: używaj Sassa http://thesingularity.pl/blog/2011/najlepsza-praktyka-css-sass/ http://thesingularity.pl/blog/2011/najlepsza-praktyka-css-sass/#comments Mon, 02 May 2011 10:51:25 +0000 qertoip http://thesingularity.pl/blog/?p=4631 Continue reading ]]> Nicole ‘Stubbornella’ Sullivan celnie zidentyfikowała problemy z stylami w dużych projektach. Ujawniła ogromną duplikację kodu CSS m.in. w facebooku. Definicje powielane są setkami, a !important piętrzą się jak hotele w Dubaju. Burdel nie do opanowania.

Następnie zaleciła serię kontrowersyjnych praktyk, mających uleczyć sytuację. Nowe “dobre praktyki” to odwrotność bieżących “dobrych praktyk”. Stubbornella oficjalnie rekomenduje powrót do niesemantycznych klas i dodatkowych niesemantycznych elementów-wrapperów HTML.

Tymczasem tych problemów nie da się rozwiązać samym CSS-em! CSS nie dostarcza żadnego sposobu na pownowne użycie kodu. Klasy nie pełnią tej funkcji, bo nie da się ich ponownie użyć w ramach samego CSS-a. Mamy zatem wybór pomiędzy masową duplikacją definicji w CSS i semantycznym HTML-em, albo w miarę czystym CSS-em i masową duplikacja list klas i sztucznych wrapperów w HTML-u.

Łobuzie, co począć?

Okazuje się, że istnieje zgrabne i praktyczne rozwiązanie tych problemów: Sass.

Sass to ścisły nadzbiór CSS-a kompilowany w locie do zwykłego CSS na komputerze web designera.

Jest to zatem zależność czysto deweloperska i każdy plik .css jest jednocześnie poprawnym .scss.

Sass rewolucjonizuje web design oferując kilka sprawdzonych sposobów na ponowne użycie kodu:

  • Dziedziczenie selektorów (selector inheritance). Zdefiniuj nowy selektor bazując na istniejącej definicji. Nowy selektor odziedziczy właściwości selektora bazowego. Przykład: klasa .error dziedziczy z .notification, dodając jedynie czerwoną ramkę. Ta jedna funkcja Sassa pozwala uniknąć duplikacji i jednocześnie cieszyć się zwięzłym, semantycznym markupem!
  • Wstawki kodu (mixins). Wstawia w dowolnym miejscu wybrany fragment kodu (listę selektorów z ich definicjami).
  • Definiowanie stałych. Zdefiniuj w jednym miejscu wielkości czcionek, kolory aplikacji, rozmiary białej przestrzeni itp. Następnie nie używaj literałów 16px czy #303030, tylko odpowiadających im stałych $default-font-size, $default-color itp.
  • Funkcje. Przykład: kolor może być funkcją innego koloru. Np. mix( $my-blue-color, $my-green-color ).

Sass nie powstał wczoraj. Jest to dojrzałe i świetnie udokumentowane narzędzie z silnym wsparciem społeczności.

Zaczynając projekt w Sass niczym nie ryzykujesz. Zawsze możesz wrócić do wynikowego CSS-a, który da się wygenerować w rozmaitych konwencjach formatowania (od minified po pretty). Nie są jednak znane przypadki powrotu do CSS-a :-)

Nie potrafię wymyśleć żadnego powodu, który uzasadniałby pozostanie przy CSS. Sass to wewnętrzne narzędzie web designera. Dla przeglądarek internetowych i “klienta z grubym portfelem” jest to całkowicie przezroczyste. Bariera wejścia dla nowego web designera jest znikoma – rozszerzenia Sassa można zrozumieć w kilka godzin.

Dlatego uważam, że pisanie w czystym CSS to lamerstwo.

Stubbornella spudłowała. Zamiast promować rzeczywiste rozwiązanie problemu, Nicole Sullivan promuje zaśmiecanie markupu.

Jeśli jeszcze tego nie zrobiłeś, najwyższa pora przejść na Sassa.

]]>
http://thesingularity.pl/blog/2011/najlepsza-praktyka-css-sass/feed/ 3
Kaminari 0.12.* crashes rails/ruby process – solution http://thesingularity.pl/blog/2011/kaminari-0-12-crashes-rails-and-ruby-solution/ http://thesingularity.pl/blog/2011/kaminari-0-12-crashes-rails-and-ruby-solution/#comments Fri, 29 Apr 2011 17:36:08 +0000 qertoip http://thesingularity.pl/blog/?p=4581 Continue reading ]]> Kaminari 0.11.0, 0.12.*, the best Ruby on Rails pagination gem, can hard crash your rails / ruby process if you have customized the templates.

Solution: simply remove your customized kaminari templates from app/views/kaminari. Then generate new templates with:

rails g kaminari:views default -e haml

…and customize them again.

(keywords for google: kaminari 0.12 problem, kaminari 0.12 bug)

]]>
http://thesingularity.pl/blog/2011/kaminari-0-12-crashes-rails-and-ruby-solution/feed/ 2
Pieprzyć drogie MacBooki Pro http://thesingularity.pl/blog/2011/pieprzyc-drogie-macbooki-pro/ http://thesingularity.pl/blog/2011/pieprzyc-drogie-macbooki-pro/#comments Mon, 25 Apr 2011 21:17:55 +0000 qertoip http://thesingularity.pl/blog/?p=4371 Continue reading ]]> Od dłuższego czasu miałem duży apetyt na OS X. Jest to jedyny system, który łączy wygodę programowania znaną z Linuksa z wygodą użytkowania znaną z Windows. W tej drugiej jest zresztą niedoścignionym wzorem. Wybór wydaje się oczywisty, gdyby nie jeden niuans – pojebana cena.

Po blisko 5 latach od kupna poprzedniego laptopa miałem ochotę na prawdziwy przełom sprzętowy. Poprzedni laptop ma dwa rdzenie, dość szybki dysk 7200RPM i 3GB RAM. Solidny, biznesowy Dell Latitude D520, który nigdy mnie nie zawiódł. Ten 5-letni staruszek stawia poprzeczkę “przełomu” dość wysoko…

Jaki powinien być dzisiejszy laptop programisty?

Bezwzględnie dysk SSD. Dyski SSD to jedyna przełomowa technologia “PC” w ostatnich latach. Od dawna to dysk twardy jest największym hamulcowym wydajności komputerów. Dyski SSD całkowicice rozwiązują ten problem. Dodatkowo, są znacznie bardziej niezawodne i mniej prądożerne. Jestem zdumiony, że SSD wciąż nie jest standardowym wyposażeniem komputerów. Cena nie jest powodem. Powodem jest głupota klientów, którzy nie rozumieją, że lepiej mieć w laptopie 80GB SSD niż 1TB HDD. Laptop to nie archiwum multimediów. Od tego są tanie dyski zewnętrzne!

Matowy ekran. Owszem, ekrany glare (błyszczące) ślicznie wyglądają na wystawach. Owszem, mają szerszy kąt patrzenia. Owszem, dają wrażenie większej soczystości kolorów. Ależ do chuja, nie da się na nich pracować 8 godzin dziennie bez zmęczenia oczu odbłyskami świetlnymi! No chyba, że w garażu ;-) Jako profesjonaliści, spędzamy ze swoimi zabawkami 12-14h dziennie i każda niedoskonałość ekranu ma ogromne przełożenie na komfort pracy i zdrowie oczu.

Minimum 4GB RAM, minimum 1333Mhz. Do typowej pracy programistycznej w zasadzie wystarcza 2GB RAM. Kolejne 2GB potrzebne są oczywiście… na wirtualizację! Chcemy przełączać się pomiędzy systemami operacyjnymi jak pomiędzy aplikacjami – bez swapowania. Licznych cnot wirtualizacji nie muszę chyba wyjaśniać. Musi być możliwość powiększenia RAM do 8GB – inaczej cała architektura 64-bitowa traci sens.

SATA 3. Ten interfejs jest konieczny, abyś wkrótce mógł wymienić swój wysłużony SSD 200MB/s na ponad dwa razy szybszy SSD 400MB/s odczyt, 400MB/s zapis. Dyski SSD z takimi monstrualnymi transferami (w obie strony!) pojawiają się już w sprzedaży. Za rok ceny znacznie spadną i zakup stanie się praktyczny, dając kolejnego kopa Twojej produktywności. Niestety, na 99% masz w swoim laptopie SATA 2, a jeśli kupowałeś dawniej niż 3 lata temu, pewnie SATA 1. Jeśli jednak kupujesz laptopa dziś, upewnij się, że jest otwarty na SATA 3, interfejs dysków, który będzie królował przez najbliższe 4 lata.

Raczej architektura Sandy Bridge 32nm Intela. Nie jest to punkt obowiązkowy, można też śmiało rozważyć silniejszy (np. 4 rdzeniowy) procesor w starszej architekturze Nehalem. Marketingowo Sandy Bridge to druga generacja procesorów i3, i5, i7. Nowe procesory są w praktyce 5%-10% szybsze przy tym samym zegarze od pierwszej generacji i3, i5, i7 (według Wikipedii). Mają też mniejsze zużycie energii, czyli dłużej popracujemy na bateriach.

Dlaczego nie musisz kupować Maca?

To prawda, że OS X może być najlepszym systemem operacyjnym, ale rola systemu operacyjnego z każdym dniem traci na znaczeniu. Nastała era aplikacji webowych. Nowym systemem operacyjnym jest przeglądarka. Najbardziej korzysta na tym Linuks, który zawsze borykał się z niedopracowanymi aplikacjami GUI. Dziś w Linuksie odpalamy przeglądarkę i korzystamy z tego samego co inni.

To prawda, że MacBooki są śliczne (żeby nie powiedzieć pedalskie), ale jakoś wolę legendarnego ThinkPada, który od 18 lat jest masowo stosowany w przestrzeni kosmicznej na pokładach amerykańskich, europejskich i rosyjskich statków.

To prawda, że bez Maca praktycznie nie da się rozwijać oprogramowania dla iPhone’a i iPada ale od pewnego czasu wyczuwalny jest lekki odwrót hackerów od iOS-a. Android praktycznie dogonił iOS-a pod względem wygody użytkowania i stale rośnie w siłę. Ma też bardziej otwarty i nowoczesny model programistyczny, oparty o Javę, a nie prehistoryczne Objective C. Jestem bardzo zadowolony z mojego iPhone’a ale mój następny telefon będzie bazował na Androidzie.

Wyszedł Ubuntu 11.04 z powłoką Unity, która jest przełomowa jeśli chodzi o usability Linuksa. Unity oficjalnie kopiuje najlepsze rozwiązania z OS X – docka, findera, centralny pasek tytułowy/menu aplikacji i inne. Odzyskano mnóstwo miejsca na ekranie, a całości używa się bardzo przyjemnie. Oczywiście, jak to w Linuksie, są jeszcze pewne zgrzyty i jestem daleki od stwierdzenia, że Ubuntu dogoniło OS X-a, ale na pewno wyraźnie zmniejszyło dystans.

MacBooki nie słyną z niezawodności. Są pod tym względem przeciętne. Nie jeden kolega serwisował swojego Pro (choć trzeba przyznać, że sama obsługa serwisowa Apple jest oceniana wysoko). Sugeruję porównać google “MacBook Pro reliability” i “ThinkPad reliability“. Dostaję gęsiej skórki na samą myśl, że po 13-stu miesiącach mój MacBook Pro za 8000PLN mógłby wyzionąć ducha! Standardowa gwarancja ma oczywiście rok, a 3-letnia kosztuje fortunę.

Zrezygnuj z MacBooka, zaoszczędź 2500+ PLN

MacBooka Pro z konfiguracją odpowiadającą moim wymaganiom u najtańszych, w miarę wiarygodnych sprzedawców na allegro da się złożyć za 7500-8000 PLN. Oczywiście, jakiegoś Pro można znaleźć i za połowę tej ceny, ale będzie się wlókł jak emerytowany żółw, a nie o to nam chodzi. Dla ustalenia uwagi, chodzi nam o topowy dysk SSD, matowy 15 calowy ekran, architekturę procesora Sandy Bridge (ostatecznie silniejszy procesor poprzedniej generacji), SATA 3, szybki RAM 1333Mhz, fakturę VAT 23% (która umożliwia odzyskanie 1/3 ceny) i tym podobne bajery.

Dla mnie kwota 7500-8000 PLN w połączeniu z 1-roczną gwarancją jest absolutnie nie do zaakceptowania.

Okazuje się, że wystarczy olać Apple i świat natychmiast staje się przyjazny dla portfela. Cały sprzętowy apetyt udało mi się zaspokoić za 4800 PLN, i to z polską FVAT 23%. I wcale nie jest to Acer, tylko najnowsza biznesowa seria ThinkPad T520, która do najtańszych nie należy…

Muszę co prawda poczekać na swoje cacko 4 tygodnie, bo będzie leciało ze Stanów, ale taką już mamy rzeczywistość ;-) Według logów allegro, sprzedawca na przestrzeni 3 lat niezawodnie dostarczył ze Stanów ponad 100 laptopów, więc zakładam, że nie zostanę zrobiony w wała. O dalszej przygodzie z tym transatlantyckim zakupem opowiem w oddzielnym artykule i – mam nadzieję – rekomenduję tego sprzedawcę.

Podsumowując, postawiłem na:

  • ThinkPad T520 + Ubuntu 11
  • Intel i5-2520M 2.5GHz (Sandy Bridge, 2 rdzenie, 4 równoległe wątki)
  • 4GB RAM DDR3 1333MHz (max 8GB)
  • 15.6” matowy ekran
  • SSD OCZ Vertex 2 120GB (kupiony oddzielnie; samodzielna podmiana standardowego 320GB 7200 RPM, który sprzedam)
  • Grafika wbudowana Intel HD Graphics 3000
  • Chipset Huron River, 3G, WiMAX

Historycznie miałem nosa do sprzętowych zakupów – oby tak było i tym razem :-) O tym, jak całość się sprawdza, być może napiszę za 2 miesiące, gdy zdążę go otrzymać i solidnie przetestować.

Na koniec dodam, że od dłuższego czasu jestem szczęśliwym posiadaczem iPhone’a i iPada. Znam doskonale i doceniam jakość produktów Apple. Ale…

Powiedzmy sobie jasno – MacBook Pro to przegięcie pały. Przez dłuższy czas szukałem argumentów ZA zakupem drogiego Maca, starając przekonać sam siebie, że warto – i zawsze dochodziłem do wniosku, że to się nijak nie kalkuluje. Mimo zajebistego OS X-a. Nie ma sensu ślepo podążać za IT-modą. Jeśli liczysz się z pieniędzmi, nie kupuj laptopów Apple.

Jednak ThinkPadP
]]>
http://thesingularity.pl/blog/2011/pieprzyc-drogie-macbooki-pro/feed/ 18
Najlepsze praktyki w JavaScript – prezentacja na WRUG http://thesingularity.pl/blog/2011/najlepsze-praktyki-w-javascript-prezentacja-na-wrug/ http://thesingularity.pl/blog/2011/najlepsze-praktyki-w-javascript-prezentacja-na-wrug/#comments Tue, 05 Apr 2011 16:54:53 +0000 qertoip http://thesingularity.pl/blog/?p=4311 W tą środę 6 kwietnia o 19:00 będę opowiadał o dobrych praktykach w JavaScript na WRUG, Warszawa, Łucka 15, siedziba aenimy.

Zapraszam. Więcej szczegółów – szukajcie WRUG na fejsie.

PS Prezentacja dostępna jest na githubie: https://github.com/qertoip/javascript-najlepsze-praktyki

]]>
http://thesingularity.pl/blog/2011/najlepsze-praktyki-w-javascript-prezentacja-na-wrug/feed/ 4
Railsowy helper truncate to zło http://thesingularity.pl/blog/2011/rails-truncate/ http://thesingularity.pl/blog/2011/rails-truncate/#comments Sun, 27 Mar 2011 18:50:25 +0000 qertoip http://thesingularity.pl/blog/?p=4251 Continue reading ]]> Ruby on Rails, a ściślej gem ActionPack, oferuje helper truncate:

<%= truncate( comment.title, :length => 120 ) %>

Pozwala on obciąć tekst  po danej liczbie znaków, dołączając na koniec estetyczny trzykropek.

Dlaczego truncate to zło?

Helper operuje na złym poziomie abstrakcji, to znaczy na znakach, zamiast na pikselowej szerokości.

Nigdy nie spotkałem się z wymaganiem biznesowym obcięcia tekstu do n znaków na ekranie. Zawsze brzmi ono – musi się zmieścić w tym boksie lub przynajmniej nie popsuć layoutu.

Problem polega na tym, że fizycznie nie da się dobrać poprawnej liczby znaków, po której tekst miałby się ucinać. Na szerokość ekranową składają się bowiem, oprócz liczby znaków:

  • sam tekst (“iii” vs “WWW”)
  • krój i wielkości czcionki (które w każdej aplikacji ewoluują)
  • platforma (sposób renderowania i antyaliasingu wpływa na szerokość)

W konsekwencji:

  • zawsze znajdzie się tekst, który jednak się nie zmieści i popsuje layout
  • zawsze znajdzie się tekst, który zostanie ucięty w połowie dostępnej szerokości, bo będzie się składał z wąskich znaków
  • każda zmiana kroju lub wielkości czcionki wymusza ręczne dostosowanie wszystkich truncate w aplikacji

Jak poprawnie obcinać tekst?

Tekst należy obcinać wyłącznie przy pomocy CSS:

.ellipsis {
   overflow: hidden;
   white-space: nowrap;
   text-overflow: ellipsis;
   width: 200px;
}

Powyższy kod całkowicie rozwiązuje problem w IE, Chrome, Operze i Safari. W Firefoksie tekst zostanie prawidłowo ucięty, ale nie będzie dodany trzykropek, ze względu na brak obsługi ellipsis. Jeśli w Twoim zastosowaniu estetyczny efekt tak uciętego tekstu w Firefoksie nie jest akceptowalny, można nałożyć na prawą stronę blednące tło.

Rozwiązanie CSS-owe gwarantuje święty spokój niezależnie od tekstu, czcionki i platformy, pozostawiające jednocześnie widoki czystszymi.

PS Istnieje hack, który pozwala uzyskać trzykropek w Firefoksie, ale jest okupiony swoimi problemami. Nie zdecydowałem się go stosować. Nie skłaniam się też do prób dodawania trzykropka JavaScriptem, sugeruję zachować prostotę.

]]>
http://thesingularity.pl/blog/2011/rails-truncate/feed/ 3
Współbieżność: Ruby 1.9 vs Computer Science http://thesingularity.pl/blog/2011/ruby-fiber-thread-coroutine/ http://thesingularity.pl/blog/2011/ruby-fiber-thread-coroutine/#comments Wed, 16 Feb 2011 22:02:21 +0000 qertoip http://thesingularity.pl/blog/?p=4191 Continue reading ]]> Co bardziej kumaci z Was rozumieją pojęcia związane ze współbieżnością, takie jak generator, coroutine, user-level thread, kernel-level thread. Poniższa tabelka umożliwi Wam natychmiastowe zrozumienie ich odpowiedników w Ruby 1.9.2. Zatem, co jest czym?

Computer Science Ruby 1.9.2
Uproszczony generator Zwykły yield oddający kontrolę do bloku, znany z Ruby “od zawsze”.
Generator Klasa Fiber wbudowana w język. Wewnątrz Fiber do … end używamy Fiber.yield, na zewnątrz fiber.resume.
Coroutine Klasa Fiber wbudowane w język + require ‘fiber’. Wewnątrz Fiber do … end używamy jakiś_inny_fiber.transfer, a na zewnątrz fiber.resume.
Continuation require ‘continuation’. Kontunuację tworzymy wołając callcc.
Kernel-level thread Klasa Thread. Wątek przestrzeni jądra, czyli harmonogramowany przez system operacyjny. W Rubym 1.9.2 współbieżność niestety jest w praktyce ograniczona do… 1 wątku! Ściślej, tylko jeden wątek systemu operacyjnego może się faktycznie wykonywać. Pozostałe albo są zablokowane na IO (co jest normalne), albo czekają na swój token nawet jeśli w systemie są wolne rdzenie (co jest chujnią, ale konieczną, bo większość bibliotek nie jest bezpieczna).

Mam nadzieję, że to się Wam przyda. A na pewno mi się przyda jak zapomnę, bo jednak nie są to rzeczy używane na codzień…

]]>
http://thesingularity.pl/blog/2011/ruby-fiber-thread-coroutine/feed/ 0
String Ruby 1.9 ma liniowy czas dostępu http://thesingularity.pl/blog/2011/string-ruby-1-9-ma-liniowy-czas-dostepu/ http://thesingularity.pl/blog/2011/string-ruby-1-9-ma-liniowy-czas-dostepu/#comments Tue, 18 Jan 2011 22:22:53 +0000 qertoip http://thesingularity.pl/blog/?p=4141 Continue reading ]]> Nie mówi się o tym głośno, ale String w Ruby 1.9 ma liniowy (czyli pojebany!) czas dostępu do i-tego znaku.

Problem bierze się stąd, że (w ogólnym przypadku) znak nie składa się ze stałej liczby bajtów, a więc nie jest możliwe obliczenie miejsca w pamięci bez trawersowania Stringa.

Wyjątkiem są Stringi US-ASCII, gdzie każdy znak to jeden bajt. Wtedy czas dostępu jest stały. Najwyraźniej algorytm zależy od kodowania i/lub zawartości.

Dla porównania, w C# i Javie znak ma stałą długość (dwa bajty), a czas dostępu do i-tego znaku łańcucha jest stały. Oczywiście wadą jest “marnotrastwo” pamięci, bo w praktyce większość znaków zajmuje 1 bajt.

Wracając do Rubiego – jest jeszcze jeden problem. Czas dostępu do pierwszego (s[1]) znaku rośnie wraz z rozmiarem łańcucha! Poniżej dowód:

# -*- encoding : utf-8 -*-

require 'benchmark'

s1 = "ąćęłńóśżź!0123456789"

puts Benchmark.measure {
  1000.times { k = s1[1] }
}

s2 = "ąćęłńóśżź!0123456789" * 100_000

puts Benchmark.measure {
  1000.times { k = s2[1] }
}
  0.000000   0.000000   0.000000 (  0.000366)
  2.010000   0.000000   2.010000 (  2.019083)

Podsumowując, dla Stringów UTF-8 czas dostępu do i-tego znaku łańcucha s rośnie wraz z i (pozycją) oraz s.size (długością łańcucha)…

Takie zachowanie jest bardzo nieintuicyjne i utrudnia wnioskowanie o złożoności obliczeniowej algorytmów.

Zaletą tego rozwiązania jest bardziej ekonomiczne zużycie pamięci.

Zalecenie praktyczne: nigdy nie iterować po znakach via s[i]. To zabójstwo CPU już nawet przy Stringach rzędu setek bajtów. Należy używać each_char, który jest zaimplementowany optymalnie na poziomie wskaźników w C. Iterator each_char pamięta adres ostatniego znaku, więc dla i+1 nie musi gonić od początku.

Pisane na szybko – uzupełnienia mile widziane.

]]>
http://thesingularity.pl/blog/2011/string-ruby-1-9-ma-liniowy-czas-dostepu/feed/ 2
Książki przeczytane przez Łobuza dziś mogą być Twoje! ;-) http://thesingularity.pl/blog/2011/ksiazki-przeczytane-przez-lobuza-dzis-moga-byc-twoje/ http://thesingularity.pl/blog/2011/ksiazki-przeczytane-przez-lobuza-dzis-moga-byc-twoje/#comments Mon, 17 Jan 2011 21:47:07 +0000 qertoip http://thesingularity.pl/blog/?p=4081 Continue reading ]]> Wystawiłem na allegro kilka perełek w symbolicznych (jak sądzę!) cenach. Nie są to pozycje super aktualne, ale za to w dużej mierze ponadczasowe. Tematyka: Ruby on Rails, systemy i sieci, wzorce projektowe, ekosystem XML.

Promocyjna wyprzedaż jest związana z przeprowadzką i kupnem iPada. Zmieniam lifestyle na 100% elektroniczny, panicznie pozbywając się papieru… Co się nie sprzeda, pójdzie do kosza.

Zapraszam do licytacji!

]]>
http://thesingularity.pl/blog/2011/ksiazki-przeczytane-przez-lobuza-dzis-moga-byc-twoje/feed/ 2
Facebook http://thesingularity.pl/blog/2011/facebook/ http://thesingularity.pl/blog/2011/facebook/#comments Fri, 14 Jan 2011 22:53:12 +0000 qertoip http://thesingularity.pl/blog/?p=4011 Naszła mnie taka refleksja. Facebook to niekończąca się impreza online. Ciągłe pierdolenie o Chopinie.

Get to fucken life!

]]>
http://thesingularity.pl/blog/2011/facebook/feed/ 0
Oferty pracy w językach funkcyjnych http://thesingularity.pl/blog/2011/oferty-pracy-w-jezykach-funkcyjnych/ http://thesingularity.pl/blog/2011/oferty-pracy-w-jezykach-funkcyjnych/#comments Thu, 06 Jan 2011 20:43:37 +0000 qertoip http://thesingularity.pl/blog/?p=3951 Continue reading ]]> Powstał serwis z ofertami pracy dla programistów, dedykowany językom funkcyjnym: http://functionaljobs.com

Potwierdza to tezę o rosnącym komercyjnym zainteresowaniu tym – od dziesięcioleci niedocenianym – paradygmatem. Cool!

PS Jeśli nie miałeś styczności z językami funkcyjnymi, a chciałbyś spróbować (a jest najwyższa pora…), dziś na topie jest Clojure.

]]>
http://thesingularity.pl/blog/2011/oferty-pracy-w-jezykach-funkcyjnych/feed/ 0
Rails 3 dodaje nowe helpery HTML5 http://thesingularity.pl/blog/2011/rails3-html5-helpery/ http://thesingularity.pl/blog/2011/rails3-html5-helpery/#comments Thu, 06 Jan 2011 20:30:50 +0000 qertoip http://thesingularity.pl/blog/?p=3881 Continue reading ]]> Mało znaną funkcją Rails 3 są nowe helpery formularzowe dla HTML5, których już dziś można bezpiecznie używać. Draft standardu wprowadza 13 nowych typów pól, z czego 6 zostało już pobłogosławionych przez Railsy:

f.email_field      # <input type="email"...
f.number_field     # <input type="number"...
f.range_field      # <input type="range"...
f.search_field     # <input type="search"...
f.phone_field      # <input type="tel"...
f.url_field        # <input type="url"...

Używa się ich zamiast wysłużonego:

f.text_field       # <input type="text"...

W starych przeglądarkach (w tym IE6) nowe typy <input> zostaną potraktowane jako zwykłe pole tekstowe. Nie są potrzebne żadne hacki ani obejścia.

Korzyść ze stosowania bardziej semantycznych pól polega na tym, że przeglądarki i urządzenia zaczynają specyficznie (lepiej) obsługiwać takie pola – np. walidują je (Opera) lub wyświetlą klawiaturę ekranową dedykowaną wpisywaniu e-maila czy URL-a (iPhone, iPad).

HTML5 oferuje też nowe atrybuty dla pól formularzy.

W notacji HAML-owej, atrybut :placeholder => “podpowiedź lub przykład” pozwala ustawić “bladą” treść pola, która znika przy wejściu (hint). Stare przeglądarki ten atrybut bezpiecznie pominą. Atrybut :autofocus => true przenosi kursor klawiatury do pola, w którym się znajduje.

Podsumowując, już dziś należy używać semantycznych pól formularzy i dodatkowych atrybutów. Praktycznie nie wymaga to dodatkowej pracy, a (rosnąca) część użytkowników będzie podświadomie zachwycona jakością aplikacji.

]]>
http://thesingularity.pl/blog/2011/rails3-html5-helpery/feed/ 2
Ruby on Rails – czy stawiamy na właściwego konia? http://thesingularity.pl/blog/2010/ruby-on-rails-czy-stawiamy-na-wlasciwego-konia/ http://thesingularity.pl/blog/2010/ruby-on-rails-czy-stawiamy-na-wlasciwego-konia/#comments Fri, 31 Dec 2010 11:46:50 +0000 qertoip http://thesingularity.pl/blog/?p=3791 Continue reading ]]>
"Ruby on Rails" Job Trends graph

Jeśli wierzyć indeed.com, “Ruby on Rails” pojawia się już w 1,5 promila światowych ofert pracy i wykazuje świetną dynamikę wzrostu! Co ciekawe, jednocześnie znacznie opadł początkowy (2006-2007) hype, mierzony via Google Trends.

Co o tym myślicie? Bo ja jestem jak najlepszej myśli! ;-)

]]>
http://thesingularity.pl/blog/2010/ruby-on-rails-czy-stawiamy-na-wlasciwego-konia/feed/ 2
Californication http://thesingularity.pl/blog/2010/californication/ http://thesingularity.pl/blog/2010/californication/#comments Tue, 28 Dec 2010 11:40:04 +0000 qertoip http://thesingularity.pl/blog/?p=3711 Wyciekły dwa odcinki czwartego sezonu Californication, najbardziej męskiego serialu ever: http://iitv.info/californication

A za kilka godzin spotkanie ze starymi kumplami ze studiów… Life’s good!

Do pełni szczęścia brakuje (zresztą jak zwykle) tylko jednego. Ruchania, na które dziś się nie zanosi. Anyway ;>

]]>
http://thesingularity.pl/blog/2010/californication/feed/ 0
Calc – the Ruby mathematical expressions evaluator http://thesingularity.pl/blog/2010/ruby-calculator/ http://thesingularity.pl/blog/2010/ruby-calculator/#comments Sun, 26 Dec 2010 11:00:12 +0000 qertoip http://thesingularity.pl/blog/?p=3631 Continue reading ]]> Want to allow users to enter numbers OR expressions in your app? Welcome Calc, the Ruby calculator library.

Although Calc is general purpose gem, it plays well with typical Rails flow, where you assign values from the request parameters and do the validation in models. Calc strictly sanitizes and evaluates supplied expression and returns a number. If the expression is invalid, it is returned verbatim as String, so your :numericality, :presence, etc. validations can take care of it.

require 'calc'

Calc.evaluate( "2 * (1 + 9)" )  # => 20

Calc.evaluate( "raise 'I am evil code injection'" )  # => "raise 'I am evil code injection'"

Calc.evaluate( nil )  # => nil

Calc is small, dependency free, pure Ruby gem hosted on github:


gem install calc
]]>
http://thesingularity.pl/blog/2010/ruby-calculator/feed/ 0
Diaspora – Rails 3 killer app? http://thesingularity.pl/blog/2010/diaspora-rails-3-killer-app/ http://thesingularity.pl/blog/2010/diaspora-rails-3-killer-app/#comments Sat, 11 Dec 2010 12:51:21 +0000 qertoip http://thesingularity.pl/blog/?p=3591 Continue reading ]]> Diaspora to próba zamachu na facebooka, o której robi się powoli głośno. Dostrzeżona przez Techcrunch, otwarta sieć społecznościowa skupiająca się na prywatności i bezpieczeństwie użytkowników, obecnie działa jako zamknięta alpha. Kod źródłowy jest dostępny githubie.

Co ciekawe, Diaspora napisana jest w Rails 3! I choć próba atakowania facebooka zakrawa na szaleństwo, warto trzymać kciuki. Internet jest nieprzewidywalny i wiele już razy Dawid zaciukał Goliata.

]]>
http://thesingularity.pl/blog/2010/diaspora-rails-3-killer-app/feed/ 2
Ruby 1.9.2 szybki jak PHP http://thesingularity.pl/blog/2010/ruby-1-9-2-szybki-jak-php/ http://thesingularity.pl/blog/2010/ruby-1-9-2-szybki-jak-php/#comments Wed, 08 Dec 2010 22:13:10 +0000 qertoip http://thesingularity.pl/blog/?p=3541 Continue reading ]]> Ruby 1.9.2 ma bardzo podobną charakterystykę zużycia zasobów (CPU i RAM) do PHP według porównania Computer Language Benchmarks Game (bodaj najbardziej miarodajnego i prestiżowego z sytentycznych benchmarków).

Ruby 1.9.2 jest jednocześnie istotnie wolniejszy od Pythona – średnio 1.5 raza, natomiast pamięci zużywa podobne ilości.

Nowy Ruby jest niemal dwukrotnie szybszy od swojego poprzednika, powszechnie panującego 1.8.7 (przy tym samym zużyciu pamięci).

To są bardzo pomyślne wyniki. A przede wszystkim, wreszcie jest stabilny i gotowy na produkcję.

]]>
http://thesingularity.pl/blog/2010/ruby-1-9-2-szybki-jak-php/feed/ 4
Highcharts.js – najbardziej zajebiste wykresy bez Flasha http://thesingularity.pl/blog/2010/highcharts-js-najbardziej-zajebiste-wykresy-bez-flasha/ http://thesingularity.pl/blog/2010/highcharts-js-najbardziej-zajebiste-wykresy-bez-flasha/#comments Sun, 28 Nov 2010 20:47:47 +0000 qertoip http://thesingularity.pl/blog/?p=3461 Continue reading ]]> Flash popadł w niełaskę. Dziś już nawet interaktywnych wykresów nie robi się we Flashu. Ale czy alternatywne technologie dają radę? Highcharts.js udowadnia, że tak.

Highcharts.js to biblioteka (czysty JS) do generowania interaktywnych, animowanych wykresów line, pie, bars itp. Wykorzystuje SVG, a w IE<9 VML. To co ją wyróżnia, to niespotykana jakość wykonania, w szczególności:

  • Niezawodność! Po prostu działa. Od IE po iPada.
  • Bardzo inteligentne zachowanie i wartości domyślne.
  • Świetna dokumentacja i przykłady.
  • Estetyka wykresów.
  • Obsługa niemal wszystkiego, czego oczekiwałbyś od wykresów.
  • Niezła wydajność nawet pod IE.

Oczywiście jest pewien szkopuł – tak dopracowana biblioteka nie ma prawa być całkowicie darmowa. Niemniej do zastosowań niekomercyjnych można z niej korzystać bez ograniczeń (wersja pełna do ściągnięcia z oficjalnej strony).

Przy Highcharts, Raphael i jego wtyczki ssą pałkę! Niby Raphael daje nieograniczone możliwości, ale w praktyce wszystko trzeba w nim nadłubać od zera. Istniejące wtyczki i przykłady to tylko proof-of-concept, a nie dojrzałe rozwiązania jakiejkolwiek funkcjonalności, o czym przekonałem się na własnej skórze.

z niej
]]>
http://thesingularity.pl/blog/2010/highcharts-js-najbardziej-zajebiste-wykresy-bez-flasha/feed/ 5
BudzikParty i zdarte gardło :-) http://thesingularity.pl/blog/2010/budzikparty-i-zdarte-gardlo/ http://thesingularity.pl/blog/2010/budzikparty-i-zdarte-gardlo/#comments Sat, 13 Nov 2010 11:20:50 +0000 qertoip http://thesingularity.pl/blog/?p=3391 Continue reading ]]> Nękany przez anginę i bolące gardło udałem się na BudzikParty w Przechyłach. Bo na tej imprezie nie można było się niepojawić.

Na wszelki wypadek przyjechałem autem, żeby nie dobić stanu zdrowia chlaniem.

Tradycyjnie w Przechyłach muzyka napierdalała głośno nie do zniesienia, czyniąc rozmowę możliwą tylko poprzez krzyczenie do ucha. Dziś napierdala gardło… – podwójnie. Nienawidzę tych żeglarskich przyśpiewek.

Mimo muzyki integracja toczyła się tak dobrze, że zostałem o 3h dłużej niż planowałem. Było jakoś wyjątkowo.

Jacek zebrał tłumy. Momentami wydawało mi się, że na imprezie pożegnalnej Jacka zebrało się więcej osób niż na (bezpłatnych) imprezach firmowych!

W szczególności, bardzo licznie dopisały osoby, które pożegnały się z firmą dawno temu.

Good luck in your future endeavors!

]]>
http://thesingularity.pl/blog/2010/budzikparty-i-zdarte-gardlo/feed/ 0
Słowniczek Ruby – Polski http://thesingularity.pl/blog/2010/slowniczek-ruby-polski/ http://thesingularity.pl/blog/2010/slowniczek-ruby-polski/#comments Sun, 31 Oct 2010 23:33:42 +0000 qertoip http://thesingularity.pl/blog/?p=3001 Continue reading ]]> Jeśli zawsze chciałeś wiedzieć, co znaczy “tainted”, “singleton class” i “mixin”, teraz możesz o tym szybko przeczytać po polsku. Słowniczek umożliwi Ci, mam nadzieję, lepsze zrozumienie zaawansowanych pojęć Rubiego i da kompetencje do szpanowania przed niewykształconymi kolegami ;>

Słowniczek powstał przy okazji lektury “Metaprogramming Ruby”. Na marginesie, to świetna książka. Pozwala dogłębnie obczaić szeroko rozumiane metaprogramowanie. W dodatku, jak na złożoność tematu, całkiem lekko się ją czyta. Ale, do rzeczy!

Indeks:

-

Argument Array – tablica zawierająca argumenty wywołania metody. Występuje przy metodach, którę akceptują zmienną liczbę argumentów. Tablicę poprzedza się gwiazdką (*args).

def apply(operation, *args)
  eval( args.join(operation.to_s) )
end

puts apply( :*, 2, 3, 5 ) # => 30
-

Around Alias – “aspektowe” owinięcie istniejącej metody dodatkową funkcjonalnością. Ma to sens, gdy nie możemy lub nie chcemy bezpośrednio modyfikować biblioteki. W ten sposób można dodać się np. logowanie, asercje, sprawdzanie poprawności atrybutów, ostrzeżenia o deprekacji. Technika polega na przedefiniowaniu metody, przy czym nowa definicja nie powiela kodu starej metody, lecz wywołuje ją. To wywołanie jest możliwe dzięki “uratowaniu” starej wersji pod nowym aliasem.

class String
  alias_method :original_reverse, :reverse

  def reverse
    logger.info( "Reversing a String" )
    original_reverse
  end
end
-

Bank Slate – klasa bez metod. Usunięcie z klasy (niemal) wszystkich metod (odziedziczonych z Object). Po co? Żeby użyć w niej method_missing bez ryzyka, że dojdzie do kolizji z Ghost Methods, czyli “metodami-duchami”.

class C
 def method_missing(name, *args)
   "metoda duch"
 end

 instance_methods.each do |m|
   undef_method m unless m.to_s =~ /method_missing|respond_to?|^__/
 end
end

puts C.new.to_s   # => "metoda duch"
-

Class Extension – rozszerzenie klasy o nowe metody klasowe. Technicznie jest to robione poprzez włączenie modułu do Singleton Classy tej klasy. Jak wiemy, każdy obiekt w Ruby, także klasa, która jest obiektem klasy Class, ma swoją osobistą klasę (zwaną Singleton Class, Eigenclass).

module M
  def m
    "metoda klasowa"
  end
end

class C
  extend M
end

puts C.m  # => "metoda klasowa"
-

Class Macro – kod wewnątrz definicji klasy, który generuje dynamicznie część jej definicji.

class Star
  attr_accessor :name  # class macro generujące gettera i settera
end
-

Clean Room – wykonanie bloku wewnątrz instance_eval tylko po to, żeby uzyskać czysty zasięg (nie robić tego w bieżącym) i ewentualnie skorzystać z metod pomocniczych zdefiniowanych w czystym pokoju. Używane głównie do tego, żeby nie zaśmiecać globalnej przestrzeni nazw przy DSL-ach. Metody DSL-i są często globalne (Kernel Methods), natomiast dane na których operują są zamknięte w CleanRoom.

class CleanRoom
  def complex_computation
    # ...
  end
end

CleanRoom.new.instance_eval { complex_computation }
-

Context Probe – włamanie się do innego (normalnie niedostępnego) zasięgu, umożliwiające m.in. odczytywanie i zmianę jego prywatnych rzeczy. Robi się to poprzez obj.instance_eval{}, które zmienia bieżący self na obiekt obj.

"ala ma kota".instance_eval { @x = 2 }
-

Dynamic – “podczas wykonania programu”. Np. “dynamiczne typowanie” == “typowanie podczas wykonania programu”.

-

Dynamic Dispatch – wywołanie metody przez send(:metoda). Cel: uzależnienie nazwy metody od faktów znanych dopiero podczas wykonania programu.

s = "Hello World"
puts "Co zrobic z napisem '#{s}'?"
method = gets.strip
puts s.send( method )
-

Dynamic Method – zdefiniowanie metody przez define_method(:metoda){}. Cel: uzależnienie definicji od faktów znanych dopiero podczas wykonania programu.

class C
  define_method :my_method do
    "dynamiczna metoda"
  end
end

C.new.my_method  # => "dynamiczna metoda"
-

Ghost Method – metoda duch. Choć działa jak każda inna, nie posiada formalnej definicji (ani via def, ani via define_method). Technicznie implementuje się je przez obsługę callbacka method_missing. Cel: auto-generowanie metod wedle potrzeb, np. na podstawie bazy danych (jak find_by_* w ActiveRecord) czy na podstawie zewnętrznego API (zapisanego np. w WSDL). Innymi słowy, method_missing umożliwia Ci stworzenie niezwykle adaptywnego API.

class C
  def method_missing(name, *args)
    name.to_s.upcase
  end
end

C.new.metoda_duch # => METODA_DUCH
-

Open Classes – otwarte klasy. Właściwość Rubiego polegająca na tym, że już zdefiniowaną klasę można ponownie otworzyć i zmienić/uzupełnić. Dotyczy to także klas z biblioteki standardowej, łącznie z Object i String. Cel: czysty model obiektowy. Jeśli uważasz, że najwłaściwszym miejscem dla Twojej nowej metody “to_latin” jest klasa String, to Ruby Ci to umożliwia. W większości języków obiektowych konieczne byłoby użycie np. StringUtils.to_latin(s) co jest nieobiektowe, lub odziedziczenie MyString, co jest niewygodne, bo wszystko trzeba wtedy owijać w MyString. A w Ruby:

class String
  def to_latin; end
end
-

Mixin – moduł przeznaczony do włączenia do klasy. Alternatywny dla dziedziczenia sposób współdzielenia metod pomiędzy klasami. Mixin dodaje do klasy metody instancji i/lub klasowe. Do klasy można włączyć dowolną liczbę modułów (mixins), wzbogacając ją o kolejne “prostopadłe” funkcjonalności, np. walidację atrybutów, logowanie wywołań, API serializacji, itp.

Pełny design pattern wygląda tak:

module M
 def self.included(base)
   base.extend(ClassMethods)
 end

 def metoda_instancji
   puts "metoda instancji"
 end

 module ClassMethods
   def metoda_klasowa
     puts "metoda klasowa"
   end
 end
end

class C
 include M
end
-

Scope Gate – brama do nowego zasięgu zmiennych. Nowy zasięg zmiennych oznacza utratę dostępu do poprzedniego. Taką bramą są dokładnie 4 słowa kluczowe: class, module, def, end. Zauważmy, że bloki (do..end, {}) nie wprowadzają nowego zasięgu. Bloki wykonywane są w zasięgu, w którym są zapisane, czyli mają dostęp do wszystkich identyfikatorów tego zasięgu.

-

Singleton Class (Eigenclass) – anonimowa klasa, która ma dokładnie jedną instancję, wewnętrznie tworzona i zarządzana przez Rubiego. Na co dzień niewidoczna dla programisty. Np. “tekst” pozornie jest klasy String, ale ściśle rzecz biorąc, jest instancją anonimowej klasy dziedziczącej ze String. Taki design modelu obiektowego umożliwia dodawanie metod punktowo do wybranego obiektu (Singleton Methods) – te metody dodawane są oczywiście do jego osobistej Singleton Classy. Istnieje specjalna składnia pozwalająca dobrać się do Singleton Classy obiektu:


s = "liberty"
class << s
  def osobista_metoda_obiektu_s
    puts self + "!"
  end
end

s.osobista_metoda_obiektu_s()  # => "liberty!"
-

Singleton Method – metoda przypięta do pojedynczego obiektu. Inne obiekty – nawet tej samej klasy – nie zyskają tej metody. Technicznie jest to realizowane tak, że Ruby tworzy “osobistą”, anonimową klasę dla tego obiektu (zwaną Singleton Class lub Eigenclass), dziedziczącą z jego “normalnej” klasy, i do niej dodaje Singleton Method. Przykład zastosowania: to, co na co dzień postrzegamy jako “metody klasowe”, w rzeczywistości jest metodami instancji Singleton Classy obiektu reprezentującego klasę. Wiem, zakręcone, ale jak już się zrozumie – piękne!

s = "thou art slain"
def s.multiply(v)
  s * v
end

s.multiply(3) # "thou art slain thou art slain thou art slain"
-

Tainted Object – obiekt niezaufany (dosłownie: “plugawy”). Jako niezaufane Ruby automatycznie oznacza wszystkie obiekty pochodzące z zewnątrz (np. z IO i zmienne środowiskowe). Domyślnie nie ma to żadnego znaczenia. Natomiast po ustawieniu poziomu bezpieczeństwa na wyższy, Ruby dopilnuje, żeby niebezpieczne operacje nie były wykonane na niezaufanych obiektach.

$SAFE = 1
s = gets()
eval(s)  # => Insecure operation - eval (SecurityError)

Podsumowanie

Słowniczek z natury nie tłumaczy wszystkich zawiłości tych trudnych pojęć, a jedynie zagaja tematy. Niemniej, jeśli coś jest niezrozumiałe lub wymaga uzupełnienia, proszę o uwagi!

]]>
http://thesingularity.pl/blog/2010/slowniczek-ruby-polski/feed/ 4
Ranking najważniejszych czynników SEO http://thesingularity.pl/blog/2010/ranking-najwazniejszych-czynnikow-seo/ http://thesingularity.pl/blog/2010/ranking-najwazniejszych-czynnikow-seo/#comments Sun, 31 Oct 2010 19:37:32 +0000 qertoip http://thesingularity.pl/blog/?p=2951 Continue reading ]]> Ranking najważniejszych czynników SEO według ekspertów: http://www.seomoz.org/article/search-ranking-factors

Lista (po wejściu głębiej) zawiera ponad 100 czynników decydujących o pozycji Twojej strony, podzielonych na 10 kategorii, z przypisanymi wagami. Ranking powstał na podstawie ankiety przeprowadzonej wśród speców od SEO. Wagi są oczywiście szacunkowe – przede wszystkim warto w ogóle znać listę rzeczy na które trzeba brać poprawkę.

]]>
http://thesingularity.pl/blog/2010/ranking-najwazniejszych-czynnikow-seo/feed/ 0
HP Slate 500 – porażka? http://thesingularity.pl/blog/2010/hp-slate-500-porazka/ http://thesingularity.pl/blog/2010/hp-slate-500-porazka/#comments Sun, 24 Oct 2010 09:07:39 +0000 qertoip http://thesingularity.pl/blog/?p=2871 Continue reading ]]> Dwa dni temu wyszedł HP Slate 500, czyli taki iPad Hewlett- Packarda oparty o Windows 7. Oficjalna reklama produktu nie zachęca. Typowo dla produktów konkurencji, Slate jest znacznie mocniejszy sprzętowo od iPada (ma Atoma 1.86GHz, 2GB RAM, 64GB SSD, kamerę, aparat, USB) – i niewiele z tego wynika, bo jak zauważył playr, tablet tnie się nawet w swojej reklamie ;> Jest też cholernie gruby i de facto wymaga rysika. Za chwilę mamy 2011 rok, na dzisiejsze standardy to jest fail.

]]>
http://thesingularity.pl/blog/2010/hp-slate-500-porazka/feed/ 1
Dlaczego moi najciekawsi koledzy nie prowadzą blogów?! http://thesingularity.pl/blog/2010/dlaczego-moi-najciekawsi-koledzy-nie-prowadza-blogow/ http://thesingularity.pl/blog/2010/dlaczego-moi-najciekawsi-koledzy-nie-prowadza-blogow/#comments Wed, 20 Oct 2010 19:53:13 +0000 qertoip http://thesingularity.pl/blog/?p=2791 Co się nie spotkamy, to wychodzą zakręcone i inspirujące lifestyle’owe historie. Już wy łobuzy wiecie, że o Was chodzi ;>

To jak? Może na początek mały blipik? ;> Jeśli nie dla przyjaciół, piszcie dla wnuków, u licha!

]]>
http://thesingularity.pl/blog/2010/dlaczego-moi-najciekawsi-koledzy-nie-prowadza-blogow/feed/ 1
Nie będę pisał! http://thesingularity.pl/blog/2010/nie-bede-pisal/ http://thesingularity.pl/blog/2010/nie-bede-pisal/#comments Mon, 18 Oct 2010 19:56:23 +0000 qertoip http://thesingularity.pl/blog/?p=2641 Continue reading ]]> Dopóki Google nie raczy dostrzec mojej nowej inicjatywy TheSingularity.pl i wszystkich treści tam zgromadzonych, ogłaszam strajk redaktorski ;) Nie będę pisał bloga!

Boty Google’a błąkają się po moim serwisie jak oszalałe (co ilustruje webmaster tools), ale do indeksu większości stron jeszcze nie dodały… Come on, suckers!

]]>
http://thesingularity.pl/blog/2010/nie-bede-pisal/feed/ 2
iPad 3.2.2 jailbreak http://thesingularity.pl/blog/2010/ipad-3-2-2-jailbreak/ http://thesingularity.pl/blog/2010/ipad-3-2-2-jailbreak/#comments Sun, 17 Oct 2010 17:42:41 +0000 qertoip http://thesingularity.pl/blog/?p=2551 Continue reading ]]> Dostępne są dwa różne jailbreaki, które radzą sobie z tabletem iPad 3.2.2. Pierwszy to greenpois0n produkcji Chronic Dev Team, drugi to limera1n geohota. Zajmiemy się greenpois0n, ponieważ jest nieco łatwiejszy w obsłudze i zadziałał z moim nowym iPad’em (MB292B), z którym nie radził sobie limera1n.

Greenpois0n jest dostępny na Windows, Maca, i Linuksa. Instrukcja załączona jest w samym GUI i sprowadza się do tego, żeby w odpowiednim momencie naciskać i zwalniać przyciski Home (kwadracik) i Sleep (na brzegu u góry obudowy).

Kluczowe sprawy (mało oczywiste!):

  • Po podłączeniu do komputera iPada należy wyłączyć (czyli dłuuugie trzymanie klawisza Sleep potwierdzone przesunięciem suwaczka “power off”). Nie wystarczy uśpić (krótkie naciśnięcie Sleep).
  • Po zniknięciu komunikatów o naciskaniu przycisków, należy cały czas trzymać Home aż do samego końca procedury!
  • Zanim przystąpisz do jailbreak’owania, wyłącz w iTunes opcję auto-uruchamiania przy podłączeniu urządzenia, a następnie zamknij sam iTunes. Na wszelki wypadek – lepiej żeby dwie aplikacje na raz nie grzebały w iPadzie.
  • Jeśli coś pomieszasz, iPad najczęściej wyląduje w trybie DFU (Device Firmware Upgrade), czyli będzie prosił o podłączenie do iTunes i generalny reset (nie będzie dał się uruchomić). Nie bój nic! Wyłącz go i ponownie spróbuj jailbreaka (aż do skutku).

Powodzenia! Pls o szybki komentarz poniżej, czy u Ciebie też zadziałało!

]]>
http://thesingularity.pl/blog/2010/ipad-3-2-2-jailbreak/feed/ 1
Wyszedł limera1n na Maca http://thesingularity.pl/blog/2010/wyszedl-limera1n-na-maca/ http://thesingularity.pl/blog/2010/wyszedl-limera1n-na-maca/#comments Fri, 15 Oct 2010 06:08:22 +0000 qertoip http://thesingularity.pl/blog/?p=2491 Wyszedł limera1n na Maca: http://limera1n.com. A tutaj mój raport ze skutecznego jailbreak’a iPhone’a 3GS 4.1.

]]>
http://thesingularity.pl/blog/2010/wyszedl-limera1n-na-maca/feed/ 0
Nie chcę k**** zwiedzać! http://thesingularity.pl/blog/2010/nie-chce-zwiedzac/ http://thesingularity.pl/blog/2010/nie-chce-zwiedzac/#comments Thu, 14 Oct 2010 21:25:59 +0000 qertoip http://thesingularity.pl/blog/?p=2341 Continue reading ]]> Znów dziewczyna ciągnie mnie na jakieś kulturalne zwiedzanie chuj wie czego ze znajomymi.

A ja nie chcę. Nie chcę i już! Ostatnio przewodnikiem był jakiś marny aktor porno. Dam sobie głowę uciąć, bo jego dialogi były właśnie tak rozbudowane i kwieciste.

Dopiero co byłem w teatrze, a niedługo znowu idę, bo będzie premiera Notre Dame de Paris, którego jestem wielbicielem. I to już może być śmiertelna dawka kultury i sztuki. Więc starczy tego, niedzielne zwiedzanie odpada. Chodźmy na basen!

]]>
http://thesingularity.pl/blog/2010/nie-chce-zwiedzac/feed/ 6
Udany jailbreak iPhone 3GS iOS 4.1 via limera1n – raport http://thesingularity.pl/blog/2010/udany-jailbreak-iphone-3gs-ios-4-1-via-limera1n-raport/ http://thesingularity.pl/blog/2010/udany-jailbreak-iphone-3gs-ios-4-1-via-limera1n-raport/#comments Wed, 13 Oct 2010 19:50:12 +0000 qertoip http://thesingularity.pl/blog/?p=2081 Continue reading ]]> Raport z udanego jailbreak’a przy pomocy limera1n. Sytuacja wyjściowa: iPhone 3GS 16GB, iOS 3.1.2, model MC131PL, numer seryjny 88002M463NP, jailbreak’owany via blackra1n, iTunes 9.2.

Trzy kroki do szczęścia:

  1. Upgrade iTunes do 10.0.1.22, via iTunes, bezproblemowo. iTunes nie pozwala upgrade’ować iPhone’a do 4.1 zanim samo nie zaktualizuje się do najnowszej wersji, więc jest to krok konieczny.
  2. Upgrade iOS do 4.1 via iTunes, bezproblemowo. Później iTunes profilaktycznie wyłączyłem.
  3. Jailbreak via limera1n RC1, bezproblemowo… choć trwał dość długo! Traciłem już nadzieję, trzymając jednak dzielnie przycisk Home, który trzyma się wciśnięty niemal przez cały proces – i udało się. Na koniec iPhone sam się wyłącza. Trzeba go ręcznie włączyć. Pojawia się aplikacja limera1n, która umożliwia instalację Cydii via WiFi. Co ciekawe, Cydia nie chciała się zainstalować przez 3G.

Testy (niezbędne zanim nastąpi euforia!)

  1. Internet – okazuje się, że nie działa ani Edge, ani 3G. Skasowały się ustawienia APN i winny jest  limera1n bo wydaje mi się, że po samym upgrade to działało, choć to działo się tak szybko… Mam kartę w Play’u, więc ustawiłem APN na “internet”, zresetowałem 3G (off/on) i wszystko wróciło do normy.
  2. Test multitaskingu (2 x Home) – pomyślnie.
  3. Test Cydii: instalacja SBS Settings – pomyślnie.
  4. Test synchronizacji iTunes – pomyślnie!

I już cieszę się jak dziecko!!! ;>

PS Warto zrobić restart, urządzenie przyspiesza.

]]>
http://thesingularity.pl/blog/2010/udany-jailbreak-iphone-3gs-ios-4-1-via-limera1n-raport/feed/ 2
Synchronizacja kontaktów iPhone, iPad z Google – rozwiązanie problemu zgubionych numerów http://thesingularity.pl/blog/2010/synchronizacja-kontaktow-iphone-ipad-z-google-rozwiazanie-problemu-zgubionych-numerow/ http://thesingularity.pl/blog/2010/synchronizacja-kontaktow-iphone-ipad-z-google-rozwiazanie-problemu-zgubionych-numerow/#comments Mon, 11 Oct 2010 18:42:44 +0000 qertoip http://thesingularity.pl/blog/?p=1931 Continue reading ]]> Przy imporcie kontaktów z Google do iPhone’a lub iPada via Exchange część numerów telefonów jest gubiona. Usuwanie kontaktów z iPhone’a (blank slate) i ponowne próby nie pomagają. Po krótkiej walce znalazłem skuteczne obejście tego błędu: Okazuje się, że nie są importowane telefony o typie “inne”. Żeby rozwiązać problem, zaloguj się do GMaila i zmień każdy “inny” typ telefonu n.p. na “komórka”. Po tej operacji ponownie wejdź w ustawienia iPhone’a, konto Exchange, wyłącz i włącz synchronizację kontaktów (potwierdź usunięcie z iPhone’a).

]]>
http://thesingularity.pl/blog/2010/synchronizacja-kontaktow-iphone-ipad-z-google-rozwiazanie-problemu-zgubionych-numerow/feed/ 0
Ruby – przepinanie metody pomiędzy obiektami http://thesingularity.pl/blog/2010/ruby-przepinanie-metody-pomiedzy-obiektami/ http://thesingularity.pl/blog/2010/ruby-przepinanie-metody-pomiedzy-obiektami/#comments Fri, 08 Oct 2010 21:24:44 +0000 qertoip http://thesingularity.pl/blog/?p=71 Continue reading ]]> Już dzieci wiedzą, że w Ruby wszystko – nawet metoda – jest obiektem. Nie wszyscy jednak zdają sobie sprawę, że metodę można od obiektu odczepić (UnboundMethod), pobawić się nią, a następnie przypiąć do innego tej samej klasy:

s1 = "obiekt s1"
instance_method = s1.method( :upcase )
unbound_method = instance_method.unbind
puts unbound_method.arity # 0
s2 = "obiekt s2"
instance_method = unbound_method.bind( s2 )
instance_method.call()  # => OBIEKT S2

Szkoda tylko, że nie ma to żadnego praktycznego zastosowania ;-)

]]>
http://thesingularity.pl/blog/2010/ruby-przepinanie-metody-pomiedzy-obiektami/feed/ 0
iPad – znalazłem dobry i tani pokrowiec http://thesingularity.pl/blog/2010/ipad-dobry-tani-pokrowiec/ http://thesingularity.pl/blog/2010/ipad-dobry-tani-pokrowiec/#comments Fri, 08 Oct 2010 21:02:34 +0000 qertoip http://thesingularity.pl/blog/?p=81 Continue reading ]]> Po dłuższym badaniu przeprowadzonym na terenie Allegro i MediaMarkt nabyłem etui (pokrowiec) dla iPada. Pokrowiec ma postać czarnej kieszeń zapinanej na rzepa. Jest wyścielony 1cm pianki. Wymiary nieco większe niż iPad. Tablet siedzi w pokrowcu pewnie i bezpiecznie, może to się walać w plecaku. Ile kosztował i gdzie go kupić?

Koszt to 18.90 + przesyłka. Oczywiście etui NIE jest dedykowane iPadowi (wtedy kosztowałoby 70-300zł), tylko netbookom 8-12”.

Nabyłem na tej aukcji (nie jestem związany ze sprzedawcą):

http://allegro.pl/pokrowiec-na-notebooka-laptopa-8-12-producent-i1248507924.html

]]>
http://thesingularity.pl/blog/2010/ipad-dobry-tani-pokrowiec/feed/ 2
IPSW 4.0.1 dla iPhone 4, 3GS, 3G – download z apple.com http://thesingularity.pl/blog/2010/ipsw-401-dla-iphone-4-3gs-3g-download-z-applecom/ http://thesingularity.pl/blog/2010/ipsw-401-dla-iphone-4-3gs-3g-download-z-applecom/#comments Wed, 06 Oct 2010 20:38:36 +0000 qertoip http://thesingularity.pl/blog/?p=91 Continue reading ]]> iOS 4.0.1 to najnowszy mobilny system operacyjny Apple, do którego istnieje sprawdzony jailbreak (6 października 2010). Aby zainstalować ten system na swoim iPhonie, musisz posiadać plik IPSW. Najbezpieczniej jest ściągnać go z oficjalnej strony Apple: ]]> http://thesingularity.pl/blog/2010/ipsw-401-dla-iphone-4-3gs-3g-download-z-applecom/feed/ 0 Apple MobileMe ssie pałkę, bo kosztuje 100$ http://thesingularity.pl/blog/2010/apple-mobileme-ssie-palke-bo-kosztuje-100/ http://thesingularity.pl/blog/2010/apple-mobileme-ssie-palke-bo-kosztuje-100/#comments Wed, 06 Oct 2010 19:51:04 +0000 qertoip http://thesingularity.pl/blog/?p=101 MobileMe to synchronizacja poczty, kontaktów, notatek i kalendarza pomiędzy urządzeniami Apple (iPod, iPhone, iPad, MacBook) poprzez chmurę Steve'a. Bez kabli, bez iTunes. Wszystko pięknie, tylko, że kasują za to 100$ rocznie. Dziękuję, nie skorzystam.

]]>
http://thesingularity.pl/blog/2010/apple-mobileme-ssie-palke-bo-kosztuje-100/feed/ 0
iPad cena http://thesingularity.pl/blog/2010/ipad-cena/ http://thesingularity.pl/blog/2010/ipad-cena/#comments Tue, 05 Oct 2010 22:16:10 +0000 qertoip http://thesingularity.pl/blog/?p=111 Continue reading ]]> Gdzie najtaniej kupić iPada? Najniższe ceny są na Allegro u prywatnych sprzedawców (malutkie firmy, osobisty import z UK i USA). Okazyjnie kupiłem iPada WiFi 16GB za 2000zł. Był to najtańszy sprzedawca tego modelu wśród posiadających towar w Polsce.

Oficjalna cena na Allegro u tego sprzedawcy wynosiła 2100zł, po telefonie zgodził się opuścić jeszcze o 100zł. Odbiór osobisty w Warszawie, model oczywiście nowy i z gwarancją europejską.

]]>
http://thesingularity.pl/blog/2010/ipad-cena/feed/ 0
iPad: jak usunąć białą ikonkę-ducha “Waiting”? http://thesingularity.pl/blog/2010/ipad-jak-usunac-biala-ikonke-ducha-waiting/ http://thesingularity.pl/blog/2010/ipad-jak-usunac-biala-ikonke-ducha-waiting/#comments Tue, 05 Oct 2010 20:18:46 +0000 qertoip http://thesingularity.pl/blog/?p=121 Continue reading ]]> Nagle z dupy pojawiła się na moim pulpicie biała ikonka “Waiting” z pustym paskiem postępu i trwa to już dziesiątki minut. Jak się jej pozbyć?

Okazuje się, że problem jest znany. Wystarczy wyłączyć (całkowicie, tzn. przytrzymać długo on/off i potwierdzić power down) i włączyć iPada ponownie.

Reset jest penicyliną informatyki.

]]>
http://thesingularity.pl/blog/2010/ipad-jak-usunac-biala-ikonke-ducha-waiting/feed/ 0
Śluby Panieńskie – chamska recenzja laika http://thesingularity.pl/blog/2010/sluby-panienskie-recenzja/ http://thesingularity.pl/blog/2010/sluby-panienskie-recenzja/#comments Tue, 05 Oct 2010 19:32:01 +0000 qertoip http://thesingularity.pl/blog/?p=131 Continue reading ]]> Nie wiem, czy to wina reżysera, czy samego Fredry, ale śmieszne momenty w całym filmie można policzyć na palcach jednej ręki. Ręki inwalidy, który stracił palce.Spora część dialogów była niezrozumiała. Być może to wina nagłośnienia w Teatrze Polskim, gdzie odbywała się premiera, a być może samej szybkości wymowy w połączeniu ze staropolszczyzną.

Wymiotować się chce na widok Albina, który jak ostatnia cipa próbuje uwieść Klarę, spełniając jej wszystkie zachcianki i płaszcząc się u stóp. A najgorsze, że na końcu mu się udaje. Lepiej prezentuje się już Gustaw, mieszający w głowie Anieli. Po wstępnych niepowodzeniach, Gustaw zaczyna stosować technikę dwuznaczności, która stopniowo przepala neurony uroczej niewiasty.

Ale starczy już o tym nudnym filmie. Warto wspomnieć o samej oprawie premiery – a ta była iście zajebista. Teatr, Karaś, aktorzy, śmietanka, drinki, telewizja, czerwone dywany i puszczająca oko Weronika Rosati. Dla oprawy warto było wytrzymać film :-)

]]>
http://thesingularity.pl/blog/2010/sluby-panienskie-recenzja/feed/ 1
iPad w komunikacji miejskiej – recenzja http://thesingularity.pl/blog/2010/ipad-w-komunikacji-miejskiej-recenzja/ http://thesingularity.pl/blog/2010/ipad-w-komunikacji-miejskiej-recenzja/#comments Tue, 05 Oct 2010 19:07:05 +0000 qertoip http://thesingularity.pl/blog/?p=141 Continue reading ]]> W ciągu ostatnich kilku dni w komunikacji miejskiej przeczytałem 40 stron książki “Metaprogramming Ruby” z iPada. Spostrzeżenia:

  • Ludzie zerkają “ki diabeł?” Co piątą osobę iPad hipnotyzuje i będzie się gapiła aż wysiądziesz.
  • Komfort czytania jest nie do opisania. Ekran jasny, kontrastowy, soczysty. Litery większe niż w książce (bo iPad jest większy od typowej książki, a po za tym tekst zbliża się ucinając marginesy). Fantastyczna jasność ekranu ma znaczenie zwłaszcza w słabo oświetlonych przedziałach pociągu.
  • Czytanie jest możliwe w małym i średnim tłoku. W dużym tłoku ryzyko niebezpiecznie rośnie, bo na iPada zostaje tylko jedna ręka, a do tego urządzenia – w przeciwieństwie do iPhona – trzeba dysponować dwoma wolnymi  łapkami.
  • Bateria miło zaskakuje, w sumie nie miałem jeszcze okazji jej wyczerpać, można śmiało założyć że wytrzyma długie godziny wszelkiego rodzaju zabawy, czytania, surfowania.
  • Nie ma problemów z czytaniem ze zrozumieniem. Bajery nie rozpraszają, można się skupić.
  • Częstemu wyjmowaniu i chowaniu urządzenia pomiędzy środkami transportu towarzyszy strach uszkodzenia. iPhonowi też kiedyś towarzyszył a teraz bawię się nim swobodnie; mam nadzieję że tu będzie podobnie.
  • Domyślny (wbudowany) czytnik PDF-ów ssie pałkę. Często zapomina, na której stronie skończyłem czytać. Czas poszukać alternatyw, a jest z czego wybierać.

Podsumowując, eksperyment wypalił. Nie tylko “da się” używać iPada w komunikacji miejskiej, ale jest to całkiem praktyczne i nie widzę przeszkód żeby robić to na stałe. Niech no tylko sprawię sobie jakiś sensowną walizeczkę (na razie noszę w plecaku w teczce tekturowej)!

]]>
http://thesingularity.pl/blog/2010/ipad-w-komunikacji-miejskiej-recenzja/feed/ 0
iPad iBooks jest śliczne, ale nie dla PDF-ów http://thesingularity.pl/blog/2010/ipad-ibooks-jest-sliczne-ale-nie-dla-pdf-ow/ http://thesingularity.pl/blog/2010/ipad-ibooks-jest-sliczne-ale-nie-dla-pdf-ow/#comments Sat, 02 Oct 2010 02:05:12 +0000 qertoip http://thesingularity.pl/blog/?p=151 Continue reading ]]> iBooks to nieprzeciętnie ładna aplikacja do trzymania książek na półce i czytania. Szkoda tylko, że dotyczy to wyłącznie formatu epub, czyli płatnych książek ze sklepu Steve’a.

PDF-y co prawda da się otworzyć via iBooks, ale prezentują się już przeciętnie, to znaczy bez tej całej “książkowej otoczki” polegającej na przewracaniu kartek i sophii.

Można też skonwertować PDF-y do epub za pomocą calibre i wtedy zachowują się estetycznie jak “prawdziwe ksiażki” – ale konwersja jest mocno stratna, generalnie taka książka się rozpada, jest pozbawiona obrazków, czasem spisu treści itp. Bez sensu.

]]>
http://thesingularity.pl/blog/2010/ipad-ibooks-jest-sliczne-ale-nie-dla-pdf-ow/feed/ 0
Tethering: iPhone sprawdza się jako modem 3G dla iPada http://thesingularity.pl/blog/2010/tethering-iphone-sprawdza-sie-jako-modem-3g-dla-ipada/ http://thesingularity.pl/blog/2010/tethering-iphone-sprawdza-sie-jako-modem-3g-dla-ipada/#comments Sat, 02 Oct 2010 00:05:33 +0000 qertoip http://thesingularity.pl/blog/?p=161 Continue reading ]]> Tethering to koncepcja używania telefonu komórkowego Edge/3G/4G jako modemu udostępniającego połączenie internetowe innym urządzeniom. Połączenie może być udostępniane różnymi drogami: kablem USB, przez Blutooth, lub – najwygodniej – jako WiFi access point.

Domyślnie iPhone nie posiada możliwości udostępniania swojego połączenia internetowego. Z pomocą jak zwykle przychodzi Cydia, na której znajdziemy bezcenny MyWi. Aplikacja umożliwia tethering we wszystkich scenariuszach.

I tu dochodzimy do sedna – iPad może wykorzystywać iPhona jako punkt dostępu do sieci bezprzewodowej. I działa to całkiem sprawnie, zwłaszcza że w praktyce oba urządzenia mamy ze sobą, więc nie ma problemu ze słabym sygnałem WiFi. Jedyna niewygoda, to że za każdym razem trzeba najpierw odpalić MyWi w iPhonie.

Podsumowując, marnotrawstwem wydaje się kupno iPada WiFi + 3G. Lepiej pożyczyć 3G od iPhona, bo różnice w cenach są spore.

]]>
http://thesingularity.pl/blog/2010/tethering-iphone-sprawdza-sie-jako-modem-3g-dla-ipada/feed/ 0
Szok – nie istnieje jailbreak dla mojego iPada 3.2.2! http://thesingularity.pl/blog/2010/szok-nie-ma-jailbreak-dla-mojego-ipada/ http://thesingularity.pl/blog/2010/szok-nie-ma-jailbreak-dla-mojego-ipada/#comments Fri, 01 Oct 2010 23:35:13 +0000 qertoip http://thesingularity.pl/blog/?p=171 Continue reading ]]> Dostępne jailbreaki radzą sobie z wersjami firmware’u do 3.2.1. W świeżo wyprodukowanym iPadzie mam przeklęty 3.2.2, do którego jailbreak o wdzięcznej nazwie Greenpois0n dopiero powstaje…

To oznacza, że nie będzie SSH, VNC, i wielu innych zabawek przez jakiś czas :-(Jest co prawda technika polegająca na downgrade firmware’u z 3.2.2 do 3.2.1, ale działa tylko dla modeli, które natywnie były starsze niż 3.2.2. Podsumowując, urządzenie kupione z 3.2.2 nie da się ani jailbreak’ować, ani downgrade’ować.

]]>
http://thesingularity.pl/blog/2010/szok-nie-ma-jailbreak-dla-mojego-ipada/feed/ 0
iPad cięższy niż myślałem http://thesingularity.pl/blog/2010/ipad-ciezszy-niz-myslalem/ http://thesingularity.pl/blog/2010/ipad-ciezszy-niz-myslalem/#comments Fri, 01 Oct 2010 22:37:50 +0000 qertoip http://thesingularity.pl/blog/?p=181 Continue reading ]]> iPad oficjalnie waży 680 gram, czyli bardzo niewiele jeśli porównywać go z laptopami (2-3KG). Nie miałem jeszcze okazji poddać go oficjalnemu ważeniu przed walką (bo nie mam takiej dokładnej wagi), ale mam wrażenie, że skubaniec waży więcej!

iPada dość niewygodnie trzyma się jedną ręką, a w komunikacji miejskiej druga jest zazwyczaj zajęta wiszeniem na rurce albo pchaniem czyjegoś plecaka. Zobaczymy jak to będzie, może kwestia wyrobienia techniki i nadgarstków, a może po prostu trzeba mieć do niego dwie ręce.

]]>
http://thesingularity.pl/blog/2010/ipad-ciezszy-niz-myslalem/feed/ 0
iPad – pierwsze wrażenia z czytania http://thesingularity.pl/blog/2010/ipad-pierwsze-wrazenia-z-czytania/ http://thesingularity.pl/blog/2010/ipad-pierwsze-wrazenia-z-czytania/#comments Fri, 01 Oct 2010 22:28:53 +0000 qertoip http://thesingularity.pl/blog/?p=191 Continue reading ]]> Przeczytałem ze zrozumieniem 5 stron dość zbitej książki i wrażenie jest co najmniej pozytywne. Wzrok zmęczony nie bardziej niż przed czytaniem, wszystko wyraźne, jasne i z dużym kontrastem.Przydałoby się jednak większe DPI bo antyaliasing jednak lekko widać, pamiętajmy że iPad ma rozdzielczość tylko 1024×768.

PDF-y zostały wrzucone via Dropbox, który służy mi już do synchronizacji dokumentów między laptopem, iPhonem i iPadem. Szkoda tylko, że nie działa w biurze, gdzie wszystko jest poblokowane (corp).

Do czytania używałem domyślnej przeglądarki wbudowanej chyba w Dropbox, prosta ale ma super funkcję zbliżania strony dokładnie na tyle, żeby cały ekran był wypełniony tekstem, co oczywiście ułatwia czytanie bo literki robią się większe niż domyślnie z marginesami.

]]>
http://thesingularity.pl/blog/2010/ipad-pierwsze-wrazenia-z-czytania/feed/ 0
iPad – co oznacza błąd synchronizacji 0xE8008001? http://thesingularity.pl/blog/2010/ipad-co-oznacza-blad-synchronizacji-0xe8008001/ http://thesingularity.pl/blog/2010/ipad-co-oznacza-blad-synchronizacji-0xe8008001/#comments Fri, 01 Oct 2010 22:01:45 +0000 qertoip http://thesingularity.pl/blog/?p=201 Błąd synchronizacji 0xE8008001 oznacza, że urządzenie nie jest prawidłowo jailbreake’owane.Osobiście uzyskałem go synchronizując programy iPhone => iPad via iTunes, przy czym iPhone jest (oczywiście) jailbreak’owany, a iPad jeszcze zachował dziewictwo, więc niektóre ciekawsze aplikacje na niego nie wchodzą.

]]>
http://thesingularity.pl/blog/2010/ipad-co-oznacza-blad-synchronizacji-0xe8008001/feed/ 0
iPad ma słabą antenę WiFi, identycznie jak iPhone http://thesingularity.pl/blog/2010/ipad-ma-slaba-antene-wifi-identycznie-jak-iphone/ http://thesingularity.pl/blog/2010/ipad-ma-slaba-antene-wifi-identycznie-jak-iphone/#comments Fri, 01 Oct 2010 20:20:58 +0000 qertoip http://thesingularity.pl/blog/?p=211 Tam gdzie Dell Letitude D520 bez problemu łapie zasięg WiFi, iPhone i iPad łapią go jak pomyślny wiatr zawieje. Trzeba będzie przesunąć AP w chałupie bliżej mojej pieczary. Antena jest słaba zapewne “by design”, żeby zmniejszyć zużycie baterii.

]]>
http://thesingularity.pl/blog/2010/ipad-ma-slaba-antene-wifi-identycznie-jak-iphone/feed/ 0
iPad żyje! http://thesingularity.pl/blog/2010/ipad-zyje/ http://thesingularity.pl/blog/2010/ipad-zyje/#comments Fri, 01 Oct 2010 19:50:38 +0000 qertoip http://thesingularity.pl/blog/?p=221 iPad pochodzący ze Zjednoczonego Królestwa, kupiony w podejrzanie niskiej cenie, od podejrzanie młodego typa w czarnym BMW z kierownicą po prawej stronie, działa i ma się dobrze.

]]>
http://thesingularity.pl/blog/2010/ipad-zyje/feed/ 0
iPad wymaga iTunes 9.1 http://thesingularity.pl/blog/2010/ipad-wymaga-itunes-91/ http://thesingularity.pl/blog/2010/ipad-wymaga-itunes-91/#comments Fri, 01 Oct 2010 19:05:20 +0000 qertoip http://thesingularity.pl/blog/?p=231 iPad wymaga do aktywacji iTunes 9.1, a te waży prawie 100MB i ściąga się z przedwojenną prędkością 30KB/s ze strony Steve'a. A ja zniecierpliwiony czekam, kurwa!

]]>
http://thesingularity.pl/blog/2010/ipad-wymaga-itunes-91/feed/ 0
Jak uruchamiać programy w Clojure? http://thesingularity.pl/blog/2010/jak-uruchamiac-programy-w-clojure/ http://thesingularity.pl/blog/2010/jak-uruchamiac-programy-w-clojure/#comments Wed, 29 Sep 2010 17:10:52 +0000 qertoip http://thesingularity.pl/blog/?p=251 Continue reading ]]> Jak najwygodniej uruchamiać programy w Clojure, czyli pliki nazwa.clj? Z katalogu głównego aplikacji wydaj polecenie:

lein run

Cóż to jest?

  • lein-run to wtyczka do Leiningen, narzędzia do budowania aplikacji, którego i tak już powinieneś używać.
  • Leiningen jest odpowiednikiem takich narzędzi jak rake, nbuild, ant, maven – dla Clojure.

Jakie to ma zalety?

  • Szybkość! Plik clj jest uruchamiany bezpośrednio, bez budowania jarów.
  • Brak potrzeby podawania CLASSPATH. Wtyczka lein-run korzysta z definicji projektu Leiningen (project.clj).
]]>
http://thesingularity.pl/blog/2010/jak-uruchamiac-programy-w-clojure/feed/ 0
Google Voice Search po polsku w iPhone – mówisz i masz 9/10! http://thesingularity.pl/blog/2010/google-voice-search-po-polsku-w-iphone-mowisz-i-masz-1010/ http://thesingularity.pl/blog/2010/google-voice-search-po-polsku-w-iphone-mowisz-i-masz-1010/#comments Mon, 27 Sep 2010 19:24:43 +0000 qertoip http://thesingularity.pl/blog/?p=261 Continue reading ]]> Usługa wyszukiwania głosowego Google Voice Search niezawodnie rozpoznaje polską mowę w 9 przypadkach na 10. To jest pierwsza naprawdę działająca aplikacja “rozumiejąca” co się do niej mówi. Na WiFi wyszukiwanie jest błyskawiczne (0,5s).

I wcale nie chodzi o typowe słowa “ok”, “pogoda”, “praca”. Poniżej przykłady rozpoznane bezbłędnie za pierwszym razem:

“Jaka jest odległość od Ziemi do Słońca?”

“Google Maps Ząbki Chłopickiego 20″

“wykop.pl”

“Mieszkania Wołomin”

“Płytki podłogowe Zielonka”

“Chrząszcz brzmi w trzcinie”

“Przygody wróbla ćwirka”

“Mariusz Kosiński”

Usługa nie wymaga żadnego procesu nauki ani konfiguracji. Można do niej mówić w normalnym tempie i naturalnym głosem, bez silenia się na ładną dykcję.

Firmę Google już od dłuższego czasu należy kojarzyć raczej z AI, a nie z wyszukiwaniem.

Szczegóły techniczne

http://www.google.com/mobile/google-mobile-app/

Aplikacja mobilna to tylko GUI. Cała logika jest po stronie serwera. Głos jest kompresowany i przesyłany na serwery Google, które odpowiadają wynikami zapytania.

Dostępne na platformach Android, iPhone OS, BlackBerry, Nokia S60.

Szukam klienta desktop. Jeśli ktoś zna działającego, proszę o info.

Rozpoznawanie mowy jest zafiksowane na języku. Jeśli ustawiony jest język polski, nie zostanie rozpoznana mowa po angielsku. Fajnie byłoby, gdyby język sam się ustawiał, bo wiele osób wyszukuje regularnie w 2-3 językach na przemian.

Podsumowując, Google Voice Search to prawdziwy przełom w dziedzinie Speech-To-Text. W połączeniu z usługą tłumaczenia tekstów i syntezą Text-To-Speech, wydaje się, że telefony tłumaczące rozmowy online są tuż za rogiem (2-3 lata?).

Sceptycy wciąż twierdzą, że silna sztuczna inteligencja nigdy nie powstanie.

]]>
http://thesingularity.pl/blog/2010/google-voice-search-po-polsku-w-iphone-mowisz-i-masz-1010/feed/ 0
Bezzałogowy pojazd jedzie z Włoch do Chin http://thesingularity.pl/blog/2010/bezzalogowy-pojazd-jedzie-z-wloch-do-chin/ http://thesingularity.pl/blog/2010/bezzalogowy-pojazd-jedzie-z-wloch-do-chin/#comments Thu, 23 Sep 2010 19:44:27 +0000 qertoip http://thesingularity.pl/blog/?p=271 Włoska firma VisiLab wysłała ekspedycję czterech bezzałogowych pojazdów z Włoch do Chin. Ekspedycja minęła już rosyjski Nowosybirsk.

Jeden z pojazdów porusza się całkowicie autonomicznie, bez żadnej interwencji człowieka.

Sceptycy wciąż uważają, że stworzenie prawdziwej sztucznej inteligencji (AGI) nigdy nie nastąpi.

]]>
http://thesingularity.pl/blog/2010/bezzalogowy-pojazd-jedzie-z-wloch-do-chin/feed/ 0
Informatyczna paranoja http://thesingularity.pl/blog/2010/informatyczna-paranoja/ http://thesingularity.pl/blog/2010/informatyczna-paranoja/#comments Mon, 20 Sep 2010 18:00:31 +0000 qertoip http://thesingularity.pl/blog/?p=281 Continue reading ]]> A.D. 2004, tekst Grzegorz Łasak, czytał Tomasz Knapik:

Postanowiłem rozpocząć naukę ASP .NET. Oto bowiem mamy do czynienia z konkurentem PHP, który słynie ze swojej prostoty i to się nie podoba ludziom w tzw. branży, w tym Microsoftowi, który koniecznie musi mnieć własny odpowiednik stanowiący konkurencję, oczywiście wypromowany za ogromne pieniądze, choćby nie wiadomo jak kiepski produkt miałby być promowany. Podejrzewam więc, że ta technologia to jeden z najlepszych przykładów strzelania z armaty do muchy, co będzie najlepiej widoczne na tle porównań z PHP. Dlatego więc będę jej się bacznie przyglądał w czasie poznawania krok po kroku i opisywał wszelkie idiotyzmy, z jakimi się spotkam. Że też musiało paść na produkt biednego Microsoftu… ale nie… znajdą się tu również inne narzędzia, z którymi styka się na codzień informatyk lub też szary użytkownik komputera. Niestety, nie da się tu opisać wszystkich przypadków, z którymi się stykam na codzień. Jest ich tak wiele, że trzeba by naprawdę dużego samozaparcia, żeby pisać tu o wszystkim.

Niniejsze opracowanie należy traktować z przymrużeniem oka, bo być może twórcy (czytaj osoby odpowiedzialne za te „ułatwienia”) mieli rzeczywiste powody, by daną rzecz zrobić tak a nie inaczej i robili to w dobrej wierze. Cóż, są rzeczy o których nie wiemy, wszak nie my tworzyliśmy to oprogramowanie, ale to nie zabiera nam prawa do dociekania, dlaczego pewne rzeczy koledzy z branży „ułatwiają” nam tak a nie inaczej. Nie zmienia to jednak faktu, że powinno nas to pobudzić do refleksji.

Oto czytam sobie kurs ASP .NET (http://samples.gotdotnet.com/quickstart/aspplus/) i tak jak przewidywałem na jednym z przykładów wprowadzających typu „Hello World!” natknąłem się na takie wyrażenie: Server.HtmlEncode(Request.QueryString["Name"]) – jeszcze nie wiem, co ono robi, ale na pewno nie jest to nic, czego by nie można zrobić prościej. Jeszcze jeden kwiatek, który już na samym początku zniechęca do dalszego poznawania C#: System.Web.UI.HtmlControls.HtmlGenericControl – wiem, wiem… C# to odpowiednik Javy (przy okazji nie lubię jej), więc Microsoft nie mógł być gorszy. Zobaczymy, co będzie dalej…

Z oczywistych względów czeka mnie instalacja narzędzi potrzebnych do pisania i testowania własnych programów w ASP .NET. Wybrałem sobie .NET Framework 1.1 oraz WebMatrix. Niestety, jestem zmuszony do podjęcia tak drastycznej decyzji, jaką jest zmiana… systemu operacyjnego. Od kilku lat dzielnie używam Windows 98 SE jako świadomy użytkownik opierając się nowszym produktom Microsoftu świadom m.in. tego, że po każdej takiej zmianie w przód komputer będzie chodził wolniej (coraz większe zasoby wymagane przez OS) oraz że wymagana jest coraz większa przestrzeń dyskowa, której ja po prostu nie mam. Na OS mogę przeznaczyć 1 GB przestrzeni i nie więcej! I proszę nie pytać dlaczego. Nawet gdybym miał większy dysk, to i tak nie dałbym więcej. Oczywiście instalowałem sobie tymczasowo nowe produkty, takie jak Windows Millenium, Windows 2000, Windows XP. Szybko jednak zniesmaczony wolniejszą pracą komputera wracałem do Win 98. Szczególnie poirytował mnie Windows XP, pełen wodotrysków, z zupełnie poprzestawianymi rzeczami, innym interfejsem użytkownika. Zirytowany czasem, jaki musiałbym poświęcić na przesiadkę, czyli naukę poruszania się po nowym środowisku, zrezygnowałem. Podobno można to było jakąś wyłączyć, tak żeby XP wyglądem przypominał starsze Windowsy, ale za cholerę nie mogłem tego znaleźć. Szkoda nerwów. Są jeszcze kwestie bezpieczeństwa, dla których tak długo używałem Win 98. To normalne, że jest więcej wirusów i innych ataków na nowsze systemy. Więcej użytkowników = więcej ofiar, dodatkowo Win 2000 jako system dla poważniejszych użytkowników aż się prosi o ataki. Był sobie wirus, który atakował losowe porty w sieci doprowadzając do restartów zainfekowanych komputerów i czegoś tam jeszcze. Komputery działające pod Win 98 tylko rozsyłały dalej wirusa (nie były atakowane), natomiast pecety z nowszymi systemami, w tym Win 2000 i XP owszem! Teraz jednak zostałem zmuszony do porzucenia Win 98, żeby móc praktycznie poznawać ASP. NET, a tym samym napisać ten tekst ;)

Wchodzę więc na https://msdn60.e-academy.com/pwweit_inf/ celem ściągnięcia Windowsa 2000 oczywiście z pewnością siebie, że sama zmiana systemu dostarczy ciekawych materiałów. No ale do cholery! Ściągam już trzeci dzień i ściągnąć nie mogę. Nawet nie sądziłem, że Microsoft i przy downloadzie będzie chciał pokazać, jakie to on promuje przyjazne rozwiązania. Stało się tak, że ten download był niezwykły. Nie został udostępniony plik znajdujący się na określonej ścieżce, który możnaby ściągnąć używając choćby managera downloadu. Za to trzeba było ściągnąć mały programik, który odpowiada za ściąganie instalatora Win 2000. Tworzy on plik tymczasowy, który w miarę pobierania zwiększa swą objętość, ma on nawet opcję wznawiania, super! Zdecydowałem poświęcić kilkaset (oby!) megabajtów z mojego miesięcznego limitu transferowego, by ściągnąć instalator. Włączyłem więc pobieranie. Po kilku godzinach mozolnego pobierania doszło do 53% i zostawiłem komputer pod opieką brata, aby ten popisał sobie w Wordzie. Gdy tak sobie pisał, pecet mu się zawiesił, no tak zwyczajnie zawiesił, przy Wordzie, no ale mamy opcję Resume, z której skorzystamy po restarcie… Nie dało się. Plik co prawda był na dysku, ale przy próbie wznowienia zamiast dalszego jego ściągania pojawiała się strona z komunikatem o błędzie (1.gif). W momencie pisania notki 2 razy postanowiłem zacząć od nowa i 2 razy komp się wieszał, po czym nie dało się wznowić ściągania. Raz była to strona o błędzie pojawiająca się w nieskończoność przy każdej próbie wznowienia, raz ściągany plik po prostu zniknął z dysku! Normalny manager downloadu (np. Getright) umożliwia wznawianie zawsze i wszędzie, choćby nie wiem, jak komputer stanął. Nigdy się również nie spotkałem, żeby podobna historia wystąpiła w programie P2P, choć używałem dwóch. No ale Microsoft musiał to zrobić po swojemu. Najciekawsze jest jednak to, że nasz „ściągacz” odmowił raz wznowienia najzwyczajniej spauzowanego downloadu, wyświetlając komunikat z pliku 1.gif.

Piąta próba (postanowiłem, że ostatnia bez względu na wszystko!). Ściągam od zera. Dwa dni później dochodzę do 100%. Nareszcie! Plik ściągnięty w całości jest następnie automatycznie rozpakowywany, gdy… wyskakuje informacja o nieznanym błędzie (2.gif). Myślę sobie, zamknę okno i ponownie włączę cały proces i niech jeszcze raz spróbuje rozpakować. Więć wyłączam. Zaglądam do katalogu, a tam… BRAK INSTALATORA, który tam mozolnie ściągałem! Normalnie został usunięty bez mojej wiedzy i zgody. Tylko dlatego, że przy rozpakowywaniu go pojawił się jakiś błąd. W sumie to po początkowych problemach tylko naiwny by wierzył, że to się da normalnie ściągnąć i zainstalować. Tak więc jestem zmuszony zawiesić naukę ASP .NET do czasu, gdy dostanę płytę instalacyjną. Może za tydzień, może jeszcze później… Przy okazji: 3.gif – ściąganie od nowa po nieudamym ukompletowaniu ściągania instalatora. Niech się pocałują!

1

2

3

(koniec cytatu).

Jeśli zastanawiacie się, kim jest Grzegorz Łasak – słusznie!

]]>
http://thesingularity.pl/blog/2010/informatyczna-paranoja/feed/ 0
Mamy namiary Hindusa, który spierdolił system transakcyjny Citibanku http://thesingularity.pl/blog/2010/mamy-namiary-hindusa-ktory-spierdolil-system-transakcyjny-citibanku/ http://thesingularity.pl/blog/2010/mamy-namiary-hindusa-ktory-spierdolil-system-transakcyjny-citibanku/#comments Mon, 20 Sep 2010 13:23:22 +0000 qertoip http://thesingularity.pl/blog/?p=291 Continue reading ]]> Odnaleźliśmy Hindusa, który spierdolił system transakcyjny Citibanku. Mamy jego telefon i e-maila. Jego kod JavaScript prosi się o wrzucenie na CodingHorror.com

Hindus wpadł, bo zostawił w kodzie komentarz z przykładowym wywołaniem funkcji, a jako przykład podał własne dane:

//postData sample value will be as  e.g  postData = ‘name=sudhir&email=sudhir.bharamve@oracle.com&phone=9320702900′;

Tu jest jego profil na LinkedIn. Prawdopodobny telefon to 9320702900 i  e-mail: sudhir.bharambe@oracle.com.

Fatalna jakość kodu JavaScript i masowe literówki (nawet w nazwach funkcji, a więc wielokrotnie powielone!) znacznie utrudniają nam zrozumienie i reverse engineering front-endu systemu transakcyjnego. Dlatego zło będzie piętnowane.

]]>
http://thesingularity.pl/blog/2010/mamy-namiary-hindusa-ktory-spierdolil-system-transakcyjny-citibanku/feed/ 2
Mózgowa ciekawostka http://thesingularity.pl/blog/2010/mozgowa-ciekawostka/ http://thesingularity.pl/blog/2010/mozgowa-ciekawostka/#comments Sun, 19 Sep 2010 19:16:36 +0000 qertoip http://thesingularity.pl/blog/?p=301 Continue reading ]]> Spróbuj to przeczytać:

“Zdognie z nanjwoymszi baniadmai perzporawdzomyni na bytyrijskch uweniretasytch nie ma zenacznia kojnolesc ltier przy zpiasie dengao solwa. Nwajzanszyeim jest, aby prieszwa i otatsnia lteria byla na siwom mijsecu, ptzosałoe mgoą być w niaedziłe i w dszalym cąigu nie pwinono to sawrztać polbemórw ze zozumierniem tksetu.”

]]>
http://thesingularity.pl/blog/2010/mozgowa-ciekawostka/feed/ 0
Czy bieganie pod wpływem jest legalne? http://thesingularity.pl/blog/2010/czy-bieganie-pod-wplywem-jest-legalne/ http://thesingularity.pl/blog/2010/czy-bieganie-pod-wplywem-jest-legalne/#comments Sun, 19 Sep 2010 11:02:06 +0000 qertoip http://thesingularity.pl/blog/?p=311 Continue reading ]]> Gdy Pudzian walczył z Eshem, my walczyliśmy z Żołądkową. Po kilku godzinach snu, o bladym świcie (około 9:00), kolega zszedł na II poziom incepcji, a ja wyszedłem pobiegać, w nadzei że się szybciej ogarnę. Nadzieja okazała się płonna… ale po godzinie od powrotu stał się cud i wszelkie dolegliwości nagle, dosłownie z minuty na minutę, ustąpiły. Ciekawe.

]]>
http://thesingularity.pl/blog/2010/czy-bieganie-pod-wplywem-jest-legalne/feed/ 0
Klasyfikator Bayesa – tutorial http://thesingularity.pl/blog/2010/klasyfikator-bayesa-tutorial/ http://thesingularity.pl/blog/2010/klasyfikator-bayesa-tutorial/#comments Sun, 19 Sep 2010 10:22:28 +0000 qertoip http://thesingularity.pl/blog/?p=321 Continue reading ]]> Naiwny klasyfikator Bayesa to skuteczne narzędzie kategoryzacji. Klasyfikator automatycznie przydziela przykłady do kategorii. Kategorie muszą być z góry ustalone. Z artykułu dowiesz się, jakie to ma zastosowania, na czym dokładnie polega i jak to zaimplementować.

Istnieje teoria, że umysł zachowuje się zgodnie z modelem probabilistycznym Bayesa, choć nie wiadomo, w jaki sposób jest to zaimplementowane na substracie, jakim jest mózg. Teoria jest solidne uzasadniona w New Scientists. Niezależnie od prawdziwości tej teorii, klasyfikator Bayesa świetnie sprawdza się w wielu praktycznych zastosowaniach, o czym poniżej.

Przykłady zastosowań

  • Rozpoznawanie języka strony internetowej
    • klasyfikacja: język strony – angielski / hiszpański / francuski / niemiecki / polski
  • Wyłapywanie oszustw w transakcjach kartą kredytową
    • klasyfikacja: transakcja kartą – szablonowa / fraud
  • Filtrowanie spamu pocztowego
    • klasyfikacja: e-mail – pożądany / spam
  • Katalogowanie książek
    • klasyfikacja: książka – kryminały / romanse / poradniki / popularnonaukowe
  • Odgadywanie płci
    • klasyfikacja: płeć – kobieta / mężczyzna / niezdefiniowana
  • Kategoryzacja produktów w sklepie internetowym
    • klasyfikacja: produkt – laptopy / monitory / aparaty fotograficzne / odtwarzacze mp3

Jak to działa?

Klasyfikator bayesowski to wzór na prawdopodobieństwo, że przykład x należy do kategorii k. Dla danego przykładu x obliczamy prawdopodobieństwo przynależności kolejno do każdej kategorii. Następnie wybieramy najbardziej prawdopodobną kategorię.

Wzór naiwnego klasyfkatora Bayesa:

Gdzie:

  • p(C|F1,F2,…,Fn) – prawdopodobieństwo przynależności przykładu do kategorii C pod warunkiem F1,F2,…,Fn. Oznaczenie Fi to cecha przykładu. Jeśli przykładem jest e-mail, Fi może oznaczać “zawiera słowo ‘i’”.
  • Z – nieistotny współczynnik skalowania (bo równy dla wszystkich kategorii). Formalnie Z jest równe P(F1,F2,…,Fi), czyli prawdopodobieństwu że przykład posiada wszystkie możliwe cechy. Implementacyjnie można przyjąć 1.
  • p(C) – ogólne prawdopodobieństwo przynależności przykładu do kategorii C. Np. 90% e-maili jest spamem, więc p(C) == p(spam) == 90%. Niezależnie od modelu teoretycznego, w praktyce implementacyjnej raczej nie preferuje się żadnej kategorii. Np. filtry antyspamowe przyjmują p(spam) == 50%.
  • p(Fi|C) – prawdopodobieństwo posiadania cechy Fi przez przykład należący do kategorii C. Np. prawdopodobieństwo występowania słowa “pill” w spamach.
  • Duże PI to iloczyn p(Fi|C) dla kolejnych i, czyli dla poszczególnych cech przykładu (tu: zawierania się poszczególnych słów w e-mailu).

Podsumowując, do obliczeń potrzebujemy znać p(Fi|C) dla każdej cechy Fi. Kontynuując przykład filtru antyspamowego, dla obu kategorii potrzebujemy znać prawdopodobieństwa występowania słów w treści e-maila. Skąd wziąć te prawdopodobieństwa?

Zbiór trenujący

Potrzebujemy zbioru prawidłowo skategoryzowanych przykładów, czyli e-maili ręcznie podzielonych na pożądane i spam. Mając taki zbiór można łatwo policzyć potrzebne prawdopodobieństwa.

Załóżmy, że w bazie mamy 100 spamów i 18 z nich zawiera “pill”. Wtedy prawdopodobieństwo p(Fpill|spam) wynosi 18%.

Implementacja

W praktycznej implementacji trzeba uwzględnić następujące zagadnienia:

  • Obsługa brakujących cech w kategoriach, czyli p(Fi|C) == 0. Nie możemy mieć zera w iloczynie, bo wykluczy to kategorię. Zamiast tego, należy przyjąć wartość mniejszą od minimalnego prawdopodobieństwa posiadania tej cechy.
  • Operacje arytmetyczne na bardzo małych ułamkach w niektórych językach grożą wyzerowaniem obliczeń. Problem można zminimalizować zastępując prawdopodobieństwa ich logarytmami, a iloczyny sumami. Dodatkowo warto używać dokładnych typów liczbowych, o ile nie stanowi to problemu wydajnościowego.
  • Pomijanie słów nieistotnych, np. spójników. Chodzi o słowa i fragmenty, co do których spodziewamy się, że nie wnoszą nic do kategoryzacji, to znaczy z równym prawdopodobieństwem pojawiają się w każdej kategorii. Warto usunąć je z e-maila przed analizą.

Podsumowując, klasyfikator Bayesa jest sprawdzoną i skuteczną metodą kategoryzacji, a jego implementacja nie jest zbyt skomplikowana. Warto mieć to narzędzie w arsenale i atakować nim nowe problemy!

]]>
http://thesingularity.pl/blog/2010/klasyfikator-bayesa-tutorial/feed/ 2
Play Mobile gra w chuja http://thesingularity.pl/blog/2010/play-mobile-gra-w-chuja/ http://thesingularity.pl/blog/2010/play-mobile-gra-w-chuja/#comments Wed, 15 Sep 2010 21:11:23 +0000 qertoip http://thesingularity.pl/blog/?p=331 Continue reading ]]> “Stan darmowy”, promocja polegająca na bezpłatnych rozmowach w sieci Play, a wymagająca jedynie bezpłatnej aktywacji, wielokrotnie stała się przyczyną straconych pieniędzy.

Jak to możliwe, skoro wszystko darmowe? Ano, po pierwsze, aktywować trzeba to co miesiąc (zapomnisz – płacisz). Po drugie, aktywacja ma oficjalnie opóźnienie do 24h, a nieoficjalnie działa jak chce (czasem po prostu nie zaskakuje! – płacisz). Po trzecie, nie ma żadnej informaji o tym, że “stan darmowy” wygasł (po 30 dniach) i obowiązują zwykłe stawki. Przegapisz – płacisz. Wreszcie po czwarte, ostatnio “stan darmowy” nagle wygasł (PRZED upływem 30 dni), bo promocja została arbitralnie zakończona (bez powiadomienia SMS-em). Nie zauważyłeś (bo jak?) – płacisz.

Teraz rozpoczęła się inna promocja, “nieograniczone rozmowy w Play” kosztująca już 10zł – i za pewne będzie działała równie chujowo.

]]>
http://thesingularity.pl/blog/2010/play-mobile-gra-w-chuja/feed/ 0
Zakleszczenie i zagłodzenie http://thesingularity.pl/blog/2010/zakleszczenie-zaglodzenie-deadlock/ http://thesingularity.pl/blog/2010/zakleszczenie-zaglodzenie-deadlock/#comments Sun, 12 Sep 2010 20:01:19 +0000 qertoip http://thesingularity.pl/blog/?p=341 Continue reading ]]> Czym różni się zakleszczenie od zagłodzenia?

Zakleszczenie (deadlock) i zagłodzenie (resource starvation) – czym się różnią i co dokładnie oznaczają? Spróbujmy uporządkować te trudne pojęcia. Angielska terminologia jest tu bardziej intuicyjna i nią się posłużymy:

Deadlock – procesy czekają jeden na drugiego na zwolnienie zasobu. Np. dwie osoby chcą rysować na tablicy. Jedna wzięła pisak, a druga linijkę, i czekają. Stan procesów się nie zmienia.

Livelock – procesy działają ale w taki sposób, że żaden nie może uzyskać zasobów. Np. dwie osoby chcą rysować na tablicy. Jedna wzięła pisak, druga linijkę. Następnie wymieniły się pisakiem i linijką, a więc wciąż nikt nie ma kompletu do rysowania. Stan procesów się zmienia.

Starvation – proces działa ale nie może uzyskać dostępu do zasobów. Np. jedna osoba rysuje na tablicy pisakiem, a druga bez końca prosi o pisak. Stan procesów się zmienia, przy czym jeden wykonuje pracę zgodnie z oczekiwaniami, a drugi chodzi “na pusto”.

Jak to się tłumaczy na polski?

Deadlock == zakleszczenie

Livelock == ?

Starvation == zagłodzenie

Komentarz

Innym ciekawym przykładem livelocka są dwie osoby próbujące się minąć w korytarzu, gdy każda z nich uprzejmie schodzi na tą samą stronę, w lewo i w prawo, bez końca.

Starvation określane jest też jako “resource starvation” albo “proces starvation”.

Najczęściej spotykamy się z tymi pojęciami przy wątkach. Zauważmy jednak, że problemy te dotyczą współbieżności w ogóle (np. wątki Javy, procesy systemu operacyjnego, software’owe procesy Erlanga, procesy biznesowe w korporacji, ludzie na korytarzu).

]]>
http://thesingularity.pl/blog/2010/zakleszczenie-zaglodzenie-deadlock/feed/ 1
Clojure – popularność w Polsce? http://thesingularity.pl/blog/2010/clojure-popularnosc-w-polsce/ http://thesingularity.pl/blog/2010/clojure-popularnosc-w-polsce/#comments Sat, 11 Sep 2010 15:47:26 +0000 qertoip http://thesingularity.pl/blog/?p=351 Continue reading ]]> Clojure – z czym to się je?

Clojure to nowoczesny język programowania na platformę Javy. W unikalny sposób łączy funkcyjność, “lispowość”, pragmatyzm i silne wsparcie dla programowania współbieżnego. Niezwykle przemyślany i spójny rdzeń języka jak magnes przyciąga programistów szukających nowoczesnego podejścia do programowania.

Clojure  jest językiem bardzo młodym (2007/2008) i mało znanym, choć całkiem szybko zdobywa popularność – patrz google trends.

Jaką popularnością Clojure cieszy się w Polsce?

  • Ma wpis i umocowanie w polskiej Wikipedii.
  • Jest clojure.pl, niewielki serwis przedstawiający język po polsku.
  • Wspomina o nim kilka polskich blogów, m.in. Jacek Laskowski i Jarosław Zabiełło.
  • Co najmniej jedna polska firma z powodzeniem używa Clojure komercyjnie – to za sprawą Jana Rychtera.
  • Clojure ma swoją grupę na Goldenline i Facebooku, aczkolwiek nic się tam nie dzieje.
  • W każdej większej polskiej społeczności (usenet, blip, forum coderscity itp.) można znaleźć pojedyncze wzmianki o tym języku.
  • Clojure nie pojawia się jeszcze w ofertach pracy.

Jaką popularnością Clojure cieszy się na świecie?

  • Clojure ma stabilną wersję 1.2.
  • Napisano o nim 4 książki (z czego dwie są już wydane, dwie kolejne będą wydane za moment).
  • Clojure – w połączeniu z rodziną Scheme/Lisp – znajduje się na 16. pozycji najpopularniejszych języków programowania według Tiobe Index.
  • Według Google Trends popularność tego języka gwałtownie rośnie.
  • Pojawiają się pojedyncze oferty pracy.

Podsumowując, czas zakasać rękawy i promować ten niezwykły język w ziemi ojczystej ;-)

]]>
http://thesingularity.pl/blog/2010/clojure-popularnosc-w-polsce/feed/ 2
Neuroinformatyka – wprowadzenie http://thesingularity.pl/blog/2010/neuroinformatyka-wprowadzenie/ http://thesingularity.pl/blog/2010/neuroinformatyka-wprowadzenie/#comments Sat, 11 Sep 2010 00:10:01 +0000 qertoip http://thesingularity.pl/blog/?p=361 Continue reading ]]> Czym jest neuroinformatyka? Kto jest kim w tej dziedzinie? Skąd czerpać o niej wiedzę? I czy można znaleźć w tym pracę?

Czym jest neuroinformatyka?

Neuroinformatyka to inżynieria odwrotna mózgu. Ściślej pisząc, neuroinformatyka stara się dostarczyć narzędzia informatyczne naukowcom badającym działanie mózgu (neurobiologom, ang. neuroscientsts).

Neuroinformatyka to dziedzina na skraju fizyki, neurobiologii, matematyki i informatyki.

Jakie kompetencje powinien posiadać neuroinformatyk?

Według INFC, neuroinformatyk powinien posiadać przynajmniej podstawową:

  • wiedzę o fizjologii, anatomi i biochemii systemu nerwowego
  • wiedzę o mózgu na poziomie systemów/kognitywnym/psychologicznym
  • doświadczenie w pracy w “mokrym” labolatorium neurobiologicznym (np. EEG)
  • matematykę na zaawansowanym poziomie, w szczególności w zakresie algebry liniowej, statystyki, analizy systemów dynamicznych, modelowania stochastycznego
  • umiejętność programowania w językach wysokiego poziomu
  • znajomość technik obrazowania i analizy obrazów
  • znajomość powszechnie stosowanych modeli neuronu i sieci neuronowych
  • wiedzę o podstawowych technikach modelowania i symulatorach

Kto jest kim w neuroinformatyce?

Organizacją niejako definiującą neuroinformatykę jest INCF (International Neuroinformatics Coordination Facilitiy). INCF zrzesza i koordynuje grupy badawcze.

Są trzy główne, opiniotwórcze czasopisma:

  1. Frontiers in neuroinformatics” – artykuły naukowe dostępne bezpłatnie.
  2. Neuroinformatics” – artykuły naukowe w większości płatne.
  3. Computational Neuroscience” – artykuły naukowe w większości płatne.

Najgłośniejszym projektem z zakresu symulacji mózgu jest Blue Brain Project. Henry Markram buduje w Szwajcarii sztuczny mózg. Na razie zbudował dokładną symulację jednej kolumny nowej kory mózgowej myszy. Obecna symulacja jest na poziomie komórkowym. Budulcem modelu jest precyzyjny model neuronu. Symulacja jednego neuronu wymaga całego komputera klasy PC. Cała symulacja odbywa się na IBM Blue Gene z 8000 procesorów. Docelowo symulacja ma zejść do poziomu cząsteczkowego.

Z polskiego podwórka nie sposób nie wspomnieć o prof. Włodzisławie Duchu. Duch to fizyk teoretyk i autorytet w dziedzinie kognitywistyki i neurobiologii. Wykłada na Uniwersytecie Mikołaja Kopernika.

Z kolei dr hab. Piotr Jerzy Durka zorganizował pierwsze w Polsce studia neuroinformatyczne na Uniwersytecie Warszawskim. Durka jest kierownikiem Zakładu Fizyki Biomedycznej i ekspertem od interfejsów mózg-komputer. Energiczny człowiek, który promuje neuroinformatykę w Polsce.

Jak zacząć?

W Polsce można już studiować neuroinformatkę i pokrewną kognitywistykę. Jest kierunek neuroinformatyki na Uniwersytecie Warszawskim. Jest też Kognitywistyka na Uniwersytecie Mikołaja Kopernika.

Z bardziej przyziemnych źródeł mamy wprowadzającą książeczkę “Nauka o mózgu” i całkiem niezłe forum kognitywistyki. Dalej już tylko Google, Wikipedia i artykuły naukowe.

Czy neuroinformatyk łatwo znajdzie pracę?

Jeśli zadajesz sobie tak prozaiczne pytania, neuroinformatyka prawdopodobnie nie jest dla Ciebie. W ofertach pracy neuroinformatyka nie pojawia się w ogóle.

Co prawda tak zaawansowany specjalista na rynku nie zginie (od asystenta w labolatorium EEG, przez korepetytora z podstaw fizyki, po specjalistę od użyteczności), ale przecież nie po to zostaje się neuroinformatykiem. Neuroinformatycy współtworzą sztuczny mózg i jako taki, może to być ostatni zawód potrzebny w historii ludzkości.

]]>
http://thesingularity.pl/blog/2010/neuroinformatyka-wprowadzenie/feed/ 0
Shoulda validate_uniqueness_of problem & solution http://thesingularity.pl/blog/2010/shoulda-validate_uniqueness_of-problem-solution/ http://thesingularity.pl/blog/2010/shoulda-validate_uniqueness_of-problem-solution/#comments Tue, 07 Sep 2010 13:25:43 +0000 qertoip http://thesingularity.pl/blog/?p=371 Continue reading ]]> Shoulda has a nice but broken validate_uniqueness_of matcher. Examples:

should validate_uniqueness_of( :uid )

should validate_uniqueness_of( :date_on ).scoped_to( :mutual_fund_id )

Unfortunately, there are two problems with this:

It works only for integers (foreign keys) and you need an existing record in db. We decided not to use this matcher at all. We test uniqueness with the following code:

should “validate uniqueness of date_on in scope of MutualFund” do
assert_raise(ActiveRecord::RecordInvalid) do
existing_mutual_fund_price().clone().save!
end
end

]]>
http://thesingularity.pl/blog/2010/shoulda-validate_uniqueness_of-problem-solution/feed/ 0
Learning curve: is clojure like git? http://thesingularity.pl/blog/2010/learning-curve-is-clojure-like-git/ http://thesingularity.pl/blog/2010/learning-curve-is-clojure-like-git/#comments Sat, 21 Aug 2010 19:43:57 +0000 qertoip http://thesingularity.pl/blog/?p=391 Continue reading ]]> Git is a complex tool with non intuitive UI. It is hard to learn and it takes a lot of time to really understand what’s going on under the hood. That being sad, Git is the fastest and most powerful SCM on the planet. Once you master it, you are grateful to yourself for not giving up to early.

It seems to me that Clojure is similar in that matter. Clojure is the hardest language to learn I have ever came across, including C++. Being a functional LISP is not the only reason. Even more time is taken by details of Java interop, poor documentation with virtually no real world examples, milions of arcane functions, poor naming (slurp, spit – WTF?), immaturity of the ecosystem (bugs in IDEs and build tools) and shockingly poor error messages.

And again, I expect this investment to really pay off in the long term. It seems that experienced Clojure developers are very productive with the language and don’t look back.

The curve is steep, but this is what it takes to be an aspiring software craftsman.

]]>
http://thesingularity.pl/blog/2010/learning-curve-is-clojure-like-git/feed/ 0
Clojure polecany przez Roberta C. Martina http://thesingularity.pl/blog/2010/clojure-polecany-przez-roberta-c-martina/ http://thesingularity.pl/blog/2010/clojure-polecany-przez-roberta-c-martina/#comments Fri, 20 Aug 2010 19:57:21 +0000 qertoip http://thesingularity.pl/blog/?p=401 Continue reading ]]> Robert C. Martin to jeden z największych autorytetów w światku programistycznym. Po 40 latach doświadczenia w programowaniu w rozmaitych językach, dziś Uncle Bob poleca Clojure i gruntownie to uzasadnia. Poprzednim polecanym językiem był Ruby, który – jak wiemy – odniósł duży sukces i stworzył w okół siebie potężny przemysł (m.in. w Stanach).

]]>
http://thesingularity.pl/blog/2010/clojure-polecany-przez-roberta-c-martina/feed/ 0
Stable Clojure 1.2 released http://thesingularity.pl/blog/2010/stable-clojure-12-released/ http://thesingularity.pl/blog/2010/stable-clojure-12-released/#comments Fri, 20 Aug 2010 05:40:30 +0000 qertoip http://thesingularity.pl/blog/?p=411 Stable Clojure 1.2 has been released. Fogus (of the “Joy of Clojure” book fame) came up with a great presentation of new features and the future of the language. Check it out & enjoy!

]]>
http://thesingularity.pl/blog/2010/stable-clojure-12-released/feed/ 0
Clojure HTTP client library http://thesingularity.pl/blog/2010/clojure-http-client-library/ http://thesingularity.pl/blog/2010/clojure-http-client-library/#comments Mon, 16 Aug 2010 20:32:14 +0000 qertoip http://thesingularity.pl/blog/?p=421 Recently I stumbled upon Clj-HTTP, Clojure HTTP client library with a very nice API.

]]>
http://thesingularity.pl/blog/2010/clojure-http-client-library/feed/ 0
Writing binary files in Clojure – the recipe http://thesingularity.pl/blog/2010/writing-binary-files-in-clojure-the-recipe/ http://thesingularity.pl/blog/2010/writing-binary-files-in-clojure-the-recipe/#comments Tue, 10 Aug 2010 23:02:36 +0000 qertoip http://thesingularity.pl/blog/?p=431 Continue reading ]]> In the last blog post I show how to read binary files in Clojure. Figuring out how to write them back to disk took me even more time and eventually I got it with help from Stackoverflow Clojure experts. So here it is, the precious example worth your github gist ;-)

(import 'java.io.FileOutputStream)
(defn write-bin-file [file col]
(with-open [out (FileOutputStream. file)]
(.write out (byte-array col))))

Then use it like this:

(write-bin-file "/path/to/file" (map byte [17 9 80]))

There is one caveat – Java Byte is signed, so be careful what you supply to the (write-bin-file) function.

]]>
http://thesingularity.pl/blog/2010/writing-binary-files-in-clojure-the-recipe/feed/ 0
Reading binary files in Clojure – the recipe http://thesingularity.pl/blog/2010/reading-binary-files-in-clojure-the-recipe/ http://thesingularity.pl/blog/2010/reading-binary-files-in-clojure-the-recipe/#comments Tue, 10 Aug 2010 22:36:16 +0000 qertoip http://thesingularity.pl/blog/?p=441 Continue reading ]]> It took me quite a long time to figure out idiomatic way of reading binary files in Clojure into memory. This because Java IO is quite complex and Clojure/Java interop makes things even more arcane. In the end, however, it turned out to be easy. Once you get the example, that is:

(use 'clojure.contrib.io)
(defn read-bin-file [file]
(to-byte-array (as-file file)))

Then use it:

(read-bin-file "/path/to/file")    ; => byte[]

You get the file as a byte[], which is seq-able, so all standard list processing functions work as expected. You may be also interested in amap, areduce, aget, aset, alength functons.

Please note this concerns only binary files. There are trivial slurp and spit functions if you need to deal with text files.

In the next article I will show how to write binary files in Clojure.

]]>
http://thesingularity.pl/blog/2010/reading-binary-files-in-clojure-the-recipe/feed/ 2
http://thesingularity.pl/blog/2010/krolujace-niegdys-stoiska-informatyczne-w-empikach-i-trafficu-skurczyly-sie-do-dwoch-lichych-szafeczek-wielka-ksiegar/ http://thesingularity.pl/blog/2010/krolujace-niegdys-stoiska-informatyczne-w-empikach-i-trafficu-skurczyly-sie-do-dwoch-lichych-szafeczek-wielka-ksiegar/#comments Sun, 08 Aug 2010 12:44:10 +0000 qertoip http://thesingularity.pl/blog/?p=451 Continue reading ]]> Królujące niegdyś stoiska informatyczne w Empikach i Trafficu skurczyły się do dwóch lichych szafeczek. Wielka księgarnia informatyczna na Targowej na Pradze w ogóle zniknęła. Nigdzie, kurwa, nigdzie w realu nie ma już książki "Struktura i Interpretacja Programów Komputerowych" WNT. Zmiany, zmiany, zmiany, amazon takes it all.

]]>
http://thesingularity.pl/blog/2010/krolujace-niegdys-stoiska-informatyczne-w-empikach-i-trafficu-skurczyly-sie-do-dwoch-lichych-szafeczek-wielka-ksiegar/feed/ 0
http://thesingularity.pl/blog/2010/840-nad-ranem-dzwoni-stacjonarny-kurwa-ze-tez-sie-go-jeszcze-nie-pozbylem-i-malpa-wyskakuje-z-reklama-jakichs-chuj/ http://thesingularity.pl/blog/2010/840-nad-ranem-dzwoni-stacjonarny-kurwa-ze-tez-sie-go-jeszcze-nie-pozbylem-i-malpa-wyskakuje-z-reklama-jakichs-chuj/#comments Fri, 06 Aug 2010 09:06:46 +0000 qertoip http://thesingularity.pl/blog/?p=461 8:40 nad ranem dzwoni stacjonarny (kurwa, że też się go jeszcze nie pozbyłem) i małpa wyskakuje z reklamą jakichś chujowych produktów kosmetycznych. Żadnej moralności nie mają, spamem budzić człowieka po 3 godzinach snu. Zły i ziewający.

]]>
http://thesingularity.pl/blog/2010/840-nad-ranem-dzwoni-stacjonarny-kurwa-ze-tez-sie-go-jeszcze-nie-pozbylem-i-malpa-wyskakuje-z-reklama-jakichs-chuj/feed/ 0
Clojure – bestia ujarzmiona http://thesingularity.pl/blog/2010/clojure-bestia-ujarzmiona/ http://thesingularity.pl/blog/2010/clojure-bestia-ujarzmiona/#comments Fri, 06 Aug 2010 01:23:22 +0000 qertoip http://thesingularity.pl/blog/?p=471 Continue reading ]]> Ukończyłem właśnie pierwszy milestone w nauce Clojure'a – wydanie własnego projektu:

  • Clojure 1.1
  • Budowany Leiningenem 1.3-snapshot
  • Opublikowany na Githubie z dokumentacją
  • Opublikowany na Clojars'ach (odpowiednik gemcuttera)
  • Pełne testy jednostkowe (via clojure.test)
  • Dostrzeżony i wspomniany na Clojure Planet (odziwo!)

Projekt jest bardzo mały, ale kompletny i praktyczny – biblioteka istext.jar do niezawodnego odróżniania plików tekstowych od binarnych. Używalna (przetestowana) nie tylko z Clojura, ale także z klasycznej aplikacji Javowej.

]]>
http://thesingularity.pl/blog/2010/clojure-bestia-ujarzmiona/feed/ 0
IE9: HTML5, SVG, 95% ACID3, akceleracja sprzętowa http://thesingularity.pl/blog/2010/ie9-html5-svg-95-acid3-akceleracja-sprzetowa/ http://thesingularity.pl/blog/2010/ie9-html5-svg-95-acid3-akceleracja-sprzetowa/#comments Thu, 05 Aug 2010 22:16:42 +0000 qertoip http://thesingularity.pl/blog/?p=481 Czwarty preview Internet Explorer 9 wygląda bardzo obiecująco: akceleracja sprzętowa HTML5 i SVG / 95% w ACID3 / 97% CSS3 / JavaScript wydajny jak w Safari 5. Zdaje się, że HTML5 i SVG spopularyzują się szybciej niż zakładano, a flash zdechnie szybciej.

http://blogs.msdn.com/b/ie/archive/2010/08/04/html5-modernized-fourth-ie9-platform-preview-available-for-developers.aspx

]]>
http://thesingularity.pl/blog/2010/ie9-html5-svg-95-acid3-akceleracja-sprzetowa/feed/ 0
How to debug ssh problems easily? http://thesingularity.pl/blog/2010/how-to-debug-ssh-problems-easily/ http://thesingularity.pl/blog/2010/how-to-debug-ssh-problems-easily/#comments Thu, 05 Aug 2010 08:53:02 +0000 qertoip http://thesingularity.pl/blog/?p=491 Continue reading ]]> With:

ssh -v user@domain.com

…you get a precise listing of what's going on so it becomes trivial to find out where the problem lies.

]]>
http://thesingularity.pl/blog/2010/how-to-debug-ssh-problems-easily/feed/ 0
Pierwsze sztuczne DNA działa i replikuje się http://thesingularity.pl/blog/2010/pierwsze-sztuczne-dna-dziala-i-replikuje-sie/ http://thesingularity.pl/blog/2010/pierwsze-sztuczne-dna-dziala-i-replikuje-sie/#comments Thu, 05 Aug 2010 01:49:22 +0000 qertoip http://thesingularity.pl/blog/?p=501 Continue reading ]]> Człowiek stworzył nowe życie: 2 miesiące temu stworzono pierwszą w pełni sprawną, reprodukującą się komórkę opartą o syntentyczne DNA.

DNA zostało zaprojektowane na komputerze i sztucznie zsyntezowane chemicznie. Zapisano w nim m.in. nazwiska twórców i domenę nowego organizmu. Projekt trwał 15 lat. Eksperyment prowadził Craig Venter – ten sam, który wcześniej sekwencjonował ludzki genom.

Nie oznacza to, że naukowcy w pełni zrozumieli DNA, na którym się wzorowano. Zrozumieli go jedynie na tyle, żeby dało się dopisać nowe informacje i zrobić drobne zmiany w niewygodnych genach.

Przełom polega na tym, że zmodyfikowane DNA jest w pełni funkcjonalne, działa w komórce i prawidłowo się replikuje. To z kolei radykalnie skraca cykl eksperymentów zmierzających do zrozumienia DNA i w konsekwencji podstaw życia.

Naukowcy posiadli szybką “platformę testową” do inżynierii odwrotnej DNA tej prostej bakterii.

Konferencja prasowa na TED: http://www.ted.com/talks/craig_venter_unveils_synthetic_life.html

]]>
http://thesingularity.pl/blog/2010/pierwsze-sztuczne-dna-dziala-i-replikuje-sie/feed/ 0
http://thesingularity.pl/blog/2010/przez-dluzszy-czas-wpieprzal-mnie-kleszcz-ale-juz-sie-pasozyta-pozbylem-teraz-20-dni-antybiotykow-kleszcza-spotka/ http://thesingularity.pl/blog/2010/przez-dluzszy-czas-wpieprzal-mnie-kleszcz-ale-juz-sie-pasozyta-pozbylem-teraz-20-dni-antybiotykow-kleszcza-spotka/#comments Wed, 04 Aug 2010 20:07:13 +0000 qertoip http://thesingularity.pl/blog/?p=511 Przez dłuższy czas wpieprzał mnie kleszcz ale już się pasożyta pozbyłem. Teraz 20 dni antybiotyków :/ Kleszcza spotkała kara śmierci, której na marginesie jestem zwolennikiem. To może być pokłosie wieczoru kawalerskiego, tam przeróżne dziwne rzeczy się działy…

]]>
http://thesingularity.pl/blog/2010/przez-dluzszy-czas-wpieprzal-mnie-kleszcz-ale-juz-sie-pasozyta-pozbylem-teraz-20-dni-antybiotykow-kleszcza-spotka/feed/ 0
How to distinguish between binary files and text files? http://thesingularity.pl/blog/2010/how-to-distinguish-between-binary-files-and-text-files/ http://thesingularity.pl/blog/2010/how-to-distinguish-between-binary-files-and-text-files/#comments Wed, 04 Aug 2010 13:19:39 +0000 qertoip http://thesingularity.pl/blog/?p=521 Continue reading ]]> In the world of UTF-8 and other encodings, how to reliably recognize a text file? Should one use extension? Or perhaps there are some standard “hidden bytes” at the beginning of each file? Neither is true. We have to resort to heuristics on the file content.

Luckily, these heuristics are quite reliable and time proven by diff tools and source control management software like git or svn.

istext.jar is a Clojure/JVM library to tell apart binary and text files with these heuristics:

  • take the first 1KB of a file
  • if zero byte is found, file is considered binary
  • if less than 85% bytes are ASCII-printable, file is considered binary
  • otherwise file is considered text file

Feel free to use it in your project. It is written in Clojure and compiled to standard Java .jar so with any luck you should be able to use it from Java, Groovy, JRuby, although I have not tested these options.

]]>
http://thesingularity.pl/blog/2010/how-to-distinguish-between-binary-files-and-text-files/feed/ 0
Twój komputer domowy w iPhonie. Cały. Poważnie. http://thesingularity.pl/blog/2010/twoj-komputer-domowy-w-iphonie-caly-powaznie/ http://thesingularity.pl/blog/2010/twoj-komputer-domowy-w-iphonie-caly-powaznie/#comments Sat, 03 Apr 2010 18:55:36 +0000 qertoip http://thesingularity.pl/blog/?p=531 Continue reading ]]> Jeśli żyjesz w cywilizowanej części świata (tzn. pokrytej szczelnie zasięgiem 3G lub WiFi), mam dla Ciebie świetną wiadomość.

Możesz zdalnie korzystać z komputera domowego za pomocą iPhone’a. Jest to możliwe dzięki technologii VNC, bazującej na otwartym protokole RFB.

Po jednorazowej konfiguracji, Twój iPhone wyświetla pulpit komputera 1:1. Pulpit zdalny umożliwia wykonanie wszystkich tych czynności, które możesz robić siedząc przy komputerze.

Serwer VNC instalujesz na komputerze domowym (czyli tym, który będzie sterowany). Klienta VNC instalujesz na iPhonie.

Oczywiście klientem może być także inny komputer. Wtedy nie trzeba nawet instalować oprogramowania klienckiego – wystarczy Java. Serwer VNC wystawia aplet Javy, który pełni funkcję klienta… fantastyczny pomysł!

Do wyboru mamy kilka serwerów i klientów VNC dla różnych sytemów operacyjnych. Wydaje się, że najbardziej niezawodne i przyjazne jest oprogramowanie RealVNC – zarówno serwerowe jak i klienckie.

Pamiętaj, że po instalacji serwera VNC, musisz zrobić wyjątek na firewallu i forwardować porty na routerze, aby Twój komputer był widoczny z zewnątrz na porcie 5900.

Możliwości są nieograniczone. Kilka przykładów. Wyobraź sobie, że siedząc na sedesie w Pałacu Kultury i Nauki, chcesz:

  • zajrzeć do pliku leżącego na domowym komputerze
  • wysłać sobie/komuś lokalny plik
  • zlecać i nadzorować długie pobieranie z p2p czy rapidshare
  • zarządzać długimi procesami w tle, np. Seti, symulacje
  • pomóc mamie w obsłudze komputera, włączyć jej film
  • zrobić domownikom psikusa

Warto skonfigurować, opad szczęki murowany :-)

]]>
http://thesingularity.pl/blog/2010/twoj-komputer-domowy-w-iphonie-caly-powaznie/feed/ 0
iPhone – edycja plików Excel, Word, Power Point http://thesingularity.pl/blog/2010/iphone-edycja-plikow-excel-word-power-point/ http://thesingularity.pl/blog/2010/iphone-edycja-plikow-excel-word-power-point/#comments Sat, 03 Apr 2010 17:56:06 +0000 qertoip http://thesingularity.pl/blog/?p=541 Continue reading ]]> Goły iPhone 3GS ma wbudowane przeglądarki (read-only) dokumentów MS Office, w tym Worda, Excela i Power Pointa. Ale co jeśli chcemy wykorzystać kalkulator_ubezpieczeniowy.xls, poprawić prezentację.ppt, lub pracę_magisterską.doc?

Z pomocą przychodzi pakiet Documents To Go. Umożliwia pełną edycję i zapis plików MS Office od wersji 2003 po 2008. Pakiet poradził sobie z bez zastrzeżeń z kilkoma plikami, które nim obrabiałem.

Dokumenty mogą pochodzić z synchronizacji Wi Fi (producent udostępnia do tego oprogramowanie desktop) lub z załączników poczty (aplikacja ma własnego klienta – niestety nie potrafi dobrać się do załączników klienta wbudowanego).

Pakiet Documents To Go dostępny jest dla wszystkich popularnych smartphone’ów.

Biorąc pod uwagę zamkniętość formatów MS Office 2003 i całkowicie inny system operacyjny (Excel – Windows, Documents To Go – Mac Os X Mobile), aplikacja jest imponującym osiągnięciem inżynieryjnym!

]]>
http://thesingularity.pl/blog/2010/iphone-edycja-plikow-excel-word-power-point/feed/ 0
iPhone niczym ZX Spectrum http://thesingularity.pl/blog/2010/iphone-niczym-zx-spectrum/ http://thesingularity.pl/blog/2010/iphone-niczym-zx-spectrum/#comments Mon, 29 Mar 2010 17:11:12 +0000 qertoip http://thesingularity.pl/blog/?p=551 Continue reading ]]> Kilka dni temu nabyłem iPhone’a i słuch po mnie zaginął. Przynajmniej na blogu.

Ostatni raz taką zajawkę do technologii miałem w podstawówce. To był ZX Spectrum.

W podstawówce było o tyle lepiej, że nie miałem dziewczyny. Nikt nie odrywał mnie od spraw zasadniczych.

Pierwszą rzeczą jaką zrobiłem po nabyciu był jailbreak via blackra1n. Później serfowanie po sieci. W iPhonie to naprawdę wygodne. Chce się wykopywać, blipować, fanpejdżować i kontomierzować.

Jako telefonu użyłem iPhone’a następnego dnia.

Wracam do zabawy.

]]>
http://thesingularity.pl/blog/2010/iphone-niczym-zx-spectrum/feed/ 0
http://thesingularity.pl/blog/2010/kurwa/ http://thesingularity.pl/blog/2010/kurwa/#comments Mon, 22 Mar 2010 22:19:16 +0000 qertoip http://thesingularity.pl/blog/?p=561 Kurwa

]]>
http://thesingularity.pl/blog/2010/kurwa/feed/ 0
Inline embedded images in HTML mailing with Rails ActionMailer http://thesingularity.pl/blog/2010/inline-embedded-images-in-html-mailing-with-rails-actionmailer/ http://thesingularity.pl/blog/2010/inline-embedded-images-in-html-mailing-with-rails-actionmailer/#comments Thu, 18 Mar 2010 13:10:54 +0000 qertoip http://thesingularity.pl/blog/?p=571 Continue reading ]]> Sometimes you may want to send HTML e-mails with small images (like your logo) ebedded in the e-mail source. With this technique, images will be instantly shown in mail client and your message will look professionally. Cons are larger message size and some chance of being marked as spam.

There are three issues:

  • how to embed images directly in the e-mail source?
  • how to refer these images in the <img src=”">?
  • how to structure MIME parts so that text/html part could refer other parts?

Here is example from personal finance app kontomierz.pl, solving all those issues:

class NewsletterMailer < ApplicationMailer

def newsletter( user )
setup_email( user )
from( NO_REPLY_EMAIL )

subject( ‘Zastanawiałem się dzisiaj…’ )

content_type( “multipart/related” )

part “text/html” do |p|
p.body = render_message( “newsletter.text.html”, { :user => user, :show_adrian => true } )
end

part(
:content_type => ‘image/jpeg’,
:transfer_encoding => ‘base64′,
:body => File.read( “#{Rails.root}/public/images/newsletter/header.jpg” ),
:headers => { ‘Content-ID’ => ‘<header.jpg@kontomierz.pl>’ } )
part(
:content_type => ‘image/jpeg’,
:transfer_encoding => ‘base64′,
:body => File.read( “#{Rails.root}/public/images/newsletter/footer.jpg” ),
:headers => { ‘Content-ID’ => ‘<footer.jpg@kontomierz.pl>’ } )
part(
:content_type => ‘image/jpeg’,
:transfer_encoding => ‘base64′,
:body => File.read( “#{Rails.root}/public/images/newsletter/adrian.jpg” ),
:headers => { ‘Content-ID’ => ‘<adrian.jpg@kontomierz.pl>’ } )
part(
:content_type => ‘image/jpeg’,
:transfer_encoding => ‘base64′,
:body => File.read( “#{Rails.root}/public/images/newsletter/adrian_signature.gif” ),
:headers => { ‘Content-ID’ => ‘<adrian_signature.gif@kontomierz.pl>’ } )
end

end

Then, in your template, use:

<img src=”cid:header.jpg@kontomierz.pl”>

…to refer embedded images. Notice lack of <> in the filename.

Voilla!

]]>
http://thesingularity.pl/blog/2010/inline-embedded-images-in-html-mailing-with-rails-actionmailer/feed/ 1
Three Foot Seducer http://thesingularity.pl/blog/2010/three-foot-seducer/ http://thesingularity.pl/blog/2010/three-foot-seducer/#comments Mon, 01 Mar 2010 18:58:34 +0000 qertoip http://thesingularity.pl/blog/?p=581 Continue reading ]]> (This is a talk I gave recently at Toastmasters meeting)

Sean Stephenson. A three foot man. Well, it doesn’t really matter because he can’t stand on his own feet anyway. He is confined to wheelchair. Permanently.

He was born with a rare disorder osteogenesis imperfecta with most of his bones broken. The infant was expecteed to die within 24 hours. But somehow he survived. His bones were so fragile they could break just because he sneezed. When children played basketball, he was often lying in his bad, crying in pain, having the next bone broken. By the age of 18 he suffered over 200 bone fructures. He had all the reasons in the world to break down and develop a major depression.

Now, fast forward. Years later.

Sean Stephenson is an amateur bodybuilder and leads a healthy vegetarian lifestyle. His bones are no longer fragile although he is still three foot man on a wheelchair. He travels the world more in a year than most of us in a lifetime.  Sean graduated university with best honors and is pursuing a doctorate. He worked in a White House with Bill Clinton. He spoke to Congress. He is a renowned therapist in his own clinic, He is a coach and a professional speaker. He wrote a best selling book “Get of your BUT”.

Quite impressive as for his physical limitations.

His was noticed by major media. From New York Times to Oprah, he explains how he developed such a successful career despite his severe condition.

But what about sex? What about true love? Is he capable of experiencing success in those fields too? Is a three foot guy on a wheelchair capable of creating sexual attraction?

For years Sean faced rejection. He did try. Tens of times. And failed. Every single time. He was hearing this again and again. “Sean, let’s just be friends”. It’s the worst thing any man can hear from a woman. BTW, did you have this experience? “Let’s just be friends” she says and thinks “you won’t get there, forget it boy”. Right?

It was even worse in Seans case. He pushed the girls, asking them “why, tell me why?” And the answers were along the lines “to be honest, it’s because of your condition”, or “well, I just never pictured myself with a guy on a wheelchair”.

Again, Sean had a perfect reason to indulge in a self pity and give up the pursuit  for intimate love.

But he didn’t.

Again fast forward several years.

Something magical happened. Sean is having crazy sex with his hot girlfriend. How come? I mean, not a hooker. A true girlfriend. And it’s not the first one. Not the second one. Actually, the small bastard is picking up the girls on a daily basis at charity events, bookstores, art galleries and conferences almost like Hank Moody in Californication.

One wouldn’t believe except there’s overhelming evidence of his adventures. In fact, he became so successful with girls that man actually started to ask him for advice and soon he was forced to embrace a profession of a dating coach.

So, how does he do it? I guess we are running out of time… but it may well be the theme for my next speech, if you like… or not if you don’t.

Sean is the most inspiring man I can think of. Very powerful role model for personal development. With his unique example, he shutters any excuse we may have.

So, the message is clear. It seems anything is possible, for anyone.

]]>
http://thesingularity.pl/blog/2010/three-foot-seducer/feed/ 0
Git – how to delete a remote branch? http://thesingularity.pl/blog/2010/git-how-to-delete-a-remote-branch/ http://thesingularity.pl/blog/2010/git-how-to-delete-a-remote-branch/#comments Fri, 26 Feb 2010 19:05:00 +0000 qertoip http://thesingularity.pl/blog/?p=591 git push origin :remote_branch_name

Would you guess? In fact, it is special case of the general push syntax:

git push origin local_branch_name:remote_branch_name

Thus, the explaination is "take nothing on my side and make it be remote_branch_name".

]]>
http://thesingularity.pl/blog/2010/git-how-to-delete-a-remote-branch/feed/ 0