Как-то давно проскальзывал линк на один технический материал по PHP, расположенный на сайте IBM. Еще тогда удивила полезность информации с данного ресурса. Про статью я забыл, но пару дней назад понадобился один специализированный софт, который есть у голубого гиганта. Пришлось там создавать аккаунт, и я ни разу не пожалел, что сделал это. Read On…
Все уже придумали до нас
Вот решил подтянуть свои фундаментальные знания, обучаюсь в Интуите. Это не пиар ресурса, это действительно полезный сайт, причем еще и бесплатный. Можно и за деньги учится при желании, это кому как больше нравится.
В данный момент прохожу один курс, так вот там встретил некое выражение:
Уменьшив сложность системы, часто можно увеличить ее информативность, исследуемость.
Сам курс больше в сторону бизнес-систем на основах высшей математики клонит, но как же блин точно подмечено! Еще бы я вышку в универе не прогуливал, а то сложновато приходится с формулами.
Про простоту еще у кого-то уже читал, вроде у Тормоза, там приводили цитату одного летчика
Совершенство достигнуто не тогда, когда нечего добавить, а тогда, когда нечего отнять
Такшта, Keep It Simple, Stupid 🙂
Примеры использования strace для отладки скриптов
Strace — это встроенный перехватчик системных вызовов и сигналов в линуксе. Основная его цель — это перехват информации относительно какого-то процесса. Крайне незаменимая штука при отладке скриптов, особенно закодированных.
Пример использования — есть один сервис, который я написал, и обьявилась там проблема — каким-то неведомым образом права на файл, куда пишется лог, начали выставляться криво. А именно: вместо положенных rw — rw — rw стали w — wx — wT. Проблема тут в том, что надо указывать права при смене не как:
chmod('file.txt', '0666'); или
chmod('file.txt', 666);
в этом случае 0666 будет string, а вот так:
chmod('file.txt', intval('666', 8));
Так они уже будут в корректной форме.
Вернемся к проблеме. Нужно было найти, кто ставит на файл неверные права. Вот так можно отловить все вызовы определенного файла:
strace php ./script.php 2>&1 | grep file.txt
Ответ будет вида:
open("/path/to/file.txt", O_RDWR|O_CREAT|O_APPEND|O_LARGEFILE, 0666) = 4
chmod("/path/to/file.txt", 0666) = 0
Вот так можно отмониторить все обращения к файлу
Read On…
Что делать, если сбил все права?
Выставил я тут на рабочем сервере права на всю папку, в которой сайты лежат, 0777. От души так, типа не жалко. Лучше и не спрашивайте, как так получилось))
Не, все работает конечно, но как-то немного стремно с полностью открытой на запись и выполнение папкой, доступной из веба жить 🙂 И папок вложенных куча, руками нереально все права поправить.
Вобщем, правится так.
Сначала всем ставим 0644
chmod -R 0644 ./*
Затем папкам ставим 0755
chmod -R 0755 ./$(find . -type d)
P.S. Ну и главное правило напоследок — Не лезь, блять, с несоображающей головой на рабочий сервер. Надо сюда будет его отправить, там таких много))
P.P.S. Вики рулит )
Восстанавливаем текстовые файлы
find . -type f -exec chmod 644 {} \;
Потом папки
find . -type d -exec chmod 755 {} \;
Размножение строк — функция генерации всех возможных значений из шаблона {}
Понадобилась такая функция, решил размять мозги. Функция понимает в качестве разделителя запятые, |, ;. Вызов показан в конце.
<?php
function mashUp($str){
preg_match_all("/{(.*?)}/", $str, $out);
$headArr = $out[1];
for($i = 0; $i < sizeof($headArr); $i++)
{
$valArr = preg_split("/(\||,|;| )/", $headArr[$i]);
($i == 0)? $sTotal = count($valArr) : $sTotal = $sTotal * count($valArr);
$varr[] = $valArr;
}
for($i = 0; $i < $sTotal; $i++){
$strings[$i] = $str;
}
foreach($headArr as $num => $val):
$currPos = 0; //позиция ключа в $varr
for($i = 0; $i < $sTotal; $i++)
{
if($i == 0):
if($num == 0)
{
$sChange = ( $sTotal / ( count($varr[$num]) ) );
}
else
{
($old)? $sChange = $old : $sChange = $sChange;
$sChange = ($sChange / (count($varr[$num])));
}
if(count($varr[$num]) < 2){
$old = $sChange;
$sChange = $sTotal;
}
if($num == (count($headArr) - 1))
{
$sChange = 1;
}
$sNum = $sChange;
endif;
if($sNum == 0){
$sNum = $sChange - 1;
$currPos++;
} else {
$sNum--;
//$currPos++;
}
if($currPos > (count($varr[$num]) - 1))
$currPos = 0;
preg_match("/{(.*?)}/", $strings[$i], $res, PREG_OFFSET_CAPTURE, 0);
$strings[$i] = preg_replace("!".preg_quote($res[0][0])."!si", $varr[$num][$currPos], $strings[$i]);
}
endforeach;
return($strings);
}
$str = "some {1a|2a,3a;4a 5a} strings {1b|2b|3b} that {1c} need to {1d|2d} post {test|example|primer}";
echo maashUp($str);
?>
Реальный процесс разработки ПО
APT и его коровья суперсила
Когда то я запостил скрин тара с его робким отказом, сегодня вот заметил такую штуку в apt:

Интересно, в оригинальной английской убунте тоже самое написано или это перевод такой 🙂
Star Wars 4: новая надежда :)
Фильм, который наверно смотрели все, только он текстовый и показывается в шелле 🙂
telnet towel.blinkenlights.nl

Кстати, полезный сайтик, много всяких команд для консоли.
Оптимизаторы в GoGetLinks
Обычно я не пишу на такие темы, но тут просто не сдержался. Анкор из задания:
аську тел сони эриксон бесплатно (оптимизатор запретил склонять текст ссылки )
B описании:
Ссылка обязательно должна быть окружена тематическим текстом: осмысленным предложением, а не парой слов типа «рекомендуем» или «на этом сайте».
Скорей всего, это будет первый рекламодатель, которого отправлю в блеклист.
Я играю в Blogowar.ru, чего и вам советую.
MYSQL RAND(), как получить рандомную строку из БД
Чем дольше занимаюсь кодингом, тем чаще втыкаюсь в такие вещи, которые сто раз уже использовал, а на 101 сломал голову.
Есть таблица, в ней N тысяч записей, нужно вытащить одну рандомно, кой-чего с ней сделать, и если все ок то ее использовать, если нет то вернуть на место с соответствующей отметкой и взять другую, пока не будет найдена подходящая по условиям.
Я, особо не мудря, делаю цикл while до условия, пока не найдена подходящая запись. В цикле такой запрос к БД
SELECT * FROM `table` WHERE 1 ORDER BY RAND() LIMIT 1
По задумке, это возвращает каждый раз новую запись. Но у mysql есть такая приятная особенность — она кеширует запросы и в цикле каждый будет возвращаться одно и тоже поле. Наверно, если разрывать соединение, тогда будет возвращаться разное число. Я таких вещей в душе не знал, поэтому немного удивился, погуглив, что это самый дибильный способ вытащить рандомную запись из базы. На очень больших БД это завесит сервер напрочь.
Вариант получше заключался в том, чтобы вытащить максимальное значение записей и получить рандомное число в его пределах, затем запросить из базы строку с LIMIT рандомное число.
//запрос макс количества записей в переменную SELECT FLOOR(RAND() * COUNT(*)) AS `offset` FROM `table` //далее запрос с этой переменной SELECT * FROM `table` LIMIT $somevar, 1
Он же по тестам получился самый быстрый.
Еще один способ заключается в том, чтобы запросить по определенному полю, например id, указав точное число для него.
SELECT * FROM `table` WHERE id >= (SELECT FLOOR( MAX( id ) * RAND( ) ) FROM `proxy` ) ORDER BY id LIMIT 1
Все варианты расписаны тут.
Единственное, что не устроило во втором варианте, это два запроса к базе.
