Metrika

28 января 2011 г.

Определение высоты документа для любого браузера

function getDocHeight() {
    var D = document;
    return Math.max(
        Math.max(D.body.scrollHeight, D.documentElement.scrollHeight),
        Math.max(D.body.offsetHeight, D.documentElement.offsetHeight),
        Math.max(D.body.clientHeight, D.documentElement.clientHeight)
    );
}

Если высота документа меньше высоты видимой области окна, то будет возвращена высота видимой области окна.

Взято здесь.

27 января 2011 г.

Доступ к MySQL через SSH-туннель в .NET

Как то мне очень надо было реализовать такую возможность, вот нашел статью: Access MySQL Through SSH Tunnel in a Windows .NET Application, к сожалению ссылка перестала работать, поэтому пришлось поискать в своем старом коде.

Я его давно не запускал, но, думаю, он направит в нужном направлении. Для работы нужна библиотека: http://www.tamirgal.com/blog/page/SharpSSH.aspx , там можно качнуть ее в исходниках или в бинарниках. Ссылки в глаза не бросаются, поэтому даю тут ссылку на бинарник: SharpSSH-1.1.1.13.bin.zip

Далее привожу код консольного приложения, которое соединяется с MySQL через SSH-тунель:
 
using System;
using System.Collections.Generic;
using System.Text;

using Tamir.SharpSsh.jsch;
using MySql.Data.MySqlClient;

namespace TestSSHTunnel
{
    class Program
    {
        static void Main(string[] args)
        {
            Session session;
         MySqlConnection conn = null;

            try
      {
       //Create a new JSch instance
       JSch jsch = new JSch();//Create a new SSH session
                string host = "u196.ssh.masterhost.ru"; //url
       string user = "ssh_user"; //ssh username
       string pass = "ssh_pswd"; //ssh password
       int sshPort = 22; //ssh port
                int rPort = 3306;
                int lPort = 3306; 

                session = jsch.getSession(user, host, sshPort);
       session.setHost(host);
       session.setPassword(pass);
       UserInfo ui = new MyUserInfo();
       session.setUserInfo(ui);
       session.connect();
     
       // Set port forwarding on the opened session
                session.setPortForwardingL(lPort, "u196.mysql.masterhost.ru", rPort);
                
       if (session.isConnected())
       {
        try
        {
                        string dbhost = "localhost";
                        string dbuser = "db_user";
                        string dbpass = "db_pswd";
                        string dbdatabase = "db_name";
         string connStr = String.Format("server={0};user id={1}; password={2}; database={3}; pooling=false",
          dbhost, dbuser, dbpass, dbdatabase);
     
         // Create a MySql Connection
         conn = new MySqlConnection(connStr);
         conn.Open();
         conn.ChangeDatabase(dbdatabase);
        }
        catch (Exception ex)
        {
         Console.WriteLine(ex.Message);
         session.disconnect();
        }
        finally
        {
         conn.Close();
        }
       }
      }
      catch (Exception ex)
      {
       Console.WriteLine(ex.Message);
      }
        }
    }

    public class MyUserInfo : UserInfo
    {
        /// 
        /// Holds the user password
        /// 
        private String passwd;

        /// 
        /// Returns the user password
        /// 
        public String getPassword() { return passwd; }

        /// 
        /// Prompt the user for a Yes/No input
        /// 
        /// 
        /// 
        public bool promptYesNo(String str)
        {
            return true;
        }

        /// 
        /// Returns the user passphrase (passwd for the private key file)
        /// 
        /// 
        public String getPassphrase() { return null; }

        /// 
        /// Prompt the user for a passphrase (passwd for the private key file)
        /// 
        /// 
        /// 
        public bool promptPassphrase(String message) { return true; }
        
        /// 
        /// Prompt the user for a password
        /// 
        /// 
        /// 
        public bool promptPassword(String message) { return true; }

        /// 
        /// Shows a message to the user
        /// 
        /// 
        public void showMessage(String message) { }

    }
}

Еще тогда, когда мне нужно было решить эту проблему, я нашел библиотеку http://granados.sourceforge.net/ , но по каким-то причинам от нее отказался. Тут http://social.msdn.microsoft.com/Forums/en-US/e554ebc5-7b74-415f-8ac8-d5dc3dcaf1c5/looking-for-granados-ssh-example?forum=netfxnetcom вроде бы описывается как с ней работать.

Проблема с событием onload в объекте Image в браузере Opera

Наткнулся на проблему при использовании плагина для jQuery lightbox 0.5. В Opera 11.00 - при нажатии на ссылку, которая должна отобразить фотографию, открывался оверлей, но фотография не отображалась. Если закрыть оверлей и снова нажать на туже ссылку, то фотография отображалась нормально.
Начал копаться в коде lightbox. Выяснил, что проблема в том, что в функции _set_image_to_view() из файла jquery.lightbox-0.5.js устанавливается обработчик события onload на объект Image, внутри обработчика выполняется отображение фотографии:
objImagePreloader.onload = function () {
                $('#lightbox-image').attr('src', settings.imageArray[settings.activeImage][0]);
                // Perfomance an effect in the image container resizing it
                _resize_container_image_box(objImagePreloader.width, objImagePreloader.height);
                //    clear onLoad, IE behaves irratically with animated gifs otherwise
                objImagePreloader.onload = function () { };
            };
Но после загрузки фотографии обработчик onload не запускается.
Поскольку в других браузерах все работало отлично, понял, что проблема в Opera. Погуглив нашел несколько постов в форумах на эту тему:
Решения не нашел, поэтому сделал такую заплатку: в функцию  _set_image_to_view() из файла jquery.lightbox-0.5.js после строк:
            // Image preload process
            var objImagePreloader = new Image();
           
            objImagePreloader.onload = function () {
                $('#lightbox-image').attr('src', settings.imageArray[settings.activeImage][0]);
                // Perfomance an effect in the image container resizing it
                _resize_container_image_box(objImagePreloader.width, objImagePreloader.height);
                //    clear onLoad, IE behaves irratically with animated gifs otherwise
                objImagePreloader.onload = function () { };
            };

            objImagePreloader.src = settings.imageArray[settings.activeImage][0];

добавил:

            if (window.opera) {
                var ver = window.opera.version();
                if (ver == '11.00' || ver == '11.01' || ver == '7.50' || var == '7.54') {
                    ___pause(1000);
                    objImagePreloader.onload();
                }
            }

Функция  ___pause определена в файле jquery.lightbox-0.5.js. Значение задержки надо подобрать в зависимости от скорости загрузки фотографий. В общем 100% результат не гарантирован, т.к. скорость загрузки всегда разная.
Решение не очень красивое, но другого не придумал :)

21 января 2011 г.

SSRS 2008: Добавление параметров к отчету

Что бы добавить в отчет параметры, нужно открыть окно Report Data, для этого надо сначала левой кнопкой мышки тыкнуть в области редактирования отчета, а потом нажать Ctrl-Alt-D или через меню View -> Report Data.  Если фокус ввода имеет другое окно, например окно Proprties, то в меню View не будет Report Data и сочетание клавиш Ctr-Alt-D работать не будет.
Я раньше работал с SSRS 2005, в первый раз, когда стал делать отчет в SSRS 2008, я 10 минут искал, как добавить параметры - это жесть!!! Я был просто в шоке, как так можно было сделать интерфейс. В общем, Мелкомягкие жгут!

14 января 2011 г.

T-SQL: Размер таблиц в БД

Скрипт отображает следующие колонки:
  1. name - название таблицы;
  2. rows - количество строк в таблице;
  3. reserved - место, которое выделено под таблицу;
  4. data - место, которое занимают данные в таблице;
  5. index_size - место, которое занимают индексы таблицы
  6. unused - место, которое пока не используется
Все размеры в мегабайтах.

create table #t
(
    name varchar(500),
    rows bigint,
    reserved varchar(50),
    data varchar(50),
    index_size varchar(50),
    unused varchar(50)
)

declare @t_name varchar(500)
DECLARE t_cursor CURSOR
    FOR select name from sysobjects where xtype = 'U' order by name
OPEN t_cursor
FETCH NEXT FROM t_cursor INTO @t_name;

WHILE @@FETCH_STATUS = 0
BEGIN
    insert into #t exec sp_spaceused @t_name
    FETCH NEXT FROM t_cursor INTO @t_name;
END
CLOSE t_cursor;
DEALLOCATE t_cursor;

select name, rows, cast(left(reserved, len(reserved)-2) as bigint)/1024.0 reserved,
    cast(left(data, len(data)-2) as bigint)/1024.0 data, cast(left(index_size, len(index_size)-2) as bigint)/1024.0 index_size,
    cast(left(unused, len(unused)-2) as bigint)/1024.0 unused
from #t order by reserved desc

12 января 2011 г.

T-SQL: SELECT и EXEC

Иногда хочется манипулировать с данными, которые возвращает хранимая процедура, как с обычной таблицей, но вот так:
SELECT * FROM EXEC sp_temp
не работает.

Варианта 2:

1. Создать таблицу:
CREATE TABLE temp ( ... )
И потом выполнить INSERT:
INSERT INTO temp EXEC sp_temp
2. Воспользоваться  командой OPENROWSET:
SELECT * FROM OPENROWSET('SQLOLEDB','server_name';'user_name';'password','EXEC sp_temp') AS a
Здесь мне нужно было взять некоторые название таблиц с линкованного сервера и вставить их в таблицу, мне удобнее было воспользоваться OPENROWSET:
INSERT INTO _tables (name, server_id)
SELECT table_name, 1
FROM OPENROWSET('SQLOLEDB','server_name';'user_name';'password',
    'EXEC sp_tables_ex  @table_server = ''server_name'',  @table_catalog = ''db_name'',  @table_type = ''TABLE''') AS a
WHERE table_name LIKE '%daily_log%'
ORDER BY table_name

T-SQL: Получение списка таблиц с линкованного сервера

Используется хранимая процедура sp_tables_ex

Пример: 

EXEC sp_tables_ex  @table_server = 'server_name',  @table_catalog = 'db_name',  @table_type = 'TABLE'

В статье T-SQL: SELECT и EXEC можно почитать про то, как работать с данными, которая возвращает хранимая процедура с помощью команды SELECT.