[Oprogramowanie] Wypakowanie plików z instalatora MSI

Aby szybko wypakować zawartość instalatora typu .msi, otwieramy cmd.exe i odpalamy następującą komendę:

msiexec /a foo.msi /qb TARGETDIR=C:\bar

gdzie foo.msi to instalatorek, zaś C:\bar to katalog na pliki, który musimy uprzednio utworzyć.

[Linux] nginx – przekierowywanie adresów URL

Wbrew temu co się powszechnie uważa, serwer nginx obsługuje przekierowywanie URLi (a więc efekt, który możemy uzyskać przy pomocy .htaccess i mod_rewrite dla Apache).

W części server dodajemy:

# jeśli żądany plik nie jest plikiem lub katalogiem…
if (-f $request_filename) { break; }
if (-d $request_filename) { break; }

# to „oddajemy” żądanie do pliku news.php
rewrite ^/news/([a-z0-9-]+?)$ /news.php?slug=$1 last;

# niektóre skrypty i frameworki, zamiast korzystać z regułek serwera,
# wolą same pobrać i sparsować adres (tzw. routing)
# rewrite ^(.*?)$ /index.php?uri=$1 last;

[Linux] Zmiana hasła użytkownika Windows – Linuksem ;)

Jeśli zgubiliśmy hasło do naszego Windowsa, w odzyskaniu (a właściwie zmianie) go może nam pomóc płyta z Linuksem i programem chntpw. Omówię proces resetowania hasła na przykładzie LiveDVD Ubuntu 13.10. Wypalamy ściągnięte Ubuntu na płytkę i uruchamiamy z niej komputer. Gdy pokaże się pulpit, wybieramy opcję Try Ubuntu (Wypróbuj Ubuntu).

Otwieramy terminal (Ctrl+Alt+T) oraz wpisujemy:

sudo su

aby zalogować się na superużytkownika (root). Wydajemy polecenie:

apt-get install chntpw

aby zainstalować narzędzie.

Teraz przyda nam się nazwa partycji z Windą. Wydajemy polecenie:

ls -l /dev/disk/by-label

mój wynik to:

lrwxrwxrwx 1 root root 10 11-10 20:39 Arch -> ../../sda1
lrwxrwxrwx 1 root root 10 11-10 20:39 Whatever -> ../../sda5
lrwxrwxrwx 1 root root 10 11-10 20:39 Home -> ../../sda2
lrwxrwxrwx 1 root root 10 11-10 20:39 Windows -> ../../sda3

z czego wynika, że nazwa partycji to sda3. Montujemy ją:

mkdir /media/windows
mount -t ntfs-3g /dev/sda3 /media/windows      # podmień sda3

Wydajemy polecenie:

chntpw /media/windows/Windows/System32/config/SAM

i postępujemy zgodnie z instrukcjami programu.

A co w Linuksie?

sudo su
mkdir /media/linux
mount /dev/sda1 /media/linux
chroot /media/linux
passwd winek

· napisał winek, w Linux

[PHP] Composer – automatyczne zarządzanie zależnościami w PHP

Nie mam pomysłu na chwytliwy headline, przejdźmy zatem do sedna. Composer jest narzędziem służacym do zarządzania zależnościami w projektach PHP. Oznacza to, że jeśli tylko interesujący nas pakiet:

  • jest utrzymywany w systemie kontroli wersji Git,
  • jest dodany do repozytorium PEAR
  • istnieje w głównym repozytorium Composera - Packagist

to owo narzędzie zajmie się dla nas automatyczną instalacją oraz aktualizacją go.

Jak?

Całość sprowadza się do dostarczenia programowi pliku o nazwie composer.json w głównym katalogu naszej aplikacji. Jak można się domyślić, napisać go trzeba w formacie JSON. Podstawowa składnia wygląda mniej więcej tak:

{
    "require": {
        "pakiet": "wersja"
    }
}

Wersja tutaj może być wildcardem: 2.*, *, numerem wersji (2.3.5) lub porównaniem (>=2.3).

Aby zainstalować Composera w obszarze naszego projektu, postępujemy zgodnie z instrukcjami. W ich wyniku, w wybranym folderze pojawi się plik o nazwie composer.phar - jest to spakowany, gotowy do użycia Composer. Następnie odpalamy konsolę oraz wydajemy komendę:

cd /ścieżka/do/projektu    # zmieniamy katalog roboczy
php composer.phar install

aby zainstalować potrzebne nam biblioteki.

Co się stało?

Będąc w katalogu projektu, wywołaliśmy opcję install Composera - a co za tym idzie:

  • Pojawił się katalog vendor. To tam domyślnie Composer instaluje zależności podane przez nas w projekcie.
  • Pojawił się plik composer.lock. Zawiera on wersje pobranych przez nas pakietów. Jeśli teraz usuniemy katalog vendor i ponownie wydamy komendę install, to Composer weźmie z niego dokładne wersje pakietów do instalowania.

Dodatkowo, w katalogu vendor, dostaliśmy plik o nazwie autoload.php. Służy on ustanowieniu autoloadingu dla naszych bibliotek. Dzięki temu, po zaincludowaniu go nie będziemy musieli wykonywać dodatkowych instrukcji require dla naszych klas.

Co jakiś czas możemy wykonać także polecenie php composer.phar update, które zaktualizuje zainstalowane biblioteki lub zainstaluje nowe, kiedy dodamy je do pliku konfiguracyjnego.

Jeżeli utrzymujemy projekt w systemie kontroli wersji Git, warto dodać folder vendor do .gitignore, aby nie wysyłać kodu zależności w sieć.

[Miniblog] WordPress Link Checker

01.11.2013-23:21:18

Napisałem skrypt, który sprawdza stan różnorakich linków osadzonych w postach na blogu WordPress. Użytkowanie sprowadza się do wrzucenia pliku check.php do katalogu z instalacją WordPressa i odpalenie go poprzez przeglądarkę.

Uwaga na boku: Przygotowywanie spisu może trochę potrwać.

Pobierz, GitHub.

[PHP] Autoload – z czym to się je?

Początkujący programiści PHP do ładowania klas używają zazwyczaj instrukcji include/require lub ich wersji z once. Powstały w ten sposób kod wygląda na przykład tak:

require_once 'classes/DB.php';

$db = new DB('localhost', 'userek', 'haselko', 'baza');

A gdyby za nas klasy ładował sam PHP? Hm?

Rewolucja

Na szczęście już dawno udostępniono nam rozwiązanie. Polega ono na zdefiniowaniu krótkiej funkcji, która biorąc nazwę klasy zaincluduje nam odpowiedni plik. W naszym przypadku ta funkcja może wyglądać mniej więcej tak:

function __autoload($className)
{
    $classFile = $className.'.php';
    if (is_file('classes/'.$classFile) {
        require_once 'classes/'.$classFile;
    }
}

W pierwszej linijce wyprowadzamy nazwę pliku ładowanej klasy. Przyjmujemy, że nazwa pliku pisana jest z małych liter i jest zakończona rozszerzeniem .php. Używamy tu funkcji strtolower, aby zamienić duże litery na małe. Następnie sprawdzamy, czy taki plik istnieje - jeżeli tak, to wtedy requireujemy go.

I tym też sposobem możemy ładować dowolne klasy w obrębie naszego projektu. Autoloader pozwala nam pozbyć się pełzających instrukcji require gdziekolwiek użyjemy klasy.

[PHP] Tablice – różnica między operatorem „+” a funkcją array_merge

$a = array('id' => 103, 'name' => 'Derp');
$b = array('id' => 492, 'name' => 'Derp', 'points' => 50);

/// array('id' => 103, 'name' => 'Derp', 'points' => 50)
var_dump($a + $b);

/// array('id' => 492, 'name' => 'Derp', 'points' => 50)
var_dump(array_merge($a, $b));

W przypadku takich samych indeksów, funkcja array_merge stosuje wartości z drugiej tablicy, czego operator dodania nie robi.