VPN to podstawa czyli jak postawić VPN na Raspberry PI

Internet jest tak podstawową rzeczą, że coraz więcej osób w ogóle nie zastanawia się nad kwestiami bezpieczeństwa. Problem jednak jest spory bo z internetu korzystamy praktycznie nonstop. Niestety często z dziwnych sieci w dziwnych miejscach. Jak konferencje, hotele czy kafejki. Wszystko jest ok do póki mamy wieloskładnikowe hasła do poczty czy innych ważnych serwisów albo przeglądamy przysłowiowego pudelka. Co jednak jeśli potrzebujemy zrobić coś co wymaga większego bezpieczeństwa? Ja korzystam z VPN-a. Nowoczesne smartfony bardzo dobrze sobie radzą z VPN-ami więc wystarczy kilka kliknięć i mamy wirtualnego kondomka.

VPN w routerze

Wiele poważniejszych routerów ma wbudowany serwer VPN. Wystarczy skonfigurować i używać. Problem jest tylko taki, ze trzeba mieć odpowiedni router, który niekoniecznie musi być tani. Nawet jeśli ten, który masz teraz ma opcję VPN server to następny niekoniecznie. Po co zawężać sobie możliwość wyboru routera. Ja proponuję zrobić własny VPN.

Własny VPN

Do zrobienia własnego serwera VPN będziemy potrzebować:

  • 1x Raspberry PI
  • 1x kabel sieciowy lub wifi tak aby malinka była widoczna w naszej domowej sieci
  • 1x karta sd bo na czyms trzeba to postawić
  • 1x Linux – taki do malinki 😉

Instalacja

Mając poprawnie działającą malinę wystarczy z poziomu cmder-a odpalić ssh

[code]

ssh -l <userName> <ip malinki np:192.168.1.2>

[/code]

sprawdzamy czy system ma odpowiednie moduły:

[code]

sudo modprobe ppp-compress-18

[/code]

jeśli nic się nie wyświetliło to (podobno) jest okej

dalej instalujemy pptpd

[code]

sudo apt-get install pptpd -y

[/code]

PPTP to nie jest najlepszy najbezpieczniejszy i najwspanialszy VPN pod słońcem. W firmie nie wdrożyłbym go ale do celów domowych jest w zupełności wystarczający więc jedziemy dalej.

Trzeba to cudo skonfigurować czyli:

[code]

sudo nano /etc/pptpd.conf

[/code]

i na końcu wrzucamy:

[code]

localip <ip malinki np.: 192.168.1.2>
remoteip <ip jakie dostaną klienci np.: 192.168.1.100-110>

[/code]

następny plik pptpd-options

[code]

sudo nano /etc/ppp

[/code]

i na końcu wrzucamy:

[code]

nobsdcomp

ms-dns <ip routera np.: 192.168.1.1>
noipx
mtu 1490
mru 1490

[/code]

teraz najważniejsze czyli super tajne hasło

[code]

sudo nano /etc/ppp/chap-secrets

[/code]

i wpisujemy:

[code]

# Secrets for authentication using CHAP
# client server secret IP addresses
<nazwa uzytkownika> * <hasło> *

[/code]

Gwiazdki są potrzebne – bez nich nie działa. Wszystko rozdzielamy tabulatorami bo inaczej też nie działą (kocham białe znaki 😐 ).

Na koniec jeszcze

[code]

sudo nano /etc/sysctl.conf

[/code]

i na końcu wrzucamy:

[code]

net.ipv4.ip_forward=1

[/code]

Restart malinki i vpn powinien działać. (albo restart samej usługi sudo /etc/init.d/pptpd restart).

Teraz pozostaje tylko na routerze włączyć przekierowanie. Jeśli chcesz stawiać VPN to wiem że wiesz o co chodzi. Więc tylko dla formalności przekierowujemy port 1723 (lub zakres 1723-1723) na IP naszej malinki.

W tym momencie wystarczy w komórce wyłączyć WiFi i skonfiguroawć VPN na nasze IP (swoje IP sprawdzisz  tutaj https://www.whatismyip.com/) Jeśli wszystko jest dobrze skonfigurowane to się połączysz, jeśli się nie połączysz to nie 🙂

 

Zmienne IP

Co jak mam zmienne IP? Wiele routerów potrafi zarejestrować się w DynDnsie ale problem jest taki, że DynDns jest płatny. Niewiele ale płatny. Co gorze, różne routery różne dynamic dns-y wspierają. Więc znowu przy zmianie routera może się okazać, że trzeba by zmienić usługodawcę. Na szczęście można prościej. Niechaj nasza malinka ogarnie wszystko. Instalujemy DDClient-a

[code]

sudo apt-get install ddclient

[/code]

 

DDClient potrafi obsłużyć całkiem sporo dostawców dynamic dns. Więc do wyboru do koloru. Ja zaczynałem dawno dawno temu z DynDnsem potem się zrobił płatny. Potem długi czas używałem właśnie przez DDClienta No-Ip ale oni co miesiąc wysyłają maila, żeby przedłużyć dzierżawę – bojąc się, że zapomnę kliknąć na czas co by skutkowało, że po zamknięciu konta akurat potrzebowałbym tego bezwzględnie przesiadłem się na freedns (http://freedns.afraid.org)

zatem moja konfiguracja DDClienta dla freedns:

[code]

sudo nano /etc/ddclient.conf

[/code]

[code]

daemon=1m
timeout=10
use=web, web=checkip.dyndns.com/, web-skip=’IP Address’

ssl=yes
protocol=freedns
server=freedns.afraid.org
login=<moj login>
password=<moje haslo>
<moja domena np.: dom.mooo.com>

[/code]

Od teraz nie straszne nam zmienne IP, nie straszna nam zmiana routera. Mamy własny osobisty VPN. Co najlepsze, możemy go zabrać do kieszeni i postawić gdziekolwiek w 3 min (pamiętając jedynie o przekierowaniu tego 1 portu na routerze).

Koszty malinki są tak niskie, że można spokojnie żyć zgodnie z Single Responsibility Principle. 1 Serwer jedna odpowiedzialność, 1 malina = VPN-a i jesteśmy szczęśliwi i mocno niezależni.

 

 

 

Połowę czasu spędzamy w pracy

We wpisie o sprzeczności interesów pracodawca-pracownik napisałem, że spędzamy połowę życia w pracy.  Zakładając 8h snu pozostaje 16h “świadomego życia” z tego 8h w pracy ale przecież od poniedziałku do piątku, i jeszcze są święta no i urlop – jak wyliczył Paweł 250 dni pracujących – 26 dni urlopu (do tego jeszcze możemy mieć 2 dni opieki etc). Wszystko się zgadza…

… z tą drobną różnicą, że praca to nie 8h. Do tego trzeba doliczyć czas dojazdu – w obie strony. Czyli jeśli wyjście z domu, odpalenie samochodu, przetransportowanie się do firmy oraz zaparkowanie zajmuje tylko 30 minut w jedną stronę, to tak naprawdę czas pracy to 9h (zakładam, że trzeba jeszcze wrócić). W tygodniu to dodatkowe 5h z życia wyjęte. Co więcej, transport kosztuje, czy to czas jeśli idziemy pieszo, czy czas i pieniądze jeśli jedziemy autobusem/autem/rowerem. Jeśli używasz jakiegokolwiek środka transportu to ten środek transportu wymaga pieniędzy – paliwa, przeglądów, napraw – i to są dodatkowe koszty na które trzeba zapracować. Czyli albo pracujemy 8h ale część tego czasu poświęcamy na opłacenie kosztów dojazdu albo pracujemy więcej.

Praca zawodowa to nie wszystko!

Niezbędną pracą, którą musimy wykonywać regularnie to również zakupy, sprzątanie, mycie i wszystko to co jest związane z obsługą samych siebie i rodziny. Policz ile czasu poświęcasz tygodniowo na zakupy, chodzenie do urzędów, lekarzy i innych placówek, które trzeba odwiedzić. W skali roku nazbiera się tego całkiem sporo. Jak to zebrać wszystko razem to obawiam się, że z tego świadomego życia  połowa chyba nawet nie wychodzi. Ilość rzeczy, które na prawdę musimy zrobić jest spora więc ważne aby pozostały czas wykorzystywać bardzo rozsądnie, w końcu mamy go niewiele – bardzo niewiele.

Jak sobie z tym poradzić?

Hm….. nie pchać się w bezsensowne aktywności, które marnują nasze zasoby a nie wzbogacają nas zbytnio. To co MUSIMY MUSIMY ograniczać w miarę możliwości do minimum i…… no właśnie, co jeszcze?

Przełączanie aplikacji bez odrywania się od klawiatury. Switcheroo

W czasie programowania lubię móc zrobić wszystko co potrzebuję bez odrywania rąk od klawiatury. Ot po prostu tak jest szybciej, co nie powoduje, że muszę się odrywać od tego nad czym pracuję na zbyt długi czas.  Przełączanie aplikacji w Windowsie jest… dobre jak uruchomi się dwie aplikacje. Przy większej ilości ALT+TAB  i  ALT+SHIFT+TAB są lekko niewydajne. Szukałem czegoś małego i sprawnie działającego, które obsługiwało by się podobnie jak wyszukiwanie klas w ReSharperze – to takie wygodne jest. Po długich poszukiwaniach trafiłem na Switcheroo

https://github.com/jsulak/Switcheroo

Proste do bólu i działa prawie idealnie. Ustawiłem na CTRL+ALT+SPACJA i śmiga pięknie.

switchero3

NSubstitute czyli lepsza wersja Moq

NSubstitute to (dla tych co nie znają jeszcze) taki Moq na sterydach. Sytuacja wygląda tak, mamy klasę, która potrzebuje jakiś zależności, mniej więcej tak:

[csharp]
public class SomeClass
{
public SomeClass(INeedSomeStuff stuff)
{
// …….
}
}

public interface INeedSomeStuff
{
string DoSomeStuff(string param);
void DoSomeOtherStuff();
}
[/csharp]

Możemy użyć moq i napisać:
[csharp]
var moq = new Mock<INeedSomeStuff>();
moq.Setup(m => m.DoSomeStuff("Hello")).Returns(r => "World");

INeedSomeStuff someStuff = moq.Object;
var someObj = new SomeClass(someStuff);
[/csharp]

lub za pomocą NSubstitue napisać dokładnie to samo tak:
[csharp]
var someStuff = Substitute.For<INeedSomeStuff>();
someStuff.DoSomeStuff("Hello").Returns("World");

var someObj = new SomeClass(someStuff);
[/csharp]

poza tym, że pozbywamy się lambd, to jeszcze nie mamy dodatkowego .Object o którym trzeba pamiętać, ot mamy zamiennik naszej klasy. Ale to nie wszystko, jest jeszcze lepiej, NSubstitute działa od razu, więc nie trzeba robić setupów w miejscach, gdzie czasem moq tego wymaga ale najlepsze to kwiatek na jaki się nadziałem przy przechodzeniu z Moq na NSubstitute. Jest kawałek kodu, który zwraca kolorki z zadanej palety, po kolej – ColorGenerator. Metoda GetColor() zwraca kolor z tablicy. Za każdym wywołaniem bierze następny kolor. Tyle teorii. Sytuacja taka, że trzeba to zamockować:

[csharp]
_mockColorGenerator.Setup(x => x.GetColor()).Returns(_colors[0])
     .Callback(() => _mockColorGenerator.Setup(x => x.GetColor()).Returns(_colors[1])
     .Callback(() => _mockColorGenerator.Setup(x => x.GetColor()).Returns(_colors[2])
     .Callback(() => _mockColorGenerator.Setup(x => x.GetColor()).Returns(_colors[3]))));
[/csharp]

Może, za pomocą moq można to napisać lepiej no ale jest (było) i działało. W NSubstitute można to zapisać tak:
[csharp]
_colorGenerator.GetColor().Returns(_colors[0], _colors[1], _colors[2], _colors[3]);
[/csharp]

Efekt ten sam tylko 6 lambd mniej, 3 callbacki mniej, ogólniej wielokronie czytelniej.

P.S. NSubstitute jest na nugecie więc instalacja jest bezproblemowa, dodatkowo można używać równolegle z moq i małymi kroczkami wycinać tego ostatniego.

NDepend 5 czyli narzędzie do prześwietlania kodu

imageWczoraj wyszła nowa wersja NDepend-a, jeszcze ciepła, cieplutka. 5-tka ma dwie rewolucyjne rzeczy, pierwsza to nowe UI, ładniejsze i bardziej “nowoczesne”, druga – i to jest dla mnie killer to dashboard. Zatem po kolej. Mamy nowe logo, które wygląda całkiem całkiem jak na moje średnio wprawne oko. Mamy wygląd czyli nowe menu, graficzki i inne takie. Wprawdzie nie jest to to co daje Visual Studio, to jednak Patrick (autor tego cudownego narzędzia) mówił, że będą dalej nad tym pracować, więc można się spodziewać, że będzie dostępny również temat a’la visual studio 2012/13. Tyle kosmetyki, teraz to co mnie najbardziej urzekło:

image.

image

imageimage

NDepend automatycznie, raz dziennie wykonuje pełną analizę i buduje wykresiki które to w czasie pokazują jak psujemy kod. Genialnie prosta i użyteczna rzecz. Wprawdzie wcześniejsza wersja protrafiła pokazywać diff z poprzednią wersją to jednak nigdy nie miałem serca aby to uruchomić. Tutaj “out of the box” to dostajemy i to działa Uśmiech a ponieważ wykresy aktualizują się automatycznie, to nie wymaga to od nas nic poza codziennym otwarciem projektu w visualu, swoją drogą, będę musiał sprawdzić jak z automatu codziennie pobrać najnowszą wersję z repo i zaktualizować wykresy.

Jest jeszcze jedna rzecz, która mnie urzekła w tej wersji. Odnoszę wrażenie, że zestaw wbudowanych zasad jest bardziej dostosowany do “Martinowskich” nauczań i tego o czym pisze Robert C. Martin w Clean Code. Oto moja lista warning-ów – i 3 krytycznych naruszeń, jak dla mnie bomba.

image

W ramach promocji, można teraz kupić NDependa z 20% zniżką. Więc jeśli nie masz tego narzędzia to może warto pomyśleć. Myślę, że każdy zespół powinien mieć przynajmniej jedną licencję bo narzędzie daje świetny ogląd na to co tam w kodzie natworzyliśmy.

Solarized czyli kolorki do Twojego IDE

Jest taka paleta kolorów – 16stu kolorów (8 podstawowych i ośmiu akcentów) podobno dobra dla wzroku. Używam od kliku dni i jak na razie jestem zadowolony – nawet trochę bardziej niż zadowolony. Paleta nazywa się solarized

http://ethanschoonover.com/solarized

Może Tobie też będzie odpowiadać. A teraz najpiękniejsza rzecz, odpowiednie pliki konfiguracyjne i instrukcja instalacji jest dostępna dla wszystkich edytorów/terminali jakie używam czyli:

image

Visual Studio 2012/2013

image

WebStorm

image

Sublime Text

image

PuTTY

ScriptCS i szybki prototyp z WebAPI

W poniedziałek pisałem, że nie testowałem scriptcs-sublime. To się już zmieniło. Zainstalowałem i działa. Co więcej zainstalowałem drugi plugin build-with-input a to wszystko po to aby móc do skryptu przesłać coś za pomocą klawiatury bezpośrednio z poziomu samego sublime text-a.

Instalacja:

w konsoli gita teleportuję się do C:\Users\[uzytkownik]\AppData\Roaming\Sublime Text 2\Packages i wpisujemy magiczne znaki runiczne:

git clone https://github.com/scriptcs/scriptcs-sublime.git

oraz

git clone https://github.com/eric-wieser/build-with-input.git

to pobierze nam najnowsze wersje dodatków scriptcs-sublime oraz build-with-input. Narzędzie naostrzone zatem przestrzelamy sublime text-a i piszemy:

[csharp]
Console.Write("what is your name : ");
string name = Console.ReadLine();
Console.WriteLine("Hello {0}",name);
[/csharp]

w konsoli możemy teraz zapodać Enter –> wpisać tekst –> jeszcze jeden Enter i mamy działający program na poziomie początkującym początkującym.

image

Proste, zatem przejdźmy do czegoś trochę bardziej skomplikowanego. Serwer z webapi w 34 linijkach.

Uruchomimy serwer na porcie 85 (powinien być wolny). Jeśli tak samo jak ja wyznajesz, że developer nie powinien mieć uprawnień administratora lokalnego to przydzielmy sobie przestrzeń nazw za nim będzie za późno 😉 W konsoli (z uprawnieniami admina)

netsh http add urlacl http://+:85/demo/webapi user=wszyscy

Oczywiście w zależności od potrzeb modyfikujemy port, resztę linku oraz usera, na którym chcemy pracować (http://msdn.microsoft.com/en-us/library/ms733768.aspx).

Pakiety:

Potrzebujemy również kilka pakietów. W katalogu w którym zapisujemy nasz plik csx wystarczy uruchomić

scriptcs -install scriptcs.webapi

to spowoduje pobranie wszystkiego co będzie potrzebne do webapi.

Kod:

A teraz mięso czyli potrzebujemy System.Net.Http deklarujemy swój kontroler (tutaj TestController), później własny header handler, który przyda się do dodania dodatkoowych nagłówków a to po to, żebyśmy mogli konsumować to api za pomocą ajaxa z dowolnej domeny. Ostatnie 10 linijek to stworzenie serwera i to wszystko.

[csharp]
using System.Net.Http;

public class TestController : ApiController {
public string Get() {
return "Hello world!";
}
}

public class CustomHeaderHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
return base.SendAsync(request, cancellationToken)
.ContinueWith((task) =>
{
HttpResponseMessage response = task.Result;
response.Headers.Add("Access-Control-Allow-Origin", "*");
response.Headers.Add("Access-Control-Allow-Methods", "GET");
response.Headers.Add("Access-Control-Allow-Headers", "X-Requested-With");
return response;
});
}
}

var webApi = Require<WebApi>();
var config = new HttpSelfHostConfiguration("http://localhost:85/demo/webapi");
config.MessageHandlers.Add(new CustomHeaderHandler());
var server = webApi.CreateServer(config);

server.OpenAsync().Wait();

Console.WriteLine("Listening…");
Console.ReadLine();
server.CloseAsync().Wait();
[/csharp]

odpalamy koda i mamy pod adresem http://localhost:85/demo/webapi serwer, który odpowiada na geta standardowym hello world.

image

wchodzimy z przeglądarki i…

image

czyli webapi odpowiedziało xml-em.

Możemy też wysłąć requesta np z webstorma (lub fiddlera) i zassać jsona:

image

A może ajaxem:

[javascript]
$.ajax({
url:’http://localhost:85/demo/webapi/test’
}).done(function(response){
alert(response);
})
[/javascript]

image

Całkiem dobry start aby napisać jakiś model backendu w webapi i szybko zacząć prototypować html-e

ScriptCS czyli C# bez ceremonii

O ScriptCS było głośno kilka miesięcy temu (bodajże w marcu) gdy pojawił się na .netowej scenie. W dużym skrócie jest to uskryptowiona wersja  C#-a. To powoduje, że jeśli chcemy zbudował/przetestować kawałek kodu, nie musimy odpalać całego Visuala. Wystarczy napisać:

[csharp]

Console.WriteLine(“hello scriptcs”)

[/csharp]

i powinno się wykonać (tak – na końcu nawet nie ma średnika).

Do wykonania powyższego będziemy potrzebowali najnowszych źródeł ScriptCS-a

https://github.com/scriptcs/scriptcs

które należy skompilować (albo przez VS albo za pomocą załączonego build.cmd – osobiście skompilowałem release w visualu i wrzuciłem do c:\scriptCS)

A teraz edytor… a jeśli ma być bez ceremonii i zbędnych ruchów to chcę łatwo uruchomić kawałek napisanego kodu. Sublime Text, którego dość często używam potrafi uruchamiać kod, ale trzeba go skonfigurować – standardowo jest przygotowany na 9 różnych języków ale próżno szukać tam scriptcs-a zatem:

Tools –> Build System –> New build system i dostajemy pusty szablon:

image

pozostaje wskazać co chcemy aby SublimeText zrobił. U mnie wygląda to tak:

[code]

{
"cmd": ["c:\\scriptcs\\scriptcs.exe", "$file"],
"encoding": "cp1252"
}

[/code]

Zapisujemy plik i od teraz w menu mamy:

image

Od teraz można za pomocą Ctrl+B uruchomić nasz eksperymentalny kod w C#

Nie trzeba pisać maina, nie trzeba pisać funkcji czy klas. Poniższe kawałki kodu spokojnie zadzaiłają.

[csharp]

Console.WriteLine("hello scriptcs")

[/csharp]

Można też używać samych funkcji

[csharp]

public void HelloWorld(string name){
Console.WriteLine("Hello {0} !", name);
}

HelloWorld("John");
HelloWorld("Mike");

[/csharp]

Nawet klasę to to łyknie Uśmiech

[csharp]

public class HelloWorld{

public void Say(string name){
Console.WriteLine("Hello {0} !", name);
}
}

new HelloWorld().Say("scriptCS")

[/csharp]

Od teraz mamy edytor, w którym można szybko i łatwo sprawdzić te kilka linijek kodu z Internetu i zobaczyć czy działają. Można również pisać całe aplikacje albo proste prototypy, zastosować znajdziesz pewnie miliony.

Na moje potrzeby jak na tą chwilę taka konfiguracja jest wystarczająca. Znalazłem również pełniejszą do pobrania tutaj: https://github.com/scriptcs/scriptcs-sublime Nie wiem czy działa, to co zbudowałem przed tym znaleziskiem na razie się sprawdza. Jeśli ktoś to sprawdzi, czekam na feedback.

Warsztat czyli moje narzędzia pracy–te używane sporadycznie

W zeszły czwartek opublikowałem post pod tytułem “Warsztat czyli moje narzędzia pracy”. Opisałem narzędzia, które są dla mnie obecnie najbardziej przydatne. Jednak nie są to wszystkie narzędzia dlatego poniżej zamieszczam listę sporadycznie używanych ale takich, które spełniają swoją role i mogą się przydać również Tobie:

Notepad2

jak dla mnie perfekcyjny zamiennik notatnika systemowego. Ma numerowanie linii i kolorowanie składni (dodatkowo czas używam również jako narzędzia do konwersji pomiędzy różnymi kodowaniami). Żadnych zakładek czy innych ulepszaczy. Prosty zgrabny notatnik na sterydach. http://www.flos-freeware.ch/notepad2.html

NCover

NCover to potężne narzędzie do code coverage. Potrafi współpracować z wieloma frameworkami do testowania, ma przyjemną nawigację i eksportuje raporty. Codziennie funkcję tą spełnia mój ulubiony NCrunch jednak co kilka dni prześwietlam kod NCoverem. http://www.ncover.com/

NDepend

Jest to chyba najrzadziej używane narzędzie z całego arsenału jednak możliwości jakie daje są niewyobrażalne. W olbrzymim skrócie NDepend prześwietla kod pod każdym możliwym kątem. Producent chwali się że mają 82 metryki – nie liczyłem ale jest ich od zatrzęsienie. Jeśli tego mało, można budować własne za pomocą SQL-o podobnych zapytań ala Select types from namespace “….” where IsUsingUnboxing or IsUsingBoxing (i mamy listę boxowań i unboxowań).  http://www.ndepend.com/

FinalBuilder

FinalBuilder to potężne narzędzie do automatyzacji. Począwszy od CI przez Build Server i Continious Delivery aż na automatyzacji wszystkiego co się nam przyśni kończąc. Używam praktycznie codziennie jednak narzędzie trafiło tutaj ponieważ jako część środowiska produkcyjnego po prostu wykonuje swoją pracę gdzieś w tle więc moja interakcja z nim jest sporadyczna. http://www.finalbuilder.com/

Idea IntelliJ

Prawdopodobnie najlepsze środowisko do programowania w Javie, Scali, Clojure i kilku innych językach. Jest wersja darmowa na której można poćwiczyć. Jeśli miałbym pisać zawodowo w Javie to tylko z tym cudem – znając ReSharpera bardzo łatwo zacząć wydajnie pracować – w końcu to ten sam producnet Uśmiech http://www.jetbrains.com/idea/

Windows Live Writer

W czymś trzeba pisać notatki na bloga, część powstaje w samym wordpress-ie a część właśnie w Windows Live Writerze – jest wszystko co potrzeba z korektą błędów na czele.

EverNote

Bardzo dobre narzędzie do przechowywania notatek, które zastąpiło mi OneNote-a. Materiały można wysyłać mailem, można pisać przez komórkę (sprawdzone na iPhonie i WP7, android pewnie też wspierany jest) no i oczywiście przez desktop – pełna integracja. U mnie EverNote pełni funkcję archiwum (z GTD).  http://www.evernote.com/

SkyDrive i Google Docs

Obie chmury używam w miarę zamiennie. Część rzeczy przechowuje w google-u część w microsofcie. Z jednej strony żeby znać obie usługi a z drugiej strony żeby wykorzystać najlepsze cechy obu. SkyDrive przechowuje zdjęcia ze względu na wygodny i ładny interfejs (picassa dla mnie jest bezużyteczna pod tym względem). Google Docs używam jeśli chcę popracować wspólnie z kimś przez internet.

Cena narzędzi – cena wydajności

Kilka dni temu Jarek Stadnicki opublikował ciekawy tekst “Cena / wydajność”.  Wzmianka na temat Eclipse-a (z którym Jarek się najwyraźniej nie przyjaźni) przypomniał mi wykład z konferencji 33 degree gdzie na pytanie ile osób używa Eclipse-a zgłosiło się blisko 700 osób (prawie wszyscy na konferencji n.t. Javy) natomiast na pytanie ile z nich by zapłaciło zostało (bodajże)  5 rąk w górze. To pokazuje ile warte jest dla tych osób narzędzie. Każde narzędzie jest tyle warte ile może z niego “wycisnąć” rzemieślnik – pod jednym warunkiem, że narzędzie nie spowalnia owego rzemieślnika. Jeżeli spowalnia to po prostu marnuje jego czas – a my, ludzie, nie mamy go nieograniczoną ilość. Zastanów się ile czasu marnujesz na buildowanie aplikacji, na ciągłe i długotrwające deploye czy też wiecznie mulące się środowisko. Każda inwestycja w poprawę tego stanu zwraca się wielokrotnie, bo oprócz oszczędzania czasu zwięsza mane zwiększa “zadowolenie geekowych programmerow”. Należy jedynie odpowiedzieć sobie na pytanie ile czasu oszczędza mi dane narzędzie. Używam obecnie NCruncha (jak opisałem wczoraj) który oszczędza mi niebywałe ilości, kolejny ReSharper oszczędza kolejne niebywałe ilości. Co można zrobić z dodatkowym czasem? Chyba nikomu nie muszę mówić.

Pod prawie każdym zdaniem Jarka mogę się podpisać i życzyć tylko szczęścia na “prezentacji dla menadżerstwa”. Natchnienie może przynieść wywiad z prezesem Mahalo który mówi dlaczego zainwestował w dodatkowe monitory dla programistów i ile pieniędzy mu to przyniosło – niestety źródło trzeba znaleźć samemu bo nie potrafię go odnaleźć Smutek