Drupal 6 i najnowsza wersja jQuery
Od kilku już projektów w Drupalu spotykałem się z problemem przy wykorzystaniu najaktualniejszej wersji jQuery. Drupal w wersji 6 wykorzystuje jQuery w wersji 1.2.6. Instalacja modułu jquery_update trochę poprawia tą sytuację jednak nadal pozostajemy z wersją 1.3.2. W chwili pisania tego tekstu najnowszą wersją jQuery jest 1.7.1, więc jak widać sporo rzeczy mogło ulec zmianie. Korzystając z najnowszej wersji jQuery mamy w dodatku pewność, że znalezione błędy zostały poprawione (i ewentualnie, powstały nowe), kod został przepisany by działać szybciej, zwiększył się asortyment funkcji.
/*! jQuery v1.7.1 jquery.com | jquery.org/license */
// źródło najaktualniejszej wersji jQuery
$$ = jQuery.noConflict();
console.log('o1. ', $.fn.jquery);
// o1. 1.2.6
// LUB
// o1. 1.3.2
(function($) {
// W tej przestrzeni znajdzie się nasz kod
console.log('o2. ', $.fn.jquery);
// o2. 1.7.1
})($$);
Co się tutaj dzieje?
Poprzez funkcję jQuery.noConflict() obiektu jQuery utworzymy referencję $$, która będzie przechowywała nowy obiekt biblioteki jQuery (1.7.1 w tym wypadku). Zmienna $$ będzie dostępna w zasięgu globalnym (window), a my będziemy posiadać zmienne $$ (wersja 1.7.1) oraz $ (wersja 1.2.6/1.3.2).
Tworzymy następnie kolejny zasięg poprzez wywołanie kolejnej funkcji anonimowej, do której przekazujemy wcześniej utworzony obiekt jQuery 1.7.1. Drugie wywołanie funkcji anonimowej moglibyśmy pominąć i odwoływać się w naszym kodzie do jQuery wykorzystując zmienną $$, ale osobiście uważam to za mało wygodne.
Wolno działający panel admina Drupal 6
Od pewnego czasu katowałem się bardzo wolno działającym panelem administracyjnym Drupala w przeglądarce Firefox nawet przy czystej instalacji. Dzięki pomocy znajomego okazało się, że problemem jest ustawienie na podstronie konfiguracji odpowiedniej wartości dla zmiennej.
W Firefoxie w pasku adresu wpisujemy
about:config
Potwierdzamy, że zgadzamy się z warunkami.
Na otwartej podstronie wyszukujemy:
network.dns.disableIPv6
i zmieniamy ją na TRUE.
Dodatkowo, spotkałem się także z zaleceniami wykomentowania (znak #) linijki
::1 localhost
w pliku
c:\Windows\System32\drivers\etc\hosts
Panel administracyjny powinien znacznie przyspieszyć.
Błąd podczas testów – PHP Fatal error: Call to a member function toString() on a non-object in ./PEAR/PHPUnit/Extensions/SeleniumTestCase.php on line 1041
H:\htdocs\demo\protected\tests>phpunit functional/SiteTest.php
PHPUnit 3.6.3 by Sebastian Bergmann.
Configuration read from H:\htdocs\demo\protected\tests\phpunit.xml
.PHP Fatal error: Call to a member function toString() on a non-object in C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Extensions\SeleniumTestCase.php on line 1041
PHP Stack trace:
PHP 1. {main}() C:\wamp\bin\php\php5.3.4\phpunit:0
PHP 2. PHPUnit_TextUI_Command::main() C:\wamp\bin\php\php5.3.4\phpunit:44
PHP 3. PHPUnit_TextUI_Command->run() C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\TextUI\Command.php:125
PHP 4. PHPUnit_TextUI_TestRunner->doRun() C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\TextUI\Command.php:187
PHP 5. PHPUnit_Framework_TestSuite->run() C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\TextUI\TestRunner.php:325
PHP 6. PHPUnit_Framework_TestSuite->run() C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Framework\TestSuite.php:705
PHP 7. PHPUnit_Framework_TestSuite->runTest() C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Framework\TestSuite.php:745
PHP 8. PHPUnit_Extensions_SeleniumTestCase->run() C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Framework\TestSuite.php:772
PHP 9. PHPUnit_Framework_TestResult->run() C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Extensions\SeleniumTestCase.php:527
PHP 10. PHPUnit_Framework_TestCase->runBare() C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Framework\TestResult.php:649
PHP 11. PHPUnit_Extensions_SeleniumTestCase->onNotSuccessfulTest() C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Framework\TestCase.php:888
Fatal error: Call to a member function toString() on a non-object in C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Extensions\SeleniumTestCase.php on line 1041
Call Stack:
0.0009 633648 1. {main}() C:\wamp\bin\php\php5.3.4\phpunit:0
0.1198 1189176 2. PHPUnit_TextUI_Command::main() C:\wamp\bin\php\php5.3.4\phpunit:44
0.1199 1189760 3. PHPUnit_TextUI_Command->run() C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\TextUI\Command.php:125
1.2804 7611776 4. PHPUnit_TextUI_TestRunner->doRun() C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\TextUI\Command.php:187
1.3653 8098120 5. PHPUnit_Framework_TestSuite->run() C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\TextUI\TestRunner.php:325
1.3654 8098680 6. PHPUnit_Framework_TestSuite->run() C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Framework\TestSuite.php:705
12.7230 8521360 7. PHPUnit_Framework_TestSuite->runTest() C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Framework\TestSuite.php:745
12.7230 8521360 8. PHPUnit_Extensions_SeleniumTestCase->run() C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Framework\TestSuite.php:772
12.7230 8521408 9. PHPUnit_Framework_TestResult->run() C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Extensions\SeleniumTestCase.php:527
12.7230 8522416 10. PHPUnit_Framework_TestCase->runBare() C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Framework\TestResult.php:649
22.3495 8661592 11. PHPUnit_Extensions_SeleniumTestCase->onNotSuccessfulTest() C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Framework\TestCase.php:888
W pliku C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Extensions\SeleniumTestCase.php linijkę 1041 zmieniamy z:
$message = $e->getComparisonFailure()->toString();
na
$message = $e->getComparisonFailure()->exceptionToString;
Powinno zadziałać:
</pre> H:\htdocs\demo\protected\tests>phpunit functional/Sitetest.php PHPUnit 3.6.3 by Sebastian Bergmann. Configuration read from H:\htdocs\demo\protected\tests\phpunit.xml ..E Time: 37 seconds, Memory: 8.50Mb There was 1 error: 1) SiteTest::testLoginLogout Trying to get property of non-object C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Extensions\SeleniumTestCase.php:1042 C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Framework\TestCase.php:888 C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Framework\TestResult.php:649 C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Extensions\SeleniumTestCase.php:527 C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Framework\TestSuite.php:772 C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Framework\TestSuite.php:745 C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Framework\TestSuite.php:705 C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\TextUI\TestRunner.php:325 C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\TextUI\Command.php:187 C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\TextUI\Command.php:125 C:\wamp\bin\php\php5.3.4\phpunit:44 FAILURES! Tests: 3, Assertions: 6, Errors: 1.
Obsługa kodowania UTF-8 w edytorze gVim
Jednym z popularniejszych edytorów dla programistów jest gVim. Jednak sama jego instalacja nie wystarczy, by zapisywać pliki w kodowaniu UTF-8 bez znacznika BOM. Rozwiązanie zawdzięczam użytkownikowi devgreg ze strony devPytania.pl. Należy dodać poniższy kawałek kodu
if has("multi_byte")
if &termencoding == ""
let &termencoding = &encoding
endif
set encoding=utf-8
setglobal fileencoding=utf-8
"setglobal bomb
set fileencodings=ucs-bom,utf-8,latin1
endif
do pliku c:\Program Files (x86)\Vim\_vimrc.
Źródło: http://devpytania.pl/questions/6708/gvim-i-poprawna-obsuga-utf-8
Notepad++ i problem z literką ł
Natknąłem się na dziwną przypadłość Notepad++, której niestety nie udało się skonfigurować. Instalacja pluginu Zen Coding spowodowała brak możliwości wprowadzenia literki ł. Rozwiązaniem niestety okazało się usunięcie tego pluginu poprzez usunięcie z katalogu C:\Program Files (x86)\Notepad++\plugins NppScripting.dll i katalogu NppScripting. Nie zauważyłem jeszcze ubocznych efektów po usunięciu tego rozszerzenia.
Wysłanie maila do autorów poskutkowało poniższą odpowiedzią:
1. Otwórz plik %Notepad++%\plugins\NppScripting\includes\Zen Coding.js
a. Jeśli plik nie istnieje użyj %Notepad++%\plugins\NppScripting\start.js
2. Znajdź następujący tekst “addMenuItem(‘Klucz’, ‘wartość’, ‘Ctrl+Alt+L’);” // linijka 8003
3. Dokonaj odpowiednich zmian i zapisz
Zwracanie wartości z funkcji w postaci obiektu
PHP
class ErrorReporting { const INFO = 0; const WARNING = 1; const ERROR = 2; const SUCCESS = 4; private $_message = ''; private $_class = ''; private $_type; private $_value = null; /** * * @param ErrorReportingType $type * @param mixed $value * @param String $message */ public function __construct($type, $value, $message = '') { $this->_type = $type; $this->_value = $value; $this->_message = $message; switch($this->_type) { case ErrorReporting::ERROR: $this->_class = 'error'; break; case ErrorReporting::WARNING: $this->_class = 'warning'; break; case ErrorReporting::INFO: $this->_class = 'info'; break; case ErrorReporting::SUCCESS: $this->_class = 'success'; break; } } /** * * @param String $key * @return mixed */ public function __get($key) { switch($key) { case 'Message': return $this->_message; break; case 'Class': return $this->_class; break; case 'Type': return $this->_type; break; case 'Value': return $this->_value; break; } } /** * * @param String $key * @param mixed $value * @return mixed */ public function __set($key, $value) { switch($key) { case 'Message': return $this->_message = $value; break; case 'Class': return $this->_class = $value; break; case 'Type': return $this->_type = $value; break; case 'Value': return $this->_value = $value; break; } } public function __toString() { return '<div class="'.$this->_class.'">'.$this->_message.'</div>'; } }CSS
.success {background-image: url(../images/accept.png); background-color: #dff2bf; color:#4f8a10} .error, .error_message {background-image: url(../images/exclamation.png); background-color: #ffbaba; color:#d8000c} .info {background-image: url(../images/information.png); background-color:#bde5f8; color:#00529b} .warning {background-image: url(../images/error.png); background-color:#feefb3; color:#9f6000} .info, .success, .warning, .error, .validation, .error_message {border: 1px solid; margin: 10px auto; padding: 4px 10px 4px 35px; background-repeat: no-repeat; background-position: 10px 6px} .success ul, .error ul, .warning ul, .info ul {list-style: disc} .success li, .error li, .warning li, .info li {margin-left: 20px}Ikonki, których użycie warto rozważyć to np.: famfamfam.com lub Knob icon set.
Cała paczka gotowa do pobrania: ErrorReporting
Python i błąd R6034: An application has made an attempt to load the C runtime library incorrectly
Od kilku dni próba uruchomienia jakiegokolwiek modułu Pythona pobranego z sieci kończyła się poniższym komunikatem:
R6034 An application has made an attempt to load the C runtime library incorrectly. Please contact the application's support team for more information.
Ciężko cokolwiek konkretnego na ten temat znaleźć w sieci, jednak warto spróbować poniższego rozwiązania. Trudno określić, co może być konkretną przyczyną takiego stanu rzeczy – problem pojawiał się praktycznie w każdym module – dlatego przedstawię wszystko co zrobiłem w kierunku poprawienia tego dziwnego zachowania.
- Usunięcie ze zmiennej systemowej PATH wszystkich nawiązań do innych wersji Pythona
- Instalacja MinGW oraz dodanie ścieżki do zmiennej systemowej PATH
- Dodanie zmiennej PYTHONPATH do zmiennych użytkownika
- Dodanie ścieżki do Pythona do zmiennej systemowej PATH
Opis dotyczy Windows 7 oraz Pythona w wersji 2.7.2 dla systemów 32 bitowych – istniał częsty problem z dostępnością modułów 64 bitowych.
1. Usunięcie ze zmiennej systemowej PATH wszystkich nawiązań do innych wersji Pythona
Na początku proponuję wyrzucić ze zmiennej PATH wszystkie odwołania do innych wersji Pythona. Może to być cokolwiek, np.: Panda3D czy Blender – dostarczany jest z nimi ich Python, co może powodować konflikty. Tymczasowo wszystkie odwołania wyrzucamy, w razie potrzeby jeśli wszystko przejdzie pomyślnie, będziemy mogli przywrócić dodatkowe wpisy w zmiennej PATH. Modyfikację zmiennych systemowych dokonać możemy w poniższy sposób:
Wciskamy jednocześnie WIN+Pause/Break aby otworzyć informacje o Systemie Windows. W otwartym oknie wybieramy “Zaawansowane ustawienia systemu”, zakładka “Zaawansowane” i przycisk “Zmienne środowiskowe”.
2. Instalacja MinGW oraz dodanie ścieżki do zmiennej systemowej PATH.
Ze strony SourceForge.net pobieramy mingw-get-inst.exe który zatroszczy się o pobranie odpowiednich komponentów i całą instalację. Zakładam, że zostanie zainstalowany w C:\MinGW. Do zmiennej systemowej PATH dodajemy na samym początku ścieżkę do instalacji MinGW (C:\MinGW\bin).
3. Dodanie zmiennej PYTHONPATH do zmiennych systemowych.
Okno edycji zmiennych wywołujemy jak w punkcie 1. W otwartym oknie w sekcji “Zmienne użytkownika dla [nazwa użytkownika]” jeśli nie istnieje, dodajemy nową zmienną PYTHONPATH i nadajemy jej wartość w postaci ścieżki instalacji Pythona – dla mnie jest to C:\Python27\.
4. Dodanie ścieżki do Pythona do zmiennej systemowej PATH.
Wszystko wykonujemy jak powyżej, jednak tym razem modyfikacja dotyczy zmiennej PATH/Path w sekcji “Zmienne systemowe”. Dodajemy ścieżkę do naszej instalacji Pythona do tej zmiennej – najlepiej zaraz za ścieżką do MinGW.
Proszę o informację, czy pomogło w Waszym przypadku.
Arduino Uno – kolejny kawałek krzemu w domu
Nie wiem czemu, ale od zawsze czułem pociąg do wszelkiej maści krzemowych wynalazków, płytek, układów scalonych. Niewiele z tego rozumiałem – i nic się w tej materii nie zmieniło – ale pociąg pozostał. Krążąc swego czasu po sieci natknąłem się na płytkę Arduino, jej prostoście oraz możliwości jej programowania w języku C-podobnym. Szczególnie urzekła mnie ta prostota, która oferuje łagodne wprowadzenie w świat elektroniki. W związku z wieloma nieudanymi próbami poznania chociaż minimalnie środowiska sprzętowego postanowiłem spróbować raz jeszcze. Im więcej czytałem nt. Arduino tym bardziej chciałem to posiadać (to chyba coś jak z kobiecymi butami i torebkami). Wreszcie zamówiłem Starter Kit. Po sumiennej instalacji wszystkich sterowników i pobraniu Arduino IDE oraz przejściu na spokojnie przez wszystkie kroki, samą płytkę udało mi się uruchomić i odpalić na niej prosty programik, który migał diodką dołączoną czerwoną diodką. Oprócz tego nie udały się wszystkie próby złożenia czegoś PROSTEGO na płytce prototypowej: poparzyłem się baterią 9V, która też poraziła mnie prądem (słabo, ale dało się odczuć) oraz uszkodziłem wcześniej wspomnianą czerwoną diodę LED.
Płytka znajduje się w niewielkim pudełeczku, jak poniżej (z niewielkim gratisem):

A sama płytka wygląda tak:

Wracam do nauki podstaw elektroniki.
Strona projektu: arduino.cc
Dystrybutor w Polsce: nettigo.pl
Kilka ciekawych projektów opartych o Arduino: Top 40 projektów
Dodawanie obiektu SimpleXmlElement jako dziecka do innego obiektu SimpleXmlElement
Podczas budowania struktury XML z wykorzystaniem SimpleXmlElement dla jachcenawakacje.pl natknąłem się na problem dodawania do obiektu typu SimpleXmlElement jako dziecka innego obiektu SimpleXmlElement – wyciętego z innej struktury XML. Problem jest o tyle dziwny, że metoda SimpleXmlElement::addChild() przyjmuje jako wartość tylko i wyłącznie łańcuch znaków. W związku z dość sporą ilością kodu, jaki trzeba by napisać, aby przenieść jedną strukturę XML do innej takie rozwiązanie nie wchodziło w grę. Z pomocą przyszedł kod udostępniony przez członka społeczności Stackoverflow.
<?php
$xml = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><element></element>');
$request = $xml->addChild('request');
$request->addChild('type', 'test');
$sxe = simplexml_load_string('<sxe></sxe>');
$inner1 = $sxe->addChild("inner1");
$inner2 = $inner1->addChild("inner2");
$inner3 = $inner2->addChild("inner3");
$toDom = dom_import_simplexml($xml);
$fromDom = dom_import_simplexml($sxe);
$toDom->appendChild($toDom->ownerDocument->importNode($fromDom, true));
header('Content-type: application/xml; charset=utf-8');
echo $xml->asXML();
Oczywiście najważniejsze są tutaj linie 9-11, które to realizują całe zadanie kopiowania struktury pomiędzy XML.
Efekt poniżej:
<?xml version="1.0" encoding="UTF-8"?>
<element>
<request>
<type>test</type>
</request>
<sxe>
<inner1>
<inner2>
<inner3/>
</inner2>
</inner1>
</sxe>
</element>
Link do oryginału: http://stackoverflow.com/questions/4778865/php-simplexml-addchild-with-another-simplexmlelement/4778964#4778964

