Pull to refresh
128
Михаил Седов @sedovmikread⁠-⁠only

User

Send message

Google Annotations Gallery

Reading time4 min
Views1.7K
The Google Annotations Gallery — новая open-source библиотека, которая предоставляет широкие возможности программистам для самовыражения. Вы не находите, что стандартные Java аннотации суховаты и безжизненны? Вам не хотелось поставить аннотацию LOL или Facepalm (?) Тогда, эта галерея для вас.

Исходный код: code.google.com/p/gag

Описание аннотаций


@AnimalsHarmedDuringTheMaking

Аннотация @AnimalsHarmedDuringTheMaking позволяет раскрыть факты о жестоком обращении с животными.
Copy Source | Copy HTML
  1. @AnimalsHarmedDuringTheMaking(
  2.     number = 1,
  3.     animal = "хомяк",
  4.     disclosure = "не кормил Fermie 2 дня чтобы закончить вовремя")
  5. public class ConstantTimePrimalityTest {

Читать дальше →
Total votes 76: ↑70 and ↓6+64
Comments6

Как FriendFeed использует MySQL для хранения данных без схемы

Reading time7 min
Views3.2K

Условия


Мы используем MySQL для хранения любых данных FriendFeed. Наша база данных растёт вместе с числом пользователей. Сейчас у нас более 250 миллионов записей, это записи пользователей (post'ы), комментарии, оценки («likes»)

По мере того как росла база данных, мы время от времени имели дело с проблемами масштабируемости. Мы решали проблемы стандартными путями: slave-сервера, используемые только для чтения, memcache для увеличения пропускной способности чтения и секционирование для увеличения пропускной способности записи. Однако, по мере роста, использованные методы масштабируемости привели к затруднению добавлению новой функциональности.

В частности, изменение схемы базы данных или добавление индексов к существующим 10-20 миллионов записей приводили к полной блокировке сервера на несколько часов. Удаление старых индексов требовало времени, а не удаление ударяло по производительности, так как база данных продолжала использовать их на каждом INSERT. Существуют сложные процедуры с помощью которых можно обойти эти проблемы (например создание нового индекса на slave-сервере, и последующий обмен местами master'a и slave), однако эти процедуры настолько тяжелые и опасные, что они окончательно лишили нас желания добавлять что-то новое, требующее изменение схемы или индекса. А так как наши базы сильно распределены, реляционные вещи MySQL как например JOIN никогда не работали для нас. Тогда мы решили поискать решение проблем, лежащее вне реляционных баз данных.

Существует множество проектов, призванных решить проблему хранения данных с гибкой схемой и построением индексов на лету (например CouchDB). Однако, по-видимому ни один из них не используется крупными сайтами. В тестах о которых мы читали и прогоняли сами, ни один из проектов не показал себя стабильным, достаточно зрелым для наших целей (см. this somewhat outdated article on CouchDB, например). А все это время MySQL работал. Он не портил данные. Репликация работала. Мы уже в достаточной мере понимали все его узкие места. Нам нравился MySQL именно как хранилище, вне реляционных шаблонов.

Все взвесив, мы решили создать систему хранения данных без схемы поверх MySQL, вместо использования полностью нового решения. В этой статье я попытаюсь описать основные детали системы. Так же нам любопытно как другие сайты решили эти проблемы. Ну и мы думаем, что наша работа будет полезна другим разработчикам.
Читать дальше →
Total votes 116: ↑110 and ↓6+104
Comments60

GameNES.net — онлайн эмулятор игр для Денди

Reading time1 min
Views2.3K
Так уж сложилось, что первые школьные годы я и еще несколько миллионов моих сверстников провели с джойстиками в руках. Это было до того, как джойстики почти полностью были вытеснены клавиатурами и мышами.

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



Чтобы сегодня освежить впечатления детства, не обязательно доставать с антресолей старые Денди и искать подходящие отверстия в плазменной панели.

100 самых популярных игр для Денди работает на сайте gamenes.net в режиме эмуляции.

Все бесплатно, и играть можно прямо на сайте. Единственное, что нужно установить — это плагин SilverLight для браузера. Если вы не найдете свою любимую игру, разработчики эмулятора найдут ее и добавят.

Читать дальше →
Total votes 109: ↑86 and ↓23+63
Comments109

Глоток МоКито

Reading time3 min
Views102K
А Вы знаете что такое mock-объект? Нет?

Что же говорит по этому поводу википедия: «В объектно-ориентированном программировании mock-объект имитирует поведение реального объекта заданным образом… ». Казалось бы зачем? Википедия продолжает: «Во время unit-тестирования mock-объекты могут симулировать поведение бизнес-объектов и бизнес-логику, что иногда необходимо из-за сложности реального поведения»

И что же дают mock-библиотеки java-разработчику?
Total votes 37: ↑32 and ↓5+27
Comments10

Если бы я проектировал телефон

Reading time2 min
Views623
Современным интерфейсам в телефоне, при всех наворотах, не хватает цельности. Если бы я делал телефон, я бы взял листок бумаги и нарисовал табличку. По горизонтали и по вертикали вся функциональность, пункт за пунктом. На пересечении – то, как эти два пункта интегрируются. Например:
  1. Календарь + Контакт в адресной книге = Напоминалка о Дне Рождения
  2. Фото + Контакт в адресной книге = Отметить человека на фотографии
  3. Календарь + Фото = Разместить фотографии, сгруппировав по дате
  4. Фото + GPS = Место, где была сделана фотография
  5. GPS + Контакт в адресной книге = поставить адрес контакта, адрес его работы и тп
  6. SMS + Контакт = Расположить СМС в виде чата
  7. GPS + Журнал вызовов = Показать откуда делался вызов, (сомнительно, но для алиби может пригодиться)
  8. Заметки + Контакт = мобильная CRM, оставлять любые заметки о человеке, от пожелания на ДР заканчивая тем, что должен 100 баксов (в любом количестве и сохраняя прошлые)
  9. Контакт + Напоминалки = напоминание позвонить, позвонить и назначить встречу, приехать к контакту домой, отправить смс. Или же показывать напоминание при входящем, при входящей смс от контакта
  10. Напоминалки + GPS = напоминать что надо сделать, когда телефон будет в заданном месте
  11. Интернет + Контакт = агрегация типа friendfeed, rss с домашней странички
  12. Интернет + Музыка = last.fm
  13. Bluetooth + Контакт = Ассоциировать контакт и bluetooth адрес, хранить историю передач, ( а ещё лучше единым чатом с смс, логированием звонков, передач, rss, др.)
  14. SMS + GPS = Отправить смс по прибытии в заданный район. «Сына, отправь смс как доберешься»

И так далее. Это на столько очевидно, что кем-нить реализовано или к тому идёт. Осталось найти (дождаться) этот телефон и купить.

Для наглядности — таблица этих исходных пунктов на docs.google.com

А так же другая таблица, открытая для совместного редактирования. И ссылка на результат совместного творчества хабрасообщества. Только прошу — не устраивайте детсад с чатиком и выманиванием инвайтов.
Total votes 136: ↑112 and ↓24+88
Comments133

Разбор выражений, bytecode-way

Reading time3 min
Views3.7K
Приходилось ли вам разбирать выражение? Рисовать график функции по введенной с клавиатуры пользователем строке?

Согласитесь, занятие приносит больше головной боли, чем радости от результата. Возможно вы знакомы с библиотеками antlr или javacc, тогда вы отделаетесь малой кровью. Но приобретете хвост из некрасивых сгенерированных классов, который как можно быстрее скроете от посторонних глаз в самом дальнем пакете.

Написав вчера о cglib, я заметил в документации главу о модификации байт-кода. И само собой напрашивается вопрос, а можно ли в runtime заставить класс выполнять, то что очень хочется, а не то что хочет класс?
я хочу знать как!
Total votes 18: ↑17 and ↓1+16
Comments21

Делаем reflection быстрой как прямые вызовы

Reading time12 min
Views50K
Большинство программистов знают о reflection, которая (она — рефлексия) упрощает добавление динамических возможностей в статические языки, такие как Java/C#. Однако reflection упрекают в том, что вызовы работают очень медленно — до 500 раз медленнее. Все же это можно c легкостью исправить — покажем в этой статье как сделать reflection-вызов таким же быстрым, как и прямой (direct) вызов.
Читать дальше →
Total votes 58: ↑54 and ↓4+50
Comments15

Самые глупые вещи, которые я сделал будучи программистом

Reading time2 min
Views8.5K
Оригинальное название статьи: «The * stupidest things I’ve done in my programming job», поэтому перевод названия статьи не очень точен, однако то, что автор имел ввиду под "*" мы опустим — мы ведь не знаем наверняка :)

Я больше не стыжусь своих грешков, так что — вперед:

1. ORM


Глупость

Создал собственную ORM (Object Relational Mapping) библиотеку

Следствие

Неразбериха в проекте после двух лет поддержки, в следствие хаков-обходов моей ORM библиотеки для запуска прямых SQL запросов

Что я должен был сделать

Использовать Hibernate, iBATIS, Cayenne или нечто подобное.

Читать дальше →
Total votes 138: ↑115 and ↓23+92
Comments61

Другие возможности Java

Reading time4 min
Views6.8K
Я продолжаю переводить источник первой статьи. Всё больше очевидных вещей, не смотря на это я все же решил, что повторение — не такое плохое занятие.

И коли источник исчерпыет себя — призыв к хабра-java-сообществу: «Don’t be jealous!», дополните этот список в комментариях, поделитесь опытом. А пока — продолжение предыдущей статьи, после монтажа, дубляжа и разбавления собственным опытом:

JDK tools


Почти все в курсе, что в поставку JDK входит внушительное число tools’ов. Однако в повседневной работе, думаю, многие кроме как java, javac, jar не используют. Что же ещё можно взять из папки bin:
Читать дальше →
Total votes 56: ↑49 and ↓7+42
Comments25

Нетривиальные возможности Java

Reading time4 min
Views16K
Java — язык простой. И после года активного использования для Вас не остаётся секретов. Совершенно случайно я обнаружил, что на stackoverfow люди решили поделиться скрытыми возможностями (Hidden Features of Java). Вышло очень занимательно, получился своеобразный рейтинг нетривиальных возможностей, который я далее запротоколирую в вольном переводе на русский.

double brace


С большим отрывом лидирует «double brace», уже обсуждавшийся ранее в статье Эффект «double brace» by zeroed. Подробное описание метода — 
http://www.c2.com/cgi/wiki?DoubleBraceInitialization
несомненно это самое забавное и неочевидное из списка. Однако как уже отмечалось, метод имеет свои минусы в виде анонимного класса на каждое использование этого метода. А также невозможности использования метода equals () для подобных объектов.

далее еще 10 пунктов!
Total votes 54: ↑44 and ↓10+34
Comments50

GTD + Adobe AIR = Doomi

Reading time1 min
Views633
Продолжая тему модных слов…

Чтобы не отвлекаться, я для себя постоянно составляю список дел и держу его перед глазами (вот такая особенность характера, иначе google-reader, lenta.ru, и прощай сроки) Раньше с этой задачей справлялся листок А4 перед клавиатурой. Теперь когда слово GTD — «Getting Things Done», «Как привести дела в порядок» — стало очень модно (GTD можно не раз встретить на Хабре) появилось множество реализаций, дабы не марать бумагу. Огромное множество сегодня перечислил Mashable, на любой вкус — веб, mobile, mac, windows.

Ткнув пальцем в небо, я выбрал очень даже красивую и удобную реализацию: Doomi на Adobe AIR

dommi-1.PNG - Picamatic - upload your images
Читать дальше →
Total votes 9: ↑7 and ↓2+5
Comments11

POST из java

Reading time2 min
Views1.9K
Сегодня поделюсь вот таким опытом. Услышав модное слово REST, решили тут же применить этот тренд в проекте. В проекте необходимо было хранить картинки для соответствующих ресурсов. И было выбрано такое соглашение:
  • GET http://localhost/res/image/1001
    — позволяет скачать картинку (файл jpg) для ресурса за номером тысяча один
  • POST http://localhost/res/image/1001
    — принять и сохранить (заменить, если была) картинку
  • DELETE http://localhost/res/image/1001
    — соответственно удалить

Модель, кстати, себя оправдала. Пользуемся по сей день. А вот в процессе разработки возник вопрос как же это чудо попробовать, протестировать. Тем более реализация этой функциональности на клиенте (Flex, btw) ещё не была готова.

Читать дальше →
Total votes 3: ↑3 and ↓0+3
Comments10

Hibernate и битовые операции

Reading time2 min
Views1.1K
Как оказалось Hibernate не приемлит битовых операций в условиях hql запроса. Например, «from Events where type & mask <> 0» генерирует исключение парсера, так же битовых операций нет в документации. Однако не стоит отчаиваться.

Читать дальше →
Total votes 7: ↑4 and ↓3+1
Comments2

java.io.Serializable и наследование

Reading time2 min
Views25K
Что такое сериализация можно почитать в отличной статье Евгения Матюшкина.

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

Читать дальше →
Total votes 7: ↑6 and ↓1+5
Comments6

Information

Rating
Does not participate
Location
Нижний Новгород, Нижегородская обл., Россия
Date of birth
Registered
Activity