|
January 1st, 2014
12:00 am - sticker Чтобы убрать неястности...
Я программист / орхетектор / аналитик / team lead, больше всего - программист. Занимаюсь я восновном приблудами для операторов мобильной связи. Ну, знаете? Биллинги там, провижининг, CRM'ы, платежи, sms сервисы и прочая дрянь. Интересно это тем, что у твоего продукта десятки миллионов гарантированных пользователей.
А ввиду того, что это не тематический блог, а ЖЖ, готовтесь встретить всякий мусор эмоционального происхождения, да и прочий мусор тоже.
Заметки о программировании фильтруются по dev
|
November 13th, 2009
04:59 pm - shared_ptr экономим байты Пока все пишут про функциональные ЯП, я, значится, обустраиваю свою С++ берлогу. Так вот, shared pointer'ы в некоторых случаях просто незаменимая вещь, но надо помнить про накладные расходы, а именно - аллокация на sizeof(pointer) для shared counter'a. Чтобы избежать этой аллкации можно хранить каунтер прямо в теле shared объекта и пользоваться boost::intrusive_ptr. Чтобы пользоваться интрузивным умным указателем, пишется обертка вида:
namespace boost {
void intrusive_ptr_add_ref(YourClass *c);
void intrusive_ptr_release(YourClass *c);
} | | _Winnie C++ Colorizer |
Только вот неудобно писать ее для каждого класса, поэтому я немного "очеловечил" использование intrusive_ptr. ( Собственно лисапед: )
Правка: На комментарий sleppy_drago Множественное наследование - не проблема, проблемы будут при размере дерева наследования больше 1-го - вызовется неправильный деструктор. SomeClass : public Base, public refcounted<SomeClass> (release вызовет SomeClass::~SomeClass) DerivedClass : public SomeClass (release опять-таки вызовет SomeClass::~SomeClass) Чтобы такого избежать можно конструктор refcounted сделать private и добавить _Successor в друзья. Current Music: Everlast - Stone In My Hand
|
November 12th, 2009
11:27 pm - Partly cloudy Просто отличный короткометражный мульт http://www.youtube.com/watch?v=O0JdaUiPmQU Current Mood: sleepy Current Music: Seether - Like Suicide
|
October 8th, 2009
04:56 pm - Пеарю Ртутная река Киева
А интересно, сколько еще такого "наследия" по территории бывшего СССР осталось? Что еще забавно - я даже не удивлен. Current Mood: blank
|
September 19th, 2009
10:45 pm - Оператор goto, мы его не используем Я не хочу начинать тему про обработку ошибок и про нюансы использования опреатора goto. Мне интересно другое - неприязнь к этому оператору заставляет использовать goto-подобные решения. И даже САМ Макконели в "Code Complete" приводит пример обработчика ошибок такого плана, как альтернативу goto:
do
{
if (FAIL == DoSomething())
break;
if (FAIL == DoSomethingElse())
break;
} while (false) | | _Winnie C++ Colorizer |
Мне понятны преимущества такого подхода перед goto - мы не можем прийти в контролирующую структуру хрен знает откуда, мы не можем уйти хрен знает куда. Но ведь мы говорим о коде, который легко читать. Мне дико видеть типичный код обработки ошибок, замаскированный под цикл. Я хочу видеть здесь именно goto Current Mood: awake Current Music: Incubus - Love Hurts
|
August 31st, 2009
03:09 pm - Линуксовое Вот лично для меня Linux станет primary desktop OS тогда, когда я буду делать "lsmod | grep snd" и переустанавливать ndiswrapper только после того как посмотрю стоит ли галочка "mute" в KMix Current Music: Everlast - Lonely Road
|
August 26th, 2009
04:46 pm - Мечта Мдя, у меня сильно лирическое настроение, оно требует выхода, а посему ( полкило сахара и столько же соплей ) Читать не рекоммендую - это надпись "$" на сарае, вот только лиричнее и не так глубокомысленно.
|
August 4th, 2009
04:32 pm - CVS / DCVS / etc * xxx с удивлением обнаружил, что корзина в виндовс является прекрасным средством для резервного копирования исходников активного проекта. там могут находиться файлы с одинаковым именем а также пишется дата помещения в корзину
via ibash.org.ru Current Mood: tired Current Music: Placebo - Where Is My Mind (Pixies cover)
|
July 27th, 2009
05:21 pm - Че-та я устал. А никто Exodus from the Earth 2 не продюссирует? Берусь реализовать быстро, качественно, недорого. Не гербалайф. Current Mood: tired Current Music: Massive Attack - Teardrop
|
July 26th, 2009
12:13 am - Советы и грабли Обидно, умные люди советуют умные вещи, но не объясняют почему нужно делать (не делать) именно так, в итоге я им не верю. В очередной раз наступаю на грабли самостоятельно, а дело вот в чем: самый простой способ выполнения чего-либо асинхронно это "вызвал метод, подписался на callback". Все хорошо, но ровно до тех пор пока порядок вызова и результат выполнения не влияют на логику программы. В противном случае вся программа превращается в стейт-машину неподъемной сложности. Current Mood: crappy Current Music: Theory Of A Deadman - Santa Monica
|
July 1st, 2009
03:55 pm - По мотивам башорг
#define _2PI PIPI
|
June 24th, 2009
10:01 pm - Мое отношение к OS
 Current Mood: cold Current Music: Blue October - Ugly Side
|
June 23rd, 2009
11:03 pm - Орхетектура Потихоньку делаю себе не движок, но что-то вроде game framework, ради фана. Хочется построить что-то гибкое, чтобы поверх можно легко было лепить. Ну и несколько целей, которые я себе ставил перед началом:
- модульность для упрощения написания / отладки, плюс возможность использовать уникальный набор модулей в каждом проЭкте (например не использовать сеть, или использовать навороченный AI), ну и
ради лулзов ради фана, конечно же
- поддержка многопоточности
- использование готовых middleware библитек (Ogre / ODE / fmod / etc.)
Собственно, получилась некая орхетектура, которую хотелось бы пообсуждать. ( Читать дальше )
Ссылки Component-oriented design на консолях, лобзиком по шаблонам A Flexible and Expandable Architecture For Computer Games Jeff Plummer's Masters Thesis A Data-Driven Game Object System by Scott Bilas (слайды) Паттерны revisited. Введение. На самом деле там aruslan зажигал не только и не столько про паттерны
|
10:08 pm - В Diablo3 не будет ни шлюх ни блэкджека Почему?
Да потому что выходцы из Blizzard так и норовят сделать свое Diablo, только с... ну вы поняли, короче. Новый проект называется Torchlight, ну и как водится, после сингла ребята из Runic Games (теперь они зовутся так) планируют выпустить MMO. Из интересного - в игре все dungeon'ы будут генерироваться движком, весь тулсет разработчики обещают отдать для растерзания игры моддерами.
Для рендера они использовали Огр, говорят - довольны, так что целесообразность использования ogre вроде бы подтверждается. Current Mood: busy Current Music: Stevie Ray Vaughan - The Sky Is Crying
|
June 20th, 2009
10:49 pm - Paderborn BBQ-Skatecontest 2009 Так получилось, что я сейчас ошиваюсь в Германии (Падерборн), а здесь как раз проходит фристайл скейтбоардинг контест - решил сходить. Честно говоря, ожидал увидеть уже успевший набить оскомину фристайл в парке - рампы / перила, но это оказалось намного круче - невозможно передать что оказывается можно делать с этой доской. Кстати, народ собрался совершенно разношерстный, были дети лет по 5, причем зажигали на уровне, были дядечки лет эдак под 40 - по тому что они вытворяли сразу становилось понятно чем они занимались последние 20 лет, проще говоря они на доске чувствуют себя увереннее, чем я на земле. Девушки были, да, но меньше. Камеры у меня с собой не было, так что вот видео с прошлогоднего контеста.
А вообще замечательно, что спорт среди молодежи всячески поощряют, тем более такой, который ей действительно интересен. Да, травмы были - ушибленные и поцарапанные коленки и локти. Current Mood: impressed Current Music: Everlast - Naked
|
June 18th, 2009
10:37 pm - Обратная сторона рептилии Есть некоторые вещи в Python, которые меня раздражают, а именно - переопределение переменных:
a = 0
def set_a(new_a):
a = new_a
set_a(5)
print(a)
И вот еще - отсутствие типизации в данном случае:
var = 0
print(Type(var))
var = "Hello, world"
print(Type(var))
Но на самом деле все это проще воспринимать с другой точки зрения - в Python нет оператора "присвоить значение", вместо него - создание переменной.
А еще я выяснил что внутрях питона список аргументов функции - это dict, еще бы интерпретатору не быть медленным при таких-то раскладах. Вот пруфкод:
def foo(s1, s2):
print (s1, s2)
args = {'s1' : 'Hello', 's2' : 'World'}
foo(**args)
Кстати, кто-нибудь знает что-нибудь про эти самые звездочки? В документации я ничего не нашел...
Подсветку синтаксиса питона я утащил отсюда Current Mood: sleepy Current Music: Rolling Stones - Wild Horses
|
June 17th, 2009
01:12 pm - untitled-01 Кто-нибудь знает рецепт?
 Current Mood: confused
|
May 29th, 2009
12:19 pm - sudo rm -f in a Windows way Наверное любого, кто пользовался *nix сильно раздражает сообщение Windows "Cannot delete file. Access denied". Выходы есть, конечно - Safe Mode, BootCD, но можно проще. Unlocker. Показывает процессы, использующие файл, может отобрать lock у процесса, или убить процесс. Что мне показалось чудом - утилита смогла убить процесс сервиса, работающего под LocalSystem. Current Music: Everlast - Angel
|
May 25th, 2009
04:08 pm - libKISS К сожалению подход KISS для библиотек не работает, потому что у библиотеки минимум 2 программиста - который разрабатывает библиотеку и который ее использует. Можно упростить разработку библиотеки, можно использование, а истина как всегда где-то рядом. Кстати, как раз про это писал ivansorokin
|
May 21st, 2009
08:50 pm - Insert? Append! - Мне абсолютно нечего сказать - Напиши об этом в блог
Как-то так получилось, что я принимаю участие в разработке уже третьей по-моему биллинговой системы и решил вот завести себе в журнале еще один тэг - oracle, собственно вот.
Иногда нужно лить в базу данные, много данных. В случае обычного INSERT INTO происходит много лишних телодвижений, а именно: заполнение свободных экстентов данными, генерация undo сегментов, генерация redo журналов, а еще возможно и flashback сегмента. Сюда же относится и перестройка индексов, выполнение триггеров и проверка констрейнтов (впрочем этого никак не избежать). Чтобы упростить процесс загрузки, Oracle предоставляет специальный режим вставки - append. При использовании этого режима данные добавляются не в свободные экстенты, а вконец таблицы, причем за high watermark (EOF для таблицы). Что происходит в этом случае? Информация в undo и redo не пишется - в случае ROLLBACK просто ничего не происходит, а записанные данные со временем перетрутся, в случае крэша инстанса до COMMIT'а тоже ничего страшного не произойдет. А сам commit в режиме append проходит практически моментально, oracle не нужно фиксировать транзакцию, только передвинуть high watermark за свежезалитые данные. Просто? - Да, но нюансы все-таки есть. Во-первых я не уверен смогут ли несколько сессий эффективно писать данные одновременно (говорят эту проблему решили в 10g), во вторых такой режим удобно использовать если данные из таблицы не удаляются, в противном случае дисковое пространство будет расходоваться неэффективно (Oracle не будет заполнять "дыры", а всегда писать вконец). Ну и самое главное - как использовать режим append. Можно просто добавить хинт в запрос INSERT /* +APPEND */ но в данном случае решение использовать этот режим, или нет принимает Oracle, гарантированно грузить в режиме append можно только с использованием OCI (Oracle Call Interface), это же API использует SQL*Loader Current Music: Stevie Ray Vaughan - Mary Had A Little Lamb
|
|
|
|