Автор оригинала: FreeCodeCamp Community Member.
В 2008 году Центр городского экономического развития Обследование 4 387 Работники низкой заработной платы в Чикаго, Лос-Анджелесе и Нью-Йорке. Они хотели определить степень нарушений законов о занятости в основных секторах экономики США.
Они обнаружили, что:
- 76% тех, кто работал более 40 часов, не был оплачен законно требуется сверхурочный ставок.
- 68% образца испытали хотя бы одно нарушение, связанное с валютом в предыдущей рабочей неделе.
- Средний работник потерял 51 доллар в его или ее еженедельных дохода в размере 339 долларов из-за кражи заработной платы. Эта потеря преобразует более 2,652 долл. США в убытках в течение одного года (от общей суммы средней зарплаты в 17 616 долларов США).
Кроме того, эти исследования оценивают, что работники по всей стране теряют коллектив в размере 50 миллиардов долларов в год из-за кражи заработной платы.
Несмотря на то, что это исследование было проведено восемь лет назад, выводы по-прежнему актуальны: большинство работников низкозаготовки являются жертвами кражи заработной платы. Если они хотят восстановить их потерянную заработную плату, они должны обратиться к судам. Поскольку в эксплуатационных ситуациях работают так много работников с низким уровнем заработной платы, их работодатели не могут удержать необходимые записи, которые будут отображаться количество часов, которые работают работник, или оплата, которую работник получил каждую неделю. Без этих записей работники должны полагаться на их доказательства их рабочих часов и платить.
Часто адвокаты должны полагаться на клиентов, чтобы помнить, а затем построить график своих местонахождений в течение нескольких месяцев, что делает более слабый случай. Именно здесь начинается эта история.
За прошлый семестр, моя команда и я на Hack4Impact была возможность работать с Общественные юридические услуги Филадельфии (CLS), Pro-Bono юридическая клиника, которая служила более миллиона филадельфийцев с низким доходом с момента своего основания в 1966 году.
Нам было поручено создать веб-сайт для анализа истории местоположения Google клиента и создать расписание для всех времен, которые введены клиент, и вызовут введенный пользователем на рабочем месте. Намерение было использовать историю местоположения Google работников, чтобы дополнить свои собственные показания, чтобы обеспечить более твердый случай, насколько он должен задолжить клиент. Поскольку большинство потенциальных клиентов несут недорогих телефонов (как правило, Android) и не отслеживание истории местонахождения, это решение окажется невероятно полезным в качестве отправной точки для восстановления допустимого времени в качестве допустимого времени клиента для своего дела, предоставляя адвокаты адвокатов CLS + Paralegals совершенно новый источник доказательств из надежного источника.
Проект поток пользователя:
Наш оптимальный поток пользователя разработал следующее (Примечание, я помещаю фотографии этого из нашего живого продукта для вас, чтобы лучше визуализировать эти требования):
- Пользователь должен быть в состоянии добавить свой файл locationhistory.json (загруженный из Google Careat).
- Затем пользователь должен иметь возможность обработать данные их местоположения и отображаться на карте
- Затем пользователь должен иметь возможность выбрать область ограничительной коробки, содержащей грубую площадь их рабочего места.
- Затем пользователь должен иметь возможность выбрать день начала на неделю и отправить файл для обработки.
- История местоположения должна быть обработана в файл .csv. Этот файл должен иметь строки, содержащие количество времени, которое пользователь, проведенный в пределах ограничения для рабочего места (наряду с началом и временами окончания).
- Если пользователь уходит, а затем входит в рабочее место, они должны отображаться как отдельные строки. В конце недели общая сумма часов должна быть табачна и отображается в отдельном столбце.
Кроме того, все это нужно было сделать на передней части, чтобы избежать проблем с конфиденциальностью со хранением данных о местоположении на наших серверах. Эти требования, казалось, были относительно легко. Мало, что я понял, что анализ и отображение файла locationsistory.json, вероятно, будет самым сложным заданием.
Google LocationHistory.json Структура и первая попытка нагрузки:
Если вы не знали, Google следит за всем, что вы делаете. Более конкретно, они отслеживают свою историю местоположения, если у вас есть телефон Android и не выключил его сейчас. Если вы хотите, вы можете скачать свою историю на сегодняшний день, собираясь на mailout.google.com/settings/takeout И загрузка вашего файла в формате JSON (быть предупрежденным … это может быть огромным).
Мое местоположение History.json было размером около 59,9 МБ (у меня был телефон Android в течение двух лет), но некоторые клиенты, которые будут использовать нашу систему, могут иметь историю местоположения A несколько сотен мегабайт по размеру Отказ Пытаясь просто загрузить весь файл JSON в память, заставляет браузер для привязки примерно за 30 секунд перед запуском классической ошибки «AW Snap» на Chrome (обычно указывая на ошибку памяти).
На самом деле, при запуске этого на более мощной машине мы можем сделать снимок памяти и постараться посмотреть, что происходит. Для справки я использовал файл 59,9 МБ, который я загрузил в память.
Здесь мы видим, что результирующие размер кучи JS почти тройки фактического размера файла. Но на самом деле нам не нужно хранить весь массив в памяти, разбирать его для точек данных о местоположении, а затем подавать те точки в функцию, которая отображает их на карте. Мы могли бы просто сделать это все на лету … Тем не менее, это легче сказать, чем сделано.
Chanking & Oboe:
Первое решение, которое я подумал, что должен был попытаться разделить файл на более управляемые куски 512 килобайт одновременно. Однако у этого есть некоторые неотъемлемые недостатки, в основном, что файл, который я пытаюсь загрузить внутри, содержит большую «строку», которая имеет формат объекта JSON (но еще не объект). Таким образом, когда я решил разделить и обрабатывать файл в последовательных произведениях, которые длится 512 КБ, я могу легко столкнуться с ситуацией, когда я разрезал «объект» пополам.
Итак, теперь мне нужен способ отслеживать наполовину заполненные объекты/объекты, которые были отрезаны, и добавить/добавить их на следующие кусочки соответственно, чтобы убедиться, что все равно правильно. Хотя файл Google locationHistory.json – это относительно униформа, то то, как куски могут быть разделены не. К счастью, существует существующая библиотека, чтобы помочь позаботиться обо всех краевых случаях, которые могут возникнуть. Введите Oboe.js.
Oboe.js построен для того, чтобы иметь дело с JSON, исходящим из потокового источника. Кроме того, он может загрузить Джосовые деревья больше, чем доступная память на клиенте, так как он только обрабатывает один узел JSON одновременно, а затем удаляет узел из дерева памяти. Однако у меня нет потокового источника данных. К счастью, немного посмотрев вокруг кодовой базы Oboe, я обнаружил, что гобое может быть создано и пройдено данные через Emit Event.
Сам кодовой код гобой относительно прост в настройке. Файл JSON, на котором мы смотрим, имеет общую форму следующего.
{ "locations": [ { "timeStampMs": ..., "latitudeE7": ..., "longitudeE7": ..., "accuracy": ... }, { "timeStampMs": ..., "latitudeE7": ..., "longitudeE7": ..., "accuracy": ... }, ... ]}
За документацию на гобое, Местоположение
Узел должен быть целенаправлен, и любой подраздел, который будет передан в функцию обратного вызова, как показано в образце кода ниже.
Далее нам нужно выяснить способ пропустить куски этой функции. Сама функция Chunking Rize немного сложнее, но главная функциональность – обработать файл в частях 512 КБ одновременно. Функция принимает в самой файле (с ввода) и экземпляра Oboe.js (в нашем случае ОС
Переменная).
Примечание на строке 11 следующее:
oboeInstance.emit('data', chunk);
Эта линия содержит суть обработки гобой. Чанк будет отправлен нашему экземпляру гобоя в ОС
переменная как квазипоток данных.
Отображение точек:
Последнее, что нужно позаботиться о том, отображает данные. Мы решили использовать Lastlet.js, потому что он был довольно простым, и он имеет гораздо более разнообразную третью партийную библиотеку экосистемы, чем карты Google (или любая другая библиотека карты, которую я знаю).
Инициализация карты на div с ID = 'MAPID'
довольно простой:
Тем не менее, отображение более 1 миллиона точек данных о местоположении требует гораздо больше, чем то, что может обрабатывать библиотеку Base Lastlet.js. К счастью, многие решения с открытым исходным кодом используют иерархическую жадную кластеризацию к кластерным точкам на низких уровнях масштабирования и их кластера, поскольку уровень увеличения уровня масштабирования. Владимир Агафонкин из MapBox написал отличный блог на алгоритмическую сторону того, как работает этот процесс, и я бы очень поощрял вас на Проверьте это Отказ
Существующая реализация маркера кластеризации для листовки существует уже с Библиотека Prunecluster Отказ Эта библиотека отличается от остальных, потому что она не имеет реального верхнего предела до того, сколько очков он может обрабатывать (он ограничен только вычислительной мощностью клиента). Полученный рендер и время обновления удивительны.
Возвращаясь к нашему коду экземпляра Oboe.js, мы можем немного отредактировать его для учетной записи библиотеки Prunecluster:
Полученные результаты:
После внесения всех изменений, я наконец мог выполнять некоторые основные тесты, чтобы увидеть, стоили ли все эти оптимизации. Ниже приведены результаты (при каждом размере файла пять испытаний было сделано и время в среднем).
Результаты были потрясающими. Несмотря на то, что загрузка файла прямо в память было быстрее для небольших файлов, кусочки с помощью гобой потока окупаются в конце и дали почти линейную корреляцию между временем нагрузки и размером файла! В конце концов, мы приложили панель загрузки для анализатора, чтобы дать пользователю ощущение прогресса и прикрепить к нему некоторую статистику нагрузки.
И там у вас есть. Разбор истории местоположения Google на Frontend. Сервер не требуется. На самом деле, я принимаю сайт на странице GitHub прямо сейчас на Hack4Impact.Github.io/Cls Отказ
В целом, этот проект был огромным успехом. В ходе семестра я взаимодействовал с некоторыми из невероятных людей в юридических услугах сообщества для создания этого продукта, который поможет многим юридическим работникам на долгие годы. Я бы очень поощрял тех, кто знает, как программировать, чтобы воплощать свои навыки, чтобы помочь сообществам организациям лучше достичь своей миссии. Это невероятно полезный опыт для обеих сторон, и бросит вызов вам применить ваши навыки для создания устойчивых и функциональных продуктов.
Вы можете найти исходный код для проекта в наш репозиторий Отказ
Моя полная команда: Менеджер по продукту: Кришна Бхаратала, члены команды: Кэти Цзян, Даниэль Чжан, Санти Буэнахора и Рэйчел Н.