Архив за Июль 2008

Соображения Билла Гейтса о жизненных реалиях

Билла Гейтса можно боготворить или ненавидеть, но сложно отрицать, что он неординарный и ясно мыслящий человек. Поэтому для всех, у кого есть дети любого возраста, или кто сам еще в чем-то ребенок, полезно будет узнать соображения мистера Гейтса о жизненных реалиях. Он изложил свои мысли в одной из школ, куда его пригласили выступить с речью.

11 вещей, которым тебя забыли научить в школе

  1. Жизнь несправедлива - свыкнись с этим фактом.
  2. Миру наплевать на твое самоощущение и самоуважение. Мир ожидает от тебя каких-нибудь достижений перед тем как принять во внимание твое чувство собственного достоинства.
  3. Очень маловероятно что тебе начнуть платить 40 тысяч в год сразу после окончания школы. Ты не станешь вице-президентом компании, с лимузином и личным шофером, пока ты не заслужишь этого.
  4. Если ты думаешь, что твой учитель строг и требователен - подожди знакомства со своим боссом. В отличие от учителя, карьера босса зависит от того как ты справляешься со своими заданиями.
  5. Обжаривать бургеры в Макдональдсе - не ниже твоего достоинства. Твои прадеды назвали бы любую - даже такую - работу хорошим шансом.
  6. Не спеши обвинять в каждой своей неудаче своих родителей. Не ной и не носись со своими неудачами, учись на них.
  7. До твоего рождения твои родители не были такими скучными и неинтересными людьми, какими они кажутся тебе сейчас. Они стали такими, зарабатывая на твое беззаботное детство, стирая твою одежду и слушая твою бесконечную болтовню о том какой ты классный. Поэтому перед тем как отправляться спасать леса Амазонки от уничтожения жадным поколением твоих родителей, попытайся для начала привести в порядок свою комнату.
  8. Твоя школа отменила деление на победителей и лузеров, жизнь - нет. В некоторых школах прекратили ставить плохие отметки, разрешили сколько угодно попыток сдать тест или ответить на вопрос… Это не имеет ни малейшего подобия ни к чему происходящему в жизни.
  9. Жизнь не разделена на семестры, летних каникул в ней не существует, и очень мало работодателей заинтересованы в помощи тебе найти твое собственное “я”. Тебе придется делать это в твое личное время.
  10. Не путай реальную жизнь с тем, что показывают по телевидению. В жизни людям приходится большую часть времени проводить не в кофейне, а на рабочем месте.
  11. Поддерживай хорошие отношения с очкариками-ботаниками. Скорее всего, один из них когда-то станет твоим начальником.

Источник: http://americaru.com/

Транзакции в MySQL

Очень часто изменения базы данных требуют выполнения нескольких запросов. Так, при покупке товара в электронном магазине требуется добавить запись в таблицу orders (заказы) и уменьшить число товарных позиций на складе (таблица products). В промышленных базах данных одно событие может затрагивать гораздо большее число таблиц и требовать выполнения многочисленных запросов.

Если при выполнении одного из запросов происходит сбой, это может нарушить целостность базы данных. Например, товар может быть продан, а число товарных позиций на складе не обновлено; деньги могут быть сняты с одного счета, но не перечислены на другой и т.п. Чтобы сохранить целостность базы данных, все изменения должны выполняться как единое целое - либо все изменения успешно выполняются, либо, в случае сбоя хотя бы одного из запросов, база данных принимает состояние, которое было до начала изменений.

Транзакция - это последовательность операторов SQL, выполняющихся как единая операция, которая не прерывается другими клиентами. То есть, пока происходит работа с записями таблицы (их обновление или удаление), никто другой не может получить доступ к этим записям.

Таблицы ISAM, MyISAM и HEAP не поддерживают транзакции. В настоящий момент их поддержка осуществляется только в таблицах BDB и InnoDB.

Транзакции позволяют объединять операторы в группу и гарантировать, что все операции внутри группы будут выполнены успешно. Если часть транзакции выполняется со сбоем, результаты выполнения всех операторов транзакции до места сбоя отменяются, приводя базу данных к виду, в котором она была до выполнения транзакции.

Следует обратить внимание, что транзакции имеют смысл только в случае с типами таблиц, которые их поддерживают: InnoDB и BDB. Если существующие таблицы имеют другой тип, например, MyISAM, для работы с транзакциями его следует изменить:

ALTER TABLE orders ENGINE = INNODB;
ALTER TABLE products ENGINE = INNODB;

Следует внимательно следить, чтобы при изменении типа MyISAM на любой другой в таблице отсутствовали FULLTEXT-индексы, т.к. никакой другой тип таблиц их не поддерживает.

По умолчанию MySQL работает в режиме автоматического завершения транцакций, т.е. как только выполняется оператор обновления данных, который модифицирует таблицу, MySQL тут же сохраняет изменения на диске. Для объединения в транзакцию нескольких операторов необходимо отключить этот режим. Это можно осуществить при помощи системной переменной AUTOCOMMIT:

SET AUTOCOMMIT=0;

После отключения режима автоматического завершения транзакций следует использовать оператор COMMIT, чтобы сохранить изменения на диске, либо оператор ROLLBACK, чтобы отменить изменения, выполненные с момента начала транзакции. Для того, чтобы включить обратно режим автоматического завершения транзакций, необходимо выполнить оператор

SET AUTOCOMMIT=1;

Для того, чтобы включить режим автоматического завершения транзакций только для отдельной последовательности операторов, можно воспользоваться оператором START TRANSACTION

START TRANSACTION;
SELECT @total := count FROM products WHERE id_prd = 17;
UPDATE products SET count = @total - 1 WHERE id_prd = 17;
COMMIT;

После выполнения оператора START TRANSACTION режим автоматического завершения транзакций остается включеным до явного завершения транзакции с помощью оператора COMMIT или отката транзакции посредством ROLLBACK.

Оператор START TRANSACTION появился в MySQL начиная с версии 4.0.11 и имеет два синонима: BEGIN и BEGIN WORK, появившихся еще в версии 3.23. Однако рекомендуется использовать именно START TRANSACTION.

Создание водяных знаков с помощью GDLib

Одной из интересных вещей, которые вы можете сделать с помощью библиотеки работы с графикой в PHP GD, может быть функция, который ставит водяные знаки (watermarks) на изображение. Если говорить вкратце, то watermark - это технология для защиты цифровых изображений от несанкционированного использования путем нанесения на них водяных знаков или подписей.

Для начала создадим в Photoshop картинку (надпись), которую будем использовать как водяной знак для нанесения на изображение и сохраним его как PNG-8 (File->Save for Web->PNG-8):

А теперь - сама функция добавления водяного знака:

<?php
$image = imagecreatefromjpeg('image.jpg');
$watermark = imagecreatefrompng('watermark.png');
$image_watermark = create_watermark($image, $watermark, 'right', 30);
header('Content-Type: image/jpeg');
imagejpeg($image_watermark);
 
function create_watermark( $image, $watermark, $position = 'right', $alpha_level = 100 ) 
{ 
  // ширина и высота водяного знака
  $width = imagesx($watermark)
  $height = imagesy($watermark)
  if ( $position == 'right' ) { // водяной знак будет внизу справа
    $dest_x = imagesx($image) - $width - 5
    $dest_y = imagesy($image) - $height - 5;
  } else { // водяной знак будет по центру
    $dest_x = intval(imagesx($image)*0.5) - intval($width*0.5)
    $dest_y = intval(imagesy($image)*0.5) - intval($height*0.5);     
  }
  imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, $width, $height, $alpha_level);     
  return $image
} 
?>

Здесь:

  • $alpha_level - прозрачность: 0 - прозрачное, 100 - полностью непрозрачное
  • $position - позиция водяного знака: ‘right’ - внизу справа, ‘center’ - по центру