Friday, September 16, 2011

Sposób na zrywane sesje SSH

Nie wiem dlaczego, ale albo mój router, albo mój dostawca (UPC) wciąż zrywa nieaktywne sesje SSH. Nie ma mowy o zostawieniu Puttego w tle choćby na kwadrans. Po kilku minutach okno informuje mnie iż połączenie zostało zerwane i muszę wracać do mojej pracy ponownie. Frustrujące.

Jest na to sposób. Zostawienie otwartego w konsoli Screena, który na dolnym pasku wyświetla godzinę. Tak więc wpis:
caption always "%`$USER%`@%H: %{kg} %L=%-Lw%45>%{yk}%n%f* %t%{-}%+Lw%-0< %= %{yk}%c%{kg} load:%l"
w pliku ~/.screenrc właściwie załatwia sprawę. Kwestia startowania sesji podczas każdego logowania. Można to załawić dodając na końcu pliku ~/.bashrc
# Start or resume screen
if [[ -n "`screen -ls | egrep '\.default(.*)(Detached)'`" ]]; then
    screen -r default
elif [[ -n "`screen -ls | egrep '\.default(.*)(Attached)'`" ]]; then
    false
else
    screen -S default
fi

Monday, September 12, 2011

Internet i MMSy w Play na HTC Dream

Teoretycznie skonfigurowanie telefonu w play to wysłanie SMSa o treści "play" na numer 9999. Jeżeli posiadasz HTC nie jest to tak proste. Na moim HTC Dream wymagało to podjęcia następujących kroków:
Menu > Ustawienia > Opcje bezprzewodowe > Sieci komórkowe >  Punkty Dostępowe > Menu > Nowa nazwa APN


Internet


  • Nazwa: Internet
  • APN: internet
  • MCC: 260
  • MNC: 06
  • Typ APN: default


MMS

  • Nazwa: MMS
  • APN: mms
  • MMSC: http://10.10.28.164/mms/wapenc
  • Proxy dla wiadomości MMS: 10.10.25.5
  • Port MMS: 8080
  • MCC:260
  • MNC: 06
  • Typ APN: mms
Po zapisaniu uruchom ponownie telefon.

Saturday, September 3, 2011

Ruby On Rails 3.1 - dzień pierwszy

Zawsze uważałem, że najlepszy poradnik, to zbiór wskazówek pisanych przez początkującego, nie koniecznie zaś zapełniane przez mądrego człowieka annały, które jak na początek, mogą być za mądre. Równocześnie, najlepiej aby początkujący miał już doświadczenie z innymi podobnymi zagadnieniami  jednak w danej technologii był początkujący. Taki układ daje duże szanse, że poradnik będzie profesjonalny, pisany prostym językiem i zrozumiały dla maluczkich, którzy oczekują prowadzenia krok po kroku. Mam nadzieję, że moje wpisy o Ruby On Rails 3.1 takie właśnie będą.

Dlaczego?

Mam za sobą już, od jakiegoś czasu, Rails for Zombies, czytałem o Ruby On Rails i jeszcze nigdy nie spotkałem się z osobą, która zaczęłaby kurs Railsów od RVM. Podstawy podstaw - jak na mój gust.

Gdy piszesz jakikolwiek program, aplikację musisz zdecydować się na dwie rzeczy: wersję języka programowania i wersję pozostałych bibliotek, które używasz. U mnie to wygląda tak: zaglądam na stronę języka programowania (w tym przypadku języka Ruby), zaglądam na stronę biblioteki (w tym przypadku Railsów) i nakręcam się na napisanie aplikacji w najnowszej wersji, która wprowadza najświeższe udogodnienia, nowości, nowatorskie technologie i wszystko co sprawia, że bycie geekiem jest piękne i pełne wrażeń jak przejażdżka górską kolejką w parku "Six Flags Great Adventure".

Później przychodzi faza druga, która nazywa się "sprawdźmy co jest na serwerze" i ta przynosi znacznie więcej rozczarowań, niż radości dopóki nie używasz ArchLinux lub nie jesteś twórcą biblioteki, której właśnie zamierzasz użyć. Wtedy klniesz pod nosem, że "przecież administrator mógł przejść na sida" i jakbyś tylko miał uprawnienia użytkownika root!
I tutaj właśnie objawia się piękno RVM. Pozwala ono bowiem bez uprawnienia super-użytkownika zainstalować dowolne wersje języka Ruby, w locie podmieniać interpreter oraz wersje używanych bibliotek, które w wielu różnych kombinacjach mogą koegzystować w wirtualnych środowiskach zwanych gemsetami. Wszystko bez wychodzenia poza katalog domowy.

Friday, August 26, 2011

Jak korporacje dobierają narzędzia

Ten post jest próbą wyrzucenia z siebie drzemiącej głęboko frustracji dotyczącej fatalnego podejścia do doboru narzędzi, w korporacjach, z którymi się zetknąłem.

Trawestując znanego survival-owca oraz Naczelnika Skautów Wielkiej Brytanii "Narzędzia są po to aby wykonywały pracę za Ciebie - nie na odwrót.". Choć zdanie to dotyczyło konserwacji i ostrzenia piły, noża czy siekierki, to pasuje również do naszej, jakże przepełnionej narzędziami, informatycznej rzeczywistości.

Rozpoczynając pracę musisz wybrać narzędzia. Jednak samo ich posiadanie nie rozwiązuje problemu - musi nastąpić etap selekcji. Selekcji, która w dużych firmach podejmowana jest raz i nieodwołalnie, często kilka, anawet kilkanaście lat przed rozpoczęciem projektu, któremu przyjdzie z nich korzystać.

Innymi słowy, narzędzia wybierane są globalnie w skali całej firmy i w tej samej firmie ich używanie jest egzekwowane bez względu na charakter i rodzaj przedsięwzięcia. Zdarza się iż używany jest system kontroli wersji, którego początki pamiętają roku 1992, którego założenia koncepcyjne są na tle nowoczesnych systemów kontroli wersji z gruntu złe. Ogromna ilość pieniędzy, stworzona infrastruktura, ilość znanych rozwiązań problemów oraz doświadczenie tworzą pozorną wartość przekładającą się na równie pozorną łatwość w użyciu tak dobrze "sprawdzonego" i "sprawdzającego się" narzędzia w kolejnym projekcie.

Jednak wszystko to jest iluzoryczne. Przyzwyczajenia ludzi nie świadczą o jakości narzędzia, ani o sprawności jego używania gdyż nawet większa nieudolność, w wykorzystywaniu nowego oprogramowania na początku, może być błyskawicznie zniwelowana sumą zwiększonej prędkości jego działania oraz dobrze przygotowanym programem szkoleń dla osób początkujących, posuniętego nawet do algorytmów postępowania.

Równie fałszywe jest wrażenie "problemów, z którymi przyjdzie nam się zmierzyć". Często zakładamy, że skoro oprogramowanie zaproponowane przez firmę sprawiło nam wiele kłopotów, to wraz z wprowadzeniem nowego narzędzia pojawią się nowe. Nikt jednak, bardzo często, nie zauważa, że znaczna część tych problemów wynika z wieku narzędzia i architektury oraz koncepcji, które bardzo często nie przystawały do współczesnych realiów. Realiów, w których zostało stworzone nowe narzędzie, dzięki któremu będziemy mogli zminimalizować portfolio "dobrze znanych rozwiązań, dobrze znanych problemów" nawet o 90%.

W epoce kamienia łupanego ludzie do krojenia używali ostrych kamieni. Używali ich ponieważ sprawdzały się, a w pobliżu nie było nic bardziej dostosowanego do krojenia. Dzisiaj jednak używamy noży, toporów, siekier, pił i scyzoryków. Używamy ich na drodze prostej ewolucji, w której narzędzia mniej przydatne przestawały być używane, odchodziły w niepamięć, a zastępowały je lepsze, bardziej użyteczne odpowiedniki. O tym czy narzędzie i jego wykorzystywanie przetrwało do naszych czasów czy nie decydowała jego efektywność.

Kiedy się temu przyjrzymy, wydaje się to rzeczą naturalną. Można wręcz powiedzieć iż stwierdzenie przybliżone w poprzednim akapicie trąci truizmem. Truizm ten nie jest niestety oczywisty w korporacjach, w których w kółko i na okrągło wykorzystuje się stare, zakupione dekadę, albo dwie temu programy. Pomimo dziesiątek problemów i dawno stwierdzonych wad są używane w kolejnych projektach.

Jednak nie tylko wykorzystywanie archaicznych rozwiązań, na dużą skalę, może być błędem. Git to niewątpliwie fantastyczny system kontroli wersji. Pomyli się jednak ten, kto użyje go do projektu Visual Studio 2010, w środowisku opartym o kontroler domeny Windows. Wystarczy bowiem przyjrzeć się Mercurialowi aby dostrzec zalety w formie: natywnego wsparcia dla okienek, świetnej integracji z Visual Studio 2010 dzięki wtyczce VisualHG (znacznie lepszej niż jakakolwiek integracja Gita z Visualem), czy wsparcia dla Single Sign On w postaci HGKerberos, która działa z SPNEGO.

Na tym przykładzie widać, że narzędzia można dobrać lepiej lub gorzej, albo po prostu źle. Moim zdaniem idealnym rozwiązaniem jest tworzenie architektury "per-projekt", w których używane narzędzia będą symbolem "epoki", w której projekt startował. Doskonale rozumiałbym używanie tak archaicznego systemu kontroli wersji jak CVS w projekcie z lat 90siątych, tak jak używanie Subversion w narzędziu, którego początki są datowane na 2000 rok. Konsekwentnie, dobierając nowoczesne rozwiązania do projektów, które powstały na przestrzeni kilku ostatnich lat.


Saturday, August 20, 2011

Świetny program do robienia screenów pod Windows

Zawsze zachwycały mnie screeny prezentowane w sieci przez użytkowników komputerów Mac. I nie chodzi mi o cukierkowy interfejs OS X, ale o ładnie opisane, zaznaczone, wskazane przejrzystymi strzałeczkami elementy.

Zacząłem szukać oprogramowania pod Windows, nawet płatnego, który pozwoliłoby tworzyć równie schludne obrazy, pozwalając na nanoszenie strzałek czy napisów.

Początkowo, wraz z wydaniem Windows 7, zwrócił moją uwagę program "Narzędzie Wycinanie" dostępny wraz z systemem operacyjnym. Był to pierwszy raz kiedy do robienia zrzutu ekranu nie używało się guzika Print Screen, a wykorzystywanym programem wcale nie był Paint.

Pomimo znacznie podwyższonej wygody korzystania możliwości "Narzędzie wycinanie" nie zachwycały. Kilka miesięcy później trafiłem na Screenpresso. O kupnie programu myślałem już nie raz jednak żadna z dostępny po zapłacie opcji nie jest mi do szczęścia potrzebna i darmowa wersja w stu procentach spełnia moje potrzeby i oczekiwania.

Po zainstalowaniu program podpina się pod klawisz PrintScreen przyciemniając ekran i dając nam możliwość wyboru obszaru, który chcemy umieścić na zrzucie. Już na tym etapie otrzymujemy dwa udogodnienia: małą lupkę w prawym dolnym rogu ekranu, która pozwala nam dzięki powiększeniu precyzyjnie dobrać współrzędne prostokąta oraz szalenie użyteczny detektor kontrolek Windows, który po najechaniu zaznacza jej obszar sugerując nam wykonanie screenshotu tego konkretnego okna, pola, przycisku czy obszaru.

Chwilę później możemy już skopiować zawartość zrzutu [CTRL]+[SHIFT]+[C], plik ze zrzutem [CTRL]+[C], zmienić nazwę pliku [F2] czy usunąć nasze dzieło [DEL]. Najciekawszą opcją jest otworzenie zrzutu w wewnętrznym edytorze [ALT]+[E].

Opcji dostępnych w otworzonym przed chwilą oknie nie powstydzi się nawet użytkownik MacOSX. Program pozwala nam:
  • nanosić strzałki
  • tekst
  • zaznaczać eliptyczne lub prostokątne obszary
  • dodawać dymki i ikony
  • numerować punkty
  • podświetlać lub zamazywać fragmenty obrazu
Wszystkie elementy wyglądają szalenie elegancko i schludnie a efekt końcowy naprawdę cieszy oko.

Jeżeli nie wystarcza nam zaznaczanie obszaru ScreenPresso oferuje wykonanie screenshotu poprzednio użytego regionu, całego ekranu lub wykonanie zrzutu tuż po puszczeniu paska przewijania jednego z okien.

Edit
W myśl dewizy "zarabiam - płacę" zakupiłem wspomniany program w celu odblokowania opcji kręcenia filmików dłuższych niż, dostępnych w wersji darmowej, 15 sekund.

To co mile zaskakuje - nie musimy ujmować na filmie całego ekranu - możemy wyznaczyć obszar, który zostanie ujęty na filmiku. Niestety, to wszystko co oferuje obecnie w tej materii ScreenPresso. Nie znajdziemy tu żadnych zaawansowanych efektów, możliwości podświetlania i zaznaczania, przejść czy podążania za kursorem - mam jednak nadzieję, że to czasowe :)

Po nakręceniu filmiku jest on zapisywany w formacie zrozumiały wyłącznie dla wewnętrznego edytora. Aby udostępnić pozostałym nasze dzieło musimy korzystać z opcji konwersji. Tutaj nie możemy narzekać na brak możliwości: MP4, WebM, OGV, WMV czy witryna HTML5. Podążanie za trendami twórców oprogramowania aż zaskakuje.

Każdemu kto tworzy wiele instrukcji i szuka dobrego programu do ubogacania jej zrzutami serdecznie polecam!

Saturday, June 18, 2011

Języki ponad-maszynowe

Odnośnie poprzedniego wpisu, moim zdaniem świat programistyczny powinien zainwestować więcej uwagi w kierunek jaki obrał chociażby PyPy czy Rubinius. Implementacje języków programowania, które są niezależne od maszyny wirtualnej, z której przyjdzie nam korzystać.

Pewne uniwersalna rodzina dialektów, które możemy wybierać do potrzeb danego zagadnienia nie zastanawiając się czy nasza aplikacja będzie działała na Androidzie, Linuksie, czy MacOS X. To jest moim zdaniem przyszłość.

Jeżeli o maszyny wirtualne chodzi - można zaobserwować ciekawe zjawisko. Pewien szczególny rodzaj maszyny wirtualnej, dostępnej wszędzie wytworzył się "przypadkiem". O dziwo jest nią przeglądarka internetowa. Połączony z tym rozwój takich standardów jak HTML5, CSS3 i projektów z nimi powiązanymi, problemy z technologią Flash na platformach mobilnych sprawiły, że dzisiaj przeglądarka internetowa/sieć jest najczęściej wybieraną platformą do tworzenia oprogramowania. Jeżeli już dziś chcemy napisać oprogramowanie, która za 20 lat będzie działało na kaczuszce do kąpieli naszego dziecka - zaimplementujmy to w JavaScript. Dzięki CoffeeScript, SprouteCore, ExpressJS, NodeJS JavaScript przychodzi pod strzechy. Za nią zaś stoją niewyobrażalnie zoptymalizowane maszyny wirtualne, które są od lat tuningowane i wystawiane do prezentowania swoich możliwości na torze zwanym Internet. Tutaj nie ma miejsca na pozorne rozwiązania - współzawodnictwo jest zacięte, a konkurencja nie śpi.

Może się wydać to nietypowe. Każdy język programowania posiada jedną maszynę wirtualną, stworzoną dla niego - JavaScript posiada ich aż kilka. Gdyby nie CoffeeScript - to z jej ohydną składnią i obleśną semantyką ociekającą toną wtfjs byłaby jak rozprzestrzeniające się na ogromną skalę trucizna. Na szczęście ludzie zaczęli ją oswajać i powoli uczą się ją wykorzystywać do tworzenia leków, znaleźli już wiele ciekawych zastosować.

Rodzi się pytanie - czy i jak JavaScript będzie można sprzedać? Język programowania, wykorzystywany do tej pory "dla bajeru", przez domorosłych informatyków, używany do pisania małych fragmentów, wstawek kodu staje się kompletnym rozwiązaniem z armią, przez lata optymalizowanych w wyścigu "zbrojeń" maszyn wirtualnych w drugim szeregu.

Język, w którym nie jest znana mi żadna metoda dająca zaczepienie oprogramowaniu "closed-source", gdzie jedyną metodą "chronienia" kodu jest jedynie jego zaciemnianie. Czyżby polimorfizm znany z pierwszych lat tworzenia wirusów? Zobaczymy.

Java w nowych projektach i racja jej bytu.

Czas języków programowania dawno minął - nastał czas dialektów maszyn wirtualnych.

Od kilku dni w firmie zatrudniani są programiści języka Java. Po rozmowie z zatrudniającymi managerami załamałem się - bo niby dlaczego Java?

Pisząc aplikację dla platformy Android, czy rozwijając Rational Team Concert to czego potrzebujesz to - plik wynikowy, zrozumiały dla JVM, napisany w konkretnej konwencji, używający konkretnych bibliotek a nie Java!

Jakie miejsce powinni zajmować dziś programiści C++ czy Java? Rozwijać dalej istniejące, dobrze napisane, oprogramowanie.

W dzisiejszych czasach możemy mówić o dialektach maszyn wirtualnych. Ślepe wybieranie dialektu języka Java do pisania oprogramowania dla JVM to po prostu zaściankowość i ciemnota.
Wiele innych: Clojure, jRuby, Jython, Noop czy chociażby Scala - mogą w danym zastosowaniu znacznie skrócić czas kodowania, podwyższyć jakość oprogramowania, obniżyć stopę występowania błędów, znacznie zwiększyć jakość kodu. W skrócie: skoro może być szybciej i lepiej to po co trzymać się języka Java? Trawestując Martina Klepmann : "Modern language programming is good 'quality filter' for people."

Oczywiście: nadal istnieje wiele powodów, dla których utkniemy z kolejnym projektem w języku Java. Brak developerów danego języka na rynku to podstawowa przyczyna - choć może być ich więcej. Moim zdaniem należy jednak próbować, podejmować wyzwania i ryzykować bycie innowacyjnym - to się opłaci.