четверг, 17 августа 2017 г.

Duck Hierarchy

В этой статье больше шутки нежели полезной информацией.
Под влиянием книги Head First Design Patterns я когда-то давно нарисовал такую картинку.

Слева мы видим типичное наследование и проблему двойного наследования когда хотим реализовать в одном классе два поведения.
А справа наследование от абстрактного класса и реализация интерфейсов. В этом случае нам конечно придется писать под для каждого интерфейса, зато это провоцирует нас писать классы с одной обязанностью как и ожидает от нас один из пунктов принципа SOLID.

А под конец картинка про фабрику

вторник, 8 августа 2017 г.

Мой самый сложный SQL запрос

Я работу по большей части во фронтэнде на как-то раза два у меня была задача написать сложный SQL-запрос. В принципе получилось довольно быстро при использовании интернет. Может кому и пригодиться.

Задача 1 - посчитать количество ордеров определенного типа


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
DROP TABLE IF EXISTS Objects;
DROP TABLE IF EXISTS ObjectTypes;
DROP TABLE IF EXISTS Attrs;
DROP TABLE IF EXISTS Params;

CREATE TABLE Objects (id int, objectTypeId int, name varchar(30));
INSERT INTO Objects (id, objectTypeId, name) VALUES (1, 1, 'Order-Tv#1');
INSERT INTO Objects (id, objectTypeId, name) VALUES (2, 1, 'Order-Tv#2');
INSERT INTO Objects (id, objectTypeId, name) VALUES (3, 1, 'Order-Tv#3');
INSERT INTO Objects (id, objectTypeId, name) VALUES (4, 1, 'Order-Internet#1');
INSERT INTO Objects (id, objectTypeId, name) VALUES (5, 1, 'Order-Internet#2');
INSERT INTO Objects (id, objectTypeId, name) VALUES (6, 1, 'Order-Radio#1');

CREATE TABLE ObjectTypes (id int, name varchar(30));
INSERT INTO ObjectTypes (id, name) VALUES (1, 'order');

CREATE TABLE Attrs (id int, name varchar(30));
INSERT INTO Attrs (id, name) VALUES (1, 'not started');
INSERT INTO Attrs (id, name) VALUES (2, 'failed');
INSERT INTO Attrs (id, name) VALUES (3, 'success');

CREATE TABLE Params (objectId int, attrId int, val varchar(30));
INSERT INTO Params (objectId, attrId, val) VALUES (1, 1, '+');
INSERT INTO Params (objectId, attrId, val) VALUES (1, 2, '+');
INSERT INTO Params (objectId, attrId, val) VALUES (1, 3, '+');
INSERT INTO Params (objectId, attrId, val) VALUES (2, 1, '+');
INSERT INTO Params (objectId, attrId, val) VALUES (3, 2, '+');
INSERT INTO Params (objectId, attrId, val) VALUES (1, 3, '+');
INSERT INTO Params (objectId, attrId, val) VALUES (4, 1, '+');
INSERT INTO Params (objectId, attrId, val) VALUES (4, 4, '+');
INSERT INTO Params (objectId, attrId, val) VALUES (5, 1, '+');
INSERT INTO Params (objectId, attrId, val) VALUES (6, 1, '+');
INSERT INTO Params (objectId, attrId, val) VALUES (6, 2, '+');
INSERT INTO Params (objectId, attrId, val) VALUES (6, 4, '+');

SELECT t0."type", t1."failed", t2."success", t3."not started" FROM
        (
                SELECT name AS "type" FROM ObjectTypes WHERE id IN (1)
        ) AS t0
FULL OUTER JOIN
        (
                SELECT COUNT(*) as "failed" FROM Params, Objects WHERE
                Params.objectId IN (SELECT id FROM Objects WHERE objectTypeId IN (1))
                AND Params.attrId = 1
                AND Params.value = 'failed'
                AND Params.objectId = Objects.id
                GROUP BY objectTypeId
        ) as t1
ON t0.objectTypeId = t1.ObjectTypeId
FULL OUTER JOIN
        (
                SELECT COUNT(*) as "success" FROM Params, Objects WHERE
                Params.objectId IN (SELECT id FROM Objects WHERE objectTypeId IN (1))
                AND Params.attrId = 2
                AND Params.objectId = Objects.id
                GROUP BY objectTypeId
        ) as t2
ON t0.objectTypeId = t1.ObjectTypeId
FULL OUTER JOIN
        (
                SELECT COUNT(*) as "not started" FROM Params, Objects WHERE
                Params.objectId IN (SELECT id FROM Objects WHERE objectTypeId IN (1))
                AND Params.attrId = 3
                AND Params.objectId = Objects.id
                GROUP BY objectTypeId
        ) as t3
ON t0.objectTypeId = t1.ObjectTypeId;

Cначала находим все типа объектов в строке 55 и называем такую таблицу t0. Затем находим все объекты у которых тип это Order, а атрибут используется номер 1 и записываем результат в t1 (строка 58-65). То же самое повторяем для всех типов и затем склеиваем через JOIN. Конечно здесь есть не оптимальности типа копипаста t1-t3, но я же не SQL девелопер.

Отмечу, что запрос переписан и может не работать, т.к. я убирал всю специфику и чуть упростил запрос - убрал табличу и уменьшил количество типов, а там запрос у меня занимал А4 шрифтом 10.

Задача 2 - пробежаться по иерархии

Здесь задача посложнее нужно пробежаться по иерархии Order и найти все Offering, причем Offering из родительского Order может быть заоверрайджен, тогда его показывать не нужно.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
(
  /*compatibility - get Offerings FROM Order which are children for Order Container*/
  SELECT
    OrderOffering.id AS objectId,
    OrderOffering.name AS value
  FROM
    Objects OrderContainerOffering,
    Objects OrderContainerOfferingFolder,
    Refs OrderContainer2Order,
    Objects OrderOfferingFolder,
    Objects OrderOffering
  WHERE
    OrderContainerOffering.id IN (#$objectids$#)
    AND OrderContainerOfferingFolder.id = OrderContainerOffering.parentId
    AND OrderContainer2Order.objectId = OrderContainerOfferingFolder.parentId
    AND OrderContainer2Order.attrId = 1 /*order*/
    AND OrderOfferingFolder.parentId = OrderContainer2Order.objectRefId
    AND OrderOfferingFolder.typeId = OrderContainerOfferingFolder.typeId
    AND OrderOffering.parentId = OrderOfferingFolder.id
    AND OrderOffering.typeId = 1 /*offering*/
)
UNION
(
  /*get Offerings FROM Order hierarchy*/
  SELECT
    ParentOrderOffering.id AS objectId,
    ParentOrderOffering.name AS value
  FROM
    Objects OrderOffering,
    Objects OrderOfferingFolder,
    Objects ParentOrderOfferingFolder,
    Objects ParentOrderOffering
  WHERE
    OrderOffering.id IN (#$objectids$#)
    AND OrderOfferingFolder.id = OrderOffering.parentId
    AND ParentOrderOfferingFolder.parentId IN (
      /*get all parent Orders*/
      SELECT reference FROM Refs ref
      START WITH ref.objectId = OrderOfferingFolder.parentId
      /*OrderOfferingFolder.parentId: parent of Offering Folder
        is Order AND this is Order to start find parents FROM*/
      CONNECT BY PRIOR ref.objectRefId = ref.objectId 
      AND PRIOR ref.attrId = 2 /*parent order*/
    )
    AND ParentOrderOffering.parentId = ParentOrderOfferingFolder.id
    AND ParentOrderOffering.typeId = 1 /*offering*/
    AND ParentOrderOffering.id not IN (
      /*exclude Offerings which are already overrided - 
        only not overrided Offerings available for override*/
      SELECT reference FROM Refs WHERE attr_id = 3 /*ancestor offering*/
      AND objectId IN (
        /*SELECT Offerings which are set IN attr ancestor offering*/
                SELECT /*get offerings FROM order hierarchy*/
          ParentOrderOffering.id AS objectId
                FROM
          Objects OrderOffering,
          Objects OrderOfferingFolder,
          Objects ParentOrderOfferingFolder,
          Objects ParentOrderOffering
                WHERE
          OrderOffering.id IN (#$objectids$#)
          AND OrderOfferingFolder.id = OrderOffering.parentId
          AND ParentOrderOfferingFolder.parentId IN (
            /*get all parent orders*/
            SELECT reference FROM Refs ref
            START WITH ref.objectId = OrderOfferingFolder.parentId
            /*OrderOfferingFolder.parentId: parent of Offering folder 
              is Order AND this is Order to start find parents FROM*/
            CONNECT BY PRIOR ref.reference = ref.object_id 
            AND PRIOR ref.attr_id = 2 /*attr parent order*/
            UNION ALL
            SELECT id FROM Objects 
            WHERE id = OrderOfferingFolder.parentId /*plus current Order*/
          )
          AND ParentOrderOffering.parentId = ParentOrderOfferingFolder.id
          AND ParentOrderOffering.typeId = 1 /*offering*/
      )
    )
)

Итог

  • я познакомился с иерархическими запросами - START WITH
  • первый раз использовал UNION
  • наконец в боевых условиях использовал JOIN
  • попрактиковался в сложных WHERE и GROUP BY
  • использовал вложенные запросы
  • сделал параметризацию запросов
  • попробовал AS для именования
SQL не такой уж и сложный поначалу, хотя конечно чем дальше тем дремучей лес.

понедельник, 7 августа 2017 г.

Периодически забываю как делать сложные enum с поиском по строке (метод valueOfPretty), поэтому вот заготовка.

public enum EnumExample {
    ZERO(0, "zero value"),
    ONE(1, "one value"),
    NULL(-1, "null value") {
        @Override
        public String toString() {
            return super.toString() + "special null value";
        }
    };

    private int value;
    private String description;

    EnumExample(int value, String description) {
        this.value = value;
        this.description = description;
    }

    public String asPretty() {
        return this.name().toLowerCase();
    }

    public static EnumExample valueOfPretty(String s) {
        for (EnumExample state : EnumExample.values()) {
            if (state.asPretty().equals(s)) {
                return state;
            }
        }
        return null;
    }
}

среда, 5 июля 2017 г.

Коротко о frontend performance.

Насмотрелся я как-то видео и начитался статей о performance в мире frontend и решил задокументировать кратко походы. Подробное описание можно найти в интернете или в литературе внизу. Итак мой список пунктов связанных с performance, которые можно использовать для улучшения\оценки производительности:

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

  1. Оптимизируйте код (например HashMap вместо Array)
  2. Профайл для поиска узких мест
  3. WebWorker для ресурсоемких операций
  4. Server-side rendering
  5. PWA
  6. defer\async in HTML
  7. Разделять чтение дома и запись, например fast-dom библиотека
  8. СSS анимации выполняются на gpu в отличие от js
  9. requiestAnimationFrame
  10. will-transform
  11. dom layout (через transfomZ(0) или will-change: transform)
  12. изменение innerHtml или размера ведет к перерисовке всего документа\слоя
  13. dns-prefetch, preconnect, prefetch, pretender, preload

Производительность сборки

  1. CDN (сервер должен быть ближе к клиенту)
  2. HTTP Cache Headers
  3. WebP images
  4. WOFF2 fonts или стандартные системные
  5. Code-splittind 
  6. Tree-shaking
  7. Core js\css load immediatelly and advanced js\css on DomContentLoaded (extra on Load)
  8. Service Worker for HTTPS
  9. Brotli or Zopfli compression (+20%)
  10. js\css minification, lazy sourcemaps
  11. image minification с потерей качества
  12. icons in base64

Производительность мозга (mind tricks)

  1. Что бы разница была заметна нужна разница в 20% времени
  2. 100ms response
  3. 16ms for frame
  4. 1.25sec for interaction (3sec for 3G)
  5. Предсказывать поведение пользователя (например при hover на search можно начать подгружать результат)
  6. 14 kb for critical.css
  7. как можно быстрее перевести пользователя из пассивного ожидания в активное
  8. наприсовать сначала видимую часть, потом подгрузить все что ниже по скроллу или на другом state-route

Литература

пятница, 23 июня 2017 г.

NPM auto publish via gulp

В мире JS все как-то несколько криво и не отточено в отличие от Java. Очень хорошо иллюстрирует положение вещей эту картинка
Одна из проблем то что нельзя легко настроить публикацию npm через таску в gulp. Очень долго искал и еле нашел всего в одном месте поэтому публикую решение здесь чтобы распространить решение и не потерять его. Исходное решение - http://blog.entelect.co.za/automatically-publish-to-npm-using-gulp-teamcity, к сожалению исходно решение уже недоступно

Зависимости
npm i npm --save-dev
npm i fs --save-dev

Примерно такие зависимости должны быть установлены
fs@0.0.1-security or file-system@2.2.2
npm@4.1.2

Код
var npm = require('npm');
var fs = require('fs');

gulp.task('npm-publish', function (callback) {
    var uri = ""; //uri to npm, e.g. https://registry.npmjs.org/
    var username = ""; 
    var password = "";
    var email = ""; 
 var dist = ""; //path to dist folder with package.json

    if (!username) {
        var usernameError = new Error("Username is required as an argument --username exampleUsername");
        return callback(usernameError);
    }
    if (!password) {
        var passwordError = new Error("Password is required as an argument --password  examplepassword");
        return callback(passwordError);
    }
    if (!email) {
        var emailError = new Error("Email is required as an argument --email example@email.com");
        return callback(emailError);
    }
    npm.load(null, function (loadError) {
        if (loadError) {
            return callback(loadError);
        }
        var auth = {
            username: username,
            password: password,
            email: email,
            alwaysAuth: true
        };
        var addUserParams = {
            auth: auth
        };
        //adduser and login are the same command
        npm.registry.adduser(uri, addUserParams, function (addUserError, data, raw, res) {
            if (addUserError) {
                return callback(addUserError);
            }
            var metadata = require(dist+"/package.json");
            metadata = JSON.parse(JSON.stringify(metadata));
            npm.commands.pack([dist], function (packError) {
                if (packError) {
                    logout(addUserParams, data.token);
                    return callback(packError);
                }
                var fileName = metadata.name + '-' + metadata.version + '.tgz';
                fileName = fileName.replace("@","").replace("/","-");
                var bodyPath = require.resolve('./' + fileName);
                var body = fs.createReadStream(bodyPath);
                var publishParams = {
                    metadata: metadata,
                    access: 'public',
                    body: body,
                    auth: auth
                };
                npm.registry.publish(uri, publishParams, function (publishError, resp) {
                    if (publishError) {
                        deleteArchive(fileName);
                        logout(addUserParams, data.token);
                        return callback(publishError);
                    }
                    console.log("Publish succesfull: " + JSON.stringify(resp));
                    deleteArchive(fileName);
                    logout(addUserParams, data.token, callback);
                });
            })
        });
    });
    function logout(addUserParams, token, callback) {
        addUserParams.auth.token = token;
        npm.registry.logout(uri, addUserParams, function (logoutError, data, raw, res) {
            if (callback) {
                if (logoutError) {
                    return callback(logoutError);
                }
                return callback();
            }
        });
    }
    function deleteArchive(filePath) {
        gulp.src(filePath).pipe(plugins.rimraf());
    }
});

четверг, 15 июня 2017 г.

Как получить военник

Решил я получить законный военник, но не тут то было...

Введение


Я учился в аспирантуре, она закончилась когда мне было 25 лет, однако кандидатскую получил только в 28 лет. Призывной возраст заканчивается в 27 лет. Я подождал кандидатскую и после ее получения решил получить военник. Отмечу, что вроде бы, у меня были законные отсрочки, а именно в промежуток 25-27 лет у меня родился сын (там дается какая-то отсрочка около 3 месяцев до и после рождения), а также я прикреплялся на пару месяцев к другой аспирантуре (повторное обучение вроде тоже дает отсрочку). 

Иду в военкомат на разведку


Для начала надо было выяснить что нужно сделать чтобы начать процесс получения военника. Пришел я в военкоммат меня отправили то туда то сюда, говорили типа кто ты такой, мы не знаем что делать с тобой, ты уже не призывник, не можем тебе дать военник и вообще иди отсюда. 
Весело подумал я, но кое как я выяснил что нужно принести справки и документы о себе, мне дали такие листочки где было написан список документов:
  1. фото 3х4 – 2 шт.
  2. паспорт
  3. свидетельство о рождении
  4. свидетельство о браке
  5. свидетельство о рождении детей
  6. диплом высшего образования
Очевидно к ним прибавляются справки о том что я учился в аспирантуре с указанием срока и диплом кандидатской.

Также дали лист для прохождения медицинской комиссии формата A4, чтобы пройти диспансеры и анализы:
  1. ЭКГ (кардиограмма) с расшифровкой
  2. ККФ (флюорография)
  3. справка об общем анализе крови
  4. справка об общем анализе мочи
  5. справка об исследовании: RW, ВИЧ, НВ, HCV
  6. справка от терапевта за 5 лет
  7. справка из кожно-венерологического диспансера
  8. справка из противотурберкулезного диспансера
  9. справка из наркологического диспансера
  10. справка из психоневрологического диспансера
  11. карточка из поликлиники
Небольшое отступление - военкомат для выдачи билета должен сделать бюрократическую процедуру: 1) провести медкомисиию для установления годности; 2) провести комиссии которая решает давать билет или справку "уклониста" или забирать в армию; 3) выдать документ или забрать в армию.

Готовлю анализы


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

Отмечу что "справка от терапевта за 5 лет" берется в поликлинике где вы прикреплены. В моем случае я там не появлялся очень долго, поэтому было написано медицинскими терминами фраза "за 5 лет ничем не болел". На ней ставится печать врача.
А вот "карточку из поликлиники" мне не дали сказали что на руки не выдается (приказ Министерства Здравоохранения от 29.11.2010г. №1256)

Диспансеры пришлось объезжать самому. Здесь самое проблемное это наркодиспансер, где нужно ждать 2 недели, а кожвен дает справку сроком действия на 3 недели.

Если кому нужно то для советского района в Самаре, т.к. чтобы их найти пришлось покапаться в инете, позвонить и еще поездить, т.к. иногда перенеправляли
  • нарк - Партизанская, 130
  • кожвен - Революционная 138, но для военкомата надо ехать кажется на Степана Разина, 53
  • псих - 22 Партсъезда 12
  • противотуберкулез (возьмите с собой марлевую повязку на лицо) - Революционная 66

А вот остальные анализы я сделал в платных клинниках, это разрешено законом, главное взять у низ лицензии (хотя мне они не пригодились). 

Если кому-то пригодится то в Самаре анализы можно сдавать в ПрофМедЦентр для военкоммата, Эксперт-Профит здесь я сдавал только флюрографию, т.к. они сказали что военкоммат постоянно придирается к ним, зато там можно на права все анализы сдать в обном месте. Самарский диагностический центр - здесь я делал ЭКГ с расшифровкой.

Обязательно берите везде листок медицинской комиссии формата A4, т.к. большинство диспансеров ставят туда печати.

Отправка документов


Я долго думал стоит отнести документы самому или как  я прочитал в ините можно отправить письмом. Но теперь я точно знаю ВСЕ ДЕЛА С ВОЕНКОММАТОМ НАДО ВЕСТИ ЧЕРЕЗ ПОЧТУ РОССИИ ЧЕРЕЗ ЗАКАЗНЫЕ ПИСЬМА С УВЕДОМЛЕНИЕМ.

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

Тут сделаю отступления про почту - у них даже уведомлений не было! Поэтому если кому нужно конверты и уведомления заполняем и печатаем через сервисы;
  • Уведомление о вручении ф 119 - http://formz.ru/forms/uvedomlenie/
  • конверт C4 (для документов A4) - http://konvert-online.ru/

Через 1-2 недели мне позвонили и уже приятным голосом пригласили на прохождение комиссии.

Мед комиссия


Почти прошел комиссию, только хирург завернул сказал принести рентген шеи, т.к. она у меня проблемная, а я принес только заключение. Нашел в инете что подходит МРТ - пошел в туже больницу где я его делал и распечатал МРТ на пленке с диска.

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

Попытка № 2


Я конечно расстроился, но подумав, успокоившись, решил мне уже больше 27 лет, а значит по закону они мне должны в любом случае выдать документ, тем более что никаких доп обследований выписано не было, а значит они нарушают мои права. В результате я написал заявление. В нем были следующие моменты
  1. Отказ отдавать оригиналы, т.к. военкомат их часто теряет из моего опыта и из опыта знакомых и инета. Тем более по закону они обязаны принять копии.
  2. Отказ от рентгена в пользу МРТ
  3. Отказ от прохождения доп исследований, т.к. у меня и так полно исследований по шее, а если нужно то пусть скажут какие именно
  4. Ну и в случае отсутствия реакции готовность идти в областной военкома (очевидно что дальше прокуратура)
Пример заявления с ссылками на закон:

Также я отправил копию военкому на всякий случай. 

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

Получение военника


Наконец еще через неделю пригласили придти забрать военник, именно военник а не справку "уклониста".

Выводы


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

Литература


Здесь приведены ссылки на ресурсы где я искал законы и алгоритм как общаться с военкоматом.

вторник, 6 июня 2017 г.

Госуслуги и загранпаспорт

Однажды появилась необходимость получить загранпаспорт. А поскольку мы живем в 21 веке, то было принято получить паспорт через госуслуги. При поиске информации в интернете на момент получения паспорта (2012 год) где-то половина ресурсов говорила совершенной неуклюжести сайта госуслуг (ошибки работы, недоступность, непонимание паспортисток когда приходишь получать паспорт через сайт и др.) и половина хороших отзывов (видимо работа над ошибками все таки ведется).
Хочу сразу сказать, что паспорт я получил не так легко, но и не так сложно как я ожидал это от государственных организаций. Итак в данной статье описан мой полный путь получения загранпаспорта.

1. Регистрация на госулугах

На сам сайт можно перейти через www.gosuslugi.ru. Во время регистрации предложат получить логин\пароль через обычную почту (с ожиданием в 2 недели) или можно самому явиться в отдел Ростелекома с паспортом (это можно уже сделать на следующий день). Я воспользовался последним вариантом.

2. Сбор бумаг

Из бумаг вам понадобиться:
  1. Паспорт (и старый загранпаспорт если есть)
  2. Фото
  3. Гос пошлина
  4. Список мест работ
  5. Справка из военкомата
Паспорт. С паспортом все понятно - нужно взять его с собой.

Фото. Нужно приложить фото при отправке электронного заявления госуслуг - вас попросят его прикрепить. Чтобы получить электронную версию фото, вы можете во-первых сами сфоткаться, во-вторых попросить в пунке "печати фото на документы" дать вам файл. Когда вы будете выкладывать фото в госуслуги у вас может это не получиться, т.к. есть ограничение на размер, формат фото и то что 70-80% фото должно быть заполнено вами. Тут вам нужно будет поиграть с paint и обрезать\сжать фото.

Госпошлина. Поскольку я получал паспорт нового образца госпошлина в то время была равна 2500р. Оплатить ее можно либо в самом УФМС (здание, где получают загранпаспорт - гагарина 66а) либо в сбербанке. Я оплатил в сбербанке примерно за неделю до назначенного срока предоставления документов. Это также удобно с той точки зрения, что почти без очереди и без знания реквизитов для оплаты можно подойти к работнику сбербанка, которые обычно стоят на входе и отвечают на вопросы. Он подскажет какие кнопки нужно нажать в терминале, чтобы оплатить госпошлину. Вам остается только сунуть денег в терминал и получить чек (чек также является документом, подтверждающим оплату, как и квитанция). В результате получаем вот такой чек:
Если вам все таки нужны реквизиты то уточните их либо на госулугах, либо на сайте местного УФМС. На чеке есть реквизиты получателя, но они могли устареть.

Update: Также сейчас появилась возможность оплатить некоторые пошлины прямо на сайте госуслуги со скидкой, правда кто-то говорит что оплата иногда не доходит и деньги придется возвращать уже вручную (писать заявление, ехать куда-то) 

Список мест работ. На сайте госулуг вам предложат заполнить форму мест работ где вы работали в течении 10 предыдущих лет. Если бы вы получали паспорт не через госулуги вам бы пришлось заполнять и подписывать на работе документ. Но я все же советую вам его скачать и заполнить, т.к. не только у меня был случай когда заполненные данные не отправлялись и приходилось заполнять все заново. Также иногда возникает вопрос как писать две работы и в каком порядке. Здесь можно расположить работы по дате устройства на работу. Либо как вариант вообще не писать вторую работу, чтобы не запутаться. Если что-то будет не верно от госуслуг придет письмо с описанием ошибок. Если вы не работали больше двух месяцев нужно это также указывать. В качестве адреса - писать адрес прописки на тот момент. Также обратите внимание на то что нужно писать где учились. И нужно писать о работе за 10 лет (например если вы описали работы за 9 лет и 11 месяцев, получение загранпаспорта отклонят). Если все будет верно заявку на паспорт пропустят дальше, больше о списке работ беспокоится не придется.

Справка из военкомата. Если вам больше 27 лет, то нужен военник, если меньше, то идете в военкомат в призывной пункт, говорите что вам нужна справка для получения загран паспорта. Они вам диктуют форму заявления вида "Начальнику военкомата ... прошу предоставить справку что от призывной службы не уклонялся". Недели через две они вам ее выдадут, т.к. что лучше начать со справки.

4. Предъявление бумаг для получения паспорта

В 2012 году была беда с получением паспорта, не смотря на госуслуги и электронную очередь. А именно летом электронная очередь была отключена. Желающих получить паспорт было море. Первый раз я пришел к 09:00 и увидел очередь человек 100 вокруг здания. Решение было таким. В 06:00 приехать к УФМС, там уже кто-то был и были списки - записываешься в этот список почти первым и ждешь время начала работы. Или идешь гулять или идешь домой спать и возвращаешься к моменту начала работы. Правда и тут вас может подстерегать беда - в одни из дней сломались компьюторы и пришлось идти домой ни с чем.
Зайдя в здание вы идете к аппарату и берете талончик электронной очереди. Ждете очередь. Заходите. Показываете паспорт, справку военкомата, госпошлину, фоткаетесь.

Update: Но думаю сегодня все уже более отлажено и не будет таких очередей.

5. Получения паспорта

Алгоритм такой же как и в предыдущем пункте, только разве что получени происходит быстрее - расписываешь и получаешь. Возможно вас попросят показать старый загранпаспорт, например чтобы сделать его недействительным.

Полезные ссылки