Pull to refresh
37
8
Алексей Ворона @voronaam

User

Send message

Экспорт архива Gmail и Google Calendar

Reading time1 min
Views38K
Компания Google с сегодняшнего дня разрешила экспортировать всю информацию из календаря Google Calendar. Функция уже активирована для 100% пользователей. Экспорт из Gmail активирован для 1% пользователей, к концу января цифру доведут до 100%. Экспорт почты осуществляется в формат MBOX, который поддерживается в Microsoft Outlook 2011, Mozilla Thunderbird и Apple Mail.



Ссылка для экспорта данных Gmail и Calendar, а здесь полный список поддерживаемых продуктов для экспорта персональной информации.

При экспорте в zip создаются архивы максимум по 2 ГБ, так что лучше выбрать .tgz или .tbz (50 ГБ макс.). После создания архива скачать его можно не более пяти раз.
Total votes 22: ↑22 and ↓0+22
Comments13

Кто шутит над голливудскими студиями?

Reading time2 min
Views47K
Крупнейшие голливудские студии каждый день присылают в Google списки адресов с пиратским контентом, которые нужно немедленно удалить из поисковой выдачи по закону DMCA. В последнее время подобных запросов от автоматизированных систем приходит особенно много. Ошибки встречаются всё чаще. В начале ноября в Google поступила целая пачка «самоубийственных» запросов, где некий представитель правообладателей настоятельно требует удалить контент, в том числе, с их собственных сайтов.

Например, от имени студии 20th Century Fox пришёл запрос на удаление пиратских копий сериала «Как я встретил вашу маму» со списком 60 адресов. Среди них и сайт CBS, где выкладывают старые серии. Этот же URL указан как источник оригинальной работы.


Читать дальше →
Total votes 51: ↑47 and ↓4+43
Comments25

Снятие защиты Amazon DRM с электронных книг

Reading time1 min
Views45K
Если вы купили много книг для Kindle и хотите защитить их от удаления, то лучше всего сделать резервную копию библиотеки на ПК, сняв защиту DRM с самих файлов, так что их можно будет конвертировать в любой формат и читать с любого устройства.

В случае с Amazon DRM для этого понадобятся:

  1. Calibre.
  2. Kindle for PC.
  3. Плагин K4MobiDeDRM для Calibre, из комплекта DRM Removal Tools.
Читать дальше →
Total votes 28: ↑24 and ↓4+20
Comments17

Строго типизированное представление неполных данных

Reading time8 min
Views7.6K
В предыдущей статье «Конструирование типов» была описана идея, как можно сконструировать типы, похожие на классы. Это даёт возможность отделить хранимые данные от метаинформации и сделать акцент на представлении самих свойств сущностей. Однако описанный подход оказывается довольно сложным из-за использования типа HList. В ходе развития этого подхода пришло понимание, что для многих практических задач линейная упорядоченная последовательность свойств, как и полнота набора свойств, не является обязательной. Если ослабить это требование, то конструируемые типы значительно упрощаются и становятся весьма удобны для использования.

В обновлённом варианте библиотеки synapse-frames исключительно просто описываются иерархические структуры данных и представляются любые подмножества таких структур.

Читать дальше →
Total votes 21: ↑19 and ↓2+17
Comments2

Отладка Java приложения, которое нельзя остановить. Ловим экзотику выполнения самыми доступными средствами — BTrace подход

Reading time5 min
Views18K

Java приложения — значит в современном Java мире возможность встретить такое процентов на 90%, а то и больше (рассматриваем самые распространённые окружения, HotSpot based JVM версии от 1.6)
которое нельзя остановить — приложение работает, и перезапускать его по тем или иным причинам категорически нельзя
экзотика — нечто такое этакое, что не каждый день в голову взбредёт поймать (определённая последовательность вызова методов, диковинные комбинации значений параметров, ...)
доступными средствами — бесплатно, работоспособно, эффективно, легко, просто и т.д и т.п. В данной статье рассмотрен замечательный инструмент BTrace kenai.com/projects/btrace

И само собой в код Java приложения заранее ничего специально не добавлено касательно средств дебага…

Как же это ?...
Total votes 31: ↑29 and ↓2+27
Comments22

Автоматическое определение подключения\отключения второго монитора

Reading time2 min
Views33K

Всем, доброго времени суток.


По сути, к реализации этой маленькой автоматизации меня сподвигла лень.

Собственно, с чего все началось.


У меня есть ноутбук с установленной gentoo, и i3wm оконным менеджером. Так же есть несколько мониторов(дома, на работе и т д). Разрешения на всех мониторах разные, способы подключения тоже (VGA, HDMI, DVI) разные. Активно, использую первые два.

Раньше, при подключении второго монитора, приходилось вызывать команды, которые инициализировали этот самый монитор. Запуск команды с автоматическим ключом, не всегда давал, желаемого результата(не угадывал разрешение).

xrandr --auto


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

--mode

И хотя, в xrandr для каждого монитора у меня есть несколько вариантов разрешений, есть одно (максимальное для данного монитора, которое удовлетворяет), но на каждом мониторе оно разное(так как сами мониторы разные).

Потому пришлось искать решение…

Читать дальше →
Total votes 49: ↑42 and ↓7+35
Comments23

Геокодер OSM на Java

Reading time15 min
Views26K
Привет, дорогие читатели хабра. В этой статье поговорим

  • Про адреса и хранилища данных с нечеткой схемой
  • Про обработку геоданных на java, а именно про Java Topology Suite
  • Про стоимость «простоты» для разработчика
  • Про pure Java nosql документную бд / движок полнотекстового поиска — Elasticsearch.

Читать дальше →
Total votes 23: ↑22 and ↓1+21
Comments15

Конструирование типов в Scala

Reading time5 min
Views9.4K
При построении многослойных («enterprise») систем часто оказывается, что создаются ValueObject'ы (или case class'ы), в которых хранится информация о каком-либо экземпляре сущности, обрабатываемом системой. Например, класс

case class Person(name: String, address: Address)


Такой способ представления данных в системе обладает как положительными свойствами:
  • строго типизированный доступ к данным,
  • возможность привязки метаинформации к свойствам с помощью аннотаций,


так и некоторыми недостатками:
  • если сущностей много, то таких классов также становится довольно много, а их обработка требует много однотипного кода (copy-paste);
  • потребности отдельных слоёв системы в метаинформации могут быть представлены аннотациями к свойствам этого объекта, но возможности аннотаций ограничены и требуют использования reflection'а;
  • если требуется представить данные не обо всех свойствах объекта сразу, то созданные классы использовать затруднительно;
  • затруднительно также представить изменение значения свойства (delta).


Мы хотим реализовать фреймворк, позволяющий создавать новые «классы» (типы, конструкторы этих типов, объекты новых типов) инкрементно, используя наши собственные «кирпичики». Попутно, пользуясь тем, что мы сами изготавливаем «кирпичики», мы можем достичь таких полезных свойств:
  • возможность описывать отдельные свойства сущностей (с указанием типа данных в этом свойстве и любой метаинформации, необходимой приложению, в форме, подходящей именно для этого приложения);
  • возможность оперировать со свойствами экземпляров строго типизированным образом (с проверкой типов на этапе компиляции);
  • представлять частичную/неполную информацию о значениях свойств экземпляра сущности, пользуясь объявленными свойствами;
  • создавать тип объекта, содержащего частичную информацию о свойствах экземпляра сущности. И использовать этот тип наравне с другими типами (классами, примитивными типами и др.).

Читать дальше →
Total votes 16: ↑14 and ↓2+12
Comments8

Ввод паролей при сборке проектов с помощью gradle

Reading time3 min
Views5.8K
При сборке проектов для Android Gradle позволяет указать некоторые параметры, позволяющие собрать и подписать пакет, готовый для загрузки в Google Play. Однако, вряд ли стоит загружать некоторые данные, такие как пароль от приватного ключа в публичный репозиторий. В статье, перевод которой ниже, автор рассматривает способы ввода приватной информации, такой как пароли, во время сборки проекта.

Gradle позволяет получить доступ к консоли с помощью метода System.console(). Консоль предоставляет метод для чтения паролей, поэтому для ввода пароля можно использовать:
def password = System.console().readPassword("\nPlease enter key passphrase: ")

Теперь можно использовать пароль в любом месте скрипта сборки, и все готово… ой, тогда это будет слишком короткий пост, поэтому теперь поговорим о проблемах.
Читать дальше →
Total votes 18: ↑18 and ↓0+18
Comments2

Разъяснение http2

Reading time25 min
Views193K
На днях Даниэль Штенберг, один из участников группы HTTPbis IETF, которая ведёт разработку протокола http2, опубликовал в своём блоге крайне интересный документ «http2 explained». Небольшой PDF-документ на 26 страницах весьма доступным языком рассказывает о предпосылках и деталях реализации протокола http2.

Как мне кажется, на сегодняшний день это одно из самых лучших разъяснений о том, что такое протокол http2, зачем он нужен, как он повлияет на веб-разработку и какое будущее ждёт Интернет в связи с его появлением. Думаю, что всем людям, причастным к веб-разработке и веб-строению, информация будет полезна, ведь ожидается, что стандарт http2 будет принят уже в июне этого года после завершающей встречи группы HTTPbis в Нью Йорке.
Читать дальше →
Total votes 162: ↑153 and ↓9+144
Comments51

JSR 133 (Java Memory Model) FAQ (перевод)

Reading time25 min
Views146K
Добрый день.
В рамках набора на курс «Multicore programming in Java» я делаю серию переводов классических статей по многопоточности в Java. Всякое изучение многопоточности должно начинаться с введения в модель памяти Java (New JMM), основным источником от авторов модели является «The Java Memory Model» home page, где для старта предлагается ознакомится с JSR 133 (Java Memory Model) FAQ. Вот с перевода этой статьи я и решил начать серию.
Я позволил себе несколько вставок «от себя», которые, по моему мнению, проясняют ситуацию.
Я являюсь специалистом по Java и многопоточности, а не филологом или переводчиком, посему допускаю определенные вольности или переформулировки при переводе. В случае, если Вы предложите лучший вариант — с удовольствием сделаю правку.
Этот статья также подходит в качестве учебного материала к лекции «Лекция #5.2: JMM (volatile, final, synchronized)».

Также я веду курс «Scala for Java Developers» на платформе для онлайн-образования udemy.com (аналог Coursera/EdX).

Ну и да, приходите учиться ко мне!


JSR 133 (Java Memory Model) FAQ


Jeremy Manson и Brian Goetz, февраль 2004

Содержание:
Что такое модель памяти, в конце концов?
Другие языки, такие как C++, имеют модель памяти?
Что такое JSR 133?
Что подразумевается под «переупорядочением» (reordering)?
Что было не так со старой моделью памяти?
Что вы подразумеваете под «некорректно синхронизированы»?
Что делает синхронизация?
Как может случиться, что финальная поля меняют значения?
How do final fields work under the new JMM?
Что делает volatile?
Решила ли новая модель памяти «double-checked locking» проблему?
Что если я пишу виртуальную машину?
Почему я должен беспокоиться?
Читать дальше →
Total votes 56: ↑51 and ↓5+46
Comments32

Отладка Java приложения, когда оно совсем не ждёт — добро пожаловать в InTrace подход

Reading time6 min
Views31K
Доводилось ли вам когда-либо исследовать шаг за шагом выполние некого Java кода, который не удосужились снабдить средствами логирования или прочими механизмами наблюдения?
Усложним задачу тем, что не будем перекомпилировать исследуемый код, да и вообще перезапускать существующий процесс (тот случай, когда непонятное поведение было да и при перестарте сплыло). Java машина, конечно же, запущена с самыми обыкновенными опциями (без параметров для аттача дебагера или ещё каких наворотов).
А так хочется понять, что же происходит.

Именно этим мы и займёмся.
Узнать больше ...
Total votes 36: ↑34 and ↓2+32
Comments12

Трансформации AST — Первый шаг к тяжёлым веществам

Reading time7 min
Views19K
А давайте сделаем magic с вашим Java кодом. Вот такой:


Берем это:
import groovy.transform.Canonical
import groovy.transform.TupleConstructor

@Canonical
@TupleConstructor
class Person {
    int id
    String firstName
    String lastName
    Date birthdate
}

Компилируем, и в байткоде получаем аналог вот этого:
Адский бойлерплейт на Джаве на 100 с лишним строк
import java.util.Date;
import java.util.Map;

public class Person {
    private int id;
    private String firstName;
    private String lastName;
    private Date birthdate;

    //Эта штука добавлена @TupleConstructor-ом
    public Person(Map parameters){
        this.id = (int) parameters.get("id");
        this.firstName = (String) parameters.get("firstName");
        this.lastName = (String) parameters.get("lastName");
        this.birthdate = (Date) parameters.get("birthdate");
    }

    public Person(int id, String firstName, String lastName, Date birthdate) {
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
        this.birthdate =birthdate;
    }

    public Person(int id, String firstName, String lastName) {
        this(id, firstName, lastName, null);
    }

    public Person(int id, String firstName) {
        this(id, firstName, null, null);
    }

    public Person(int id) {
        this(id, null, null, null);
    }

    public Person() {
        this(0, null, null, null);
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Person person = (Person) o;

        if (id != person.id) return false;
        if (birthdate != null ? !birthdate.equals(person.birthdate) : person.birthdate != null) return false;
        if (firstName != null ? !firstName.equals(person.firstName) : person.firstName != null) return false;
        if (lastName != null ? !lastName.equals(person.lastName) : person.lastName != null) return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result = id;
        result = 31 * result + (firstName != null ? firstName.hashCode() : 0);
        result = 31 * result + (lastName != null ? lastName.hashCode() : 0);
        result = 31 * result + (birthdate != null ? birthdate.hashCode() : 0);
        return result;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                ", birthdate=" + birthdate +
                '}';
    }

    public int getId() {
        return this.id;
    }

    public void setId(int paramInt) {
        this.id = paramInt;
    }

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String paramString) {
        this.firstName = paramString;
    }

    public String getLastName() {
        return this.lastName;
    }

    public void setLastName(String paramString) {
        this.lastName = paramString;
    }

    public Date getBirthdate() {
        return this.birthdate;
    }

    public void setBirthdate(Date paramDate) {
        this.birthdate = paramDate;
    }
}



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

Так зачем именно Groovy, почему AST transformations?
В этой статье я попробую вкраце обосновать, зачем пользоваться Groovy AST transformations в Java проектах, и (опять-же вкраце) рассказать какие AST transfromations есть в Groovy сегодня. Если вы уже знаете зачем, и хотите только «как и что», смело листайте к «Введение в AST transformations».
Читать почему и как AST transformations
Total votes 41: ↑31 and ↓10+21
Comments35

Проект Lombok, или Объявляем войну бойлерплейту

Reading time6 min
Views57K
Открою не Америку, но шкатулку Пандоры: в Java-коде много бойлерплейта. Типовые геттеры, сеттеры и конструкторы, методы ленивой инициализации, методы toString, hashCode, equals, обработчики исключений, которые никогда не выбрасываются, закрывалки потоков, блоки синхронизации. Проблема заключается даже не в том, чтобы написать всё это — современные среды разработки справляются с такими задачами нажатием нескольких клавиш. Сложность в поддержании бойлерплейта в актуальном состоянии по мере внесения модификаций в код. А в некоторых случаях (многопоточность, реализация методов hashCode и equals) и сам шаблонный код написать без ошибок — далеко не простая задача. Одним из решений проблемы является генерация кода, и в этой статье я расскажу про проект Lombok — библиотеку, которая не только может избавить вас от бойлерплейта, но и сделать это максимально прозрачно, с минимальной конфигурацией и, что немаловажно, с поддержкой на уровне среды разработки.
Читать дальше →
Total votes 47: ↑43 and ↓4+39
Comments39

Поиск причин странной производительности

Reading time5 min
Views20K

Введение


Наконец-то полез детально изучать Java-байткод, и почти сразу же в голове возник интересный вопрос. Есть там инструкция NOP, которая не делает ничего. Так вот, а как это «ничего» сказывается на производительности? Собственно, процесс изучения этого и описан в посте.

Дисклеймер


Сам рассказ, в первую очередь, не о том, как оно реально работает, а о том, каких ошибок стоит опасаться при измерениях производительности.
Читать дальше →
Total votes 51: ↑50 and ↓1+49
Comments30

Scala. Всем выйти из сумрака!

Reading time6 min
Views33K
А сейчас нужно обязательно дунуть, потому что если не дунуть, то ничего не получится.
—Цитаты великих

И здравствуйте!

Сегодня мы поговорим о неявном в языке Scala. Кто еще не догадался — речь пойдет об implicit преобразованиях, параметрах, классах и иже с ними.Все новички, особенно любители питона с зеновским Explicit is better than Implicit, обычно впадают в кататонический ступор при виде подкапотной магии, творящейся в Scala. Весь компилятор и принципы в целом охватить за одну статью удастся вряд ли, но ведь дорогу осилит идущий?
Вот мы и пойдем
Total votes 43: ↑36 and ↓7+29
Comments23

Путеводитель по методам класса java.util.concurrent.CompletableFuture

Reading time7 min
Views89K
Появившийся в Java8 класс CompletableFuture — средство для передачи информации между параллельными потоками исполнения. По существу это блокирующая очередь, способная передать только одно ссылочное значение. В отличие от обычной очереди, передает также исключение, если оно возникло при вычислении передаваемого значения.

Класс содержит несколько десятков методов, в которых легко потеряться. Данная статья классифицирует эти методы по нескольким признакам, чтобы в них было легко ориентироваться.
Читать дальше →
Total votes 22: ↑22 and ↓0+22
Comments13

Подключение графического планшета Wacom Pro в Linux или как bash помогает художникам

Reading time6 min
Views40K

Если вы счастливый обладатель Intuos Pro и гордый пользователь Linux, то возможно вас постигла та же самая неудача, что и меня. Все дело в том, что на момент написания этой статьи, не было нормальной поддержки последних моделей графических планшетов фирмы Wacom. Однако благодаря проекту Linux Wacom и нескольких bash скриптов эту проблему можно решить.
Рассказать
Total votes 31: ↑27 and ↓4+23
Comments20

Подсчет расстояния Хэмминга на большом наборе данных

Reading time8 min
Views49K
В данной статье речь пойдет об алгоритме HEngine и реализации решения проблемы подсчета расстояния Хэмминга на больших объемах данных.
Читать дальше →
Total votes 35: ↑32 and ↓3+29
Comments4

Java'o'Fido: продолжение

Reading time3 min
Views16K

Больше года прошло с того момента, как я начал писать проект jNode, и вот пришла пора первого релиза. Это вовсе не значит, что все это время проект был неиспользуемым, вовсе нет — только в российском регионе как минимум 5 узлов используют jNode. Но все это время проект был в стадии unstable. Хочешь использовать — скачай исходники, собери их, настрой конфигурационный файл и заполни базу данных начальными значениями. И никак иначе.

Но теперь ( наконец-то! ) пришла пора восстановить справедливость и дать возможность всем желающим поднять свой узел в Фидо просто и без проблем с минимальным приложением усилий. Кстати, я знаю, что Фидо мертво, все полимеры давно закончились, а мы — кучка старых ( и молодых ) маразматиков.
Читать дальше →
Total votes 47: ↑44 and ↓3+41
Comments53

Information

Rating
636-th
Location
Burnaby, British Columbia, Канада
Date of birth
Registered
Activity