декабря 21, 2007

Связанные публикации на Blogspot

Related posts, blogger hack, связанные ссылки, похожие сообщения, blogger widget

Related posts - довольно удобный плагин для Wordpress, который позволяет задержать читателя на блоге, предоставляя ссылки на другие похожие публикации. Подбор аналогичных публикаций осуществляется по разным критериям и далеко не всегда верный. Как известно, установка дополнительных модулей не предусмотрена на Blogspot.com. Поэтому предлагаемое решение использует другой принцип. В его основе заложена выборка по рубрикам или категориям (labels). Данный хак, реализованный в виде виджета на java script, добавляет в конец публикации ссылки на другие посты из тех же рубрик. Вы можете видеть как это работает на примере этого блога. Ссылки показываются только на странице публикации, вместе с комментариями и другой информацией, имеющей отношение непосредственно к определенной статье.

Установка

Зайдите в меню редактирования шаблона, в раздел "изменить HTML". Включите пункт "Расширить шаблоны виджета" и обязательно сохраните копию шаблона, прежде чем вносить в него изменения. Найдите в коде тег <data:post.body/>. Сразу за этим тегом вставьте следущий код:

<!-- Связанные статьи из этой категории. Виджет. Начало -->

        <b:if cond='data:blog.pageType == &quot;item&quot;'>
            <div class='similiar'>
                
                <div class='widget-content'>
                <h4>Предлагаю ознакомиться с аналогичными статьями:</h4>
                <div id='data2007'/><br/><br/>
                    
                    <script type='text/javascript'>

                    var homeUrl3 = &quot;<data:blog.homepageUrl/>&quot;;
                    var maxNumberOfPostsPerLabel = 5;
                    var maxNumberOfLabels = 3;

                    maxNumberOfPostsPerLabel = 6;
                    maxNumberOfLabels = 3;


                    function listEntries10(json) {
                      var ul = document.createElement(&#39;ul&#39;);
                      var maxPosts = (json.feed.entry.length &lt;= maxNumberOfPostsPerLabel) ? 
                                     json.feed.entry.length : maxNumberOfPostsPerLabel;
                      for (var i = 0; i &lt; maxPosts; i++) {
                        var entry = json.feed.entry[i];
                        var alturl;

                        for (var k = 0; k &lt; entry.link.length; k++) {
                          if (entry.link[k].rel == &#39;alternate&#39;) {
                            alturl = entry.link[k].href;
                            break;
                          }
                        }
                        var li = document.createElement(&#39;li&#39;);
                        var a = document.createElement(&#39;a&#39;);
                        a.href = alturl;

                        if(a.href!=location.href) {
                            var txt = document.createTextNode(entry.title.$t);    
                            a.appendChild(txt);
                            li.appendChild(a);
                            ul.appendChild(li);    
                        }
                      }
                      for (var l = 0; l &lt; json.feed.link.length; l++) {
                        if (json.feed.link[l].rel == &#39;alternate&#39;) {
                          var raw = json.feed.link[l].href;
                          var label = raw.substr(homeUrl3.length+13);
                          var k;
                          for (k=0; k&lt;20; k++) label = label.replace(&quot;%20&quot;, &quot; &quot;);
                          var txt = document.createTextNode(decodeURI(label));
                          var h = document.createElement(&#39;b&#39;);
                          h.appendChild(txt);
                          var div1 = document.createElement(&#39;div&#39;);
                           div1.appendChild(h);
                          div1.appendChild(ul);
                          document.getElementById(&#39;data2007&#39;).appendChild(div1);
                        }
                      }
                    }
                    function search10(query, label) {

                    var script = document.createElement(&#39;script&#39;);
                    script.setAttribute(&#39;src&#39;, query + &#39;feeds/posts/default/-/&#39;
                     + label +
                    &#39;?alt=json-in-script&amp;callback=listEntries10&#39;);
                    script.setAttribute(&#39;type&#39;, &#39;text/javascript&#39;);
                    document.documentElement.firstChild.appendChild(script);
                    }

                    var labelArray = new Array();
                    var numLabel = 0;

                    <b:loop values='data:posts' var='post'>
                      <b:loop values='data:post.labels' var='label'>
                        textLabel = &quot;<data:label.name/>&quot;;
                        
                        var test = 0;
                        for (var i = 0; i &lt; labelArray.length; i++)
                        if (labelArray[i] == textLabel) test = 1;
                        if (test == 0) { 
                           labelArray.push(textLabel);
                           var maxLabels = (labelArray.length &lt;= maxNumberOfLabels) ? 
                                  labelArray.length : maxNumberOfLabels;
                           if (numLabel &lt; maxLabels) {
                              search10(homeUrl3, textLabel);
                              numLabel++;
                           }
                        }
                      </b:loop>
                    </b:loop>
                    </script>

                </div>

            </div>
        </b:if>                

<!-- Конец кода: Связанные статьи из этой категории. Виджет. -->

Вместо текста "Предлагаю ознакомиться с аналогичными статьями" можете использовать свой вариант. Сохраните внесенные в шаблон изменения.

Примечание

В случае, если статья единственная в рубрике, будет отображаться текст виджета без ссылок. Если рубрик очень много, будут показаны не все.

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

Technorati теги: ,,

декабря 20, 2007

WinDV - простой захват видео

DV, FireWire digital video, видеозахват, capture

Хочу рассказать об одной простой программе видеозахвата для Windows. Это WinDV. Программа не новая, но малоизвестная. Предназначена для захвата с видеокамер и обратной записи AVI файлов посредством интерфейса FireWire (IEEE 1394). Временные отметки на видеозаписи используются для автоматического разделения различных отрывков видео.

Основные характеристики:

  • Миниатюрный размер (98 Кб)
  • Двусторонний обмен (захват видео и запись на камеру)
  • Отсутствие пропущенных кадров (буферизация в памяти)
  • Автоматическое разделение видеоряда на файлы (каждый сюжет записывается в отдельный файл)
  • Простое соединение AVI файлов (при записи на камеру сюжеты соединяются автоматически)
  • Предпросмотр передаваемого видео

Системные требования:

  • Windows 98SE/ME/2000/XP
  • DirectX 8.1+
  • FireWire (IEEE 1394) контроллер (OHCI)
  • DV camcorder (с DV-входом для записи)
    или DV-videorecorder

Скачать программу можно с сайта разработчика: WinDV-1.2.3.zip

декабря 18, 2007

Подарочный сертификат на 750 Гигабайт хостинга

Имеется в наличии несколько подарочных (точнее скидочных) сертификатов на хостинг. Необходимо использовать до 24 декабря 2007 года. Сертификат дает скидку 20 долларов - хостинг получается по 63 доллара 40 центов в год + домен в подарок. Кроме 750 Гб дается 7,5 Терабайт трафика в месяц и все остальное без ограничений (почта, базы данных, субдомены...).

Я думаю никому не надо, но на всякий случай: sclif@narod.ru.

декабря 12, 2007

Stream attributes could not be determined: Sony Vegas или Звук без видео на таймлайне

Sony Vegas, видеомонтаж, codec, ffdshow, нет видео

"Stream attributes could not be determined" - это служебное сообщение, которое можно увидеть при импорте видеофайлов в Sony Vegas. Оно отображается как правило вместо данных о видеопотоке. В самом типичном случае импортированное видео не отображается при предварительном просмотре и не добавляется на таймлайн. Помещается только звук. При этом сам видеофайл отлично просматривается при помощи установленных в системе плейеров.

Все дело в кодеках. Точнее в не установленных или неверно настроенных кодеках. Решение при использовании ffdshow очень простое:

В настройках ffdshow "VFW Configuration" необходимо включить все DivX, XviD и MPEG-4 декодеры: меню Программы -> ffdshow -> VFW Configuration -> Вкладка Decoder -> Кодеки -> включить XviD/DivX/MPEG-4 декодеры выбрав вместо пункта "запрещён" пункт "libavcodec".

Скачать последнюю версию ffdshow можно по ссылке: www.afterdawn.com.

На всякий случай даю ссылку на звуковой кодек AC-3 ACM Decompressor by fccHandler.

Узнать о том какие кодеки используются в видеофайле можно при помощи программ: Gspot, VideoInspector (VideoToolBox) или AVICodec.

И вообще все кодеки находятся на www.free-codecs.com.

декабря 04, 2007

Решение проблемы wp_list_pages в Wordpress

Подсветка меню, page_item, current_page_item, классы CSS

Замечательный движок для блогов Wordpress, кроме всевозможных достоинств, как и любой другой программный продукт не лишен багов. Но сила программ с открытым кодом состоит в том, что пользователи сами могут вносить усовершенствования и исправления. Об устранении глюка с выводом меню сайта при помощи функции wp_list_pages () и пойдет речь.

Проблема

При выводе списка страниц функция wp_list_pages добавляет класс page_item. Для текущей выбранной страницы также дописывается класс current_page_item. Это позволяет создавать красивые эффекты подсвечивания текущей страницы в меню. Все это отлично работает до тех пор, пока вы не захотите заменить блог на главной странице на статическую страницу (меню Настройки -> Чтение). В этом случае блог будет отображаться на выбранной вами странице и функция wp_list_pages ...прекращает выдавать класс current_page_item для пункта меню "блог". При этом вся ваша красивая система подсветки рушится.

Меню можно сделать и вручную. Но зачем же тогда стандартная функция, которая выполняет все нужные действия автоматически? Этот баг описан на страницах техподдержки вордпресса и был исправлен в версии 2.1. Но снова появился в версии 2.1.1 и до сих пор вопрос остается открытым.

Решение

В ворпрессовской директории wp-includes подправим файл classes.php. В районе 512-й строки (у меня это 516-я строка - версия 2.3.1) находим if ( $page->ID == $current_page ) и заменяем всю строку на if ($page->ID == $current_page || ($current_page == 0 && $page->ID == get_settings('page_for_posts')))

Вот и все.

Technorati Теги: ,,