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

Podobne dokumenty