sitemap

Четверг, 5 июня, 2008

Буквально пару дней, как яндекс стал поддерживать sitemap

появился раздел “Файлы Sitemap” в панели вебмастера, где можно добавить путь к этому файлу.

также путь можно указать в robots.txt


User-agent: Yandex
Sitemap: http://sumskyi.com/sitemap.xml

выкладываю маленькую штуку для генерирования этих самых сайтмапов из базы данных MySQL
required: ruby, activerecord (часть ruby on rails, ror)

Это походу и маленькое руководство по использованию activerecord без рельсов

размазано по 3м файлам
- данных для коннекта
- код
- шаблон

шаблон содержит только обязательные параметры формата sitemap.

bin/db.yml:


adapter: mysql
database: sumskyi
username: root
password: ~
host: localhost
encoding: utf8

bin/sitemap.rb:


#!/usr/bin/env ruby

require 'rubygems'
require 'activerecord'
require 'erb'

cur_dir = File.dirname(__FILE__)

template = File.read("#{cur_dir}/sitemap.erb")

dbconfig = YAML::load(File.open("#{cur_dir}/db.yml"))

ActiveRecord::Base.establish_connection(dbconfig)

class Article < ActiveRecord::Base
end

@urls = Article.find(:all, :select => 'id, link, DATE_FORMAT(created_at, "%Y-%m-%d") as cr', :order => "id ASC")

sitemap = ERB.new(template).result(binding)

file =  File.new('../sitemap.xml', 'w+')
file.puts sitemap
file.close

bin/sitemap.erb:


<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"><% for url in @urls %>
  <url>
    <loc>http://sumskyi.com/articles/<%= url.link %></loc>
    <lastmod><%= url.cr %></lastmod>
  </url><% end %>
</urlset>

Console tool for Kohana unit-test module

Суббота, 19 апреля, 2008

Мой текущий похапэ-фреймворк Kohanaphp для тестирования предоставляет модуль, работающий через веб-интерфейс…

Мне это несколько дико, поэтому нацарапал консольную приблуду на ruby, которая парсит этот самый веб-интерфейс.

Скриншот прилагается.

Скрин

Для использования поправить SITE_URL в 17й строке и chmod a+x
run_tests.rb

Exception Conference #07

Понедельник, 17 марта, 2008

Удачно так сходил, выиграл Ipod Nano 8GB

С линуксами, естественно, проблемы.

“Неприятный сюрприз приготовила компания Apple пользователям ОС Linux. Дело в том, что последнее поколение популярных плееров iPod не работает с открытой ОС.

Происходит это потому, что в новые плееры встроена функция автоматического присваивания криптографической контрольной суммы базе данных записей, находящихся в памяти устройства. Это необходимо для того, чтобы приложения сторонних разработчиков не смогли синхронизировать контент с плеерами iPod.”

мастдайный iTunes кое-как завелся под wine, зато не увидел железяку.

Прослушал 3 доклада по python. Метаклассы и дескрипторы / PEAK rules / Django как платформа для фрилансера.

Для поверхностно знакомого с питоном это грузок. До ruby не дождался, но там доклады были тоже нишевые. Stroke DB какое-то ))). Подозреваю, что это что-то типа KirbyBase

Рецепты Капистрано

Вторник, 11 марта, 2008

проблема:
не получается выполнять команды на удаленном хосте

no such file or directory: /usr/bin/env (php, mysql, etc.)

решение: установка $PATH


default_environment["PATH"] = '/opt/csw/php5/bin:/opt/csw/mysql5/bin:/opt/csw/bin:/usr/sbin:/usr/local/bin:$PATH'

проблема: аяяй, чекаут кода (таски setup, update_code, rollback_code, and symlink) пытается выполняться во всех ролях!! (на мейл сервере, на MySQL сервере и т.д. )

решение: прописываем у таких ролей :no_release => true


role :mail, config_production[:mail][:host], :no_release => true
role :solr, config_production[:solr][:host], :no_release => true
role :db, config_production[:db][:host], :no_release => true

проблема: не можем выполнить удаленную команду, т.к. не можем даже влогиниться (начиная от версии Capistrano 2.1)

** [err] Permission denied, please try again.
** [err] Permission denied, please try again.
** [err] Permission denied (publickey,gssapi-with-mic,password).
svn: Connection closed unexpectedly

решение: Начиная с версии 2.1, капистрано больше не запрашивает pty в каждой команде. Проблема в том, что на некоторых системах (на Соляре точно, проверено) некоторые команды (svn, passwd) автоматически впадают в неинтерактивный режим.


# по умолчанию оно false
default_run_options[:pty] = true

проблема: я хочу получить данные коннекта к базе от пхпшного приложения в руби, и юзать для сетапа чего-нибудь, и пусть мне дадут готовый хеш
решение: (для Symfony)
php кусок


// гдето тут берется DSN
// mysql://root:pwd@localhost/mydb
$data =  preg_split('(://|@|/|:)', $link);
list($conf_arr[':dbtype'], $conf_arr[':user'], $conf_arr[':pass'], $conf_arr[':host'], $conf_arr[':dbname']) = $data;
echo base64_encode(sfYaml::dump($conf_arr));

руби кусок (получаем настоящий юзабельный тру-хеш с символами в кач. ключей)


  # Get DB conf
  desc "Get DB connection hash"
  task :db_get_conf, :roles => :web do
    enc = ""
    run "cd #{app} && php deploy-db-sendconf.php" do |channel, stream, data|
      enc = data
      raise data if stream == :err
    end
    # base64decode & convert to hash from YAML
    YAML.load enc.unpack("m")[0]
  end

авторизация (ручками)


  # restart apache webserver
  desc "Restart the web server"
  task :restart, :roles => :web do
    sudo "svcadm restart svc:/network/http:cswapache2" do |ch, stream, out|
      ch.send_data "#{sudo_password}\n" if out =~ /^Password:/
      raise out if stream == :err
    end
  end

вроде бы хватит сегодня

Капистрано cli для не-ROR проектов

Вторник, 11 марта, 2008
После месяца копаний в Capistrano хочу поделиться некоторыми знаниями, собранными по крупицам где попало.
Документация, нужно заметить, не на высоте. Хотя, для деплоймента родных Ruby On Rails проектов ее хватает.Итак, задача по деплойменту PHP проекта, написанного на Symfony.
Процесс деплоймента размазан тонким слоем по 3м веб-серверам (test, staging, production) + mail сервер + сервер перекодировки видео + сервера баз данных.Создано консольное ruby приложение, внутри которого и поднимается Capistrano


gem 'capistrano', '>= 2.1.0'
require 'capistrano/cli' # капистрановский command-line utility
require 'modules/logger/' # свой логгер

# почему-то родной конфиг был только для чтения, а мы хотим писать (смотреть ниже cap_conf.logger к примеру)
module Capistrano
  class Configuration
    attr_accessor :config
  end
end

# а вот и наш экземпляр, который хавает таски и выполняет
cap_conf = Capistrano::Configuration.new

# вот свой логгер
cap_conf.logger = DepLogger.getInstance()

# грузим задачи
cap_conf.load 'deploy' # базовые таски из lib/capistrano/recipes/deploy.rb

# файлы задач названы инкрементально (01_xxx.rb, 02_xxx.rb, 03_xxx.rb)
Dir['tasks/*.rb'].sort.each do |plugin|
  cap_conf.load(plugin)
end

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


cap_conf.myproject.create

В namespace myproject таск create выглядит так:


namespace :myproject do

  desc "Create Myproject"
  task :create, :roles => :web do

    # включаем транзакцию
    transaction do
      on_rollback do
        site.rm_after_import  # site это один из таск-неймспейсов, подгруженых ранее.
      end

      # выполнение тасков
      site.task1
      # ...
      # ...
      site.task10

    end

  end

end

Чтобы удалить роровское непотребство при деплоймент процессе, переопределяем родной deploy:finalize_update в одном из тасков, напр в 10_xxx.rb
речь идет о директориях log, public, tmp, system, pids, все то, что закомментировано.



# Override some RoR artefacts
namespace :deploy do

  desc < <-DESC
    Touches up the released code, etc. See original Capistrano description
  DESC
  task :finalize_update, :except => { :no_release => true } do

    sudo "chmod -R g+w #{latest_release}" if fetch(:group_writable, true)
    sudo "chown -R #{conf[:owner_user]}:#{conf[:owner_group]} #{latest_release}"

    # mkdir -p is making sure that the directories are there for some SCM's that don't
    # save empty folders
    #run < <-CMD
    #  rm -rf #{latest_release}/log #{latest_release}/public/system #{latest_release}/tmp/pids &&
    #  mkdir -p #{latest_release}/public &&
    #  mkdir -p #{latest_release}/tmp &&
    #  ln -s #{shared_path}/log #{latest_release}/log &&
    #  ln -s #{shared_path}/system #{latest_release}/public/system &&
    #  ln -s #{shared_path}/pids #{latest_release}/tmp/pids
    #CMD

  end

end

В принципе это все. Как обойти некоторые спотыкачки (хождение через gateway только в одной из ролей, неработающий sudo, etc.), опишу в следующий раз.