22 авг. 2010 г.

Лев Валкин — Кое-что про Erlang

Check out this SlideShare Presentation:

6 июл. 2010 г.

3G от Мегафон в Тольятти

Приехал в Тольятти на месяц. Провод от интернета в соседней комнате, WiFi нет и на месяц покупать вроде как-то дорого, к тому же интернет обычно с собой нужен.

Купил местную мегафоновскую симку за 350р/мес с неограниченной скоростью на 2Гб.

Скорость при этом получилась практически неотличимой от домашнего проводного интернета. Файлы вчера качал со скоростью 290-300КБайт/сек (закачка из браузера в один поток).

Сегодня решил померять скорость измерителем.



В хорошем смысле поражен - у меня дома по проводам скорость в 1.5 раза меньше...

15 июн. 2010 г.

Django 1.2.1, страница администрирования своей модели

Проблема
При работе через mod_wsgi после создания в Django своих моделей и отключения режима отладки (DEBUG = False) при переходе на страницу редактирования своей модели генерируется ошибка 404. С включенным режимом отладки и при работе со встроенным сервером Django - всё ок.

Решение
Создать файл admin.py, исходя из документации модель должна регистрироваться в админку именно из этого файла.
Нужно создать admin.py и перенести admin.site.register... в него

29 мая 2010 г.

Java RMI HelloWorld

Problem
I catch exception during start server:
RemoteException occurred in server thread; nested exception is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException


Solve
I know two ways:
1. add jar of server project or folder, contains class folders of classes to CLASSPATH environment variable.
2. create script to set CLASSPATH and run rmiservece

example of script:

set CLASSPATH="%CLASSPATH%;c:\Users\...\NetBeansProjects\RMIServer\build\classes\"
call "C:\Program Files\Java\jdk1.6.0_20\jre\bin\rmiregistry.exe"

24 мая 2010 г.

Бесплатная альтернатива для Everest

Программа HWInfo определяет установленное оборудование, может создавать отчеты в csv, xml, html, txt.

Работает очень быстро, без установки.

Тестирования производительности и т.п. в отличие от everest нет.

18 мая 2010 г.

Перерисовка панелей в Java Swing

При динамической вставке/удалении контролов из панели Jpanel она не перерисовывается автоматически. После окончания всех обновлений нужно вызвать два метода:
Сначала JPanel.validate() - для перерасчета положения новых контролов
Затем JPanel.repaint() - для перерисовки контрола.

17 мая 2010 г.

SIP-телефон DPH-120S

Взял домой разобраться что за зверь - аппаратный SIP-телефон.

В результате оказалось, что пароль от него забыт, кнопки сброса пароля на телефоне нет, пароли сброса, генерируемые в сервисном центре через электронную почту - не подходят. Пароль могут сбросить только в сервисном центре.

Интересно кто придумывал телефон для населения, у которого нет кнопки сброса?

16 мая 2010 г.

Что-то человеческое

Зарегистрировался на порталле госуслуги http://www.gosuslugi.ru/ сейчас жду пиисьма с кодом подтверждения.

Неужели государство создало какую-то удобную систему общения с собой?

8 мая 2010 г.

Кредитка МоскомПриватбанк

Зашел в офис москомприват банка, посмотрел - предлагают кредитную карточку без справок, бесплатную. Решил оформить - пускай лежит на всякий случай.

При оформлении никаких справок не спрашивали.

Оформил, активировал, позвонил уточнить установленный мне кредитный лимит, оказалось что установлен кредитный лимит ноль - в кредитовании отказано.

Спрашиваю - какие нужно принести документы для установления кредитного лимита?
Операторша видимо злая была: никакие, в кредитовании отказано.

Фу. сразу какое-то ощущение, что мешают с дерьмом.

DB4O Скорость работы, оптимизация

Опытным путем установлено:
1. Запросы вида: найти объекты, поле которого содержит ссылку на данный очень медленные (вплоть до 5-6 секунд на базе из 7.5 тыс .записей)
2. Индексы для интерфейсов не создаются
3. Поиск по индексу для полей примитивных типов (включая строку) - быстрый. Т.е. если вам нужно хранить UUID, чтобы по нему быстро искать - его надо хранить в текстовом виде.

Как смотерть базу непонятно - ObmectManager отдельный запустить не получилось, а внутри Eclipse просто перестал запускаться без видимых причин.

6 мая 2010 г.

DB4O Скорость работы

Попробовал использовать db4o для хранения внутренней системы сообщений. В результате оказалось, что поля, ссылающиеся не на какой-то примитивный тип не индексируются и на 30МБ базе поиск вида: найди мне объекты, у которых поле value указывает на такой-то объект выполняется 5-6 секунд.

24 апр. 2010 г.

Русскоязычные поддомены BlogSpot

Для создания адреса блога можно использовать русский поддомен домена blogspot.com.
Для этого нужно перевести желаемое занвание в IDN-форму и в качестве желаемого поддомена ввести именно её.
Например для того, чтобы зарегистрировать домен день.blogspot.com:
  1. Перейти на сайт конвертации доменов в IDN
  2. В поле "текст на национальном языке" ввести слово день.
  3. Нажать клавишу >>>
  4. Взять текст из поля "Текст в кодировке punycide" и вставить его в качестве желаемого поддомена.
Можно проверить: http://день.blogspot.com/

18 апр. 2010 г.

Усилок

Давным давно в усилке была проблема - не выключается.
Дошли руки: разобрал. Оказалось, что сгорела какая-то деталь, соединяющая провода параллельно с выключателем. Выломал. Работает.

12 апр. 2010 г.

Фильтрация по элементам массива в хранилище Google App Engine

Если в поле класса хранится массив каких-то значений, то при фильтрации по полю, содержащему массив выполняется фильтрация по значениям этого массива и элемент возвращается если хотя бы один из элементов массива соответствует условию.
Например
@PersistenceCapable
public class Test {
@PrimaryKey
@Persistent(valueStrategy=IdGeneratorStrategy.IDENTITY)
Key id;
@Persistent
ArrayList arr = new ArrayList();
public ArrayList getArr(){
return arr;
}
}
Пусть у нас есть 3 элемента, со значениями arr: (100,200,300), (200,300,400), (400,500,600)
По запросу: SELECT * FROM Test WHERE arr = 200
Будут выбраны первые 2 элемента.
По запросу: SELECT * FROM Test WHERE arr > 300
Будут выбраны элементы 2 и 3.
По запросу: SELECT * FROM Test WHERE arr = 100
Будет выбран первый элемент.

JDO в Google App Engine

Несколько месяцев назад инициализация PersistentManagerFactory занимала около 20 секунд. Сейчас это время сократилось до 5-7 секунд.
UPDATE: 2-3 секунды, еще 2-3 требовалось на компиляцию и запуск самого приложения.

7 апр. 2010 г.

Google App Engine, двойная проверка особо важных данных

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

2 апр. 2010 г.

Google Guice, начало.

Отступление - по звучению напоминает Урфин-Джус из какой-то там части сказки "Изумрудный город".
Guice - Java-библиотека, помогающая использовать стиль программирования внедрение зависимостей (Dependency injection).
В самом простом случае - вам нужно иметь ссылку на какой-то определенный объект (например настройки) в разных частях программы.
public class Settings {     
   static int count = 0;      
   int getVersion()     {         
       ++count;         
       return count;     
   } 
}  
Раньше я это решал методом создания статического класса и прописывания всех настроек в статических полях этого класса.
Это в общем-то не доставляет неудобств, если не нужно проводить модульного тестирования программы с разными настройками или где-то иметь немножко другие настройки, но зато это самый простой пример использования инъекций.
Чтобы иметь этот класс у себя обычным образом нужно создать новый объект
Settings settings = new Settings();  
Что нужно сделать, чтобы создать этот объект через Guice? 1. Нужно создать объект-инъектор 2. Чтобы создать объект-инъектор нужна реализация класса AbstractModule. Для этого нужно переопределить метод configure. Для начала реализация будет самой простой - пустой.

public class GuiceModule extends AbstractModule {
 @Override
 protected void configure() {
 }
}
(Недописано, т.к. думаю что не особо нужно - я разобрался и примеры есть. У кого будет потребность - оставьте комментарий, статью допишу)

Непривычности Google App Engine 2

Занимаемое место

Есть 50 тыс записей о товарах вида: название, номенкралутрный номер, 3 цены, наличие на складе и т.п., текстовый файл для импорта в кодировке Windows-1251 занимает 4.5 МБ.
После импорта в базу GAE по данным статистики они стали занимать 15 МБ.
Потом посмотрел не на статистику, а на детализацию квоты по занимаемому месту:По квоте показывается, что мои данные занимают 100 МБ места.
В итоге: в статистике данных метаданные это видимо только данные о структуре записей, но не индексы. Сотрудник Google подтверждает, что индексы действительно могут занимать в десятки раз больше места, чем сами данные, особенно если используется много свойств, у них длинные названия и у сущности длинное название.
По умолчанию при присваиванию значения свойству для каждого свойства его значение записывается в индекс, чтобы задать свойство без занесения его значения в индекс в Java нужно пользоваться методом setUnindexedProperty. При этом чтобы удалить из индекса значения уже созданных объектов нужно заново сохранить этот объект, установив значение без индекса.
Работа с хранилищем
Видимо на предыдущем эксперименте основное время было затрачено на удаление записей, т.к. это оказалось довольно дорогостоящей операцией на удаление 50 тыс. записей с первичным ключем и 10-ю индексированными полями полями ушло 2.16 часа процессорного времени Datastore, а оно входит в общую процессорную нагрузку.
На импорт этих же записей без индексов (кроме обязтельного первичного ключа) со вставкой по одному объекту потребовалось 0.68 часа процессорного времени хранилища. При вставке пачками по 10 штук скорость импорта возросла примерно в 5 раз, и немного возросло затраченное процессорное время хранилища - на импорт пачками по 10 штук потребовалось 0.75 часа машинного времени. Возможно это потому что я уже был на границе суточной квоты и у меня была надпись Limited. Возможно произошли какие-то изменение в структуре хранения данных приложения, например часть данных переместилась на другой сервер и обращение стало занимать больше ресурсов.
Почему-то при активной работе с хранилищем полезная скорость его работы снижается.
Уменьшении количества объектов в хранилище скорость их удаления снижается, а при увеличении последовательном удалении записей при 15-секундной работе сервлета удаляется сначала 2500 записей за вызов, потом снижается до 1500 объектов за вызов, затем до 1100 объектов/вызов.
Фактическая скорость удаления (т.е. количество объектов, удаленных в единицу времени) объектов не зависит от наличия индексов. В обоих случаях все 50 тыс. объектов были удалены за 33 15-секундных вызова сервлетая, скорость удаления снижалась одинаково.
Зато отсутствие индексов положительно сказалось на процессорном времени, завтрачиваемом на удаление хранилищем. Для удаления 50. тыс. объектов с 10-ю индексами потребовалось 2.16 часов процессорного времени хранилища, а для удаления их же, но с индексом только по первичному ключу - 0.32 часа.
Хотя все равно получается, что операции вставки/удаления в хранилище это дорогие по времени операции.
Импорт тех же записей в MySQL одиночными запросами занимал 2-5 минут.
Итак - с хранилищем Datastore нельзя работать как с привычными базы данных - это и неудобно и занимает очень много ресурсов.
В общем-то Google и сам говорит, что один объект не поддерживает более пяти записей в секунду, но обещает очень быстрые выборки.
Тогда в чем плюс и почему Google App Engine интересен?
Google обещает что эта скорость не будет падать при увеличении объема данных или количества параллельных запросов и не будет зависеть от соседей по серверу.
Сброс значения квот
Иногда задерживается. Например сегодня у меня сброс задержался примерно на 1.5 часа, так что впритык к квотам лучше не работать.

1 апр. 2010 г.

Внедрение зависимостей (Dependency Injection)

При написании программ мне давно уже не нравилось использовать какие-то общие статические класса для обращения к базе данных например, но до последнего времени альтернативы не знал.
Посмотрев видео с Google Developer Days 2009 о создании Google Wave вынес для себя подход к разработке с использованием отдельной шины событий, по возможности хранение в каждом контроле собственной копии объекта, с которым он связан и принцип внедрения зависимостей (dependency injection).
Принцип внедрения зависимостей гласит - все объекты, от которых зависит данный должны в него передаваться. В объекте не должны создаваться какие-то объекты напрямую, отсутствуют обращения к статическим переменным/константам.
Т.е. например у нас есть форма, показывающая и изменяющая объект в базе данных. Внутри этой формы не должно быть вызовов вроде Common.getDB(). - объект для работы с базой данных передается в него через конструктор (предпочтительно) или устанавливается через вызов метода, но не берется из какого-то внешнего класса внутри самой формы и не создается внутри формы.
Так же все дочерние элементы, которые создаются в объекте.
При создании дочерних объектов конструктор объекта не вызывается напрямую, а создается фабрикой внедрения зависимостей (Injector).
Создание объектов через фабрику внедрения зависимостей позволяет:
1. Указывать конкретные типы создающихся объектов где-то в другом месте (аннотация в коде, конфигурационный файл, вызов методов и т.п.).
2. Опустить процесс написания собственных фабрик и передачи кучи параметров из одного объекта в другой (объект настроек приложения, объект для работы с БД и т.п.)
Первый пункт позволяет облегчить создание модульных тестов: вместо всех объектов, от которых зависит проверяемый объект ему передаются заглушки, которые просто фиксируют что сделал объект и простейшим образом реализуют нужные интерфейсы. Это позволяет тестировать каждый объект отдельно, без связи с остальными объектами
Второй пункт сильно снижает рутинное написание фабрик объектов.
В этом же видео были упомянуты разработки Google для простого реализации принципе внедрения зависимостей:
Guice для Java
Gin для GWT

31 мар. 2010 г.

Непривычности Google App Engine

Очень непривычным оказался способ работы "маленькими кусочками". Запись в хранилище занимает относительно много времени (за 30 секунд успевает совершится около 200 операций записи по одному объекту), время на разбор не считаем, т.к. там у меня все просто. Плюс было удаление может быть 100-200 тыс. записей кусками по 100 записей за раз: выборка 100 ключей, удаление этих ключей. После разных проб и импортирования 5-6 раз набора из 50 тыс. записей бесплатная квота на процессор была выбрана на 66%. Попробую вставлять записи пачками по 10-120 штук, посмотрю что из этого получится. Кроме того существует квота квота на процессорную нагрузку DataStore. Как точно она учитывается пока не разбирался, но похоже что она учитывается в общей процессорной нагрузке, тогда она в общем-то непонятна, т.к. она значительно (в 10 раз) больше процесорной квоты для приложения. Update: Ознакомился внимательнее, почитал форум - действительно нагрузка на datastore входит в общую нагрузку. Для бесплатного режима цифра приведена скорее просто чтобы была - её не достигнуть, фактически она работает только для платного режима, т.к. нагрузку на datastore нельзя докупить.

30 мар. 2010 г.

Скорость работы Google App Engine

Первое знакомство с Google App Engine у меня состоялось пару месяцев назад. Коэффициент полезной скорости процессора, т.е. за отведенные 30 секунд времени счетчик замерял нагрузку только 20-25 секунд процессорного времени. Сейчас то ли Google Apps Engine глобально улучшился, то ли мое тестовое приложение переместилось на более свободный сервер, но коэффициент полезной скорости процессора теперь около 2, т.е. за отведенные 30 секунд скрипт отрабатывает 60-66 секунд процессоного времени.

27 мар. 2010 г.

Чтение текстовых строк на Java

Читать строку из потока умеет класс BufferedReader.

ByteArrayInputStream iStream = new ByteArrayInputStream(buf, 0, read_bytes);
BufferedReader reader = new BufferedReader(new InputStreamReader(iStream, Charset.forName("windows-1251")));
String line = reader.readLine();
            

17 мар. 2010 г.

Индикатор раскладки клавиатуры при работе на двух мониторах

Проблема: При подключении второго монитора как отдельного экрана (separate X screen) появилась ошибка что не могу запустить область уведомления, после чего индикатор раскладки пропал с панели задач и стал висеть отдельным окошком. Решение: Нажать на панели задачь правой кнопкой мышки, выбрать "Add to panel" и добавить объект notification area. Причина: Пока не исследовал, по симптомам похоже, что создаются два одинаковых объекта на панелях (при разделении мониторов на разные экраны создаются раные панели), а индикатор выводтся как раз в эту область.

Русская раскладка в opensolaris

Проблема: При выборе русской раскладки в настройках ставится машинописная раскладка (например точка это Shift+7). Решение: Заменить файл /etc/iiim/layoutdata.xml на файл с обычной раскладкой (кроме буквы ё), файл взят со страницы http://osum.sun.com/forum/topic/show?id=2181626:Topic:490343

14 мар. 2010 г.

Контролы swing

Как оказалось в Swing есть не все вроде бы привычные контролы. Например в Swing нет контрола календаря.

7 мар. 2010 г.

Бесплатный менеджер разделов для Windows

Для экспериментов с OpenSolaris нужно подвинуть Windows-разделы на нетбуке. Старый Partition Manager работать в Windows 7 отказался, решил поискать что-то бесплатное. Нашел EASEUS Partition Master - сейчас он занимается уменьшением NTFS.

5 мар. 2010 г.

Бесплатный профайлер для .NET

http://www.eqatec.com/

OpenSolaris 2009.06, день первый

На acer travelmate 5620 поставился без проблем, сам подцепил видео Nvidia, WiFi. Работает быстрее, чем внутри виртуальной машины, но на 2.5Гб памяти и двухъядерном процессоре можно было бы и побыстрее. Менеджер пакетов при закачке пакетов процесс показывает какими-то странными кусками то в 500Кб, то в несколько мегабайтов, поэтому непонятно - идет процесс закачки или нет. Попытка собрать pidgin из исходников закончилась тем, что нашел его уже установленным - в меню. Раскладка russian почему-то имеется ввиду машинописная (точка на shift+7), альтернативы в меню выбора раскладок нету.

4 мар. 2010 г.

2 мар. 2010 г.

Установка Opensolaris с USB флешки

После того как с помощью OpenSolaris Live USB Creator создать загрузочную флешку не получилось и с помощью OpenSolaris из виртуальной машины - тоже (при загрузке появлялась надпись "Bad PBR sig"). Нашел, что сначала нужно записать флешку два раза. Первый раз она записывается как-то быстро, потом е` нужно вынуть, снова вставить и записать образ снова, на этот раз он будет писаться в несколько раз дольше. Итоговая последовательность действий: 1. Записать образ с помощью OpenSolaris Live USB Creator на флешку. 2. Вынуть флешку и подождать 30-60 секунд, чтобы компьютер е` забыл 3. Снова записать на флешку тот же образ. Образы для записи можно взять на сайте genunix.org (нужно качать образ .usb).

Eclipse & Netbeans C Linux

Изначально попробовал работать в eclipse, т.к. уже привык, но оказалось, что eclipse либо не очевидно настраивается, либо не оч. хорошо работает: иногда долго стартует отладка, иногда отладчик просто вылетает + куча мелких косячков, создающих неприятный фон. Попробовал netbeans - почувствовал, что попал в цельную среду разработки, как уже давно привык в Visual Studio - устанавливается просто, работает сразу после установки так, как ожидается, без необходимости что-то донастраивать. Нашел один минус и один минусик: 1. Если отлаживаемая функция была вызвана из какой-то библиотечной, то по пошаговом выходе из нее Netbeans не дает ни сделать еще один шаг, ни запустить выполнение программы дальше, т.е. приходится перезапускать её целиком. 2. Некоторые окошки сливаются с фоном или размер поля меньше размера буквы. Вообще в Netbeans мне понравилась изначальная интеграция с Subversion - в Eclipse для этого надо поставить вручную несколько разных плагинов, наглядное приятное сравнение файлов, удобная локальная история (в Ecplipse тоже есть, но видимо неудобна, т.к. не пользуюсь).

GNU C работа со структурами данных

В Gnu GCC есть заголовочный файл search.h, в нем полезные функции для работы с данными: бинарный поиск по массиву bsearch бинарное дерево: tsearch, tfind, tdelete, twalk, tdestroy (для tdestroy перед заголовком нужно определить макрос __USE_GNU) Нужно быть внимательным - в часть функций передается указатель на кореть, в часть - указатель на указатель. Через этот же файл подключается работа с хеш-таблицей.

25 февр. 2010 г.

Средневековая тех-поддержка

Наша служба древняя и нужная... Прям так точно часть клиентов показана, уххх... :)

17 февр. 2010 г.

Смерть ноутбука

Сегодня утром по-дороге на остановку поскользнулся на "хорошо почищенной" дороге в "хорошо освещенном" дворе, упал на спину, удар на себя принял ноутбук. В результате у него немного разбилась матрица. После звонков в сервисные центры оказалось, что минимальный срок доставки матрицы 1.5-2 мес.

10 февр. 2010 г.

Проверка метода execute для API Vkontakte

Страница позволяет отправлять запросы execute с вашим кодом на сервер Vkontakte и тут же смотреть результат его обработки.

16 янв. 2010 г.

Сеть Мегафон 3G в Ярославле

Примерно с декабря местами в Ярославле стала обнаруживаится сеть 3Г, с тех пор регулярно пробовал пользоваться ей для входа в интернет, используя телефон, соединяясь с ним по Bluetooth.
Связь надо сказать была вообще скорее никакая. Задержки пакетов измерялись секундами, если по открытому соединению дданные долго (несколько минут) не передавались, то соединение просто замирало и его или приходилось прокачивать пингами, что получалось не всегда, или переподключаться.
После ввода в коммерческую эксплуатацию ситуация осталась такой же.
Для пробы взял у знакомых на пробу 3G мегафон-модем HUAWAI E220. Качество связи резко улучшилось - теперь в основном это около 200 КБит/сек, рано утром доходила до 1.3 МБита.
Сейчас еду в маршрутке №78, продолжаю тестировать модем.
Провел 3 замера скорости с некоторыми промежутками. Ехал из центра, потом по Угличскому шоссе, теперь переехал через Добрынинский мост и еду в сторону брагино.
1. У ТЮЗа, upload 278 KBit/s, download 40 kb/s
2. При движении по Угличскому шоссе в районе военного госпиталя: upload 339 Kbit/s, download 250 KBit/s
3. После добрынинского моста между районами: upload 341 Kbit/s, download 104 kbit/s
Кроме замера скорости все это время идут пинги ping ya.ru -t, вот статистика за 26 минут поездки:
Ping statistics for 213.180.204.8:
Packets: Sent = 1361, Received = 1324, Lost = 37 (2% loss),
Approximate round trip times in milli-seconds:
Minimum = 98ms, Maximum = 3644ms, Average = 221ms
Перед въездом в брагино модем переключился на режим EDGE, на Пионерской снова в 3G
Update:
Дело оказалось в телефоне. Чуть позже провел тест с двумя телефонами (Sony Ericsson C503, Nokia 6110 и вот этим модемом HUAWAI E220).
У модема лучшие результаты по скорости.
У Nokia - скорость чуть меньше, чем у модема, но не критично. Стабильность такая же, пинг такой же.
На Sony Erocsson C503 всё плохо. Думаю что и не только на C503, до этого пробовал связь на C902 - тоже было плохо.

7 янв. 2010 г.

Единая справочная РЖД

8 (800) 200 6767
Вроде как для звонков из всей России.
Диалог примерно такой:
- Здравствуйте, подскажите пожалуйста график работы вокзала в г. Тольятти.
- Здравствуйте, мы не знаем, у нас информация только по москве
- Вы можете подсказать их телефон?
- Нет.

3 янв. 2010 г.

XML и Java

Начал писать конвертер блогов, для начала из blogger в livejournal.
Сначала попробовал воспользоваться Java-библиотекой, которую написал Google. Может быть и удобно в каких-то неожиданных случаях, но для задач взять посты, взять такие-то посты и т.д. оказались проще обычные запросы и потом работа с XML.
Встроенного средства работы с XML нет, пришлось искать сторонние. Мне понравился NanoXML - легкий, простой в использовании.