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

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



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

      При экспорте в zip создаются архивы максимум по 2 ГБ, так что лучше выбрать .tgz или .tbz (50 ГБ макс.). После создания архива скачать его можно не более пяти раз.
    • Кто шутит над голливудскими студиями?

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

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


        Читать дальше →
      • Снятие защиты Amazon DRM с электронных книг

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

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

        1. Calibre.
        2. Kindle for PC.
        3. Плагин K4MobiDeDRM для Calibre, из комплекта DRM Removal Tools.
        Читать дальше →
      • Строго типизированное представление неполных данных

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

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

          Читать дальше →
          • +17
          • 7.3k
          • 2
        • Отладка Java приложения, которое нельзя остановить. Ловим экзотику выполнения самыми доступными средствами — BTrace подход

          • Tutorial

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

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

          Как же это ?...
        • Автоматическое определение подключения\отключения второго монитора

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


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

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


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

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

            xrandr --auto
            


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

            --mode

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

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

            Читать дальше →
          • Геокодер OSM на Java

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

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

              Читать дальше →
            • Конструирование типов в Scala

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

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


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


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


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

                Читать дальше →
                • +12
                • 8.4k
                • 8
              • Ввод паролей при сборке проектов с помощью gradle

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

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

                Теперь можно использовать пароль в любом месте скрипта сборки, и все готово… ой, тогда это будет слишком короткий пост, поэтому теперь поговорим о проблемах.
                Читать дальше →
              • Разъяснение http2

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

                  Как мне кажется, на сегодняшний день это одно из самых лучших разъяснений о том, что такое протокол http2, зачем он нужен, как он повлияет на веб-разработку и какое будущее ждёт Интернет в связи с его появлением. Думаю, что всем людям, причастным к веб-разработке и веб-строению, информация будет полезна, ведь ожидается, что стандарт http2 будет принят уже в июне этого года после завершающей встречи группы HTTPbis в Нью Йорке.
                  Читать дальше →
                • JSR 133 (Java Memory Model) FAQ (перевод)

                    Добрый день.
                    В рамках набора на курс «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» проблему?
                    Что если я пишу виртуальную машину?
                    Почему я должен беспокоиться?
                    Читать дальше →
                  • Отладка Java приложения, когда оно совсем не ждёт — добро пожаловать в InTrace подход

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

                    Именно этим мы и займёмся.
                    Узнать больше ...
                  • Трансформации AST — Первый шаг к тяжёлым веществам

                      А давайте сделаем 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
                    • Проект Lombok, или Объявляем войну бойлерплейту

                        Открою не Америку, но шкатулку Пандоры: в Java-коде много бойлерплейта. Типовые геттеры, сеттеры и конструкторы, методы ленивой инициализации, методы toString, hashCode, equals, обработчики исключений, которые никогда не выбрасываются, закрывалки потоков, блоки синхронизации. Проблема заключается даже не в том, чтобы написать всё это — современные среды разработки справляются с такими задачами нажатием нескольких клавиш. Сложность в поддержании бойлерплейта в актуальном состоянии по мере внесения модификаций в код. А в некоторых случаях (многопоточность, реализация методов hashCode и equals) и сам шаблонный код написать без ошибок — далеко не простая задача. Одним из решений проблемы является генерация кода, и в этой статье я расскажу про проект Lombok — библиотеку, которая не только может избавить вас от бойлерплейта, но и сделать это максимально прозрачно, с минимальной конфигурацией и, что немаловажно, с поддержкой на уровне среды разработки.
                        Читать дальше →
                      • Поиск причин странной производительности

                        Введение


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

                        Дисклеймер


                        Сам рассказ, в первую очередь, не о том, как оно реально работает, а о том, каких ошибок стоит опасаться при измерениях производительности.
                        Читать дальше →
                      • Scala. Всем выйти из сумрака!

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

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

                          Сегодня мы поговорим о неявном в языке Scala. Кто еще не догадался — речь пойдет об implicit преобразованиях, параметрах, классах и иже с ними.Все новички, особенно любители питона с зеновским Explicit is better than Implicit, обычно впадают в кататонический ступор при виде подкапотной магии, творящейся в Scala. Весь компилятор и принципы в целом охватить за одну статью удастся вряд ли, но ведь дорогу осилит идущий?
                          Вот мы и пойдем
                        • Путеводитель по методам класса java.util.concurrent.CompletableFuture

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

                            Класс содержит несколько десятков методов, в которых легко потеряться. Данная статья классифицирует эти методы по нескольким признакам, чтобы в них было легко ориентироваться.
                            Читать дальше →
                          • Подключение графического планшета Wacom Pro в Linux или как bash помогает художникам


                            Если вы счастливый обладатель Intuos Pro и гордый пользователь Linux, то возможно вас постигла та же самая неудача, что и меня. Все дело в том, что на момент написания этой статьи, не было нормальной поддержки последних моделей графических планшетов фирмы Wacom. Однако благодаря проекту Linux Wacom и нескольких bash скриптов эту проблему можно решить.
                            Рассказать
                          • Java'o'Fido: продолжение


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

                              Но теперь ( наконец-то! ) пришла пора восстановить справедливость и дать возможность всем желающим поднять свой узел в Фидо просто и без проблем с минимальным приложением усилий. Кстати, я знаю, что Фидо мертво, все полимеры давно закончились, а мы — кучка старых ( и молодых ) маразматиков.
                              Читать дальше →