суббота, 14 сентября 2013 г.

Управление размерами окон колесиком мыши (в openbox)

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

Решение:

В файл настроек openbox rc.xml в секцию
<mouse>
<context name="Frame">

Вставить следующее:

Изменения размера окна по ширине и высоте, зажав клавишу win
<mousebind button="W-Up" action="Click">
 <action name="ResizeRelative">
   <top>5</top>
   <bottom>5</bottom>
   <left>5</left>
   <right>5</right>
 </action>
</mousebind>
<mousebind button="W-Down" action="Click">
 <action name="ResizeRelative">
   <top>-5</top>
   <bottom>-5</bottom>
   <left>-5</left>
   <right>-5</right>
 </action>
</mousebind>

Изменения размера окна только по высоте, зажав клавишы Win+Shift
<mousebind button="W-S-Up" action="Click">
 <action name="ResizeRelative">
   <top>5</top>
   <bottom>5</bottom>
   <left>0</left>
   <right>0</right>
 </action>
</mousebind>
<mousebind button="W-S-Down" action="Click">
 <action name="ResizeRelative">
   <top>-5</top>
   <bottom>-5</bottom>
   <left>0</left>
   <right>0</right>
 </action>
</mousebind>
Изменения размера только по ширине, зажав клавишу win+ctrl
<mousebind button="W-C-Up" action="Click">
  <action name="ResizeRelative">
    <top>0</top>
    <bottom>0</bottom>
    <left>5</left>
    <right>5</right>
  </action>
</mousebind>
<mousebind button="W-C-Down" action="Click">
 <action name="ResizeRelative">
   <top>0</top>
   <bottom>0</bottom>
   <left>-5</left>
   <right>-5</right>
 </action>
</mousebind>

понедельник, 1 апреля 2013 г.

Виртуальные рабочие столы на Windows!

Утилита переключение виртуальных рабочих столов в Windows

Подробно тут: http://technet.microsoft.com/en-us/sysinternals/cc817881.aspx

Настройки:


Как это выглядет:


понедельник, 4 марта 2013 г.

div прозрачный для событий

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

Для реализации прозрачного для событий слоя есть CSS свойство:
pointer-events: none;
Подробно тут:
https://developer.mozilla.org/en-US/docs/CSS/pointer-events

воскресенье, 17 февраля 2013 г.

Необычная страница авторизации

Страница авторизации, где логин и пароль нужно составлять из элементов.


А реализация простая:

Создаем файл login.php в который добавим поля Логин, Пароль, кнопку "Войти"  и табло с символами:

<div style="position: absolute; left:50%; margin-left:-310px; width:620px; height:400px; top:50%; margin-top:-225px; padding:20px; border-radius: 5px; border:1px solid #cdcdcd">
<center>Составьте логин и пароль, перетаскивая символы в поля <b>Логин</b> и <b>Пароль</b><br>
<div style="width:370px;">
<div style="padding:5px; width:70px; float:left;">Логин </div><div id="login" style=" float:left;margin:5px;width:250px; padding:5px; height:30px; border:1px solid #d0d0d0; background-color: #f6f6f6" class="connectedSortable"></div>
<div style="padding:5px; width:70px; clear:both;  float:left;">Пароль </div><div id="password" style=" float:left;margin:5px;width:250px; padding:5px; height:30px; border:1px solid #d0d0d0; background-color: #f6f6f6" class="connectedSortable"></div>
<div style="padding:5px;clear:both"><input name="submit" type="button" value="Войти" onclick="inlogin()"> </div>
</div>
<div id="connect" style="margin:5px;width:470px; padding:5px; height:180px; border:1px solid #d0d0d0; background-color: #e0e0e0" class="connectedSortable">
<?
$mas = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,!,@,#,$,%,^,&,*,(,),_,-,+,=,~";
$mas = explode(",",$mas);
for($i=0; $i<count($mas); $i++) {
if($i == "13" || $i == "26" || $i == "39") { $cl =  "clear:both;";} else {$cl ="";}
 echo "<div id='".$i."' class='ui-state-default' style='cursor: hand; border-radius:15px; background-color: white; border:1px solid #d0d0d0; width:20px; height:20px; padding:5px; text-align: center; margin: 2px; float:left;'>".$mas[$i]."</div>";
}

?>
</div>
<div id="error"></div>
</center>
</div>

Добавим ему javascript'ов (подключим sortable и функцию обработки кнопки "Войти")


<link rel="stylesheet" href="css/jquery-ui-1.8.13.custom.css" type="text/css" />
<script src="js/jquery-1.5.1.min.js" type="text/javascript"></script>
<script src="js/jquery-ui-1.8.14.custom.js" type="text/javascript"></script>



<script type="text/javascript">
$(function() {
  $(".connectedSortable").sortable({
  connectWith: ".connectedSortable",
  placeholder: "ui-state-highlight",
  helper: "clone",
  cursor: 'move',
 zIndex: 99999,
 update: function() {
imgOrder = $(this).sortable('toArray').toString();
ik = $(this).attr('id');
$.post  ( "rlogin.php",  { c : imgOrder, id: ik }, function(data) {} );
}
 });
});
function inlogin()
{
//$.post  ( "checklogin.php",  { submit : "submit" }, function(data) {} );
$.ajax({
type: "POST",
                    url: "checklogin.php",
                    data: "submit=submit",
                    success: function(html){
   if(html=="ok") {
$("#error").html("Все верно!");
setTimeout( function() { location.href='http://dom.ru/adm/check.php'; }, 1500 );
}
   else {
                        $("#error").html(html);
setTimeout( function() { $("#error").html(""); }, 3000);
}
                    }
                });
}
 </script>

Файл checklogin.php - проверяем составленные Логин и Пароль

<?
session_start();
/* Create by Kostrukov Alexey */
function generateCode($length=6) {
    $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHI JKLMNOPRQSTUVWXYZ0123456789";
    $code = "";
    $clen = strlen($chars) - 1;
    while (strlen($code) < $length) {
            $code .= $chars[mt_rand(0,$clen)];
    }
    return $code;
}
unset($_SESSION['userid']);
unset($_SESSION['userhash']);
# Соединямся с БД
include("settings.inc");
$dbhandle = mysql_connect($hostname, $username, $password) or die("Unable to connect to MySQL");
$selected = mysql_select_db($bdname,$dbhandle) or die("Could not select examples");
mysql_set_charset($charset,$dbhandle);
if(isset($_POST['submit']))
{
$ulogin = $_SESSION['rlogin']['login'];
$upaswd = $_SESSION['rlogin']['password'];
$mas = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,!,@,#,$,%,^,&,*,(,),_,-,+,=,~";
$mas = explode(",",$mas);
for($i=0; $i<count($ulogin); $i++) {
$u_login .= $mas[$ulogin[$i]];
}
for($i=0; $i<count($upaswd); $i++) {
$u_paswd .= $mas[$upaswd[$i]];
}
    # Вытаскиваем из БД запись, у которой логин равняеться введенному
    $query = mysql_query("SELECT user_id, user_password FROM ".$_ENGINE['pref']."users WHERE user_login='".mysql_real_escape_string($u_login)."' LIMIT 1");
    $data = mysql_fetch_assoc($query);
   
    # Сравниваем пароли
    if($data['user_password'] === md5(md5($u_paswd)))
    {
        # Генерируем случайное число и шифруем его
        $hash = md5(generateCode(10));
           
        if(!@$_POST['not_attach_ip'])
        {
            # Если пользователя выбрал привязку к IP
            # Переводим IP в строку
            $insip = ", user_ip=INET_ATON('".$_SERVER['REMOTE_ADDR']."')";
        }
       
        # Записываем в БД новый хеш авторизации и IP
        mysql_query("UPDATE ".$_ENGINE['pref']."users SET user_hash='".$hash."' ".$insip." WHERE user_id='".$data['user_id']."'");
       
        # Ставим куки
        setcookie("id", $data['user_id'], time()+60*60*24*30);
        setcookie("hash", $hash, time()+60*60*24*30);
       
        # Переадресовываем браузер на страницу проверки нашего скрипта
        print "ok";
    }
    else
    {
        print "Вы ввели неправильный логин/пароль";
    }
}
?> 

Файл rlogin.php - записывает все изменения, при составлении Логина и Пароля.
<?php
session_start();
/* Create by Kostrukov Alexey */
$arr = explode(',', $_POST['c']);
$id = $_POST['id'];
include("settings.inc");
unset($_SESSION['rlogin'][$id]);
for($i=0; $i<count($arr); $i++) {
$y=$i+1;
$_SESSION['rlogin'][$id][] = $arr[$i];
}
?> 

Дополнительная защита. файл check.php
<?
session_start();
include("settings.inc");
$dbhandle = mysql_connect($hostname, $username, $password) or die("Unable to connect to MySQL");
$selected = mysql_select_db($bdname,$dbhandle) or die("Could not select examples");
mysql_set_charset($charset,$dbhandle);
if (isset($_COOKIE['id']) and isset($_COOKIE['hash']))
{  
    $query = mysql_query("SELECT *,INET_NTOA(user_ip) FROM users WHERE user_id = '".intval($_COOKIE['id'])."' LIMIT 1");
    $userdata = mysql_fetch_assoc($query);
    if(($userdata['user_hash'] !== $_COOKIE['hash']) || ($userdata['user_id'] !== $_COOKIE['id']) )
    {
        setcookie("id", "", time() - 3600*24*30*12, "/");
        setcookie("hash", "", time() - 3600*24*30*12, "/");
        print "Хм, что-то не получилось";
    }
    else
    {
    unset($_SESSION['rlogin']);
$userid = $_COOKIE['id'];
$userhash = $_COOKIE['hash'];
$username = $userdata['user_login'];
session_register('userid','userhash','username');
header("Location: http://dom.ru/adm/index.php");
    }
}
else
{
    print "Включите куки";
}
?> 

четверг, 24 января 2013 г.

Настройка отправки почты с сайта

Для того что бы с сервера приходили письма не от имени www-data, а например от no-replay@домен.ру, нужно следующее:

в файле
 /etc/php5/apache2/php.ini

находим секцию
sendmail_path = '/usr/sbin/sendmail -t 
и меняем ее на
sendmail_path = '/usr/sbin/sendmail -t -i -fno-reply@my.domain.com -Fno-reply'

Если хотите отправлять почту с использованием exim4, то меняем строку:


sendmail_path = /usr/sbin/exim4 -t -i -fno-reply@my.domain.com -Fno-reply

Как выглядел исходник письмо

ДО изменений:

Delivered-To: alex.kostrukov@gmail.com
Received: by 10.14.95.7 with SMTP id o7csp83458eef;
Thu, 24 Jan 2013 04:07:53 -0800 (PST)
X-Received: by 10.152.144.38 with SMTP id sj6mr1578233lab.48.1359029273462;
Thu, 24 Jan 2013 04:07:53 -0800 (PST)
Return-Path: <www-data@my.domen.com>
Received: from my.domen.com ([144.76.4.246])
by mx.google.com with ESMTPS id l8si26588559eem.225.2013.01.24.04.07.53
(version=TLSv1 cipher=RC4-SHA bits=128/128);
Thu, 24 Jan 2013 04:07:53 -0800 (PST)
Received-SPF: neutral (google.com: 144.76.4.246 is neither permitted nor denied by best guess record for domain of www-data@my.domen.com) client-ip=144.76.4.246;
Authentication-Results: mx.google.com;
spf=neutral (google.com: 144.76.4.246 is neither permitted nor denied by best guess record for domain of www-data@my.domen.com) smtp.mail=www-data@my.domen.com
Received: from www-data by my.domen.com with local (Exim 4.72)
(envelope-from <www-data@my.domen.com>)
id 1TyLav-0004zQ-Ks
for alex.kostrukov@gmail.com; Thu, 24 Jan 2013 16:07:49 +0400
Date: Thu, 24 Jan 2013 16:07:49 +0400
Message-Id: <E1TyLav-0004zQ-Ks@my.domen.com>
To: alex.kostrukov@gmail.com
Subject: тема письма
X-PHP-Originating-Script: 33:mail.php
From: ot.kogo@mail.ru
тело письма

ПОСЛЕ изменений

Delivered-To: alex.kostrukov@gmail.com
Received: by 10.14.95.7 with SMTP id o7csp84047eef;
Thu, 24 Jan 2013 04:20:54 -0800 (PST)
X-Received: by 10.14.184.134 with SMTP id s6mr5724235eem.43.1359030053936;
Thu, 24 Jan 2013 04:20:53 -0800 (PST)
Return-Path: <no-reply@my.domen.com>
Received: from my.domen.com ([144.76.4.246])
by mx.google.com with ESMTPS id n5si41266875eeo.165.2013.01.24.04.20.53
(version=TLSv1 cipher=RC4-SHA bits=128/128);
Thu, 24 Jan 2013 04:20:53 -0800 (PST)
Received-SPF: neutral (google.com: 144.76.4.246 is neither permitted nor denied by best guess record for domain of no-reply@my.domen.com) client-ip=144.76.4.246;
Authentication-Results: mx.google.com;
spf=neutral (google.com: 144.76.4.246 is neither permitted nor denied by best guess record for domain of no-reply@my.domen.com) smtp.mail=no-reply@my.domen.com
Received: from www-data by my.domen.com with local (Exim 4.72)
(envelope-from <no-reply@my.domen.com>)
id 1TyLnZ-00050o-43
for alex.kostrukov@gmail.com; Thu, 24 Jan 2013 16:20:53 +0400
Date: Thu, 24 Jan 2013 16:20:53 +0400
Message-Id: <E1TyLnZ-00050o-43@my.domen.com>
To: alex.kostrukov@gmail.com
Subject: тема письма
X-PHP-Originating-Script: 33:mail.php
From: ot.kogo@mail.ru
тело письма




четверг, 17 января 2013 г.

удаленный запуск команд putty ssh

Для того что бы запустить команду на удаленном сервере ssh использую PUTTY

Создадим файл комманд, назовем command.txt

например нужно перезапустить pppoe соединения:

sudo poff -a
sleep 200
sudo pon dsl-provider
sudo plog
sleep 10

Создаем bat-файл, следующего содержания:
d:\putty\putty.exe -ssh -l LOGIN -pw PASSWD -P 22 -m ПУТЬ\ДО\command.txt АДРЕС_СЕРВЕРА_SHH 

пятница, 11 января 2013 г.

Конвертер офисных документов в jpg

Идея:
создать в сети общую папку, в которую могли бы копировать файлы:
PDF, XLS, ODS, ODT, DOC, DOCX, XLSX, PPT

и тут же получать эти файлы в формате JPG

Решение:

1.Создаем скрипт all2jpg

#!/bin/bash
sstr=`echo $1 | sed 's/\./\_/g'`
DIR=/home/user/share/
{
echo "File: $i"
case "$1" in
*.pdf)
convert "$DIR/$1" "$DIR/$sstr.jpg" >> /dev/null 2>&1
sleep 5
rm "$DIR/$1"
;;
*.doc| *.odt| *.ods| *.xls| *.xlsx| *.doc| *.docx| *.ppt)
libreoffice3.6 --headless --convert-to pdf "$DIR/$1"  --outdir "$DIR"
sleep 6
rm "$DIR/$1"
;;
esac
}

2. Мониторинг появления файлов в директории /home/user/share/Сканы/

Для используется incron
sudo apt-get install incron
Добавляем правило в incron
incrontab -e 
/home/user/share/ IN_CREATE /home/user/scripts/all2jpg #$
Все, теперь при создании файла (указанных в скрипте расширений), скрипт будет запущен, и через некоторое время в место этого файла, появится файл jpg