{"id":4355,"date":"2020-06-23T07:58:25","date_gmt":"2020-06-23T07:58:25","guid":{"rendered":"https:\/\/blog.parcello.org\/?p=4355"},"modified":"2020-06-23T08:50:18","modified_gmt":"2020-06-23T08:50:18","slug":"devlog-3-launch-us-version-usps-fedex-post-at","status":"publish","type":"post","link":"https:\/\/www.parcello.org\/blog\/2020\/06\/23\/devlog-3-launch-us-version-usps-fedex-post-at\/","title":{"rendered":"Devlog #3 \u2013 Launch US Version &#8211; USPS, FedEx, Post AT"},"content":{"rendered":"<p>Yesterday we reached a milestone by launching our service in the USA. It is available via <a href=\"https:\/\/www.parcello.org\/us\/\">https:\/\/www.parcello.org\/us\/<\/a><\/p>\n<p>Besides the straight forward tasks, we had to solve a few obstacles.<\/p>\n<h3>Different Timezones &#8211; Is it today, tomorrow or yesterday?<\/h3>\n<p>If you look up an address in Germany it is quite simple, because the server timezone is the same as the user timezone. You can easily determine if it is tomorrow, today, or yesterday. Not so easy, if you are a few thousand kilometers away. Therefore we had to find a way to get the timezone offset for every possible address in the world.<\/p>\n<p>There are a few paid API&#8217;s, from google, bing etc, but with our amount of traffic this is just too expensive. Luckily there is a python script outhere, which does the job for you: <a href=\"https:\/\/github.com\/MrMinimal64\/timezonefinder\" target=\"_blank\" rel=\"noopener\">Timezonefinder by MrMinimal64<\/a>. If you want to access python scripts via php, don&#8217;t use curl_exec&#8230; it is way too slow with many users. Instead we found a way to spawn a localhost api with <a href=\"https:\/\/webpy.org\/\" target=\"_blank\" rel=\"noopener\">web.py.<\/a> Then you can access your endpoint with almost zero loss via curl.<\/p>\n<h3>Regional holidays for each country, state and city<\/h3>\n<p><a href=\"https:\/\/www.parcello.org\/us\/deliverytimes\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-4358 size-large\" src=\"https:\/\/blog.parcello.org\/wp-content\/uploads\/2020\/06\/Screenshot-2020-06-23-at-08.28.23-1024x358.png\" alt=\"\" width=\"1024\" height=\"358\" srcset=\"https:\/\/www.parcello.org\/blog\/wp-content\/uploads\/2020\/06\/Screenshot-2020-06-23-at-08.28.23-1024x358.png 1024w, https:\/\/www.parcello.org\/blog\/wp-content\/uploads\/2020\/06\/Screenshot-2020-06-23-at-08.28.23-300x105.png 300w, https:\/\/www.parcello.org\/blog\/wp-content\/uploads\/2020\/06\/Screenshot-2020-06-23-at-08.28.23-768x269.png 768w, https:\/\/www.parcello.org\/blog\/wp-content\/uploads\/2020\/06\/Screenshot-2020-06-23-at-08.28.23-1536x537.png 1536w, https:\/\/www.parcello.org\/blog\/wp-content\/uploads\/2020\/06\/Screenshot-2020-06-23-at-08.28.23-2048x716.png 2048w, https:\/\/www.parcello.org\/blog\/wp-content\/uploads\/2020\/06\/Screenshot-2020-06-23-at-08.28.23-45x16.png 45w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><noscript><img decoding=\"async\" class=\"aligncenter wp-image-4358 size-large\" src=\"https:\/\/blog.parcello.org\/wp-content\/uploads\/2020\/06\/Screenshot-2020-06-23-at-08.28.23-1024x358.png\" alt=\"\" width=\"1024\" height=\"358\" srcset=\"https:\/\/www.parcello.org\/blog\/wp-content\/uploads\/2020\/06\/Screenshot-2020-06-23-at-08.28.23-1024x358.png 1024w, https:\/\/www.parcello.org\/blog\/wp-content\/uploads\/2020\/06\/Screenshot-2020-06-23-at-08.28.23-300x105.png 300w, https:\/\/www.parcello.org\/blog\/wp-content\/uploads\/2020\/06\/Screenshot-2020-06-23-at-08.28.23-768x269.png 768w, https:\/\/www.parcello.org\/blog\/wp-content\/uploads\/2020\/06\/Screenshot-2020-06-23-at-08.28.23-1536x537.png 1536w, https:\/\/www.parcello.org\/blog\/wp-content\/uploads\/2020\/06\/Screenshot-2020-06-23-at-08.28.23-2048x716.png 2048w, https:\/\/www.parcello.org\/blog\/wp-content\/uploads\/2020\/06\/Screenshot-2020-06-23-at-08.28.23-45x16.png 45w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/noscript><\/a><\/p>\n<p>In the past we used an outdated pear holiday library and added regional holidays from time to time by hand. To scale our service this method was no longer practical due to high maintenance. We found the NodeJS script <a href=\"https:\/\/github.com\/commenthol\/date-holidays\" target=\"_blank\" rel=\"noopener\">Date Holidays by commenthol<\/a> which is fast and well maintained. To access the nodeJS Script we did the same as with python and spawned a local api. In contrast to python you have to use a cluster to give the NodeJS script multithreading abilities. <a href=\"https:\/\/www.skysilk.com\/blog\/2018\/node-js-multithreading\/\" target=\"_blank\" rel=\"noopener\">Thanks Gaby for your help<\/a>.<\/p>\n<p>Missing House Numbers in the OSM Data<\/p>\n<p>In the <a href=\"https:\/\/blog.parcello.org\/2020\/05\/24\/devlog-2-adressen-corona-app-und-weitere-zusteller\/\" target=\"_blank\" rel=\"noopener\">last post<\/a> I told you, that we shopped a new High Performance Server to use it for Nominatim. So we installed everything, updated the database and copied all data to <a href=\"https:\/\/github.com\/komoot\/photon\" target=\"_blank\" rel=\"noopener\">photon<\/a>, the elastic search autocomplete geocoder, just to find out, that the responses were not improving and still many many house numbers are missing. Thanks to a hint from the <a href=\"https:\/\/www.komoot.com\/\" target=\"_blank\" rel=\"noopener\">komoot<\/a> developers, we developed a hybrid version which combines OSM Data with the fee-based API from HERE WeGo.<\/p>\n<p>With this approach it should be possible to find most addresses. The new system is already live on the web system, the app will follow in the next weeks.<\/p>\n<h3>Different languages and logic<\/h3>\n<p>With new countries, we had to provide more languages. We had to find a way to make sure our algorithms are not affected by the different languages. So we have written a language parser, right before a request is delivered to the frontend, to translate all messages and path informations. The German company Linguee recently released an amazing API for their machine learning translation service DeppL. <a href=\"https:\/\/www.deepl.com\/translator\" target=\"_blank\" rel=\"noopener\">Check it out, it is magic!\u00a0<\/a><\/p>\n<h3>New Carriers USPS, FedEx, POST AT<\/h3>\n<p>With our new system we are able to add new carriers to the system, and our AI spawns children to detect the characteristics of each delivery company and service. For now we have added USPS, FedEx and Austrian Post. A newly supported tracking id should be detected automatically via the app.<\/p>\n<h3>Test it to the limit<\/h3>\n<p>The new system might have bugs. So please inform us, if you find something! Thank you!<\/p>\n<h3>We are looking for a Full-Time Developer<\/h3>\n<p>If you want to be part of our mission to predict every parcel up to 15 minutes accuracy and if you are interested \/ skilled in Machine Learning, python, nodejs, ionic, elastic search<a href=\"https:\/\/blog.parcello.org\/wp-content\/uploads\/2020\/05\/Full-Stack-Developer-m_w_d.pdf\" target=\"_blank\" rel=\"noopener\">.<\/a>\u00a0Write us at <a href=\"mailto:kontakt@parcello.org\">kontakt@parcello.org <\/a><a href=\"https:\/\/blog.parcello.org\/wp-content\/uploads\/2020\/05\/Full-Stack-Developer-m_w_d.pdf\" target=\"_blank\" rel=\"noopener\">More Informations here<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Yesterday we reached a milestone by launching our service in the USA. It is available via https:\/\/www.parcello.org\/us\/ Besides the straight forward tasks, we had to solve a few obstacles. Different Timezones &#8211; Is it today, tomorrow or yesterday? If you look up an address in Germany it is quite simple, because the server timezone is the same as the user timezone. You can easily determine if it is tomorrow, today, or yesterday. Not so easy, if you are a few [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":4358,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7,8],"tags":[],"_links":{"self":[{"href":"https:\/\/www.parcello.org\/blog\/wp-json\/wp\/v2\/posts\/4355"}],"collection":[{"href":"https:\/\/www.parcello.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.parcello.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.parcello.org\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.parcello.org\/blog\/wp-json\/wp\/v2\/comments?post=4355"}],"version-history":[{"count":9,"href":"https:\/\/www.parcello.org\/blog\/wp-json\/wp\/v2\/posts\/4355\/revisions"}],"predecessor-version":[{"id":4365,"href":"https:\/\/www.parcello.org\/blog\/wp-json\/wp\/v2\/posts\/4355\/revisions\/4365"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.parcello.org\/blog\/wp-json\/wp\/v2\/media\/4358"}],"wp:attachment":[{"href":"https:\/\/www.parcello.org\/blog\/wp-json\/wp\/v2\/media?parent=4355"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.parcello.org\/blog\/wp-json\/wp\/v2\/categories?post=4355"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.parcello.org\/blog\/wp-json\/wp\/v2\/tags?post=4355"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}