четверг, 23 декабря 2010 г.

Nginx - too many open files, 500-я ошибка

О том, как это исправить, можно прочитать тут: http://agafonov.pp.ru/blog/2010/07/21/%D0%B8%D1%81%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-too-many-open-files-%D0%B2-nginx/.
А если вкратце, то просто в /etc/nginx/nginx.conf прописать вот такую директиву.
Число чем больше, тем лучше. Но перебарщивать тоже не стоит.

среда, 22 декабря 2010 г.

Сброс root-пароля для mysql

Иногда случается такое, что теряется рутовый пароль от mysql. В таком случае, его можно сбросить  на новые. О том, как это сделать, можно прочитать в этой статье.

пятница, 19 ноября 2010 г.

/proc/kcore - что это такое, и как его удалить?

Освобождал место на сервере, и столкнулся со следующим: неведомый файл /proc/kcore занимает около 2 гигабайтов на винчестере:
-r-------- 1 root root 2.1G 2010-11-20 03:18 /proc/kcore
Место кончалось, и хотелось почистить как можно больше, но не станешь же просто так удалять файл, находящийся в /proc. Вдруг там что-то мегаважное храниться.
Оказалось, и не его надо трогать, удалять и вообще обращать внимание на его размер и то, сколько он места занимает. Если почитать man 5 proc, то увидим там следующее:
This file represents the physical memory of the system and is stored in the ELF core file format.  With this  pseudo-file,  and  an  unstripped
              kernel (/usr/src/linux/vmlinux) binary, GDB can be used to examine the current state of any kernel data structures.

              The total length of the file is the size of physical memory (RAM) plus 4KB.
Т.е. он просто напросто представляет собой физическую память сервера/компьютера. А его размер = размеру физической памяти + 4 килобайта. А реального места на винчестере он вообще не занимает.

Отличная статья по сборке deb-пакетов в Debian и Ubuntu

Хотелось разобраться, как собирать свои deb-пакеты в Debian и Ubuntu. Нашёл такую статью: http://habrahabr.ru/blogs/linux/78094/

вторник, 16 ноября 2010 г.

Хоткеи (Горячие клавиши) браузера Google Chrome

В этой статье перечислена масса удобнейших сочетаний клавиш для Хрома. Открыть новое окно, новую вкладку, перемещение по вкладкам, закрыть вкладку, перевести курсор в адресную строку и т.п.

понедельник, 15 ноября 2010 г.

Настройка bind для работы c доменами в зоне РФ

На самом деле, нет никаких проблем в том, чтоб dns для  доменов зоны РФ в bind9.
В реальности никаких таких русскоязычных доменов нет, браузеры просто перекодируют русские буквы с помощью punycode. Онлайн кодировщик есть тут, например: http://www.rlnic.ru/technology/encode.pl
Вбиваете свой домен, например, "Президент РФ", и получаете xn--d1abbgf6aiiy.xn--p1ai.
Далее прописываем этот xn--d1abbgf6aiiy.xn--p1ai как самый обычный домен.
Таким образом, алогритм такой:
1) Перекодируем свой РФ-домен из русских букв в punycode.
2) Прописываем за-"пуникоде"-нный домен в bind
3) Всё работает.

суббота, 13 ноября 2010 г.

Делаем табличку в HTML

Итак, как делать табличку в HTML?
Вот так:
Заголовочек
Поле левоеПоле правое
Как же выглядит html код этой таблицы?
Вот он:
<table border="1" style="border-collapse: collapse;">
<tr><th colspan="2">Заголовочек</th></tr>
<tr><td>Поле левое</td><td>Поле правое</td></tr>
</table>
Итак, что здесь что:
<table ..>....</table> - это основной тег таблицы, который говорит браузеру, что мы делаем таблицу.
border="1" style="border-collapse: collapse;" - толщина границ таблицы будет равна 1-му пикселю, при этом смежные границы будут объединяться.
<tr>...</tr> - тег - строка таблицы.
<th ...>...</th> - тег, обозначающий столбец заголовка.
colspan="2" означает, что этот столбец будет по ширине как 2 нормальных столбца.
<td>...<td> - обычный столбец таблицы.
Собственно, вот и всё, основное. За подробностями можете сходить сюда: http://htmlbook.ru/html/table/ и сюда http://www.w3schools.com/html/html_tables.asp.

суббота, 6 ноября 2010 г.

Мой HOW-TO по установке LDAP на Linux Debian (Ubuntu)


Решил я разобраться, как же всё-таки ставить и настраивать ldap в Debian.


1. Установка
Установка - это самая простая часть, всего 1 команда:
sudo aptitude install slapd ldap-utils
slapd - это пакет, который предоставляет сервер OpenLDAP в Debian.
ldap-utils - программы-клиенты для этого сервера.
По ходу установки нужно будет 2 раза ввести пароль записи admin.
2. Настройка
Я настраивал следующей командой:
sudo dpkg-reconfigure slapd
.
Вам зададут еще несколько вопросов, на которые нужно будет честно ответить:)
3. Заводим пользователей
Пользователи (да и не только пользователи, а вообще всё: юзеры, компьютеры, серверы; но для краткости буду использовать слово пользователи) в LDAP добавляются следующим образом:
Во-первых, все данные о пользователях заносятся в ldif-файлы, такие файлы специального формата, о них ниже.
Во-вторых, сам этот файл импортируется в LDAP.
Итак, создадим следующий ldif-файл (Можете скопировать и сохранить где-либо у себя на компьютере):
dn: ou=people,dc=example,dc=com
objectClass: organizationalUnit
ou: people

dn: ou=groups,dc=example,dc=com
objectClass: organizationalUnit
ou: groups

dn: uid=john,ou=people,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: john
sn: Doe
givenName: John
cn: John Doe
displayName: John Doe
uidNumber: 1000
gidNumber: 10000
userPassword: password
gecos: John Doe
loginShell: /bin/bash
homeDirectory: /home/john
shadowExpire: -1
shadowFlag: 0
shadowWarning: 7
shadowMin: 8
shadowMax: 999999
shadowLastChange: 10877
mail: john.doe@example.com
postalCode: 31000
l: Toulouse
o: Example
mobile: +33 (0)6 xx xx xx xx
homePhone: +33 (0)5 xx xx xx xx
title: System Administrator
postalAddress:
initials: JD

dn: cn=example,ou=groups,dc=example,dc=com
objectClass: posixGroup
cn: example
gidNumber: 10000
Здесь мы создаем 2 сущности - people и groups, в которых мы будем добавлять соотвественно людей и группы, и затем создаем пользователя John Doe и группу example.
Теперь заносим этот файл в LDAP-каталог. Для этого делаем следующее:
1) Останавливаем slapd:
sudo /etc/init.d/slapd stop
2) Вносим изменения:
sudo slapadd -l example.ldif
где example.ldif - имя нашего ldif файла.
3) Запускаем slapd:
sudo /etc/init.d/slapd start
Чтобы проверить, что все успешно добавилось, можно выполнить следующую команду:
$ ldapsearch -xLLL -b "dc=example,dc=com" uid=john sn givenName cn
dn: uid=john,ou=people,dc=example,dc=com
cn: John Doe
sn: Doe
givenName: John
В следующей статье расскажу про то, как настраивать LDAP-аутентификацию.

В основном использовались материалы этой статьи.

P.s. И да, о том, как добавить этого юзера в эту группу:
Создаем еще один ldif-файл следующего содержания:
dn: cn=example,ou=groups,dc=example,dc=com
changetype: modify
add: memberUid
memberUid: john
и выполняем команду:
ldapmodify -x -D cn=admin,dc=example,dc=com -f ex2.ldif
,
где ex2.ldif - это наш файл.

четверг, 4 ноября 2010 г.

И снова о Java: что такое footprint?

Разбирался в работе Java Garbage Collector'а, и столкнулся с понятием footprint. Так вот:
Footprint (или Memory Footprint) - это количество всей памяти, используемой и относящейся к процессу (программе)
. Подробнее можно почитать на английской википедии.

среда, 27 октября 2010 г.

Очень подробная статья по Sed

Ссылка на саму статью.
Очень много всяких полезных и не очень примеров по использованию Sed.

понедельник, 25 октября 2010 г.

Как открыть архив tar в Windows

Как открыть архив tar в Windows?

Ответ прост. Эти настолько популярные в Linux архивы в Виндоус открываются очень просто - архиватором 7zip. Скачать его можно по ссылке для 32-битного Windows или для 64-х битного.  Точно также этим архиватором можно открыть такие архивы, как tar.gz и tar.bz2, которые на самом деле представляют из себя архивы tar, впоследствии запакованные архивами gzip и bzip2. Более того, он умеет также и создавать их. А про его версию под Linux, которая позволяет открывать RAR в линукс, я уже писал.

понедельник, 18 октября 2010 г.

Linux - вывод на экран 5-ти наиболее тяжелых директорий

find . -mindepth 1 -maxdepth 1 -type d -exec du -bs {} \; | sort -n -r | awk '{print $2}' | xargs du -hs | head -10
Выводит на экран 5 наиболее тяжелых директорий в данной директории и их размер в человекочитабельной форме. Очень полезно, когда требуется почистить место на сервере.

Перенос репозитория svn одной командой

$ svnadmin dump /var/lib/svn/myrepo/ | gzip -cf | ssh alexwinner@another.comp " svnadmin load /var/lib/svn/myrepo/ < `gunzip -cf`"
Эта команда создает дамп репозитория subversion на одном компьютере, на лету gzip'ит
его для большей скорости передачи по сети, на новом компьютере распаковывает и создает из этого дампа новый репозиторий.
Учтите, что перед этим на том сервере, где будет новый репозиторий, следует выполнить команду:
svnadmin create /var/lib/svn/myrepo

пятница, 15 октября 2010 г.

Отличный FAQ по apt-get в Debian (Ubuntu)

Q: Как обновить список пакетов?
Aapt-get update пройдет по всему списку указанному у вас в/etc/apt/sources.list и обновит списки пакетов по всем репозиториям.
Q: Списки я обновил, как теперь обновить сами пакеты?
Aapt-get upgrade - менее "интеллектуальный" вариант, обновляющий пакеты, которые есть в системе;
apt-get dist-upgrade - более "интеллектуальный" вариант, который следит за тем, не сменили ли пакеты имя и пытающийся обновлять более важные пакеты даже ценой удаления менее важных.
Q: А я не хочу все обновлять, как мне обновить только один пакет?
A: Точно так же, как и установка пакета: apt-get install <пакет>
Q: Как удалить пакет?
Aapt-get remove <пакет>
Q: А после удаления точно ничего от пакета не останется?
A: Для того, чтобы точно не осталось, лучше пользоваться apt-get remove --purge <пакет>
Q: Как мне узнать, как называется пакет для какой-то определенной цели?
A: Попробуйте поиск по ключевым словам при помощи apt-cache search <слова>
Q: Мне принесли компакты дистрибутива, которых у меня не было, как мне их добавить?
Aapt-cdrom add должно помочь
Q: Мне кажется, что меня взломали и что-то сделали с <пакетом>
Aapt-get install --reinstall вернет пакет к изначальному состоянию, то есть такому, какой он был на свежеустановленной системе.
Q: Очень хочется создать локальное зеркало, в какую сторону смотреть?
Aapt-move скорее всего решит полностью вашу проблему, для него достаточно указать, где лежит архив файлов и куда выложить ваше зеркало.
Q: А подробнее про apt-move можно? А: Можно:
apt-move update - переносит из /var/cache/apt/archives пакеты в директорию локального зеркала (указывается в /etc/apt-move.conf как переменная LOCALDIR=path_to).
По сути apt-move update является выполнением последовательности команд
$ apt-move get
$ apt-move move
$ apt-move delete
$ apt-move packages
apt-move get - формирует мастер-файл;
apt-move move - переносит пакеты из кэша apt в локальное зеркало;
apt-move delete - удаляет устаревшие пакеты;
apt-move packages - создает Packages.gz и Sources.gz дерева локального зеркала
Q: У меня пакеты все уже удалени из кэша, а друг тоже хочет весь "свежак", который у меня устанговлен...
A: Простой скрипт, выполненный в пустом каталоге, соберет в нем пакеты, которые установлены в системе:
dpkg --get-selections | \
 grep -v "deinstall" |  \
 awk '{print $1}' | \
 xargs dpkg-repack
Q: Есть подозрение, что из-за моих экспериментов в системе много мусора...
A: Попробуйте пакет debfoster, он при первом запуске спросит у вас о необходимости пакетов и удалит все лишнее.
Q: Где по умолчанию лежат пакеты, которые мне скачал apt-get?
A: в /var/cache/apt/archives
Q: Как мне поставить один *.deb пакет в систему?
A: При условии того, что удовлетворены все зависимости, dpkg -i <пакет>приведет к желаемому результату.
Q: Как заставит apt работать через proxy сервер?
A: Либо установив переменную окружения при помощи
export http_proxy="http://login:password@xxx.xxx.x.xx:yyyy"
либо прописав в файл /etc/apt/apt.conf строку
Acquire::http::Proxy "http://xxx.xxx.xx:yyyy";
где xxx.xxx.xx - имя вашего прокси, yyyy - порт
Q: Я хочу определить в каком пакете необходимый мне файл (например,libodbc.so).
А:
apt-file - утилита поиска по содержимому пакетов.
apt-file update - получает файл Contents-<ARCH>.gz, следует учесть, что исходя из того, что проект Debian довольно большой, то и файл получится соответствующий. apt-file search <файл> - поиск пакета с указанным файлом.
Пример:
apt-file search libodbc.so
unixodbc: usr/lib/libodbc.so.1
unixodbc: usr/lib/libodbc.so.1.0.0
unixodbc-dev: usr/lib/libodbc.so
Q: А как просмотреть полный список содержимого пакета?
Аapt-file list <пакет> - отображает содержимое указанного пакета
Q: Я больше не собираюсь использовать apt-file, а Contents-.gz занимает место на диске.
Аapt-file purge удалить все Contents-<ARCH>.gz.
По поводу дополнительных опций - man apt-file

Q: Как мне найти неиспользуемые (осиротевшие) пакеты?
Аdeborphan без указания ключа осуществляет поиск в разделе библиотек, с указанием ключа -a поиск ведется во всех разделах. Имеется и интерфейс кdeborphan - orphaner, поставляются в одном пакете.
Q: есть локальный репозиторий из дистрибутивных дисков. Packages.gz сделал, а вот как сделать Contents-<ARCH>.gz для того, чтобы apt-file'ом можно было пользоваться?
A:
apt-ftparchive contents . | gzip > Contents-i386.gz
также с помощью apt-ftparchive можно создавать Sources.gz и Packages.gz
apt-ftparchive sources . | gzip > Sources.gz
apt-ftparchive packages .| gzip > Packages.gz
Q: хочется создать дистрибутив некоторых выбранных пакетов и залить его на болванки. При этом хочется поместить на болванки и пакеты, не установленные в моей системе. Как это объяснить apt-move?
A: Вариант номер один - посмотреть в сторону jidgo, возможно, он вас устроит, вариант номер два - получить недостающие пакеты, но не устанавливать их в систему с помощью аpt-get install -d <пакеты>.
Q: У меня стоит мешанина из stabletestingunstable и даже кое-что изexperimental установил. Как мне сделать, чтобы все в таком виде и обновлялось?
A: Чтобы этого добиться, поместите следующую строку в /etc/apt/apt.conf:
APT::Default-Release "testing";
Затем, при установке пакетов из, например, нестабильного дистрибутива, просто используйте ключ -t:
$ apt-get -t unstable install имя_пакета
Помимо этого рекомендуем прочитать man apt-preferences


Всё честно взято отсюда:  http://citkit.ru/articles/130/

понедельник, 11 октября 2010 г.

Цинизм в IT: notice: Run of Puppet configuration client already...

Цинизм в IT: notice: Run of Puppet configuration client already...: "
Бороться с этой ошибкой легко (ниже пример для Debian):
rm /var/lib/puppet/state/puppetdlock

вторник, 3 августа 2010 г.

Репост этого поста.
Я слежу за этой историей с февраля. Расскажу ее сама вам, как вижу сейчас...

Жила-была девушка, Милана Каштанова. Училась в институте в Петербурге.
В феврале она шла по Петербургу и ей на голову упала глыба льда. Питерские дворники чистили крышу...
Сейчас Милана находится к коме. Сначала в больнице в Петербурге, потом в Таллине, сейчас ее должны перевезти в Кельн.
У нее диффузная травма мозга.

У Миланы есть муж. Ириней Калачев. Этому молодому мужчине всего 22 года. Он каждый день ведет дневник состояния Миланы.
Пока там основная запись-" Состояние Миланы без изменений".
Каждый день, с февраля.

Родители Миланы и Ириней собирают деньги. Стоимость лечения Миланы в Кельне- 80 тыс евро. Собрано 29 тысяч.

Ириней ищет дополнительные заработки.
Вот запись из его ЖЖ -
"Если Вам необходима разработка фирменного стиля, макетов полиграфической продукции (бланки, визитки, брошюры, каталоги и т.д.), иллюстрация или что-нибудь ещё - напишите мне письмо в ящик irinei.ru@gmail.com или позвоните мне по номеру +372 58 055 004. Местоположение заказчика роли не играет, работаю со всеми благодаря интернету.
Сразу скажу, что я не супер-дизайнер, всё ещё впереди, но за два года учёбы и работы на фрилансе я многому успел научиться. Мои работы можно посмотреть на фри-ланс.ру"
Я заказала Иринею визитки, и мне понравилось, как он сделал.

Я иногда представляю, как теперь изменилась жизнь всех, кто любит Милану.
Я представляю себе вот этот переход из света в тьму - она просто шла, говорила по мобильнику, и вдруг- все.
Долго думать об этом не получается, не хватает пороху. И смотреть на ее фотографии тоже.

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

Это ссылка на дневник Иринея, на верхний пост, где собраны все материалы дела http://irinei-ru.livejournal.com/23917.html

Реквизиты для перевода денег - http://irinei-ru.livejournal.com/24657.html

Последние новости - http://irinei-ru.livejournal.com/80333.html

Ну, в общем, я хотела сказать, что вы можете заказать Иринею работу или как-то еще помочь.

Милана

пятница, 23 июля 2010 г.

воскресенье, 27 июня 2010 г.

Разработка Flash под Linux (Debian & Ubuntu)

Встал тут передо мной вопрос, возможно ли писать программы на Flash (т.е. Action Script) под Linux. В моем случае линукс - это Debian. Как оказалось, можно.
Во-первых, надо скачать и установитьFlex SDK.
Для этого переходим по этой ссылке и скачиваем Open Source Flex SDK. Соглашаемся с Mozilla Public License и нажимаем по кнопке Download zip.
Распаковываем скачаннный архив в какую либо директорию. В моем случае это /tmp/flex:
$ 7z x flex_sdk_4.1.0.16076_mpl.zip -o/tmp/flex/
Готово, Flex скачан и установлен.
Во-вторых, создаем наше hello-world'ное flash приложение. Создаем файл hello.as и открываем его в любимом редакторе, например, в vim:
$ vim hello.as
Пишем в нем следующее:
package {
import flash.display.*;
import flash.text.*;
public class hello extends Sprite{
public function hello (){
var t:TextField = new TextField();
t.text = "hello actionscript 3";
t.width = 300;
t.height = 200;
t.x = 50;
t.y = 20;
addChild(t);
}
}
}
В-третьих, надо скомпилировать этот файл:
$ /tmp/flex/bin/mxmlc hello.as
В директории, в которой мы находимся, появится скомпилированный swf-файл hello.swf.
И наконец, открываем его в любимом бразуре, например, в Google Chrome:
$ google-chrome hello.swf
И наслаждаемся результатом:)

понедельник, 14 июня 2010 г.

Чем и как открыть архивы tar.gz и tar.bz2 в Windows

Как известно, архивы вида *.tar.bz2 и *.tar.gz2 - одни из самых часто встречающихся видов архивов в Linux (так называемые тарболы (tarball)). Однако, что делать в случае, когда их надо открыть в Windows?
В этом случае Вам поможет архиватор 7z. Скачать его версию для Windows можно по этой ссылке.
Он бесплатный и умеет распаковывать следующие архивы: ARJ, CAB, CHM, CPIO, DEB, DMG, HFS, ISO, LZH, LZMA, MSI, NSIS, RAR, RPM, UDF, WIM, XAR и Z. А сжимать и открывать: 7z, ZIP, GZIP, BZIP2 и TAR.
Если 7zip не запускается при клике по tar.gz или tar.bz2, убедитесь, что он настроен на их открытие:
1) Откройте 7zip
2) Пройдите по Tools → Options
3) Выберите вкладку "System".
4) Убедитесь, что стоят галочки напротив tar, gz, bz2.
5) Нажмите Ok.

После этого 7zip сможет распаковать тарболы в windows.

пятница, 4 июня 2010 г.

Настройка антиспама в Pidgin

В последнее время мне часто стал сыпаться спам в Pidgin. Решение нашлось быстро в виде антиспама Bot Sentry.
Установка и настройка предельно просты. Во-первых, устанавливаем pidgin-dev и intltool:
sudo aptitude install pidgin-dev intltool
Далее скачиваем с сайта разработчиков тарболл и распаковываем его:
wget http://downloads.sourceforge.net/project/pidgin-bs/bot-sentry/1.3.0/bot-sentry-1.3.0.tar.bz2?use_mirror=citylan
tar -xjvf bot-sentry-1.3.0.tar.bz2
Далее, переходим в директорию
cd bot-sentry-1.3.0/
и запускаем конфигурирование, компиляцию и инстралляцию
configure
make
sudo make install
Все готово, осталось только включить модуль в Pidgin:
Средства-Модули-Bot Sentry, затем придумать вопрос и ответ для антиспама:

Ruby ч.3 Работа с объектами в Ruby

Продолжение этой статьи.
Итак, у нас уже объявлен класс Greeter. Посмотрим на него в действии:
irb(main):035:0> g = Greeter.new("Pat")
=> #
irb(main):036:0> g.say_hi
Hi Pat!
=> nil
irb(main):037:0> g.say_bye
Bye Pat, come back soon.
=> nil
Итак, как вы видите, все работает, как задумано. Что же будет, если мы попытаемся обратиться к имени напрямую?
irb(main):038:0> g.@name
SyntaxError: compile error
(irb):52: syntax error
from (irb):52
Ага, он ругается.
Переменные класса всегда спрятаны от посторонних глаз. Спрятаны они не насовсем, вы можете их найти, когда инспектируете объект, и всякими другими способами. Однако Ruby придерживается объектно-ориентированного подхода по отношению к скрытию переменных.
Посмотрим, какие же методы существуют у объекта класса Greeter:
irb(main):039:0> Greeter.instance_methods
=> ["method", "send", "object_id", "singleton_methods",
"__send__", "equal?", "taint", "frozen?",
"instance_variable_get", "kind_of?", "to_a",
"instance_eval", "type", "protected_methods", "extend",
"eql?", "display", "instance_variable_set", "hash",
"is_a?", "to_s", "class", "tainted?", "private_methods",
"untaint", "say_hi", "id", "inspect", "==", "===",
"clone", "public_methods", "respond_to?", "freeze",
"say_bye", "__id__", "=~", "methods", "nil?", "dup",
"instance_variables", "instance_of?"]
Ого! Но ведь мы объявляли всего два метода, откуда же их столько?
Здесь перечислены все методы класса Greeter, в том числе и унаследованные от его предка. А теперь посмотрим методы, присущие только классу Greeter:
irb(main):040:0> Greeter.instance_methods(false)
=> ["say_bye", "say_hi"]
А теперь посмотрим, на какие методы откликается наш объект:
irb(main):041:0> g.respond_to?("name")
=> false
irb(main):042:0> g.respond_to?("say_hi")
=> true
irb(main):043:0> g.respond_to?("to_s")
=> true
Итак, как мы видим, Greeter не знает метода name.
Однако, что будет, если мы захотим увидеть или изменить name? Ruby предоставляет легкий способ для доступа к переменным класса:
irb(main):044:0> class Greeter
irb(main):045:1> attr_accessor :name
irb(main):046:1> end
=> nil
В Ruby всегда можно открыть класс заново и изменить его свойства. Итак, попробуем создать новый экземпляр класса Greeter и поиграть с свойством @name:
irb(main):047:0> g = Greeter.new("Andy")
=> #
irb(main):048:0> g.respond_to?("name")
=> true
irb(main):049:0> g.respond_to?("name=")
=> true
irb(main):050:0> g.say_hi
Hi Andy!
=> nil
irb(main):051:0> g.name="Betty"
=> "Betty"
irb(main):052:0> g
=> #
irb(main):053:0> g.name
=> "Betty"
irb(main):054:0> g.say_hi
Hi Betty!
=> nil
Действие :attr_accessor создало для нас 2 новых метода, name для получения значения переменной @name и name= для задания ее значения.
Однако, Greeter сейчас умеет приветствовать и прощаться только с одним человеком. Что, если нам захочется создать некий MegaGreeter, который сумел бы приветствовать весь мир, одного человека, или несколько человек сразу?
Давайте напишем следующие строки в отдельном файле, а не прямо в интерпретаторе:
#!/usr/bin/env ruby

class MegaGreeter
attr_accessor :names

# Create the object
def initialize(names = "World")
@names = names
end

# Say hi to everybody
def say_hi
if @names.nil?
puts "..."
elsif @names.respond_to?("each")

# @names is a list of some kind, iterate!
@names.each do |name|
puts "Hello #{name}!"
end
else
puts "Hello #{@names}!"
end
end

# Say bye to everybody
def say_bye
if @names.nil?
puts "..."
elsif @names.respond_to?("join")
# Join the list elements with commas
puts "Goodbye #{@names.join(", ")}. Come back soon!"
else
puts "Goodbye #{@names}. Come back soon!"
end
end

end


if __FILE__ == $0
mg = MegaGreeter.new
mg.say_hi
mg.say_bye

# Change name to be "Zeke"
mg.names = "Zeke"
mg.say_hi
mg.say_bye

# Change the name to an array of names
mg.names = ["Albert", "Brenda", "Charles",
"Dave", "Englebert"]
mg.say_hi
mg.say_bye

# Change to nil
mg.names = nil
mg.say_hi
mg.say_bye
end
Сохраним этот файл как "ri20min.rb", а затем выполним командой "ruby ri20min.rb":
Hello World!
Goodbye World. Come back soon!
Hello Zeke!
Goodbye Zeke. Come back soon!
Hello Albert!
Hello Brenda!
Hello Charles!
Hello Dave!
Hello Englebert!
Goodbye Albert, Brenda, Charles, Dave, Englebert. Come
back soon!
...
...
В следующей статье мы рассмотрим еще массу интересных действий!

Ruby ч.2: Продолжаем изучать Ruby

Как продолжение этой статьи, вольный перевод кусочка руководства Ruby за 20 минут.
Как заставить Ruby приветствовать нас, не напрягая при этом наши пальцы? Очень просто, надо всего лишь объявить метод, который будет это делать:
irb(main):010:0> def h
irb(main):011:1> puts "Hello World!"
irb(main):012:1> end
=> nil
Код "def h" обозначает собой объявление метода. Им мы говорим Ruby, что объявляем метод с именем h. Строка "end" означает, что мы закончили объявление метода. Между этими строками находится тело метода, то есть то, что он будет делать. В данном случае - говорить "Hello World!". Фраза "nil", которой ответил нам интерпретатор, означает, что он понял, что мы закончили объявление.
Итак, попробуем запустить этот метод пару раз:
irb(main):013:0> h
Hello World!
=> nil
irb(main):014:0> h()
Hello World!
=> nil
Видите, как это просто? Вызвать метод настолько же легко, как сказать его имя Ruby. Если метод не требует параметров, то это все, что вам нужно. Однако, если вы хотите, то вы можете добавить пустые круглые скобки.
Что, если мы захотим говорить "Привет" какому-то определенному человеку, а не целому миру сразу? Достаточно всего лишь переопределить этот метод так, чтобы они принимал имя, как параметр:
irb(main):015:0> def h(name)
irb(main):016:1> puts "Hello #{name}!"
irb(main):017:1> end
=> nil
irb(main):018:0> h("Matz")
Hello Matz!
=> nil
Итак, это работает. Однако, попробуем посмотреть, как это работает.
Для начала, что такое "#{name}"? Это способ вставить что либо в строку в Ruby. Данные, находящиеся в переменной, указанной в фигурных скобках, преобразуются в строку (если они уже ей не были), а затем вставляются во внешнюю строку в том самом месте, где мы написали это выражение. Так же мы можем реализовать проверку того, написано ли имя с большой буквы:
irb(main):019:0> def h(name = "World")
irb(main):020:1> puts "Hello #{name.capitalize}!"
irb(main):021:1> end
=> nil
irb(main):022:0> h "chris"
Hello Chris!
=> nil
irb(main):023:0> h
Hello World!
=> nil
Рассмотрим, что тут происходит:
Если мы вызываем метод без скобок или не указываем параметр, то в качестве name используется параметр по умолчанию, то есть "World". В противном случае, первая буква имени делается заглавной, и выводится приветственное сообщение.
Ну а если же мы хотим создать реального привратника, который будет запоминать наше имя и встречать и провожать нас, то, возможно, стоит создать объект:
irb(main):024:0> class Greeter
irb(main):025:1> def initialize(name = "World")
irb(main):026:2> @name = name
irb(main):027:2> end
irb(main):028:1> def say_hi
irb(main):029:2> puts "Hi #{@name}!"
irb(main):030:2> end
irb(main):031:1> def say_bye
irb(main):032:2> puts "Bye #{@name}, come back soon."
irb(main):033:2> end
irb(main):034:1> end
=> nil
Здесь появляется новое ключевое слово - "class". Оно означает, что мы создаем новый класс Greeter и несколько методов для него. Также вы наверняка заметили "@name" - это переменная, доступная всем методам класса. Как вы видите, она используется методами say_hi и say_bye. Рассмотрим это в действии в следующей статье.

четверг, 3 июня 2010 г.

RoR: связь Ruby On Rails и PostgreSQL

В продолжение предыдущих статей по Ruby On Rails опишу, как настроить этот замечательный фреймворк на взаимодействие с СУБД PostrgreSQL.

среда, 2 июня 2010 г.

RoR: связываем Ruby on Rails и Apache2

Про то, как установить Ruby On Rails, я писал в этой статье. Теперь же постараюсь описать, как запускать ROR-приложения под Apache2.
Итак, приступим.

вторник, 1 июня 2010 г.

Установка Ruby On Rails на Linux Debian (Ubuntu)

Расскажу о том, как ставить  фреймворк Ruby On Rails на Linux Debian (В случае с Ubuntu действия аналогичны).
Установка Ruby
а) Из репозитория:
sudo apt-get install ruby-full build-essential
б) Из исходников
Во-первых, надо установить пакеты, которые потребуются при компиляции:
sudo apt-get install build-essential libssl-dev libreadline5-dev zlib1g-dev
Затем скачиваем исходники в тарболе:
wget ftp://ftp.ruby-lang.org/pub/ruby/stable-snapshot.tar.gz
Распаковываем тарбол:
tar xzf stable-snapshot.tar.gz
Компилируем и устанавливаем:
$ cd ruby/
./configure
make
sudo make install
Проверяем работоспособность Ruby:
ruby -v
Должно появиться сообщение, подобное этому:
ruby 1.8.7p5000 (2009-02-22) [i686-linux]
Проверяем работоспособность библиотек:
ruby -ropenssl -rzlib -rreadline -e "puts :Hello"
В результате на экране должно появится следующее:
Hello
Установка RubyGems 
Установка через репозиторий:
Для этого необходимо выполнить следующую команду:
sudo apt-get install rubygems
Разработчки Rails не рекомендуют так делать. По их мнению, лучше устанавливать из исходников.
Установка RubyGems из исходников:
Для этого надо выполнить следующие действия:
$ cd ~
wget http://rubyforge.org/frs/download.php/45905/rubygems-1.3.2.tgz
tar xzvf rubygems-1.3.2.tgz
cd rubygems-1.3.2
sudo ruby setup.rb
sudo ln -s /usr/bin/gem1.8 /usr/bin/gem
Установка Rails
Установка с помощью RubyGems:
Это самый простой способ установить Rails. Для этого надо выполнить команду:
sudo gem install rails
В Ubuntu Karmic RubyGems устанавливает Rails не корректно, в этом случае можно воспользоваться установкой из репозитория через apt-get или aptitude
Установка из репозитория:
sudo apt-get install rails

понедельник, 31 мая 2010 г.

Ruby On Rails: Что это?

Итак, начнем знакомиться с Ruby On Rails.
Во-первых, открываем getting started и читаем:
Что такое Rails?
Rails - это фреймворк для разработки веб-приложений, написанный на языке Ruby. Он предназначен для облегчения программирования за счет допущений относительно того, что нужно каждому разработчику. Это приводит к тому, что программировать требуется намного меньше по сравнению с другими языками и фреймворками.
Rails делает предположение, что существует некий "лучший" путь разработки, и спроектирован таким образом, чтобы следовать этому пути. Как обещают разработчики, если мы выучим "путь Rails", то невероятно увеличим свою производительность. Если же попытаться применять какие-то другие пути к Rails, то ничего хорошего из этого не выйдет.
Философия Rails включает в себя несколько главных приципов:
1) DRY – “Don’t Repeat Yourself” - "Не повторяйтесь" - подразумевает, что писать один и тот же код снова и снова - плохо.
2) Convention Over Configuration - Соглашения превыше конфигурации - Rails делает предположения о том, что вы хотите сделать, и как, вместо того, чтобы заставлять вас править бесконечные файлы конфигурации.
3) REST - лучший подход для разработки веб-приложений. Организация приложения на стандартных возможностях http - лучший способ сделать дело.

суббота, 29 мая 2010 г.

Ruby ч1: Hello World, или знакомство с Ruby.

Захотелось мне узнать, что же за зверь такой фреймворк ROR. Но для того, чтобы это узнать, надо разобраться сначала с самим Ruby, как он хоть выглядит в принципе и как на нем писать:)
Итак, поехали.
У меня имеется тестовая виртуальная машина с Linux Debian.
Необходимо установить на нее Ruby. Для этого выполняем следующую команду:
aptitude install ruby libzlib-ruby rdoc irb
Что же мы ставим? Ruby - это сам язык ruby, libzlib-ruby - библиотека zlib для ruby, rdoc - инструмент для генерации документации на основе документов ruby, irb - коммандная строка ruby.
Когда все это установится, можно проверить работу ruby так, как написано здесь. Например, можно использовать Ruby как калькулятор:
irb(main):007:0> a = 3 ** 2
=> 9
irb(main):008:0> b = 4 ** 2
=> 16
irb(main):009:0> Math.sqrt(a+b) => 5.0
Или взглянем на то, как в Ruby определяются методы:
irb(main):010:0> def h
irb(main):011:1> puts "Hello World!"
irb(main):012:1> end
=> nil
Здесь мы определили метод h, который при своем вызове будет выводить на экран фразу "Hello World!",
Чтобы вызвать этот метод, достаточно всего лишь ввести h:
irb(main):013:0> h
Hello World!
=> nil
irb(main):014:0> h()
Hello World!
=> nil
На этом совсем предварительное знакомство с Ruby закончим. Если понадобится (а я уверен, что понадобится), то вернемся к этому в следующих статьях:)

пятница, 21 мая 2010 г.

Установка бесплатная панели управления сервером Webmin на Linux Debian

Из своего любопытства решил я посмотреть, какие бывают панели управления и конфигурации, как ими пользоваться. Причем хотелось найти именно бесплатную панель. Поэтому мой выбор остановился на Webmin. Как пишут ее создатели, webmin - это веб-интерфейс для системного администрирования unix-систем. Используя любой современный браузер, можно управлять аккаунтами пользователей, веб-сервером Apache, DNS и многим другим.
Тестировать webmin я решил на виртуальной машине с Linux Debian на борту.
О том, как надо устанавливать панель Webmin на Debian, можно почитать здесь - совсем ничего сложного.
Я выбрал установку через репозиторий, так как это дает возможность обновлять webmin намного проще, нежели скачивая каждый раз свежий deb-пакет. Кроме того, при установке из репозитория aptitude или apt-get сам разрешит все зависимости, не придется в ручную ставить пакеты типа perl libnet-ssleay-perl openssl libauthen-pam-perl libpam-runtime libio-pty-perl libmd5-perl.
Итак, добавляем репозиторий webmin в список репозиториев. Для этого надо добавить строчку "deb http://download.webmin.com/download/repository sarge contrib" в файл /etc/apt/sources.list.
После этого желательно установить gpg-key для этого репозитория. Выполняем для этого 2 команды:
wget http://www.webmin.com/jcameron-key.asc
sudo apt-key add jcameron-key.asc
Далее, обновляем список репозиториев и устанавливаем webmin:
sudo apt-get update
sudo apt-get install webmin
.
После того, как webmin установится на нашу систему, надо перебросить порт управления webmin'ом на виртуальную машину. Обычно это порт 10000. Как это сделать, я описал в предыдущей статье. Разумеется, если вы ставите webmin на реальную машину, ничего пробрасывать никуда не надо:)
И все, переходим на страницу https://localhost:10000, и видим приветствие webmin'a:

.

VirtualBox in Debian - проброс портов (port forwarding) на гостевую машину

Предыстория: решил я потестить панель управления хостингом Webmin. Установку самой панели я опишу в другой статье. В этой же постараюсь рассказать о том, как прокинуть порт, чтобы снаружи можно было зайти на веб-интерфейс этой панели.
При пробросе порта я руководстовался этим постом.
Решение:
Для порт форвардинга можно воспользоваться утилитой VBoxManage. Надо выполнить следующие команды:
$ VBoxManage setextradata "VBoxInternal/Devices/pcnet/0/LUN#0/Config/webmin/HostPort" 10000
$ VBoxManage setextradata <guestname> "VBoxInternal/Devices/pcnet/0/LUN#0/Config/webmin/GuestPort" 10000
$ VBoxManage setextradata &ly;guestname> "VBoxInternal/Devices/pcnet/0/LUN#0/Config/webmin/Protocol" TCP
Итак, здесь означает имя виртуальной машины, в нашем случае "debian-test". Напротив HostPort и GuestPort - порты, которые слушаются на главной и виртуальной машине. Т.е. те самые, который мы будем перебрасывать.
После этого остается только перезапустить VirtualBox.
Чтобы удостовериться, что все работает, можно выполнить следующую команду:
sudo netstat -nlt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:29209 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:10000 0.0.0.0:* LISTEN
Мы видим, что порт 10000 находится в состоянии LISTEN, т.е. прослушивается. Зайдя через бразуер host-машины на адрес https://localhost:10000, мы попадаем на страничку Webmin-интерфейса.

В дополнении осталось так же заметить, что конфиги виртуальных машин лежат обычно здесь - ~/.Virtualbox/Machines/<virtualmachinename>/<virtualmachinename>.xml.

четверг, 1 апреля 2010 г.

Google Chrome - еще немного о синхронизации, отключении картинок и прочих фичах

По вот этой ссылке можно найти все возможные ключи запуска chrome, например, для отключения синхронизации chrome следует запускать с ключом "--disable-sync".

воскресенье, 28 марта 2010 г.

Linux Debian,Ubuntu - чуть-чуть о правах доступа к файлам

r =4 (чтение)
w =2 (запись)
x =1 (исполнение)
- =0 (никаких прав)
Для вычисления требуется сложить числа
Пример:
-rw-rw-rw-
rw =4+2+0=6

Таким образом получаем.
755:
Владелец файла - полные права, т.е. исполнение, запись, просмотр.
Участники группы - просмотр и исполнение.
Остальные пользователи - просмотр и исполнение.

777:
Все пользователи могу править, исполнять и просматривать.

666:
Все могут редактировать и просматривать, но никто не может запускать.

644:
Все могут просматривать, но только владелец может записывать.

Установка SUID-бита:
chmod 1xxx filename
xxx - это те 3 цифры, про которые мы говорили выше. 1-ка означает как раз таки этот самый suid бит, то есть файл будет исполняться с правами его владельца.

Позже постараюсь описать все это более развернуто, сейчас просто так, чтоб не забыть.
П.с.Кроме указанных Дебиана и Убунту это все также актуально для остальных Линуксов и BSD*.

понедельник, 22 марта 2010 г.

Видеонаблюдение под Linux

Создаем систему видеонаблюдения с датчиком движения на основе Debian Linux и web-камеры.
На современном рынке присутствует множество различных компаний, которые предлагают всяческие системы видеонаблюдения, слежения и пр. Однако все они стоят значительных денег. В рассматриваемом же случае нам нужно всего лишь получить возможность посмотреть на то, что происходит в подъезде, когда нас там нет, или подглядеть за кем-то в другой комнате.
Для этого нам надо:
1) Компьютер с установленным на него Debian или Ubuntu
2) Web-камера.
3) проводок, их соединяющий.
Собственно, и все:) Ставим камеру в боевое положение, включаем компьютер и соединяем их. Система готова.

Остается только поставить необходимый софт.
Я для этих целей использовал программу motion, поставляемую в стандартном репозитории debian. Процитируем то, что про нее пишут разработчики:
Motion -- программа, которая контролирует видео сигнал от одной или более камер и в состоянии обнаружить, если часть изображения изменилась. Другими словами -- это детектор движения.

Работа с motion ведётся через командную строку. Программа не имеет графического интерфейса пользователя. Установка и настройка программы осуществляется через командную строку или через файлы конфигурации.

Motion сохраняет информацию с камер в следующих форматах:

- jpg файлы
- ppm файлы
- mpeg видео последовательности
Кроме того, Motion имеет собственный простой веб-сервер, позволяющий загружать изображения с веб-камеры через браузер.
То есть, своими словами, она предоставляет нам следующие возможности.
1) Постоянное получение картинки и видео с камеры и запись этого на носитель, т.е. она предоставляет возможность видеорегистратора.
2) Датчик движения. Т.е.мы можем записывать видео и картинку только в том случае, если кто-то или что-то двигается в области наблюдения. Кроме того, можно настроить, чтобы детекция видео происходила в какой-то определенной области изображения.
3) Трансляция видео по сети. Т.е. мы можем смотреть в реальном времени, что происходит дома, когда нас там нет.

Установка:
sudo aptitude install motion
Как было сказано выше, motion работает из командной строки и использует конфигурационные файлы для своих настроек.
В этом Файле возможно выбрать, с какой камерой работать, производить запись фото и видео постоянно или при движении, с каким качеством должна быть картинка, транслировать ли видео в сеть и много прочее. Все это очень подробно описано в комментариях этого файла.

Так же существуют альтернативные программы, такие как ZoneMinder и AVReg. Их я пока не тестировал.
Собственно, на этом все, удачного наблюдения:)

пятница, 19 марта 2010 г.

Linux: Добавляем jar-файлы в CLASSPATH, или подключаем сторонние библиотеки

В этом блоге я уже писал о том, как вообще прописывать переменную CLASSPATH в Linux Debian.
Сейчас же в ходе разработки столкнулся с необходимостью подключить в свой проект библиотеку, созданную сторонним разработчиком. Библиотека представлена файликом вида name.jar.
Для начала я попытался положить этот файл в директорию, заданную в уже прописанном classpath. Однако, это не помогло, компилятор не находил классов из этой библиотеки.
Задача: Добавить библиотеку в виде name.jar в CLASSPATH.
Решение: Сделать это просто.
1) Создаем директорию, в которой будет храниться эта библиотека:
mkdir /home/username/libraries/
2) Кладем файл в эту директорию:
mv name.jar /home/username/libraries/
3) Добавляем в CLASSPATH следующее (Как добавлять, описано здесь)
/home/username/libraries/*
Готово:)

четверг, 4 марта 2010 г.

Java - сравнение строк

Встала передо мной задача, сравнить пару строчек в Java.
Выглядело это примерно так:

String str1 = new String("Test");
String str2 = new String("Test");
if (str1 == str2)
System.out.println("Строчки совпадают!");

Однако, сообщение "Строчки совпадают!" не появилось.
Казалось бы, как так может быть, строки-то ведь одинаковые.
Разгадка же проста: при сравнении с помощью "==" в реальности сравниваются указатели на строки, а, так как str1 и str2 указывают на строки, находящиеся в разных местах памяти, они не равны друг другу.
Спасибо юзеру incrab, указавшему на мою ошибку в первоначальном варианте поста.
Если бы мы делали следующее:

String str1 = "Test";
String srt2 = str1;
if (str1 == str2)
System.out.println("Строчки совпадают!");

то сообщение бы вывелось, так как и str1 и str2 указывают на одну и ту же строку. (Проверить это можно, изменив str1, например str1 = "New string". Тогда, при выводе str2 на экран выведется не "Test", а "New string".

Так как же все-таки сравнить то, что находится по указателям?
У класса String существует специальный метод equals, переопределенный из класса object , возвращает true , если аргумент obj не равен null , является объектом класса string , и строка, содержащаяся в нем, полностью идентична данной строке вплоть до совпадения регистра букв. В остальных случаях возвращается значение false.

Пользоваться им можно, например, так:
if (str1.equals(str2))
System.out.println("Строчки совпадают!");

понедельник, 22 февраля 2010 г.

Контроль температуры процессора в Linux Debian (Ubuntu)

Предыстория: Сейчас в Питере очень холодно, -18 градусов при 98% влажности, включил ноутбук и надеюсь, что согрею пальцы его клавиатурой. А от чего зависит температура клавиатуры? Правильно, от температуры процессора:)
Соответственно, стало интересно, какая же сейчас температура у процессора.
Задача: Найти способ, как узнать температуру процессора в Linux Debian (Ubuntu)
Решение: Необходимо установить пакет lm-sensors.
Устанавливается он следующей командой:
sudo aptitude install lm-sensors
После того, как он установится, запускаем из-под рута приложение sensors-detect:
sudo sensors-detect
Оно определит, значения каких датчиков вы сможете контролировать. В моем случае все свелось к нажатию энтеров:)
Итак, когда все датчики определены, запускаем приложение sensors:
$ sensors
acpitz-virtual-0
Adapter: Virtual device
temp1:       +42.0°C  (crit = +98.0°C)
Вот и все, температура процессора у меня составляет 42 градуса цельсия!:)

P.s. необходимо также отметить, что существуют специализированные программы для мониторинга системы, которые показывают температуру процессора, его загрузку, скорость передачи данных по сети, заполненность жестких дисков, нагрузку на винчестеры и многое другое другое. Это conky и gkrellm

четверг, 18 февраля 2010 г.

JQuery - изучение. Часть 2. Пробы.

Продолжение этой статьи.
Еще один пример - отмена действий по умолчанию.
Теперь мы укажем в head вместо файла jquery.js, лежащего у нас на компьютере, файлик, лежащий на сайте jquery на Гугловском CDN. Таким образом, мы сможем понизить нагрузку на наш сервер, засчет того, что библиотека jquery будет запрашиваться не с нашего сервера, а с серверов гугла:)
Приведем страницу к следующему виду:
 <!DOCTYPE html>
 <html lang="en">
 <head>
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
   <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js" type="text/javascript"></script>
   <script type="text/javascript">
     $(document).ready(function(){
       $("a").click(function(event){
         alert("As you can see, the link no longer took you to jquery.com");
         event.preventDefault();
       });
     });
  
   </script>
 </head>
 <body>
   <a href="http://jquery.com/">jQuery</a>
 </body>
 </html>
 Строчка "event.preventDefault();" означает предотвращение дефолтного действия по событию. В данном случае это значит, что при клике по ссылке не будет осуществлен переход по ней, который является действием по умолчанию для события "клик по ссылке".
Пример - добавление и забирание CSS-класса.
На всякий случай, тем, кто не знает, что такое CSS - предлагаю ознакомиться с этой статьей в Википедии.
Добавим в head нашей страницы следующие строки:

<style type="text/css">
    a.test { font-weight: bold; }
</style>
Они описывают класс ссылок test. Ссылки, принадлежащие этому классу, будут написаны жирным шрифтом.
Далее, в нашу функцию, вызываемую при нажатии на ссылку, добавляем следующую строчку:
$("a").addClass("test");
В результат при клике по ссылки все ссылки в документе станут написаны жирным текстом.
Эффекты.
В JQuery присутствует поддержка многих эффектов, призванных сделать ваши страницы как можно более красивыми и оригинальными.
Например, заставим нашу ссылку постепенно исчезать после клика по ней.
Для этого в обработчик клика следует добавить следующую строку:

$(this).hide("slow");
И все, мы видим, как ссылка постепенно исчезает после клика.
На этом на сегодня всё, продолжим разбираться с JQuery в следующих статьях:)

среда, 17 февраля 2010 г.

JQuery - изучение. Часть 1. Что это за зверь?

Что такое JQuery
В интернете я все чаще и чаще натыкаюсь на слово JQuery почти во всем, что так или иначе связано с дизайном сайтов,  разработкой веб-приложений, AJAX-запросами и прочими интернет-фишками. Естественно, что мне захотелось разобраться, что же это за зверь такой и как его использовать в своих целях.
Итак, определение следующее:
jQuery is a fast and concise JavaScript Library that simplifies HTML document traversing, event handling, animating, and Ajax interactions for rapid web development. jQuery is designed to change the way that you write JavaScript.
То есть, говоря простыми словами, JQuery это библиотека на языке JavaScript, которая упрощает разработку веб-страничек (в том числе обработку событий, добавление анимации и AJAX-взаимодействий для ускорения web-разработки). Как говорят разработчики, JQuery  должна полностью изменить способ, которым  мы пишем JavaScript-код.
С чего же начать изучение этого чуда? Я решил, что лучше всего для этого подходит документация и примеры с официального сайта.

Скачиваем JQuery
С начала, разумеется, надо скачать JQuery-библиотеку.  В разделе "Скачиваем JQuery" приведены ссылки на различные релизы. Лучше всего, конечно, скачать самый последний - JQuery 1.4.1.  Скачиваем его и кладем в нужную папочку, у меня это "scripts":
wget http://code.jquery.com/jquery-1.4.js
Отлично, теперь библиотека JQuery установлена на вашем компьютере. Остается только использовать. Для этого хорошо бы понять, как она работает. На сайте JQuery этому посвящена отдельная страница.
Итак, попробуем следовать в точности их рекомендациям.
Создаем страничку со следующим кодом:
<!doctype html>
<html>
<head>
<script type="text/javascript" src="jquery-1.4.js"></script>

<script type="text/javascript">

</script>
</head>
<body>
<a href="http://jquery.com/">jQuery</a>
</body>
</html>
В строке <script type="text/javascript" src="jqery-1.4.js"></script>" "jquery-1.4.js" необходимо заменить на путь к скачанному файлику jquery-1.4.js, в моем случае - это "script/jquery.js". Если у вас этот файлик лежит в той же директории, что и файл странички, который мы только что создали, то ничего менять не надо:)
Запуск функций при загрузке документа:
Нам предлагают рассмотреть самый первый пример JQuery:
Когда JavaScript программисты хотят, чтоб какое-либо событие выполнилось после того, как страница загрузится, они обычно пользуются следующим способом:
window.onload=function(){alert('welcome!');}
Внутри фигурных скобок тот код, который исполнится при срабатывании события onload объекта window.  Он начинает выполняться уже тогда, когда еще не загрузились все картинки. В JQuery есть такое понятие, как "событие готовность", которое выполняется, когда документ полностью готов к манипулированию им.
Добавим обработчик к событию нажатия на ссылку, ведущую на сайт JQuery:
для этого нам надо в элемент между тегами <script type="text/javascript"> и </script> вписать следующее:
    $(document).ready(function(){
       $("a").click(function(event){
         alert("Спасибо за визит!");
       });
     });
Открываем страницу, кликаем по ссылке и видим, что перед переходом на другой сайт выдает сообщение "Спасибо за визит!".
Словами это можно описать так:
Когда документ полностью загрузился
   при нажатии на a
      выдать сообщение
Итак, в целом я получил кое-какое представление о том, как работает JQuery, что это такое и даже рассмотрел пример использования JQuery.
Постараюсь в дальнейших постах углубиться в эту область, ведь JQuery - это действительно отличный инструмент.

вторник, 16 февраля 2010 г.

Как нажать Ctrl+Alt+Del при управлении компьютером через Remote Desktop (Windows, разумеется)

Как известно, RDC (Remote Desktop Client) позволяет удаленно заходить и управлять на компьютеры Windows, находящиеся вне пределов досягаемости.
Однако, если вы захотите, скажем, проверить список запущенных процессов, то вам необходимо будет нажать Ctrl+Alt+Del. Но это приведет к тому, что запустится Task Manager (Список процессов) на локальной машине, а не на удаленной, так как эта комбинация клавиш исторически привязана к локальному компьютеру. Для того, чтобы выполнить Ctrl+Alt+Del на ремоут десктопе, нажмите просто Ctrl+Alt+End. Результат вас обрадует:)
Кстати, аналогичная ситуация с нажатием Alt+Tab на удаленной машине. Для перелистывания окон на ней нажмите Alt+PageUp или Alt+PageDown.

понедельник, 15 февраля 2010 г.

Аналог Paint и Paint.Net под Linux Debian (Ubuntu)

Не знаю, как у вас, а у меня часто возникает ситуация, когда надо обрезать фотографию, как-то обработать скриншот и все такое. В Windows для этих целей я использую Paint, который всегда и везде под рукой. Однако под линуксом пейнта нет:(
Естественно, первое, что пришло мне в голову - использовать GIMP - GNU Image Manipulation Program. Однако, ГИМП - это скорее замена Adobe Photoshop'a, нежели Paint'a. Безусловно, он предоставляет огромные возможности, но обрезать в нем фото - это как стрелять из пушки по воробьям.
И вот, внезапно на просторах интернета обнаружилась Pinta - как пишут на официальной странице проекта, она представляет собой упрощенную альтернативу GIMP'a для рядовых пользователей. Сейчас она находится в ранеей стадии разработки, версия, на момент публикации поста - 0.1.
Возможности Пинты следующие:

  • Включены такие тулзы, как карандаш, кисть, ластик, выделения
  • Поддержка работы со слоями
  • Неограниченная история изменений
  • Такие эффекты, как инверсия, сепия  и пр.
Итак, установка этой программки выполняется следующим образом:
1) Скачиваем deb-пакет с сайта:
wget http://dl.dropbox.com/u/1481774/pinta-0.1.deb
Вместо использования этой команды, можно скачать вручную с официальной страницы.
2) Устанавливаем:
sudo dpkg -i  pinta-0.1.deb
И все, запускаем через обычное меню, либо командой:
pinta
Внизу картинка с сайта разработчика:

четверг, 11 февраля 2010 г.

Настройка WiFi - интернета в Linux Debian (Ubuntu) на ноутбуке Lenovo u350 (карточка Intel)

Итак, я собрался с силами и решил таки поковыряться и настроить вай-фай на Линуксе Дебиан. Путь, пройденный мною, также действует и для Убунту, Кубунту и пр.
Во-первых, необходимо установить пакет "wireless-tools", который предоставляет набор инструментов для работы с беспроводными соединениями. Так же стоит установить wpasupplicant - клиент для работы с WPA и WPA2 сетями.
Во-вторых, необходимо установить модуль драйвера для вашей wifi-карточки. Который именно вам нужен, вы можете узнать по этой таблице. Если вы вдруг не знаете, какая wifi-карта у вас, можете узнать это, выполнив следующую команду:
lspci | less
Она выведет список всех pci-устройств, использующихся в вашей системе. Если же у вас usb-карта, примените команду
lsusb | less
Ее действие такое же, как у lspci, только для usb-портов. Подробнее обо всех методах узнавания своих устройств вы можете прочитать на debian wiki.
В случае карточки от Intel, вам необходим модуль iwlagn. Он для своей корректной работы требует драйвера, которые вы можете найти на странице Intel. Необходимо скачать оттуда требуемый драйвер для карточки, распаковать его и скопировать в папку /lib/firmware/:
tar -xvf iwlwifi-5150-ucode-8.24.2.2.tgz
cp iwlwifi-5150-ucode-8.24.2.2/iwlwifi-5150-2.ucode /lib/firmware/
В-третьих, вам необходимо сконфигурировать сеть.
Для этого откройте файл /etc/network/interfaces вашим любимым редактором, например, vim:
vim /etc/network/interfaces
, затем добавьте в него следующие строки:
auto wlan0
iface wlan0 inet dhcp
wpa-ssid mynetworkname
wpa-psk mysecretpassphrase
, в случае, если хотите подключиться к сети с WPA / WPA2. Про остальные функции вы, опять же, можете почитать на debian wiki. Там же описано, как настраивать сеть через графические интерфейсы (GUI).
После того, как вы все настроили, необходимо выполнить последнюю команду:
sudo ifup wlan0
И всё!) Радуемся интернету по воздуху!

четверг, 28 января 2010 г.

Они, любимые, или изменение шрифта с помощью javascript

Решил сделать для себя успокаивательную страничку. Чтобы в любое время тяжелого рабочего дня можно было бы чуть чуть отдохнуть душой:)
В результате получилось следующее:

(.) (.)
Чтобы увидеть, как это реализовано, вы можете посмотреть исходный код этой страницы:) Здесь же я вкратце опишу принцип. Во-первых, задаем 2 функции javascript, increaseFontSize() и decreaseFontSize(), для увеличения и уменьшения размера шрифта. Они действуют так: 
var p = document.getElementsByTagName('shticka');
После этого в p у нас получается массив всех тегов типа "shticka". Конечно, вы можете получать список тегов по классу, или отдельно каждый тег по его id. Во-вторых, для каждого элемента из p находим размер шрифта и помещаем его в переменную s:
var s = parseInt(p[i].style.fontSize.replace("px",""));
После чего мы увеличиваем ее, например, на 4:
s+=4;
В-третьих, заменяем размер шрифта на увеличенное s:
p[i].style.fontSize = s+"px";
Вот и все готово:) Можно наслаждаться))

четверг, 21 января 2010 г.

Использование setTimout в javascript, или про то, как давать пользователям ссылку на скачивание с задержкой.

Представим, что вы хотите давать пользователям ссылку на скачивание файла с вашего сайта с какой-то задержкой, например, 30 секунд. Для этого нам понадобится написать всего одну строку на javascript и несколько на html:)
Итак, во-первых, выделим область на своем сайте, где будет выдаваться ссылка. Сделаем это с помощью HTML-тега 'div':
<div id='link'></div>
где link - это уникальный идентификатор этого тега, по которому будем обращаться к нему с помощью javascript. Далее мы пишем сам код javascript, заключая его в HTML тег 'script' :
<script>
setTimeout("document.getElementById('link').innerHTML='<a href='bla-bla.txt'>Ссылка</a>';",30000);
</script>


Что это означает - setTimout - это javascript-функция, выполняющая команды, переданные ей в первом аргументе по истечении времени, заданного во втором аргументе (в миллисекундах). document.getElementById('link') - обращаемся к элементу  документа с идентификатором, равным 'link'. Подробнее про использование getElementById вы можете почитать здесь и тут. innerHTML - переменная элемента, отвечающая за все то, что находится внутри тега. То есть в итоге, после выполнения скрипта, наш тег будет выглядеть так:
<div id='link'><a href='bla-bla.txt'>Ссылка</a></div>
Вот и всё:)

пятница, 8 января 2010 г.

Еще один бесплатный аналог lastfm

Вот и еще один бесплатный и качественный аналог lastfm - GrooveShark


Сделан он на флеше, причем дизайн невероятно удобный и интуитивно понятный. Главное предназначение - это онлайн плеер. Музыки много, в хорошем качестве. Можно добавлять ее в свою библиотку, ставить сердечки и смайлики - нравится или не нравится. В зависимости от этого в режиме радио вам будет предлагаться музыка, которая, скорее всего, вам понравится.
Интересная фишка - создание виджетов для вставки определенных песен или всего плейлиста на ваш сайт или блог. Один из них вы можете наблюдать в начале этого поста.
Кстати, для Chrome есть расширение, которое позволяет управлять музыкой, не переходя на вкладку с ГрувШарком.
В общем, слушаю с большим удовольствием. Единственное, чего нет, в отличие от LastFM - это скробблера для своего плеера.