2019-08-09
Sam nie wiem z czego to wynika, ale uzytkownicy proponuja czasami nieco abstrakcyjne rozwiazania zwiazane z ustawieniem uprawnien do bazy danych.
W tym przypadku klient chcial aby uzytkownicy bazy danych mogli pracowac na poziomie uprawnien db_owner, ale z jednym malym haczykiem. Uzytkownicy nie powinni moc usunac bazy danych. Dlaczego uwazam, ze zyczenie jest nieco abstrakcyjne? Otoz db_owner to bardzo wysokie uprawnienie, wiec zlosliwy uzytkownik moze:
- pousuwac tabele
- zmodyfikowac procedury
- zabrac uprawnienia innym uzytkownikom
- itp.
Wydaje sie ze lepszym rozwiazaniem byloby wybranie tylko tych uprawnien, ktore sa rzeczywiscie potrzebne i nadanie ich do roli bazy danych. Potem uzytkownikow wystarczy przypisywac do tej roli. Byloby bezpieczniej.
No ale… usuniecie bazy danych jak opisano w https://docs.microsoft.com/en-us/sql/t-sql/statements/drop-database-transact-sql?view=sql-server-2017 moze byc wykonane tylko w 3 przypadkach:
- uzytkownik ma upranienie ALTER ANY DATABASE
- uzytkownik ma uprawnienie CONTROL
- uzytkownik jest db_ownerem
Requires the CONTROL permission on the database, or ALTER ANY DATABASE permission, or membership in the db_owner fixed database role.
Skoro u nas uzytkownik jest db_ownerem, to mozna mu zabrac uprawnienie do kasowania bazy tylko na 2 sposoby:
- deny alter any database to user_name
- deny control on database::db_name to user_name
Czytaj dalej »
2019-08-09
Podczas instalacji Windows Failover Cluster na nodach clustra tworzony jest udostpniony zasob wskazujacy na C:\ClusterStorage
Takie „ukryte” zasoby sa czesto wychwytywane przez osoby pilnujace bezpieczenstwa serwerow, tymczasem ten powinien byc od razu wciagniety na white-list. Katalog ten pozwala w clustrze sledzic wykorzystanie Cluster Shared Volume (CSV), co jest dokladniej opisane na stronie Microsoft:
https://docs.microsoft.com/en-us/windows-server/failover-clustering/failover-cluster-csvs
2019-07-14
To dobrze móc wygenerować wykres w środowisku programistycznym, ale jeśli te wykresy mają np. dalej podlegać publikowaniu w intranecie i chciałoby sie aby te wykresy były zawsze aktualne, wtedy przyda się eksportowanie danych do pliku. Skrypt będzie można uruchamiać batchowo, bez udziału człowieka, a jednym z zadań skryptu będzie aktualizacja pliku.
W pierwszym kroku należy otworzyć nowe urządzenie. Tym urządzeniem będzie teraz plik PNG o zdefiniowanej wysokości, szerokości i rozdzielczości. Po otwarciu urządzenia, rysowanie wykresu będzie się odbywać właśnie tam. Wobec tego uruchomienie polecenia plot, nie spowoduje narysowania czegokolwiek na ekranie. Wszystko będzie odbywać się w pliku graficznym. Ostatnim poleceniem jest zamknięcie urządzenia za pomocą dev.off():
png('c:/temp/chicken_chart.png', width = 500, height = 350, res = 72)
plot(x=1:nrow(chickwts), y=chickwts$weight,
col=color_column, pch = shapes_column,
xlab = 'Chicken', ylab = "Chicken's weight")
legend("topleft", legend = levels(chickwts$feed),
col = my_colors,
pch = my_shapes )
dev.off()

2019-07-14
Zależnie od sytuacji, czasami chcemy mieć duży i dokładny wykres, co pozwala dokłądnie przyjrzeć się poszczególnym elementom wykresu. Innym razem zadowolisz się po prostu ogólną znajomością sytuacji i wtedy przyda się kilka wykresów na raz prezentujących różne zależności, chociaż zdecydowanie mniejszych i mniej dokładnych.
W języku R za układ wykresu odpowiada kilka parametrów sesji. Możesz je wyświetlić korzystając z polecenia:
par()
Aby przekonfigurować środowisko tak, aby na raz pojawiały się 3 wykresy ułożone poziomo jeden nad drugim wykonaj polecenie:
par(mfrow=c(3,1))
Teraz pozostaje rysować wykresy:
barplot(feed_mean,
main="Average chicken weight depending on feed",
ylab="weight",
xlab="feed type")
hist(ord_chick$weight, breaks = 10, ylim=c(0,10),
ylab="Number of chickens", xlab="Chicken's weight")
barplot(data = chickwts,height = chickwts$weight,
col=color_column, pch = shapes_column)

Czytaj dalej »
2019-07-14
W jednym z poprzednich wpisów pokazywałem, jak zbudować wykres słupkowy. Narzekaliśmy jednak na to, że słupków było tyle, co danych, a tymczasem często chciałoby się je uogólnić. Wszystkie próbki odpowiadające jednej kategorii do zaprezentowania na wykresie można uogólnić np. wyznaczając dla nich średnią.
W tym przykładzie nadal pracujemy z informacjami o wadze kurczaków w zależności od karmy, jaką im podawano. Aby rozpocząć rysowanie przygotujemy w odpowiedni sposób dane. Zostaną one podzielone na kategorie ze względu na rodzaj karmy, a potem dla każdej z tych grup wyliczymy wartość średnią:
feed_mean= tapply(chickwts$weight, chickwts$feed, mean, na.rm=T)
feed_mean
casein horsebean linseed meatmeal soybean sunflower
323.5833 160.2000 218.7500 276.9091 246.4286 328.9167
Teraz można przystąpić do rysowania wykresu:
barplot(feed_mean,
main="Average chicken weight depending on feed",
ylab="weight",
xlab="feed type")

Czytaj dalej »
2019-07-14
Na początku wiele rzeczy wydaje się prostych, a z czasem kiedy je analizujemy dochodzimy do drugiego dnia. Potem do trzeciego, potem do czwartego… Im dalej tym bardziej zaawansowane narzędzia są potrzebne.
boxplot(weight ~ feed, data = chickwts, varwidth = TRUE, notch=TRUE,
col='gray')

Czytaj dalej »
2019-06-28
W poprzednich atrukułach zobaczyłeś jak stworzyć wykres punkowy i wykres słupkowy. Każdy z tych wykresów zajmował się w miarę najdokładniejszym odwzorowaniem oryginalnych danych, o żadnej agregacji nie było w nich mowy. Małym krokiem w stronę uogólnienia danych jest budowanie histogramu. Jego zastosowanie to z jednej strony przedstawienie z jakimi danymi mamy do czynienia, a z drugiej strony pozwala niekiedy ocenić, czy dane są dobrane rzetelnie, czy wybrana próbka testowa dobrze prezentuje całą populację.
Do utworzenia wykresu histogramu dane trzeba odpowiednio przygotować – sortujemy zbiór danych ze względu na właściwość/cechę, która ma być prezentowana – tutaj jest to waga kurczaka
ord_chick = chickwts[order(weight),]
Teraz można już rysować histogram:
hist(ord_chick$weight, breaks = 5)

Czytaj dalej »