Pull to refresh
0
Nedomolkin @Nedomolkinread⁠-⁠only

User

Send message

Сколько зарабатывают программисты в Кремниевой долине?

Reading time1 min
Views14K
Сайт Glassdoor, собирающий анонимную информацию о заработках людей, опубликовал свежее исследование о зарплатах в компаниях Кремниевой долины.

Лидирует компания Facebook, среднестатистическая зарплата в которой составляет 110 тысяч долларов в год, плюс около 12 тысяч долларов бонусов. А вот зарплата сотрудников Google уступает даже Apple, но интересно, что в Google самые большие бонусы (в связи с этим понятно, почему Эрик Шмидт обещал перенести бонусы в базовую зарплату). Впрочем, как я уже писал, в следующем году Google планирует поднять зарплату на 10 % всем своим сотрудникам, что может вывести компанию в лидеры.

Сравнение зарплат инженеров-программистов (Software Engineer)
Компания Средняя базовая зарплата Бонусы
AOL 88 801 5233
Apple 99 127 8175
Cisco 105 720 8529
eBay 88 916 6773
Facebook 110 500 11 900
Google 98 814 21 364
Hewlett-Packard 85 568 5550
Intel 87 450 8048
Intuit 79 765 9339
Oracle 92 479 6000
Yahoo 101 638 6197
Total votes 126: ↑119 and ↓7+112
Comments210

SICP теперь по-русски! Часть третья

Reading time1 min
Views12K
image
Перевод третьей лекции из курса «Структура интерпретация компьютерных программ».

Это самый известный курс по программированию за последние 25 лет; с 1980г читается в MIT, а с недавних пор что-то подобное читается и в Беркли.

Курс сменил преподавателей и даже язык программирования Scheme на Python(на мой взгляд совершенно зря) и тем не менее информация, которая дается в этом курсе остается архи актуальной в любое время. Я бы сравнил этот курс с чем-то очень фундаментальным и важным для программистов, типа математики или теории алгоритмов.

Мне бы очень хотелось, чтобы программирование у нас в стране преподавалось таким вот образом.

Приятного просмотра!
Читать дальше →
Total votes 98: ↑94 and ↓4+90
Comments39

Английский на Малибу

Reading time4 min
Views11K


Сегодня я все же решился на это.
Обсудить с аудиторией Хабра формат изучения английского языка, который мы используем на нашем проекте и постараться доказать, что он имеет право на существование на ряду с остальными замечательными сервисами.
Читать дальше →
Total votes 40: ↑28 and ↓12+16
Comments26

Привлечение аудитории на сайт с помощью iPhone-приложения

Reading time2 min
Views824
В этом топике я постараюсь поделиться собственным опытом: для чего мы создавали приложение под iPhone и как раскручивали, оправдались ли наши ожидания и увеличилась ли посещаемость сайта.

Почему именно iOS, а не Android. По данным статистики liveinternet, в России устройств, работающих на базе iOS и подключенных к интернету (что для нас очень важно) больше в 2 раза по сравнению с Андроидами.

image
Читать дальше →
Total votes 63: ↑56 and ↓7+49
Comments50

Повышение производительности за счет блочного кеширования

Reading time5 min
Views5.7K
Тема блочного кеширования и ssi не раз проскакивала на Хабре. Ниже я представлю еще одну реализацию, использующего блочное кеширование, а также исходники фреймворка, использующего эти принципы, которые можно найти тут. А как это работает — прочитать ниже.
схема кеширования блоками
Читать дальше →
Total votes 56: ↑49 and ↓7+42
Comments60

Синхронизация асинхронных вызовов. WaitSync

Reading time3 min
Views8.7K

Задача


Допустим вы хотите выполнить два или более AJAX запроса на сервер и вызвать функцию после того, как все они будут закончены.

Небольшая загвоздка в том, что вы не знаете, какой из этих запросов будет закончен первым и не знаете, на кого вешать callback.

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

Собственно, этим и занимается мой небольшой класс WaitSync =)

WaitSync.js


Пользоваться элементарно просто:

1. Создаем объект типа WaitSync, передав в конструктор callback функцию, которая будет вызвана после того, как отработают нужные задачи.
	var vulture = new WaitSync(function () {
		console.debug('Start eating: ', arguments);
	});


2. Вместо простого
	$.getJSON(
		'savannah/get_prey', 
		function (data) {
			console.log('... prey found: ' + data);
		}
	);
	
	$.getJSON(
		'savannah/get_other_predators', 
		function () {
			console.log('... predators are done eating');
		}
	);


«заворачиваем» задачи в метод .wrap
	$.getJSON(
		'savannah/get_prey', 
		vulture.wrap( 
			function (data) {
				console.log('... prey found: ' + data);
			}
		)
	);
	
	$.getJSON(
		'savannah/get_other_predators', 
		vulture.wrap(
			function () {
				console.log('... predators are done eating');
			}
		)
	);


3. Все =) Как только будут выполнены оба AJAX запроса, стервятник начнет есть.

Как это работает?
Total votes 62: ↑46 and ↓16+30
Comments63

Асинхронная синхронность. JSDeferred

Reading time4 min
Views6.7K
В последнее время на хабре появилось несколько статей про работу с асинхронными вызовами (После всех асинхронных вызовов, Синхронизация асинхронных вызовов. WaitSync). Но при ближайшем рассмотрении область их применения довольно узка так как эти способы не решают всех проблем.
Но для начала попробуем определить эти самые проблемы, с которыми мы сталкиваемся при работе с асинхронными вызовами.
Читать дальше →
Total votes 48: ↑44 and ↓4+40
Comments31

TDD — это как сноубординг

Reading time3 min
Views12K

Я только что получил следующее письмо, которым хочу поделиться и ответить на него публично.

«Я не использую эту методологию (TDD) из-за того, что главный для меня вопрос остается без ответа. Я знаю, что использование TDD уменьшает количество багов, но что насчет времени, необходимого при работе по этой методологии?
Я хотел бы знать как изменяется время на разработку корпоративного приложения с использованием TDD — уменьшается, увеличивается или остается неизменным.
Надеюсь, вы сможете ответить, так как TDD и BDD меня очень интересуют.»

Ответ на письмо
Total votes 59: ↑45 and ↓14+31
Comments58

Основы Linux от основателя Gentoo. Часть 3 (1/4): Документация

Reading time8 min
Views35K
Первый отрывок третьей части серии руководств для новичков. Практически всё, что нужно знать, чтобы найти справочную информацию по вашей системе. Короче, RTFM и не задавайте глупых вопросов.



Навигация по основам Linux от основателя Gentoo:

Часть I: 1, 2, 3, 4

Часть II: 1, 2, 3, 4, 5

Часть III
  1. Документация (вступление)
  2. Модель прав доступа
  3. Управление аккаунтами
  4. Настройка окружения (итоги и ссылки)


Читать дальше →
Total votes 71: ↑61 and ↓10+51
Comments11

Написание web-API к своей системе

Reading time3 min
Views24K
Добрый день, %username%!
За последний год столкнулся с несколькими задачами по написанию SOAP/REST API к различным сервисам и вывел для себя боле-менее удобную модель. Я не претендую на фундаментальное исследование, просто хочу поделиться опытом наступания на грабли.

Для начала общие требования к default API:
  • возможность расширения
  • удобный стандартизированный формат запросов
  • удобный стандартизированный формат ответов
  • достаточный уровень безопасности
  • возврат ошибок выполнения запроса

Читать дальше →
Total votes 108: ↑83 and ↓25+58
Comments180

Разбираемся с prototype, __proto__, constructor и их цепочками в картинках

Reading time2 min
Views34K
Есть javascript код:
  1. var A = function () {};
  2. A.prototype.b = 100;
  3. var a = new A();
  4. A.prototype.c = 101;
  5. a.c = -100;
  6. A.prototype = {};
  7. A.prototype.b = 536;
  8. /* 1 */ console.log(a.__proto__.constructor.prototype.b === 536);
  9. var b = new A();
  10. /* 2 */ console.log(a.__proto__.__proto__.constructor === a.__proto__.constructor.prototype.constructor);
  11. /* 3 */ console.log(b instanceof A);
  12. /* 4 */ console.log(!(a instanceof Object));
Вопрос. Что возвратят выражения 1-4 и почему?

Затрудняетесь ответить?
Тогда вам стоит пройти под кат ;-) (Далее 600 Кб больших изображений)
Читать дальше
Total votes 75: ↑58 and ↓17+41
Comments51

Регистрация в качестве Индивидуального предпринимателя для freelance'ера: Зачем и как?

Reading time3 min
Views17K
После моей статьи «Freelance: ожидания, реальность, признание» сразу несколько человек обратилось ко мне с вопросом о юридических проблемах в работе freelance'ра. Скажу сразу, я далеко не юрист, но в свое время оформлял себе ИП, именно для freelance'а, а потому имею опыт, и некоторые знания в этой сфере, и могу ими поделиться. Хотя конечно мои выводы могут быть ошибочны, и у юристов эта статья наверняка вызовет легкую улыбку (или приступ раздражения), скажу еще раз, я просто хочу поделиться опытом, и рассказать как я регистрировался в качестве предпринимателя, и что мне дала эта бумажка.
Читать дальше →
Total votes 66: ↑62 and ↓4+58
Comments112

Как легально получать деньги из-за пределов России

Reading time5 min
Views202K
Дано: заказчик за рубежом, желающий работать с Вами и платить вам евро или доллары.
Найти: оптимальный способ организовать работу с ним, чтобы платить налоги и спать спокойно.

Сразу скажу, что получение денег на пластиковую карту без уплаты налогов может вылиться в серьезные проблемы (про ответственность написано в конце топика). Объяснения, что деньги «от бабушки внучку на мороженное» при суммах больше 10К$ в год уже не прокатывают, особенно если в реквизитах «бабушки» будет стоять что-то вроде «GMBH Star Development» Вероятность того, что возьмут за задницу достаточно высокая и поэтому лучше не рисковать и делать все по Закону, тем более, что ничего сложного в этом нет
Читать дальше →
Total votes 144: ↑142 and ↓2+140
Comments192

После всех асинхронных вызовов

Reading time3 min
Views8.4K
Итак, мы пишем приложение с кучей асинхронных запросов. Нам надо отправить два асинхронных запроса и обработать их результат только после того, как будет получен результат обоих. Например, это могут быть ассинхронные обращение к файлу и запрос к базе, результат которых надо сложить вместе и обработать. Или два аджакс запроса.
Но особенность асинхронных запросов в том, что мы не знаем, какой из них придёт первым, а какой — последним. Решают это разными способами, но я не видел еще красивого и изящного. В топике я расскажу, как я это вижу.
var process = processFsAndDb.after('fs', 'db');

asyncFsAccess( file, process.fs);
asyncDbAccess(query, process.db);

Читать дальше →
Total votes 71: ↑67 and ↓4+63
Comments114

MongoDB или как разлюбить SQL

Reading time6 min
Views67K
Введение

Коллеги, при разработке приложений, мы каждый день сталкиваемся с потребностью в гибком хранении информации (обновлении, поиске по ней, и т.д.). Класс продуктов, которые решают этот круг задач, как все мы знаем — Базы данных. Но что это такое в нашем понимании? У многих «база данных» твердо ассоциируется с MySQL, таблицами и SQL-запросами. И это устраивает до определенного момента. Действительно, реляционные базы данных дают массу преимуществ в работе: поскольку данные имеют сильную связанность, не нужно контролировать целостность базы данных. Используя простой под-запрос можно выбрать количество комментариев к каждому посту в блоге. Используя JOIN нетрудно делать сложные связанные выборки и получать данные сразу о нескольких сущностях.
Читать дальше →
Total votes 129: ↑122 and ↓7+115
Comments99

Мирный XSS

Reading time3 min
Views9K
Эта статья о мирном атомеXSS. Заставим зло работать на добро!

А зачем?


Простейший пример всё объяснит:
Вы разрабатываете веб-сервис, который поставляет данные другим сайтам (погода, данные по торгам в реальном времени, чат и т.п). Вам нужно организовать кроссайтовую передачу данных(данные погоды, торгов, текст чата) на стороне клиента.

Методы организации XSS

  1. Через тэг iframe
  2. Через тэг script
  3. Через flash<->javascript
  4. Через window.name + iframe + form
  5. Через CSS хак
  6. Через canvas + img
  7. Через прокси
Реализация каждого метода
Total votes 98: ↑87 and ↓11+76
Comments23

Используем паттерн Наблюдатель(Observer) для создания индикатора выполнения процесса на Javascript

Reading time4 min
Views49K
Идея паттерна Observer заключается в создании зависимости типа один ко многим. При изменении состояния одного объекта(субъекта), зависящие от него объекты(наблюдатели) об этом оповещаются и обновляются. Это нужно для согласования состояния взаимосвязанных объектов без их жесткой связанности.

пример внутри
Total votes 64: ↑51 and ↓13+38
Comments28

«От хорошего к великому» — книга, которую обязательно стоит прочесть. (в цитатах) — ЧАСТЬ 1

Reading time4 min
Views72K
imageМоя прошлая статья «Обнаженный бизнес» Ричарда Брэнсона (в цитатах), похоже многим была интересна. Что же, не будем останавливаться?

Сегодня несколько слов о книге Джима Коллинза «От хорошего к великому». Это пожалуй, лучшая книга по бизнесу, среди всех, которые я читал. Она по-настоящему заслуживает права быть настольной. В какой то степени она даже не только о бизнесе. Не только о том, как построить успешную стабильную компанию, как набирать персонал или управлять проектами. Прежде всего она открывает глаза. Как на бизнес, так и на жизнь.

Я прочел эту книгу 2 раза. Второй раз (теперь, как всегда) — с маркером, выделяя цитаты. Рад ими поделиться. Уверен, тем кто знаком с книгой, будет интересно и полезно прочесть эти мысли еще раз. А те, кто книгу еще не читал, скорее всего убедятся в том, что это обязательно стоит сделать.

***

Мы тщательно изучили и просеяли компании, которые входили в список Fortune 500 c 1965 по 1999 год. И определили те компании, которым удалось осуществить переход от хороших результатов к выдающимся и сохранять эти высокие результаты в течение, по крайней мере, 15 лет. Затем мы проанализировали те факторы, которые позволили это сделать.

Читать дальше →
Total votes 106: ↑92 and ↓14+78
Comments83

Определение кодировки текста в PHP — обзор существующих решений плюс еще один велосипед

Reading time7 min
Views104K
Столкнулся с задачей — автоопределение кодировки страницы/текста/чего угодно. Задача не нова, и велосипедов понапридумано уже много. В статье небольшой обзор найденного в сети — плюс предложение своего, как мне кажется, достойного решения.

1. Почему не mb_detect_encoding() ?


Если кратко — он не работает.
Подробнее - под катом
Total votes 115: ↑104 and ↓11+93
Comments82

Как я в сериалы в консоли смотрю / bash-скриптинг

Reading time5 min
Views11K
Вы любите смотреть фильмы? Я — да: «Теория большого взрыва», «The IT Crowd», разное аниме… Все это очень затягивает.
Для просмотра всего этого добра я пользуюсь консольной версией самого всеядного медиаплеера mplayer. (Давайте воздержимся от холивара по поводу красноглазия и GUI vs консоль) Но вот незадача, для каждой новой серии приходится заново набирать длинную команду вроде такой:
$ mplayer -ass -subcp cp1251 имя_сериала_01_еще_какая_то_чушь.mkv

Ясное дело, что я не набираю всю эту простыню с нуля, а просто стираю бэкспейсом до номера серии, пишу новый номер и табом дополняю до конца имени файла. Но это ведь долго и неудобно, можно промахнуться и стереть лишнего.
А еще часто смотрится несколько сериалов параллельно, по мере выхода новых серий. И помнить, на какой серии я остановился в прошлый раз, и с какими параметрами и ключами запускал mplayer, становится затруднительно. И поэтому я решил написать себе на шелле простую запускалку плеера, которая будет запоминать параметры, номер последнего просмотренного эпизода и уметь подставлять номер следующего в команду запуска.
Итак, поехали!
Total votes 115: ↑75 and ↓40+35
Comments142

Information

Rating
Does not participate
Registered
Activity