Jon-G blogs for Net-Entwicklung.de

03.10.2009

IE Testing

Einsortiert unter: Coding — Schlagworte: , — Jonathan Gilbert @ 18:15

Testing web applications with Internet Explorer was always a daunting task. Back in the days of IE3, IE4, IE5 and IE5.5 for Mac it was quite normal to have different PCs running different versions because IE never really had a viable option for installing different versions parallel. There was a trick on upgrading from IE4 to 5 which allowed this in theory but each version still tended to work a little different to standalone installations.

Nowadays things are easier – it is quite easy have different configurations running in virtual machines. There are however some other tools kicking around which also (supposedly?) make things easier. Here a a few links I´ve collected (but not necessarily tried):
http://en.gibney.org/crossbrowser_testing/
http://www.my-debugbar.com/wiki/IETester/HomePage “IETester is a free WebBrowser that allows you to have the rendering and javascript engines of IE8, IE7 IE 6 and IE5.5 on Windows 7, Vista and XP, as well as the installed IE in the same process.”

http://www.microsoft.com/downloads/details.aspx?FamilyId=21EABB90-958F-4B64- B5F1-73D0A413C8EF&displaylang=en#filelist VirtualPC direct from Microsoft

15.07.2009

Interesting reads (PHP & more) and tools (Twitter & more)

Einsortiert unter: Coding, Databases, Tools — Jonathan Gilbert @ 17:38

More on PHP Performance
http://php100.wordpress.com/2009/07/13/php-performance/

Benchmarking PHP
http://blueprint.intereactive.net/benchmarking-our-php/

PHP Abstract Podcast Episode 42: Keith Casey & Web2Project
http://devzone.zend.com/article/4831-PHP-Abstract-Podcast-Episode-42-Keith-Casey-Web2Project

3 Part Series on namespaces in PHP 5.3
http://www.sitepoint.com/blogs/2009/07/13/php-53-namespaces-basics/
http://www.sitepoint.com/blogs/2009/07/14/php-namespaces-import-alias-resolution/
http://www.sitepoint.com/blogs/2009/07/15/how-to-use-php-namespaces-part-3-keywords-and-autoloading/

50 useful PHP Tools
http://www.smashingmagazine.com/2009/01/20/50-extremely-useful-php-tools/

List of “White Label” or “Private Label” (Applications you can Rebrand) Social Networking Platforms, Community Platforms
http://www.web-strategist.com/blog/2007/02/12/list-of-white-label-social-networking-platforms/

Freitags Open House für Freiberufler, Ideen und Projekte
http://hallenprojekt.de/mindmatters

The “AddToAny”-widgets
http://www.addtoany.com/

Twitter Tool for Team Tweeting
http://www.tweetfunnel.com/

Twitter toolbox
http://hootsuite.com/

Widgets galore
http://www.widgetbox.com/

Command line access to the web
http://yubnub.org/

Online wordprocessor
http://writer.zoho.com/

“Test everything” – nice idea to generate links to various services
http://tester.jonasjohn.de/

UIzard – in-browser web appication development tool – want to look more closely at this
http://www.uizard.org/

26.06.2009

Check / Uncheck all checkboxes

Einsortiert unter: Coding — Schlagworte: — Jonathan Gilbert @ 20:35

It’s a common problem: you have a list of elements on a page and you want yout user to be able to do something to several or all elements at once (delete, move, etc.) so you give each element a checkbox and a “delete selected” button (or similar :~). Everything is cool but then you figure it would be nice to have a “select all” resp. “unselect all” box too, so help avoid “click orgies”. So in the page you generate something like this:

<input type=’checkbox’ id=’sel1′ value=’xxx’ name=’sel[]‘ /> xxx
<input type=’checkbox’ id=’sel2′ value=’yyy’ name=’sel[]‘ /> yyy
<input type=’checkbox’ id=’sel3′ value=’zzz’ name=’sel[]‘ />  zzz
<input type=’checkbox’ id=’selAll’ value=” name=’selAll’ onClick=’selectAll(this.checked, \”sel[]\”)’ /> (un)select all

There are several ways of doing this, but I like my solution, just because its mine its short and effective:

function selectAll(state, name) {
..boxes = document.getElementsByName(name);
..boxCnt = boxes.length;
..for (i=0; i<boxCnt; i++) {
....boxes[i].checked = state;
..}
}

That’s it!

24.06.2009

Multiple Inserts in Oracle (example using PHP)

Einsortiert unter: Coding, Databases — Schlagworte: , , — Jonathan Gilbert @ 00:17

Everybody knows how to make multiple inserts into MySQL:

INSERT INTO [table_name] ([col_1], [col_2])
  VALUES
    ([val_1_1], [val_1_2]),
    ([val_2_1], [val_2_2]),
    ([val_3_1], [val_3_2])

That´s easy! But multiple inserts to an Oracle DB don´t work like that… here are two ways of doing the same job with Oracle:

insert all
  into [table_name] ([col1], [col2]) values ([val1_1], [val1_2])
  into [table_name] ([col1], [col2]) values ([val2_1], [val2_2])
  into [table_name] ([col1], [col2]) values ([val3_1], [val3_2])
  select 1 from dual

or alternatively

insert into [table_name] ([col1], [col2])
  select [val1_1], [val1_2] from dual
  union all
    select [val2_1], [val2_2] from dual
  union all
    select [val3_1], [val3_2] from dual

This is useful if you need to insert a lot of rows into a table – which usually occurs in a job like data import from other sources rather than as a result of user interaction. Running a PHP script for example to insert 50.000 rows into a table would fire 50.000 inserts if you don´t use multiple inserts. This is slow and can also cause you to run into memory problems.

Here is a simple example of how to do this in PHP:

class MyImportTest extends MyDatabaseModel
{
 protected static $_parallelImports = 50;
 protected static $_insertCache = array();

 public static function insertImportDataIntoDb($inputData)
 {
  $added = 0;
  foreach ($inputdata as $inputArray) {
    $added += self::_addCaseToInsertCache($inputArray['col1'], $inputArray['col2']);
    if ($added % self::$_parallelInserts == 0) {
      self::_flushInsertCache();
    }
  }
	if ($added % self::$_parallelInserts != 0) {
    self::_flushInsertCache();
  }
 }

 function addCaseToInsertCache($col1, $col2)
 {
  // maybe do validity checks here and return 0 if an element is not added
  self::$_insertCache[] = array($col1, $col2);
  return 1;
 }

 function flushInsertCache()
 {
  $db = self::getDb();
  $sql = 'INSERT INTO "TABLE_NAME" ("COL1", "COL2")';
  $values = '';
  foreach (self::$_insertCache as $insert) {
            $values .= (empty($values)) ? '' : ' UNION ALL ';
            $values .= 'SELECT ' .
                $insert[0] . ', ' .
                $insert[1] . ', ' .
                $insert[5] . ' FROM DUAL';
        } // if using string values, then don't forget to use quotes!
        $db->query($sql . $values);
        self::$_insertCache = array();
    }
 }
}

16.06.2009

HowTo: Check if a username exists in LDAP (without authenticating user)

Einsortiert unter: Coding — Jonathan Gilbert @ 21:40


/**
* check if user exists in LDAP
* @param string $username username
* @return bool
*/
public static function isUser($username)
{
  $auth = Zend_Auth::getInstance();
  $config = Zend_Registry::get('ldap');
  $options = $config->toArray();

  $password = 'x';

  $adapter = new Zend_Auth_Adapter_Ldap($options, $username, $password);

  // because we have given an invalid password, this will always return error messages
  $result = $auth->authenticate($adapter);
  // here is a sample error message from which we deduce that "data 525" means that a user does not exist
  // "0x31: Invalid credentials: 80090308: LdapErr: DSID-0C090334, comment: AcceptSecurityContext error, data 525, vece: ..."
  // this seems to be confirmed by the following error codes for MS AD found on http://www-01.ibm.com/support/docview.wss?uid=swg21290631
  // 525 user not found
  // 52e invalid credentials
  // 530 not permitted to logon at this time
  // 531 not permitted to logon at this workstation
  // 532 password expired
  // 533 account disabled
  // 701 account expired
  // 773 user must reset password
  // 775 user account locked
  $messages = $result->getMessages();
  if ((false !== strpos($messages[1], 'data 525')) ||
    (false !== strpos($messages[1], 'data 533')) ||
    (false !== strpos($messages[1], 'data 701'))) {
    return false;
  }
  return true;
}

08.06.2009

XSS – Infos and Tools

Einsortiert unter: Coding — Schlagworte: , — Jonathan Gilbert @ 00:31

Hier nur kurz ein paar Links

http://www.thespanner.co.uk/2009/03/25/xss-rays/

XSS Tool in Python: http://wapiti.sourceforge.net/

Security Infos: http://ha.ckers.org und http://www.milw0rm.com

Captchas für den guten Zweck

Einsortiert unter: Coding — Schlagworte: — Jonathan Gilbert @ 00:23

outlookWir alle kennen Captchas – es gibt gute und nicht so gute ;-) Knacken lassen sich beinahe alle – ist alles nur eine Frage des Aufwandes, was sich in den wenigstens Fällen aber “lohnen” dürfte. Es fragt sich also, wieviel Aufwand man in die Erstellung stecken will… Wie ich mal für den Jungheinrich Profishop gemacht habe, kann ein Captcha optisch zur Website und Branding passen (s. Beispiel rechts).

Aber im Normalfall sind es einfach ein paar mehr oder weniger lesbare Buchstaben ohne besondere optische Wirkung. Für solche Fälle bietet sich reCaptcha an (http://recaptcha.net/) – Captchas werden zur digitalisierung von Büchern verwendet – ein sehr interessanter Ansatz und letztendlich sage ich, warum nicht?

28.05.2009

Coding Practices

Einsortiert unter: Coding — Schlagworte: — Jonathan Gilbert @ 17:33

Habe gerade Ned Batchelder’s Blog entdeckt – ich sage nur Respekt, dass er diese Themen schriftlich aufbereitet hat:

Deleting Code
Fix error handling first
Erroneously empty code paths

– FULL ACK von mir

Mehr von Ned gibt’s hier.

21.05.2009

Das Model im Zend Framework

Einsortiert unter: Coding — Schlagworte: , — Jonathan Gilbert @ 21:01

Holger Librenz hat ein netter Artikelzum Thema geschrieben. Den Ansatz, eine eigene Action-Klasse vom Zend_Controller_Action abzuleiten kann ich nur unterstützen. Aber ich halte nichts von der Idee, das Model per Reflection zu ermitteln und instanziieren – Refelection ist nicht performant und demnach für eine Produktionsumgebung nicht geeignet. Die Prüfung, ob die Klasse existiert ist m.E. auch überflüssig und kostet unnötig Performance – wer eine Anwendung baut hat dafür zu sorgen, dass die Klassen vorhanden sind. Ich finde, es gibt nur wenige Fälle, wo eine solche Prüfung stattfinden muss (z.B. in verteilten Systemen).

Im Übrigen vertrete ich auch der Meinung, dass Objekte nicht instanziiert werden müssen – Modelle mit statischen Methoden sind nach Möglichkeit zu bevorzugen – aber das ist ein anderes Thema.

Performance Optimierung (Frontend)

Einsortiert unter: Coding — Schlagworte: , , — Jonathan Gilbert @ 20:22

Yahoo bietet wertvolle Tipps:
Best Practices for Speeding Up Your Web Site

Und hier ein Artikel bzw. Vortrag, den ich schon auf Grund des Titels erwähnen muss:
YUI Theater — Nicole Sullivan: “Design Fast Websites (Don’t Blame the Rounded Corners)”

Ältere Artikel »

Theme: Silver is the New Black. Bloggen Sie auf WordPress.com.

Follow

Bekomme jeden neuen Artikel in deinen Posteingang.