Uniвсячина

понемножку о Linux и программировании

Печатаем по 2 страницы на лист

В связи с покупкой принтера, озаботился проблемой распечатки книжек. Так как книги обычно верстают под размер бумаги letter, а печатаю я на А4, то встает проблема, как уместить 4 страницы книжки на одном листе бумаге (по 2 страницы с каждой стороны) и как наименее безгеморно распечатать это.

Для нашей нелегкой задачи нам нужен пакет psutils.

Делаем раз — разбиваем нашу книжку по 2 страницы на лист:

psnup -2 book.ps book-2.ps

Делаем два — разбиваем файл на два. В первом будут нечетные страницы в обратном порядке, во втором – четные в прямом:

psselect -e -r book-2.ps book-2-even-reverse.ps
psselect -o book-2.ps book-2-odd.ps

Делаем три — вставляем в принтер побольше бумаги и запускаем на печать файл book-2-even-reverse.ps. Между постановкой файла на печать и началом печати может пройти много времени, если postscript-файл большой и сложный. Например, у меня сейчас 80 страниц рендерятся уже больше часа (потому что в них растр отсканированной книги).

Делаем четыре — распечатанные листы снова закладываем в принтер и пускаем на печать файл book-2-odd.ps, чтобы распечатать нечетные страницы с обратной стороны листов.

Если вы хотите распечатать книжку по всем канонам, сшивая листы в тетрадки, посмотрите на утилиту psbook.

Если оригинальный файл в pdf, то можно поставить пакет pdfjam с аналогичными утилитами для pdf, а можно сконвертировать pdf в ps.

Firefox 3.5 и Ubuntu 9.10

Граждане, будьте бдительны! В Ubuntu 9.10, Firefox 3.5 работает под профайлом apparmor. Что в свою очередь может приводить к разным малообъяснимым глюкам. Например, у меня он напрочь отказывался сохранять файлы в папку /data/ (причём молча).

Если вы столкнулись с подобным поведением, откорректируйте файл /etc/apparmor.d/usr.bin.firefox-3.5 и перезагрузите конфигурацию командой invoke-rc.d apparmor reload.

Foreign Keys для ActiveRecord

Делаю очередной проект на Ruby on Rails. Как обычно, в миграциях понадобились foreign keys на уровне БД. Окинул взглядом все плагины, которые смог найти в google и на github.com. Ни один из них не умеет делать FK, используя ActiveRecord::ConnectionAdapters::Table#references и ActiveRecord::ConnectionAdapters::TableDefinition#references.

Поэтому сел и написал свой плагин: active_record_foreign_keys.

Установка:

Rails::Initializer.run do |config|
  ...
  config.gem "active_record_foreign_keys", :source => "http://gemcutter.org"
  ...
end
rake gems:install

Использование:

...
def self.up
  # create reference table
  create_table :users do |t|
  end

  # create referencing table
  create_table :a_examples do |t|
    t.references :user, :foreign_key => true
  end

  # or
  create_table :b_examples do |t|
    t.references :user, :foreign_key => { :on_update => :cascade, :on_delete => :restrict }
  end

  # or
  create_table :c_examples do |t|
  end

  add_foreign_key :c_examples, :user_id, :users, :id, :on_update => :no_action, :on_delete => :set_null

  # or change existing table
  change_table :d_examples do |t|
    t.references :user, :foreign_key => true
  end
end

def self.down
  # remove constraint
  remove_foreign_key :examples, :user_id, :users, :id
end
...

Плагин тестировался только под PostgreSQL, но по идее должен работать и под MySQL, и под Sqlite.

UPDATED: Во всех новых проектах, я использую гем schema_plus.

Правильная установка GRUB на Software-RAID1

Если у вас RAID1 средствами ОС Linux и вы хотите, чтобы при “вылете” одного диска, система нормально загружалась, grub нужно установить с одной маленькой хитростью:

# grub
grub> root (hd0,0)
grub> setup (hd0)
grub> device (hd0) /dev/sdb
grub> root (hd0,0)
grub> setup (hd0)

Только что опробовал на практике — работает.

Внутреннее устройство реляционных баз данных

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

  1. Кортежи. Разбор запроса, построение AST, оптимизация AST. Построение плана выполнения
  2. Выполнение плана запроса
  3. Кэширование планов выполнения запроса
  4. Управление оперативной памятью
  5. Типы индексов: B-Tree, R-Tree, GiST, Bitmap, Hash, GIN