Инструменты пользователя

Инструменты сайта



// SSL на блоге

SSL Everywhere. С HTTP настроен редирект на HTTPS.

Сертификаты от Let's Encrypt, получение и обновление сертификатов через CertBot.

Работать будет с браузерами, которые умеют SNI, т.е. в пролёте древние Андроиды на 2.3.7, всякие IE6-IE8, HTTP клиенты в Java 6u45 и 7u25.

Первоначальный рейтинг C тюнился до A+ по следующим статьям:

Результат: https://www.ssllabs.com/ssltest/analyze.html?d=htrd.su&hideResults=on

Что пришлось менять и что поломалось:

  • Ссылки на банеры, в частности картинки пришлось утянуть себе, так как доступны только по HTTP
  • Воспользоваться миграционными тулами Disqus, что бы восстановить комментарии к статьям (URL Mapper, предварительно запросив текущий список и обработав его скриптом)
  • Счётчики G+ слетели. Как их чинить для новых страниц - хз.
  • Что ещё отвалилось. Иначе невозможно :)

// Обновление в статьях

Изрядно обновил статью Linux, ThinkPad T530 и miniDP (displayport), поместил ссылку на неё в Статьи. Если коротко: то в общем и целом настройка чуть упростилась и улучшилась. Но дёготь остался, куда без него.

// Перекличка

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

// Небольшой редизайн сайта

Собственно основу можно заметить невооружённым глазом:

  • Убрана большая шапка
  • Убраны большие закруглённые углы

Менее заметные:

  • Большой логотип претерпел некоторый «ребрендинг» (этот логотип предлагается как картинка по умолчанию при репостинге в G+)
  • Сделаны миникопии логотипа под разные размеры, один из них выводится в верхней навигационной строке, другой используется как favicon (теперь видно, что там картинка, а не чёрная клякса, но чёткости так и не получилось добиться)
  • Возвратил стандартный поиск по сайту, потому как гугловский внезапно стал глючить и выдавать пустые ответы (при этом поисковые запросы типа «site:htrd.su ЗАПРОС» работают исправно), разбираться лень, т.к. сам не веб-разработчик и тратить на это время просто жалко (на крайний случай: https://www.google.ru/search?q=site%3Ahtrd.su). Кроме того, это несколько ускорило загрузку страницы.
  • Небольшая косметика правой колонки: убрано лишнее, подкорректированы размеры шрифтов
  • Немного откорректированы шрифты заголовков

// С переездом!

Переехал на новый хостинг, вроде всё основное запустил. Заодно обновился и обновил плагин googleplusoneng.

Теперь проблем со скоростью (100Мбит) и доступностью (всё же сервер в серверной :)) должно быть поменьше.

// BlogTNG и SQLite3

Как писал в прошлом сообщении в PHP 5.4.x нет SQLite2, есть поддержка только SQLite3. Пришлось немного напрячься и сделать поддержку оного в BlogTNG, дабы не впадать в уныние.

Подкатом подробности.

// Test

Первый тестовый пост после обновления PHP с 5.3.10 на 5.4.3 и отказа BlogTNG.

Причина: BlogTNG использует SQLite2, который выкинули из PHP 5.4.0.

// Свой домен и динамический DNS

Как писал в позапрошлой заметке - у блога новый домен. Собственно сразу стал вопрос - а как его использовать с моим-то динамическим белым IP адресом?

hatred.homelinux.net - предоставлен DynDNS.com, вот только незадача - они сделали чуть менее, чем всё у себя платным, даже если сейчас я освобожу этот хост - обратно в бесплатном аккаунте я его не выберу.

Именно поэтому в качестве DNS хостера и динамического DNS был выбран http://dnspark.net

Как делегировать туда свой домен, что делать на nic.ru или у других регистраторов - это за пределами этой статьи, в конце концов, там всё достаточно очевидно, если нет - в комментарии с вопросами :)

Но и тут имеем ложку дегтя (не говорю что в бесплатном аккаунте можно сделать только 10 DNS записей и нельзя задать wildcard *): ddclient распоследней версии работает со старым API, который постоянно пытается сбросить твой адрес в 127.0.0.1. Есть багрепорт, там же есть патчик, либой мой вариант:

dnspark-api-fix.path
--- ddclient.orig	2012-03-27 10:07:44.000000000 +1100
+++ ddclient	2012-03-27 10:20:46.000000000 +1100
@@ -3257,12 +3257,13 @@
 	info("setting IP address to %s for %s", $ip, $hosts);
 	verbose("UPDATE:","updating %s", $hosts);
 
-	#'http://www.dnspark.com:80/visitors/update.html?myip=10.20.30.40&hostname=test.burry.ca'
+	#old: 'http://www.dnspark.com:80/visitors/update.html?myip=10.20.30.40&hostname=test.burry.ca'
+	#new: 'https://www.dnspark.net:443/api/dynamic/update.php?hostname=my.hostname&ip=1.2.3.4'
 
 	my $url;
-	$url   = "http://$config{$h}{'server'}/visitors/update.html";
+	$url   = "https://$config{$h}{'server'}/api/dynamic/update.php";
 	$url  .= "?hostname=$hosts";
-	$url  .= "&myip=";
+	$url  .= "&ip=";
 	$url  .= $ip            if $ip;
 
 	if ($config{$h}{'mx'}) {
@@ -3293,7 +3294,7 @@
 		my $h = pop @hosts;
 
 		$config{$h}{'status'} = $status;
-		if ($status eq 'ok') {
+		if (($status eq 'ok') || ($status eq 'nochange')) {
 		    $config{$h}{'ip'}     = $ip;
 		    $config{$h}{'mtime'}  = $now;
 		    success("updating %s: %s: IP address set to %s", $h, $status, $ip);

Но тут появляется и вторая ложка дегтя: при обращении по этому юрлу часто имеем ошибку 500 сервера. Продакшн. Ога :)

Решил проблему своим скриптом, который засунул в cron выполняться каждые 5 минут, плюс он, в случае ошибки HTTP пытается повторить запрос несколько раз, часто это помогает с обновлением:

dnspark-update.sh
#!/bin/sh
 
host=YOUR_HOST_NAME_TO_UPDATE
# переменная dns хранит сервер, при помощи которого резолвится доменное имя вашего хоста, что понять - поменялось оно или нет
# можно оставить пустым, тогда будет использоваться сервер указанный в /etc/resolv.conf
#dns=
dns=8.8.8.8
 
# пока используется получение IP адреса только с интерфейса
use=if
if=ppp999
#use=web
 
# Логин и пароль для обновления DDNS (в случае dnspark.com логин к аккаунту и логин для обновления записей - разные сущности, второй заводится в админке)
login=DDNS_UPDATE_LOGIN
password=DDNS_UPDATE_PASSWORD
 
# вроде как не нужно уже :)
libdir=/var/lib/dnspark
prev_file=$libdir/prev
prev_ip=`cat $prev_file`
 
get_ip_if()
{
    ifconfig $if | grep inet | awk '{print($2)}'
}
 
get_ip_web()
{
    # TODO: задел на будушее
    false
}
 
get_prev_ip()
{
    host $host $dns | grep "^$host" | grep 'has address' | awk '{print($4)}'
}
 
prev_ip=`eval get_prev_ip`
current_ip=`eval "get_ip_$use"`
 
# Обновляем
if [ "$prev_ip" != "$current_ip" ]; then
    echo "Prev:    " $prev_ip
    echo "Current: " $current_ip
    echo "Updating..."
    eval "curl --retry 10 'https://$login:$password@www.dnspark.net/api/dynamic/update.php?hostname=$host&ip=$current_ip'"
fi

Ссылки

// Новый адрес блога

Обзавёлся доменом второго уровня: HTRD.SU. Как запомнить? А достаточно просто:

  1. Из моего ника выбрасываем все гласные буквы: HaTReD ⇒ HTRD
  2. Смотрим на клавиатуру: буквы образуют как бы трапецию, набираясь в одном направлении: H (влево вверх) T (влево) R (влево вниз) D
  3. Домен .SU просто запоминаем (да-да, я родился в Советском Союзе :)
  4. PROFIT!

Посему новый адрес блога: HTTP://HTRD.SU

Старый адрес будет доступен ещё неопределённое время. А может и вообще останется как fail-over. Или будет использоваться для доступа домой… В общем не решил ещё :)

Что ещё планируется в ближайшем будущем:

  1. переезд на более стабильную площадку
  2. небольшая заметка: как это всё использовать с Dynamic DNS?

// DokuWiki, BlogTNG, плагин googleplusone и доработка шаблона

Что бы при использовании плагина googleplusone совместно с BlogTNG при попытке «поделиться» постом в Google+ вставлялся не абы какой текст, а то, что вам нужно, следует внести некоторые модификации в используемый вами шаблон.

// Переехал на BlogTNG

Переехал на BlogTNG вместо классической связки плагинов blog/tag/discussion. Разработчики, к слову, те же самые.

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

Теперь будем постепенно адаптировать другие части системы под новый блого-движок.

// Поиск от Google

Добавил поиск от Google, а то встроенный в DokuWiki не всегда отрабатывает должным образом, а, судя по логам, робот гугла почти не покидает мой сайт :)

Для поиска сделал кастомный: http://www.google.com/cse/. С рекламой даётся бесплатно.

Что бы разделить запрос и результаты, пользовался этим хинтом: http://googleajaxsearchapi.blogspot.com/2010/03/search-form-and-results-on-two.html

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

// OpenID

Всё, снова работает на сайте. Под формой ввода логина/пароля ссылка для входа при помощи OpenID

// DokuWiki и web-закладки

Случайно наткнулся на плагин dokubookmark, ставится в два движения, настраиваются неймспейсы… Но тороплюсь.

Для чего нужен: позволяет быстро создать web-закладку (а по сути запись в DokuWiki) на текущий сайт, помимо этого, сразу можете назначить теги (если стоит плагин tag), автоматом так же вставится текущий выделенный текст (если он есть) на странице, это дело можете сразу подправить, выбрать направление: публичные или приватные закладки (для приватных закладок рекомендую отдельнную область имен (namespace), которой назначить, соответственно, ограниченные права) и сохранить.

Как их потом искать? В шаблоне по-умолчанию сразу ставится тег Bookmark, я рекомендую его не убирать, потом по этому тегу просматривать свои закладки. Помимо этого:

  • по назначенным тегам, если озаботились этим
  • поиском по сайту

Что бы это дело работало, создайте себе браузерную закладку (я бы предположил поместить её на панель закладок, если оная у вас включена), с любым именем и следующим содержимым в качестве адреса:

javascript:Q=document.selection?document.selection.createRange().text:document.getSelection();void(window.open('http://SITE/wiki/doku.php?do=dokubookmark&te='+encodeURIComponent(Q)+'&ur='+encodeURIComponent(location.href)+'&ti='+encodeURIComponent(document.title),'dokuwikiadd','scrollbars=yes,resizable=yes,toolbars=yes,width=680,height=520,left=210,top=150,status=yes'));

Только исправьте адрес и путь на сайте на свои.

Все, пробуйте :)

UPD: Поддержка кирилицы

Из коробки пока не работает нормально с кирилицей (решение ниже, оно же отправлено разработчику)

Вы можете заметить, что для экранирования передаваемой строки используется escape(), так что кодировку строки-источника мы определить никак не сможем. Есть другие вызовы, которые так же экранируют строку, но в кодировке UTF-8, не зависимо от настроек сайта, это:

  • encodeURI()
  • encodeURIComponent()

Различия между ними можно посмотреть в этой статье (и о escape() так же): http://habrahabr.ru/blogs/webdev/17640/, после чего выберите ту, которая по вкусу.

Но этого не достаточно, в самом плагине, нужно открыть файл helper.php и заменить все вхождения

htmlentities($some_text_var)

на

htmlentities($some_text_var, ENT_COMPAT, "UTF-8")

Дело в том, что у htmlentities(), согласно документации, кодировка по умолчанию ISO-8859-1, за подробностями в документацию (умный форматировщик кода у меня тут, даже ссылки сразу на первоисточники поставил, пользуйтесь).

UPD2: Все, эти пляски не нужны, автор обновил версию, за что ему большое спасибо :)

// DokuWiki, blog и include плагины

Коротко: include плагин некорректно закрывает <div> если задана опция отображать только первую секцию, в результате может поехать… Ну сами догадайтесь.

Исправление, подразумевается, что мы в директории plugins:

  1. открыть include/helper.php
  2. найти там функцию _get_firstsec(&$ins, $page)
  3. найти в ней строку
    $ins[] = array('section_close');
  4. заменить на:
    $ins[] = array('section_close', array());
  5. очистить кеш
  6. радоваться :)

Вот так выглядело до исправления:
http://img153.imageshack.us/img153/1839/screenshoot201005221900.png

Так после:
http://img232.imageshack.us/img232/1196/screenshoot201005222034.png

UPD: написал письмо разработчикам, отреагировали быстро, в git уже есть изменения :)