HttpURLConnection i htaccess

Dostęp do zasobów za pomocą HttpURLConnection jest prosty, jednak komplikuje się nieco w sytuacji, gdy dany zasób jest zabezpieczony hasłem htaccess (htpasswd).

W takiej sytuacji istnieją 2 rozwiązania. Zgodnie z definicją możemy spróbować ustawić odpowiednie nagłówki, aby przekazać login oraz hasło:

String login    = "";
String password = "";

String encoding = new sun.misc.BASE64Encoder().encode(login + ":" + password.getBytes());
httpCon.setRequestProperty ("Authorization", "Basic " + encoding);
InputStream s = httpCon.getInputStream();

Rzeczą istotną, o której trzeba pamiętać jest to, że całość (login i hasło oddzielone dwukropkiem) muszą być przesłane w kodowaniu base64.

Wszystko by było super, gdyby nie jeden fakt – to nie (zawsze) działa. Drugą opcją jest zatem stworzenie funkcji zarządzającej hasłami w sytuacji, gdy HttpURLConnection natrafi na prośbę o hasło:

String login    = "";
String password = "";

Authenticator.setDefault(new Authenticator(){
  protected PasswordAuthentication getPasswordAuthentication() {
    return new PasswordAuthentication(login, password.toCharArray());
  }
});
	  
HttpURLConnection httpCon = (HttpURLConnection)url.openConnection();

Powyższe rozwiązanie ma dodatkową przewagę nad pierwszą opcją – login i hasło będą przesyłane tylko wtedy, gdy rzeczywiście będą potrzebne. Jeżeli strona nie będzie wymagała ich podania to nie będą przesłane.

Znikający interfejs sieciowy w ubuntu pod virtualbox

W sytuacji, gdy mamy maszynę wirtualną odpaloną pod Virtualbox’em (dotyczy też vmWare) i często przerzucamy dysk wirtualny między fizycznymi maszynami może się zdarzyć, że po odpaleniu tej wirtualnej nie będziemy mieli sieci. Wydanie polecenia ifconfig spowoduje, że będziemy widzieć tylko interfejs lo, a eth0 nie – dlaczego?

Powód jest prosty – gdy przerzuciliśmy dysk maszynę wirtualną na inny komputer zmienił się też interfejs sieciowy. Ubuntu nie rozpoznaje wtedy karty, która była podpięta do eth0 i ją po prostu wyłącza.

Rozwiązanie:
Wystarczy wyczyścić lub usunąć plik /etc/udev/rules.d/70-persitent-net.rules. Możemy tego dokonać wywołując:

sudo rm /etc/udev/rules.d/70-persitent-net.rules

Po restarcie interfejs eth0 wróci i będziemy mogli cieszyć się siecią ponownie :)

Symfony + doctrine: Piszemy własnego behaviora.

Symfony + doctrine: Piszemy własnego behaviora.

Dzisiaj krótki tutorial jak napisać własnego behaviora w Doctrine pod Symfony 1.4. Aby spróbować wszystkiego po trochu, behavior będzie dodawał pole do bazy, metodę do modelu oraz modyfikował zapytania (preDQL).

Behaviorem będzie: sortowanie.

Czytaj dalej Symfony + doctrine: Piszemy własnego behaviora.

Wymiana klawiatury w laptopie Dell D600

Wymiana klawiatury w Dellu jest dziecinnie prosta i nie powinna zająć więcej niż 5 minut. Do tej operacji potrzebujemy odkręcić raptem 2 śrubki. Zatem do dzieła.

Potrzebujemy:

laptopa:

klawiaturę

śrubokręt krzyżakowy

coś do podważania.

Zaczynamy:

W prawej części laptopa pokrywa z przyciskami posiada wgłębienie. Korzystamy z niego i podważamy cały element. Wystarczy lekko podważyć i wszystko ładnie odskakuje:

Po zdjęciu pokrywy widzimy 2 śrubki, które należy odkręcić:

Po ich okręceniu podnosimy klawiaturę.  Należy pamiętać o tym, że jest ona przyczepiona do płyty taśmą, którą należy odczepić:

Wkładamy nową klawiaturę i cieszymy się ze sprawnego laptopa :)

Całość nie powinna zająć więcej niż 5 minut. W przypadku tego Della wymiana jest rewelacyjna i bardzo prosta. Tak prosta wymiana (moim zdaniem) jest jeszcze w niektórych IBM’ach (T23, X32 itd), gdzie odkręca się tylko śruby od spodu i nie trzeba podważać osłony. Z doświadczenia wymiana w HP czy Fujitsu wymaga nieco więcej gimnastyki z odpinaniem osłony – tam trzeba podważyć i liczyć na to,  że odepnie się zanim strzelą plastiki…

Symfony fixtures: Array to string conversion oraz Integrity constraint violation

W przypadku, gdy podczas ładowania fixtures w projekcie symfony pojawi się jeden z poniższych komunikatów:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry ‚Array’ for key ’email_address’

Notice: Array to string conversion in /lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection/Statement.php on line 252

warto sprawdzić same fixtures i upewnić się, że nie ładujemy ich kilkukrotnie. Błąd może być spowodowany właśnie tym faktem, iż fixtures są składane w całość podczas ich ładowania. W przypadku, jeżeli będziemy mieli kilka obiektów o tym samym indeksie:

sfGuardUser:
  admin:
    username: admin
    password: admin
    email_address: admin@admin.pl
    Groups: [adminGroup]
    sfGuardUser:
  admin:
    username: admin
    password: admin
    email_address: admin@admin.pl
    Groups: [adminGroup]

Doctrine spróbuje połączyć obiekt admin w jeden.  W przypadku pól typu username, spróbuje ona stworzyć z nich tablicę. Efekt: podczas ładowania nastąpi próba przemapowania ich na string. W efekcie uzyskamy komunikat:

Notice: Array to string conversion

A wszystkie pola otrzymają wartość: Array – co jest powodem Integrity constraint violation.

Przy okazji: warto sprawdzić, czy przypadkiem nie ładujemy tego samego pluginu kilkukrotnie. W tym celu opłaca sięsprawdzić plik config/ProjectConfiguration.class.php i metodę setup():

class ProjectConfiguration extends sfProjectConfiguration
{
  public function setup()
  {
    $this->enablePlugins(array(
      'sfDoctrinePlugin',
      'sfDoctrineGuardPlugin',
      'sfDoctrineGuardPlugin',
    ));
  }
}

Eksperymenty z instalowaniem pluginów mogą spowodować, że plik będzie wyglądał właśnie w ten sposób. Symfony po wydaniu komendy ./symfony doctrine:build –all –and-load załaduje fixtures.yml dwukrotnie, co spowodouje wystąpienie błędu.

Notice: Array to string conversion in /lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection/Statement.php on line 252