Давно искал и вот, наконец, нашел то, чего мне так сильно не хватало – замечательный сервис для учета личных финансов. До сегодняшнего дня я, как и другие миллионы, вел учет в Excel, но что-то мне постоянно не давало покоя. Вроде бы все наглядно, но как-то топорно и неудобно, к тому же нет возможности править файл на моем КПК с Android ОС – HTC Hero, точнее говоря возможность то есть, но опять же не ахти какая удобная. Пробовал даже выкладывать файл на Google Docs, но опять же, оказалось очень не удобно.

Так чем же для меня оказался так хорош сервис Дребеденьги? Попробую перечислить достоинства сервиса по пунктам.

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

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

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

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

  5. Все ключевые функции системы – бесплатны! Неограниченное количество счетов, категорий трат и еще много-много всяких вкусностей. Есть конечно и платные функции такие как совместный учет финансов, система напоминаний и экспорт в Excel, доступные в Premium-аккаунте, до них я еще не добрался, но обязательно доберусь и попробую, тем более что стоимость его вполне адекватна – 250 рублей единожды, а не ежегодно, как в некоторых других сервисах, про которые промолчим и за которые выпьем не чокаясь :)

Больше говорить нечего! Разработчики молодцы! Постоянно добавляют новые функции и судя по форуму весьма живо реагируют на запросы и нужды пользователей. Думаю Дребеденьги – лучшая домашняя бухгалтерия на сегодняшний день!

Метки:

Как вы уже наверное знаете самым оптимальным вариантом создания собственной темы является создание темы на базе уже существующей. Лично я за основу беру тему Zen. Она создана на базе блочной структуры, то есть без использования таблиц, предусматривает возможность использования фиксированного и резинового шаблонов на выбор, в ней нет ничего лишнего, в общем более оптимального варианта для развертывания собственной темы для Drupal я не встречал.

А недавно я совсем случайно наткнулся на один замечательный скриптик, с помощью которого в считанные секунды можно создать свою тему на базе темы Zen. Скриптик был найден где-то на просторах drupal.org, где именно уже не помню, с тех пор он служит верой и правдой в деле создания новых сайтов. А вот собственно и он:

#!/bin/bash
# This script creates a new subtheme for zen following the instructions on drupal.org/node/226507
# Place this file in your themes directory, alongside the zen folder, as a file named "subtheme"
# Usage: open a shell, navigate to the themes directory and run ./subtheme
# (Run chmod 700 on this file to make it executable)
# Based on script submitted here: drupal.org/node/276120

echo "Enter a human-readable subtheme name:"
read -e INPUTNAME

NAME=`echo $INPUTNAME | tr '[:upper:]' '[:lower:]' | sed -e 's/[ -]/_/g' -e 's/[^a-z_]//g'`
SEDNAME=`echo $INPUTNAME | sed -e 's/"/\\"/g'`

echo -n "Choose a page layout type [f]ixed or [l]iquid for subtheme $NAME: "
read -e LAYOUT

if [ $LAYOUT = "f" ]; then
  CSS="layout-fixed.css"
elif [ $LAYOUT = "l" ]; then
  CSS="layout-liquid.css"
else
  echo Invalid layout type.
  exit
fi

cp -r zen/STARTERKIT $NAME

#
# Change the theme name (the line 'name = ...') to the new subtheme name
#
sed 's/STARTERKIT/'$NAME'/g' $NAME/STARTERKIT.info | sed 's/^\(name *= *\).*/\1'"$SEDNAME"'/g' > $NAME/$NAME.info
  rm $NAME/STARTERKIT.info

cp zen/zen/$CSS $NAME/layout.css
cp zen/zen/print.css $NAME/print.css
cp zen/zen/zen.css $NAME/$NAME.css
sed 's/STARTERKIT/'$NAME'/g' zen/STARTERKIT/template.php > $NAME/template.php
sed 's/STARTERKIT/'$NAME'/g' zen/STARTERKIT/theme-settings.php > $NAME/theme-settings.php

exit 0

Чтобы его использовать положите его в папку с темами, рядом с папкой zen, запускайте и следуйте инструкциям. Enjoy ;)

Дополняю пост, потому как нашел еще один достаточно интересный способ создания собственной темы на базе Zen. На сей раз это модуль Zenophile. Замечателен тем, что на сей раз нам не нужен Unix shell, чтобы выполнить скрипт. Инсталлируем модуль, идем на страницу тем и жмем кнопку Create Zen subtheme. Соль, сахар – по вкусу ;) Удачи!

Метки:

Долго ломал голову как бы так хитро темизировать Primary links чтобы пункты меню были активными не только когда находишься в той книге на которую ссылается пункт меню, но и еще когда находишься на одной из страниц книги. Голову чуть не сломал, но решение таки нашлось. Значит так, по порядку. Есть структура:

Hunting – Brown bear hunt in Okhotsk region – Himalayan bear hunt in Khabarovsk region – Snow sheep hunt in Okhotsk region Fishing Gallery Tips Contacts Maps About us Staff

То есть Hunting – это книга, а следующие по уровню пункты – страницы книги. У книги Hunting, задаем путь /hunting, у страниц книги адреса следующие /hunting/page1..n.

В файле template.php переопределяем функцию вывода primary links следующим образом:

function main_menu($links, $attributes = array('class' => 'main-menu clearfix')) {
  $output = '';
  if (count($links) > 0) {
    $output = '<ul'. drupal_attributes($attributes) .'>';

    $num_links = count($links);
    $i = 1;

    foreach ($links as $key => $link) {
      $class = $key;

      if ($i == 1) {
        $class .= ' first';
      }
      if ($i == $num_links) {
        $class .= ' last';
      }

      $class .= ' clearfix';

      if (isset($link['href']) && 
         (
           $link['href'] == $_GET['q'] || 
           ($link['href'] == '<front>' && drupal_is_front_page()) || 
           //Ключевой момент определения что материал принадлежит к активной книге
           //Определяется по url линка меню и текущему url.
           stripos(request_uri(), url($link['href'])) !== FALSE 
         )) {
        $class .= ' active';
        $output .= '<li'. drupal_attributes(array('class' => $class)) . '>'
          . '<div class="l-t"><div class="r-t"></div><div class="f-t"></div></div>'
          . "<a href='".url($link['href'])."'". drupal_attributes($link['attributes']).">".$link['title']."</a>"
          . '<div class="l-b"><div class="r-b"></div><div class="f-b"></div></div>';
      } else {

        $output .= '<li'. drupal_attributes(array('class' => $class)) . '>'
         . "<a href='".url($link['href'])."'". drupal_attributes($link['attributes']).">".$link['title']."</a>";

      }

      $i++;
      $output .= "</li>\n";
    }
    $output .= '</ul>';
  }
  return $output;
}

Ну вот в общем-то и все, осталось вызвать функцию в нужном месте шаблона:

<?php echo main_menu($primary_links) ?>

Кстати хитрая конструкция из дивов нужна для придания выделенному пункту меню формы с закругленными краями: Скриншот

При наличии 4 изображений угловых элементов можно использовать следующий css:

ul.main-menu { list-style-image: none; list-style-type: none; margin:0 0 40px 20px; }

ul.main-menu li {
  _height:1px;
  zoom:1;
  margin:6px 0;
}

ul.main-menu li a {
  color: #486d0f;
  font-size:1.2em;
  font-weight:bold;
  padding-left:10px;
}

.main-menu li.active a {
  background: #85a008;
  border-left:1px solid #ffc86d;
  border-right:1px solid #ffc86d;
  padding: 0 10px;
  color:#fff;
  text-decoration: none;
  display:block;
}

.main-menu li.active {
  margin-top:0;
}


.active .l-t {
  background: url('images/left-top.png') top left no-repeat;
  height:7px;
  overflow:hidden;
}

.active .r-t {
  background: url('images/right-top.png') top left no-repeat;
  height:7px;
  width:7px;
  float:right;
  overflow:hidden;
  margin-left: -7px;
}

.active .f-t {
  height:6px;
  margin:0 7px;
  background: #85a008;
  border-top:1px solid #ffc86d;
  overflow:hidden;
}


.active .l-b {
  background: url('images/left-bottom.png') no-repeat;
  height:7px;
  overflow:hidden;
}

.active .r-b {
  background: url('images/right-bottom.png') no-repeat;
  height:7px;
  width: 7px;
  overflow:hidden;
  float:right;
  margin-left: -7px;
}

.active .f-b {
  height:6px;
  margin:0 7px;
  background: #85a008;
  border-bottom:1px solid #ffc86d;
  overflow:hidden;
}
Метки:

В связи с переездом на новое ристалище, появилась потребность в новом домашнем компутере, потому как старый нужно будет оставить сородичам. Цены куснули. Больно. Но что делать, жена вздохнула и сказала: «Ну надо – так надо!» И вот я пронесся по магазинам, выискивая где что подешевле (все таки хакинтош – бюджетная тема). Железо кстати подбиралось специально максимально совместимое с OsX86. Итак конфигурация:

  • Мамка: Gigabayt GA-PE45-UD3 (раид мне нафег не нужен, хотя проще было найти UD3R)
  • Проц: Core Duo 8400 OEM
  • Видео: Gygabite 9600 GT 512 Mb
  • Память: 4 Гб (2 планки Hynix)
  • Веник: 500 Тб (WD Sata)

Железо собрано, комп завелся. Винда встала с пол пинка, установил ее чисто ради эксперимента :) Пока качался retail Mac OS X Install DVD 10.5.6 немного для общего развития покурил  insanelymac.com По своему железу нашел несколько полезных веток, но грузануть инсталяху с boot 132, как там советовали, так и не удалось. В ходе поисков выяснил у товарисча, что нужно включить AHCI, по другому OsX86 не умеет. Нашел мануальчик как это правильно сделать на RU-Board:

В Bios перед инсталляцией Mac OX X Install DVD на контроллере южного моста переключаем «Sata Port0-3 Native Mode» на “Disabled», на SATA портах JMicron контроллера переключаем “Onboard SATA/IDE Device” на “Enabled” и “Onboard SATA/IDE Ctrl Mode” на “AHCI”

К сему хочу добавить, что жесткий диск и CD SATA должны быть воткнуты в желтые разъемы на материнке, ни в коем случае ни в фиолетовые GSATA контроллеры!

И вот тут то я наткнулся на пост товарисча Auzigog. Который на аналогичной материнке поднял OsX86. Поднял, раскочегарил, да и еще во всех подробностях описал процесс и выложил готовый набор для установки. Огромный ему за это респект! Respect, Auzigog! Ну и дабы облегчить вашу участь я опишу теперь уже на родном языке как это было у меня :)

Этап первый – Установка

  1. С помощью UltraISO 9 закатал dmg образ Mac Os X на DVD (Способ подглядел на AppleLife)
  2. Настроил AHCI в биосе, заодно сказал ему грузиться с CD
  3. Скачал UD3P-package. Спасибо Auzigog!
  4. Замечательной бесплатной тулзой Image burner, (Nero 7 почему-то писал криво, из-за чего я сутки убил зазря, пытаясь понять почему не могу загрузиться ни с одного образа) записал образ grub-dfe.iso на CD-RW.
  5. Загрузился с записанного CD
  6. Когда появилось приглашение «Boot:», поменял CD на инсталляционный retail DVD
  7. Когда появился вопрос откуда грузиться, задал fe (по умолчанию вариант в квадратных скобках)
  8. Инсталляция пошла! В меню вызываем Disk Util в которой разбиваем жесткий диск как нам надо, не забываем выставить схему разделов GUID, это важно, в MBR OsX ставится откажется напрочь.
  9. Все, далее инсталлируем Mac Os.

Этап второй – Загрузчик

  1. После того, как ось встала, перегружаем ее и снова вставляем наш CD-RW.
  2. На этот раз вместо fe, выбираем жесткий диск 80 с которого будет грузится ось
  3. Из кашерного набора UD3P-package монтируем Chameleon_DFE_for_Hard_Disk.dmg, перетаскиваем файлы из папки “Kexts for Chameleon” на ярлык “Extra Contents” в окне Хамелеона.
  4. Запускаем Chameleon_DFE_for_Hard_Disk.pkg для установки загрузчика.
  5. Перегружаемся и снова грузимся с CD. На этот раз используем опцию -x для загрузки в safe mode
  6. Опять же из кашерного набора запускаем Universal OSx86 Installer
  7. В папке Kexts for Uinstaller заменяем драйвер сетевушки Reatlek1000.kext на AppleRTL8169Ethernet.kext, потому как реалтековский драйвер на моей мамке не завелся
  8. Выбираем следующие опции:
    • Выбираем место для установки загрузчика, я выбрал системный диск
    • Boot timeout ставим 5
    • Native resolution – 1680×1050
    • Install PC_EFI v9 Chameleon
    • Apply Ethernet EFI String (Time Machine Fix)
    • Apply EFI String for video card (Если ваша видеокарта есть в списке можно заодно прописать для нее стринги, моей видюхи здесь не оказалось)
    • Жмем “Add extra kexts” и выбираем все файлы в папке “Kexts for Uinstaller”
  9. Сохраняем загрузчик
  10. Вытаскиваем загрузочный CD, перегружаемся

Вот на этом этапе у меня заработало все кроме видюхи.

Этап третий – Видюха

  1. Во первых почитал чо пишут умные люди (куда нам до них :)
  2. А ведь пишут все правильно, поэтому ищем и качаем osx86tools
  3. Качаем драйвера AquaMac и инсталлируем их
  4. Запускаем osx86tools и генерим EFI string для нашей видяхи
  5. Перезапускаем комп

Все! На этом этапе пожалуй наступает хэппи энд. Комп вполне нормально перегружается, засыпает, видяха работает отлично, демонстрирует отменные FPS по OpenGL тестам, сеть работает. Единственно иногда комп зависает намертво, шевелится только мышка. Случается это очень редко и как это побороть пока не знаю.

Метки: , ,

Вдогонку статье по темизации формы поиска, хочу запостить самый простой на мой взгляд вариант темизации кнопки поиска, найденный совместно с Аленкой. Заключается он в правке css:

#search-block-form .submit input {
  /* Описание стиля */
  width:60px;
  height: 26px;
  padding: 0;
  margin: 0;
  border: 0;
  background: transparent url('images/button_search.png') no-repeat center top;
  overflow: hidden;
  cursor: pointer;
  cursor: hand; /* хак для IE 5.x */
}

В итоге вместо кнопки имеем картинку, работающую как кнопка.

Метки:

Сразу оговорюсь, пишут что метод работает и для ActivePerl, но я не пробовал, последние мои изыскания касаются исключительно Strawberry perl.

  1. Идем на сайт проекта pgFoundry. И в разделе Файлы выбираем версию подходящую для нашего Perl, копируем прямую ссылку на пакет с расширением .ppd, для меня подходящим оказался DBD-Pg-2.10.0-Perl5.10.ppd.

  2. Запускаем консоль и набираем команду

    ppm install http://pgfoundry.org/frs/download.php/1891/DBD-Pg-2.10.0-Perl5.10.ppd

  3. Теперь там же забираем файл msvcr80.dll и копируем его в bin каталог нашего Strawberry perl.

  4. Копируем Pg.dll.manifest из \site\lib\auto\DBD\Pg в bin каталог и переименуем его в perl.exe.manifest.

Все. получаем рабочий модуль DBD::Pg

Метки: , ,

cpan

Не поверите, но процедура настолько проста, что ее описание сложно подтянуть под формат статьи.

Опишу ее по шагам:

  1. Запускаем консоль, любую, которую вы используете: cmd, far, console2. Лично я использую последнюю. Это open source проект, возможности достаточно интересное, но не в формате данной статьи.

  2. Набираем в командно строке: cpan

  3. После того как появилось приглашение cpan> можно устанавливать модули из репозитория cpan. Для установки исползуется команда install имя_модуля. Чтобы поискать модуль наберите команду i /имя_модуля/.

Все! Единственно пока что с чем пришлось повозиться это установка модуля DBD::Pg. С этим в Windows всегда были проблемы, но теперь и это не патовая задача.

Метки: , ,

Чтобы перл задружил с апачем, сделаем несколько изменений в конфиге апача. 1. Сделаем так, чтобы папка в которой лежат наши .pl скрипты запускались апачем как cgi скрипты, для этого в настройках нашего хоста, например внутри хоста: ServerName xxx DocumentRoot «C:\xampp\htdocs\xxx» DirectoryIndex index.pl ErrorLog C:\xampp\apache\logs\xxx\error.log LogLevel warn

добавим следующие строки: AllowOverride All Options +ExecCGI +FollowSymLinks AddHandler cgi-script .pl

Теперь apache понимает все .pl файлы в папке C:\xampp\htdocs\xxx как cgi скрипты.

  1. Для того чтобы apache не искал perl по линуксовому пути указанному в первой строке скрипта, например #!usr/bin/perl, а определял путь к перлу из реестра (как было настроено в «Свойствах папки») добавим в пределах блока строку:

ScriptInterpreterSource registry

В результате получим настройки для хоста: ServerName xxx DocumentRoot «C:\xampp\htdocs\xxx» DirectoryIndex index.pl ErrorLog C:\xampp\apache\logs\xxx\error.log LogLevel warn

AllowOverride All Options +ExecCGI +FollowSymLinks AddHandler cgi-script .pl ScriptInterpreterSource registry Читать далее:

Метки: , ,

Strawberry perl

Некоторое время посидев в Линуксе и проторчав с системы, мне было сложно вернуться обратно в Винду. Сделать это пришлось благодаря появлению в моей жизни безнеса тесно связанного с такими монстрами как Photoshop, Corel, Illustrator ну и еще ряда других виндовых программ. Пытался поюзать весь этот набор через VmWare, но рабочая тачка тяжело тянула монстров под варей. Ломало долго… В работе нужны были LAMP, локальный перл, хотелось отлаживать приложения локально а не сидеть в MC через SSH. Долго метался между различными виндовыми сборками perl и наконец нашел то самое маленькое программистское счастье!

Strawberry perl – «A 100% Open Source CPAN-capable Perl for your Windows® computer that works exactly the same as Perl everywhere else». CPAN-capable звучит обнадеживающе и я решил снести Active Perl и попробовать клубничку :)

Скачал и установил версию Perl 5.10.0.4, затем через Свойства папки ассоциировал расширение .pl с «C:\strawberry\perl\bin\perl.exe».

Затем настроил конфиг апача для моего хоста, чтобы перловые скрипты распознавались апачем как cgi, установил необходимые мне модули прямо с cpan(!), немного повоевал с DBD::Pg модулем и вуаля! Фантастик! Все работает! Только что стянутый из svn-а, работающий под линуксом сайт написаный на перле работает в моей Windows XP.

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

Задача: полностью контролировать содержимое блока, в который выводится форма поиска по сайту.

Итак, в папке темы создаем файл block-search-0.tpl.php и пастим в него содержимое типа:

<div id="block-<?php print $block->module . '-' . $block->delta; ?>" 
  class="<?php print $classes; ?>">
  <div class="block-inner">
    <div class="content">
      <?php print $block->content; ?>
    </div>
    <?php print $edit_links; ?>
  </div>
</div>

Здесь мы описали обертку для блока. Теперь нужно его наполнить внутренностями, для этого создадим в папке темы еще один файл search-block-form.tpl.php и поместив в него код нашей поисковой формы:

<table>
  <tr>
    <td class="keys">
      <?php print $rendered_search_form["keys"]; ?>
    </td>
    <td class="submit">
      <?php print $rendered_search_form["submit"]; ?>
    </td>
  </tr>
</table>
<?php print $rendered_search_form["form"]; ?>

Теперь необходимо переопределить функцию ядра Drupal template_preprocess_search_block_form которая отвечает за вывод формы поиска, для этого в файле темы template.php вставляем следующую функцию:

<?php
  function phptemplate_preprocess_search_block_form(&$vars, $hook) {

    unset($vars['form']['search_block_form']['#title']);
    $vars['form']['submit']['#value'] = t('Найти');
    $vars['form']['submit']['#attributes'] = array('onmousedown' => 'return!1');
    $vars['form']['search_block_form']['#value'] = "поиск";
    $vars['form']['search_block_form']['#attributes'] = array('class'=>'noactive');

    foreach (element_children($vars['form']) as $key) {
      if(isset($vars['form'][$key]['#printed']) && $vars['form'][$key]['#printed'] == 1) {
          unset($vars['form'][$key]['#printed']);
      }
    }

    $vars['rendered_search_form']['keys'] = drupal_render($vars['form']['search_block_form']);
    $vars['rendered_search_form']['submit'] = drupal_render($vars['form']['submit']);
    $vars['rendered_search_form']['form'] = drupal_render($vars['form']);

  }
?>

Для реализации моей формы понадобится так же небольшой javascript, для его реализации так же создан в папке темы отдельный файлик с расширением .js:

$( function() {

  $('#edit-search-block-form-1').mousedown( function() {
    if ($(this).val() == 'поиск') {
      $(this).val('');
      $(this).removeClass('noactive');
      $(this).focus();
    }
  }).blur( function() {
    if ($(this).val() == '') {
      $(this).addClass('noactive');
      $(this).val('поиск');
    }
  });

  $('#site-enter').mousedown( function() {
    $('#block-user-0').fadeIn('fast');
    $('#block-user-0 #edit-name').focus();
  })

});

Ну вот, осталось только определить CSS стили для элементов формы и почистить кеш Drupal:

#edit-search-block-form-1 {
  color:#333;
  width:150px;
}

#edit-search-block-form-1.noactive {
  color:#d6cab1;
}

В результате получаем такую вот формочку, когда ставим курсор в текстовое поле, оно очищается для ввода строки поиска, при потере фокуса в нем снова появляется слово «поиск».

search_from

А здесь можно узнать как вместо кнопки использовать картинку.

Метки: ,