понедельник, 25 апреля 2011 г.

Грамотно убиваем Backdoor.Win32.Shiz

Мой рабочий ноутбук поразил неизвестный мне вирус:) Знаете, ковырять вирусы для меня - это как решать некую головоломку или, скажем, японский кроссворд разгадывать. Весьма увлекательное занятие, стоит сказать!

На ноутбуке стоит корпоративный Symantec, который, как оказалось, не предоставляет должной защиты. Все началось с пресловутого подтормаживания компьютера. Зайдя в процессы, я увидел много незнакомых, и первая мысль была - проверить все незнакомые на virustotal.com, что я и сделал. Однако, тот молчал как рыба и уверенно указывал на отсутствие вредоносного кода в моих  запущенных приложениях. Кто не в курсе - Virustotal это бесплатный онлайн инструмент для проверки добросовестности любых ваших файлов: вы загружаете файл и система проверяет его множеством антивирусов, выводя отчет по каждому. Очень и очень полезный сервис для всех интересующихся информационной безопасностью.

Итак, вторая мысль - скачать on demand версию Kaspersky и drWeb (virus removal tool и cureIT соответственно). Virus removal tool и CureIT - бесплатные утилиты для удаления вирусов, не предоставляющие защиты в реальном времени, но использующие последние вирусные базы, это лучшее решение для лечения разного рода вредоносных программ и именно с них следует начинать.

Каково же было мое удивление, когда, вбив в поисковике kaspersky, я наблюдал стремительно закрывающийся браузер! Так, это что-то новенькое, проверим в другом... При попытке зайти на kaspersky.ru вылетели все установленные у меня версии браузеров - Chrome, IE, Opera, Firefox. Скачать бесплатную антивирусную утилиту AVZ также не удалось.

Меня эта уловка вирусописателей порядком порадовала, и я недолго думая пошел в обход - благо, что у меня есть свои сервера в интернете и я могу воспользоваться ими для выкачивания любых объектов из сети с целью последующей передачи на рабочий компьютер. Зайдя по SSH на сервер, я тремя командами загружаю на него необходимые утилиты:

wget avz
wget virus_removal_tool
wget cureIT

здесь вместо avz, virus_removal_tool и cureIT, разумеется, необходимо подставить URL адреса этих программ. Затем через SFTP я слил скачанные утилиты к себе на комп и продолжил головоломку:) Если вы ничего не знаете не знаете о серверах, unix'ах и wget, но попали в аналогичную ситуацию - просто скачайте названные утилиты с незараженного компьютера.

Тааак, устанавливаем касперского, запускаем... Хрен! Программа вылетает. Хм, это начинает казаться интересным. Лезу опять в процессы, пересматриваю их. Решаю убить explorer.exe - это оболочка windows, отвечающая за работу проводника, отрисовку меню ПУСК и т.д. Совершенно ненужная вещь в общем-то=).

При отключении explorer'а браузеры стали стабильно работать с сайтами антивирусных производителей - агааа! Вот ты где, красавчик наш:) Не запуская explorer, открываю касперского и запускаю проверку. Тот довольно быстро находит зараженные файлы, лечит их и перезагружает уже здоровый комп.

Вирус побежден. Не все уж так и сложно оказалось;)

Итак, мои советы по борьбе с Backdoor.Win32.Shiz:

  1. Запускаем браузер
  2. жмем WIN+R, вводим cmd и жмем Enter. Откроется окно командной строкой windows. Да, кто не в курсе - кнопка WIN - это клавиша на вашей клавиатуре в нижнем ряду с нарисованным флажком.
  3. ALT+CTRL+DELETE, вкладка Процессы. Находим explorer.exe, правой кнопкой мыши - завершить, соглашаемся. Пропала кнопка ПУСК и нижняя панель - это нормально, не пугаемся. Все вернется после перезагрузки или после применения описанных ниже действий.
  4. зажимаем ALT и жмем TAB несколько раз для переключения в окно браузера
  5. скачиваем антивирусные утилиты от Касперского и DrWeb (мне, впрочем, помог Virus removal tool и CureIT не понадобился)
  6. устанавливаем Virus removal tool (он не интегрируется в систему и, как правило, устанавливается в директорию на рабочем столе), запускаем его. Чтобы запустить, перейдите в окно командной строки и введите там полный адрес к установленной программе, в моем случае "d:\Documents and Settings\AGoloburdin\Рабочий стол\Virus Removal Tool\setup_9.0.0.722_25.04.2011_10-16\setup_9.0.0.722_25.04.2011_10-16.com". Если вы не знаете, в какое место поставилась программа - запустите explorer.exe, найдите программу и скопируйте путь до нее и затем остановите explorer.exe снова.

    Для запуска остановленного процесса в окне диспетчера задач нужно выбрать пункт меню Файл->Новая задача, в открывшемся окне ввести explorer.exe и назжать Ок, программа запустится. Для останова - выберите ее на вкладке Процессы, нажмите правой кнопкой мыши и выберите Завершить процесс.
  7. в запустившемся Virus removal tool жмем Начать проверку.
На этом все. Здоровых компьютеров вам:).

пятница, 22 апреля 2011 г.

Поднять proxy сервер за 2 минуты

Цель: максимально быстро поднять proxy сервер для HTTP(S) трафика. В примере используем Debian.

Решение: ставим и запускаем ffproxy:

sudo apt-get install ffproxy 
sudo /etc/init.d/ffproxy start

Ваш прокси уже доступен по ip адресу сервера и дефолтному порту 8080 - и если ничего больше вам не нужно, дальше можете не читать.

При необходимости, порт, на который прокси будет принимать соединения, можно изменить в конфигурационном файле /etc/ffproxy/ffproxy.conf. Например, port 3128.

Команды останова и рестарта сервера стандартны:

sudo /etc/init.d/ffproxy stop|restart

Чтобы разрешить подключение только из одной подсети или одного ip, необходимо подправить /etc/ffproxy/db/access.ip, введя регулярное выражение для принимаемых ip. Для разрешения подключения только одного адреса необходимо ввести ^195.0.0.1$, где 195.0.0.1 - адрес, с которого будет разрешено подключение. Знакомые с регулярными выражениями смогут без труда подправить адрес для приема соединений из подсети.

Есть необходимость организовать цепочку из прокси серверов для усложнения поиска действительного источника? Нет ничего проще - в конфигурационном файле /etc/ffproxy/ffproxy.conf добавьте параметры

forward_proxy 195.10.10.12
forward_proxy_port 8082

где forward_proxy и forward_proxy_port - ip и порт внешнего прокси сервера, с которого наш сервер будет запрашивать данные.

понедельник, 18 апреля 2011 г.

ExtJS проблемы в Internet Explorer

ExtJS, как гласит официальный сайт, является кроссплатформенным фреймворком для построения Rich Internet Application - "богатых интернет приложений", то есть, приложений, обладающих функциональностью обычных настольных программ. И это действительно так.

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

Нередко наблюдается, когда интерфейс отлично функционирует в Firefox, но даже не отрисовывается в Internet Explorer и браузер выдает многочисленные сообщения об ошибках.
Как правило, причина такого поведения заключается в разной реализации массивов Javascript. Известно, что в ExtJS для конфигурирования элементов используются исключительно объекты и массивы объектов, например:

vp = new Ext.Viewport({
    layout: 'border',
    renderTo: Ext.getBody(),
    items: [
        firstElement,
        secondElement,
        thirdElement
    ]
});

Здесь создается Viewport, элементами которого являются firstElement, secondElement и thirdElement - и этот код будет работать одинаково во всех заявленных разработчиками ExtJS реализациях браузеров. Однако, попробуйте выполнить этот код:

vp = new Ext.Viewport({
    layout: 'border',
    renderTo: Ext.getBody(),
    items: [
        firstElement,
        secondElement,
        thirdElement, // запятая
    ]
});

Internet Explorer выдаст ошибку. Проблема в реализации массивов Javascript: если после последнего элемента стоит запятая, IE считает, что в конце массива присутствует еще один, пустой, элемент. ExtJS пытается обработать этот элемент, но, так как он фактически пуст, генерируется ошибка.

Другие реализации Javascript (в Firefox, например) на запятую после последнего элемента массива внимания не обращают, однако завершать последний элемент запятой считается дурным тоном программирования.

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

Вторая проблема - использование в коде конструкции console.log() для вывода сообщений в консоль Firebug или Chrome. Internet Explorer, к сожалению, не имеет консоли как таковой, поэтому попытки ее использования генерируют ошибку; необходимо помнить, что после окончания тестирования и отладки интерфейса, если вы использовали вывод сообщений в консоль, их необходимо удалить или закомментировать. Впрочем, эта ошибка, в отличие от вышеописанной, легко определяется.

суббота, 16 апреля 2011 г.

Защита конфиденциальных данных

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

Хотите быть уверенными в том, что ваши данные не будут просмотрены третьими лицами - добро пожаловать. Вопрос защиты данных актуален, поэтому я хочу осветить этот вопрос подробно. Описанные методики кроссплатформенны и одинаково работают для всех.

Виды конфиденциальной информации


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

Хранение паролей и аутентификационной информации


Из-за специфики первого типа информации - а это, как правило, пара логин-пароль и, возможно, адрес ресурса - их удобно хранить в виде зашифрованной базы данных. Для этой цели лучше всего использовать программу KeyPass, поддерживающую современные алгоритмы шифронания (AES, Rijndael, Twofish), бесплатную и распространяемую с открытыми исходными кодами. Последний пункт в частности гарантирует отсутствие в программе различных backdoors, то есть скрытых способов доступа к данным без пароля, специально зашитых в программу. KeyPass кроссплатформен - есть версии для Windows, Linux, Mac OS и даже Android, что позволит пользоваться вашей базой паролей в любом месте и на любом компьютере. Стоит отметить, что есть портабельные версии программы, позволяющие работать, например, с флеш носителя без установки в систему.



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

Принцип работы с программой прост - вы создаете новую базу паролей (File -> New), вводите мастер-пароль и сохраняете файл с базой. Созданный файл и будет вашим контейнером паролей, который можно безопасно хранить. При открытии базы KeyPass попросит вас ввести мастер пароль, введя который, вы получаете доступ ко всей сохраненной внутри информации. Рекомендации по созданию паролей приведены в конце этой статьи, обязательно обратите на них внимание.

Также стоит отметить программу 1password. Это уже небесплатное решение (40$), однако, по-прежнему кроссплатформенное (Windows, Mac OS, IOS, Android) и очень удобное. 1password имеет возможность безопасно хранить помимо паролей заметки, контактные данные; умеет автоматически вставлять логины-пароли на сайтах, тесно интегрируясь с браузерами. Безусловно, эта программа стоит своих денег, однако я все же предпочитаю open source решение.

Хранение конфиденциальных документов


Распространенная ситуация: вам необходимо иметь при себе на флеш носителе некоторую важную информацию, кражу которой нельзя допустить. В такой ситуации нужно иметь в виду возможность потери носителя и соответственно кражи всей незащищенной информации. Та же ситуация возникает при переносе информации на ноутбуке. Впрочем, действительно важные документы необходимо защищать и на домашнем стационарном компьютере, и на рабочем.

Для решения этой задачи используются криптоконтейнеры. По сути, криптоконтейнер - это отдельный файл или целый раздел на диске, содержащий в себе в зашифрованном виде некоторые документы. Существует возможность создавать также скрытые разделы на диске.

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



Криптоконтейнер TrueCrypt подключается в системе как обычный логический диск. Вы открываете TrueCrypt, выбираете контейнер, вводите мастер-пароль или указываете файл-ключ и в вашей системе появляется дополнительный логический диск, с которым вы работаете как с обычным диском - создаете файлы, директории, изменяете их. Закончив работу, вы отмонтируете диск в TrueCrypt, нажав соответствующую кнопку; все сохранения уже сохранены в ваш криптоконтейнер.

Создание криптоконтейнеров


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

Если английский вам неприятен, то рекомендую перед началом работы с программой русифицировать ее, выбрав пункт меню Settings->Language и выбрав русский язык. Если его нет в списке - загрузите языковой пакет отсюда и скопируйте его в папку с установленным TrueCrypt (например, C:\Program Files\TrueCrypt).

Для создания криптоконтейнера необходимо провести ряд несложный действий:

  • жмем создать том;
  • указываем создать зашифрованный файловый контейнер;
  • выбираем обычный или скрытый том TrueCrypt (в обычных случаях достаточно обычного);
  • указываем размещение тома - файл криптоконтейнера, в котором впоследствии будут храниться документы;
  • выбираете алгоритм шифрования (можно оставить по умолчанию AES) и хеш-алгоритм (например, SHA-512);
  • размер тома - максимальный объем информации, который можно будет поместить в контейнер, столько же всегда будет весить файл-криптоконтейнер вне зависимости от наполнения;
  • задаем пароль от контейнера (можно также задать дополнительно ключевые файлы, которые впоследствии необходимо будет предоставить помимо пароля для работы с содержимым контейнера);
  • задаем файловую систему (можно оставить FAT);
  • жмем разметить и выход.


Чтобы подключить созданный ранее контейнер - жмем Файл, выбираем файл-контейнер, жмем смонтировать, вводим пароль, при необходимости указываем ключевой файл. В вашей системе появится новый диск с данными, с которыми вы можете работать как с обычными данными. По окончанию работы жмете в TrueCrypt Размонтировать и диск автоматически удалится из системы, все данные будут сохранены в зашифрованном виде в контейнере.

Теперь в случае потери файла-криптоконтейнера можно ни о чем не беспокоиться - ваша информация надежно защищена. Впрочем, если ваш мастер-пароль не слишком прост, о чем пойдет речь ниже.

О хороших паролях


В заключение повествования расскажу о том, что такое хороший пароль и почему пароль непременно должен быть хорошим.

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

Таким образом, для обеспечения достаточной безопасности необходимо использовать пароли, которые невозможно подобрать за разумное время. Это не должны быть значимые слова, они подбираются в первую очередь по специальным словарям.  В пароле должны присутствовать прописные и строчные буквы, цифры, специальные символы ($#!^&;,?). Длина должна быть не менее 8 символов, но всегда больше - лучше. Неплохим вариантом может быть, например, пароль из двух слов в разных регистрах, связанных специальными символами web?48deSign.

Пара слов о терморектальном криптоанализе


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

Безопасных документов вам!

четверг, 14 апреля 2011 г.

Рекомендации начинающим изучение Ext JS

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

Зачем


Ext JS позволяет писать сложные интерфейсы по-настоящему быстро, полностью соответствуя концепции RAD - Rapid Application Development. Не нужно заниматься html и css кодированием для разработки по-настоящему богатых функциональных интерфейсов, выполненных в едином стиле, вместо этого вы пишете несложный javascript код, выполняющий всю работу за вас.

Команда Ext JS создала целую коллекцию примеров (для 3й версии Ext JS) для ознакомления с основными возможностями фреймворка. Посмотрите, какие изящные конструкции вы сможете создавать минимальным количеством JS кода! Абсолютно все конфигурируется под себя, каждый элемент обладает огромным количеством событий (events), позволяющих реагировать на различные действия со стороны пользователя. Разработчикам удалось создать действительно очень и очень гибкий инструмент для построения классых веб интерфейсов.

Возможно, вы уже работали с некоторыми javascript фреймворками, например, JQuery или Prototype и уже используете их в своих проектах. Ext JS спроектирован таким образом, чтобы обеспечить возможность корректной работы и с другими фреймворками, таким образом, вы можете абсолютно спокойно оставить ваши наработки на JQuery и начать внедрять элементы Ext JS. Дело в том, что Ext JS осуществляет работу с DOM (Document Object Model, объектная модель документа) посредством так называемых адаптеров, причем в комплекте поставки уже есть 4 адаптера - родной ext, jquery, prototype и yui. Другими словами, фреймворк может использовать разные библиотеки для выборки элементов страницы, поэтому можно не беспокоться о совместимости и при желании продолжать пользоваться параллельно другим знакомым фреймворком.

С чего начать


Начать, пожалуй, следует с некоторых вводных статей о Ext JS. Для русскоязычного пользователя отличным вступлением может послужить небольшой цикл статей от techwork.ru. Обратите внимание, что в статьях описана третья версия, однако, прочитав этот материал, вы уже будете иметь общее представление о фреймворке и работе с ним.

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

Отличная книга - Learning Ext JS 3.2 (вот). В сети есть pdf в отличном качестве, который можно распечатать, почитать на мониторе/iPad'е/электронной книге.

В настоящий момент я пишу книгу Ext JS 4: разработка Rich Internet Applications на русском языке.

Разработчику


Безусловно, одним из наиболее часто используемых источников информации является официальная документация (для третьей версии Ext JS) по API Ext JS. Приведены все конфигурационные опции, в показательных случаях примеры использования - составленная весьма удобным образом, эта документация служит отличным справочным пособием любого Ext JS разработчика.

Выше я упоминал готовые примеры (для третьей версии Ext JS) использования фреймворка - чрезвычайно полезный инструмент, когда нужно быстро посмотреть, как реализуется какой-то функционал. К тому же, читать коды от самих разработчиков очень интересно и познавательно.

Официальные Tutorials (руководства) также являются зачастую хорошим источником для восполнения недостающих знаний.

В общем случае, для начала работы с Ext JS требуется не более 20 минут знакомства с документацией или литературой - потратьте это время и уже скоро сможете оценить всю мощь этого замечательного инструмента. Классных интерфейсов вам!

вторник, 12 апреля 2011 г.

Gmail tips & tricks

Что это?!

Начнем, пожалуй, с того, что я люблю GMail! Да-да, это действительно лучшее решение электронной почты на сегодняшний день. Ниже пойдет речь о том, почему я так считаю, также я расскажу о некоторых возможностях GMail, о которых вам наверняка будет интересно знать.

Итак, поехали!

Если у вас уже есть электронная почта не-gmail, то вы сейчас думаете - если я заведу еще одну почту, то мне придется каждый день проверять 2 ящика: мой старый и новый gmail. Подумаете - и будете правы! Но только не в случае использования gmail.

Во-первых, GMail умеет сам собирать почту из других почтовых сервисов. Если у вас несколько ящиков - воспользуйтесь этой функцией и, черт возьми, вы не поймете, как раньше обходились без нее! У меня несколько активных email адресов и читать всю почту в одном месте и в одном интерфейсе чрезвычайно круто, поверьте.

Настраивается эта функция без лишних плясок - Настройки, Аккаунты, Получать почту из других аккаунтов, Добавить свой почтовый аккаунт. В открывшемся окне вводим свой логин, пароль, адрес pop3 сервера (при желании отправлять почту с не-gmail ящика из единого интерфейса gmail - еще и smtp сервер) - и, собственно, все. Все письма старого ящика будут автоматически загружаться в gmail.

И целого мира адреса мало


Иногда возникает ситуация, когда одного адреса почты бывает мало. Банальный случай - вы хотите зарегистрироваться повторно на каком-то сайте, но создавать дополнительный ящик для этого не хотите. И здесь GMail приходит на помощь! Все адреса с точкой внутри логина в любом его  месте фактически являются одним адресом. Другими словами, все письма на vasya.pupkin@gmail.com, vasyapupkin@gmail.com, и даже v.a.s.y.a.pupk.in@gmail.com придут в один ящик. Пупкина не проведешь!

Обсуждения - диалогом


Письма в GMail отображаются в режиме диалога (как смс в iphone или android). Это значит, что конкретная переписка не разбросана по всему ящику, а сосредоточена в одном месте. Вам ответили  - вы видите весь ход обсуждения. В случае использования не-диалогового режима старое письмо длинной переписки приходится искать в гуще давних сообщений - если вам не приходилось этого делать, поверьте на слово, это ужасно.

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

Отлично, идем дальше.


GMail поддерживает темы, причем не какие-то непонятные страшные темы, а отличные дизайнерские шкурки для вашей почты. Мне, например, нравится тема "рабочий стол", но это дело вкуса, разумеется.

Метки и фильтры - друзья человека



Метки. Удобнейший инструмент работы с почтой! Например, все письма в моем ящике можно разделить на несколько категорий. Это уведомления о сообщениях и комментариях из социальных сетей, это рабочие письма, письма друзей и родственников и т.д. Согласитесь, было бы удобно каким-то образом каталогизировать эту информацию, что позволит быстрее находить нужное письмо и хранить все в более структурированном виде.

Для этих целей в gmail созданы так называемые метки или ярлыки. Каждый ярлык имеет свое имя и цвет, и все письма с этим ярлыком помечаются соответствующим образом.

Назначить письму ярлык можно либо вручную, либо автоматически при помощи фильтров - еще одного мощного инструмента для работы с почтой в gmail. При помощи фильтра можно найти письма от конкретных людей, содержащие или не содержащие конкретные слова в тексте или теме письма. С отфильтрованными таким образом письмами можно выполнить ряд действий: автоматически архивировать, пометить, назначить ярлык и даже удалить. Приходит письмо - и автоматически ему присваивается ярлык или оно автоматически помечается как важное - согласитесь, это удобно.

Создать фильтр можно в соответствующем разделе настроек.

Да где же это письмо-то?


Как известно, GMail - служба Google. А это значит, что мощнейшие средства поиска встроены и в вашу почту. Например, чтобы найти в вашем gmail ящике все письма от президента России, необходимо в строке поиска ввести from:president@kremlin.ru. Найти все непрочитанные письма: label:unread. Ограничить поиск датами: добавьте after: 01/08/2010 before: 01/09/2010. Быть может, мы ищем письмо с вложениями? Нет ничего проще: has:attachment. Нас интересуют письма в спаме: in:spam. Полный список параметров для поиска можно посмотреть здесь.

О плюшках


Вы еще не воодушевлены gmail? Я добью вас экспериментальными функциями, расположенными в одноименном разделе настроек вашего gmail.

Хотите включать изображения в ваши письма так же просто, как в word? Нет ничего проще - включите расширение Вставка картинок. Для добавления картинки в текст письма необходимо просто нажать кнопку на панели редактирования письма и указать загружаемую картинку. Никаких сторонних сервисов для хранения изображений - картинка уже в тексте письма.

У вас были случаи, когда поздно ночью вы отправляли письмо, о котором жалели утром? Тогда функция Защита от необдуманных писем - для вас. Официальное описание модуля лучше всего характеризует его назначение:
Если вы включите эту функцию, то каждый раз перед отправкой письма вечером или ночью, когда люди чаще всего принимают поспешные решения, на экран будет выводиться простая арифметическая задачка. Если вы устали, но еще в состоянии решить её, смело отправляйте письмо. В противном случае лучше хорошо отоспаться, а утром заняться почтой. Зная себя лучше других, вы можете сами задать время, когда будут появляться эти задачки.
На странице экспериментальных функций вы сможете найти другие интересные расширения.

Стоит отметить и чат Google Talk в окне почты, позволяющий в онлайн режиме обмениваться сообщениями с другими пользователями, фактически это IM в окне браузера. Недавно в российский gmail была добавлена поддержка аудио и видео чатов - не ради рекламы, но ради справедливости отмечу, что однажды скайп отказался совершать видео звонок, в то время как GTalk позволил отлично пообщаться с другим городом.

Ээээ...Вы еще здесь?

понедельник, 11 апреля 2011 г.

ExtJS выделить строку в таблице grid

Проблема: выделить одну строку (например, первую) в таблице grid сразу после ее загрузки. Казалось бы, проблемы как таковой здесь нет - получили SelectionModel таблицы и сделали selectRow(rowIndex). По сути - все действительно так, однако необходимо выбрать нужный момент для выполнения этого кода. Попробуйте, например, выделить строку в событии afterrender или render - увы, выделение не сработает. Решение, тем не менее, безусловно есть.

Решение: необходимо воспользоваться событием viewready, возникающим, когда таблица grid полностью отрисована на странице и готова к манипуляциям. Как гласит документация, viewready используется как раз для осуществления выделения строки по умолчанию.

Предположим, что нам нужно выделить первую строку таблицы:

grid = new Ext.grid.EditorGridPanel({
  store: myStore,
  height: 500,
  border: false, frame: false,
  cm: myColumnModel,
  selModel: new Ext.grid.RowSelectionModel({singleSelect:true}),
  listeners: {
    viewready: function(g){
      g.getSelectionModel().selectRow(0);
    }
  }

Обратите внимание, что в случае необходимости использования так называемой модели выделений SelectionModel необходимо явно указывать selModel в конфигурации таблицы, в противном случае вызов метода grid.getSelectionModel() вызовет ошибку.

пятница, 8 апреля 2011 г.

ExtJS убрать обрезку строк в таблице Grid

Таблицы ExtJS (GridPanel и EditorGridPanel) отлично подходят для отображения и удобного редактирования различных типов данных. Однако по умолчанию ячейки таблицы не показывают большие строки полностью, обрезая их до видимой части, как видно на рисунке ниже.

Иногда такое поведение неприемлемо и необходимо предоставить пользователю возможность видеть всю текстовую информацию целиком.
 

Сделать это чрезвычайно просто - необходимо перезаписать CSS параметр .x-grid3-cell-inner для редактирования стиля ячейки и свойства .x-grid3-hd-inner для редактирования стиля заголовка таблицы соответственно. Таким образом, чтобы включить режим просмотра всего текста (wrap) в ячейке, необходимо обозначить следующий стиль:

.x-grid3-cell-inner { white-space: normal; }

Аналогичный эффект заголовкам таблицы придаст следующий CSS код:

.x-grid3-hd-inner { white-space: normal; }

Спасибо.

Вообще говоря, подобным образом можно править все стили, используемые в ExtJS интерфейсе - узнать названия стилей и посмотреть их текущие параметры можно в Firebug'е.

ExtJS сделать ячейку/столбец Editor Grid нередактируемой

Проблема: на входе имеем таблицу Editor Grid (EditorGridPanel), в которой необходимо запретить редактирование некоторых ячеек, строк или столбцов. Известно, что по умолчанию все ячейки таблицы EditorGridPanel являются редактируемыми.

Решение. Как всегда, разработчики ExtJS продумали все за нас - необходимо перезаписать конфигурационную функцию isCellEditable модели колонок ColumnModel, определяющую возможность редактирования конкретной ячейки по индексу ее колонки и строки.

var store = new Ext.data.Store({...});
var colModel = new Ext.grid.ColumnModel({
  columns: [...],
  isCellEditable: function(col, row) {
    if (col == 2) return false; else return true;
  }
});
var grid = new Ext.grid.GridPanel({
  store: store,
  colModel: colModel,
  ...
});

В приведенном примере разрешается редактировать всю таблицу, кроме третьей колонки - строки и колонки начинают нумерацию с нуля, поэтому в теле функции isCellEditable проверяется значение col, равное 2.

Неплохо, не так ли? Усложним задачу. Что, если нам нужно решить, стоит ли позволять редактировать ячейку в зависимости от данных в другой колонке? Нет ничего проще!

var store = new Ext.data.Store({...});
var colModel = new Ext.grid.ColumnModel({
  columns: [...],
  isCellEditable: function(col, row) {
    if (col == 2){
      rec = store.getAt(row);
      if (rec.get('notEdit') === true)
        return false;
      else
        return true;
    } else
      return true;
  }
});
var grid = new Ext.grid.GridPanel({
  store: store,
  colModel: colModel,
  ...
});

В данном случае проверяется значение поля notEdit рассматриваемой записи, и если в нем хранится true - ячейка в третьем столбце становится нередактируемой. Остальные столбцы и ячейки при этом продолжают нормально функционировать.

четверг, 7 апреля 2011 г.

ExtJS получить параметры URL/GET параметры

Проблема: необходимо использовать GET параметры, содержащиеся в URL. Например, по каким-то причинам клиенту на JS необходимо получить доступ к параметру id запроса http://site/page.php?id=132.

Решение. Двухстрочная функция, расширяющая возможности ExtJS.

Ext.getUrlParam = function(param) {
    var params = Ext.urlDecode(location.search.substring(1));
    return param ? params[param] : params;
};

Использование:

id = Ext.getUrlParam('id');

воскресенье, 3 апреля 2011 г.

Анализ дискового пространства

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



При запуске программа спрашивает, какую директорию или диск ей необходимо сканировать. Таким образом, можно детально проанализировать как целый диск, так и одну отдельно взятую директорию, занимающую подозрительно много места.

Закончив сканирование указанного пространства, JDiskReport строит отличную круговую диаграмму, показанную выше. На любой сегмент можно нажать и посмотреть статистику выбранной директории. На вкладке Top 50 приводятся 50 самый больших файлов - удобно, согласитесь. Можно посмотреть статистику по типам файлов - для этого предназначена вкладка Types.


Кошмар - у меня 6.5 гигабайт dll файлов!

Интересно, сколько на жестком диске старых документов? Не вопрос - вкладка Modified расскажет все о вашей старой и новой информации.


Оказалось, что преобладают документы, измененные в последние 1-2 года. Хотя и старых файлов хватает - за 10 лет никто изменил 3.5 гигабайта моего жесткого диска:).

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

Скачать этот must have можно на официальном сайте JDiskReport, есть версии для Windows и Mac OS.

Конвертирование PDF в Word [doc, rtf]

Лучший онлайн инструмент для конвертирования PDF в Word (на выбор - doc или rtf) - здесь.

Загружаете pdf, вводите свой email и через пару минут получаете письмо с doc файлом. Уличная магия и только.




Да, как снять защиту с PDF документов на копирование, печать и т.п. я писал здесь.

Снятие ограничений с PDF файла


Простите, но меня чрезвычайно раздражает, когда я не могу распечатать скачанный PDF документ или скопировать текст из оного! К чему все эти ограничения?

Онлайн решение hack-pdf.com поможет решить описанную проблему. Никаких регистраций и требований, просто загружаете PDF документ, ожидаете его обработки - мой 120 страничный pdf был разблокирован не более чем за 5 секунд.

Да, как легко и просто сконвертировать PDF в doc я писал здесь.