понедельник, 14 октября 2013 г.

Передача Windows-1251 (cp1251) с помощью POST и AJAX на сторону сервера.

Внезапно, я обнаружил, что POST AJAX упорно передает мою строку в UTF-8, игнорируя все попытки указать ему кодировку. А серверные программы настроены принимать только windows-1251 и это вызывает некий конфликт. И выражается он в том, что русский текст становится текстом кракозябровым.
Некоторое время погуглив я обнаружил, что нормальное решение этой проблемы как-то не особо существует и основное мнение комьюнити показано, например, здесь. Краткое резюме:
это нельзя, потому что нельзя, используй перекодировку. Я же, со своей стороны решил, что вариант с удвоением трафика + потерей мощности меня не слишком радует.
Дальнейшие раскопки привели меня к причинам такого поведения AJAX: w3. Там написано, что строку надо передавать в UTF-8 и ничего больше не волнует. Но что более интересно, там сказано, что другие варианты можно передавать и не как UTF-8. Например: ArrayBuffer или Blob.
Покопав в этом направление, я нашел еще 1 статью. Этот вариант относится к новым возможностям, появившимся относительно недавно.

Идея проста:
Строка - это тот же массив символов. Просто ajax передаст ее массив 2вубайтовых чисел, а мы хотим передавать массив однобайтовых. Значит, чтобы передать строку на сервер в windows-1251 надо просто записать коды windows-1251 символов нашей строки в массив однобайтовых чисел. А на стороне сервера - просто прочитать из тела запроса как готовую строку в кодировке windows-1251.

Как это сделать:

1) Берем нашу строку data_str и какой-либо функцией меняем ее кодировку на нужную(в моем случае - это windows-1251). Такую функцию легко написать самому или найти на просторах сети, например, тут.

var converted_str = convertToWin1251(data_str);

2) Мы получили converted_str, которая все еще считается строкой в UTF-8, но содержит уже коды необходимой кодировки. Просто так послать ее нельзя, ибо AJAX все равно будет трактовать ее, как UTF-8 и попытается конвертировать, что окончательно ее испортит.
Поэтому, мы создаем массив 8мибайтовых неотрицательных чисел размером под нашу строку:

var send_arr = new Uint8Array(converted_str.length);

3) Теперь осталось только заполнить этот массив

for(var i = 0; i < converted_str .length; ++i)
send_arr[i] = converted_str.charCodeAt(i);

4) выставить правильную кодировку и отправить его:

ajaxVar.open('POST', 'http://FOO.BAR', 1);
ajaxVar.setRequestHeader('Content-Type', 'text/plain; charset=windows-1251');
ajaxVar.send(send_arr);

где ajaxVar - это созданный ajax-запрос.
Собственно, все.

Осталось только принять данные на строне сервера. Они передаются как RAW POST DATA. Неплохо было бы, чтобы принимающая сторона умела работать с ней. С++ С#/ASP.NET насколько я помню, проблем с этим не имеют, PHP это делает так.

P.S. Если кто-то не согласен, нашел способ лучше или просто есть что сказать по существу - добро пожаловать в комментарии =)

четверг, 21 февраля 2013 г.

Добавить поддержку jpeg к gd в php

проверяем наличие и состояние gd:
  php -i 
в секции gd
Если есть строка
  JPEG Support => enabled
то все уже хорошо.

Если ее нет, то:
1) Качаем jpeg, например, в /usr/local/jpeg
2) Компилим jpeg
3) Пересобираем пхп c --with-jpeg-dir=/usr/local/jpeg (./configure && make && make install)
4) Проверяем php -i , должна появиться строка о поддержке jpeg

Не забудьте перезапустить веб-сервер

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

phpMyAdmin выдает пустые страницы

Для начала стоит проверить логи веб-сервера. В моем случае там было child pid номер exit signal Segmentation fault (11). Немного погуглив, я выяснил, что это проблма взаимодействия phpMyAdmin'а и ускорителей типа eaccselerator или apc.
Решение просто: добавить в конфиг-файл апатча строку php_admin_flag apc.enabled Off.
После этого phpMyAdmin перестанет использовать apc и проблема пройдет.

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

Немного о Интернет и whois

Internet Corporation for Assigned Names and Numbers, или ICANN (читается айкэ́н) — международная некоммерческая организация, созданная 18 сентября 1998 года при участии правительства США для регулирования вопросов, связанных с доменными именамиIP-адресами и прочими аспектами функционирования Интернета.
IANA (от англ. Internet Assigned Numbers Authority — «Администрация адресного пространства Интернет») — американская некоммерческая организация, управляющая пространствами IP-адресов,доменов верхнего уровня, а также регистрирующая типы данных MIME и параметры прочих протоколов Интернета. Находится под контролем ICANN.IANA отвечает за распределение всех зарезервированных имён и номеров, которые используются в протоколах, определённых в RFC.
IANA делегирует свои полномочия по распределению IP-адресов региональным регистраторам в виде диапазонов класса A («/8»). Региональные регистраторы, в свою очередь, делегируют более мелкие диапазоны интернет-провайдерам.
Чтобы получить информацию об ip-адресе(информация - из iana answers(Hints for finding the person responsible for an IPv4 address)):1) Использовать whois сервис, каждого из 5 RIR по очереди, пока ответ не будет найден.
Для оптимизации, можно пользоваться списком отсюда. Или iana whois сервером, который укажет нужный

2) Если не нашлось ничего, значит, ip внутренней сети, выделен какой-то организации(apple, например. см. список выше) или был подделан.

Что есть whois:
Whois - это протокол(rfc), реализован поверх tcp, используется для обращения к whois серверу и получения информации о ip/домене

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

Еще много информации есть на хабре

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

Как отключить встроенную клавиатуру на ноутбуке

Немного об управлении устройствами.
Сломалась у меня встроенная клавиатура на ноутбуке. И решил я ее отключить(ну, или заблокировать, что получится). Покопав некоторое время в Интеренет, нормального решения я не нашел. Пришлось лезть в глубины Windows самому. Вот результат моих изысканий.

Как отключить встроенную клавиатуру на ноутбуке (Windows 7):

1) Для начала, нам нужно ИД отключаемого устройства. В моем случае - встроенной клавиатуры. Обычно, у ноутбуков они подключаются по внутреннему PS/2 разъему.
2) Открываем диспетчер устройств (Правый клик на Компьютер-> Управление->Диспетчер Устройств)
3) Находим нужное устройство, правый клик на нем, "свойства"
4) Во складке "Сведения" в выпадающем меню находим "ИД оборудования"
5) Копируем его (У меня это было "ACPI\PNP0303")
6) Вызываем (win+r или "выполнить" в меню "Пуск") gpedit.msc
7) Там открываем: Политика Локальный компьютер -> Административные шаблоны -> Система -> Установка устройств -> Ограничения на установку устройств
8) Там есть вариант: "Запретить установку устройств с указанными кодами устройств", правый клик на него, "изменить"
9) Ставим радиобатн в положение "Включить", в параметрах нажимаем кнопку "Показать..."
10) Вставляем в появившееся окошко скопированный ИД оборудования и нажимаем Ok.
11) Ставим галочку "Также применить для соответствующих устройств, которые уже были установлены"
12) Удаляем устройство в диспетчере устройств и перезагружаемся.

В результате, встроенная клавиатура перестает работать, а в диспетчере устройств появляется "Неизвестное устройство"

Как включить встроенную клавиатуру на ноутбуке обратно (Windows 7):
Или поставить вариант "Выключить" в 8 пункте. Или удалить id устройства в 9 и далее пунктах.
После этого, в диспетчере задач произвести поиск новых устройств.(или просто перезагрузиться)

P.S. Дополнительно - ключевые моменты для английской версии:
2) Computer->Manage->Device Manager
3) Properties
4) Details, там - Hardware Ids
7) Local Computer Policy->Computer Configuration->Administrative Templates->System->Device Installation->Device Installation Restriction
8) Prevent installation of device that match any of these device IDs
9) Enabled, потом кнопку "Show..."
11) Галочка "Also apply to matching devices that are already installed"

У некоторых данный способ не работает, отсутствует необходимые политики. Нормального способа решения этой проблемы я так и не нашел. Так что для них - такой вариант:
1-2) см. выше
3) Находим нужное устройство, правый клик на нем, "Обновить драйвера"
4) Там снимаем галочку "Совместимые устройства" и выбираем что-то не подходящее. Например "Стандартные" -> "Клавиатура HID". Обычно в ноутбуках клавиатуру вешают на порт PS/2, так что он должен не подойти.
5) Перезагружаемся.
6) Теперь клавиатура не работает. Заходим в диспетчер устройств,
7) Находим там клавиатуру. Она теперь показана как проблемная. Правый клик -> Отключить.

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

Немного об автоопределение скоростей и работе ethernet.


Немного об автоопределение скоростей и работе ethernet.
Взято вот отсюда.

По умолчанию, каждый порт Cisco настроен таким образом, что устройство само определяет какие настройки на этом порту использовать, какую скорость выбрать, какой режим передачи данных. Такая технология называется Auto-negotiation (Автоопределение). Так же эти параметры можно задать «вручную», на каждом порту устройства.
Коммутаторы Cisco определяют автоматически скорость между сетевыми устройствами (например между портом коммутатора и сетевой картой компьютера), используя некоторые методы. Cisco коммутаторы используют для определния скорости Fast Link Pulse (FLP), это некоторый электрический импульс, по которому устройства могут понять на каких оптимальных скоростях может установиться соединение между данными сетевыми устройствами.
Если скорости выставлены вручную и они совпадают, то устройства смогут установить соединение используя электрические сигналы.
Если на коммутаторе и на сетевом устройстве компьютера (для примера), установлены вручную скорости и они не совпадают, то соединение не будет установлено.
Примерно так же проходит и определение режима работы соединения: half-duplex или full-duplex.


Если оба устройства работают в режиме автоопределения, и устройства могут работать в duplex режиме, то этот режим и установится.
Если на устройствах автоопределение выключено, то режим будет присвоен по некоторым правилам «по умолчанию». Для 10 и 100 мегабитных интерфейсов установится режим half-duplex, для 1000 мегабитных установится Full-Duplex.
Для отключения автоопределения дуплексности необходимо вручную указать настройки режима.
Ethernet устройства могут работать в режиме Full-Duplex (FDX), только тогда, когда нет коллизий в передающей среде.
Современные Ethernet технологии говорят что коллизии не происходят. Коллизии происходят только там где есть разделяемая среда передача данных, например при топологии шина, или при использовании такого устройства как hub (хотя сейчас увидеть такого «динозавтра» достаточно сложно :) ).
Все же необходимо представлять какие технологии есть и как они борятся с коллизиями в таких разделяемых ресурсах.
Алгоритм, по борьбе с коллизиями называется CSMA/CD (Carrier Sense Multiple Access Collision Detection ), что означает множественный доступ с контроллем несущей и обнаружением коллизий.
Что такое коллизия вобще?
Коллизия это наложение сигнала, т.е, когда одновременно несколько сетевых устройств начинают передачу данных по разделяемой среде, два этих сигнала встречаются, накладываются друг на друга, и происходит коллизия (тоесть данные искажены, и не несут в себе никакой полезной нагрузки.
Теперь давайте рассмотрим как это работает.
  1. Устройство, которое желает отправить фрейм сначала слушает, свободна ли линия связи.
  2. Когда линия связи не занята, это устройство начинает отправлять фреймы в Ethernet.
  3. Устройство «слышит», что коллизия не происходит, значит все хорошо.
  4. Если все же коллизия произошла (а как же первый шаг? где устройство убеждалось, что линия не занята? Дело в том, что другое устройство могло тоже прослушивать линию, и эти два устройства отправили фреймы практически в одно и тоже время, поэтому и произошла коллизия). Теперь, когда отправляемые устройства «поняли», что произошла коллизия, они отправляют так называемый jam signal, который «говорит» другим участникам сети, что сейчас передача невозможно, так как возникла коллизия и придется немного подождать.
  5. После jam сигнала, у каждого отправляюшего устройства случайным образом определяется некоторое время, которое можно назвать «время простоя», когда устройство не может посылать никакие данные в сети.
  6. После истечения этого таймера, алгоритм переходит к 1 шагу.

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

Автозапуск в linix

Скрипты автозапуска размещены в /etc/init.d/*
Оттуда созданы soft link на них в папки rc*.d, где * - уровень запуска, на котором выполняется данный скрипт.
Для создания своего скрипта автозапуска нужно:
1) Создать свой скрипт в /etc/init.d, для этого есть /etc/init.d/skeleton
2) Прописать там грамотные параметры в комментариях INIT INFO.
3) Вызвать insserv имя скрипта

Для удаления:
1) insserv -r имя скрипта
2) Удалить скрипт из /etc/init.d

Подробности:
less /etc/init.d/skeleton
man inid.d
man insserv