2009-06-28

Синтез Речи под Линукс

На платформе Windows есть замечательная штука называемая Speech API которую я использую чтобы начитывать книжки в mp3 и потом слушать с мобильника. Здравый смысл подсказывает что под Линукс должна быть  своя система для синтеза голоса, и такая система действительно есть - это festival.

Под Ubuntu festival ставится при помощи стандартной системы установки пакетов. Однако русского языка в дистрибутиве Убунты я не нашел. Однако поискав в Интернете нашел что некие ребята разработали русский голос для festival.

Скачал дебиановский пакет, убунтовый почему то не скачался. Попробовал...

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

В общем до практического использования festival оказался мне не пригоден.

Попробовал установить Speech API и Говорилку  (ее я использую под Windows) под Wine и... о чудо. Программа запустилась. И говорит! Сейчас поставил синтезировать очередную вещь Юрия Никитина... Пока работает без сбоев, посмотрим доделает ли до конца... Под Виндовс она что греха таить глючит, поэтому приходится файл скармливать по кусочкам, будет смешно если под Wine она окажется стабильней...

P. S. Доделал, субъективно прграмма работала подольше чем под виндой, по какой-то причине в настройках Говорилки оказалась заблокированной настройка выбора размера части поэтому книжка оказалась порезена на куски по 16 мегов, не критично, хотя обычно я выбираю побольше. Качество синтеза я на слух отличить не смог, хотя при работе на динамики Wine режет частоты очень сильно. В случае c mp3 это не критично... Еще под вайном не работает буфер обмена - думаю из-за utf8, но думаю можно покапаться в настройках.

 

Оставить комментарий

 
  2009-06-17

Настройка Domain Keys для cpanel

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

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

Одним из путей решения данной проблемы является идентификация пользователя по имени домена которому принадлежит адрес электронной почты. При этом в DNS запись домена добавляется некая информация позволяющая идентифицировать почтовое сообщение. В настоящее время получили широкое распространение две технологии работающие по такому принципу Yahoo Domain Keys (DK) и Sender Policy Framework (SPF). Принцип действия DK основывается на алгоритме RSA  — на сервере отсылающем почту хранится пара ключей открытый и закрытый. При этом открытый ключ публикуется в TXT DNS записи, а закрытый используется для подписывания email сообщения. При этом при приеме сообщения клиентское приложение или MTA способны проверить правильность электронной подписи и сделать вывод о подлинности отправителя.
Если вы являетесь владельцем выделенного или виртуального выделенного сервера с установленной WHM/CPanel то то для того чтобы  добавить DK к вашей исходящей почте достаточно выполнить одну простую команду в консоле.

/usr/local/cpanel/bin/domain_keys_installer [username]

Где [username] - имя пользователя - владельца домена.


При этом cpanel выполнит за вас все необходимые процедуры - создаст пару RSA ключей и настроит MTA для работы с DK.
Чтобы убедиться в том что система настроена правильно можно послать самому себе тестовое сообщение. При этом в заголовках полученного письма будет добавлен примерно такой заголовок

DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=default; d=yoursite.com;
    h=Received:To:Subject:From:Content-Type:Content-Transfer-Encoding:Message-Id:Date; b=txGKMRa7OGMPvnwb97AR...



При этом может оказаться что при посылке сообщения через PHP заголовка в письме может не оказаться.

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

mail($email, $subject, $content, $headers,'-f bounce@yoursite.com');


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

Например если для отправки вы захотите использовать не свой SMTP сeрвер а SMTP своего интернет провайдера то ваши письма будут уходить не подписанными и некоторые получатели могут посчитать это попыткой их фальсификации. Этот метод также мало поможет если вы попадете в черные списки — DK в этом случае лишь дополнительно подтвердит, что вы  — это вы. Поэтому при принятии решения об использовании DK нужно принимать во внимание кто будет является потенциальным получателем вашей корреспонденции.

 

Оставить комментарий

 
  2009-06-10

Знак параграфа аськи код

Странная фраза находится в top10 поисковых запросов google analytics - "знак параграфа аськи код". Что за аська такая? И тут до меня дошло! ASCII код! Дык понятно теперь, вот здесь я собираю полезные HTML коды. И знак параграфа там тоже есть...

 

Коментариев: 1

 
  2009-06-08

Автозаполнение в формах

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

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

Отключить автозаполение можно добавив атрибут autocomplete="off" причем поставить его можно как к тегу FORM так и к тегу INPUT.

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

Нельзя ли отключить автозаполнение посредством JavaScript? Замечено, что простым присваиванием значения autocomplete="off" к объекту DOM автозаполнение не убирается поэтому многие разработчики продолжают пользоваться введением атрибута в разметку — лучше поломать валидность чем секьюрность.

Однако на днях нашел элегантнейшее решение позволяющее оставить код валидным и отключить автозаполнение:

[domelement].setAttribute('autocomplete','off');

Свойства элементам DOM можно присваивать не только напрямую но и посредством метода setAttribute и это более рекомендумемый способ. Указанный метод работает в FF и IE в других пока не тестировал.

 

Коментариев: 4

 
  2009-06-05

Как получить список координат из Google Maps

Здесь можно найти исходники и примеры на эту тему.

 

Оставить комментарий

 
  2009-06-01

Выравнивание таблицы по центру

Время от времени на HTML страничках наблюдаю такую конструкцию:

<center>
<table>
...
</table>
</center>

Так делать неправильно - тег center устаревший и не рекомендуется с употреблению:

The CENTER element is exactly equivalent to specifying the DIV element with the align attribute set to "center". The CENTER element is deprecated [p.38] .

Как тогда выравнять табличку по центру? Да очень просто:

<table style="margin:0 auto">
...
</table>

Указанный код работает во всех основных браузерах.

 

Оставить комментарий

 
  2009-05-20

Переадресация сервера с www на сервер без www

Задача, есть сайт, допустим www.maxistar.ru, хотим чтобы при заходе на www.maxistar.ru пользователь перебрасывался на maxistar.ru автоматически, ну или же наоборот, кому как нравится.

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

RewriteEngine on

RewriteCond %{http_host} ^www.maixstar.ru [nc]
RewriteRule ^(.*)$ http://maxistar.ru/$1 [r=301,nc]

 

Коментариев: 1

 
  2009-05-06

HTML - спецсимволы

Так на всякий случай, может пригодиться:

Название Символ Числовой код Мнемонический код
Прямая кавычка  “ &#34 &quot
Амперсанд  & &#38 &amp
знак «меньше»  < &#60 &lt
Знак «больше»  > &#62 &gt
Торговая марка &#153  &trade
Неразрывный пробел   &#160 &nbsp
Цент  ў &#162  &cent
Фунт  Ј &#163  &pound
Знак валюты  ¤ &#164  &curren
Йена  Ґ &#165  &yen
Вертикальная строка  ¦ &#166  &brvbar
Знак параграфа  § &#167  &sect
Знак копирайта  © &#169  &copy
Знак отрицания  ¬ &#172  &not
Знак "зарегестрировано" ® &#174 &reg
Знак градуса  ° &#176 &deg
Знак "минус"  −   &minus
Длинное тире &#150;
Знак "плюс минус"  ± &#177  &plusmn
Знак "микро"  µ &#181 &mikro
Знак абзаца  ¶ &#182 &para
Точка-маркер  · &#183  &middot
Степень 1 (номер)  № &#185 &sup1
Левая типографская кавычка  « &#171 &laquo
Правая типографская кавычка  » &#187 &raquo
Знак умножения / кавычки/  * &#215 &times
Знак деления  / &#247 &divide

 

 

Оставить комментарий

 
  2009-04-16

Как узнать IP посетителя сайта

Казалось бы, нет ничего проще - ip адрес посетителя заносится Апачем в переменную $_SERVER['REMOTE_ADDR'] но есть некоторые нюансы...

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

Все вышесказанное учитывается в вот какой несложной функции:

function get_ip(){
    $alt_ip = $_SERVER['REMOTE_ADDR'];
    if (isset($_SERVER['HTTP_CLIENT_IP'])){
        $alt_ip = $_SERVER['HTTP_CLIENT_IP'];
    }
    else if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) AND preg_match_all('#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#s', $_SERVER['HTTP_X_FORWARDED_FOR'], $matches)){
        // make sure we dont pick up an internal IP defined by RFC1918
        foreach ($matches[0] AS $ip){
            if (!preg_match("#^(10|172\.16|192\.168)\.#", $ip)){
                $alt_ip = $ip;
                break;
            }
        }
    }
    else if (isset($_SERVER['HTTP_FROM'])){
        $alt_ip = $_SERVER['HTTP_FROM'];
    }
    return $alt_ip;
}

 

 

Коментариев: 3

 
  2009-04-08

SPF для работы с Gmail

Как создать SPF запись для сервера, который сам посылает почту, скажем из различных PHP скриптов на сайте, сам сервер при этом не является MX майлсервером - все ящики лежат на 1and1.com, да еще некоторые из пользователей посылают почту от имени данного сервера через Gmail?

Компетентные источники утверждают, что SPF запись будет выглядеть как то так:

"v=spf1 a mx include:aspmx.googlemail.com ~all"

Хотя несколько вещей мне непонятны, а именно, при попытке посмотреть SPF для гугла, выдается странное:

> nslookup -type=ALL aspmx.googlemail.com

> "v=spf1 redirect=_spf.google.com"

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

> nslookup -type=ALL _spf.googlemail.com

> *** UnKnown can't find _spf.googlemail.com: Non-existent domain

кто-нибудь может объяснить данный феномен?

 

Оставить комментарий