Od jakiegoś czasu męczyłem się z Ubuntu, ponieważ na laptopie usypianie działało bez problemu, ale po wybudzeniu się jakieś 4/10 razy niestety nie działała klawiatura ani touchpad. Za to działała np. podłączona poprzez USB myszka. Strasznie irytowało, i niestety powodowało że nie dało się z tego korzystać na dłuższą metę. Dzisiaj, szukając czegoś na necie, niechcący trafiłem do Launchpada Ubuntu, gdzie ktoś oczywiście ten błąd ponownie zgłosił. I nie dość tego, znalazłem też diffa do pakietu ubuntu, który tak naprawdę dodaje dwa pliki, dzięki którym nie ma problemu z działaniem klawiatury/touchpada po wybudzeniu laptopa!

Patch znajduje się pod adresem: librarian.launchpad.net/6787628/i8042-keyboard.patch, natomiast jeśli ma ktoś problem z odczytaniem co on robi, to już tłumaczę:

  1. najpierw trzeba utworzyć plik /etc/acpi/resume.d/40-i8042-input.sh i wpisać tam:
    
    #!/bin/sh
    
    # Rebind the AT keyboard interface.
    if [ -f /sys/bus/platform/drivers/i8042/bind ]; then
      echo -n "i8042" > /sys/bus/platform/drivers/i8042/bind
    fi
  2. następnie tworzymy plik /etc/acpi/suspend.d/20-i8042-input.sh z zawartością:
    
    #!/bin/sh
    
    # Unbind the AT keyboard interface.
    if [ -f /sys/bus/platform/drivers/i8042/unbind ]; then
      echo -n "i8042" > /sys/bus/platform/drivers/i8042/unbind
    fi
  3. trzeba jeszcze nadać prawa wykonalności dla obydwu plików:
    % sudo chmod 755 /etc/acpi/{resume.d/40-i8042-input.sh,suspend.d/20-i8042-input.sh}

Od tego momentu usypianie i wybudzanie laptopa stało się czystą przyjemnością! ;]

PS. Testowane na Feisty Fawn Beta.


Jak byc może kilka osób zdążyło zauważyć, wczoraj wyszła nowa wersja tej strony :) Zmieniła się nazwa (obecnie: myGeeBlog), zmieniła się też skórka, ponieważ na poprzednią nie mogłem już patrzeć ;) Obecna skórka to moja wariacja skórki Emire zaprojektowanej i wykonanej przez Phu Ly.

Mam nadzieję, że troszkę lepiej teraz tu wygląda, ale nie obiecuje super doznań estetycznych :P Jeśli zauważycie gdzieś jakieś niedoróbki, sypiące się miejsca or whatever, to proszę dać znać, postaram się szybko poprawić :)


Niedawno spotkałem się z pewną… ciekawostką, którą podsunął mi jeden ze współuczestników szkolenia w jakim brałem udział. W języku PHP można komentować kod na kilka sposobów:

  1. <?php
    # to jest komentarz jednolinijkowy
    ?>
  2. <?php
    // to jest komentarz jednolinijkowy
    ?>
  3. <?php
    /* to jest komentarz
    wielolinijkowy */
    ?>

Moja ciekawostka dotyczy wersji 1 i 2. Teraz pytanie, dość proste: co zostanie wyświetlone w wyniku parsowania pliku PHP o treści:

<?php
echo 'aaa?>';
echo 'bbb';
?>

Dość oczywistym jest wynik:

aaa?>bbb

No to teraz pytanie drugie: co będzie wynikiem parsowania poniższego skryptu?

<?php
#echo 'aaa?>';
echo 'bbb';
?>

Dla mnie, i dla conajmniej kilku innych osób które od dość długiego czasu zajmują się PHP, oczywistym jest wynik:

bbb

Ale dla developerów PHP logicznym jest inny rezultat:

'; echo 'bbb'; ?> 

Cytat z manuala:

The “one-line” comment styles only comment to the end of the line or the current block of PHP code, whichever comes first. This means that HTML code after // … ?> or # … ?> WILL be printed: ?> breaks out of PHP mode and returns to HTML mode, and // or # cannot influence that. If the asp_tags configuration directive is enabled, it behaves the same with // %> and # %>.

Źródło: manual PHP


Strasznie mnie wkurza nabyta niedawno maniera Akismet-a na stronicowanie listy spamerskich komentarzy dodanych na WordPressie. Nie wiem też czy poprawili to co było na początku po tej zmianie, czyli jeśli w międzyczasie, gdy byłeś na stronie 4 spamów, sprawdzając czy coś się nie nawinęło, a w międzyczasie doszły nowe komentarze, to wyświetlane były na stronie 1, która była już przez Ciebie sprawdzana… I tak oto można było wywalić w kosmos kilka, kilkanaście pozytywnych komentarzy.

Poprawienie tego “błędu” (mówię ogólnie o stronicowaniu spamów) jest dość proste - w obecnej, 2.1.2, wersji Wordpressa, w pliku /wp-content/plugins/akismet/akismet.php wywalamy linie 365 do 372 włącznie, wstawiając zamiast nich:

$comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_approved = 'spam' ORDER BY comment_date DESC");

Wywalamy także linie: 379 do 410 włącznie, i 449 do 479 włącznie. Od tej chwili Akismet nie będzie już stronicował wyników :)

Można też ściągnąć gotowego patcha (akismet.wordpress.212.patch) do Wordpress-a, do głównego katalogu Wordpressa w Twojej instalacji i go zaaplikować:

patch -p0 < akismet.wordpress.212.patch

co powinno być nieco prostsze ;) o ile masz dostęp do jakiegoś shella :) Jako bonus, patch spowoduje także numerowanie wszystkich spamów na liście :)


Zamknęłem właśnie Core CMS.

Powody:

  • brak czasu
  • brak sił
  • brak chęci
  • brak motywacji

do samodzielnego rozwijania systemu. Lark przestał się z jakiegoś powodu odzywać, nie odpowiada na maile ani jabbera. A ja sam mam co innego do roboty.

Gdyby ktoś miał ochotę kontynuować pracę nad całkiem zaawansowanym już Core 0.5.0, to proszę o kontakt, jestem gotów przekazać aktualne źródła (dostępne także w SVN), oferuje hosting + SVN + wiki i ew. moje delikatne wsparcie. Warunek: projekt dalej zostaje na GPL.

Jacyś chętni?

Acha: domena nie należy do mnie tylko do larka, więc z nim trzeba rozmawiać na ten temat. Ew. zakupić własną (w razie czego mogę też zaoferować subdomenę w domenie urzenia.net).

UPDATE:

Zapomniałem podlinkować oficjalny komunikat.


Jako, że od jakiegoś czasu zajmuję się perlem, to zależy mi na wynajdywaniu różnych użytecznych sztuczek i/lub informacji dotyczących tego języka. Poniżej zbiór kilku różnych porad, które jakoś się w ostatnim czasie uzbierały :)

  1. ciekawostka: używanie konstrukcji while-each do iteracji po elementach hasza jest wolniejsze niż używanie pary for-keys! Zrobiłem sobie jakiś czas temu do tego prostego benchmarka. Różnica prędkości nie jest duża, wacha się w granicach błędu (3-4%), ale zawsze jest to coś, tym bardziej, że for-keys pozwala na przeiterowanie po elementach hasza w jakiejś dowolnej, określonej przez nas kolejności :)
  2. często jest tak, że jakaś funkcja zwraca nam tablicę elementów, a my potrzebujemy tej referencji do tej tablicy. najprostszym, i do niedawna najczęściej przeze mnie używanym sposobem było zrobienie:
    @$ref = funkcja_zwracajaca_tablice();

    Od niedawna, używam konstrukcji:

    $ref = [funkcja_zwracajaca_tablice()];

    wzrost prędkości sięga nawet 40%!

  3. Powyższa reguła dotyczy także haszy, czyli nie:
    %$ref = funkcja_zwracajaca_hasz();

    tylko

    $ref = {funkcja_zwracajaca_hasz()};
  4. tutaj taki ogólny tips: po co duplikować kod, pisząc:
    $var1 = ($var2 eq 'aaa') ? 1 : 0;

    skoro można zapisać to w skrócie:

    $var1 = ($var2 eq 'aaa');

    ? Bardzo często spotykam się z takim bzdurnym zapisem jak ten pierwszy - pamiętaj że narzuca to dodatkowe wykonanie warunku…

  5. Uwielbiam w perlu prawostronne warunki/pętle. Po prostu strasznie upraszczają zapis, zwiększając przy tym czytelność (oczywiście wszystko jest łatwo nadużyć, ale to osobna kwestia). Przy pętlach brakowało mi strasznie możliwości iterowania z jakimś warunkiem, i wykonania jakiejś akcji gdy warunek jest spełniony. Jak zwykle niezastąpiony bochen znalazł i na to radę:
    ($_%2) and $_ foreach (1..6);

    Co prawda powyższy zapis łatwo zastąpić grepem, ale nie zawsze potrzebujemy otrzymać tablicę wartości, czasem trzeba tylko wykonać jakąś akcję :)

  6. Spotykałem się czasem z problemem przekazywania nazwy funkcji, jaką trzeba wykonać, w zmiennej. Nie zawsze można przekazać referencję do tej funkcji, a na pewno nie zawsze jest to najwygodniejsze co możemy użyć. No i oczywiście pomijam tutaj użycie evala. Metody na rozwiązanie tego problemu są dwie, przy czym preferuję drugą, gdyż nie ponosimy przy tym ryzyka wystąpienia jakichś błędów przy wyłączonym “strict refs”.
    sub test { print 'testujemy'; }
    my $t = 'test';
    • {
          no strict "refs";
          &{$test}();
      }
    • &{*fn = $test}();

    Należy jednak pamiętać że metoda “z globem” jest nawet do 30% wolniejsza od wersji z “no strict refs” (20% jeśli włączymy zaraz na początku wywoływanej w ten sposób funkcji “use strict refs”).

Jeśli macie jeszcze jakieś ciekawostki związane z perlem, to poproszę o linki/konkrety w komentarzach :)


Będzie wyjątkowo nietechnicznie ;) Ale chyba wiosna idzie. W sumie co się dziwić, już połowa lutego ;)

Wiosna - Krokusy1Wiosna - Krokusy3Wiosna - Krokusy5Wiosna - Krokusy6

UPDATE:

Wiosna5Wiosna4Wiosna3
Wiosna2Wiosna1


Jakiś czas temu, na forum 4programmers.net przewinął się temat skracania tekstu. Temat o tyle skomplikowany, że chodziło o skrócenie głównej treści artykułu, zostawiając w nim wszystkie znaczniki. Problemy tutaj są dwa (podstawowe):

  1. dbanie o nieucinanie znaczników, żeby każdy rozpoczęty był we właściwej kolejności zakończony
  2. skracanie tekstu tak, żeby długość widocznego tekstu nie była skracana o tekst znaczników

W przytoczonym wątku problemem są tagi BBCode, które mogą mieć różne formy:

[tag]treść[/tag]
[tag=coś]treść[/tag]
[tag]

Trzeba pamiętać (na co mi zwrócono uwagę w przytoczonym wątku), że w takim np. tagu [url] może być zawarty adres URL, który nie może zostać ucięty. Skrócony może zostać tylko i wyłącznie tekst zawarty między znacznikiem rozpoczynającym a kończącym.

Sposób, na jaki wpadłem, opierał się na rozbiciu tekstu na poszczególne części za pomoca preg_split, i późniejszej obróbki powstałej w ten sposób tablicy. Po ominięciu pewnych trudności z kombinacjami takimi jak:

[url][img=aa]coś coś[/img][/url]

skonstruowałem funkcję, której można użyć do tego celu.

Jeśli komuś mogłaby się ona przydać (a myślę że więcej osób może mieć tego typu problem), to zapraszam do skorzystania z gotowca :).

W przypadku, gdy ktoś nie korzysta z BBCode’u, można użyć do tego celu parsera XML (zakładam korzystanie z XHTML raczej, niż HTML). Dodałem podobną funkcjonalność do mojej klasy mParser, która docelowo służy do filtrowania w tekście pobranym od użytkownika niebezpiecznych danych.