понедельник, 31 мая 2010 г.
Прошёл сегодня первый тест по C++ на сайте www.odesk.com
Passing Score: 2.50 Your Score: 2.75 Grade: Pass
Results by Topic
Topic Correct Answers(%)
1. Classes 57%
2. Constructors and Destructors 86%
3. Exceptions and Exception Handling 0%
4. Functions and Virtual Functions 75%
5. Inheritance and Object Oriented Concepts 67%
6. Miscellaneous 0%
7. Operator Overloading 75%
8. Pointers and File Handling 0%
9. Standard Template Library, Directives and Macros 50%
10. Syntax and Language Fundamentals 40%
Congratulations!!
By passing this test, you have joined the elite league of individuals who have demonstrated a high level of proficiency in their chosen area.
среда, 26 мая 2010 г.
Разработка для iPhone на PHP и XML
В сообществе фанатов Apple решили, что iPad нуждается в улучшениях
Материал взят из http://hitech.newsru.com/article/24may2010/ipadvsapplefans
В сообществе фанатов продукции Apple полагают, что весь потенциал планшетного компьютера iPad может быть раскрыт только с обновлением операционной системы iPhone OS, сообщает СОТОВИК.ру.
Многим пользователям, например, не хватает поддержки многозадачности наряду с улучшением управляемости.
Основной же проблемой называют слабость базы iPad-приложений: далеко не все готовы удовольствоваться двукратно масштабируемыми на 9,7-дюймовом экране приложениями для iPhone - ну разве что те, у кого зрение не столь остро.
Кроме того, тмечаются неполадки с Bluetooth: подключить беспроводные наушники и клавиатуру можно, однако такая связь зачастую рвется очень быстро. Есть и проблемы с обнаружением устройств, которые якобы все время невидимы для Bluetooth-сети.
Жесткая привязка к iTunes для загрузки приложений и цифрового контента несколько напрягает, хотя всегда есть альтернативные варианты "джейлбрейка", как называют взлом защиты в устройствах Apple.
Планшетник iPad, очевидно, позиционируется Apple как инструмент для потребления контента, а не его создания. Это нашло отражение в приложениях офисного пакета iWork, в котором возможности по вводу данных и их форматирования оказались изрядно урезаны.
воскресенье, 23 мая 2010 г.
Finger Piano Share: 10 пианистов в одном iPhone
Компания Yamaha совместно с двумя партнерами выпустит приложение для iPhone, которое позволит одновременно 10 пользователям играть на виртуальном пианино. Finger Piano Share, именно так называется этот продукт, разрабатывался под руководством японской компании Densan System. После запуска приложения на экране появятся виртуальные клавиши пианино, а размещенные подсказки будут направлять пользователей в игре на музыкальном инструменте.
Программа может быть подключена к MIDI-клавиатуре Yamaha через Интернет, то есть с помощью iPhone можно удаленно управлять MIDI-синтезатором. Работать с приложением могут одновременно до 10 человек, подчеркнул Ацуко Ито (Atsuko Ito), руководитель центра развития звуковых технологий в Yamaha (Yamaha Center for Advanced Sound Technologies).
Кроме того, Finger Piano Share совместимо с приложением Sekai Camera, разработанным токийской фирмой Tonchidot. Оно определяет местоположение устройства с помощью модуля GPS и предоставляет пользователю информацию, связанную с этой географической точкой во время просмотра через камеру.
пятница, 21 мая 2010 г.
Аналог Sleep (Win32) функции в Mac OS (iPhone OS)
Названия функций я поменял, чтобы уменьшить вероятность конфликта имён.
Спасибо разработчикам QT.
#ifndef QTSLEEP_H
#define QTSLEEP_H
#include <pthread.h>
#include <sys/time.h>
static void qt_thread_sleep(struct timespec *ti)
{
pthread_mutex_t mtx;
pthread_cond_t cnd;
pthread_mutex_init(&mtx, 0);
pthread_cond_init(&cnd, 0);
pthread_mutex_lock(&mtx);
(void) pthread_cond_timedwait(&cnd, &mtx, ti);
pthread_mutex_unlock(&mtx);
pthread_cond_destroy(&cnd);
pthread_mutex_destroy(&mtx);
}
void qt_sleep(unsigned long secs)
{
struct timeval tv;
gettimeofday(&tv, 0);
struct timespec ti;
ti.tv_sec = tv.tv_sec + secs;
ti.tv_nsec = (tv.tv_usec * 1000);
qt_thread_sleep(&ti);
}
void qt_msleep(unsigned long msecs)
{
struct timeval tv;
gettimeofday(&tv, 0);
struct timespec ti;
ti.tv_nsec = (tv.tv_usec + (msecs % 1000) * 1000) * 1000;
ti.tv_sec = tv.tv_sec + (msecs / 1000) + (ti.tv_nsec / 1000000000);
ti.tv_nsec %= 1000000000;
qt_thread_sleep(&ti);
}
void qt_usleep(unsigned long usecs)
{
struct timeval tv;
gettimeofday(&tv, 0);
struct timespec ti;
ti.tv_nsec = (tv.tv_usec + (usecs % 1000000)) * 1000;
ti.tv_sec = tv.tv_sec + (usecs / 1000000) + (ti.tv_nsec / 1000000000);
ti.tv_nsec %= 1000000000;
qt_thread_sleep(&ti);
}
#endif
четверг, 20 мая 2010 г.
Дешевые издания приближают конец книги
Интервью с издателем и известным специалистом по маркетингу Игорем Манном
Кризис привел к обрушению многих крупных компаний. Как оказалось, наличие средств и даже так называемого «административного ресурса» совсем не гарантирует бизнесу безоблачного будущего. О том, что должен делать отдел маркетинга, чтобы этого не случилось, и почему это ему порой не удается, НГС.БИЗНЕС поговорил с известным специалистом по маркетингу Игорем Манном.
Справка: Игорь Манн — совладелец издательства «Манн, Иванов и Фербер», специализирующегося на бизнес-литературе. Работал руководителем маркетинговых подразделений российских филиалов компаний Konica Corporation, Alcatel-Lucent, Арктел, «МИАН» (ныне Kopernik Group).
Первый вопрос к вам как к издателю. Как долго, по-вашему, проживут привычные бумажные книги?
Думаю, книга умрет тогда, когда школьники перестанут на уроках пользоваться учебниками и тетрадками, а перейдут на ноутбуки, планшетные компьютеры или что-то в этом роде. Но трудно спорить — перспективы этого рынка под угрозой. Даже лицензионная электронная версия книги уже сегодня обойдется дешевле печатной как минимум в 5–7 раз. Устройства для чтения тоже дешевеют. Так что уже скоро покупка «одноразовых» книжек, которые используются, чтобы убить время, потеряет смысл. Но это не значит, что исчезнет книга как таковая — она может перейти в разряд предмета интерьера, дорогой игрушки, как сигара, дорогие часы и т.д. Дорогие издания смогут находить спрос еще довольно долго. Мы к этому готовимся и уже сейчас пытаемся сделать книгу чем-то большим, чем просто источник информации. Это касается и общего дизайна, и каких-то фишек в оформлении.
У издателей, конечно, есть иллюзия, что они могут несколько оттянуть кончину книжного рынка, если будут делать книги максимально дешевыми. Но на самом деле такой подход эту кончину только приближает, потому что все больше и больше покупателей не будут отказываться от приобретения плохо изданных «одноразовых» книг именно потому, что простой текст им будет удобнее загружать на свои «таблетки», «смартфоны» и «ридеры».
Слову «маркетинг» в русском языке уже больше 20 лет…
Если быть точным, то где-то 40. В 1971 году появилась первая книга со словом «маркетинг» на обложке.
Тем более. Однако до сих пор этим словом называют в разных компаниях очень разные вещи. Что же все такие это такое? У вас есть для него четкое определение?
У меня нет. Может быть, 10 лет назад я и смог бы привести вам какую-то умную цитату известного ученого, но сейчас сказать просто, что такое маркетинг, я уже не смогу. Есть универсальное определение, подходящее для большинства российских компаний, — это приобретение и удержание клиентов.
Вообще же маркетинг очень сложная вещь — есть разные подходы к пониманию этой сферы знаний. Это и наука, и поддержка продаж, и философия бизнеса. Вообще же определений уже насчитывается порядка трех тысяч.
Кто лучший маркетолог — сам бизнесмен или нанятый специалист?
Это зависит от того, о чем мы говорим. Если речь идет о тактике, то лучше с этим справляется специально нанятый профессионал, имеющий соответствующее образование. А вот что касается стратегии, то в ней в 99 % случаев лучше всего разбирается именно владелец бизнеса. Можно отдать на сторону (на аутсорсинг, как сейчас модно говорить) многие функции, но стратегический маркетинг должен оставаться в руках хозяина бизнеса.
Есть очень хорошие слова основателя компании Hewlett Packard о том, что маркетинг слишком важная вещь, чтобы поручать его отделу маркетинга.
Полезно ли для дела, если владелец бизнеса публичная фигура, или это просто следствие тщеславия и бизнес тут не причем?
На мой взгляд, это хорошо. Если владелец или топ-менеджер лично активно участвует в продвижении продуктов или услуг своей компании, это дает ей массу преимуществ. Во-первых, это конкурентное преимущество, которое нельзя перебить, просто потратив больше денег на рекламу или продвижение. Потому что в этом случае вы имеете дело с личной харизмой, а ее может победить только более мощная харизма.
Второе, товар, за которым потребитель видит конкретное лицо живого человека, вызывает больше доверия. Недаром такие «лица» периодически пытаются просто придумывать, вводя в ролики несуществующих кондитеров, шеф-поваров, экспертов и т.д.
Если вы знаете первое лицо бизнеса, вы понимаете к кому нужно обращаться, если у вас возникнут с этим бизнесом какие-то проблемы. У Олега Тинькова, например, есть блог, в который вы всегда можете написать о каких-то претензиях к его банку «Тинькофф Кредитные Системы». Это совершенно иной уровень взаимодействия.
Но почему одни предприниматели не слезают со страниц газет, а из других слова не вытянешь?
Это зависит от психотипа конкретного человека. Некоторым просто трудно выступать на публике в принципе. Для того чтобы делать это успешно, нужна харизма. Ее можно или воспитать, или смириться с ее отсутствием и компенсировать это какими-то другими достоинствами. Но если кто-то раздумывает, стоит мне светиться или не стоит, то мой ответ однозначен — стоит. Тем более что есть примеры, когда люди, изначально бывшие непубличными, были вынуждены в какой-то момент выйти на свет и теперь даже получают от этого удовольствие. Но, как в любом деле, тут не стоит перегибать палку.
Ещё одно мнение об уровне квалификации программистов
Информация взята из http://anton.shevchuk.name/project-management/developers-rank/
Junior Developer
- оптимист, всегда недооценивает поставленную задачу
- постоянно ощущает нехватку времени
- стесняется показать свое незнание
- постоянно наступает на грабли
- с трудом доводит проект до финальной точки
- тестер – враг – ибо находит баги
- менеджер – не воспринимается еще всерьез
- пока не ориентируется по ЗП, но если ему предложат на $50 больше в другом месте – может уйти
- рутинную работу считает сложной, но должен справляться
Developer
- пессимист, зачастую недооценивает свои силы и боится промахнуться в оценке
- всегда есть время на перекур и чашечку кофе
- не стесняется спрашивать у коллег по цеху, может даже нагло их эксплуатировать
- наступает только на грабли спрятанные в высокой траве
- скрипя зубами доводит проект до ума
- тестер – просто задолбал, хотя есть понимание, что сам налажал
- менеджер – зачем ему мои отчеты?
- уже знает свою рыночную стоимость, повышение ЗП не требует, но узнает о вакансиях на других фирмах, и иногда намекает о своей осведомленности
- если выполняемые таски и проект покажется не интересным, это негативно скажется на проекте – обычно сопровождается криками проект Г.., заказчик М…, и что Вы вообще понимаете в программировании
Senior Developer
- реалист, опираясь на свой опыт, видит "узкие" места проекта и закладывается на риски, а так же сообщает об этом менеджерам
- успевает и делать проект, и посидеть на "митингах", и еще и подсказывать коллегам
- может помочь ближнему, не стесняется сказать, что он чего-то не знает
- если и наступает на грабли – то тут два варианта:
- "грабли" – легли в риски, и все проходит безболезненно
- "грабли" – наносят критический урон по проекту, ибо Senior допустил ошибки при разработки архитектуры (иль еще где, но не менее фатально)
- удачно завершенный проект – доставляет истинное удовольствие (и психологическое и материальное)
- тестер – советник в плане юзабилити
- менеджер – щит, который тоже не любит неадекватного заказчика
- хорошо знает себе цену, не стесняется требовать повышения ЗП
- прекрасно понимают, что работа может быть рутинной, но это не должно влиять на качество кода, может ворчать, но работу будет делать
Если Вы располагаете достаточным количеством ресурсов, и при этом в наличии как Junior’ы так и Senior’ы – то судьба проекта может сильно зависеть от состава команды, так что будьте внимательны:
- не стоит ставить Junior’а к зубрам программирования, если среди них нет человека способного заняться его обучением: и новичок ничему не научиться, и “зубры” будут в бешенстве
- если проект разрабатывается лишь Junior’ами – держите руку на пульсе такого проекта и купите валерьянку – себе и заказчику ;)
- не стоит садить Senior’а за проект уровня “для чайников” – проект будет сделан и сдан, вот только разработчик от скуки начнет думать о работе в другом месте
Ну и еще немного информации к размышлению:
Ошибки которые совершают разработчики, когда начинают задумываться о повышении ЗП:
- Переоценивают себя – требовать ЗП не соответствующую Вашему уровню – это верный путь остаться без работы
- Устраивать сыр-бор за 10% прибавку к ЗП – зачастую такое повышение можно решить без лишнего шума и криков
- Узнать, что через дорогу платят на 100$ больше, впасть в депрессию на пару недель, и оказаться на улице, ибо повышать ЗП человеку который последнее время ничего не делает никто не будет – это очень распространенная ошибка, никогда не забивайте на работу, будьте профессионалами.
- Считать, что в соседней конторе работа в 100 раз интересней.
среда, 19 мая 2010 г.
Сравнение строк вне зависимости от регистра символов
bool InsensitiveCompareStrings
(const char* left, const char* right)
{
NSString *leftTitle =
[NSString stringWithUTF8String:left];
NSString *rightTitle =
[NSString stringWithUTF8String:right];
return (NSOrderedAscending == [leftTitle
localizedCaseInsensitiveCompare:rightTitle]);
}
Функция хороша тем, что класс NSString в отличие от std::toupper позволяет отсортировать в правильном порядке даже символы русского алфавита (то есть маленькая русская а будет стоять раньше большой Я).
вторник, 18 мая 2010 г.
Загадочные многоточия в ячейках TableView (UITableViewCell)
Оказалось, что в TableView-контроллерном классе нужно обратить внимание на одну важную функцию:
(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// бла-бла-бла...
if (cell == nil)
cell = [[[MyCustomTableCell alloc]
initWithStyle:UITableViewCellStyleDefault // или другой стиль
reuseIdentifier:nil] // ВОТ ТУТ ПОСТАВЬТЕ nil вместо CellIdentifier (NSString* строки)
autorelease];
// бла-бла-бла...
}
Оказывается, если вы поставите nil вместо строки, вы тем самым ЗАПРЕТИТЕ ПОВТОРНОЕ ИСПОЛЬЗОВАНИЕ ЯЧЕЕК ОДНОГО И ТОГО ЖЕ РАЗМЕРА, что будет вам гарантировать создание каждой индивидуальной ячейки с её индивидуальными размерами. Теперь весь текст будет исправно влезать (если вы конечно не ошиблись с вычислением размеров под текст).
Кстати, вы можете вообще вместо initWithStyle в вашем классе ячейки добавить множество других функций для более удобной инициализации ячейки, например initWithStyleAndMyParameters - никто не запрещает вам кроме важных стандартных параметров в процессе создания ячейки передать ещё несколько нужных вам параметров (например указатель или даже C++ ссылку на текст). В конце концов, вы можете просто переделать initWithStyle функцию под свои нужды.
пятница, 14 мая 2010 г.
Перенос C++ шаблонов из Visual C++ в Xcode-проекты (для GCC-компилятора)
В данном случае речь идёт о членах-данных шаблонных классов. Согласно стандарту языка, в телах членов-функций (методов) шаблонных классов перед именем члена нужно обязательно писать this-> (при этом это требование не является обязательным, если вы пишите C++ код в Visual Studio). GCC компилятор же упорно не замечает такие члены в телах функций шаблонных классов до тех пор, пока вы не напишите this-> (после этого всё успешно компилируется).
среда, 12 мая 2010 г.
Утечки памяти в дополнительных потоках (в связи с Obj-C объектами) в iPhone-приложениях
Но в ряде случаев (особенно при работе с GUI) самый простой или даже единственный способ получить желаемый результат - использовать Objective C классы (особенно классы из Cocoa Touch). Например, когда нужен вывод изображения на весь экран или рисование иконок в ячейках TableView.
Если рисовать что-либо в дополнительном потоке, то нередко происходят утечки памяти, которые не происходят с тем же кодом, который рисует в основном потоке программы.
Оказывается, всё дело в том, что основной поток изначально окружён 2-мя волшебными вызовами функций (см. функцию main):
int main(int argc, char *argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; // первый волшебный вызов
int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release]; // второй волшебный вызов
return retVal;
}
Так вот, каждый дополнительный поток как правило создаётся и поддерживается в непрерывно работающем состоянии в специальной функции, внутри которой происходит бесконечный цикл (ожидающий новых вызовов функций именно этого потока). Выглядит эта функция примерно так:
- (void)mainRoutine {
// Все autorelease-объекты, которые попадают в Autorelease пул
// получат автоматически сообщение release, как
// только они перестанут быть нужны:
NSAutoreleasePool *pool =
[[NSAutoreleasePool alloc] init];
NSRunLoop* runLoop = [NSRunLoop currentRunLoop];
while (isThreadShouldBeRunning_)
{
[runLoop runMode:NSDefaultRunLoopMode
beforeDate:[NSDate distantFuture]];
}
[pool release];
}
Сегодня я узнал приятную вещь. Иногда бывает неудобно париться насчёт такой специальной функции. Оказывается, можно окружить этими 2-мя волшебными вызовами любую функцию, если только вы точно знаете, что она всегда будет вызываться в дополнительном потоке (и никогда в основном потоке). После этого утечки памяти прекратятся! Ура!
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; // первый волшебный вызов сделайте в самом начале функции
[pool release]; // второй волшебный вызов сделайте в самом конце функции
воскресенье, 9 мая 2010 г.
Как скопировать файл стандартными средствами си++
std::ifstream ifs(sourceFileName, std::ios::in|std::ios::binary);
std::ofstream ofs(fn.c_str(), std::ios::out|std::ios::binary);
ofs << ifs.rdbuf();
Как создать директорию
#include
Используйте функцию
CreateDirectory (char *DirName, SECURITY_ATTRIBUTES Attribs);
В Linux (вероятно, в iPhone OS и Mac OS, так как они Unix-подобные системы)
#include
Используйте функцию
mkdir (const char *path, mode_t mode);
суббота, 8 мая 2010 г.
Как получить в C++ список всех файлов из текущего каталога (в Windows, UNIX, MS-DOS)
Я проверял для Windows - отлично работает :)
Below is a directory lister for Windows, Unix/POSIX and MS-DOS.
#include
#ifdef _WIN32
/* Compiling for Windows */
#include
int main(void)
{
WIN32_FIND_DATA f;
HANDLE h = FindFirstFile("./*", &f);
if(h != INVALID_HANDLE_VALUE)
{
do
{
puts(f.cFileName);
} while(FindNextFile(h, &f));
}
else
{
fprintf(stderr, "Error opening directory\n");
}
return 0;
}
#else
#ifdef __unix__
/* Compiling for UNIX / POSIX */
#include
#include
int main(void)
{
DIR *dir = opendir(".");
if(dir)
{
struct dirent *ent;
while((ent = readdir(dir)) != NULL)
{
puts(ent->d_name);
}
}
else
{
fprintf(stderr, "Error opening directory\n");
}
return 0;
}
#else
#ifdef __TURBOC__
/* Compiling for MS-DOS */
#include
int main(void)
{
struct ffblk ffblk;
if(findfirst("*.*", &ffblk, 0) == 0)
{
do
{
puts(ffblk.ff_name);
} while(findnext(&ffblk) == 0);
}
else
{
fprintf(stderr, "Error opening directory\n");
}
return 0;
}
#else
#error Unsupported Implementation
#endif
#endif
#endif
суббота, 1 мая 2010 г.
Градации служебной карьеры программистов (junior, senior, team leader и другие)
Хмм (Member указанного форума) написал (далее до конца поста цитирую):
Правильный перевод понятий невозможен в связи с отсутствием в англоязычных странах российской инжерной иерархии. Рекомендуется переводить не тупо текст, а смысл в соответствии с местными традициями конкретной англоязычной страны ("английского" языка не существует в природе - бывают американский, британский, австралийский и другие диалекты).
Что касается наиболее часто встречающейся американской терминологии, то берётся слово инженер и дополняется характеристиками.
1. Специализация
- Software
- Air Space,
- Electrical
- Systems
... и так далее.
2. Стаж
- Senior (опытный - минимум 10-15 лет)
- Junior (начинающий - редко используется в резюме, но может в объявлениях)
... и так далее.
3. Роль
- Associate - работает под руководством других
- Lead - руководство малой конкретной командой
- Project - управление проектом
- Staff - руководство группой самых разных людей
- Pricipal - с основной нагрузкой на менеджмент и принятие решений
... и так далее.
4. Прочее.
- Civil - гражданский, общественные проекты.
... и так далее.
Например, собираем конструкции "Senior Staff Systems Engineer", "Lead Software Engineer", "Civil Aviation Engineer" и тому подобное.
Постоянные читатели
Архив блога
-
▼
2010
(55)
-
▼
мая
(15)
- Прошёл сегодня первый тест по C++ на сайте www.ode...
- Разработка для iPhone на PHP и XML
- В сообществе фанатов Apple решили, что iPad нуждае...
- Finger Piano Share: 10 пианистов в одном iPhone
- Аналог Sleep (Win32) функции в Mac OS (iPhone OS)
- Дешевые издания приближают конец книги
- Ещё одно мнение об уровне квалификации программистов
- Сравнение строк вне зависимости от регистра символов
- Загадочные многоточия в ячейках TableView (UITable...
- Перенос C++ шаблонов из Visual C++ в Xcode-проекты...
- Утечки памяти в дополнительных потоках (в связи с ...
- Как скопировать файл стандартными средствами си++
- Как создать директорию
- Как получить в C++ список всех файлов из текущего ...
- Градации служебной карьеры программистов (junior, ...
-
▼
мая
(15)