SQL Server 2008 – dodaj grupę lokalną jako login

Przy zarządzaniu dostępami do SQL Servera możemy dodać grupę użytkowników jako jeden login. Potem ułatwia to zarządzanie – zamiast tworzyć i kasować dostęp do serwera i bazy dla każdego nowego użytkownika wystarczy go dodać lub usunąć z grupy. Jak to się robi – na przykładzie ustawienia lokalnej grupy administratorów serwera jako sysadminów SQL Servera:

USE [master]
GO
CREATE LOGIN [NAZWA_SERWERA\Administrators]
FROM WINDOWS
WITH DEFAULT_DATABASE=[master]
GO

EXEC master..sp_addsrvrolemember
@loginame = N'NAZWA_SERWERA\Administrators',
@rolename = N'sysadmin'
GO

Uruchomienie takich poleceń wygeneruje błąd:

Msg 15401, Level 16, State 1, Line 1
Windows NT user or group 'NAZWA_SERWERA\Administrators' not found. Check the name again.
Msg 15007, Level 16, State 1, Procedure sp_addsrvrolemember, Line 68
'NAZWA_SERWERA\Administrators' is not a valid login or you do not have permission.

Okazuje się, że jeśli chcemy dodać grupę lokalną musimy zamiast nazwy serwera użyć BUILTIN:

USE [master]
GO
CREATE LOGIN [BUILTIN\Administrators]
FROM WINDOWS
WITH DEFAULT_DATABASE=[master]
GO

EXEC master..sp_addsrvrolemember
@loginame = N'BUILTIN\Administrators',
@rolename = N'sysadmin'
GO

I działa.

PHP + Apache + Imagick na Windows 7

Zadanie – zainstalować obsługę Image Magick na maszynie deweloperskiej z Windows7 64-bit. Integracja z PHP 5.3.8 jako moduł Apache 2.2.x.

PHP 5.3.8 musi być w w wersji Thread Safe, bo ona jest przewidziana do integracji jako moduł Apache 2.2 (zawiera bibliotekę php5apache2_2.dll, której jest pozbawiona wersja Non Thread Safe przeznaczona na dostęp CGI). Ponieważ do budowy PHP stosowany jest kompilator VC9, to potrzebne są binaria Apache skompilowane także VC9. Do pobrania z Apache Lounge.

Obsługa rozszerzenia imagick wymaga posiadania zainstalowanego Image Magick. Ściągamy wersję 32-bitową, ponieważ PHP też jest w wersji 32-bit. Najlepiej zastosować się do zaleceń autorów – jeśli nie wiesz co potrzebujesz, to ściągaj wersję Q-16-windows-dll. Podczas instalacji należy zaznaczyć dodanie Image Magick do ścieżki systemowej. Następnie ściągamy php_imagick.dll – nie ma obecnie wersji windows na PECL, więc bierzemy bezpośrednio ze strony autora rozszerzenia (wybieramy wersję Thread Safe). Bibliotekę kopiujemy do podkatalogu ext, zmianiamy nazwę na php_imagick.dll i dodajemy rozszerzenie

extension=php_imagick.dll

I gotowe.

EDIT: Nie do końca gotowe. Jeśli zatrzymamy się w tym punkcie biblioteka będzie się podłączała i zobaczymy ją w phpinfo(), ale każdorazowe wywołanie funkcji Imagick() będzie powodowało restart Apache. Żeby działało poprawnie należy zainstalować wersję Image Magick nie nowszą niż 6.6.4.0. Patrz też: odpowiedź na stackoverflow

Open file – security warning na Windows 2008

Jak wyłączyć konieczność potwierdzania uruchamiania/pobierania plików zewnętrznych w W2K8, kiedy wyskakuje okno ‘open file – security warning’? Porada znaleziona na experts-exchange.com:

  1. Otwórz konsolę Local Group Policy Edito wpisując w konsoli gpedit.msc
  2. Przejdź do User Configuration > Administrative Templates > Windows Components > Attachment Manager
  3. Wybierz Inclusion list for low file types i wprowadź swoje rozszerzenia oddzielane średnikiem (w moim przypadku wystarcza .bat)

Gotowe

Filtrowanie tablicy w javascript

Zadanie:
mamy w javascript tablicę obiektów, przykładowo strukturę jakiejś firmy:

var json = [
{
    "region_id" : "10",
    "obszar_id" : "15",
    "punkt_sprzedazy_id" : 25,
    "nazwa_punktu" : "Punkt 1"
},
{
    "region_id" : "10",
    "obszar_id" : "15",
    "punkt_sprzedazy_id" : 24,
    "nazwa_punktu" : "Punkt 2"
},
{
    "region_id" : "10",
    "obszar_id" : "15",
    "punkt_sprzedazy_id" : 27,
    "nazwa_punktu" : "Punkt 3"
},
{
    "region_id" : "10",
    "obszar_id" : "17",
    "punkt_sprzedazy_id" : 125,
    "nazwa_punktu" : "Punkt 41"
},
{
    "region_id" : "14",
    "obszar_id" : "9",
    "punkt_sprzedazy_id" : 205,
    "nazwa_punktu" : "Punkt 87"
},
{
    "region_id" : "6",
    "obszar_id" : "23",
    "punkt_sprzedazy_id" : 16,
    "nazwa_punktu" : "Punkt 42"
},
...
];

Teraz chcemy wybrać z tej tablicy tylko punkty sprzedaży z jednego obszaru – czyli np. elementy, dla których obszar_id == 15. Można do tego użyć zewnętrznych bibliotek operujących na formacie JSON, np: jOrder, JSONPath, Jaql, czy jLinq, albo wykorzystać obsługę Array.prototype.filter:

function wybierzPunktyZObszaru(obszar_id) {
    var Punkty = json.filter(function(el) {
        return el.obszar_id == obszar_id;
    });
    return Punkty;
}

Dla większej ilości warunków łączymy je:

var Punkty2 = json.filter(function(el) {
    return el.obszar_id == 15
    && el.punkt_sprzedazy_id >= 10;
});

lub

var Punkty3 = json.filter(function(el) {
    return el.obszar_id == 15;
}).filter(function(el) {
    return el.punkt_sprzedazy_id >= 10;
});

Więcej np. na stackoverflow.

Ważne, żeby dla przeglądarek nieobsługujących Array.prototype.filter dodać lokalną obsługę metody (za dokumentacją):

if (!Array.prototype.filter)
{
  Array.prototype.filter = function(fun /*, thisp */)
  {
    "use strict";

    if (this === void 0 || this === null)
      throw new TypeError();

    var t = Object(this);
    var len = t.length >>> 0;
    if (typeof fun !== "function")
      throw new TypeError();

    var res = [];
    var thisp = arguments[1];
    for (var i = 0; i < len; i++)
    {
      if (i in t)
      {
        var val = t[i]; // in case fun mutates this
        if (fun.call(thisp, val, i, t))
          res.push(val);
      }
    }

    return res;
  };
}

Taki fragment dodajemy np. na początku kodu.

Gdyby chcieć skorzystać przykładowo z biblioteki jOrder:

// utwórz obiekt tablicy jOrder i dodaj nieunikalny (grouped: true) indeks 'ix_obszar_id' na polu 'obszar_id'
var jsonTable = jOrder.table(json).index('ix_obszar_id', ['obszar_id'], {grouped : true});
// funkcja filtrująca, która zwraca tylko znalezione rekordy (renumber : true)
function szukajDaneZObszaru(obszar_id) {
    return jsonTable.where([{'obszar_id' : obszar_id}], {indexName : 'ix_obszar_id', renumber : true});
}
// wyszukaj punkty z obszaru 15
var Dane15 = szukajDaneZObszaru(15);

Więcej przykładów zastosowania jOrder na wiki projektu

dtsrun /Z

Do uruchamiania DTSów MS SQLa 2000 z linii poleceń służy dtsrun. Posiada kilka zdefiniowanych przełączników, w tym jeden, który służy do ukrywania wszystkich parametrów: /Z (np. żeby nikt nie podejrzał hasła). Wykorzystując go należy przekazać zakodowany ciąg znaków zawierający informacje, które możemy przekazać podczas normalnego wywołania. Przykładowo (~ oznacza, że dane znajdujące się za przełącznikiem są przekazywane jako hex):

DTSRUN /~Z0x1C0C617F1217894A624CDB7DC...

Jak taki ciąg przygotować?
Read more of this post

ZF: Zend_Date a polskie nazwy

Zadanie z użyciem Zend_Date: mając datę przykładowo 2011-01-24 wyświetlić ją jako 24 styczeń 2011.

Na początek tworzymy obiekt, który będzie zawierał naszą datę. Żeby wyświetlać polskie nazwy zainicjujemy locale = ‘pl_PL’

$data = new Zend_Date('2011-01-24', 'YMd', 'pl_PL');

Zakładając, że nie wymuszaliśmy formatowania daty jako ‘php’ i wykorzystujemy format ‘iso’ wyświetlamy w wymaganym formacie:

echo $data->get(Zend_Date::DAY) . ' '
     . $data->get(Zend_Date::MONTH_NAME) . ' '
     . $data->get(Zend_Date::YEAR);

Otrzymujemy: 24 stycznia 2011

Czyli niezupełnie to, o co chodziło. Dlaczego tak jest?
Read more of this post

ZF: Długości pól formularza na podstawie bazy

Kiedy tworzymy formularz w Zend Frameworku przesyłamy potem dane z niego do bazy. Czasem się okazuje, że długość wprowadzanych danych przekracza długość pola tabeli i przez to pojawia się błąd w stylu „String data, right truncated: 7 ERROR value too long for type character varying(40)” (PostgreSQL). Żeby temu zapobiec można ustawić dodatkowe walidatory dla pól formularza, które będą bazowały na informacjach z metadanych tabeli. Można to osiągnąć m.in. tak:
Read more of this post

Przez proxy z konsoli

Czasem zachodzi potrzeba połączenia się ze stroną internetową z poziomu konsoli windows (np. przy aktualizacji gemów w Ruby). Co zrobić, jeśli jesteśmy zmuszeni korzystać z proxy? Sposobów jest kilka, najprostszy chyba ten: ustawić zmienną środowiskową http_proxy:

set http_proxy=http://user:haslo@adres.serwera.proxy:port

Wyłącza się to poprzez

set http_proxy=

Można też rozbić wpis na kilka:

set http_proxy=http://adres.serwera.proxy:port
set http_proxy_user=user
set http_proxy_pass=haslo

And i &&

W przejętej do utrzymania aplikacji napisanej w PHP zauważyłem, że podczas testowania warunków if() zamiast używania operatorów && i || stosowano and i or. Ponieważ ja zawsze używałem tych pierwszych postanowiłem sprawdzić czym to się różni. Po lekturze dokumentacji i sieci można powiedzieć, że sprawa kręci się wokół dwóch rzeczy: kolejność operatorów (operator precedence) i short-circuit evaluation. To drugie nie wiem jak ładnie przetłumaczyć, ale chodzi o jak najszybsze zakończenie sprawdzania warunków true/false – to znaczy kiedy silnik PHP uzna, że zna już odpowiedź, to nie sprawdza pozostałych warunków.

Ma to miejsce kiedy:

  • pierwsza część warunku and zwraca false – bo od razu wiadomo, że cały warunek zwróci false
  • pierwsza część warunku or zwraca wartość true – bo od razu wiadomo, że cały warunek zwróci true

Read more of this post

Otwieranie załączników

Zdarza się, że podczas ściągania dokumentów z sieci (doc, xls, csv, …) lub np. otwierania załączników w Outlooku niechcący odznaczymy pole „Zawsze pytaj przed otwarciem pliku tego typu”. I szlag potem nas trafia, bo nie możemy znaleźć jak to przywrócić.

Przekopanie całych menu opcji, ustawień i preferencji zazwyczaj nic nie daje. Najlepiej od razu iść do miejsca, gdzie i tak jakaś opcja by grzebała.

Otwórz okno Eksploratora Windows, jeśli nie masz jakiegoś na wierzchu. Z menu wybierz Narzędzia -> Opcje folderów… a potem zakładkę „Typy plików”.

W oknie „Zarejestrowane typy plików” wybierz interesujące Cię rozszerzenie. Ja mam najczęściej problem przy plikach Excela, to szukam XLS. Po podświetleniu rozszerzenia powinien pokazać się przycisk „Zaawansowane”. Klik. Zaznacz pole „Potwierdź otwarcie po pobraniu” i pozamykaj okna klikając wszystkie „OK”.

Voila.

Follow

Otrzymuj każdy nowy wpis na swoją skrzynkę e-mail.