Рубрика архива: IT

внимание косяк :)

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

всё это баловство было зашито в теме EmptyCanvas, откуда я ее скачивал уже не помню, но куда обращается функция нам известно. Выносится общественное порицание wpru.ru, такое поведение недостойно благородных донов!

P.S.
спасибо perl, regexp, что вы есть.
Будте внимательны!

немного sh’ell

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

#!/bin/sh -e


{ COMAND1& } && COMMAND 2 && wait %1 && COMMAND 3
#где COMMAND${i} нужные команды

задачка 2.

*как выяснилось, решение корректно на числах одного порядка

есть 10 миллиардов записей в файле, каждая запись это число типа double, требуется найти минимальное значение из 10% максимальных.
Подробнее »

задачка 1.

Дан текстовый файл. Необходимо выделить из него 50 наиболее часто повторяющихся строк.
Подробнее »

класс SimpleFeedBack

intro
Иногда возникает задача вставить на страницу форму обратной связи, ну или вообще какую нибудь форму для отправки информации на почтовый ящик. И вот решил я это дело несколько автоматизировать. Создал простой класс который позволяет создавать форму и отправлять данные из нее мне на почту. Ключевые возможности, настраиваемый стиль каждого поля, возможность передачи вашему скрипту для дальнейшей обработки формы, редирект на вашу страниц после отправки, и возвращение результата прямиком на страницу с формой ajax’ом.
Подробнее »

События / Events

Стандартные события (обычно это события выбора/ подтверждения)

ActioinListener:


-actionPerformed

События JFrame:

WindowListener:


-windowOpened
-windowClosing
-windowIconified
-windowDeiconified
-windowActivated
-windowDeactivated

ComponentListener:


-componentResize
-componentMoved
-componentShown
-componentHidden

DocumentListener


-insertUpdate
-removeUpdate
-changeUpdate

возвращаемое значение типа enum, вопрос

вопросы с которыми столкнулся:

вернуть в методе enum, чтобы получить удобный список констант во внешнем классе и от туда передать эти значения как параметры, с наскока не вышло).

class Main(){
    A dz=new A();
    dz.DO(dz.getCommandList().DIR);
}

class A(){
    private enum en={DIR, DEL, CLS};

    public enum getCommandList(){
        return en;
    }

    public void DO(string c){
        switch (c){
            en.DIR:
            ...
            break;
            ...
            default:
            break;
        }
    }
}

постраничная разбивка контента

решил написать про возможные варианты разбивки контента на страницы, но стоило только отвернуться как скачок напряжения, и пары абзацев
как не бывало. Но не будем о грустном.

Я встречал пока только два основных направления «пейджификации», это постраничная разбивка, для которой требуется в обязательном порядке знать общее число
страниц. И разбивка вида «ВПЕРЕД», «НАЗАД», для ее реализации достаточно немного изменить сам запрос дерганья контента из БД.
В случае постраничного отображения, мы получаем более наглядный и удобный способ визуализации, который легко можно представить как второй способ.
Но за все приходится платить, в данном случае дополнительным запросом к БД.
Второй вариант реализован путем получения ответа от Бд, составляющей страницу на 1 элемент больше чем собирались выводить, если этот элемент
присутствует то значит мы можем дать ссылку на последующую страницу. Иногда, где не требуется вся мощь и красота постраничного вывода, этот способ тоже применим.

пример реализации:

вариант «< НАЗАД | ВПЕРЕД >»

$start=isset($_GET['page']) ? $_GET['page'] : 0;	// с какого элемента начинаем забирать данные
$pages=15;											// количество выводимых полей из бд

$result=mysql_query("SELECT * FROM `table` ORDER BY `id` LIMIT $start,($pages+1)");

// код вывода ссылки если возможна навигация назад
$prev=($start-$pages>=0) ? '<a href="page.php?page='.($start-$pages).'"> BACK </a>' : 'BACK';
// если возможна навигация вперед
$next=count($result)>$pages ? '<a href="page.php?page='.($start+$pages).'"> NEXT </a>' : 'NEXT';

print $prev.' | '.$next;

Но что будет если мы передадим скрипту в запросе значение к примеру равное 2, по нашему алгоритму в $prev не будет ссылки, тогда как на самом деле
предыдущая страница есть. Так что в фильтре входящего значения необходимо несколько доработать код. Который будет валидировать данные и
все что не подходим нам по условиям отправлять в исключение.

if (((int)$start % (int)$pages)!=0){print '404, Sorry, page not found';exit;}

вариант «1 2 3 4 [5] 6 7 8»

$max=mysql_query("SELECT COUNT(*) FROM `table`"); // количество записей в таблице
$pages=15; // по сколько выводить записей на страницу
$page=$_GET['page']; // текущая страница

for ($i=1;$i<=ceil($max/$pages);$i++){
    print ($i==$page) ? ' <span style="color : #262626;	font-size : 0.82em;	font-weight : bold;">[ '.$i.' ]</span> ': ' <a style="color : #C2C2C2;	font-size : 0.72em;" href="#page.php?page='.$i.'">'.$i.'</a> ';
}

результат:
1 2 3 4 5 6 7 8 9 10 11 12 13 [ 14 ] 15 16 17 18 19 20 21 22 23 24 25

$max=mysql_query("SELECT COUNT(*) FROM `table`"); // количество записей в таблице
$pages=15; // по сколько выводить записей на страницу
$page=$_GET['page']; // текущая страница
$len=5; // количество отображаемых ссылок слева и справа от текущей страницы

//left
$left=$len>=$page-1? $page-1:$len;
for ($i=0;$i<=$left-1;$i++){

    print ' <a style="color : #C2C2C2;	font-size : 0.72em;" href="#page.php?page='.($page+$i-$left).'">'.($page+$i-$left).'</a> ';
}

print '<span style="color : #262626;	font-size : 0.82em;	font-weight : bold;"> [ '.$page.' ] </span>';

//right
$right=ceil($max/$pages)<=$page+$len?ceil($max/$pages)-$page:$len;
for ($i=1;$i<=$right;$i++){

    print ' <a style="color : #C2C2C2;	font-size : 0.72em;" href="#page.php?page='.($page+$i).'">'.($page+$i).'</a> ';
}

результат:
9 10 11 12 13 [ 14 ] 15 16 17 18 19

В качестве max, page, pages, len можно поставить любые цифры и посмотреть на итоговый результат.

REGEXP, собрать ссылки со страницы

Если требуется собрать все ссылки которые есть на странице то поможет следующее регулярное выражение:

{<a.*?\s{1}href=\s*(&#91;"'&#93;)(.+?)\1.*?>}

оно ищет href который может быть обрамлен кавычками, слева от него может быть любое кол. символов до начала тега, но обязательно будет пробел, справа после закрывающей URL кавычки может быть любое количество символов или сразу закрываться тег.

следующий код собирает в скалярный массив все ссылки.

while($a=~m{<a.*?\s{1}href=\s*(&#91;"'&#93;)(.+?)\1.*?>}oig){
	push(@m,$2) if $2;
}

или краткая форма:

push(@m,$2) while($a=~m{<a.*?\s{1}href=\s*(&#91;"'&#93;)(.+?)\1.*?>}ig);

REGEXP, собрать все email’ы со страницы

Вот, простая и дубовая конструкция, лишенная красоты и лаконичности присущей перлу, но зато очевидная на 100%

while($a=~m{=(['"])mailto:(.+?)\1.*?>}ig)
{
	push(@m,$2) if $2;
}

это регулярное выражение ищет в тексте конструкцию вида «mailto:blablabla», где кавычки могут быть как одинарные так и двойные, первые скобки нужны для того чтобы найти и определить в переменную $1 тип кавычек в которых находится искомое, ну а вторые нужны чтобы в переменную $2 положить сам почтовый адрес.

более краткая запись:

push(@m,$2) while($a=~m{=(['"])mailto:(.+?)\1.*?>}ig);