| Часто используемые | ||
| | неразрывный пробел | |
|   | короткий пробел | |
|   | длинный пробел | |
| ­ | | мягкий перенос |
| — | — | длинное тире |
| – | – | короткое тире |
| … | … | многоточие |
| « | « | левая кавычка елочка |
| » | » | правая кавычка елочка |
| © | © | (c) |
| ® | ® | (R) |
| ™ | ™ | TM |
| Математические | ||
| ± | ± | +- |
| × | × | умножить |
| ≠ | ≠ | не равно |
| < | < | < |
| > | > | > |
| ≤ | ≤ | <= |
| ≥ | ≥ | >= |
| √ | √ | квадратный корень |
| ² | ² | квадрат, вторая степень |
| ³ | ³ | куб, третья степень |
| ¼ | ¼ | 1/4 |
| ½ | ½ | 1/2 |
| ¾ | ¾ | 3/4 |
| ∞ | ∞ | бесконечность |
| Стрелки | ||
| ← | ← | стрелка влево |
| ↑ | ↑ | стрелка вверх |
| → | → | стрелка вправо |
| ↓ | ↓ | стрелка вниз |
| ↔ | ↔ | стрелка влево и вправо |
| ↵ | ↵ | стрелка вниз, потом влево, как Enter |
| ⇐ | ⇐ | стрелка двойная влево |
| ⇑ | ⇑ | стрелка двойная вверх |
| ⇒ | ⇒ | стрелка двойная вправо |
| Прочие | ||
| & | & | амперсанд |
| € | ? | евро |
| ′ | ′ | ' |
| ″ | ″ | '' |
| · | · | точка на середине высоты строки |
| ‾ | ‾ | Надчерк |
| ° | ° | градус |
Подборка публикаций по web-программированию, PHP, JavaScript, CSS, HTML, серверные вещи, браузеры, информационные технологии, и немного компьютерного юмора.
суббота, 28 марта 2009 г.
Коды основных символов HTML
jQuery Tabs. Ajax загрузка в один и тот же div контейнер
Эта статья будет полезна тем, кто использует такую мощную штуку как jQuery UI, в частности элемент интерфейса Tabs. jQuery Tabs позволяет в несколько строчек кода создавать удобный и быстрый набор вкладок на HTML странице.
Контент в каждой из вкладок может быть как статическим,так и динамически загружаемым при помощи ajax-а. Все доступные опции и методы этого элемента управления неплохо расписаны на официальном сайте jQuery, поэтому я углубляться не буду.
Приведу пример использования:
<div id="contacttabs">
<ul>
<li><a href="all.html"><span>Все контакты</span></a></li>
<li><a href="friends.html"><span>Друзья</span></a></li>
<li><a href="invisible.html"><span>Список невидящих</span></a></li>
<li><a href="ignore.html"><span>Список игнорируемых</span></a></li>
</ul>
</div>
<script type="text/javascript">
$(document).ready(function() {
$("#contacttabs").tabs({
spinner: 'загрузка...'
});
}
</script>После загрузки страницы создастся четыре вкладки, содержимое, в каждую из них, будет загружено динамически ajax-ом. Все недостающие контейнеры, в которые загружать содержимое вкладок, jQuery создаст сам. Эта часть будет выглядеть приблизительно вот так (содержимое div-ов опущено для упрощения восприятия):
<ul class="ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all">
...
</ul>
<div id="ui-tabs-16" class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide"></div>
<div id="ui-tabs-27" class="ui-tabs-panel ui-widget-content ui-corner-bottom"></div>
<div id="ui-tabs-29" class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide"></div>
<div id="ui-tabs-31" class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide"></div>Вкладок четыре, соответственно DIVов-контейнеров тоже четыре. У меня проблема возникла вот в чём. В данном конкретном примере, содержимое вкладок было одинаковым по структуре, но различным по смыслу. Появлялась ситуация, когда элементы HTML-страницы имеющие одни и те же ID-шники появлялись на разных вкладках.
В текущий момент времени пользователь видит только активную вкладку, и может взаимодействовать только с элементами, находящимися в контейнере выбранной вкладки. Все остальные имеют атрибут hidden. Это значит, что элементы загружены в DOM для каждой из вкладок, хотя и не видны в данный момент времени, и если обратиться по уникальному ID-шнику элемента на вкладке, то может возникнуть «коллизия», и селектор выберет совсем не тот элемент, который хотелось из активной вкладки.
Единственным выходом для меня было – подчищать содержимое контейнеров неактивных вкладок, дабы не возникало дублирование ID-шников. Такой опции в jQuery Tabs, я найти не смог, пришлось написать небольшой hook. Я навесил на событие select, возникающее в Tabs, в момент переключения активной вкладки, очистку всех неактивных контейнеров <div>.
<script type="text/javascript">
$(document).ready(function() {
$("#contacttabs").tabs({
spinner: 'загрузка...',
select: function(event, ui) {
/*clear all divs content except active one*/
fakes = ui.panel.parentNode.getElementsByTagName('div');
for(i=0;i<fakes.length;i++){
if(fakes[i] != ui.panel){
fakes[i].innerHTML = '';
}
}
}
});
});
</script>И тогда всё заработало, как следует..
четверг, 5 марта 2009 г.
Смешные комментарии в коде
Насобирал отличную подборочку смешных комментариев в коде, думаю, программисты оценят свою же лирику (=
// sometimes I believe compiler ignores all my comments
// drunk, fix later
return 1; //returns 1
// Magic. Do not touch.
const int TEN=10; // As if the value of 10 will fluctuate...
//This code sucks, you know it and I know it. Move on and call me an idiot later.
doRun.run(); // ... "a doo run run".
try {
} finally { // should never happen
}
/* These magic numbers are fucking stupid. */
/* TODO: this is obviously not right ... this whole fucking module sucks anyway */
/* FIXME: please god, when will the hurting stop? Thus function is so fucking broken it's not even funny. */
//I am not sure why this works but it fixes the problem.
// I am not sure if we need this, but too scared to delete.
// I have to find a better job
// Remove this if you wanna be fired
if (case1) { // trivial
...
}
else { // we are screwed
/* fill in later */
}
if (/*you*/ $_GET['action']) { //celebrate
Замедляет ли Google Analytics сайт?
Если вы используете Google Analytics для отслеживания посещений на вашем блоге, то вы можете быть удивлены скоростью загрузки страниц, по-крайней мере в Европе точно заметно. Народ начал замечать, что в так называемые «часы-пик» использования Web-а код JavaScript от Google Analytics грузится на 97% медленнее по сравнению с обычной нагрузкой. Это справедливо для Европы. Для США такое падение в скорости тоже имеет место, но не такое заметное, разница составляет всего лишь 27%.
Чем это обусловлено – сложно сказать. Скорее всего, просто большинство серверов Гугла расположено не в Европе, и поэтому большое количество пользователей даёт такую усадку по скорости загрузки. Конечно, это не означает, что нужно перестать пользоваться этим прекрасным сервисом, и боятся за скорость загрузки вашего сайта. Всё это некритично.
Есть конечно и ряд других аналогичных некоммерческих сервисов для отслеживания посещений на вашем сайте. Сегодня один из моих друзей показал мне такую вещь как Woopra (http://www.woopra.com). На данный момент сервис находится в стадии бета-тестирования, но багов мной не было замечено, можно смело пользоваться. По возможностям сервис превосходит аналогичный GA (Google Analytics). Единственный недостаток – у них большая нагрузка на сервера и поэтому можно ждать около месяца пока ваш аккаунт утвердят. Что сразу бросилось в глаза – Woopra может отслеживать посещения и анализировать поведение пользователей вплоть до отдельного индивидуума, такого GA, конечно, не предоставляет.
вторник, 17 февраля 2009 г.
Free hosting
Несколько бесплатных зарубежных хостингов:
Оба, вроде, хороши, по отзывам пользователей. Но Awardspace частенько грешит долгими downtime, в отличии от Freehostia, у которой они гораздо реже и не так заметны. Оба хостинга предоставляют услуги без внедрения рекламы на ваши страницы, и вы можете свободно использовать PHP или Perl скрипты. Кстати, Freehostia даже предоставляет бесплатный план с уже предустановленным рядом скриптов, которые могут быть полезны новичкам.
В общем советую попробовать.
среда, 4 февраля 2009 г.
Оптическая иллюзия "Lilac chaser"
Иллюзия сочетает в себе три простых, общеизвестных эффекта:
- Когда происходит кратковременное событие в одной точке поля зрения, а в близлежащей точке имеет место схожее событие, мы воспринимаем это как движение из одной точки в другую. Это явление называют мнимым движением, или бета-движением, поскольку фактически никакого движения не было. Мнимое движение является основой движущихся неоновых вывесок, фильмов и видео. Мы видим движение поскольку устройство отображения информации (например, монитор) стимулируют рецепторы головного мозга (называемые рецепторами Рейхардта), отвечающие за расшифровку движений. Визуальными событиями в данной иллюзии являются исчезновение сиреневых кружков, а также дальнейшее появление зелёных послеобразов (см. далее).
- Когда исчезает сиреневый раздражитель, присутствующий в определённой области поля зрения в течение длительного времени (скажем, около 10 секунд), появляется зелёный послеобраз. Этот послеобраз остаётся в течение достаточно короткого промежутка времени, и в данном случае, "стирается" повторным появление сиреневого раздражителя. Появление послеобраза является следствием адаптации палочек и колбочек сетчатки. Цвет и яркость определяются соотношением активностей трёх типов колбочек. Под влиянием сиреневого раздражителя колбочки "устают". Когда раздражитель исчезает, усталость колбочек способствует тому, что активность, вызванная в них серым фоном, совпадает с таковой в состоянии покоя. Адаптация палочек и колбочек начинается сразу же после начала действия раздражителя, поэтому длительность послеобразов постепенно начинает расти. Обычно мы их не замечаем, поскольку изменяем положение глаз примерно 3 раза за секунду, и видимое изображение каждый раз попадает на новые, неадаптировавшиеся палочки и колбочки. В этой иллюзии, наши глаза сохраняют неподвижность, что вызывает нарастание длительности послеобразов, возникающих после прекращения действия раздражителя.
- Если в области периферического зрения, появляется размытый раздражитель, и при этом сохраняется неподвижность глаза, то раздражитель исчезает, даже если он всё ещё физически присутствует. Это явление называется затуханием Трокслера (Troxler's fading). Так происходит потому, что даже если наши глаза сфокусированы на точке и слегка двигаются, движения вне этой точки (в области периферического зрения) недостаточны для того чтобы сдвинуть сиреневые пятна на новые нейроны нашей зрительной системы. Эти послеобразы фактически перекрывают основные образы и все сиреневые пятна кажутся серыми, за исключением тех мгновений, когда появляются зелёные послеобразы.

среда, 28 января 2009 г.
Работа из PHP с xmpp (jabber)
Работа над протоколом jabber была начата ещё в 1998 году, но более широкое распространение получил в середине 2000 года. С того времени появилось много библиотек и реализаций данного протокола, почти для всех языков программирования. Более детальный список можно посмотреть на оффсайте: http://xmpp.org/software/libraries.shtml.
Extensible Messaging and Presence Protocol, сокращённо XMPP, это открытый протокол, основанный на XML, предназначенный для обмена мгновенными сообщениями и информацией о присутствии (списке контактов, например). Был опубликован в виде RFC 3920. Он остаётся основным протоколом технологии обмена мгновенными сообщениями Jabber. Главной целью протокола – была расширяемость, таким образом, он быстро получил много дополнительных возможностей, такие как передача голоса или передача файлов.
На оффсайте набор библиотек для работы на PHP представлен тремя вариантами:
- JAXL
- Lightr
- xmpphp
Больше всего приглянулась библиотека xmpphp, как самая простая в использовании и с довольно удобными вызовами. О ней и пойдёт разговор.
Для того чтобы начать её использовать необходимо подключить файл XMPP.php, перед началом работы. Дальше создать объект класса XMPPHP_XMPP с указанием основных параметров соединения: джаббер сервера, порта подключения, данных для авторизации, и уровня логирования.
Фрагмент кода приведен ниже.
include ‘XMPPHP/XMPP.php’;
$conn = new XMPPHP_XMPP('jabber_server_here', 5222, 'your_login', ' your_password', 'xmpphp', 'jabber.ru', $printlog=false, $loglevel=XMPPHP_Log::LEVEL_INFO);
$conn->useEncryption(false); //disable encryption
try
{
$conn->connect();
$conn->processUntil('session_start');
$conn->presence();
$conn->message('your jabber here', 'текст сообщения, которое хотите отправить');
$conn->disconnect();
}
catch(XMPPHP_Exception $e)
{
//here you can process $e->getMessage() if some error occurred;
}В примере было отключено шифрование командой $conn->useEncryption(false). Это нужно делать непосредственно перед вызовом метода connect, пока не было установлено соединение. Позволит решить проблему, если вы получили ошибку вида «Fatal error: Cannot access protected property XMPPHP_XMPP::$use_encryption …», или в случае, если вы хотите отключить SSL/TLS шифрование.
Данное решение, использовать джаббер для отсылки сообщений средствами PHP, может пригодится для отправки извещения вам прямо в messenger об очередном пришедшем комментарии с вашего форума, заказе на покупку из web-магазина, поста из агрегатора новостей или другой важной информации с вашего приложения на сервере.