niedziela, 29 stycznia 2017

Raspberry PI - konfiguracja Wifi i statyczne IP z wiersza poleceń.

Zakładam, że karta Wifi jest przez kernel obsługiwana. Można to sprawdzić poleceniem lsusb.
Ustawiamy dane autentykacji (o ile na naszym routerze mamy włączone zabezpieczenie sieci). Modyfikujemy zawartość pliku /etc/wpa_supplicant/wpa_supplicant.conf
Potrzebujemy następującego wpisu:

network={
         ssid="NAZWA_NASZEJ_SIECI"
         psk="HASLO_NASZEJ_SIECI"
}

Jeśli nie pamiętamy nazwy to ewentualnie skanujemy dostępne sieci poleceniem:
sudo iwlist wlan0 scan

Konfigurujemy statyczne IP. Potrzebujemy adres IP naszego routera. Modyfikujemy plik /etc/dhcpcd.conf - dodajemy konfigurację dla adaptera sieciowego wlan0:
interface wlan0
static ip_address=192.168.1.222
static routers=192.168.1.1
static domain_name_servers=192.168.1.1
W powyższym przykładzie adres 192.168.1.222 to docelowy stały adres naszego PI a 192.168.1.1 to adres routera. Ustawiamy, żeby adresy DNS były rozwiązywane tak jak mamy na routerze. Jeśli chcemy np. korzystać z adresów DNS google to możemy je ustawić:
static domain_name_servers=8.8.8.8,8.8.4.4

Restartujemy interfejs sieciowy:
sudo ifdown wlan0 && sudo ifup wlan0 
Jeśli nie popełniliśmy pomyłki to powinniśmy się cieszyć działającym połączeniem ze stałym IP.
Podziel się:

sobota, 28 stycznia 2017

OSMC / Kodi - jak wyłączyć start usługi multimediów.

Kilka przydatnych poleceń dzięki którym nasz PI za preinstalowanym OSMC będzie mógł służyć tylko jako serwer - jeśli chwilowo nie potrzebujemy działania samego centrum multimediów.

Jednorazowe uruchomienie:
sudo systemctl start mediacenter

Jednorazowe wyłączenie:
sudo systemctl stop mediacenter

Wyłączenie uruchamiania usługi na stałe:
sudo systemctl disable mediacenter

Włączenie uruchamiania usługi:
sudo systemctl enable mediacenter
Podziel się:

poniedziałek, 23 stycznia 2017

Polędwiczka wieprzowa w sosie grzybowym.

Dziś przepis na bardzo dobry obiad. Na pewno posmakuje osobom, które lubią grzyby. Danie przygotowywałem po raz pierwszy. Wyszło lepiej niż oczekiwałem. Polędwiczkę najlepiej jest podawać z gotowanymi ziemniakami lub kluskami śląskimi czy kopytkami. Doskonale jednak będzie też smakować z kaszą.
Składniki na 4 porcje:

  • 600 - 700 gram polędwicy wieprzowej
  • 1 duża cebula
  • szklanka suszonych grzybów (najlepiej sprawdzą się podgrzybki lub prawdziwki)
  • sól, pieprz, rozmaryn
  • łyżka mąki pszennej
  • łyżka masła klarowanego
  • słodka śmietanka 30%
Zaczynamy od przygotowania grzybów - zalewamy je w garnku wrzącą wodą i gotujemy jakieś 20 minut do uzyskania miękkości. Potrzebujemy więcej niż szklankę wody (około 250 ml)
Polędwicę czyścimy z błon, kroimy w plastry około 1,5 cm i delikatnie rozklepujemy dłonią lub palcami. Przyprawiamy pieprzem. Smażymy na minimalnej ilości oleju przez 2-3 minuty z każdej strony. Mięso zdejmujemy z patelni i dodajemy na nią masło klarowane i cebulę.
Cebulę smażymy aż się zeszkli po czym dodajemy na patelnię mąkę i smażymy przez około 2 minuty dokładnie mieszając aby uzyskać zasmażkę.
Na patelnię dodajemy wywar z grzybów, które następnie drobno siekamy i także dodajemy do sosu. Doprawiamy wedle uznania solą, pieprzem i rozmarynem po czym zaprawiamy sos śmietanką (około 4 łyżki). Pozwalamy całości się chwilę pogotować i dodajemy odłożone wcześniej mięso. Całość dusimy przez około 10-15 minut. Podajemy z preferowanymi dodatkami, świetnie sprawdzą się buraczki, których niestety nie posiadałem.
Smacznego!






Podziel się:

sobota, 21 stycznia 2017

Co wiedzą o Tobie developerzy aplikacji mobilnych?

Większość z nas korzysta z aplikacji mobilnych na telefonach lub tabletach. Czy jednak wiemy w jaki sposób aplikacje te zarządzają naszymi danymi? Ostatnio to coraz bardziej popularny temat. Bardzo ciekawa dyskusja na ten temat pojawiła się na portalu reddit. Co i raz portale technologiczne także podejmują temat naszej prywatności. Coraz więcej też osób zaczyna badać jakie dane odczytywane są z naszych urządzeń i jak są przesyłane dalej.
Ja mam swoje zdanie na ten temat. Uważam, że każdy developer lub firma publikująca aplikacje w sklepach Google Play / App store powinna dołączać dokumentację, w której znajdzie się deklaracja w jaki sposób korzystają z przyznanych uprawnień. Innymi słowy powinni jasno wskazać co się dzieje z odczytanymi wiadomościami SMS, danymi lokalizacji itd. Każda wersja aplikacji powinna być lepiej analizowana przed opublikowaniem. Jednorazowe udowodnione odstępstwo od deklaracji powinno zaś skutkować permanentnym banem na publikowanie w przyszłości. Oczywiście w przypadku danych wrażliwych producenci muszą publikować polityki prywatności, jednak ich zapisy są tak enigmatyczne, że tak naprawdę nie wiemy po przeczytaniu takiego dokumentu co dalej z danymi się dzieje.
W tej chwili jedyne co możemy to:

  • dla Androida do wersji 5 włącznie sprawdzić z jakich uprawnień aplikacja korzysta - jeśli któreś z wymaganych do działania uprawnień nam nie odpowiada szukajmy alternatywy. 
  • od wersji 6 systemu Android jest trochę lepiej, bo możemy konkretne uprawnienie blokować. Tu jednak nie jest aż tak dobrze - niektóre aplikacje są napisane tak, że jeśli zgody na konkretne uprawnienie nie wydamy to nie będą działać.

Wiadomo że większość ludzi nawet nie zadaje sobie trudu, żeby przejrzeć listę wymaganych uprawnień. Spójrzmy więc na listę uprawnień zadeklarowanych przez tak często używaną oficjalną aplikację Facebook:
Urządzenie i historia aplikacji
pobieranie uruchomionych aplikacji
Tożsamość
znajdowanie kont na urządzeniu
dodawanie i usuwanie kont
odczytywanie własnej karty kontaktu
Kalendarz
odczyt wydarzeń w kalendarzu wraz z informacjami poufnymi
dodawanie i modyfikowanie wydarzeń w kalendarzu oraz wysyłanie e-maili do gości bez wiedzy właściciela
Kontakty
znajdowanie kont na urządzeniu
odczytywanie kontaktów
modyfikowanie kontaktów
Lokalizacja
przybliżona lokalizacja (na podstawie sieci)
dokładna lokalizacja (na podstawie sygnału GPS i sieci)
SMS
odczytywanie wiadomości tekstowych (SMS-ów i MMS-ów)
Telefon
bezpośrednie wybieranie numerów telefonu
odczytywanie rejestru połączeń
odczytywanie stanu i informacji o telefonie
zapisywanie rejestru połączeń
Zdjęcia, multimedia i pliki
odczytywanie zawartości pamięci USB
modyfikowanie i usuwanie zawartości pamięci USB
Pamięć
odczytywanie zawartości pamięci USB
modyfikowanie i usuwanie zawartości pamięci USB
Aparat
wykonywanie zdjęć i filmów wideo
Mikrofon
nagrywanie dźwięku
Informacje o połączeniu Wi‑Fi
wyświetlanie połączeń Wi-Fi
Identyfikator urządzenia i informacje o połączeniach
odczytywanie stanu i informacji o telefonie
Inne
pobieranie plików bez powiadomienia
dopasowywanie rozmiaru tapety
odbieranie danych z internetu
wyświetlanie połączeń sieciowych
tworzenie kont i ustawianie haseł
odczytywanie statystyk dotyczących baterii
wysyłanie transmisji trwałej
zmienianie połączeń sieciowych
łączenie się i rozłączanie z siecią Wi‑Fi
rozwijanie/zwijanie paska stanu
pełny dostęp do sieci
zmienianie ustawień dźwięku
czytanie ustawień synchronizacji
uruchamianie podczas włączania urządzenia
zmienianie kolejności uruchomionych aplikacji
ustawianie tapety
renderowanie na innych aplikacjach
sterowanie wibracjami
zapobieganie przechodzeniu urządzenia w tryb uśpienia
włączanie i wyłączanie synchronizacji
instalowanie skrótów
odczytywanie konfiguracji usług Google

Powyższa lista jest zatrważająca, istnienia niektórych uprawnień na liście nie da się uzasadnić wymogami funkcjonalności aplikacji. Warto przejrzeć więc Politykę prywatności powyższej aplikacji (innych także przed ich instalacją). Na pewno da nam to do myślenia...
Zastanawiasz się pewnie komu by się chciało pisać kod źródłowy, żeby coś tam czytać z naszych telefonów? Na przykład takie odczytanie naszej skrzynki wiadomości to tylko kilka linijek kodu, przykład poniżej:
public List<SmsData> getAllSms() {
    List<SmsData> smsList = new ArrayList<>();
    Uri uri = Uri.parse("content://sms/");
    Cursor c = getContentResolver().query(uri, null, null, null, null);
    startManagingCursor(c);
    if (c.moveToFirst()) {
        for (int i = 0; i < c.getCount(); i++) {
            SmsData sms = new SmsData();
            sms.setBody(c.getString(c.getColumnIndexOrThrow("body")).toString());
            sms.setNumber(c.getString(c.getColumnIndexOrThrow("address")).toString());
            smsList.add(sms);
            if (c.getString(c.getColumnIndexOrThrow("type")).contains("1")) {
                sms.setType(SmsData.SmsType.RECEIVED);
            } else {
                sms.setType(SmsData.SmsType.SENT);
            }
            c.moveToNext();
        }
    }
    c.close();
    return smsList;
}
Od wersji 6 systemu Android developerzy muszą sprawdzić czy uprawnienie zostało przyznane:
final int REQUEST_CODE_ASK_PERMISSIONS = 123;
ActivityCompat.requestPermissions(MainActivity.this, new String[]{"android.permission.READ_SMS"}, REQUEST_CODE_ASK_PERMISSIONS);
Tym samym przy użyciu przez użytkownika aplikacji danej funkcjonalności próbującej odczytać skrzynkę wiadomości zostaniemy zapytani czy zgadzamy się na nadanie aplikacji dostępu.
Z zawartością listy obiektów SmsData można teraz zrobić cokolwiek - np. wysłać na zdalny serwer.
Ja osobiście bezwzględnie zawsze sprawdzam jakich uprawnień wymaga aplikacja zanim ją zainstaluję. Jeśli cokolwiek wzbudza moje podejrzenia, polityka prywatności jest niejasna i nie da się logicznie uzasadnić potrzeby dla jakiegoś uprawnienia dla tej aplikacji, to jej po prostu nie instaluję. Ewentualnie instaluję ale nie daję jej wybranych uprawnień.
Podziel się:

piątek, 20 stycznia 2017

Zdalne skanowanie (obsługa skanera z przeglądarki)

Mam w domu stary skaner. Bardzo stary, jest to Mustek 1200 UB plus. Nie powala parametrami, ale dość często z niego korzystam. Jakoś nie mogę się przekonać do robienia zdjęć dokumentom, które muszę później wydrukować lub gdzieś wysłać. Jest jednak dość problematyczny - brakuje do niego sterowników dla wszystkich 64 bitowych wersji Windows. Doskonale za to radzą z nim sobie wszelkie dystrybucje linux.
W związku z tym, że nie tylko ja z niego korzystam i dostęp do niego jest ograniczony bo większość sprzętu w domu bazuje na Windows 64 bit. Potrzebowałem znaleźć rozwiązanie pozwalające na łatwe skanowanie dokumentów z dowolnej platformy, w tym z telefonów i tabletów.
W związku z tym, że jako "serwer" w domu cały czas chodzi mikro komputer Kiano Slimstick wystarczyło tylko sprawić by ten serwer udostępnił usługę umożliwiającą wyzwolenie skanowania. Po przeszukaniu internetu znalazłem potrzebne narzędzia.
  1. CmdTwain - oprogramowanie pozwalające na zeskanowanie dokumentu z wiersza poleceń. Dla systemu Windows ciężko było znaleźć coś bezpłatnego i lepiej działającego. W dystrybucjach linux wystarczy, że doinstalujemy pakiet scanimage.
  2. Chciałem także aby usługa pozwalała na wydrukowanie zeskanowanego dokumentu na jedną z drukarek i tu z pomocą przychodzi IrfanView, mający opcję drukowania z wiersza poleceń. Odpowiednikiem na linux'a jest standardowy pakiet lpr.
CmdTwain instalujemy i sprawdzamy czy poprawnie współpracuje z naszym skanerem.
Teraz wystaczy żeby to połączyć i udostępnić w postaci usługi. W moim przypadku jest to spring boot'owa aplikacja udostępniająca kilka serwisów obsługujących wyzwalanie poleceń w systemie operacyjnym. Wszystko jest wyeksponowane w postaci strony html z kilkoma przyciskami i podglądem ostatnio skanowanego dokumentu. W związku z tym, na stacji do której podpięty jest skaner instalujemy oprogramowanie Java (wystaczy JRE).
Struktura projektu jaki stworzyłem jest prosta:
pl.cli.rest.CliRestApplication to deklaracja aplikacji Spring Boot:

@SpringBootApplication
@EnableAutoConfiguration
@Configuration
@ComponentScan
public class CliRestApplication {
    public static void main(String[] args) {
       SpringApplication.run(CliRestApplication.class, args);
    }
}
pl.cli.rest.CliController to definicja endpointów - wszystkie obsługują żądania GET:
@ResponseBody
@RequestMapping(path = "/scan", method = RequestMethod.GET, produces = MediaType.IMAGE_JPEG_VALUE)
public byte[] scan() throws Exception {        
}
@ResponseBody
@RequestMapping(path = "/print", method = RequestMethod.GET)
public ResponseEntity<String> printLast(@RequestParam(value = "printer", required = false) String printer) {
}
@ResponseBody
@RequestMapping(value = "/getImage", method = RequestMethod.GET, produces = MediaType.IMAGE_JPEG_VALUE)
public byte[] getImage(@RequestParam(value = "fileName", required = false) String fileName) throws IOException {
}
webapp - statyczna część aplikacji - prosta strona html + angular'owy kontroler. Wywołania serwisów realizowane są za pomocą biblioteki Restangular a widok wspiera css z w3schools.
Ostatecznie po uruchomieniu serwisu mam możliwość skanowania i drukowania dokumentów po wejściu stronę pod odpowiednim adresem. Nie ma więc znaczenia czy chcę wyzwolić skanowanie z komputera czy telefonu, wystarczy że urządzenie mam podłączone do sieci Wifi. Zasada działania jest banalna: po wejściu na stronę ładowany jest ostatnio skanowany obraz. Funkcjonalność przycisków jest dość oczywista, dwa przyciski do obsługi drukarki mają obsłużony 5 sekundowy timeout, żeby nie wykonywać przypadkowych dodatkowych klików. Kliknięcie na miniaturze obrazka powoduje jego prezentację w nowej karcie przeglądarki. Uruchomienie zbudowanej paczki możemy wykonać: C:\Windows\System32\cmd.exe /c java -jar D:\skany\cli-rest-0.0.1-SNAPSHOT.war
Ja mam po prostu zdefiniowane zadanie Windows uruchamiające mój serwis podczas logowania użytkownika, tak więc startuje razem z systemem operacyjnym.
  
Część statyczna projektu (zawartość katalogu webapp) może działać niezależnie od części serwisów (w pliku index.html wystarczy zmienić bazowy adres URL naszego serwera).
Na ten moment ścieżki, polecenia itp są w kodzie źródłowym, kiedyś może znajdzie się chwila, na wyjęcie tego do konfiguracji poza aplikacją.
Cały projekt można pobrać tutaj, dostosować do swoich potrzeb i wykorzystać. Żeby zbudować projekt potrzebujemy SDK Java i Maven'a.
Podziel się:

czwartek, 19 stycznia 2017

Montaż pieca kominkowego

Wbrew tytułowi ten wpis nie będzie traktował o budowie kominka. Ten wpis to relacja z montażu pieca kominkowego.
Długo wahałem się nad decyzją dotyczącą dodatkowego źródła ciepła w domu. Głównie ze względu na słabe pokrycie salonu odbiornikami ciepła spowodowane nieregularnym kształtem pomieszczenia, sposobem umeblowania i dużą ilością okien.
Kominek był u nas zaplanowany od momentu budowy domu. Projekt przewidywał bowiem wydzielone miejsce na jego budowę, a komin miał dodatkowy kanał.
Po długim przeszukiwaniu rynku i aktualnych ofert wykluczyłem rozwiązanie tradycyjne czyli wkład kominkowy zabudowany - niezbędne bowiem jest dużo miejsca. U nas jest to narożnik o krótszym boku równym 1m. Cokolwiek by więc nie wybrać, zawsze powstałyby jakieś ograniczenia montażowe takiego wkładu.
Ostatecznie zdecydowałem się na gotowy piec kominkowy - czyli po prostu wkład kominkowy zabudowany kaflami. Za takim wyborem przemawiały argumenty:
  • praktyczne ze względu na brak konieczności czasochłonnej i generującej bałagan budowy, łatwa ewentualna wymiana w przyszłości,
  • estetyczne - w mojej ocenie taki piec wygląda dużo lepiej).
Czego potrzebujemy? 
Przede wszystkim zakupić piec. U nas jest to produkt czeskiej firmy Thorma (model Borgholm Top). Standardowy piec o mocy maksymalnej 10,5 Kw bez podłączenia powietrza z zewnątrz i bez płaszcza wodnego. Zakupu dokonaliśmy (co może dziwić) w sklepie internetowym. Mimo obaw o taką formę zakupu zakończyło się miłym zaskoczeniem, bo wszystko przebiegło zupełnie bezproblemowo. 
Po drugie potrzebujemy komina o odpowiednich dla naszego pieca parametrach. Innymi słowy ciąg / przepustowość takiego komina muszą być wystarczające dla naszego wkładu / kominka. Ja specjalnie nie drążyłem tematu - na podstawie danych znalezionych w internecie dowiedziałem się, że dla tego pieca wystarczy przekrój o średnicy 150 mm - finalnie mam dość spory zapas. Jeśli masz obawy to jednak polecam poprosić o pomoc kominiarza, który sprawdzi na miejscu stan komina, doradzi jeśli trzeba go wykończyć i wskaże jakiego przelotu potrzebujemy. 
U mnie wymurowany kanał kominowy to prostokąt o wymiarach 20 x 30 cm, nie tynkowany od wewnątrz wykonany ze zwykłej cegły. W kominie został więc zamontowany żaroodporny owalny wkład o wymiarach 12 x 24 cm i wysokości 7,5 m. Pierwotnie miał to być wkład okrągły o średnicy 150 cm i taki też w pierwszym podejściu zakupiłem. W trakcie montażu okazało się, że w połowie wysokości komina są przewężenia (podziękowania dla murarzy) nie pozwalające na swobodne opuszczenie wkładu na dół. W grę wchodziło więc rozkuwanie na piętrze, frezowanie od góry albo zmiana wymiarów wkładu. Na szczęście firma produkująca i sprzedająca wkłady była na tyle elastyczna, że bezproblemowo dokonano wymiany. Jeśli więc planujesz montaż wkładu kominowego polecam wcześniej przygotować jakiś przedmiot o przekroju odrobinę większym niż wkład (może być jakieś pudełko, karton po soku) i próbnie spuścić to coś obciążone na lince. Sam montaż wkładu przebiegł bezproblemowo, jedyne co można tu doradzić to, żeby to robić w dwie osoby. Wkład bowiem instalujemy od góry składając w całość kolejne odcinki i spuszczając cały pion w dół na lince. Kilka takich metrowych elementów ma swoją wagę i nie jest łatwo zakładać kolejne elementy trzymając jednocześnie wiszące na lince kilkadziesiąt kilogramów.
Jak wykonać montaż wkładu w kilku krokach:

  • Mierzymy dokładnie dolną część komina i rozkuwamy otwory montażowe, tak by móc bezproblemowo zainstalować odskraplacz i trójnik. Otwór na trójnik powinien dawać nam swobodę włożenia rąk do środka mimo zamontowanego elementu.
  • Montujemy odskraplacz - powinien swobodnie spoczywać na dnie komina. Pamiętamy o wyprowadzeniu rurki do odprowadzania skroplin. Na niego powinniśmy zamontować wyczystkę.
  • Spuszczamy od góry niezbędne elementy, które znajdą miejsce między wyczystką i trójnikiem po czym przez wykuty otwór montujemy sam trójnik.
  • Od góry komina spuszczamy pozostałe elementy - jeśli nie mamy dostępu do kanału kominowego jak to było u mnie to musimy spuścić cały pion złożony. Pamiętamy bowiem, żeby wszystkie elementy były dokładnie złożone (wpust - kielich). Niektórzy elementry skręcają, ja tego nie robiłem żeby ich nie uszkadzać. Najprościej zrobić to z użyciem linki i haczyka - przekładamy linkę przez wnętrze pierwszego elementu, zaczepiamy haczykiem i po kolei przewijając linkę przez kolejne elementy składamy je w całość. Przed dołożeniem kolejnego elementu składany pion coraz bardziej opuszczamy w dół komina. Finalnie wkład oprze nam się na trójniku i przez wykuty otwór będziemy w stanie połączyć ten opuszczony pion z trójnikiem.
  • Górę komina wykańczamy płytą i daszkiem a otwory montażowe zamurowujemy. Ten ostatni krok polecam jednak wykonać po podłączeniu pieca.
  

Piec podłączamy żaroodporną czarną rurą o grubości ścianki 2mm. Jeśli podłączenie pieca do komina robimy jak na poniższych obrazkach to warto kupić kolano z regulacją (nastawne) i wyczystką - uprości nam montaż i dodatkowo zapewni łatwiejsze czyszczenie w przyszłości. Pamiętajmy także o rozecie maskującej połączenie rury czarnej montażowej pieca z kolanem.
        

Ostatecznie ściany docieramy i malujemy.
Pozostaje już tylko próbne palenie i uciecha w chłodne dni.

Podsumowując całość prac zajęła dwa długie dni: jeden dzień na kucie komina, układanie płytek i nieudany montaż pierwszego wkładu kominowego. Drugi dzień na montaż docelowego wkładu (nie obyło się bez dodatkowego kucia wcześniej przygotowanych otworów), podłączenie i wykończenia. Trzeciego dnia sprzątaliśmy wszechobecny kurz. 

U nas ten piec sprawdza się znakomicie, w dni o umiarkowanie niskiej temperaturze (0 - 10 stopni) nie musimy korzystać z centralnego ogrzewania bo piec wystarczająco ociepla cały dom. Kiedy zaś jest bardzo mroźno, piec doskonale dociepla parter.
Podziel się:

wtorek, 17 stycznia 2017

Montowanie katalogu udostępnionego (samba, windows) w systemie linux

Dziś krótki wpis o tym jak dostać się do zasobu, który został udostępniony na innym komputerze z systemem Windows (bądź jako zasób samba na innej stacji z linux'em).
Najprościej możemy to zrobić wpisując po prostu adres w menedżerze plików:


Czasami jednak nam to nie wystarczy. Przykładowo, jeśli nasz zdalny zasób to miejsce składowania plików naszego repozytorium subversion to chcemy mieć możliwość dostania się do tego repozytorium z wiersza poleceń bez instalowania na zdalnej maszynie apache'a. Postarajmy się więc, żeby taki zdalny zasób został zamontowany jako system plików. Musimy w tym celu wykonać kilka prostych kroków. W pokazanym przykładzie chcę mieć lokalnie (/media/svn) zamontowany katalog subversion, który udostępnia stacja o IP 192.168.1.111.

Instalujemy pakiet cifs-utils i tworzymy nasz lokalny katalog - tam będzie montowany zdalny zasób.
sudo apt-get install cifs-utils
sudo mkdir /media/svn
I teraz jeśli chcemy jednorazowo zamontować nasz zdalny zasób wykonujemy:
sudo mount -t cifs //192.168.1.111/subversion /media/svn/
Uwaga: jeśli zasób zdalny jest chroniony hasłem zostaniemy o nie poproszeni. Możemy też te dane podać:
sudo mount -t cifs -o username=WINDOWS_USER,password=WINDOWS_PASSWORD //192.168.1.111/subversion /media/svn/
Jeśli chcemy, żeby taki zasób był montowany automatycznie przy starcie systemu w pliku /etc/fstab dodajemy następujący wpis (zmieniamy oczywiście wartości WINDOWS_USER, WINDOWS_PASSWORD i LOCAL_LINUX_USER):
//192.168.1.111/subversion /media/svn cifs x-systemd.automount,cache=none,rsize=130048,wsize=57344,username=WINDOWS_USER,password=WINDOWS_PASSWORD,uid=LOCAL_LINUX_USER,iocharset=utf8,sec=ntlm,users 0 0
Montujemy i sprawdzamy stan:

sudo mount -a
cd /media/svn
ls -ltr
razem 1
-rwxr-xr-x 1 root root 246 gru  6  2015 README.txt
-rwxr-xr-x 1 root root   2 gru  6  2015 format
drwxr-xr-x 2 root root   0 sty 12 16:44 conf
drwxr-xr-x 2 root root   0 sty 12 16:44 hooks
drwxr-xr-x 2 root root   0 sty 12 16:44 locks
drwxr-xr-x 2 root root   0 sty 14 22:39 db

Dzięki temu prostemu zabiegowi możemy lokalnie dostać się do repozytorium svn podając jako jego URL adres lokalny, sprawdźmy na koniec czy wszystko działa poprawnie wyświetlając jak wygląda historia trunk'a lub status:
svn log file:///media/svn/trunk
svn info file:///media/svn/trunk 

Podziel się:

poniedziałek, 16 stycznia 2017

Google Chrome Desktop

Chrome Desktop to usługa i software Google pozwalający na zdalną pracę z komputerem. Dlaczego warto się zainteresować tym rozwiązaniem? Jest doskonałą alternatywą dla pulpitu zdalnego dostępnego w bogatszych wersjach systemu operacyjnego Windows lub alternatywnych rozwiązań jak VNC. Podstawową zaletą pulpitu zdalnego od Google jest to, że nie potrzebujemy mieć publicznego IP dla sieci, w której znajduje się udostępniana przez nas stacja. Rozwiązanie Microsoft czy dowolna implementacja VNC wymaga bowiem, by nasza stacja i sieć domowa była widoczna z zewnątrz (nie może być za NAT'em, który w Polsce stosują standardowo wszyscy operatorzy sieci komórkowych).
Jeśli jednak mamy IP dostępne z zewnątrz (np. Netia, TPSA) musimy skonfigurować dynamiczne mapowanie widocznego publicznie lecz niestety zmiennego adresu za pomocą jednej z dostępnych usług jak noip.com.
Ewentualnym rozwiązaniem jest także wykupienie konta VPN - w ten sposób możemy łączyć się z naszą siecią i dalej ze stacją roboczą.
Wspomnę, że mamy jeszcze alternatywę do powyższych w postaci Team Viewera.

Jakie więc zalety ma rozwiązanie google:
  • działa bezproblemowo w systemie Windows (32 i 64 bit) i Linux (obecnie tylko 64 bit)
  • nie jest konieczne posiadanie publicznego IP (niezależnie czy mowa o stałym czy zmiennym adresie)
  • mamy dostępne aplikacje na inne platformy (Android, iOS)
Wady? Zauważyłem jedną - Google przestał rozwijać wersję 32 bit dla systemu linux. Tym samym nie udostępnimy z jego pomocą raspberrypi. Możliwe jest jednak odszukanie w odmętach internetu starych wersji pakietów instalacyjnych.
Co zrobić by móc udostępnić zdalne zarządzanie dowolną stacją?
Na stacji która będzie udostępniana instalujemy przeglądarkę Chrome.
Instalujemy sam zdalny pulpit - usługę pozwalającą na łączenie się z naszą stacją. Wersja dla systemu linux dostępna tutaj.
W przeglądarce Chrome otwieramy adres: chrome://apps/ - powinniśmy mieć widoczną nową aplikację "Pulpit zdalny Chrome" - uruchamiamy.


Po uruchomieniu aplikacji możemy:
  • połączyć się do innej stacji roboczej
  • skonfigurować stały dostęp do aktualnej stacji
  • udostępnić stację jednorazowo z użyciem kodu (inna osoba będzie mogła podłączyć się do naszej stacji jeśli będzie znała wygenerowany kod)


W trakcie konfiguracji definiujemy PIN niezbędny do autoryzacji.
Teraz z dowolnego innego urządzenia na którym mamy zainstalowaną aplikację Pulpitu Zdalnego, logując się na nasze konto google powinniśmy mieć na liście stacji roboczych nowo zdefiniowaną.

O konfiguracji zaawansowanej możemy poczytać tutaj.

Instalację w systemie linux najlepiej wykonać dodając repozytorium google:


sudo gedit /etc/apt/sources.list.d/google-chrome.list

W nowo utworzonym pliku dodajemy linie:


deb [arch=amd64] http://dl.google.com/linux/chrome-remote-desktop/deb/ stable main
deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main
Dodajemy też klucz:

wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add -

Aktualizujemy lokalną listę pakietów i instalujemy zdalny pulpit:


sudo apt-get update
sudo apt-get install chrome-remote-desktop


Podziel się:

niedziela, 15 stycznia 2017

Pi Zero ponownie dostępny.

W sklepie thepihut ponownie jest dostępny Raspberry Pi Zero w standardowej cenie 4 funty. Wysyłka do Polski kosztuje dodatkowe 4. Całkowita płatność przez PayPal wyniosła mnie dokładnie 41,83 zł. Kto przymierzał się do zakupu wie jak ciężko było kupić tą zabawkę. Dostępny jest także w sklepie pimoroni ale tu wysyłka droższa.

Przez dość długi czas korzystałem z Pi 2B, który jest trochę wydajniejszy. Potrzebowałem jednak sprzęt na którym będzie można bezproblemowo uruchomić Remote Desktop od google'a. Korzystając z okazji cenowej wypatrzonej na pepperze kupiłem mikro komputer Kiano Slimstick (oparty o Windows 10 Home) w niezłej ofercie MediaMarkt (199 zł). Plan był taki, że Pi miał pozostać. Wystawiony na próbę w celu weryfikacji wartości na znanym portalu aukcyjnym sprzedał się jednak za świetną cenę. Finalnie dokładając kilkadziesiąt złociszy zamieniłem Pi 2B na Kiano i Pi Zero.

O samym pulpicie zdalnym Google napiszę krótko niedługo.

Podziel się:

Mustek 1200 UB Plus w Ubuntu

Sprzęt to starocie ale bardzo miły bo zasilany z USB. Nie działa pod systemem Windows 64 bit (brak sterowników). Z powodzeniem da się go uruchomić w Windows 10 32 bit (działają sterowniki z Windows 7 - do pobrania tutaj).
Poniżej przepis jak go uruchomić pod Ubuntu - uruchamiamy terminal i po wydaniu poniższych komend mamy działający skaner:

sudo apt-get install sane
sudo mkdir /usr/share/sane/gt68xx
cd /usr/share/sane/gt68xx
sudo wget http://www.meier-geinitz.de/sane/gt68xx-backend/firmware/sbfw.usb
sudo vi /etc/sane.d/gt68xx.conf

Odnajdujemy linię jak poniżej i odkomentowujemy:

#override "mustek-scanexpress-1200-ub-plus"

Najprostszy dostępny program do obsługi skanera to Simple Scan, jeśli go brakuje instalujemy:


sudo apt-get install simple-scan
Podziel się:

Statyczne IP (linux, raspberrypi)

Sprawdzamy nazwę naszego interfejsu sieciowego:
ifconfig
Edytujemy plik: /etc/network/interfaces i dla odpowiedniego ustawiamy IP i adres bramki. W przykładzie poniżej są to odpowiednio: 192.168.1.111 i 192.168.1.1


iface eth0 inet static
address 192.168.1.111
netmask 255.255.255.0
gateway 192.168.1.1
Podziel się:

Niestabilne WIFI - Ubuntu i Thinkpad E450 (Intel AC7265)

Jeśli Twój laptop ma kartę Wifi opartę o chipset Intela AC7260 lub AC7265 to niestety doświadczysz problemów z działaniem Wifi. Główne problemy to brak stabilności: zrywanie połączenia, spadki prędkości. Problem można rozwiązać zmieniając ustawienia driver'a do karty. Sprawdzamy zawartość pliku /etc/modprobe.d/iwlwifi.conf - jeśli nie mamy tam wpisu "options iwlwifi..." to dodajemy poleceniem poniżej, jeśli wpis jest to go zmieniamy.


sudo sh -c 'echo "options iwlwifi 11n_disable=8" >> /etc/modprobe.d/iwlwifi.conf'

Wszystkie opcje kernel'a opisane poniżej:

options iwlwifi led_mode=1 power_save=0 11n_disable=8 swcrypto=1

# parm:           swcrypto:using crypto in software (default 0 [hardware]) (int)
# parm:           11n_disable:disable 11n functionality, bitmap: 1: full, 2: disable agg TX, 4: disable agg RX, 8 enable agg TX (uint)
# parm:           amsdu_size_8K:enable 8K amsdu size (default 0) (int)
# parm:           fw_restart:restart firmware in case of error (default true) (bool)
# parm:           antenna_coupling:specify antenna coupling in dB (defualt: 0 dB) (int)
# parm:           wd_disable:Disable stuck queue watchdog timer 0=system default, 1=disable (default: 1) (int)
# parm:           nvm_file:NVM file name (charp)
# parm:           uapsd_disable:disable U-APSD functionality (default: Y) (bool)
# parm:           bt_coex_active:enable wifi/bt co-exist (default: enable) (bool)
# parm:           led_mode:0=system default, 1=On(RF On)/Off(RF Off), 2=blinking, 3=Off (default: 0) (int)
# parm:           power_save:enable WiFi power management (default: disable) (bool)
# parm:           power_level:default power save level (range from 1 - 5, default: 1) (int)
# parm:           fw_monitor:firmware monitor - to debug FW (default: false - needs lots of memory) (bool) 

Ja aktualnie korzystam ze sterownika w wersji 22 (do sprawdzenia w logach - dmesg):

iwlwifi 0000:04:00.0: loaded firmware version 22.361476.0 op_mode iwlmvm

user@think:/lib/firmware$ ls -ltr *7265*
-rw-r--r-- 1 root root  690452 kwi 25  2016 iwlwifi-7265-8.ucode
-rw-r--r-- 1 root root 1384500 gru  1 22:24 iwlwifi-7265D-16.ucode
-rw-r--r-- 1 root root 1008692 gru  1 22:24 iwlwifi-7265D-13.ucode
-rw-r--r-- 1 root root 1002800 gru  1 22:24 iwlwifi-7265D-12.ucode
-rw-r--r-- 1 root root  697828 gru  1 22:24 iwlwifi-7265-9.ucode
-rw-r--r-- 1 root root 1180356 gru  1 22:24 iwlwifi-7265-16.ucode
-rw-r--r-- 1 root root  885224 gru  1 22:24 iwlwifi-7265-13.ucode
-rw-r--r-- 1 root root  880604 gru  1 22:24 iwlwifi-7265-12.ucode
-rw-r--r-- 1 root root  736844 gru  1 22:24 iwlwifi-7265-10.ucode
-rw-r--r-- 1 root root 1028316 gru  5 14:28 iwlwifi-7265D-22.ucode
-rw-r--r-- 1 root root 1385368 gru  5 14:28 iwlwifi-7265D-21.ucode
-rw-r--r-- 1 root root 1383604 gru  5 14:28 iwlwifi-7265D-17.ucode
lrwxrwxrwx 1 root root      21 gru  5 14:28 iwlwifi-7265D-10.ucode -> iwlwifi-7265-10.ucode
-rw-r--r-- 1 root root 1180412 gru  5 14:28 iwlwifi-7265-17.ucode

Czasami pojawia się także problem współpracy obu modułów: wifi i bluetooth. Można spróbować wyłączyć bluetooth i sprawdzić czy jest poprawa w działaniu wifi. Jeśli tak jest to polecam dodać dodatkowy wpis do wymienionego pliku:
options iwlwifi 11n_disable=8 bt_coex_active=0
Podziel się:

sobota, 14 stycznia 2017

Edycja skrótów klawiaturowych w Lubuntu


W moim laptopie (Thinkpad E450) nie działało prawidłowo sterowanie poziomem głośności (Fn+F1, Fn+F2, Fn+F3). Żeby to naprawić edytujemy plik:
~/.config/openbox/lubuntu-rc.xml
    <keybind key="XF86AudioRaiseVolume">
      <action name="Execute">
        <command>amixer -D pulse sset Master 10%+ unmute</command>
      </action>
    </keybind>
    <keybind key="XF86AudioLowerVolume">
      <action name="Execute">
        <command>amixer -D pulse sset Master 10%- unmute</command>
      </action>
    </keybind>
    <keybind key="XF86AudioMute">
      <action name="Execute">
        <command>amixer -D pulse sset Master toggle</command>
      </action>
    </keybind>
Analogicznie w tym samym miejscu możemy dodać / zmienić ulubione skróty do programów lub funkcji systemu np. otwarcie terminala:
    <keybind key="W-t">
      <action name="Execute">
        <command>lxsession-default terminal</command>
      </action>
    </keybind>
albo eksploratora plików:
    <keybind key="W-e">
      <action name="Execute">
        <startupnotify>
          <enabled>true</enabled>
          <name>File manager</name>
        </startupnotify>
        <command>lxsession-default file_manager</command>
      </action>
    </keybind>
I bonus: minimalizacja wszystkich okien analogicznie do systemu Windows:
<keybind key="W-m">      # Minimize all
  <action name="ToggleShowDesktop"/>
</keybind>
Podziel się: