Новый год 2008 (Норвегия, Швеция, Дания). Крунхюсет – старейшее здание Гётеборга
Перу и Боливия. Зима-весна 2011. Солончак Уюни
Байкал, остров Ольхон, Хужир. Март 2018. Дерево
Перу и Боливия. Зима-весна 2011. Ламы
Байкал, остров Ольхон, Хужир. Март 2018. Дорога на Ольхоне
Тенерифе.
Исландия 2023.
Новый год 2008 (Норвегия, Швеция, Дания). Дорожка
Лето 2008 (Куба). Сенфуегос — Театр Томаса Терри
Гармиш-Партенкирхен, Миттенвальд, Инсбрук. Май-июнь 2022. Еще одно вкусное баварское пиво
Осень. %!s(<nil>)
Хорватия, Млини 2017. Панорама Млини
Лето 2008 (Куба). Типичный Кубинский пейзаж
Перу и Боливия. Зима-весна 2011. Закат
Тойфельсберг. %!s(<nil>)
Стамбул 2024. %!s(<nil>)
Ирландия. %!s(<nil>)
Перу и Боливия. Зима-весна 2011. Куско, малыш
Ирландия, март 2015. Еще один типичный квартал
Хорватия, Млини 2017. Пляж
Киев, лето 2009. Разрушенный вандалами и реставрируемый памятник Ленину
Байкал, остров Ольхон, Хужир. Март 2018. Ольхон
Тенерифе.
Перу и Боливия. Зима-весна 2011. Сочное фото
Чешская Швейцария и немного Дрездена. Дорога вдоль реки
Тайланд 2018. %!s(<nil>)
Весна 2012. Германия — Франция — Италия. Трасса Формулы 1 в Монте-Карло
Перу и Боливия. Зима-весна 2011. Солончак Уюни
Тенерифе.
Весна 2012. Германия — Франция — Италия. Толпа в Каннах
Новый Год 2009 (Амстердам). типичная обувь без голландца

Backup-manager — настройка резервного копирования Linux-сервера на Amazon S3 за 5 минут

Настраиваю сейчас под свои веб-девелоперские нужды сервер на основе Debian lenny и когда дошел до настройки резервного копирования данных стало понятно, что задача эта хоть и простая, но очень уж муторная: нужно написать и отладить скрипты, которые будут архивировать нужные папки (причем желательно делать инкрементальные архивы), базы данных, хранилища subversion, а затем переносить эти архивы на удаленный сервер. Задача в общем-то посильная для любого опытного программиста, но минимум день-два написание этих скриптов отнимет.

Очень удачной находкой для решения этой задачи стал backup-manager — это бесплатный набор bash-скриптов, позволяющих:

  • архивировать любые папки, в том числе и создавать инкрементальные архивы. В конфиге просто указывается список директорий, которые должны быть скопированы, а также “черный список” файлов, которые копироваться не будут.
  • делать резервное копирование баз данных MySQL. В конфиге указываются логин и пароль mysql-юзера, имеющего доступ к базам, а всю остальную работу backup-manager делает сам.
  • делать резервное копирование svn-репозиториев, причем бэкап делается не копированием папки с хранилищем, а с помощью команды svnadmin dump.
  • копировать созданные архивы на удаленные сервера по FTP, SSH или (это самая важная для меня фича) в хранилище Amazon S3, а также записывать их на DVD.

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

Правда запустить копирование архивов на Amazon S3 с ходу не получилось, описание и решение возникших трудностей под катом.

Читать дальше ➠

Зима 2010. Поездка в Тайланд, Индонезию и Сингапур. Часть 3 — Бали, Сингапур, Пхукет

В первый же день на Бали я взял урок катания на сёрфе. Оказалось что этот спорт требует большей физической подготовки чем может показаться на первый взгляд! Учиться было очень интересно и я уже размечтался о том, что все 6 дней, которые мы запланировали провести на Бали, буду кататься доске. К сожалению в этот день я ооочень сильно обгорел, настолько сильно что пришлось обратиться к врачу который в течение двух дней делал мне какие-то процедуры для залечивания ожога, а оставшееся время я ходил в повязке, с которой нельзя было купаться. Очень обидно было провести столько времени в таком месте и не купаться совсем :( Правда кроме пляжей на Бали есть множество мест достойных посещения. Весь остров реально объехать дня за два, такси на целый день стоит около 500 тысяч рупий (50 баксов), причем это официальная такса, по такой цене такси можно забронировать хоть в отеле. Мы, правда, изначально этой цены не знали, по этому взяли таксиста на улице и в итоге заплатили ему 600 тысяч за день, за который мы успели объехать пол острова.

Читать дальше ➠

Зима 2010. Поездка в Тайланд, Индонезию и Сингапур. Часть 2 — Джокьякарта

В Джокьякарту поезд прибыл в 12 часов ночи и как только мы вышли за пределы местной железнодорожной платформы (назвать вокзалом это сооружение язык не поворачивается) к нам сразу прицепился местный “френд” по имени Бенни, который пообещал показать нам самый хороший и недорогой отель. Бродить ночью по незнакомому городу в поисках гостиницы желания не было, по этому мы доверились новому другу, который не обманул, привел в достаточно приличный отель, в котором мы оплатили сначала одну ночь, а на следующее утро, пошатавшись по окрестным гостиницам, решили остаться здесь и на вторую ночь. Бенни потом еще ходил за нами тенью целый день и как только мы собирались потратить деньги (пообедать, сдать вещи в прачечную, заказать такси) появлялся возле нас так, будто бы это он нас привел в это заведение. Потом он наверняка брал какой-то свой процент с владельцев посещенных нами кафешек, но зато у нас, в отличии от кубинских френдов, денег за свои услуги никаких не просил, а в конце куда-то пропал даже не попрощавшись. Удивительный дядька.

Практически для всего нашего путешествия мы заранее купили билеты, кроме билетов на поезд Джакарта — Джокьякарта и билетов на самолет с острова Ява (Джокьякарта) до острова Бали (Денпасар). Сделали мы так для того чтобы уже на месте решить сколько времени проведем в Джакарте и Джокьякарте, по этому утром первого дня пребывания в Джокьякарте мы прикинули сколько времени понадобится на осмотр достопримечательностей и купили билеты на самолет до Денпасара. По нашим расчетам в Джокьякарте достаточно было провести всего 2 ночи (с учетом той одной которую мы там уже были): один день потратить на осмотр Боробудура и Прамбанана, а во второй день забраться на вершину вулкана Мерапи (всего-то 2,9 километра высотой) после чего вечером того же дня можно будет улететь на Бали.

За первый день мы осмотрели храмы Прамбанан и Боробудур, которые оказались очень похожими на камбоджийский Ангор Ват. Прогулка по этим местам была очень приятной, но из за того что Индонезия находится в южном полушарии Земли, сейчас там идет не зима, как у нас в северном полушарии, а лето — сезон дождей. В отличии от Таиланда, в котором я два раза бывал в сезон дождей и в котором эти дожди не сильно портят отдых, так как заканчиваются достаточно быстро, в Индонезии дожди длились по много часов, часто выпадали днем и немного подпортили нам осмотр древних храмов.

Читать дальше ➠

Зима 2010. Поездка в Тайланд, Индонезию и Сингапур. Часть 1 — Пхукет и Джакарта

Ура! В этом году таки получилось (хотя и не без труда) вырваться в отпуск! Опять поехали с друзьями в Азию в этот раз по маршруту: Тайланд, остров Пхукет — Индонезия (ура, я впервые пересек экватор:)), острова Ява (Джакарта, Джокьякарта) и Бали (Денпасар, Легиан бич) — Сингапур — Пхукет.

Вся поездка заняла две недели (ох, как же хотелось побыть там еще хотя бы недельку!) и ниже мои о ней впечатления.

Фотографии из этого путешествия доступны в фотогалерее.

На Пхукете я оказался уже в третий раз: первые два раза был там летом 2005 и 2007 года. За последние три года остров очень сильно изменился: теперь там на каждом шагу русские туристы, в каждой второй кафешке меню на русском языке (которые, между прочим, от этого становятся значительно менее понятными), из торговых рядов постоянно доносятся завлекающие выкрики продавцов типа “Давай-давай наливай”, которые ну ни как не стимулируют к посещению таких магазинчиков. Куда-то пропали толпы тайцев на мотороллерах, но зато появилось много автомобилистов, что привело к появлению пробок, от которых не спасает даже то, что часть дорог Патонга, района в котором я отдыхал все три раза, сделали односторонними.

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

Но, в любом случае, все эти изменения совершенно не мешают отлично провести время на этом замечательном острове: яркое, но не палящее солнце (ох, как мне такого солнца будет не хватать через несколько дней на Бали), теплое море, пустые тихие пляжи (ну это, разумеется, если отъехать на мотороллере или тук-тукере на пяток километров от основных туристических троп в сторону Карона, например), что еще надо человеку день назад мерзнувшему в холодной серой Москве?! Ну разумеется суп Том Ям, арбузный шейк и свежевыжатый манговый сок! :) Это, наверное, самая вкусная еда на свете!

Читать дальше ➠

Шпаргалка по командам и хоткеям Unix

Стянуто отсюда: http://www.debian.org/doc/manuals/debian-reference/ch01.en.html

Хоткеи:

keydescription of key binding
Ctrl-Uстереть тест перед курсором (erase line before cursor)
Ctrl-Hстереть символ перед курсром (erase a character before cursor)
Ctrl-Dterminate input (exit shell if you are using shell)
Ctrl-Cterminate a running program
Ctrl-Ztemporarily stop program by moving it to the background job
Ctrl-Shalt output to screen
Ctrl-Qreactivate output to screen
Ctrl-Alt-Delreboot/halt the system, see inittab(5)
Left-Alt-key (optionally, Windows-key)meta-key for Emacs and the similar UI
Up-arrowstart command history search under bash
Ctrl-Rstart incremental command history search under bash
Tabcomplete input of the filename to the command line under bash
Ctrl-V Tabinput Tab without expansion to the command line under bash

Команды:

commanddescription
pwdвыводит текущую директорию (display name of current/working directory)
whoamiвыводит имя текущего юзера (display current user name)
idвыводит id текущего юзера (display current user identity (name, uid, gid, and associated groups))
file <foo>выводит тип файла, переданного в качестве аргумента (display a type of file for the file <foo>)
type -p <commandname>выводит расположение файла, вызывающегося при вводе команды (display a file location of command <commandname>)
type <commandname>выводит информацию о команде (display information on command <commandname>)
apropos <key-word>находит команды, связанные с переданным аргумеентом find commands related to <key-word>
whatis <commandname>display one line explanation on command <commandname>
man -a <commandname>display explanation on command <commandname> (Unix style)
info <commandname>display rather long explanation on command <commandname> (GNU style)
lslist contents of directory (non-dot files and directories)
ls -alist contents of directory (all files and directories)
ls -Alist contents of directory (almost all files and directories, i.e., skip .. and .)
ls -lalist all contents of directory with detail information
ls -lailist all contents of directory with inode number and detail information
ls -dlist all directories under the current directory
treedisplay file tree contents
lsof <foo>list open status of file <foo>
lsof -p <pid>list files opened by the process ID: <pid>
mkdir <foo>make a new directory <foo> in the current directory
rmdir <foo>remove a directory <foo> in the current directory
cd <foo>change directory to the directory <foo> in the current directory or in the directory listed in the variable $CDPATH
cd /change directory to the root directory
cdchange directory to the current user’s home directory
cd /<foo>change directory to the absolute path directory /<foo>
cd ..change directory to the parent directory
cd ~<foo>change directory to the home directory of the user <foo>
cd -change directory to the previous directory
</etc/motd pagerdisplay contents of /etc/motd using the default pager
touch <junkfile>create a empty file <junkfile>
cp <foo> <bar>copy a existing file <foo> to a new file <bar>
rm <junkfile>remove a file <junkfile>
mv <foo> <bar>rename an existing file <foo> to a new name <bar> (<bar> must not exist)
mv <foo> <bar>move an existing file <foo> to a new location <bar>/<foo> (the directory <bar> must exist)
mv <foo> <bar>/<baz>move an existing file <foo> to a new location with a new name <bar>/<baz> (the directory <bar> must exist but the directory <bar>/<baz> must not exist)
chmod 600 <foo>make an existing file <foo> to be non-readable and non-writable by the other people (non-executable for all)
chmod 644 <foo>make an existing file <foo> to be readable but non-writable by the other people (non-executable for all)
chmod 755 <foo>make an existing file <foo> to be readable but non-writable by the other people (executable for all)
find . -name <pattern>find matching filenames using shell <pattern> (slower)
locate -d . <pattern>find matching filenames using shell <pattern> (quicker using regularly generated database)
grep -e "<pattern>" *.htmlfind a “” in all files ending with .html in current directory and display them all
topdisplay process information using full screen, type q to quit
kill <1234>kill a process identified by the process ID: “<1234>”
gzip <foo>compress <foo> to create <foo>.gz using the Lempel-Ziv coding (LZ77)
gunzip <foo>.gzdecompress <foo>.gz to create <foo>
bzip2 <foo>compress <foo> to create <foo>.bz2 using the Burrows-Wheeler block sorting text compression algorithm, and Huffman coding (better compression than gzip)
bunzip2 <foo>.bz2decompress <foo>.bz2 to create <foo>
tar -xvf <foo>.tarextract files from <foo>.tar archive
tar -xvzf <foo>.tar.gzextract files from gzipped <foo>.tar.gz archive
tar -xvf -j <foo>.tar.bz2extract files from <foo>.tar.bz2 archive
tar -cvf <foo>.tar <bar>/archive contents of folder <bar>/ in <foo>.tar archive
tar -cvzf <foo>.tar.gz <bar>/archive contents of folder <bar>/ in compressed <foo>.tar.gz archive
tar -cvjf <foo>.tar.bz2 <bar>/archive contents of folder <bar>/ in <foo>.tar.bz2 archive
zcat README.gz > foocreate a file foo with the decompressed content of README.gz
zcat README.gz >> fooappend the decompressed content of README.gz to the end of the file foo (if it does not exist, create it first)

143989334-cover.jpg

Семинар по хапкидо в Днепропетровске

С 21 по 24 января был на семинаре по хапкидо в Днепропетровске, который проводил грандмастер Ким Нам Дже. Было здорово. Хотя это уже третий семинар по хапкидо, который я посетил, и кажется что с каждым разом физическая нагрузка становится все меньше.

О планах

Мы бываем на верху блаженства, когда планируем свое будущее, отбрасывая всякие ограничения с нашего оптимизма и силы воображения. К несчастью, Вселенная не всегда следует нашим планам.

Брайан Герберт «Батлерианский джихад»

Несколько статей о Друпале

В течение последнего года я написал три статьи о CMS Drupal, которые были опубликованы в бумажной и электронной версии журнала PC Magazine/RE. Сейчас я публикую “авторские” 1 версии этих статей. Каждая статья разбита на несколько разделов и ниже я привожу ссылки и описания каждого из них.

Первая статья “Разработка сайта на Drupal

  • Часть 1. Введение”. В этой части рассказывается о возможностях Друпала “из коробки”, а также об основных дополнительных модулях. Таксономия, ревизии, мультисайтинг — это совсем не страшно.
  • Часть 2. Архитектура Друпала”. Здесь сказаны общие слова о модульной системе Друпала, механизмах работы с формами, базой данных и кешем. Подробнее эти вопросы будут рассмотрены в следующих разделах и статьях.

После прочтения первых двух частей этой статьи новичок, задающийся вопросом “подойдет ли Друпал для моего нового суперстартапа”, должен на 100% определиться с ответом на этот вопрос. Вообще, в 95% случаев на этот вопрос можно ответить утвердительно, с оговоркой, что работать над проектом будет профессионал хорошо знакомый с Друпалом.

  • Часть 3. Модули Drupal”. CCK, Views, Imagecache, Panels, Ubercart — модули Друпала покрывающие 90% возникающих задач. В этой части статьи даны краткие описания каждого из перечисленных модулей.
  • Часть 4. Интранет-сайт на Друпале. Первый практический пример, в нем разрабатывается интранет-сайт для большой компании. Цель этого раздела — показать возможности, которыми обладает Друпал без доработки напильником. При разработке используются только существующие модули и не написано ни единой строчки программного кода. Аналогичное, только значительно более “кастомное” решение я успешно внедрил в одной из компаний со штатом в несколько сотен человек.
  • Часть 5. Социальная сеть на Друпале”. Точнее не социальная сеть, а коллективный блог с элементами социальной сети. Описание более новой версии примера описанного в этом раздедле можно найти на Швабрешвабр.
  • Часть 6. Оптимизация Друпал”. Этот раздел написал Александр Графов, он же axel. Друпал часто критикуют за низкую производительность. В этом разделе рассказано о приемах, позволяющих “разогнать” движок.

Вторая статья “Пример разработки модуля для Drupal

Третья статья “Темизация Друпал

  • Часть 1. Введение”. Во введении рассказано о шаблонных движках, которые могут быть использованы в Друпале, даны определения основных терминов, использованных в тексте (тема оформления, регион, блок), а также приведено несколько полезных ссылок.
  • Часть 2. Анатомия темы оформления”. Здесь дано подробное описание каждого из файлов-шаблонов, использующихся в темах оформления, а также рассказано о том, как определить отдельный шаблон для каждой страницы или группы страниц.
  • Часть 3. Forms API и темизация”. В этом разделе приводится пример разработки новой и изменения существующей формы с помощью Forms API Друпала, а также о изменении внешнего вида любого элемента формы в отдельности или формы целиком.
  • Часть 4. Темизация Views”. Небольшой раздел, рассказывающий о том, как изменить внещний вид данных, возвращаемых модулем Views.
Читать дальше ➠

Темизация Drupal. Часть 4. Темизация Views

Views — один из самых востребованных модулей для Drupal — позволяет создавать списки документов (представления, view), отфильтрованные по любому сложному алгоритму. На выходе модуль возвращает массив данных, который выводится в шаблоне, соответствующем выбранному администратором типу отображения (display) данных. Каждое представление может быть отображено в виде таблицы, маркированного списка, решетки (grid) и т. п. Чтобы переопределить используемый для отображения представления шаблон, нужно в свойствах представления в блоке Basic settings найти параметр Theme information и посмотреть в нем имена шаблонов, которые могут быть использованы модулем для отображения текущего представления. Затем нужно в подпапке theme модуля Views найти шаблон, соответствующий выбранному типу отображения (например, views-view-table.tpl.php для табличного варианта отображения или views-view-list.tpl.php для списка), скопировать его в папку с текущей темой оформления и присвоить ему одно из имен, перечисленных в Theme information. Теперь созданный шаблон можно настроить для своих нужд.

Читать дальше ➠