
4X_Pro
Веду блог с 8 января 2011 г.

Возникла идея принципиально нового способа ввода данных в устройства с сенсорным экраном, которая сочетала бы в себе достоинства экранной клавиатуры, T9 и Swype. Идея такая: пользователь набирает слово целиком непрерывным движением пальца, но при этом на экране отображается не вся клавиатура в целом (как в Swype), а только те буквы, у которых наиболее высокая вероятность оказаться следующими, и вариант "Еще" для случая, когда ни одна из предложенных букв не подходит. Кроме того, для ввода используется поверхность экрана целиком, а кнопки ввода рисуются полупрозрачными, чтобы сквозь них было видно введенный текст.
Рассмотрим процесс ввода данных по шагам.
Иногда сталкиваюсь с необходимостью сканировать различные черно-белые рисунки, графики, диаграммы под Linux. При этом если сканировать в greyscale, изображения часто получаются некачественными: либо просвечивает обратная сторона листа, либо фон получается серым и грязным и неприятно выделяется при вставке рисунка в документ. Если же сделать изображение двухцветным, то линии становятся зазубренными.
Недавно нашел способ, как с этим бороться: после сканирования в greyscale нужно сильно повысить контрастность изображения, либо в программе sane, либо после сканирования в каком-нибудь графическом редакторе, а так же выставить небольшую гамма-коррекцию. В частности, я использовал такие параметры: в sane гамма 1.30, затем открывал изображение в GIMP и выставлял там контрастность на +30—+50. В результате получалось качественное изображение с чисто белым фоном и гладкими линиями.
Как известно, в PHP есть возможность сжимать с помощью GZIP отдаваемые пользователю данные. С одной стороны, оно позволяет сэкономить траффик и увеличить скорость загрузки, что крайне важно для пользователей, подключенных через GPRS или обычные аналоговые модемы, так как сайты сейчас становятся по объему все больше и больше. С другой — увеличивает нагрузку на сервер: на сжатие требуется дополнительное процессорное время. Кроме того, для пользователей с быстрыми каналами связи эффект от сжатия оказывается настолько незначительным, что время на упаковку/распаковку данных может оказаться вполне сопоставимым со временем, сэкономленным на передаче.
Сразу возникает мысль: а что если как-то определить, как подключен пользователь, и включать сжатие только в тех случаях, если соединение медленное.
На первый взгляд кажется, что работать с сессиями в PHP предельно просто. Достаточно написать где-нибудь в начале скрипта такой код:
session_name('MySessId'); // задаем имя cookie или параметра, в котором хранится идентификатор сессии
session_set_cookies_params(24*3600,'/','xpro.su'); //если нужно, задаем домен, путь и время хранения для cookie сессии
session_start(); // а теперь запускаем саму сессию
и в глобальной переменной $_SESSION можно будет хранить нужные значения, которые будут доступны при каждом обращении пользователя к странице! На малых сайтах такое решение работает без проблем, но оно не будет масштабируемым: как только сайт достигнет нескольких десятков тысяч страниц или посещаемости в десятки тысяч пользователей в сутки, может случиться так, что сайт будет открываться весьма и весьма медленно.
Как известно, при возникновении ошибки PHP в лучшем случае выдает номер строки, где она произошла, и ее краткое описание, а в худшем (если в настройках хостинга отключен показ ошибок вообще) — просто пустую страницу. Это не слишком удобно как для отладки, так и для конечного пользователя. Возникает вопрос: как сделать вывод сообщения об ошибке более информативным.
Оказывается, все достаточно просто. В PHP существует специальная функция set_error_handler(), которая позволяет задать свой собственный обработчик ошибок.Единственный ее параметр -- это имя функции-обработчика, которая вызывается в случае возникновения ошибки. Функция-обработчик имеет 4 параметра: номер ошибки, текст ошибки, имя файла, в котором ошибка произошла и номер строки в этом файле.
Однажды, скачивая один из своих сайтов с помощью WGet, с удивлением обнаружил, что после каждой страницы программа останавливается и ждет несколько секунд. Да пользователи иногда тоже жаловались на то, что загрузка сайта очень долго не заканчивается. Стал разбираться, в чем дело, и вот что удалось выяснить.
Идея социальных сетей в том виде, в котором они есть сейчас, начинает понемногу исчерпывать себя. И одна из причин этого -- обязательное требование указания реального имени, что противоречит самой идее Интернета, в котором нормой является анонимное общение. На начальном этапе такое требование можно было понять: социальные сети были ориентированы на то, чтобы дать людям, давно потерявшим друг друга, восстановить связь между собой, и использование реального имени значительно упрощало эту задачу. Но сейчас это уже не столь актуально: большинство тех, кто хотел найти друг друга, уже нашли.
Таким образом, прежняя задача социальных сетей выполнена, и уже сейчас наметилась новая: профиль социальной сети для человека становится местом, с которого начинается его субъективный Интернет, перекрестком, который связывает в единое целое его активность на различных сайтах, личным "аналитическим центром", который собирает для данного человека информацию в соответствии с его интересами и кругом общения. Я решил написать небольшой обзор того, какой эту сеть будущего вижу я.
Когда на сайте требуется разрешить пользователю загружать свои файлы (например, фото или аватары) с последующим их хранением на сервере, сразу возникает ряд проблем с безопасностью.
Первая и самая очевидная — это имена файлов. Их обязательно нужно проверять на спецсимволы, так как пользователь может подделать HTTP-запрос, в результате чего загружаемый файл будет иметь имя, например, ../index.php. и при попытке его сохранения затрет корневой индекс. Кроме того, название может содержать русские буквы в кодировке windows-1251 или koi-8, которые некорректно сохранятся в файловой системе. Вывод: нужно сохранять файл не под тем именем, под которым его загрузил пользователь, а под случайным, например MD5-хешем от имени файла, времени загрузки и IP пользователя. Имя же этого файла где-нибудь в базе, а потом отдавать файл скритом, который предварительно будет выдавать заголовок Content-disposition: attachment; filename="имя_файла".
Сегодня, запустив Firefox, с удивлением узнал, что уже вышла шестая версия. Скачал обновление, запустил, и… понравилось настолько, что сейчас даже подумываю о том, чтобы снова начать использовать Firefox как основной броузер. (Примечание: до этого у меня стояла версия 3.5.x, поэтому не исключаю, что часть описанных ниже изменений появилась в более ранних версиях.)
Понравилось вот что:
Иногда при написании скриптов, предназначенных для выполнения длительных операций, возникает необходимость определить, каким именно способом запущен PHP-интерпретатор: из командной строки или же из Web-сервера. Помочь в этом может функция php_sapi_name(), которая возвращает строку, описывающую SAPI (подсистему сервера), которая использовалась.
Последние комментарии