Стихи, рассказы, философия, IT, политика, панкизм, раздолбайство и болтовня.
После празднования своего дня рождения в кафе "Четыре курицы" командир Владимирского ОМОНа жег покрышки и поливал "коктейлем Молотова" математика Михаила Вербицкого
Превращение элементов панелей в окна и наоборот.
Особенности перемещения окон и панелей
Любому пользователю Windows, который пользовался любимой многими Фотошопой 😉 понятно — перетаскиваешь окошко внутри программы Read more… на панель, оно становится частью панели, тянешь за заголовок — опять отдельное окошечко. Но дизайнеры интерфейса Sony поступили нестандартно — окошечко прикрепить к области экрана/панели можно также, но на дергание заголовка окно уже не реагирует.
С этой проблемой обратилась ко мне в письме одна девушка, и попросила решить ее.
Так вот, отвечаю, чтоб открепить окно, т.е. окно опять стало отдельным окном, а не частью панели, надо тащить окно за следующий элемент управления с левой стороны области панели:
Лед. Снег. Ночь. По холодному, почти вымершему лесу шел парень. В одной рубашке. Шел умирать. Он практически обессилел, от холода и усталости и практически ничего не чувствовал, почти ничего – кроме всепоглощающей жажды. Встав на колени, он начал есть снег, потом упал, прислонился к сосне и закрыл глаза…
***
— Эй, вставай, очнись! – кто-то бил парня по щекам. Тот открыл глаза и увидел на фоне ярких северных звезд лицо паренька чуть-чуть моложе его
— Я… Я умер?
— Ну, для мертвого ты слишком громко кричал во сне
— Где я?
— В лесу, примерно в двух днях пути от того места, где мы тебя нашли. Амир хотел тебя оставить, но мне стало жаль, что ты так глупо замерзнешь. Я отогрел тебя и взял с собой.
— И… И ты тащил меня на себе все это время?
— Да. Это было не трудно, ты почти ничего не весишь, а я сильный, хоть Амир говорит, что я еще маленький. Ты когда последний раз ел? Будешь тетерева? Я поймал его специально для тебя!
Парень сел, и с жадностью набросился на протянутую ему жареную ножку птицы.
— Уууу… Да ты голоден, как целая стая волков!
— Эй, не давай ему много еды, а то с голодухи переест и заработает себе заворот кишок.
— Амир?
— Да, а кто это еще может быть. Собирайся, пошли. Оставь ему половину птицы и спички, а нам пора в дорогу, Алекс.
— Нет! Я не оставлю его! Он один умрет здесь.
— А нам-то до этого какое дело? Я вообще не понимаю, зачем ты его подобрал. Ты слишком тепло относишься к этим… людям. В них столько ярости и злобы! Неспособные ни на что кроме разрушения и убийства себе подобных твари!
— Амир, я знаю, этот парень не такой. Он не убийца, к тому же ему плохо и одиноко, и… он так похож на моего друга с которым я жил, пока не пришла Война и… ну ты знаешь…
— Не ссорьтесь, ребята, оставьте меня. Твой друг действительно прав. Я и пришел сюда умирать… Когда-то меня звали Дэн и я жил в большом городе, люди восхищались его красотой, называя его Северной Пальмирой, Звездой Севера. Но… Началась Война, город был разрушен страшным оружием, испепеляющим все вокруг. Я и моя семья чудом выжили, найдя укрытие на одной из станций подземки. А потом… Появился Кровавый Отряд. Тот самый страшный Кровавый Отряд который возглавляет Канцлер. Байки военных не врут. У Канцлера действительно один глаз не человеческий. Волчий. И он действительно превращается в огромного волка. Всех кто это увидел, Кровавый Отряд уничтожает и… моя семья. Они все погибли. А я… я успел убежать. Как последний трус! У меня не хватило смелости встать на их защиту! Я как крыса прятался по тоннелям, а потом решил, что лучше умереть. Но даже покончить с собой у меня не хватило духа. И я отправился на север, в надежде что в дороге я замерзну, или нарвусь на банду мародеров.
Два волка, матерый великан, на черной шкуре которого виднелось несколько глубоких старых шрамов и песочного цвета переярок внимательно слушали рассказ парня. Они склонили на бок свои большие головы, из приоткрытых пастей выходили маленькие облачка пара.
— Да, Алекс, а ты все-таки оказался прав. Парень был нам полезен. Теперь мы знаем, что Канцлер и его банда в городе Северной Звезды. А значит они там что-то ищут, и, похоже, тоже самое что и мы.
— Цветок? Ты уверен?
— Да! Подумай хорошенько! Канцлер не такой идиот чтобы без причин лезть в эти радиоактивные руины, полные мутантов, свихнувшихся машин и прочих сомнительных удовольствий. Даже со своими головорезами ему наверняка придется попотеть. А в подземке целый город спрятать можно, не только Цветок. Это объясняет и то, почему так неожиданно пропал запах.
Дэн, не веря своим глазам, зажмурился, а когда вновь нашел в себе силы посмотреть на волков, на их месте стоял его спаситель и еще один парень – крепкий высокий брюнет с пронзительно-зелеными глазами.
— Вы…
— Да, мы волки. – сказал Амир.
— Вы… Вы убийцы! Мутанты! Или порождения нечисти! Вы уничтожили всю мою жизнь, а теперь еще и издеваетесь! Избавили меня от смерти только для того чтоб посмеяться надо мной, поиграть со мной как кошка с мышью?!
Парень вскочил и попытался броситься на Амира с кулаками, но от слабости у него закружилась голова, и он неловко упал на землю. Алекс подошел к парню и помог ему сесть.
— Убирайся! – закричал тот, отталкивая руку Алекса. – Убирайся или добей меня, наконец!
— Успокойся. — раздался голос Амира. – Мы никакого отношения не имеем к этому ублюдку Канцлеру и его бандитам, среди которых, кстати, нет ни одного волка. Сплошь ваши человеческие отбросы.
— Ты врешь! Порождения дьявола не могут сказать ни одного правдивого слова!
— Ну вот, опять человеческая глупость и предвзятость по отношению ко всему, что кажется вам необычным… Мы никакие не порождения дьявола! Мы – волки. И мы всегда жили отдельно от людей! Но именно люди устроили Войну. Захотели продолжения страшной сказки о смерти всего мира! И у нас не осталось другого выбора, кроме как вступить в вашу поганую игру! Волки пробудились и вышли на Дорогу, на бесконечную Дорогу, чтобы найти себе новый мир – без людской страсти к разрушению, коварства и жадности! Люди – вот кто настоящие исчадия ада! Пошли, Алекс, нам нечего здесь делать. Пусть мертвый возвращается к своим мертвецам!
— Нет, Амир, я не оставлю его! И не позволю ему умереть!
— Ха! Зачем тебе этот червяк в дороге. Пусть он сдохнет, во всяком случае, у него больше не будет проблем, пошли.
— Ты… Говоришь как… человек! Только люди бросают своих в беде!
— Своих?! С каких это пор он стал тебе «своим»?!
— С тех пор, как я его спас! Если ты не хочешь взять его с собой – иди один! Я остаюсь!
— Да черт с тобой! Мне плевать, хочешь, так пусть идет… Но… если у тебя из-за него будут какие-нибудь неприятности, я из них тебя вытаскивать не буду.
Продолжаем модифицировать скрипт, точнее ответить на вопрос: Q: Можно ли объединить первую и последнюю версию скрипта, чтоб без параметра скрипт проверял IP, передаваемый сервером, а если указан параметр GET — переданный в параметре IP?
A:
Да, и опять же довольно просто. Надо лишь условие проверки переменной модифицировать соответственно. Условие у нас было:
//проверка наличия переменной
if (!isset($_GET['ip'])) {
echo 'ERROR|NOT DATA'; //не нашли - вывели сообщение об ошибке и прекратили работу
die();
}
Сначала инициализируем переменную $ip, далее проверяем, если в запросе GET есть параметр ip, то его значение присваиваем переменной $ip, иначе берем ее значение из $_SERVER['REMOTE_ADDR'];
Далее, все как в 3 серии Скачать можно здесь, Посмотреть как работает — здесь.
Картинки — такие же как и в предыдущих выпусках. Посему дублировать не буду. Предыдущая серияОкончание
Вот анон задает справедливый вопрос, до которого из парней догадался лишь умник-Ильюша, четырнадцатилетний переросток из Харькова. Из девок — никто.
Итак. Q: Что будет, если нашему скрипту подсунуть валидный ip, но не с какой точки зрения смысла не имеющие: адреса частных сетей, адреса для «обратной петли» (LOOPBACK)
A: Будет нечто некрасивое: в геобазе закономерно нет частных ip, коих одинаковых миллионы на Земле, но вообще разработчики, конечно, недоработали. Надо штатный ответ на такой запрос.
Т.е. если просто передать частный IP геобазе, то она выдаст что-то типа такого:
Некрасиво и неправильно.
Так как же этого избежать, известить клиента о такой ситуации?
Известно, что в IANA определены группы адресов для LOOPBACK’а и локальных сетей: см. хотя-бы Википедию, а также известно, что нельзя использовать диапазон IP 0.0.0.0 - 0.255.255.255, заодно это закрыло дырку в регулярном выражении (пропускались конструкции вида 1.1.1.1.1). Надо было бы подправить регулярку, но мне влом, кто хочет — помогите и подправьте. Дам я вам за это ничерта, спасибо скажу только лишь.
Регулярка для валидации IP:
Итак. Добавляем функцию, проверяющую, попал ли IP в диапазон:
function chkdiapip ($user_ip, $ip_from, $ip_to) //попадает ли ip в нужный диапазон
{
return ( ip2long($user_ip)>=ip2long($ip_from) && ip2long($user_ip)<=ip2long($ip_to) );
}
И функцию, которая последовательно проверяет не попал ли наш IP в один из диапазонов:
function get_spec_diap ($user_ip) //определение, попал ли IP в специальный диапазон
{
$ret=1;
//Частные IP
if (chkdiapip ($user_ip,'10.0.0.0','10.255.255.255'))
{
$ret="WRN|IP PRIVATE ADDRESS 10.0.0.0-10.255.255.255";
return $ret;
}
if (chkdiapip ($user_ip,'172.16.0.0','172.31.255.255'))
{
$ret="WRN|IP PRIVATE ADDRESS 172.16.0.0-172.31.255.255";
return $ret;
}
if (chkdiapip ($user_ip,'192.168.0.0','192.168.255.255'))
{
$ret="WRN|IP PRIVATE ADDRESS 192.168.0.0-192.168.255.255";
return $ret;
}
//Wrong IP
if (chkdiapip ($user_ip,'0.0.0.0','0.255.255.255'))
{
$ret="WRN|IP WRONG ADDRESS 0.0.0.0-0.255.255.255" ;
return $ret;
}
//IP LOOPBACK
if (chkdiapip ($user_ip,'127.0.0.0','127.255.255.255'))
{
$ret="WRN|IP LOOPBACK ADDRESS 127.0.0.0-127.255.255.255";
return $ret;
}
return $ret;
}
Если IP попал в один из диапазонов - функция возвращает строку с идентификатором события WRN (Внимание, некритичная ошибка или ситуация) и описанием, если IP не попадает ни в один диапазон, то функция возвращает 1.
Перед тем, как создавать объект, вставляем очередную проверку:
//проверяем, не попал ли IP в особый диапазон
$check_diap = get_spec_diap($ip);
if ($check_diap!=1)
{
echo "IP|".$ip."n";
echo $check_diap;
die();
}
Если попал - выводим сообщение и прерываем скрипт командой die();
Далее делаем, как в сериях 2 и 1, т.е. создаем объект SxGeo, обращаемся к нему и выводим данные в удобном виде. Скачать можно здесь, посмотреть как работает тут. В качестве аргумента GET вставлен адрес из LOOPBACK-диапазона.
Мне сегодня в почту поступило довольно закономерных вопросов от моих читателей.
Итак, отвечаю Q: Как модифицировать скрипт, чтоб можно было проверить любой IP, который захочется задать?
A:
Очень просто. Достаточно передать скрипту нужный IP (здесь я сделаю это с помощью метода GET)Сначала модифицируем скрипт таким образом:
После // Подключаем SxGeo.php класс
include("SxGeo.php");
Вставляем код проверки наличия соответствующей переменной GET пусть у нас она будет ip
//проверка наличия переменной
if (!isset($_GET['ip']))
{
echo 'ERROR|NOT DATA'; //не нашли - вывели сообщение об ошибке и прекратили работу
die();
}
Далее, нам потребуется проверить IP на валидность, мало ли что нам в GET сунули.
Я обычно организую вначале файла «Область функций», хотя с точки зрения PHP это необязательно, но мне так удобно.
После //Область заголовков
header('Content-type: text/plain; charset=utf8');
Добавляю функцию проверки IP на валидность
// ---------Область функций ---------
function isip($ip_str) //проверка соответствия данных формату IP
{
$ip_pattern="#(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)#";
$ret=FALSE;
if (preg_match($ip_pattern,$ip_str))
{
$ret=TRUE;
}
return $ret;
}
// ---------Конец области функций ---------
Далее, после проверки наличия переменной, вставляем проверку на валидность IP
$ip=$_GET['ip'];
// проверка на соответствие формату
if (!isip($ip))
{
echo 'ERROR|NOT IP'; //не IP - вывели сообщение об ошибке и прекратили работу
die();
}
Далее, все как в предыдущей серии. Создаем объект SxGeo и скармливаем ему айпишник, да выводим данные в удобной форме. Скачать можно здесь, Посмотреть как работает — здесь. Для примера в ссылку вставлен IP прокси анончика из комментария к предыдущей заметке.
тот самый анончик, точнее его прокси реакция на попытку передать ерунду или передать ничего
Мирный: Транк(и)-Вылезатор(ы)
И военный: Танк(и)-Вылезатор(ы) — это танк, который вылезает из-за границы соседнего государства.
Еще один военный неологизм: Танк(и)-Вылизатор(ы) — которые туда заехали, и там сгорели при нападении на территорию соседнего государства. Вылизали у Правого Сектора.
Ну и байка о ее появлении, заодно:
Идет экзамен по странному и ненужному предмету «История Информатики и ВТ», сдает студент, который ессно, нихрена не знает:
Препод: «Ладно, ответите на вопрос, поставлю вам 3. Вопрос очень простой. Как звали первую известную в истории женщину программистку»?
Студент: «Ада, Ада точно. В ее честь язык программирования назвали…»
Препод: «Ну а фамилия»?
Студент (пыхтя минут 5 и напряженно думая): «О! Легалайз! Точно! Ада Легалайз!»
Занавес.
ЗЫ. Когда-то давно рассказал Панкарь, на моем курсе не повторялось.
В сети по этому поводу довольно много материала, но я расскажу как это сделал я.
Понадобилось мне написать серверный back-end к одной программе (о ней я при случае расскажу позже), определающей ip клинта и его местоположение.
Задачи определить, сидит ли клиент через неанонимный прокси не было. Если кого-то интересует этот момент, рекомендую статью[Скачать PDF]
Итак, для определения IP нам понадобится собственно IP клиента, который нам обычно любезно предоставляет сервер в переменной $_SERVER['REMOTE_ADDR'] (о других случаях где можно если нужно искать IP — смотрите вышеуказанную статью).
Теперь о б определении местоположения по IP. Для сего действия необходима база геолокации (база, где сопоставлены диапазоны IP и страны, опционально города). Такие базы бывают платные/бесплатные, автономные (можно унести себе на сайт) и не автономные (сидят у кого-нибудь на сервере и выдают информацию по запросу) и т.д.
Для моей задачи нужна была автономная и бесплатная БД. Я воспользовался SxGeo: статья о ней на Хабре, Еще одна и сайт проекта.
Там все довольно просто. Скачиваем нужные базы, скрипт, который ими управляет, ставим на сайт. В комплекте есть небольшой пример.
Чтобы не тыкать по ссылкам, я собрал все в один архив, который можно скачать здесь
А теперь скрипт. Моя задача была небольшая, потому мне хватило просто изменить скрипт примера:
// Переделано из примера [8^12]
header('Content-type: text/plain; charset=utf8');
// Подключаем SxGeo.php класс
include("SxGeo.php");
// Создаем объект
// Первый параметр - имя файла с базой (используется оригинальная бинарная база SxGeo.dat)
// Второй параметр - режим работы:
// SXGEO_FILE (работа с файлом базы, режим по умолчанию);
// SXGEO_BATCH (пакетная обработка, увеличивает скорость при обработке множества IP за раз)
// SXGEO_MEMORY (кэширование БД в памяти, еще увеличивает скорость пакетной обработки, но требует больше памяти)
$SxGeo = new SxGeo('SxGeoCity.dat');
//$SxGeo = new SxGeo('SxGeoCity.dat', SXGEO_BATCH | SXGEO_MEMORY); // Самый производительный режим, если нужно обработать много IP за раз
1. Выдаем нужный заголовок, подключаем основной скрипт SxGeo.php
2. $ip = $_SERVER['REMOTE_ADDR']; — получаем IP клиента, и записываем информацию в переменную $ip
3. $add_info = $SxGeo->getCityFull($ip); // Вся информация о городе
$main_info = $SxGeo->get($ip); // Краткая информация о городе или код страны (если используется база SxGeo Country) — передаем IP объекту SxGeo, записываем всю полученную информацию в переменные $main_info и $add_info (соответственно, основную и дополнительную информацию)
3. Выводим данные в удобном для дальнейшей обработки виде: echo "IP|".$ip."n";
echo "ISO_CODE|".$main_info['country']['iso']."n";
echo "CITY|".$main_info['city']['name_en'].'|'.
$main_info['city']['lat'].'|'.
$main_info['city']['lon']."n";
echo "COUNTRY_INFO|".$add_info['country']['name_en'].'|'.
$add_info['country']['lat'].'|'.
$add_info['country']['lon']."n";
echo "REGION_INFO|".$add_info['region']['iso'].'|'.
$add_info['region']['name_en']."n";
Посмотреть, как работает скрипт, можно на HexProject, скачать его здесь, а пакет из необходимых баз, скрипта API SxGeo и вышеуказанного скрипта здесь
У меня сегодня, например, голландский IP Продолжение
Даю анонс. Ждите новой информации про Семенова Сергея Сергеевича, депутата, а также его (надеюсь просто куратора, а не любовника, г-н(аря) Гостева) потому что если Семенов все-таки не просто курируемый, то у меня он будет вызывать рвоту. Потому что вкуса, стиля нет. И неразборчив в выборе партнеров.
Когда-то в детстве такой сочиняли, но так и не сделали, а сегодня оттуда приснились два персонажа: Гос Нарко Кон, тролль и его друг, он же ездовое животное Конь Фискат — второй выглядит как поджарый жеребец с вечно стоящей от амфа …. антенной триколор-тв между ног, и постоянно выпученными глазами. А Гос Н.К. похож на толстого зеленого дезоморфинового наркомана в последней стадии пиздецомы, но он не дохнет, и сзади у него крокодилий хвост.
Постоянно ходит в паб города Енотослав, где так и представляется, на манер или Бонда, или просто чела, решившего сверкнуть своей должностью:
— Меня зовут Лена, а тебя как?
— Гос Нарко Кон, тролль. Хотя можешь звать меня просто Госом.
А когда они нажираются, то садятся на Коня Фиската (который постоянно забывает в баре кредитку и пальто), быстро через Внепространство и Вселенскую Пустоту в постель 🙂
Нарисуйте Г.Н. Кон, тролля и коня его Фиската, мож и комикс сделаем.
Можно прямо в комменты постить.