Накрутка подписчиков в Инстаграме своими силами

В интернете есть ряд сервисов, которые за деньги пригоняют много подписчиков и “лайков” в ваш аккаунт в Instagram. Я точно не знаю, как именно это делают они, но мне самому удалось в некоторой степени повторить это на своём аккаунте с помощью бота, спортивного интереса ради.

Идея эта уже несколько недель витала в нездоровой голове, и в какой-то момент нашлось время попробовать. А ещё через несколько недель нашлось время описать. Суть такова:

  1. Любым способом находим много произвольных не закомых нам пользователей. Ставим им лайки и подписываемся.
  2. Эти люди получают уведомления на свои телефоны. Многие из них при этом сами заходят в наш профиль (всем любопытно, что за незнакомый чел на них подписался), смотрят и иногда подписываются в ответ.
  3. Чтобы ваш аккаунт не выглядел спамерным или взломанным (типа 100 подписчиков, а подписан на >9000), время от времени вероломно отписываемся от этих людей и отменяем свои лайки. Мало кто обратит на это внимание, поэтому большая часть подписчиков остаётся при нас.

Теперь немного подробностей. Continue reading “Накрутка подписчиков в Инстаграме своими силами”

Java puzzler

Отлично:

  1. Вставляем следующий код без изменений в B.java:
    class B extends A{B(Long i){
    new B(i/Long.compare(i,i));System.out.println("Win");}}
  2. Пишем что угодно в A.java
  3. Запускаем так: java -Djava.security.manager A . Security manager нужен, чтобы запретить читерство типа рефлексии.
  4. Программа должна достичь System.out.println(“Win”) в B и напечатать “Win”.

Источник. Туда пока что можно отправить своё решение взакрытую, но со временем комментарии с ответами откроются, поэтому будьте осторожны.

Набор

А нет ли среди читателей способных студентов из стран пост-советского пространства, которые заканчивают учёбу (Specialist/Msc/Phd) в 2015 и готовы к переезду в SF Bay Area работать программистами?

Пишите, это довольно срочно. Резюме не обязательно.

Всем остальным, кто хочет в Google: тоже пишите, но резюме обязательно.

Cloud Services на Google I/O 2014

С быстротой Слоупока уютный бложик рассказывает о последних новостях в мире IT.

На прошлой неделе прошла ежегодная конференция Google I/O 2014 для разработчиков. На следующем видео мой босс расскажет о том, чем в последнее время занималась наша команда Google Cloud Messaging.

Следующие функции либо новые, либо стали доступны для всех:

  • Cloud Connection Server (CCS) — XMPP-интерфейс для обмена сообщениями с Google Cloud Messaging.
  • Upstream messaging — позволяет посылать сообщения с телефона на ваши сервера через наши. Это сэкономит батарейку и трафик, так как телефон в любом случае поддерживает соединение с нашим облаком.
  • User notifications — позволяет удобно отправлять сообщения сразу на все устройства пользователя, если их у него несколько.
  • Delivery receipts — позволяет получать уведомления об отправке сообщения на телефон получателя.

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

Ну а на этом видео босс моего босса рассказывает про новое в проекте вообще, то есть не только про Messaging.

По-моему, Google Cloud Save и Network Manager довольно любопытны.

Ссылки по теме:

Upd. Написали кратко о нововведениях в официальный блог.

Когда Intellij IDEA не сохраняет файлы

В редакторе Intellij IDEA файлы не надо сохранять вручную. Вы просто вносите изменения, а программа сама сохраняет их, когда посчитает нужным. Это одна из фишек, которая бросается в глаза сразу.

Но когда именно файлы должны сохраняться? Помимо прочего, это происходит при переключении в другие окна, ведь, понятное дело, если я использую инструменты в терминале (тот же git), они должны мои изменения видеть. (Плагином для гита я не пользуюсь по разным причинам, в том числе потому что он для удобства скрытно делает некоторые прозрачные операции, которые изредко оказываются совсем не прозрачными).

Всё это прекрасно работает, когда я сижу за своим рабочим компьютером. Но иногда я работаю через VPN из дома, и у меня в браузере (да, прямо в Хроме) есть несколько вкладок: удалённый рабочий стол и несколько сессий SSH. В удалённом десктопе открыта Идея, в терминалах я запускаю тесты и git. И тут начинается: Идея-то не знает, что я в браузере на ноутбуке сейчас переключился в другую вкладку, поэтому мои изменения в коде не сохранены на диск. Я запускаю тесты и ломаю голову над тем, что в них происходит. Потом понимаю, что у меня ничего не сохранилось, иду в удалённый десктоп, нажимаю alt+tab, потом возвращаюсь в терминал, и там у меня всё работает как надо. Потом ещё несколько раздражающих переключений туда-обратно, и я снова забываю альт-табнуться из Идеи. Запускать терминал в удалённом десктопе мне не очень удобно.

В связи с этой же фишкой про сохранение Идею нельзя, в отличие от Эклипса, настроить на форматирование при сохранении. Можно сделать макрос, а я просто привык всё время нажимать хоткей для форматирования.

@VisibleForTesting не нужна

В Guava есть аннотация VisibleForTesting. Её описание из кода библиотеки:

Annotates a program element that exists, or is more widely visible than otherwise necessary, only for use in test code.

То есть предполагается, что этой аннотацией мы будем отмечать методы и поля, которые, по идее, должны были быть private, но для тестов были сделаны package-private или public.

По поводу этой аннотации я хотел бы сказать, что она, ИМХО, не нужна.

В случае, когда член нужен тесту из другого пакета, и его поэтому пришлось сделать public, это совсем другая проблема и никакие аннотации тут уже не помогут. Так что рассуждать будем о private полях, которые были сделаны package-private для тестов.

Так вот, нет ничего плохого в package-private членах. Они по-прежнему остаются недоступными для клиентов из других пакетов (это самое главное, потому что их обычно большинство). Для клиентов из того же пакета: сам факт того, что некоторое поле, метод или конструктор имеет ограниченную видимость, должен настораживать разработчика не хуже аннотации. Конечно, наверняка найдётся кто-нибудь, кого это не остановит от доступа к члену или методу не по назначению. Но, ей-богу, оно того не стоит:

До:

@VisibleForTesting
static final double AVOGADROS_NUMBER = 6.02214199e23;
@VisibleForTesting
static final double BOLTZMANN_CONSTANT = 1.3806503e-23;
@VisibleForTesting
static final double ELECTRON_MASS = 9.10938188e-31;

После:

static final double AVOGADROS_NUMBER = 6.02214199e23;
static final double BOLTZMANN_CONSTANT = 1.3806503e-23;
static final double ELECTRON_MASS = 9.10938188e-31;

И ещё. Описание к аннотации намекает, что некоторые члены могут быть не только раскрыты, но и созданы исключительно для тестирования. Так вот, я не Кент Бек, конечно, но вроде бы:

  1. продакшн код не должен испытывать никаких структурных изменений, сделанных исключительно для тестирования;

  2. если некоторый класс ну никак не протестировать без введения туда новых членов, то скорее всего беда с качеством кода. За подробностями можно обратиться к «Чистому коду».

А ещё я иногда вижу такое:

/* package */ class SomeClass implements SomeInterface  {

Для кого этот комментарий вообще?

Несогласные призываются в комменты.

Публичность и опубликованность

Статья Мартина Фаулера Public versus Published Interfaces. В целом ничего очень нового или исключительно интересного, но заставила задуматься, почему различие public-published на уровне языка реализовано далеко не во всех языках.

Суть:

Публичный интерфейс, public interface — методы класса, которые могут быть использованы любыми другими объектами.

Опубликованный интерфейс, published interface — то, чем пользуются внешние клиенты нашей, например, библиотеки. Они вызывают методы и наследуются своими классами.

В Java нет способа явно отличить одно от другого. То есть если наша библиотека состоит из нескольких пакетов (что почти всегда), то публичные интерфейсы будут опубликованы и доступны внешним пользователям, даже если мы их делали только для внутреннего применения. Избежать этого никак, разве что в документации указывать пользователям, какие именно компоненты можно использовать.

Опубликованный интерфейс изменить трудно, если код внешних пользователей, который, очевидно, вне нашего контроля, его использует. Иногда можно упростить себе и другим жизнь:

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

Китайский интернет и стена вокруг него

Показал коллегам-китайцам Яндекс, а они мне показали Baidu. Доля последнего на рынке Китая составляет порядка 65%, чуть больше доли Яндекса на рынке РФ, насколько мне известно. Ещё у китайцев есть собственные аналоги amazon, ebay, facebook, свой мессенджер QQ и много всего другого. Говорят, что некоторые из этих сервисов ничуть не хуже своих глобальных собратьев. Почта в Китае работает очень хорошо. Насколько я понял, все бытовые товары они покупают онлайн.

А теперь несколько фактов о великом китайском фаерволе:

  • Информацию о самой длинной китайской реке нельзя найти в китайских поисковиках, потому что её название содержит фамилию какого-то там политика.
  • Задавшего нежелательный поисковый запрос пользователя перестают пускать в Google на несколько минут («меня гугл забанил!»)
  • Китайский фаервол обойти сложно. Proxy и vpn блокируются на ура.
  • Историческую дату 4 июня 1989 года упоминать в китайском интернете запрещено даже косвенно. Поэтому автоматически зарубаются публикации, содержащие, к примеру, следующее: “64”, “8 * 8”, “2 ^ 6”. Серьёзно, нельзя возводить 2 в степень 6.

 

Eloquent JavaScript: A Modern Introduction to Programming

Eloquent JavaScript: A Modern Introduction to Programming

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

Книжку хочется похвалить. Она бесплатна, доступна онлайн и интерактивна: задания можно решать и проверять прямо в той же вкладке браузера. Последнее важно для меня, так как обычно я очень ленюсь решать задания из книг.

Но есть в ней и некоторые странности. Книга вроде как рассчитана на начинающих программистов, поэтому, с одной стороны, там описаны некоторые основные концепты, хорошо знакомые каждому разработчику, но с другой стороны, такого объёма знаний начинающему программисту явно не хватит. По той же, видимо, причине, в книге есть отдельная глава про алгоритмы поиска в графах и ещё одна про бинарные кучи (binary heaps). Зачем автор охватил эти темы, и почему именно их, для меня загадка. Эти главы я пропустил.

Но в целом я доволен. Ещё раз ссылка: Eloquent JavaScript: A Modern Introduction to Programming.

Сам язык, кстати, создал похожее впечатление. Он вроде как задумывался «для домохозяек», а получился, наоборот, довольно нетривиальным.

Дальше мне по плану надо ознакомиться с jQuery, но вместо него я займусь ПДД Калифорнии, а то дальше их откладывать уже некуда.