среда, 1 декабря 2010 г.

Показ изображений в зависимости от разрешения экрана

Встречается иногда такая подлая вещь, когда изображение, которое надо вывести на экран, оказывается слишком большим и рвет ко всем чертям дизайн. Как можно обойти эту проблему? Можно пойти по жутко-быдлометоду, как задание параметров height и width у изображение. Например

<img src="images/image.gif" width="100px" height="100px">

Да, такой вариант выведет картинку размером 100*100 , только если исходное изображение было с разрешением 500000*500000 и весило стопицот мегабайт, то оно будет предварительно загружено (все стопицот мегабайт) и потом показано как 100*100. Вывод, ради ускорения загрузки страницы и экономии трафика, надо нарисовать срипт, который будет ужимать изображение до приличных параметров. Ну или, например, нам надо будет выводить картинку в зависимости от разрешения экрана пользователя. Те кто пишет на JavaScript или Java конечно предложат несколько вариантов решения этой проблемы, брызгая слюной, что на этих языках такая проблема решается проще, понятнее и шустрее. Ктулху с ними, мы пишем на PHP. Я столкнулся с такой проблемой, когда писал сайт для одной мебельной компании. И в итоге получился скрипт, который можно использовать для вывода изображений по заданным размерам или же в зависимости от разрешения экрана пользователя.

<?php

session_start();

$width=(!empty($_GET['w']))?(int)$_GET['w']:false;

$height=(!empty($_GET['h']))?(int)$_GET['h']:false;

if(!$width)

{

$width=(!empty($_SESSION['w']))?((int)($_SESSION['w'])):800;

}

if(!$height)

{

$height=(!empty($_SESSION['h']))?((int)($_SESSION['h'])):800;

}

if($width<0) $width*=-1;

elseif($width==0) $width=800;

if($height<0) $height*=-1;

elseif($height==0) $height=800;

$def_folder="portfolio"; //стандартная папка с изображениями

$folder=(!empty($_GET['fd']))?(trim($_GET['fd'])):$def_folder;

$file=(!empty($_GET['f']))?(trim($_GET['f'])):"";

if(strlen($file)==0 || !file_exists($folder."/".$file))

{

$im=imagecreatefromgif("images/noimage.gif"); //изображение, если ничего нет файла

imagegif($im);

}

else

{

$im;

create($folder,$file,$im);

$imwidth=imagesx($im);

$imheight=imagesy($im);

$width=(int)($width*0.8);

$height=(int)($height*0.8);

if($imwidth>$width || $imheight>$height)

{

$rw=$imwidth-$width;

$rh=$imheight-$height;

if($rw>$rh)

{

$k=$width/$imwidth;

$height=(int)($imheight*$k);

}

else

{

$k=$height/$imheight;

$width=(int)($imwidth*$k);

}

$res=imagecreatetruecolor($width,$height);

imagecopyresampled($res,$im,0,0,0,0,$width,$height,$imwidth,$imheight);

imagedestroy($im);

out($file,$res);

imagedestroy($res);

}

else

{

out($file,$im);

}

}

function create($folder,$file,&amp;$im)

{

$patch=$folder."/".$file;

$type=strrchr($file,'.');

switch($type)

{

case ".jpg":

case ".jpeg":

case ".JPG":

case ".JPEG": $im=imagecreatefromjpeg($patch); break;

case ".png":

case ".PNG": $im=imagecreatefrompng($patch); break;

case ".gif":

case ".GIF": $im=imagecreatefromgif($patch); break;

default: $im=imagecreatefromwbmp($patch);

}

}

function out($file,&amp;$im)

{

$type=strrchr($file,'.');

switch($type)

{

case ".jpg":

case ".jpeg":

case ".JPG":

case ".JPEG":

header("Content-type: " . image_type_to_mime_type(IMAGETYPE_JPEG));

imagejpeg($im,'',100);

break;

case ".png":

case ".PNG":

header("Content-type: " . image_type_to_mime_type(IMAGETYPE_PNG));

imagepng($im);

break;

case ".gif":

case ".GIF":

header("Content-type: " . image_type_to_mime_type(IMAGETYPE_GIF));

imagegif($im);

break;

}

}

?>

воскресенье, 25 июля 2010 г.

Получаем аккаунт на HAX.TOR

Итак, дя тех кто не в курсе, это вообще то такой веселый и интересный хакерский квестик. Но у него есть один БОООЛЬШОЙ плюс. Если пройти первые 5 уровней, то в подарок получаем аккаунт на пользование shell хостингом с 2000 полновесных мегабайтов места.

Подробнее об установленном софте можно почитать ТУТ

Итак, сразу начнем гробастать такое Щасте!

Первым делом переходим на http://hax.tor.hu/warmup1/ и попадаем на первое задание. В нем нам нужно ввести пароль. Внизу лежит подсказка, типа пароль лежит в исходнике. Не проблема. Открываем исходный код страницы и листаем вниз. Там после много переводов строк (это чтобы никто не нашел) видим функцию function a() на яваскрипте. Тут даже язык особо знать не надо (я например не заню, но все одно раскумекал), чтобы понять, как она работет. Там будет что то из серии

thepw = 'warmup1';
thepw = thepw+'mat';
thepw = thepw + 'roska';


Это значит что нам для пароля надо всего то собрать во едину строку все что в кавычках. в данном случае получился пароль warmup1matroska

Далее попадаем на второе задание. Не буду пояснять как его делать, сразу дам ответ, он все равно не меняется =). Итак, ответ
SSH-1.99-Server-VII


Третье задание. Тут надо выбрать несуществующий вариант из списка. Есть два пути решения этой проблемы, но я пошел по самому простому из всех самых простых. Так как форма передает данные методом GET, ну я и передал. Просто переходим по такой ссылке как
https://hax.tor.hu/warmup3/?chosen=Bacon

То есть просто дописываем ?chosen=Bacon к тому адресу что был

Четвертое задание: Тут тоже надо ввести пароль. Снизу дана ссылка на страницу на которой пароль лежит, но все браузеры блокируются. Лично я пошел по пути наименьшего сопротивления и использовал PHP


print_r(file_get_contents("http://hax.tor.hu/pwfor4/"));

и получил строку
The password is: spaceship


Пятое задание. Тут надо расшифровать хэш. Не знаю как насчет того, меняют ли они ответ, но алгоритм решения тут следующий. Нам выдается хэш. Он состоит из четного числа чисел. Методом проб и ошибок я понял, что каждый символ кодируется двумя числами. ТО есть разбиваем хэш на блоки по два числа. Далее, после недолгих экспериментов было выяснено, что первое число блока не меняется, если не меняется символ. То есть как раз первое число из блока отвечает за код символа. Ну а далее все просто. Я пробрутил все символы и выписал их коды. Вот что получилось.
СимволКод
a86
b85
c84
d83
e82
f81
g80
h95
i94
j93
k92
l91
m90
n89
o88
p71
q70
r69
s68
t67
u66
v65
w64
x79
y78
z77


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

Если кому надо - прикладываю таблицу кодов заглавных букв
СимволКод
A118
B117
C116
D115
E114
F113
G112
H127
I126
J125
K124
L123
M122
N121
O120
P103
Q102
R101
S100
T99
U98
V97
W96
X111
Y110
Z109

среда, 30 июня 2010 г.

Решение проблемы grub error: symbol 'grub_puts_' not found

После обновления Ubuntu 9.10 до версии 10.04 у некоторых выскакивает ошибка

grub error: symbol 'grub_puts_' not found


Решается путем загрузки с установочного диска Ubuntu и переустановки системного загрузчика Grub:

1. После згрузки с диска выбрать пункт меню "Восстановить систему"
2. Ответить на все вопросы (раскладка клавиатуры, имя компьютера в сети и т.д.)
3. Выбрать устройство, используемое в качестве корневой файловой системы (раздел, на который установлена Ubuntu)
4. Переустановка системного загрузчика Grub
5. Выбрать жесткий диск, куда установить Grub (обычно (hd0)). Для того чтобы точно узнать, воспользоваться командой find /boot/grub/stage1
6. Перезагрузиться

вторник, 22 июня 2010 г.

Модный способ получения прямых ссылок на видео ВКонтакте

Столкнулся тут с проблемой. Не работают сервисы для получения прямых сылок на видео ВКонтакте. То есть либо тормозят они, либо выдают что нифига не найдено. Ну и решил я мозгом пораскинуть. Посмотрел на исходный код страницы, запутался нахрен и понял что писать парсер для этого всего дела штука неблагодарная. И посему решил пойти другим путем, модным. Ведь когда мы жмем кнопку "Воспроизвести" отправляется HTTP запрос на получение потока, тобишь самого файла. Вот его и будем ловить.

Для сего действа я использовал браузер Firefox и плагин к нему под названием HTTP Headers СКАЧАТЬ

Дальше делаем так. Заходим на страницу с которой жутко надо стянуть видео и дожидаемся пока все загрузится. Это нужно для того чтобы быстрее потом заголовки читать. Затем открываем Инструменты-> Просмотр HTTP-заголовков и видим такое вот модное окошко


Затем кликаем по кнопке Воспроизвести в браузере и смотрим в окнопросмотра заголовков. И вуаля, что же мы там видим? Правильно, запрос на видеофайл
В моем случае это строка
http://v506.vkadre.ru/assets/videos/4a7155042b7c-107098476.vk.flv



Теперь просто вставляем эту строку в адресную строку браузера или в менеджер закачек и качаем!

P.S.: Этот метод можно применять где угодно. Хоть на Ютубе, хоть на Рутубе хоть у черта на рогах.

воскресенье, 14 марта 2010 г.

Установка MySQL базы данных на сервере с FreeBSD на борту

Зачем нужна эта штука я пояснять не буду, потому что если уж ТЫ залез сюда и читаешь это, то вряд ли из тупого праздного любопытства.
Итак, для начала обновим прорты (ну или поставим, если у кого их нет)
# portsnap fetch extract update

и можем пойти попить чайку или покурить

после того, как получим красивое сообщение
Building new INDEX files... done.
Ports tree is already up to date.


идем в порты и собираем там всю эту гадость
# cd /usr/ports/databases/mysql51-server


если ты решил сразить всех или просто позадротствовать, то смело набирай
# make configure

и тщательно выбирай настройки. Мы же ограничимся дефолтными настройками
# make install clean

и снова идем курить... надолго курить...

после того, как все поставилось, инсталлируем базу данных
# /usr/local/bin/mysql_install_db


База проинсталлировалась вот по этому пути /var/db/mysql, теперь надо сменить владельца и группу для работы MySQL со своими же базами (вот тут всегда разногласия, кто-то говорит, что при инсталляции скрипт сам выполняет эти действия, кто-то что нет, так или иначе это всегда можно проверить в списке вывода #ls -l):

#chown -R mysql /var/db/mysql


#chgrp -R mysql /var/db/mysql


Все, теперь можно пускать демона

#/usr/local/bin/mysqld_safe -user=mysql &


наивные дурачки думают что это все... нееееэээт! впереди еще много чего интересного!

Меняем пароль от рута

# /usr/local/bin/mysqladmin -u root password 'new-password'


ну и для полного щастя ползем в /etc/rc.conf и прописываем там

mysql_enable=”YES”


и перезагружаем систему

воскресенье, 7 марта 2010 г.

Монтирование папок по FTP протоколу

CurlFtpFS – это маленькая програмка, которая дает нам прекрасную возможность присоединять папки с фтп серверов без использования графической оболочки.

Features:

* SSLv3 and TLSv1 support
* connecting through tunneling HTTP proxies
* automatically reconnection if the server times out
* transform absolute symlinks to point back into the ftp file system

Програмка базируется на FUSE и libcurl, и доступна в universe-репозитории.

Для установки откроем терминал, и наберем следующие:
sudo apt-get install curlftpfs

Для монтирования ФТП-раздела к примеру в папку /media/ftp набираем в терминале следующие:

curlftpfs ftp://[user]:[passwort]@ftpserver.net /media/ftp

После чего можно редактировать, копировать, удалять содержимое раздела с соответствием прав.

Отмонтировать раздел можно привычным umount:
sudo umount /media/ftp

воскресенье, 28 февраля 2010 г.

Настройка VPN сервера в Ubuntu или Debian

Установим VPN сервер:
Код:
sudo apt-get install pptpd ipx ipxripd

Настройка VPN сервера.
Отредактируйте файл /etc/ppp/pptpd-options

Код:
name pptpd
refuse-pap
refuse-chap
require-mschap
require-mschap-v2
require-mppe-128
ms-dns 10.0.0.1
ms-dns 10.0.0.2
proxyarp
nodefaultroute
lock
nobsdcomp
#IPX (todo)
ipx
ipx-network 4
ipx-node 1:0
ipx-routing 2
ipx-router-name Linux_router
ipxcp-accept-remote


Отредактируйте файл /etc/pptpd.conf

Код:

option /etc/ppp/pptpd-options
logwtmp
localip 172.16.16.1
remoteip 172.16.16.2-254


Теперь можно добавить пользователей, для этого отредактируйте файл /etc/ppp/chap-secrets

Код:
# Secrets for authentication using CHAP
# client server secret IP addresses
heiniken pptpd vladimir "*"


Мы добавили пользователя heiniken с паролем vladimir и с возможностью доступа с любого ip адреса.
Если хотите с определённого адреса то вместо * впишите ип адрес.

Перезапускаем VPN сервер

Код:
/etc/init.d/pptpd restart

На этом настройка VPN сервера закончена, осталось настроить фаервол и форвардинг пакетов.

Настройка фаервола

Создадим простой скрипт фаервола в домашней директории /home:

Код:
touch /home/vpn-firewall.sh
chmod +X /home/vpn-firewall.sh
gedit /home/vpn-firewall.sh


В открывшемся окне впишите:

#!/bin/sh
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/ip_dynaddr
iptables --flush
iptables --delete-chain
iptables --table nat --flush
iptables --table nat --delete-chain
iptables -P FORWARD ACCEPT
modprobe iptable_nat
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
iptables --table nat --append POSTROUTING --out-interface ИМЯ ВАШЕГО ИСХОДЯЩЕГО ИНТЕРФЕЙСА например eth0 -j MASQUERADE
echo vpn firewall loaded OK.


Пропишите этот скрипт в автозагрузку отредактировав файл /etc/rc.local
Должно получится следующее:

Код:

#!/bin/sh -e
/home/vpn-firewall.sh
exit 0

Запустите скрипт фаервола, он должен написать ”vpn firewall loaded OK.”

Код:
/home/vpn-firewall.sh

На этом настройка закончена, можете настраивать windows клиенты, никаких особенных параметров не требуется, просто создаете подключение vpn с адресом вашего сервера, на вкладке ”Безопасность” нужно снять галочку с пункта ”Требуется шифрование данных (иначе отключаться)”, а так же логином и паролем которые вы вписали в конфигурационный файл.

воскресенье, 14 февраля 2010 г.

Восстановление grub в Ubuntu после установки Windows

Для восстановления Grub нам понадобится диск, с которого вы ставили Ubuntu, чтобы зайти в режим LiveCD.
Загрузились, открыли терминал и выполняем следующую команду:
sudo grub
Мы зашли в программу работы с grub, все последующие действия будем выполнять здесь.

Для начала выполним команду:
find /boot/grub/stage2
Обратите внимание на значение, которое выдаст результат команды.

У меня это (hd0,5), но у вас может быть и что-нибудь другое.
В следующих командах подставляем ваше значение вместо (hd0,5) !
Выполняем команду:
root (hd0,5)
Обратите особое внимание на то, что после root идет пробел, а потом никаких пробелов нет.

Ну и последняя команда:
setup (hd0)
После setup идет пробел, потом пробелов нет. На этот раз вместо (hd0,5) пишем только первую часть: (hd0)! Естественно, подставляем то значение, которое вы получили после команды find.
Вот собственно и все. Можно перегружаться. Все легко и просто.

четверг, 4 февраля 2010 г.

Шлюз для 2-х сетевых Ubuntu

Схема такая. Сетевая eth0 тянет Интернет с роутера, eth1 - идет в локалку. В локальной сети у машинки ip 192.168.2.0

Ставим DHCP - сервер

sudo apt-get install dhcp3-server

После чего правим конфиг /etc/dhcp3/dhcp.conf я привел его вот к такому виду
subnet 192.168.2.0 netmask 255.255.255.0 {
option routers 192.168.2.2; #getway
option subnet-mask 255.255.255.0; #маска
option domain-name-servers 192.168.1.1; #DNS-сервера
range 192.168.2.11 192.168.2.100; # Диапазон ip адресов
default-lease-time 21600;
max-lease-time 28800;
}

затем правим файл /etc/default/dhcp3-server вписывая в него строку
INTERFACES=eth1
для того, что бы сервер «слушал» именно этот интерфейс
После чего можем запустить сервер
sudo /etc/init.d/dhcp3-server start
Для “раздачи” интернет во внутреннюю сеть используем IP маскарадинг (IPMASQUARADE)
В сокращенном виде (без комментариев и не функциональных выводов сообщений) скрипт выглядит так:
#!/bin/sh
# полная версия находится здесь: lafox.net/docs/masq/
IPTABLES=/sbin/iptables
DEPMOD=/sbin/depmod
MODPROBE=/sbin/modprobe
EXTIF="eth0"
INTIF="eth1"
$DEPMOD -a
$MODPROBE ip_tables
$MODPROBE ip_conntrack
$MODPROBE ip_conntrack_ftp
$MODPROBE ip_conntrack_irc
$MODPROBE iptable_nat
$MODPROBE ip_nat_ftp
$MODPROBE ip_nat_irc
echo "1" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv4/ip_dynaddr
$IPTABLES -P INPUT ACCEPT
$IPTABLES -F INPUT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -F OUTPUT
$IPTABLES -P FORWARD DROP
$IPTABLES -F FORWARD
$IPTABLES -t nat -F
$IPTABLES -A FORWARD -i $EXTIF -o $INTIF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -i $INTIF -o $EXTIF -j ACCEPT
$IPTABLES -A FORWARD -j LOG
$IPTABLES -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE
echo -e "done.\n"

Сохраним это в файлик в /etc/profile.d и назовем его, к примеру masq.sh.
Делаем его исполняемым и выполняем
sudo chmod +x /etc/profile.d/masq.sh
sudo sh /etc/profile.d/masq.sh

После этих действий нужно «опустить» а потом снова «поднять» сетевой интерфейс eth1
sudo ifonfig eth1 down
sudo ifonfig eth1 up

После чего клиенты смогут получать IP адреса и пользоваться инетом )))

Установка и настройка SSH сервера на Ubuntu

To install openssh server type following command:
$ sudo apt-get install openssh-server
Make sure openssh is running:
$ netstat -tulpn
Output:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp6       0      0 :::22                   :::*                    LISTEN     3458/sshd
Now we will tight openssh security. First change default 22 port to something else like 512. This will avoid automated tools login into your box:

$ sudo su -
# vi /etc/ssh/sshd_config


Find line that read as follows:
Port 22
Replace port 22 with 512:
Port 512
Save and close the file. Restart sshd:
# /etc/init.d/ssh restartOutput:
 * Restarting OpenBSD Secure Shell server... 
Finally make sure you open port 512 using iptables. Type the following command to list current firewall rules:
$ sudo iptables -L -n
Output:
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpts:6881:6882
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:443
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:514
ACCEPT     all  --  192.168.1.100        0.0.0.0/0
ACCEPT     all  --  192.168.1.101        0.0.0.0/0
ACCEPT     all  --  192.168.1.102        0.0.0.0/0
LOG        all  --  0.0.0.0/0            0.0.0.0/0           LOG flags 0 level 4
DROP       all  --  0.0.0.0/0            0.0.0.0/0         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination       

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
Use GUI program such as firestarter to manage and open port 22 (ssh port).
$ sudo firestarter &

вторник, 19 января 2010 г.

Несколько веселых вещей для работы с djvu и pdf

Столкнулся тут с проблемой. Надо перегнать было djvu файл в pdf. В принципе, djvu более компактный... Да и для иксовских читалок особой разницы нет что читать. Но проблема осталась проблемой. В итоге было откопано 2 решения.

  1. Распечатать djvu на виртуальном pdf принтере.
  2. Перегнать через формат *.ps
Первый вариант самый что ни на есть шустрый и понтовый... Аж даже недостатков никаких нет. Что есть гут =)

Второй вариант состоит из двух последовательных этапов.

  1. Конвертнуть djvu в ps командой
    djvups
  2. Перебить ps в pdf командой
    ps2pdf

Метод сразу скажу долгий и муторный (уже часа три сижу и все никак не могу закончить добивать пятиметровый учебник)...

Ну и немного о местами полезных примочках...

Как разобрать pdf на картинки?

Командой
pdfimages


Как разбить djvu на отдельные картинки?

Тут поможет небольшой скрипт, исходники которого я нагло скоммуниздил с какого-то форума

#!/bin/sh
# djvu -> jpgs converter

i=1

# number of pages (392)
while [ $i -ne 392 ]
do
ddjvu -page=$i -format=pnm 1.djvu $i.pnm
pnmtojpeg $i.pnm > $i.jpg
rm -f $i.pnm
echo "page $i done"
i=`expr $i + 1`
done

четверг, 14 января 2010 г.

Запись аудиопотока (интернет радио) в Ubuntu


Занялся я тут как то этим вопросом и откопал изящное и красивое решение - streamripper

Устанавливает тривиально

sudo apt-get install streamripper
 


Пользоваться еще проще. Если напрямую не видим потока, то сохраняем плейлист, который предлагает радиостанция. К примеру возьмем радиостанцию sunfm (радиостанция выбрана мною случайно)

там я выбрал направление музыки Drum&Base (даже не спрашивайте почему.. глупый вопрос)  и первый попавшийся плейлист http://sanfm.ru/drum.pls


Открыв его с помощью любого текстового редактора (gedit например) видим примерно следующее


[playlist]

File1=http://sanfm.ru:8000/drum
Title1=SanFM.ru Drum'n'bass Stream hosted by SanFM.ru
Length1=-1

File2=http://81.177.16.221:8000/drum
Title2=SanFM.ru Drum'n'bass Stream hosted by SanFM.ru
Length2=-1

File3=http://sunfm.ru:8000/drum
Title3=SanFM.ru Drum'n'bass Stream hosted by SunFM.ru
Length3=-1

File4=http://rufm.ru:8000/drum
Title4=SanFM.ru Drum'n'bass Stream hosted by RuFM.ru
Length4=-1

File5=http://sanfm.ru:8000/drum
Title5=SanFM.ru Drum'n'bass Stream hosted by SanFM.ru
Length5=-1

NumberOfEntries=5

Version=2

жирным я выделил интересующий нас текст. это и есть поток. затем запускаем streamripper


streamripper http://sanfm.ru:8000/drum


теперь весь поток будет сохраняться в текущей папке, разбиваясь по трекам. если хотим чтобы сохранялось в какой-то иной папке, то запускам стримриппер с параметром -d


streamripper http://sanfm.ru:8000/drum -d ./music


и также есть возможность прослушивать при этом то что рипается.. для этого надо запустить streamripper с параметром -r   который будет создавать локальную трансляцию на порту 8000   то есть всего то надо открыть http://localhost:8000   в любимом   прои проигрывателе