wtorek, 22 sierpnia 2017

LejOS na Lego MIndstorm ev3

Ze strony: https://sourceforge.net/projects/ev3.lejos.p/files/ pobieramy pakiet spakowany tar.gz i rozpakowujemy. System LejOS na ev3 uruchamiany jest z karty MicroSD. Na kartę wgrywamy system poprzez przywrócenie obrazu z sd500.img (najpierw rozpakować zip). Wgrywamy rozpakowany zip. lejosimage do katalogu głównego, a następnie ściągamy oracle javę dla Mindstorma (tylko wersja 7 jest obsługiwana) i wgrywamy paczkę tar.gz do głównego katalogu na karcie. Usuwamy kartę i wsadzamy do LEGO. Po bootowaniu z karty LejOS zainstaluje javę i utworzy własną partycję na dane. Zajmie to sporo czasu ok 10 minut. Do Eclipse instalujemy wtyczkę wyszukując w Eclipse Marketplace o nazwie Lejos ev3. Dodajemy w Properties projektu Build Path z rozpakowanego archiwum lib/ev3 pliki .jar Podać adres IP (po USB) kostki. Instrukcja instalacji: https://sourceforge.net/p/lejos/wiki/Installing%20leJOS/?version=9 Parowanie bluetooth: http://www.ev3dev.org/docs/tutorials/connecting-to-the-internet-via-usb/ Zrobić to dla komputera, dla ev3 powinno samo zadziałać. Adres IP będzie na wyświetlaczu Mindstorma.

piątek, 2 maja 2014

Dodawanie w Ubuntu do menu aplikacji - na przykładzie ScalaIDE

Mam ściągnięte ScalaIDE i uruchamiam je z katalogu home. Jednak wchodzenie do katalogu, w którym jest zainstalowane nie jest zbyt wygodne. Można bez problemu zrobić skrót na pulpit, ale nie lubię sobie zaśmiecać pulpitu, a poza tym gdy mam otwarte inne programy muszę przechodzić na pusty pulpit. Miło by było gdyby można uruchamiać program z dasha i żeby na pasku pojawiała się ikona programu. Co zatem musimy zrobić? Tworzymy plik scalaIDE.desktop:
[Desktop Entry]
Name=Scala IDE
Comment=Scala IDE 3.0
Exec=/home/ms/Programy/scala-ide/eclipse
Terminal=false
Type=Application
Icon=scalaIDE
Categories=Programming;
MimeType=application/x-java-jnlp-file;
NoDisplay=false
Plik umieszczamy w katalogu /usr/share/applications/ Teraz potrzebujemy obrazka, który kopiujemy do katalogu /usr/share/pixmaps/ z nazwą użytą w pliku desktop. Warto przygotować sobie pomniejszony obrazek. Sam przeskalowałem sobie obrazek icon.xpm na 64x64 i zapisałem jako png.

wtorek, 11 marca 2014

Udostępnianie drukarki między komputerami z Ubuntu

Chciałem udostępnić drukarkę podłączoną do mini serwera, na którym postawiłem Ubuntu Server innemu komputerowi z Ubuntu. Oczywiście pierwszym pomysłem było użycie Samby. Jednak wszelkie gimnastyki nie zdały się na nic. Mimo przeszukiwania forów i próbowania różnych rozwiązań nie udało mi się wydrukować poprzez Sambę. Próbowałem sprawdzić również to samo na dwóch komputerach z Ubuntu i też nic z tego nie wyszło. Co dziwne gdy używałem wersji 10.04 udostępnienie drukarki można było po prostu wyklikać w GUI i wszystko działało jak należy. Dopiero spojrzenie na schemat na stronie ubuntu.com uświadomiło mi, że być może Ubuntu w ogóle przestało wspierać udostępnianie drukarki dla innego komputera z Ubuntu. Jednak narzędzie GUI do udostępniania drukarki również nie działa. Dopiero po dłuższym poszukiwaniu w internecie udało mi się znaleźć rozwiązanie. Należy ustawić protokół ipp. ipp://ipserwera/printers/nazwadrukarkiwcups wcześniej należy w CUPS na serwerze ustawić udostępnianie drukarki w sieci. W Ubuntu 14.04 drukarka udostępniona w CUPS przez ipp znajdowana jest automatycznie.

czwartek, 6 marca 2014

Programowanie Lego Minestorm NXT z lejOS

System LeJOS to fimeware do Lego NXT wgrywany zamiast oryginalnego oprogramowania. Wywodzi się z maszyny wirtualnej Javy TinyVM. Umożliwia on pisanie programów sterujących działaniem robota Lego w Javie. Pobierając wtyczkę do Eclipse ze strony projektu mamy wygodny edytor kodu, który przy odpowiedniej konfiguracji pozwala edytować oraz wysyłać i uruchamiać kod w naszym robocie Lego.

Instalacja leJOS

Do tworzenia programów w leJOS potrzebna jest Java 32bit również JDK, może być to openJDK. Należy ją zainstalować w wersji 32-bit nawet na 64-bitowym systemie: sudo apt-get install openjdk-7-jdk:i386 Sprawdzamy wersję jre i ustawiamy na 32-bitową: sudo update-alternatives --config java Pobieramy 32-bitowe Eclipse ze strony https://www.eclipse.org/downloads/ Następnie pobieramy biblioteki leJOS wybierając najnowszą wersję i paczkę dla naszego systemu ze strony: http://sourceforge.net/projects/lejos/files/lejos-NXJ/ i rozpakowujemy je do katalogu /opt/leJOS_NXT Teraz otwieramy Eclipse i w menu help->Eclipse Marketplace wyszukujemy wtyczkę leJOS dla NXT.Instalujemy i restartujemy Eclipse. W opcji tworzenia nowych projektów pojawił się pojekt lejOS NXT oraz nowe menu LeJOS NXJ z wgrywaniem firmware.

Programowanie w Java

Jednym z wzorcowych modeli robotów jakie możemy wykonać dzięki klockom Lego NXT jest shooterbot. Potrafi on strzelać kulkami. Z przodu robota ustawiony jest czujnik ultradźwiękowy pozwalający mierzyć odległość od przeszkód. W napisanym programie testowym robot ma się obracać czekając na „wroga”. Jeżeli ktoś zbliży się do niego na małą odległość (30cm), zatrzymuje się i oddaje strzał. Po strzale dalej obraca się. Schemat algorytmu:

Kojo - nauka programowania od dziecka do inżyniera

Nauczanie podstaw programowania na poziomie szkoły podstawowej i gimnazjum jest dość trudnym zadaniem. Pomocą służą w tym względzie różne odmiany LOGO, w których za pomocą prostych poleceń słownych przemieszcza się żółwia po płótnie, a żółw zostawia ślad toru swojego ruchu. Jednym z najbardziej popularnych tego typu programów w polskich szkołach jest Logomocja-Imagine. Jest to jednak program komercyjny, płatny i jedynie wersja demonstracyjna jest udostępniana bezpłatnie. Do tego program ten działa wyłącznie na Windows. Na Linuksie dysponujemy kilkoma podobnymi programami. Jednym z nich jest KTurtle, który jest świetnym i przydatnym programem, chociaż jego możliwości są znacznie mniejsze niż wspomnianej Logomocji. Niestety program ten nie obsługuje takich elementów jak tablice, ani nie potrafi wypełniać figur kolorem. Drugi podobny program Turtle Block z pakietu Sugar jest szczególnie wygodny dla młodszych ponieważ umożliwia budowanie programu z klocków – bloków. Podobnie jednak do KTurtle jego możliwości są dość ograniczone. Innym LOGO podobnym programem jest UCBLogo. Jego składnia oparta jest jednak o Lisp (to oryginalne LOGO) i nie jest łatwa dla kogoś kto nigdy nie miał kontaktu z tym językiem. To dobra pozycja do nauki dla starszych uczniów, ale trudno ją polecać początkującym. Sam program jest już dość starym projektem, niezbyt wygodnym w użyciu. Na szczęście powstała całkiem niedawno nowa wersja tego typu programu. Jest to program KOJO w który jest wolny o bolączek poprzednio wymienionych programów. Program posiada opcje brakujące pozostałym. Możemy wstawać lub komponować dźwięki, wstawiać własne grafiki, wypełniać figury kolorem. Program składa się z modułów takich jak rysowanie 2D, 3D, nauka arytmetyki oraz wbudowana Geogebra. W tym artykule skupimy się tylko na rysowaniu 2D.
Program ten jest otwarto-źródłowy na licencji GPLv2 i pracuje na maszynie wirtualnej Javy. Oznacza to, że jest dostępny na każdej popularnej platformie i do tego można go używać bezpłatnie zarówno w szkole jak i w domach. Dzięki temu dzieci mogą ćwiczyć w domu i odrabiać prace domowe jeśli tylko posiadają dostęp do komputera, niezależnie od posiadanego systemu operacyjnego. Program jest w dużym stopniu spolszczony. Poza polskim menu, można używać polskich komend. Wielką zaletą tego programu jest coś czego nie ma żaden inny program tego typu. Otóż w programie tym korzystamy z pełnego języka programowania nazywanego Scalą. Jest to język funkcyjny, kompilowany statycznie, działający na JVM. (Główny język używany przez inżynierów w takich projektach jak Twitter czy Foresquare, umożliwia korzystanie z kodu napisanego w Javie). Uczeń może więc rozpocząć naukę od bardzo prostych poleceń podobnych do tych z innych wersji LOGO, służących do sterowania żółwiem. Jednak z czasem po osiągnięciu większych umiejętności w razie chęci i potrzeby dalszego uczenia się, może zacząć korzystać z coraz bardziej zaawansowanych elementów programowania. Dzięki temu, aby przejść na wyższy etap nauki, nie musi zmieniać środowiska, do którego się przyzwyczaił. Naukę można kontynuować na wyższym etapie kształcenia, a z czasem nawet zmienić IDE i zacząć korzystać z całej gamy narzędzi dostępnych w środowisku Javy. Przykładowy program w Kojo:

czyść()
skoczDo(-360, 100)
tło(niebieski)
ustawWypełnieKolorem(żółty)
kolor(żółty)
ustawKąt(0)
powtarzaj(5) {
 naprzód(200)
 prawo(144)
}
podnieśPisak()
skoczDo(-350, -50)
kierunek(-350, 0)
opuśćPisak()
rozmiarCzcionki(40)
pisz("Witaj w Kojo")

Wynik działania programu:
Standardowo tak jak w klasycznych IDE po napisaniu kilku liter i wciśnięciu Ctrl+Spacja pojawiają się podpowiedzi do funkcji. W programie jest w opcjach dokumentacja, przykładowy kod i tutorial, ale niestety tylko w języku angielskim.
Składnia podstawowych poleceń w Kojo po polsku: epodrecznik.edu.pl
Pobieranie Kojo:kojo

niedziela, 3 listopada 2013

Webansible - interfejs webowy dla ansible

Używanie Ansible za pomocą konsoli jest całkiem proste. Jednak miło byłoby mieć możliwość uruchamiania powtarzalnych operacji za pomocą GUI. A ponieważ w dzisiejszych warto pisać uniwersalnie, więc najlepiej żeby to GUI było uruchamiane w przeglądarce. Zrobienie interfejsu webowego dla ansible miałoby tę zaletę, że w przeciwieństwie do tradycyjnego GUI można by umieścić go nie tylko na własnym laptopie, ale też na serwerze z którego można by zarządzać po połączeniu przeglądarką. Dzięki temu nie byłby konieczny dostęp do określonego komputera z zainstalowanymi Ansible, do którego wszystkie zarządzanie hosty posiadają klucze. Niestety AnsibleWorks, firma zajmująca się rozwojem Ansible, przygotowała wersję interfejsu webowego, który jest oprogramowaniem komercyjnym. Istnieje możliwość używania go bezpłatnie dla grupy do 10 komputerów. Dla potrzeb np. szkoły jest to niewystarczające, zaś cena $100 za komputer rocznie jest zaporowa. Ponieważ od dłuższego czasu kombinowałem z wdrożeniem jakiegoś systemu do zarządzania komputerami, zdecydowałem się napisać taki interfejs samodzielnie. Tym bardziej, że potrzebny jest mi również sposób na wykrywanie IP komputerów w sieci wewnętrznej pracujących w oparciu o DHCP.

Wymagania:

  1. Praca z apt-get: update, upgrade
  2. Dodawanie i usuwanie źródeł oprogramowania
  3. Wybór oprogramowania do instalacji i usunięcia z listy oprogramowania
  4. Możliwość tworzenia grup komputerów i zarządzania nimi osobno
  5. Edycja i kopiowanie plików konfiguracyjnych na hosty
  6. Uruchamianie pojedynczego polecenia z konsoli w przeglądarce
  7. Edycja i uruchamianie playbooków
  8. Rejestrowanie komputerów o zmiennym IP i dodawanie ich do pliku hosts
  9. Zapisywanie historii ostatnich operacji
  10. Małe zużycie zasobów systemowych przez oprogramowanie

Plany realizacji:

Rozwiązania takie jak SpaceWalk czy Rudder są bardzo fajne, jednak jak dla mnie zbyt ciężkie. Jeżeli ten drugi zadowala się 1GB pamięci RAM,to w tym pierwszym potrzeba, aż 2GB. W moim oprogramowaniu powinno wystarczyć 50 - 100MB, a tylko w większych systemach konieczne byłoby więcej. No i z tego powodu używany przeze mnie do tej pory Lift odpada. Co prawda gdzieś na forum David Pollack pisał, o możliwości uruchomienia Lifta na 32-64MB, ale jakoś nie chce mi się w to wierzyć widząc na dotychczasowe moje aplikacje). Przeanalizowałem kilka możliwych rozwiązań. Teoretycznie Scalatra powinna być lżejsza do Lifta. Jednak patrząc nawet po rozmiarze pliku war nie widać wielkiej różnicy i być może byłoby to wydajniejsze rozwiązanie, ale nie sądzę aby była duża różnica. Mógłbym pokusić się o napisanie samodzielnie prostego serwera www w oparciu o HTTPServer. Jednak wymagałoby to pewnie dużo czasu, a i skalowalność byłaby słaba. Zastanawiałem się nad Socko Web Server. Na koniec zdecydowałem się na Spray.io. Socko wydaje się bardzo podobne do Spray jednak ten drugi projekt jest o wiele dojrzalszy, jak również o wiele więcej projektów z niego korzysta. Poznanie Spray może mi się przydać w przyszłości do innych projektów, więc warto chociażby z tego powodu go wybrać. Spray posiada możliwość uruchamiania aplikacji z wbudowanych serwerem (spray-can). Jest bardzo modularny i nie ma dużych wymagań. Po stronie przeglądarki zamierzam użyć Bootstrap Twitter (wygląd strony) oraz frameworka AngularJS. Po stronie serwera za szablony HTML ma odpowiadać Twirl (ponieważ jako jedyny jest dobrze zintegrowany ze Spray).

Stan obecny

Aby zapewnić wykrywanie IP hostów napisałem prostą aplikację w języku Vala, która pinguje serwer (z użyciem libsoup). Serwer odbiera pingowanie i uaktualnia adres IP hosta i na żądanie tworzy plik /etc/ansible/hosts. W zasadzie ta funkcjonalność jest już wystarczająca, aby przejść do konsoli i zarządzać komputerami co wykorzystuje już w pracowni.

Najbliższe plany

W pierwszej kolejności uruchamianie poleceń ansible bez konieczności przechodzenia do konsoli. Następnie wykonywanie update, upgrade i instalacja pakietu według nazwy oraz dodawanie źródeł oprogramowania.

czwartek, 31 października 2013

Ansible - proste i wygodne narzędzie do automatyzacji zarządzania komputerami

Podejść do tematu zdalnego zarządzania komputerami miałem już kilka. Mając powierzone sobie komputery czy to w salach lekcyjnych czy też w pracowni jakoś nie bardzo chce mi się biegać od komputera do komputera. Stąd poszukiwania jakiegoś wytrychu, którym można by sobie ułatwić życie. Dla pracowni napisałem nawet mały program do zarządzania update'mi i upgrade'ami systemów (w oparciu o Qt4). Pisanie od nowa takiego oprogramowania to jednak dużo pracy i efekt mały w stosunku do włożonego wysiłku. Stąd pomysł, aby wykorzystać coś gotowego. Znanym i szeroko stosowanym narzędziem jest Puppet. Jednak nie podoba mi się pomysł stosowania ciężkiego klienta na komputerach, które ledwo radzą sobie z zainstalowanym już użytkowym oprogramowaniem. Bliżej za to zainteresowałem się CFEnginem. Wydaje mi się lepszym rozwiązaniem niż Puppet. Napisany w C, zarówno klient jak i serwer nie wymaga dużej ilości zasobów, szczególnie po stronie klienta. Niestety ma on spory minus w postaci dość skomplikowanego języka zapisu oczekiwanego stanu zarządzanych komputerów. Nie jest to problem dla kogoś kto chce się zajmować tym na co dzień. Jednak jeśli chcemy zarządzać komputerami od czasu do czasu to wysoki próg wejścia jest dość odstraszający. Istnieje ciekawy projekt Rudder napisany w Scali, który umożliwia zarządzanie CFEnginem za pomocą przeglądarki. Jednak jak dla mnie to rozwiązanie jest za ciężkie. Na szczęście na horyzoncie pojawił się Ansible.
Ansible jest dość wyjątkowy jak na narzędzie typu "provisionig" ze względu na to, że nie używa dedykowanego programu klienta i wszystkie operacje wykonywane są na klientach za pomocą połączenia ssh. Wystarczy więc zainstalować na zarządzanych komputerach ssh serwer (na serwerach www zazwyczaj już jest) oraz dodać klucz ssh zarządzającego komputera (w pliku ~/.ssh/authorized_keys) . Na komputerze z którego chcemy prowadzić kontrolę instalujemy Ansible i możemy zacząć pracę (może to być inny serwer lub nasz laptop). Sposób działania Ansible dla jednych będzie wadą, a dla innych zaletą. Wykonując zadania widzimy od razu efekty i wiemy czy zaplanowane działania powiodły się czy też nie. W CFEngine piszemy plik "promises" i przy najbliższym połączeniu klient pobiera go i stara się osiągnąć stan zapisany w pliku. Jeśli chcemy uzyskać informacje czy udało się uzyskać to co chcieliśmy to musimy dopisać kod odpowiedzialny za pobranie raportów. Ansible wydaje się więc wygodniejsze do zarządzania serwerami szczególnie gdy nie jest ich bardzo dużo (chociaż radzi sobie również gdy jest ich sporo). Niestety nie obsługuje na razie komputerów z Windows.
Zarządzanie nie wymaga wiele nauki. Istnieją dwa tryby pracy. Pierwszy to pojedyncze polecenia, przykładowo: ansible all -m ping - pingowanie klientów. Pierwszy parametr all oznacza wybór wszystkich grup hostów zdefiniowanych w pliku /etc/ansible/hosts. Można też osobno odwoływać się do grup lub pojedynczych serwerów (po ip lub domenie).
ansible all -a "jakieś polecenie bash" --user=administrator -K - uruchomienie polecenia powłoki jako użytkownik administrator gdzie parametr K każe uruchomić polecenie za pomocą sudo i zapytać ansible o hasło (raz dla wszystkich hostów - stąd muszą mieć ustawione te same hasło jeśli chcemy załatwić pracę jednym poleceniem).
ansible all -m apt -a "pkg=eclipse state=present" --user=administrator -K - użycie modułu apt do instalacji pakietów na systemach debianowych - instalujemy eclipse.
Drugim sposobem jest wykonywanie wielu działań na raz za pomocą tzw. playbook. Są to pliki w YAML, których składnia jest bardzo prosta:
- hosts: webservers
  vars:
    http_port: 80
    max_clients: 200
  remote_user: root
  tasks:
  - name: ensure apache is at the latest version
    yum: pkg=httpd state=latest
  - name: write the apache config file
    template: src=/srv/httpd.j2 dest=/etc/httpd.conf
    notify:
    - restart apache
  - name: ensure apache is running
    service: name=httpd state=started
  handlers:
    - name: restart apache
      service: name=httpd state=restarted
Kolejno deklarujemy w nim z jaką grupą hostów pracujemy, dodajemy zmienne, użytkownika na koncie którego będziemy wykonywać polecenia, oraz zadania. Zadanie ma swój opis - komentarz (name) oraz podany moduł (np. yum) i stan. Po kilku minutach nauki składni można zacząć już pracę i tworzyć proste playbooki. Małym problemem Ansible może być fakt, że w pliku hosts wpisujemy IP (lub domeny) i gdy mamy komputery o zmiennym IP z DHCP to nie możemy tego zrobić. W przypadku niepowodzenia polecenie nie jest automatycznie ponawiane.
Samo Ansible bardzo mi się podoba i decydujące tutaj poza faktem lekkości po stronie klienta (serwer ssh) jest fakt, że od razu wiem jaki skutek odniosły moje działania. Jednak dla osób, które chciałyby zarządzać dużą ilością desktopów lepszym rozwiązaniem może okazać się CFEngine. Natomiast dla moich potrzeb Ansible świetnie nada się do systemu zarządzania komputerami, który planuje napisać (o czym wkrótce).