30 апр. 2014 г.
3 февр. 2014 г.
MemcacheDB и логи
Сегодня дошли руки до memcachedb. Оказывается - логи растут там бешено 8(. У меня было 26Гб логов.
Немного погуглив - нашел решение, коннектимся телнетом и выполняем комманду db_archive.
После этого папка с данными не превышает 30Мб.
Автоматизируем это дело:
Создаем файл:
Теперь каждую ночь у нас будет выполняться архивация логов memcacheDB, соответственно столько не будет жрать места.
Немного погуглив - нашел решение, коннектимся телнетом и выполняем комманду db_archive.
После этого папка с данными не превышает 30Мб.
Автоматизируем это дело:
Создаем файл:
[root@server3 ~]# cat /opt/memcachedb/bin/db_archive db_archive quit [root@server3 ~]#Запихнем в крон это дело:
0 * * * * /usr/bin/telnet 127.0.0.1 11211 < db_archive > /dev/null 2> /dev/null
Теперь каждую ночь у нас будет выполняться архивация логов memcacheDB, соответственно столько не будет жрать места.
7 февр. 2013 г.
Создание maven web проекта
Описывать буду, как создать WEB проект в Eclipse, с установленным m2e. В качестве контейнера будет служить нам tomcat.
Статья написана для тех кто впервые работает с мавеном, кому лень гуглить, и хочет быстро создать простой web проект с помощью maven'а...
Статья написана для тех кто впервые работает с мавеном, кому лень гуглить, и хочет быстро создать простой web проект с помощью maven'а...
12 авг. 2012 г.
Поездка в Волгоград
Отпуск близился к концу, решили мы семьей съездить на какую нибудь достопримечательность. Находится поблизости Волгограда и не побывать на мемориале "Родина-мать" - стыдно. Вообщем собрались и поехали.
Интересные данные:
Монумент «Родина-Мать Зовет» – одна из самых высоких статуй в мире (85 метров) – входит в состав историко-мемориального комплекса «Героям Сталинградской битвы» на Мамаевом Кургане. К ней ведут 200 ступеней – именно столько дней длилась Сталинградская битва.
Ярлыки:
лытдыбр
15 мар. 2012 г.
ubuntu + vim и стрелки управления
При использовании бубунты, возникла "проблемка", я везде привык пользоваться vi редактором, но в бубунте по какой-то причине, после чистой установки - не работает управление стрелочками...
Немного погуглив решение нашлось быстро:
Немного погуглив решение нашлось быстро:
sudo apt-get install vim
28 февр. 2012 г.
Если долго подключаетесь по SSH
Давно столкнулся с проблемой, на некоторые сервера по ssh подключаюсь быстро (счет на миллисекунды), на другие сервера - долго, до 10 секунд бывает... решил все таки потратить время, и погуглить в чем собственно проблема.
Итак, в итоге у Вас может быть 2 проблемы:
Проблема на сервере
Проблема в том что сервак долго резолвит IP того, кто подключается. Правим /etc/ssh/sshd_config:
UseDNS no
Проблема в клиенте
Вторая проблема в GSS-API, его можно отключить, создаем если нету файл ~/.ssh/config:
GSSAPIAuthentication no
Как говорится - радуемся... ;)
Итак, в итоге у Вас может быть 2 проблемы:
Проблема на сервере
Проблема в том что сервак долго резолвит IP того, кто подключается. Правим /etc/ssh/sshd_config:
UseDNS no
Проблема в клиенте
Вторая проблема в GSS-API, его можно отключить, создаем если нету файл ~/.ssh/config:
GSSAPIAuthentication no
Как говорится - радуемся... ;)
9 дек. 2011 г.
советы тем кто подрастает
Хотел называть “крик души”, но потом в конце написания поста, решил изменить название на “советы тем кто подрастает”.
В общем есть у меня знакомый, который около двух месяцев назад, попросил поревьювить их код. Код не замысловатый, молодой проект, так что посмотреть все это дело не заняло много времени... Замечания в основном были по архитектуре, о том как код упростить, ну и как сторонник TDD, естественно был у меня главный вопрос - “а где тесты?”.
Естественно о TDD они слышали. В просторах сети читали, вроде бы даже смотрели видео, якобы даже пробовали использовать, но как это применить на конкретно ихнем примере - тут уже сложнее. У меня ушло около недели (это где-то 3-4 часа моего времени), за которое я внес изменение в их базовые классы и естественно написал базовые тесты, так сказать на примере показать, что есть TDD. В качестве напутствия приложил файлик с книгой “Мартин Р. - Чистый код. Создание, анализ и рефакторинг”.
Результат - сегодня на почте я нашел письмо, с примерным содержанием “переделали, посмотри, мы растем, ждем ответ”, полез смотреть... начал писать ответ в письме, но вместо этого решил написать заметку в блог, что бы и другие не наступали на эти грабли.
Повторяю, прошло около двух месяцев, за это время проект не сдвинулся со своего места... т.е. целая команда, полностью перестала развивать проект, они остановили всю разработку ради того что бы внедрить TDD и переписать код, причем код проекта, который еще не запущен - смысл?
Совет 1: Любые нововведения не должны останавливать процесс разработки продукта, Ваша задача делать продукт, а не код. Как бы нам не хотелось сделать все по уму, этого не получится, любой код должен эволюционировать, старые куски должны переписываться (это не сомненно). Код который Вы сейчас пишите, используя все Ваши знания, через некоторое время, для Вас покажется устаревшим, и возникнет желание переписать. Но тогда у нас будет не разработка и улучшение конкретного продукта, а улучшение кода. А кому кроме программиста этот код нужен? Хорошо написанный код может доставить эстетическое удовольствие только тому программисту, который его написал, т.к. для других он будет либо слишком тривиален, либо слишком сложным. Единственное что волнует заказчика/начальника/клиента - код работает согласно требованию.
Едем дальше. Начал просматривать тесты, беглый осмотр и очередная ошибка, её сотню раз обсуждали, во всех статьях это описано, но почему-то многие эту ошибку допускают.
например (пример утрированный):
Ответ: Мы получим 2 не рабочих теста. Это не проблема, когда у нас один класс и два метода-теста, а возьмем реальную систему, где в сотнях, а иногда даже тысячах классов-тестов есть по более десятка методов. И кто-то допускает ошибку в коде, аналогичному методу sum, который используется для сравнения, или предполагается что он “уже проверен и работает”. Результат у нас куча провалившихся тестов.
Совет 2: Каждый тест должен проверять только свою часть. Он не должен зависеть от тех классов которые проверяются в других тестах и которые могут работать не верно. В коде который я ревьювил, я сделал специально ошибку, в классе который получает игрока (в поле игрока, его номер всегда возвращался 1), я получил 80% не рабочих тестов, и если бы я эту ошибку не допустил специально, то найти что ж в коде пошло не так - это уже проблема. Т.е. если мы проверяем в тесте “игровую доску”, и классу “доски”, что бы тест прошел нам нужно передать двух игроков - их лучше создать с нужными параметрами, а не использовать общее хранилище для получения - т.к. при проверке доски мы будем зависеть от работоспособности хранилища пользователей (не важно виртуальное оно или реально). А при поломке хранилища пользователей - у нас так же не проходит тест по “игровой доске” и все остальные тесты.
Совет 3: Называйте тесты так, что бы из названия сразу было видно - что этот метод проверяет. Когда падает тест test32 - “expected:<...> but was:<...>”, то в любом случае придется “заходить” в тест, хорошо если в нем есть комментарии, намного удобнее писать имя теста так - что бы было понятно что он проверяет. Хотя бы так: testPlayerBoardNotNull - уже большинству будет понятно, что этот тест проверял. А вообще есть много способов, некоторые пишут should, или expect и т.д. - тут уже дело каждого, как Вы будете именовать Ваши тесты, сам факт в том - что бы если тест упал - можно было как можно быстрее понять - что упало.
Совет 4: Прочесть книгу “Совершенный код. С. Макконел”. Не важно на каком языке Вы пишете, к любому языку можно отнести то что там написано. Вроде бы код работает, но с первого раза глядя на функцию, понять что он делает - практически не реально, благо хотя бы многие функции имеют описание и достаточно в IDE на функцию навести мышь - что бы узнать “что она делает”. Перечислять постулаты книги смысла нету, так что по коду это извечная проблема многих команд. Прочесть и понять.
Совет 5: Предполагайте, что ваш “движок” может поменяться. Практически все системы что я видел очень сильно связаны с конкретной базой данных, либо некой внешней библиотекой, пример будет про хранение. Обычно после того как людям рассказываешь базовые вещи по архитектуре, для чего все таки нужны абстрактные классы, интерфейсы, как применить это в TDD, то через время у них получается примерно следующее. Есть некий абстрактный класс, например Players у которого есть методы list, get, add, edit и т.д... а затем у них есть PlayersImplMemory и PlayersImplMySql
Соответственно первый хранит все в хешмапе и используется для тестов, а второй уже в промо. Люди которые вроде бы знают что такое “дублирование кода”, сами же его допускают, в обоих классах у них в методе add идет валидация входных данных. Соответственно если я проверяю в тесте валидацию или получение для Memory модели, это не значит что это будет “справедливо” для MySql модели. Более логично - создать класс который будет иметь в себе валидацию, все что общее, например Players, а использовать уже абстрактный класс или интерфейс для хранения, например PlayerStorage. Storage - принимает “сырые данные” и надеется что они будут “правильными” и сохранять их уже в конкретной ситуации либо в памяти, либо в конкретной БД или в шарде, тут уже можно в любой момент поменять направление.
Ну и на последок, самое главное: ваша программа должна быть как конструктор. Каждый кубик - это класс/интерфейс, и если смотреть “сверху” - все должно сводится к “передал параметры”, “получил результат”... если Вы сначала подумаете о том, какие у Вас будут входные параметры, и какие результаты Вы хотите получить, то реализовать это уже вопрос времени. Любую даже самую казалось бы сложную и громоздкую задачу, можно описать нормально и реализовать. Как пример: мне нужно было в уже существующей системе переделать отчеты. В БД лежат данные, в варианте “до меня” был класс и метод, у которого порядка 5-10 параметров передавалось на вход, на выходе String. Нужно генерировать 3-4 типа отчетов и каждый из них должен быть либо в HTML либо в том же HTML но для печати...
В том классе который существовал, там было порядка 4-5 методов приватных, в среднем класс был на 300-400 строк. Тот кто писал - постарался, повыносил все дубликаты формирования в методы и т.д... но меня не устроило - то что в одном месте были собраны как логика получения - так и логика формирования...
После моей переделки у меня получился 1 абстрактный класс TableDataSource, который умел формировать данные из БД, собрать три листа, для thead, body и tfoot. И соответственно под каждый отчет был написан свой наследник, и что бы не запоминать их имена, я создал еще “фабрику”, где были методы getMonthReport, getYearReport и т.д. Соответственно так же у меня получился 1 абстрактный класс TableRender, который в качестве параметра принимал TableDataSource и возвращал String. И уже два наследника TableRenderHtml, TableRenderPrintHtml. После чего добавление нужного отчета сводилось к созданию нового TableDataSource.
В общем как-то так...
В общем есть у меня знакомый, который около двух месяцев назад, попросил поревьювить их код. Код не замысловатый, молодой проект, так что посмотреть все это дело не заняло много времени... Замечания в основном были по архитектуре, о том как код упростить, ну и как сторонник TDD, естественно был у меня главный вопрос - “а где тесты?”.
Естественно о TDD они слышали. В просторах сети читали, вроде бы даже смотрели видео, якобы даже пробовали использовать, но как это применить на конкретно ихнем примере - тут уже сложнее. У меня ушло около недели (это где-то 3-4 часа моего времени), за которое я внес изменение в их базовые классы и естественно написал базовые тесты, так сказать на примере показать, что есть TDD. В качестве напутствия приложил файлик с книгой “Мартин Р. - Чистый код. Создание, анализ и рефакторинг”.
Результат - сегодня на почте я нашел письмо, с примерным содержанием “переделали, посмотри, мы растем, ждем ответ”, полез смотреть... начал писать ответ в письме, но вместо этого решил написать заметку в блог, что бы и другие не наступали на эти грабли.
Повторяю, прошло около двух месяцев, за это время проект не сдвинулся со своего места... т.е. целая команда, полностью перестала развивать проект, они остановили всю разработку ради того что бы внедрить TDD и переписать код, причем код проекта, который еще не запущен - смысл?
Совет 1: Любые нововведения не должны останавливать процесс разработки продукта, Ваша задача делать продукт, а не код. Как бы нам не хотелось сделать все по уму, этого не получится, любой код должен эволюционировать, старые куски должны переписываться (это не сомненно). Код который Вы сейчас пишите, используя все Ваши знания, через некоторое время, для Вас покажется устаревшим, и возникнет желание переписать. Но тогда у нас будет не разработка и улучшение конкретного продукта, а улучшение кода. А кому кроме программиста этот код нужен? Хорошо написанный код может доставить эстетическое удовольствие только тому программисту, который его написал, т.к. для других он будет либо слишком тривиален, либо слишком сложным. Единственное что волнует заказчика/начальника/клиента - код работает согласно требованию.
Едем дальше. Начал просматривать тесты, беглый осмотр и очередная ошибка, её сотню раз обсуждали, во всех статьях это описано, но почему-то многие эту ошибку допускают.
например (пример утрированный):
package ua.lg.moon;
public class MyClass {
public static int sum(int a, int b){
return a+b;
}
public static int diff(int a, int b){
return a-b;
}
}
package ua.lg.moon;
import static org.junit.Assert.*;
import org.junit.Test;
public class MyClassTest {
@Test
public void testSum() {
assertEquals(4, MyClass.sum(2, 2));
assertEquals(6, MyClass.sum(4, 2));
}
@Test
public void testDiff() {
assertEquals(MyClass.sum(2, 2), MyClass.diff(6, 2));
assertEquals(MyClass.sum(4, 2), MyClass.diff(10, 4));
}
}
Вопрос на засыпку: что мы получим, когда у нас в методе sum будет ошибка?Ответ: Мы получим 2 не рабочих теста. Это не проблема, когда у нас один класс и два метода-теста, а возьмем реальную систему, где в сотнях, а иногда даже тысячах классов-тестов есть по более десятка методов. И кто-то допускает ошибку в коде, аналогичному методу sum, который используется для сравнения, или предполагается что он “уже проверен и работает”. Результат у нас куча провалившихся тестов.
Совет 2: Каждый тест должен проверять только свою часть. Он не должен зависеть от тех классов которые проверяются в других тестах и которые могут работать не верно. В коде который я ревьювил, я сделал специально ошибку, в классе который получает игрока (в поле игрока, его номер всегда возвращался 1), я получил 80% не рабочих тестов, и если бы я эту ошибку не допустил специально, то найти что ж в коде пошло не так - это уже проблема. Т.е. если мы проверяем в тесте “игровую доску”, и классу “доски”, что бы тест прошел нам нужно передать двух игроков - их лучше создать с нужными параметрами, а не использовать общее хранилище для получения - т.к. при проверке доски мы будем зависеть от работоспособности хранилища пользователей (не важно виртуальное оно или реально). А при поломке хранилища пользователей - у нас так же не проходит тест по “игровой доске” и все остальные тесты.
Совет 3: Называйте тесты так, что бы из названия сразу было видно - что этот метод проверяет. Когда падает тест test32 - “expected:<...> but was:<...>”, то в любом случае придется “заходить” в тест, хорошо если в нем есть комментарии, намного удобнее писать имя теста так - что бы было понятно что он проверяет. Хотя бы так: testPlayerBoardNotNull - уже большинству будет понятно, что этот тест проверял. А вообще есть много способов, некоторые пишут should, или expect и т.д. - тут уже дело каждого, как Вы будете именовать Ваши тесты, сам факт в том - что бы если тест упал - можно было как можно быстрее понять - что упало.
Совет 4: Прочесть книгу “Совершенный код. С. Макконел”. Не важно на каком языке Вы пишете, к любому языку можно отнести то что там написано. Вроде бы код работает, но с первого раза глядя на функцию, понять что он делает - практически не реально, благо хотя бы многие функции имеют описание и достаточно в IDE на функцию навести мышь - что бы узнать “что она делает”. Перечислять постулаты книги смысла нету, так что по коду это извечная проблема многих команд. Прочесть и понять.
Совет 5: Предполагайте, что ваш “движок” может поменяться. Практически все системы что я видел очень сильно связаны с конкретной базой данных, либо некой внешней библиотекой, пример будет про хранение. Обычно после того как людям рассказываешь базовые вещи по архитектуре, для чего все таки нужны абстрактные классы, интерфейсы, как применить это в TDD, то через время у них получается примерно следующее. Есть некий абстрактный класс, например Players у которого есть методы list, get, add, edit и т.д... а затем у них есть PlayersImplMemory и PlayersImplMySql
Соответственно первый хранит все в хешмапе и используется для тестов, а второй уже в промо. Люди которые вроде бы знают что такое “дублирование кода”, сами же его допускают, в обоих классах у них в методе add идет валидация входных данных. Соответственно если я проверяю в тесте валидацию или получение для Memory модели, это не значит что это будет “справедливо” для MySql модели. Более логично - создать класс который будет иметь в себе валидацию, все что общее, например Players, а использовать уже абстрактный класс или интерфейс для хранения, например PlayerStorage. Storage - принимает “сырые данные” и надеется что они будут “правильными” и сохранять их уже в конкретной ситуации либо в памяти, либо в конкретной БД или в шарде, тут уже можно в любой момент поменять направление.
Ну и на последок, самое главное: ваша программа должна быть как конструктор. Каждый кубик - это класс/интерфейс, и если смотреть “сверху” - все должно сводится к “передал параметры”, “получил результат”... если Вы сначала подумаете о том, какие у Вас будут входные параметры, и какие результаты Вы хотите получить, то реализовать это уже вопрос времени. Любую даже самую казалось бы сложную и громоздкую задачу, можно описать нормально и реализовать. Как пример: мне нужно было в уже существующей системе переделать отчеты. В БД лежат данные, в варианте “до меня” был класс и метод, у которого порядка 5-10 параметров передавалось на вход, на выходе String. Нужно генерировать 3-4 типа отчетов и каждый из них должен быть либо в HTML либо в том же HTML но для печати...
В том классе который существовал, там было порядка 4-5 методов приватных, в среднем класс был на 300-400 строк. Тот кто писал - постарался, повыносил все дубликаты формирования в методы и т.д... но меня не устроило - то что в одном месте были собраны как логика получения - так и логика формирования...
После моей переделки у меня получился 1 абстрактный класс TableDataSource, который умел формировать данные из БД, собрать три листа, для thead, body и tfoot. И соответственно под каждый отчет был написан свой наследник, и что бы не запоминать их имена, я создал еще “фабрику”, где были методы getMonthReport, getYearReport и т.д. Соответственно так же у меня получился 1 абстрактный класс TableRender, который в качестве параметра принимал TableDataSource и возвращал String. И уже два наследника TableRenderHtml, TableRenderPrintHtml. После чего добавление нужного отчета сводилось к созданию нового TableDataSource.
В общем как-то так...
1 окт. 2011 г.
Типа непутевые заметки...
Планировал вести заметки каждый день и выкладывать их регулярно, но как оказалось - не все получается так как хочется. Первую неделю моего отпуска мы были довольно таки далековато от тырнета и такой возможности не было. Купленная карточка укр-телекома там отказывалась работать напрочь, поэтому начал вести "заметки" в Evernote. С Evernote было удобно, до тех пока я не уперся в лимит 60Мб который там отведен, для бесплатного аккаунта. Поэтому последние дни своего отдыха я писал напрямую в G+, ну а сейчас решил все это соединить в один пост и дописать не хватающие дни )
Изначально отпуск планировался из серии - приехать, снять хату, жарить кожу на солнце, жарить печень пивом, где-то недалеко от моря, но по некоторым причинам, вышло немного не так...
Изначально отпуск планировался из серии - приехать, снять хату, жарить кожу на солнце, жарить печень пивом, где-то недалеко от моря, но по некоторым причинам, вышло немного не так...
6 мая 2011 г.
LVM раздел из 2х флешек
Насмотревшись видео от Яндекса решил по извращаться с LVM. В принципе я до этого читал, даже когда-то приходилось добавлять новый диск в работающую систему, но особо как-то не вникал. В одной из лекций упоминался LVM, заинтересовало... Вообщем ничего лучше не придумал как объединить 2 флешки в один "диск"...
Собственно что имеется:
Чего хочется:
один раздел на 3Гб
Собственно что имеется:
- флешка на 1Гб
- флешка на 2Гб
- Система убунта
Чего хочется:
один раздел на 3Гб
8 дек. 2010 г.
Добавление шрифтов в ubuntu 10.10
мелкий tip's
заходим в /usr/share/fonts/truetype (от рута), для тех кто отвык от консоли - запустить:
перестартовуем сеанс и усе..
заходим в /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, собсно делаем-с:
первым делом уберем все пробелы из имени файлов (заменим их на _):
вторым шагом конвертнем:
удачи)
есть такая замечательная утилитка 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
под катом немного описания + скрин что это такое и как это работает...
Собственно мне не жалко. ссылка на скачивание
Распространяется 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
5 авг. 2010 г.
Немного про JUnit
Использовать Unit тесты или нет, это уже решает каждый программист сам, где-то они удобны, где-то нет, поэтому это уже вопрос второй и не настолько важный, но ИМХО хотя бы знать что это такое и как это можно использовать - нужно каждому.
Что такое JUnit? Это один из способов тестирования программ на Java. Существуют также фреймворки для других языков, но в данном примере рассмотрим JUnit.
На просторах паутины очень много примеров и при желании можно легко найти от простых до достаточно сложных комплексных проверок. В данной статье - будет рассмотрена только основа.
Что такое 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, таким образом можно маунтить папки рутом и давать доступ на редактирование всем остальным пользователям.
Подписаться на:
Сообщения (Atom)