SCEditor – A WYSIWYG HTML & BBCode editor

SCEditor is a lightweight jQuery based WYSIWYG HTML and BBCode editor.

The aim of SCEditor is to be lightweight while still having all the features that would ever be wanted and being a good BBCode WYSIWYG editor. A demo is available here.

Features

  • Bold, underline, italic, superscript and subscript
  • Left, center, right and justify text
  • Text size, color and font
  • As You Type emoticonĀ conversion
  • Tables
  • Lists
  • Code and quote tags
  • Images and links
  • I18n support

Continue reading

CloudFlare review

CloudFlare is free service which claims to enhance the security of a website and boost performance at the same time.

I’ve been using it for a few months on another website as well as using it on this one. This is what I think of it so far.

Setup

The setup process is very simple and guides you through it all the way. The hardest thing you will need to do is change nameservers on the domain you plan to use CloudFlare on. The rest is simple and with the great control panel, very easy to do!

Performance

CouldFlare can act as a CDN for your site which offers a great boost in performance for you website and not only that, it can also minify your sites HTML, CSS & JS giving even better performance!

I did, however, have one problem with the performance of CloudFlare. The problem was when I used Pingdom and similar tools to check the websites speed, although most resources would load VERY fast, one or two resources would take ages and cause the overall load time to go up by 6-7 seconds, making the load time slower with CloudFlare!
Continue reading

Akismet CodeIgniter Library

Very simple PHP library for CodeIgniter which lets you use Akismet to check messages for spam.

Example code:

<?php
$this->load->library('Akismet');
if($this->akismet->is_key_valid(array('key' => 'API-KEY-HERE')))
	$this->akismet->set_key('API-KEY-HERE');
// the comment to check, see is_spam for full list
$comment = array(
		'comment_author'       => 'Auther',
		'comment_author_email' => 'nobody@example.com',
		'comment_author_url'   => 'http://www.example.com/',
		'comment_content'      => 'This is an example comment.'
	);
// check the comment
if($this->akismet->is_spam($comment))
	echo 'The comment is spam.';
// mark it as spam
$this->akismet->mark_spam($comment);
// mark it as ham
$this->akismet->mark_ham($comment);
?>

Continue reading

PHP IPv6 to 128bit int

Two functions to convert IPv6 & IPv4 addresses into 128bit ints and back again. They will use BCMath if installed otherwise will use the pure PHP Math_BigInteger class (included in the ZIP).

/**
 * Converts human readable representation to a 128bit int
 * which can be stored in MySQL using DECIMAL(39,0).
 *
 * Requires PHP to be compiled with IPv6 support.
 * This could be made to work without IPv6 support but
 * I don't think there would be much use for it if PHP
 * doesn't support IPv6.
 *
 * @param string $ip IPv4 or IPv6 address to convert
 * @return string 128bit string that can be used with DECIMNAL(39,0) or false
 */
if(!function_exists('inet_ptoi'))
{
	function inet_ptoi($ip)
	{
		// make sure it is an ip
		if (filter_var($ip, FILTER_VALIDATE_IP) === false)
			return false;
		$parts = unpack('N*', inet_pton($ip));
		// fix IPv4
		if (strpos($ip, '.') !== false)
			$parts = array(1=>0, 2=>0, 3=>0, 4=>$parts[1]);
		foreach ($parts as &$part)
		{
			// convert any unsigned ints to signed from unpack.
			// this should be OK as it will be a PHP float not an int
			if ($part < 0)
				$part += 4294967296;
		}
		// use BCMath if the extension exists
		if (function_exists('bcadd'))
		{
			$decimal = $parts[4];
			$decimal = bcadd($decimal, bcmul($parts[3], '4294967296'));
			$decimal = bcadd($decimal, bcmul($parts[2], '18446744073709551616'));
			$decimal = bcadd($decimal, bcmul($parts[1], '79228162514264337593543950336'));
		}
		// otherwise use the pure PHP BigInteger
		else
		{
			$decimal = new Math_BigInteger($parts[4]);
			$part3   = new Math_BigInteger($parts[3]);
			$part2   = new Math_BigInteger($parts[2]);
			$part1   = new Math_BigInteger($parts[1]);
			$decimal = $decimal->add($part3->multiply(new Math_BigInteger('4294967296')));
			$decimal = $decimal->add($part2->multiply(new Math_BigInteger('18446744073709551616')));
			$decimal = $decimal->add($part1->multiply(new Math_BigInteger('79228162514264337593543950336')));
			$decimal = $decimal->toString();
		}
		return $decimal;
	}
}
/**
 * Converts a 128bit int to a human readable representation.
 *
 * Requires PHP to be compiled with IPv6 support.
 * This could be made to work without IPv6 support but
 * I don't think there would be much use for it if PHP
 * doesn't support IPv6.
 *
 * @param string $decimal 128bit int
 * @return string IPv4 or IPv6
 */
if(!function_exists('inet_ptoi'))
{
	function inet_itop($decimal)
	{
		$parts = array();
		// use BCMath if the extension exists
		if (function_exists('bcadd'))
		{
			$parts[1] = bcdiv($decimal, '79228162514264337593543950336', 0);
			$decimal  = bcsub($decimal, bcmul($parts[1], '79228162514264337593543950336'));
			$parts[2] = bcdiv($decimal, '18446744073709551616', 0);
			$decimal  = bcsub($decimal, bcmul($parts[2], '18446744073709551616'));
			$parts[3] = bcdiv($decimal, '4294967296', 0);
			$decimal  = bcsub($decimal, bcmul($parts[3], '4294967296'));
			$parts[4] = $decimal;
		}
		// otherwise use the pure PHP BigInteger
		else
		{
			$decimal = new Math_BigInteger($decimal);
			list($parts[1],) = $decimal->divide(new Math_BigInteger('79228162514264337593543950336'));
			$decimal = $decimal->subtract($parts[1]->multiply(new Math_BigInteger('79228162514264337593543950336')));
			list($parts[2],) = $decimal->divide(new Math_BigInteger('18446744073709551616'));
			$decimal = $decimal->subtract($parts[2]->multiply(new Math_BigInteger('18446744073709551616')));
			list($parts[3],) = $decimal->divide(new Math_BigInteger('4294967296'));
			$decimal = $decimal->subtract($parts[3]->multiply(new Math_BigInteger('4294967296')));
			$parts[4] = $decimal;
			$parts[1] = $parts[1]->toString();
			$parts[2] = $parts[2]->toString();
			$parts[3] = $parts[3]->toString();
			$parts[4] = $parts[4]->toString();
		}
		foreach ($parts as &$part)
		{
			// convert any signed ints to unsigned for pack
			// this should be fine as it will be treated as a float
			if ($part > 2147483647)
				$part -= 4294967296;
		}
		$ip = inet_ntop(pack('N4', $parts[1], $parts[2], $parts[3], $parts[4]));
		// fix IPv4 by removing :: from the beginning
		if (strpos($ip, '.') !== false)
			return substr($ip, 2);
		return $ip;
	}
}

Continue reading