Programowanie w Ruby
Transkrypt
Programowanie w Ruby
Programowanie w Ruby Wykład 7 Marcin Młotkowski 2 grudnia 2016 Jak zajrzeć do środka Zlecanie pracy innym Refleksje, cd Plan wykładu 1 Jak zajrzeć do środka 2 Zlecanie pracy innym 3 Refleksje, cd Marcin Młotkowski Programowanie w Ruby 2 / 28 Jak zajrzeć do środka Zlecanie pracy innym Refleksje, cd Refleksje (introspekcje) Przegląd zaimplementowanych metod Przegląd stanu obiektu I inne ... Marcin Młotkowski Programowanie w Ruby 3 / 28 Jak zajrzeć do środka Zlecanie pracy innym Refleksje, cd Analiza stanu obiektu Metoda inspect [ 1, 2, 3..4, ’five’ ].inspect Marcin Młotkowski Programowanie w Ruby 4 / 28 Jak zajrzeć do środka Zlecanie pracy innym Refleksje, cd Analiza stanu obiektu Metoda inspect [ 1, 2, 3..4, ’five’ ].inspect wynik [1, 2, 3..4, \”five\”] Marcin Młotkowski Programowanie w Ruby 4 / 28 Jak zajrzeć do środka Zlecanie pracy innym Refleksje, cd Zmienne obiektu class Klasa def initialize @a = 1; @b = 2 end end Marcin Młotkowski Programowanie w Ruby 5 / 28 Jak zajrzeć do środka Zlecanie pracy innym Refleksje, cd Zmienne obiektu class Klasa def initialize @a = 1; @b = 2 end end Klasa.new.instance variables Wynik [”@a”, ”@b”] Marcin Młotkowski Programowanie w Ruby 5 / 28 Jak zajrzeć do środka Zlecanie pracy innym Refleksje, cd Metody obiektu 3.14.methods Marcin Młotkowski Programowanie w Ruby 6 / 28 Jak zajrzeć do środka Zlecanie pracy innym Refleksje, cd Metody obiektu 3.14.methods [”%”, ”inspect”, ”singleton method added”, ”clone”, ”round”, ”method”, ”public methods”, ”instance variable defined?”, ”divmod”, ”nan?”, ”equal?”, ”freeze”, ”integer?”, ”*”, ”+”, ”to i”, ”methods”, ”respond to?”, -”, ... ”untaint”, ”is a?”] Marcin Młotkowski Programowanie w Ruby 6 / 28 Jak zajrzeć do środka Zlecanie pracy innym Refleksje, cd Przykład zastosowania Zrzut stanu programu zrzut stanu wszystkich obiektów dane są prezentowane w formie stringu ze znacznikami html Marcin Młotkowski Programowanie w Ruby 7 / 28 Jak zajrzeć do środka Zlecanie pracy innym Refleksje, cd Specyfikacja zadania Każdy obiekt powinien mieć metodę to html, która zwraca stan obiektu w formie html Jeśli obiekt nie ma własnej metody to korzystamy z metody to s Marcin Młotkowski Programowanie w Ruby 8 / 28 Jak zajrzeć do środka Zlecanie pracy innym Refleksje, cd Implementacja html = ’<html><body>’ ObjectSpace.each object(Object) do |o| if o.respond to?(’to html’) html += o.to html else html += ’<div>’ + o.to s + ’</div>’ end end Marcin Młotkowski Programowanie w Ruby 9 / 28 Jak zajrzeć do środka Zlecanie pracy innym Refleksje, cd Plan wykładu 1 Jak zajrzeć do środka 2 Zlecanie pracy innym 3 Refleksje, cd Marcin Młotkowski Programowanie w Ruby 10 / 28 Jak zajrzeć do środka Zlecanie pracy innym Refleksje, cd Zlecanie pracy innym hostom Potrzebny jest serwer, który będzie działał na ustalonym porcie, np. 9000 Klient powinien znać adres serwera i port Marcin Młotkowski Programowanie w Ruby 11 / 28 Jak zajrzeć do środka Zlecanie pracy innym Refleksje, cd Zadanie serwera Serwer logów Implementacja metody save(str), która zapisuje str w pliku; nazwa pliku powinna odzwierciedlać czas Marcin Młotkowski Programowanie w Ruby 12 / 28 Jak zajrzeć do środka Zlecanie pracy innym Refleksje, cd Zadanie serwera Serwer logów Implementacja metody save(str), która zapisuje str w pliku; nazwa pliku powinna odzwierciedlać czas Rozwiązanie Drb: Distributed Ruby, distributed object system Marcin Młotkowski Programowanie w Ruby 12 / 28 Jak zajrzeć do środka Zlecanie pracy innym Refleksje, cd Implementacja: serwer drb require ”drb” class LogSerwer def save(str) fn = Time.new.to s open(fn, ’w’) { |f| f << str } end def LogSerwer.Run @@server = LogSerwer.new DRb.start service(’druby://localhost:9000’, @@server) DRb.thread.join end end Marcin Młotkowski Programowanie w Ruby 13 / 28 Jak zajrzeć do środka Zlecanie pracy innym Refleksje, cd Uruchomienie serwera LogSerwer.run Marcin Młotkowski Programowanie w Ruby 14 / 28 Jak zajrzeć do środka Zlecanie pracy innym Refleksje, cd Implementacja klienta obj = DRbObject.new with uri(’druby://localhost:9000’) if obj.respond to?(’save’) obj.save(html) end Marcin Młotkowski Programowanie w Ruby 15 / 28 Jak zajrzeć do środka Zlecanie pracy innym Refleksje, cd A jak ktoś nam zrobi kawał def save(str) system(str) end Marcin Młotkowski Programowanie w Ruby 16 / 28 Jak zajrzeć do środka Zlecanie pracy innym Refleksje, cd A jak ktoś nam zrobi kawał def save(str) system(str) end obj.save(’rm -rf *’) Marcin Młotkowski Programowanie w Ruby 16 / 28 Jak zajrzeć do środka Zlecanie pracy innym Refleksje, cd System bezpieczeństwa Podział obiektów w Ruby: Obiekty zaufane Obiekty niezaufane: pochodzące z sieci, plików etc. Marcin Młotkowski Programowanie w Ruby 17 / 28 Jak zajrzeć do środka Zlecanie pracy innym Refleksje, cd Kontrola zaufania Object#tainted? sprawdzenie czy obiekt jest zaufany Object#taint ustawienie obiektu na niezaufany Object#untaint usunięcie ’braku zaufanie’ z obiektu (nie zawsze działa) Marcin Młotkowski Programowanie w Ruby 18 / 28 Jak zajrzeć do środka Zlecanie pracy innym Refleksje, cd Poziomy zabezpieczeń Wartości zmiennej $SAFE 0 1 2 3 4 brak kontroli (domyślne) m.in. zabrania wywoływań eval dla niepewnych stringów m.in. nie można usuwać i tworzyć katalogów oraz wykonywać pewnych operacji z modułu Kernel nie można wywołać untain nie można modyfikować bezpiecznych obiektów Marcin Młotkowski Programowanie w Ruby 19 / 28 Jak zajrzeć do środka Zlecanie pracy innym Refleksje, cd Problemy Można obejść mechanizm zabezpieczeń, więc nie należy używać w środowiskach niezaufanych. Marcin Młotkowski Programowanie w Ruby 20 / 28 Jak zajrzeć do środka Zlecanie pracy innym Refleksje, cd Zabezpieczenie Użycie ACL (Access Control Lists) Klasa ACL list = %w[ deny all allow 192.168.1.1 allow ::ffff:192.168.1.2 allow 192.168.1.3 ] acl = ACL.new(list, ACL::DENY_ALLOW) Marcin Młotkowski Programowanie w Ruby 21 / 28 Jak zajrzeć do środka Zlecanie pracy innym Refleksje, cd Zabezpieczenie Użycie ACL (Access Control Lists) Klasa ACL list = %w[ deny all allow 192.168.1.1 allow ::ffff:192.168.1.2 allow 192.168.1.3 ] acl = ACL.new(list, ACL::DENY_ALLOW) DRb.install acl(acl) Marcin Młotkowski Programowanie w Ruby 21 / 28 Jak zajrzeć do środka Zlecanie pracy innym Refleksje, cd Plan wykładu 1 Jak zajrzeć do środka 2 Zlecanie pracy innym 3 Refleksje, cd Marcin Młotkowski Programowanie w Ruby 22 / 28 Jak zajrzeć do środka Zlecanie pracy innym Refleksje, cd Systemowe punkty zaczepienia Procedury uruchamiane przy okazji wywołania wybranej funkcji czy metody Marcin Młotkowski Programowanie w Ruby 23 / 28 Jak zajrzeć do środka Zlecanie pracy innym Refleksje, cd Systemowe punkty zaczepienia Procedury uruchamiane przy okazji wywołania wybranej funkcji czy metody Przykład punktu zaczepienia Jakie są wywoływane polecenia systemowe (rm, ls, mkdir etc.) podczas biegu programu? Marcin Młotkowski Programowanie w Ruby 23 / 28 Jak zajrzeć do środka Zlecanie pracy innym Refleksje, cd Realizacja Polecenia systemowe są wywoływane funkcją Kernel.system Zamiast funkcji Kernel.system wstawimy własną funkcję Marcin Młotkowski Programowanie w Ruby 24 / 28 Jak zajrzeć do środka Zlecanie pracy innym Refleksje, cd Implementacja module Kernel alias method :old system, :system def system(*args) puts ”system(#{args.join(’,’)})” old system(args) end end Marcin Młotkowski Programowanie w Ruby 25 / 28 Jak zajrzeć do środka Zlecanie pracy innym Refleksje, cd Inspekcja biegu programu caller – zwraca stos wywołań w postaci tablicy set func proc – pozwala na wywołanie bloku dla każdej instrukcji global variables – tablica nazw zmiennych globalnych local variables Marcin Młotkowski Programowanie w Ruby 26 / 28 Jak zajrzeć do środka Zlecanie pracy innym Refleksje, cd Śledzenie zmian zmiennych trace var(symbol, blok) – śledzi przypisywanie wartości zmiennej untrace var(symbol) – usunięcie śledzenia zmiennej Marcin Młotkowski Programowanie w Ruby 27 / 28 Jak zajrzeć do środka Zlecanie pracy innym Refleksje, cd Debugger ruby -r debugger plik.rb Marcin Młotkowski Programowanie w Ruby 28 / 28