8 дек. 2010 г.

Добавление шрифтов в ubuntu 10.10

мелкий tip's

заходим в /usr/share/fonts/truetype (от рута), для тех кто отвык от консоли - запустить:
$ gksu nautilus /usr/share/fonts/truetype
и скопировать с вендовой машины tahoma.ttf + tahomabd.ttf (если еще какие нить нужны - добавляем тоже)
перестартовуем сеанс и усе..

28 нояб. 2010 г.

ubuntu, ogg2mp3

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

есть такая замечательная утилитка sox (SOund eXchange) которая делает как раз то что нам надо... Но вот не задача, если мы поставим пакеты из штатной репы то получим такое сообщение "SoX was compiled without MP3 encoding support"
гуглим, видим что народ изгаляется вплоть до сборки из сырцов (но чет так влом это делать)... но среди прочего находим PPA mediahacks, собсно делаем-с:
$> sudo add-apt-repository ppa:dtl131/mediahacks
$> sudo apt-get update
$> sudo apt-get install sox libsox-fmt-all
После этих манипуляций у нас будет "работающий" sox с помощью которого можно перегнать:
$> sox 01.ogg 01.mp3
а что бы такое не делать для каждого файла, а обработать сразу весь каталог, перейдем в него и сделаем так:

первым делом уберем все пробелы из имени файлов (заменим их на _):
for x in * ; do mv "$x" `echo -n $x | tr " " "_"`; done

вторым шагом конвертнем:
for x in *.ogg ; do sox $x `echo $x|awk -F . '{print $1 ".mp3"}'`; done

удачи)

27 нояб. 2010 г.

openvpn на centos 5.5

что-то в штатных репах не нашел openvpn пакета, в гугле нашел вариант решения:
$>yum install yum-prio*
$>wget http://download.fedora.redhat.com/pub/epel/5Server/i386/epel-release-5-4.noarch.rpm
$>rpm -Uvh epel-release-5-4.noarch.rpm
$>yum install openvpn

12 окт. 2010 г.

Отладка Java приложений

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

6 сент. 2010 г.

примитивный TimeTracking для Matis'а

После сообщения в твиттере "написал примитивный тайм-трекер для mantis'а", мне уже не первый человек пишет мне на мыло "поделись".
Собственно мне не жалко. ссылка на скачивание
Распространяется As Is
под катом немного описания + скрин что это такое и как это работает...

22 авг. 2010 г.

Очередная нае..ка от МТС

Сегодня столкнулся с таким приколом... В 13-14 пришла СМС с неизвестного мне номера, с текстом "Что завтра делаешь?"... я попытался перезвонить на этот номер - "нет связи с абонентом"... ну думаю кто-то из знакомых поменял карточку и отсылаю СМСку мол "Ты хто?", через 30 секунд ответ пришел с именем, с таким именем у меня в знакомых только 1 человек есть (кто знает мой номер).... я попытался еще раз набрать по этому номер - "нет связи"... отсылаю опять смс с текстом мол "дозвонится не могу", через 30 секунд снова СМС в ответ "Что так? Как сам?"... перезваниваю на номер того человека "якобы с которым я общался" но уже на тот номер который есть в книге...
говорю мол:
- от тебя СМС?
- Какие?
- СМСки от "левого" номера, дозвонится на него не могу, а СМС туды обратно идут...
- Ааа... я уже не ведусь, уже приходило... развод...

ладно... звоню еще одному товарищу, мол так и так:
- Сталкивался?
- Ага, почти всем сотрудникам на работе последнюю неделю приходили... Звонили оператору спрашивали, сказали что МТС таким не занимается и типа ниприделах.
....

Позвонил сам на 111, объяснил ситуацию, у меня взяли номер от кого пришла СМС, долго переключали... в итоге мне сказали что это номер абонента и за его действия они не отвечают (это сокращенная версия 2х минутной речи) и положили трубку ) от так от...

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

6 авг. 2010 г.

petrus-blogger

  Незнаю кому как, но лично мне дико не удобно пользоваться веб-редактором который предлагает blogger.com. Сегодня на глаза попалась программа petrus-blogger - позволяет писать во встроенном редакторе и затем размещать на необходимом сервисе.   Умеет подключаться:
  • livejournal
  • blogger.com
  • wordpress.com
  • WordPress Generic
  • Flickr
  Программа написана на Java, стартует через JNLP, на моей рабочей машинке под бубунтой 10.04 работает очень даже шустро. Понравилось что есть возможность "брать" фотографии из пикасы.   Мож кому понравиццо.

5 авг. 2010 г.

Немного про JUnit

  Использовать Unit тесты или нет, это уже решает каждый программист сам, где-то они удобны, где-то нет, поэтому это уже вопрос второй и не настолько важный, но ИМХО хотя бы знать что это такое и как это можно использовать - нужно каждому.

  Что такое JUnit? Это один из способов тестирования программ на Java. Существуют также фреймворки для других языков, но в данном примере рассмотрим JUnit.

  На просторах паутины очень много примеров и при желании можно легко найти от простых до достаточно сложных комплексных проверок. В данной статье - будет рассмотрена только основа.

27 июл. 2010 г.

Проверка валидности email'а на Java

Из серии "не потерять". Для проверки на яве валидность email'а можно использовать:
public static boolean isValidEmail(String email){
  Pattern p = Pattern.compile(".+@.+\\.[a-z]+");
  Matcher m = p.matcher(email);
  return m.matches();
}

23 июл. 2010 г.

[Ubuntu] Eclipse как бороться с "Subversion Native library not available"

Если после запуска Eclipse при установленном SubEclipse выпадает окошко "subversion native library not available" - нужно прочитать страничку на их сайте для тех кому лень читать (Ubuntu):
$sudo apt-get install libsvn-java
Затем открываем каталог где у Вас установлен Eclipse находим файл eclipse.ini после -vmargs добавляем строчку -Djava.library.path=/usr/lib/jni в моем случае получилось:
-startup
plugins/org.eclipse.equinox.launcher_1.1.0.v20100507.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.gtk.linux.x86_1.1.0.v20100503
-product
org.eclipse.epp.package.jee.product
--launcher.defaultAction
openFile
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
--launcher.defaultAction
openFile
-vmargs
-Djava.library.path=/usr/lib/jni
-Dosgi.requiredJavaVersion=1.5
-XX:MaxPermSize=256m
-Xms40m
-Xmx512m
Вуаля...

[Ubuntu] FTP как локальная папка

Статья носит характер "что б потом не искать". Задача, надо работать с удаленными FTP. Нам понадобится curlftpfs в убунте ставится:
$sudo apt-get install curlftpfs
синтаксис подключения какой-либо папки:
$mkdir rem_folder
$curlftpfs ftp://login:pass@hostname/ /path/to/rem_folder
так-же при подключении можно указать ключ -o allow_other, таким образом можно маунтить папки рутом и давать доступ на редактирование всем остальным пользователям.

21 июл. 2010 г.

пару слов о наследниках и чтении из БД

Сегодня на работе проводил маленький ликбез по поводу граблей на которые сам уже наступил... возможно кому-то пригодится. Итак предположим у нас есть класс C1:
public class C1{
  public String field1 = "default1";
  public String field2 = "default2";
  public String field3 = "default3";
}
Предположим нам нужно данный класс заполнить из БД или еще из каких либо внешних источников, обычно это выносят в отдельный метод (что логично), итого получаем некий метод, подобный этому (данный пример я часто встречал как в литературе, так и на сайтах в "солюшенах"):
public C1 getItemFromResultSet(ResultSet rs) throws Exception{
  C1 item = new C1();
  item.field1="from_db_1";
  item.field2="from_db_2";
  item.field3="from_db_3";
  return item;
}
соответственно при использовании у нас получается что-то вроде такого:
public C1[] getAll() throws Exception{
  /* 
   * "select * from table_name order by field1"
   */
  ResultSet rs = null; //null что б обвязку не писать
  rs.last();
  C1[] items = new C1[rs.getRow()];
  rs.beforeFirst();
  while (rs.next()){
    items[rs.getRow()-1]=getItemFromResultSet(rs);
  }
  return items;
}
public C1 getByID(long id) throws Exception{
  /*
   * "select * from table_name where id='"+id+"'"
   */
  ResultSet rs = null;
  if (!rs.next()){
    throw new Exception("Запись не найдена");
  }
  return getItemFromResultSet(rs);
}
Вроде бы все хорошо и все замечательно, но предположим что у нас появляется некий наследник от C1 у которого есть несколько доп. полей. Скажем такой:
public class C2 extends C1{
  public String name2 = "default 2";
}
И теперь скажем нам нужен метод, который вернет по номеру C2 класс, но в нем всего-лишь навсего нужно добавит 1 доп. поле. Первое что приходит на ум написать:
public C2 getByIDEx(long id) throws Exception{
  /*
   * "select *, 
   * (select count(*) from table2) as cnt 
   * from table_name where id='"+id+"'"
   */
  ResultSet rs = null;
//if (!rs.next()){
//  throw new Exception("Запись не найдена");
//}
  C2 item = (C2)getItemFromResultSet(rs);
  //item.name2 = rs.getString("cnt");
  item.name2 = "from_db_cnt";
  return item;
}
Но на практике при попытке такое вызвать мы получим:
Exception in thread "main" java.lang.ClassCastException: ua.lg.moon.Start$C1 cannot be cast to ua.lg.moon.Start$C2
    at ua.lg.moon.Start.getByIDEx(Start.java:54)
    at ua.lg.moon.Start.<init>(Start.java:60)
    at ua.lg.moon.Start.main(Start.java:63)
Текст ошибки нам явно сообщает о том что у нас есть элемент класса C1, а мы его пытаемся преобразовать в класс C2. Что в принципе логично. Т.е. сама JVM не дает нам совершить ошибку. Какие варианты в такой ситуации? Первое - создать еще один метод, который будет полной копией getItemFromResultSet, но при этом будет возвращать C2 элемент, но при таком подходе, при появлении C3 у нас еще один метод появится, затем еще один и т.д. и т.п. Логичнее все-таки подумать... следующее решение:
public void copyFromResultSet(ResultSet rs, C1 item) throws Exception{
  item.field1="from_db_1";
  item.field2="from_db_2";
  item.field3="from_db_3";
}
В данном случае, мы уже не привязаны к конкретному классу, т.к. мы его не создаем. Единственно что нам нужно, это что бы в качестве параметра item у нас был любой наследник C1 или соответственно сам элемент C1. Но на практике у нас уже есть множество мест, где используется предыдущий вариант. Может есть смысл как-то изменить старый вариант с возможностью использования наследников? В моем случае получился такой вариант:
public C1 getItemFromResultSet(ResultSet rs, C1 item) throws Exception{
  item.field1="from_db_1";
  item.field2="from_db_2";
  item.field3="from_db_3";
  return item;
}
public C1 getItemFromResultSet(ResultSet rs) throws Exception{
  return getItemFromResultSet(rs, new C1());
}
в данном случае у нас в старом использовании все останется как и было, нам не нужно будет переписывать тонны кода, но для решения с классом C2 нам достаточно написать такой метод:
public C2 getByIDEx(long id) throws Exception{
  /*
   * "select *, 
   * (select count(*) from table2) as cnt 
   * from table_name where id='"+id+"'"
   */
  ResultSet rs = null;
//if (!rs.next()){
//  throw new Exception("Запись не найдена");
//}
  C2 item = getItemFromResultSet(rs, new C2());
  //item.name2 = rs.getString("cnt");
  item.name2 = "from_db_cnt";
  return item;
}
теперь при появлении наследников C3 или любого другого, нам достаточно только писать методы аналогичные getByIDEx в которых для заполнения полей класса C1 мы используем один и тот-же метод, а затем "дополняем" его отличающимися данным. И как следствие при появлении нового поля в родительском классе C1 нам новое поле достаточно прописать только в методе getItemFromResultSet.

12 июл. 2010 г.

ubuntu и кнопки управления окном

Заметка "шоб потом не искать" по умолчанию в gnome убунты кнопки управления окном с левой стороны (лично мне не удобно). для того что бы исправить: $gconf-editor открываем /apps/metacity/general/, находим ключ "button_layout" и меняем на "menu:minimize,maximize,close" варианты консольные: $gconftool --type string --set /apps/metacity/general/button_layout "menu:minimize,maximize,close" или вернуть обратно: $gconftool --type string --set /apps/metacity/general/button_layout "close,maximize,minimize:"

9 июл. 2010 г.

Установка связки Subversion+Apache Ubuntu 9.10

Как говорится - по просьбам телезрителей статья в 2х словах как настроить SVN сервер на Ubuntu. Если интересно - вэлкам под кат...

Eclipse+SVN

Вместо введения Для меня до сих пор не понятно, как можно проработать несколько лет в сфере программирования и не использовать такие вещи как CVS, SVN, GIT... CVS я не рассматриваю как морально устаревшую и жутко не удобную вещь, GIT – это децентрализованное хранилище, и мы его пока тоже не будем рассматривать. Остается SVN, он же Subversion. Для чего вообще нужно хранилище? Ответ казалось бы банальный: хранить какие либо материалы, иметь информацию кто и когда изменил, а главное возможность узнать «что изменил». В общем если Вам эта тема интересна — читайте далее (трафа ~3Mb)....

Отучаем FireFox от yandex

что б больше не колупаться в тырнете, решил в своем блоге записать... Стартовая страница заходим: Инструменты/Настройки/Основные Домашняя страница: http://www.google.com/firefox?client=firefox-a&rls=org.mozilla:ru:official Поиск из адресной строки вводим адрес: about:config находим поле keyword.URL заменяем значение на: http://www.google.com.ua/search?q=

раньше было тут

решил перенести заметки из ЖЖ сюда

чет решил перенести все свои записи из ЖЖ на блогспот... дальше буду тут вести заметки...

31 мая 2010 г.

Конференция по nginx(29.05.2010)

Вчера влом было писать, вот решил сегодня миниотчет о поездке написать... фотки все с телефона, так что качество так себе... Ездил на выходных на конференцию по nginx Дорога прошла нормально, за исключением того что оказывается в поезде курить в тамбуре уже нельзя... приходилось с Jason'ом бегать на 2х минутных остановках на улицу курить... Так же почему-то вендор "носящий пифо и воду" продал мне бутыль завернутый в пакет со словами "пить уже тоже нельзя" оО что ж тогда в поезде делать то? Прибыли по графику, поехали на Хрещатик поесть где нить... прошлись возле архитектурного памятиника, хз какого... ) В то место, куда нас вел Jason поесть - не попали (народу много было), пошли в "2 гуся". Днем на Хрещатике проходил толи выезд велосипедистов, толи парад какой-то, но некоторые "чопперы" смотрелись интересно. Ближе к 11 были возле парка А.С. Пушкина. В парке бегали белки, подбегали под самые ноги... Одну пытался сфоткать: Конференция проводилась с целью компенсировать нехватку документации (слова Игоря Сысоева). Некоторые вещи действительно для меня прояснились) Если раньше знал что есть, но не понял "как юзать" и не было времени нормально сесть и разобраться, сегодня уже применил на практике... Собственно ближе к 16 (время точно не помню) конференция закончилась и мы поехали снова на Хрещатик поесть, все в тоже место куда нас Jason настойчиво звал... обилие людей отбило все желание и мы немного походив вокруг поехали на вокзал. Затарились продуктами и пифом на обратную дорогу в ближайшем EKOмаркете и собственно все... на поезд и домой... Немного фоток от Jason: так же отчет от psvmcc

27 мая 2010 г.

вывести конфиг в консоль без комментариев

часто бывает необходимо выслать кому нибудь "рабочий" конфиг - но пересылать весь, в котором больше половины это комментарий - очень даже глупо...

поэтому можно выполнить такое:
cat /etc/squid/squid.conf | egrep -v "(^#.*|^$)"
по порядку:
egrep -v - убрать строки удовлетворяющие требованию
^#.*     - строки которые начинаются с #
|        - или
^$       - пустая строка

11 апр. 2010 г.

аквариум

Сбылась мечта идиота, давно хотел себе завести аквариум. Но как-то не складывалось у меня с этим... 2 недели назад все-таки пошел и купил себе маленький аквариум на 72 литра. Вчера купил в него замок и решился сфоткать это все... так как фотограф из меня никудышный, строга не судите...
на данный момент у меня там живут:
  • Расбора клиновидная
  • Кардинал
  • Данио рерио
  • Сомик крапчатый
  • и еще как-ой то сом, но не могу идентифицировать ;)

7 апр. 2010 г.

centos, cp1251

так сказать, что бы не потерять.

1. locale получим что-то типа:
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
2. создаем чарсеты
$cd /usr/share/i18n
$localedef -c -f CP1251 -i ru_RU /usr/lib/locale/ru_RU.cp1251
3. для выбора кодировки:
$export LANG=ru_RU.cp1251
но правильнее в /etc/sysconfig/i18n
LANG="ru_RU.cp1251"
SUPPORTED="ru_RU.cp1251:ru_RU:ru"