|
January 1st, 2014
12:00 am - Давайте знакомиться. Я программист / орхетектор / аналитик / team lead / системный интегратор / консультант, больше всего - программист.
Занимаюсь я восновном приблудами для операторов мобильной связи. Ну, знаете? Биллинги там, провижининг, CRM'ы, платежи, sms сервисы и прочая дрянь. Интересно это тем, что у твоего продукта десятки миллионов гарантированных пользователей.
Занимаюсь я SQL и no-SQL субэдешечками.
Чем-то занимаюсь ¯\(°_o)/¯
А ввиду того, что это не тематический блог, а ЖЖ - готовтесь встретить всякий мусор эмоционального происхождения, да и прочий мусор тоже.
Заметки о программировании фильтруются по dev
Google профайл
Linkedin профайл
В комментариях можно оставлять всякое (сейчас этим предложением активно пользуются спам-боты, но все же...).
|
March 10th, 2012
03:01 am - C++ lifehack Всякие compile time сообщения можно выводить в том же формате, в котором компилятор выдает предупреждения / ошибки, тогда они будут восприниматься IDE как сообщения компилятора и к нужной строчке можно будет перейти по клику. У меня для этих целей служит вот такой макрос:
#define __PP_STR1(X) #X #define _PP_STR(X) __PP_STR1(X) #if defined(_MSC_VER) // output in format that Visual Studio "cl" does # define PP_LOCATION __FILE__"("_PP_STR(__LINE__)"): " #else // assume gcc and output in the format it does # define PP_LOCATION __FILE__":"_PP_STR(__LINE__)": " #endif #define COMPILE_TIME_MSG(theMSG) PP_LOCATION theMSG
Пример использования:
..... #else # define forceinline inline # pragma message ( COMPILE_TIME_MSG("Warning: forceinline macro was not properly defined") ) #endif
* Отвлеченное бессознательное: если в аду есть специальное место для тех, кто увлекается преждевременной оптимизацией, как оно выглядит? *
Current Music: Herbie Hancock - Cantaloupe Island
|
March 9th, 2012
04:33 am - Trolling like a Guido "Explicit better then implicit" - говорит нам Гвидо, заставляя дописывать этот дурацкий self аргумент в каждый метод класса. А потом он добавляет декораторы функций...
 Питон на брейнбенче я сдал плохо - 3.84. Хотя результат и ожидаемый: ни одного крупного проекта на питоне у меня не было, граблей я встречал немного, кастомных метаклассов и прочей черной магии не практиковал. Знания одной лишь документации для теста явно мало, нужен солидный опыт. Current Mood: accomplished Current Music: God Is An Astronaut - Echoes
|
March 6th, 2012
03:42 pm - Халява брейнбенче до 9-го. Налетай!
 Current Music: Limp Bizkit - Shotgun
|
March 1st, 2012
11:07 pm - Балуюся с GarageBand Такое оно вот:
Прослушать или скачать aka.rider Groovy mood бесплатно на Простоплеер
Не знаю, музыка оно или нет, а минусовок для гитары я себе теперь наклепаю. Current Mood: creative
|
February 24th, 2012
07:43 am - Переключение раскладки в Windows по CapsLock Захотелось странного: переключать раскладку клавиатуры в Windows по CapsLock. Клавиша большая, красивая и расположена в удобном месте, а вот функция на нее навешена абсолютно бесполезная. Нативно windows этого не умеет, а маленькой программы, способной выполнять эту простую функцию я не нашел. Поэтому вот: CapsLock keyboard layout switch sources
После запуска программы переключение раскладки для активного окна будет работать по CapsLock. Если для каких-то целей эта демоническая кнопка все-таки понадобится в своей оригинальной ипостаси, то это Shift+CapsLock. А, ну и стандартная комбинация (Alt+Shift / Ctrl+Shift) естесственно никуда не девается.
Комбинация для переключения раскладок может быть вобще любой, возможно кто-нибудь захочет поиметь стандартную маковскую Alt+Space на Windows - это поменять одну строчку кода. Current Mood: cheerful Current Music: Placebo - The Bitter End
|
February 9th, 2012
10:29 pm - Многопоточное программирование для самых ленивых. Async call и концепт Future "Всякие IO bounded операции хорошо выполнять паралельно, но плохо синхронизировать" - сообщает нам кэп. Очевидный паттерн "вызвал чё-то там, подписался на callback" - самое ужасное, что только можно придумать, я уже как-то про это писал. Вот тут-то на сцену выходят микропотоки, coroutine, tasklet и черт в ступе - все это только для того, чтобы писать (и читать конечно же) многопоточный код сверху вниз, как будто поток всего один. Вся эта артиллерия действительно хороша, если к месту (и зачастую нужны специальные сорта травы, чтобы понять реализацию очередного micro-threading framework), но иногда хочется просто обычного асинхронного вызова в одну строчку. Для таких случаев существует один прекрасный концепт - future, я с ним впервые познакомился, разбирая код boost::coroutine. Future - это такой placeholder под результат асинхронной операции, вся его прелесть в простоте как реализации так и работы с ним.
Выглядит оно приблизительно так:
Copy Source | Copy HTML import sys, async def really_long_op(what, nonsense): import time time.sleep(3) print('Beyond: ', what, nonsense) return 42 def main(): print('One answer to the Ultimate Question of Life, the Universe, and Everything. Please') future = async.async(really_long_op, 'Be cool!', nonsense='Bzzz') if (not future.is_ready()): print('Not ready yet. Do other stuff') print(future.wait_result(timeout = None)) if __name__ == '__main__': sys.exit(main())
В простейшем случае future.wait_result можно делать блокируемым (я так и сделал), а если использовать совместно с микропотоками - в этом месте нужно переключить контекст.
Такой подход - просто возможность распаралелить какие-то операции нахаляву, не меняя архитектуры. Для труЪ многопоточности нужно запастись фреймворком посолиднее.
Все 47 строчек модуля async скачать бесплатно без регистрации
Good coding, everyone. Current Mood: busy Current Music: Day one - Bedroom dancing
|
December 9th, 2011
06:06 am - SQL Fail Когда я только начинал учить SQL, книжка мне рассказывала что это такой специальный язык на котором я должен изложить чего я хочу и не волноваться как именно это будет сделано. Но абстракции-то, сука, текут! И вот я занимаюсь тем, что прыгаю с бубном вокруг базы, пытаясь прибить гвоздями планы выполнения к запросам. Причем т.к. я не должен вобще-то беспокоится о такой мелочи, как способ выполнения запроса, то стандартных средств у меня просто нет. Конечно же есть хинты (только рекоммендации оптимизатору), есть аутлайны, есть заморозка статистики, но это все напоминает мне о корешках и припарках. Я не видел ни одной продакшн системы с СУБДшечкой, где бы нужен был оптимизатор, все запросы вылизаны и обкатаны заранее, наоборот трясешься после создания индекса как бы планы выполнения не поплыли. Вот и получается: бородатые математики пишут умный оптимизатор, специально обученные обезьянки навроде меня пытаются обойти этот оптимизатор, все за это получают деньги, все довольны, многим даже нравится. Я не то чтобы против SQL'я и реляционок, просто я бы хотел нормальный инстумент для своих ритуальных плясок, по типу:
SELECT USING INDEX(index_a) a.* FROM table_a a
LEFT INNER NESTED LOOPS JOIN table_b b ...
[...]
Да, и чтобы два раза не вставать: Никогда не пишите:
assert(size > 0 && is_valid_alignment(alignment)) пишите:
assert(size > 0); assert(is_valid_alignment(alignment)); Когда прийдет время Ч, не всегда будет понятно какое из условий профэйлилось, и повторить ситуацию тоже получается не всегда.
Good coding, everyone. Current Music: Children Of Bodom - Bed of Razors
|
December 1st, 2011
08:43 pm - Лингвистика и культурология Работая в международной компании, получаешь великолепную возможность узнать больше о культуре и обычаях разных стран. Причем о такой культуре и таких обычаях в книгах писать не принято :)
Вот какие ассоциации у вас вызывает: "Ja, ja. Dast ist Fantastish!"? Ну ты понел. Оказывается у китайцев есть точно такой же стеб на тему японского порно (там слово что-то вроде "яматО", что означает: "пожалуйста остановись", но подразумевается: "не останавливайся"), куча анекдотов на тему, в фильмах встречаются референсы и т.п.
Кстати, мне рассказывали, что Германия - вовсе не сердце порноиндустрии, как мы привыкли считать. Просто большинство порнухи, привезенной из Америки в Европу, было переозвучено(!) в Германии, а оттуда она уже попала на родимые просторы.
А еще я сегодня выучил 2 слова на китайском, в переводе - "спасибо" и "пошел нахуй". С произношением певого проблемы, а второе идеально (это постоянный источник лулзов на перекурах). В китайском очень важна интонация, а я не всегда могу ощутить разницу в своем произношении.
Такие дела. Current Music: Slipknot - Snuff
|
08:17 pm - CMakeLists from dir Сайт перфекционист.ру все еще находится на стадии разработки (с)
Решил разобраться с CMake (проект кросс-платформенный, надоело обновлять vcproj и makefile руками). Ну почитал документацию, посмотрел как сделана build система в Ogre - вроде бы ничего сложного, сел писать. Самая первая задача (кроме базовой конфигурации) - засунуть список исходников в target, руками конечно же делать лень, а shell'а под рукой не оказалось. Дай думаю пару строчек на питоне набросаю... Long story short:
Usage: cmakelists_from_dir.py [directory] [options]
directory path to directory for which file list will be generated
Options:
-h, --help show this help message and exit
-m *.*, --mask=*.* file mask
-v SOURCES, --variable=SOURCES
name of CMake variable containig all listed files
-o CMakeLists.txt, --output=CMakeLists.txt
redirect output to FILE (by default it will be print
to stdout)
-n, --no-recurse disable subdirectories recursion
-p PREFIX, --prefix=PREFIX
add PREFIX to each file
Человеку свойственно откладывать задачу, которая непонятна, а браться за простую. Ладно, выводы сделаны. Я надеюсь оно кому-нибудь еще пригодится
( CMakeLists_from_dir.py ) Current Mood: crappy Current Music: Portishead - Roads
|
November 17th, 2011
06:50 pm - Вопросы на собеседованиях Кратенько так расскажу про субъективное восприятие вопросов на собеседовании. Это я про техническое собеседование, конечно же. Когда меня спрашивают про структуры для хранения хренальйона данных со сложными связями, хитрые оптимизации разных сортировок для частных случаев, заставляют решать нетривиальные задачки и т.п., я выхожу с собеседования выжатым, но всегда довольным. И наоборот, когда мне показывают куски кода навроде:
Copy Source | Copy HTML
- class B {
- B() { printf("B::B"); throw "error"; }
- ~B() { printf("B::~B") }
- };
- class C { C() { printf("C::C") } };
- class A : virtual public B, virtual public C
- {
- A() {
- printf("A::A");
- throw std::runtime_error
- }
- };
- // ................................
- i = 42;
- ++i++ = ++i + i++
- printf("i = %d", i);
И просят расписать что попадет в output, я грущу, печалюсь, неправильно отвечаю на вопросы и т.п.
Почему так? Все просто. По вопросам же пытаются определить квалификацию кандидата, причем не какую-нибудь там абстрактную, а тот кусок, что будет востребован в реальной работе. Так вот в первом случае мне кажется что заниматься прийдется как минимум rocket science, это даже не принимая в расчет того, что собеседования такого плана - это такой персональный challenge. Второй случай я (подсознательно) интерпретирую так: "ну у нас этого говнокода тонны, меняешь местами классы в списке наследования - все падает. Код чуть менее чем полностью завязан на порядок инициалиции переменных и цепочке вызовов конструкторов, из которых может прилететь exception, на рефакторинг и юнит тестирование MBA бюджеты не выделяют, мы здесь стандарт наизусть знаем". А я под дулом пистолета не вспомню эту гребаную цепочку при виртуальном множественном наследовании, приоритеты операторов я тоже не помню /* у оператора () выше приоритет, чем у &, твою ж мать */ Я читал это тыщу раз, но как могу это запомнить, если я не пишу такого кода и главное - такого кода я видеть не хочу.
Еще раз подчеркну, что вышеизложенное - это всего лишь мое субъективное восприятие, понятно что оно, если кореллирует с реалиями, то слабо.
Выводов не будет. Хотя... Тщательно продумывайте вопросы на собеседование и помните что ненависть портит карму. Current Music: God Is An Astronaut - Fire Flies And Empty Skies
|
November 15th, 2011
09:22 pm - p2p mmorpg anyone? Я знаю что пост, с таким заголовком у меня в ЖЖ уже есть
Я тут подумал другое: Я вижу 3 основные проблемы, с которыми прийдется столкнуться при создании этого самого mmo: Во-первых теорема CAP, потом latency (маршрутизация в p2p все-таки медленная), ну проблема синхронизации игрового состояния станет в разы круче. Что там еще?
Можно все технически скользкие моменты заложить прямо в игровую механику. Конечно, про мужиков с мечами сделать игру не получится, но вот представим какой-нибудь космосим, или "Космических рейнджеров": . Разбиваем игровую вселенную на секторы - маршрутизация становится легче. . Передвижение кораблей медленное, выстрелы требуют например разогрева лазера, или торпеды там, которые долго летят на цель - высокое latency уже не так критично. . Вместо традиционного чата делаем войс чат (latency в текстовом чате критично), а все косяки VOIP'а скидываем на "помехи при передаче в космосе же", режем частоты. . Ну и в таком же духе можно еще придумать.
А! И главное: заплатите мне кто-нибудь бабла за R&D сабжа, у меня руки чешутся, как в молодости, ей-богу. Current Music: Bush - The Chemicals Between Us
|
October 11th, 2011
04:27 pm - Удаленная работа (продолжение) Я совсем забыл написать о преимуществах удаленной работы. Потом я думал что же написать такого, что не совсем уж очевидно. Вот оно: ищу удаленную работу С++ программистом
мое резюме
Можно предлагать работу в комментариях, или слать письма на мыло, указанное в резюме Current Music: Flaw - Decide
|
October 7th, 2011
03:32 pm - Удаленная работа, работа - мечта. Поделюсь своим опытом об удаленной работе, постараюсь изложить максимум полезной и конструктивной информации. Понятно, что многие сказанные вещи базируются на субъективном мнении и восприятии, а вопросы, касающиеся законодательства привязаны к Украине (для России это +/- тоже самое), но думаю информация будет полезна всем, кто работает, или подумывает работать удаленно. ( Итак, вы решили работать удаленно. )
Пользуясь случаем, смею заметить, что Amy Winehouse великолепна Amy Winehouse — He Can Only Hold Her Current Mood: awake Current Music: Amy Winehouse — He Can Only Hold Her
|
July 7th, 2011
03:45 am - p2p mmorpg anyone? Я сейчас усиленно изучаю всякие p2p протоколы, и мне тут подумалось, что в mmorpg можно сделать если не полностью p2p, то сильно разгрузить сервер, используя принцип Bitcoin. Например солвер физики на клиенте расчитывает новую позицию видимых игроков и broadcast'ит результат в сеть, сеть принимает только тот результат, что подтвержден максимальным количеством клиентов, остальные отбрасывает. При апаратной поддержке физ. движка, большой нагрузки на железо не случится. Тоже самое можно для pathfinding'а реализовать.
|
|
|
|