feedparser 1.2.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/Manifest.txt +2 -50
  3. data/README.md +71 -9
  4. data/Rakefile +1 -1
  5. data/lib/feedparser.rb +2 -0
  6. data/lib/feedparser/builder/microformats.rb +264 -0
  7. data/lib/feedparser/parser.rb +27 -0
  8. data/lib/feedparser/version.rb +2 -2
  9. data/test/helper.rb +3 -57
  10. data/test/test_microformats.rb +52 -0
  11. metadata +10 -56
  12. data/test/feeds/books/nostarch.rss +0 -125
  13. data/test/feeds/books/oreilly.feedburner.atom +0 -387
  14. data/test/feeds/books/pragprog.rss +0 -148
  15. data/test/feeds/byparker.json +0 -643
  16. data/test/feeds/daringfireball.atom +0 -1873
  17. data/test/feeds/daringfireball.json +0 -619
  18. data/test/feeds/googlegroups.atom +0 -37
  19. data/test/feeds/googlegroups2.atom +0 -27
  20. data/test/feeds/headius.atom +0 -123
  21. data/test/feeds/inessential.json +0 -182
  22. data/test/feeds/intertwingly.atom +0 -1197
  23. data/test/feeds/jsonfeed.json +0 -37
  24. data/test/feeds/lambdatheultimate.rss +0 -288
  25. data/test/feeds/learnenough.feedburner.atom +0 -747
  26. data/test/feeds/news/nytimes-blogs-bits.rss +0 -333
  27. data/test/feeds/news/nytimes-paul-krugman.rss +0 -60
  28. data/test/feeds/news/nytimes-tech.rss +0 -653
  29. data/test/feeds/news/nytimes-thomas-l-friedman.rss +0 -80
  30. data/test/feeds/news/nytimes.rss +0 -607
  31. data/test/feeds/news/washingtonpost-blogs-innovations.rss +0 -183
  32. data/test/feeds/news/washingtonpost-politics.rss +0 -35
  33. data/test/feeds/news/washingtonpost-world.rss +0 -29
  34. data/test/feeds/ongoing.atom +0 -1619
  35. data/test/feeds/osm/blog.openstreetmap.rss +0 -252
  36. data/test/feeds/osm/blogs.openstreetmap.rss +0 -585
  37. data/test/feeds/osm/mapbox.rss +0 -1883
  38. data/test/feeds/railstutorial.feedburner.atom +0 -656
  39. data/test/feeds/rubyflow.feedburner.rss +0 -120
  40. data/test/feeds/rubymine.feedburner.rss +0 -314
  41. data/test/feeds/rubyonrails.atom +0 -1241
  42. data/test/feeds/scripting.rss +0 -881
  43. data/test/feeds/sitepoint.rss +0 -218
  44. data/test/feeds/spec/atom/author.atom +0 -48
  45. data/test/feeds/spec/atom/authors.atom +0 -70
  46. data/test/feeds/spec/atom/categories.atom +0 -66
  47. data/test/feeds/spec/json/example.json +0 -36
  48. data/test/feeds/spec/json/microblog.json +0 -43
  49. data/test/feeds/spec/json/tags.json +0 -33
  50. data/test/feeds/spec/rss/author.rss +0 -41
  51. data/test/feeds/spec/rss/categories.rss +0 -64
  52. data/test/feeds/spec/rss/creator.rss +0 -38
  53. data/test/feeds/xkcd.atom +0 -48
  54. data/test/feeds/xkcd.rss +0 -55
  55. data/test/test_atom.rb +0 -27
  56. data/test/test_authors.rb +0 -26
  57. data/test/test_books.rb +0 -25
  58. data/test/test_feeds.rb +0 -29
  59. data/test/test_json.rb +0 -27
  60. data/test/test_rss.rb +0 -26
  61. data/test/test_tags.rb +0 -25
@@ -1,1883 +0,0 @@
1
- <?xml version="1.0" encoding="utf-8" ?>
2
- <rss version="2.0" xml:base="/blog.rss" xmlns:dc="http://purl.org/dc/elements/1.1/">
3
- <channel>
4
- <title>Blog - Mapbox</title>
5
- <link>https://www.mapbox.com/blog</link>
6
- <description>Updates from the Mapbox team.</description>
7
- <language>en</language>
8
-
9
- <item>
10
- <title>Carto-cam, the map designer&#39;s quality-assurance tool</title>
11
- <link>https://www.mapbox.com/blog/carto-cam/</link>
12
- <description>&lt;p&gt;One of the biggest challenges of making a map in Studio is knowing if it looks good everywhere in the world. When designing a map, you’re not just making choices about colors and typography, you’re working with data like layers of roads, and landcover, labels. Since these layers can converge in any number of ways all across the planet, each design decision you make is a global one. Editing the colors of your road layers is a change that spans from the tight highway networks of Tokyo to the sparse interstates of Des Moines, Iowa. How can you ensure that your custom style looks consistent in both these places, and everywhere in between?&lt;/p&gt;
13
-
14
- &lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/5/4196/34701156362_006c1df03e_h.jpg&quot; alt=&quot;Tokyo, Japan vs. West Des Moines, Iowa&quot; /&gt;
15
- &lt;em&gt;Left: Tokyo, Japan; Right: West Des Moines, Iowa, both at zoom level 10&lt;/em&gt;&lt;/p&gt;
16
-
17
- &lt;p&gt;Meet &lt;a href=&quot;https://www.mapbox.com/carto-cam/&quot;&gt;carto-cam&lt;/a&gt;, a tool that points you where in the world to look when reviewing your map styles in progress. Carto-cam starts off by showing you a few snapshots of what your custom map looks in a variety of different geographic contexts. You can add more snapshots by choosing what data layers you want to look closer at. Each snapshot is a frame of reference for you to check — and double-check — that your style looks how you’d like it to.&lt;/p&gt;
18
-
19
- &lt;div class=&quot;video space-bottom4&quot; style=&quot;padding-bottom:56%;&quot;&gt;
20
- &lt;iframe src=&quot;https://player.vimeo.com/video/218831034?autoplay=1&amp;amp;loop=1&quot; width=&quot;100%&quot; height=&quot;100%&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;&quot; mozallowfullscreen=&quot;&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
21
- &lt;/div&gt;
22
-
23
- &lt;p&gt;I worked with &lt;a href=&quot;https://www.mapbox.com/about/team/nicki-dlugash/&quot;&gt;Nicki&lt;/a&gt; from our cartography team to compile a gazetteer of places that she likes to virtually visit while working on a map style. The featured destinations were chosen because they highlight interactions of data that can be tricky to design, but when done right, are beautiful to look at on a map.&lt;/p&gt;
24
-
25
- &lt;p&gt;See here how footway paths, styled with a dashed, white-and-orange stroke, can behave unpredictably from place-to-place:&lt;/p&gt;
26
-
27
- &lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/5/4252/34812832156_1751196937_h.jpg&quot; alt=&quot;Millennium Bridge vs. Michigan State University&quot; /&gt;
28
- &lt;em&gt;Left: Millennium Bridge, London; Right: Michigan State University&lt;/em&gt;&lt;/p&gt;
29
-
30
- &lt;p&gt;Or how grids of roads converge to form the distinct identity of that city:&lt;/p&gt;
31
-
32
- &lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/5/4198/34817282156_9da36bf97a_h.jpg&quot; alt=&quot;Portland, Oregon vs. Milton Keynes, UK&quot; /&gt;
33
- &lt;em&gt;Left: Portland, Oregon; Right: Milton Keynes, UK, both at zoom level 14&lt;/em&gt;&lt;/p&gt;
34
-
35
- &lt;p&gt;Getting a view into our cartography team’s workflow is an essential part of our process on the Studio team. It’s important for us to keep an open feedback loop between those building the tool, and those building the maps. What tools do our cartographers need to design maps with confidence in their quality? How do they think about, organize, and describe data? Our goal is to feed the insights we gather back into Studio to improve its style editing tools, and to ensure all who interact with them can create compelling, imaginative maps.&lt;/p&gt;
36
-
37
- &lt;p&gt;Carto-cam was originally made as tool for internal cartographic quality control. To help us get feedback while the tool and its featured places are still a work-in-progress, we’re inviting you to use carto-cam to review your own maps. &lt;a href=&quot;https://www.mapbox.com/carto-cam/&quot;&gt;Try it out with one of your custom styles!&lt;/a&gt;&lt;/p&gt;
38
-
39
- &lt;p&gt;If you like the idea of tooling and experimentation as a part of the product design cycle, or if you get excited about the challenges of making tools for map design, &lt;a href=&quot;https://www.mapbox.com/jobs/678782/&quot;&gt;apply to work with us on the Studio team&lt;/a&gt;!&lt;/p&gt;
40
- </description>
41
- <pubDate>Wed, 24 May 2017 08:00:00 -0400</pubDate>
42
- <dc:creator>Dana Sulit</dc:creator>
43
- <guid isPermaLink="true">https://www.mapbox.com/blog/carto-cam/</guid>
44
- </item>
45
- <item>
46
- <title>Oh, the places you&#39;ll go (with the Geocoding team)!</title>
47
- <link>https://www.mapbox.com/blog/places-youll-go/</link>
48
- <description>&lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/5/4191/34374634890_3372ee9858_b.jpg&quot; alt=&quot;Geocoding Gang Logo&quot; /&gt;&lt;/p&gt;
49
-
50
- &lt;p&gt;We have one simple mission on the Geocoding team: know about &lt;strong&gt;every place in the world&lt;/strong&gt;. To accomplish our goal, we incorporate place data from &lt;a href=&quot;https://www.mapbox.com/about/maps/&quot;&gt;dozens of sources&lt;/a&gt; and &lt;a href=&quot;https://www.mapbox.com/blog/geocoding-wikidata/&quot;&gt;leverage wikidata&lt;/a&gt; to handle requests in hundreds of different languages. As a pleasant side-effect of teaching our geocoder about the world, we &lt;strong&gt;also&lt;/strong&gt; get to dig into the little-known locations and quirks of language that make places unique.&lt;/p&gt;
51
-
52
- &lt;p&gt;Inspired by &lt;a href=&quot;https://twitter.com/Notoutdoorsy/status/838513430776537088&quot;&gt;a tweet&lt;/a&gt;, we got together to round up some highlights from the last few months:&lt;/p&gt;
53
-
54
- &lt;h2 id=&quot;aarthy&quot;&gt;&lt;a href=&quot;https://twitter.com/AarthyKaycee&quot;&gt;Aarthy&lt;/a&gt;&lt;/h2&gt;
55
-
56
- &lt;p&gt;While working on the &lt;a href=&quot;https://github.com/mapbox/carmen/pull/494/files&quot;&gt;strasse quest&lt;/a&gt;, I was looking up different streets in Germany to collect test data and came across &lt;code class=&quot;highlighter-rouge&quot;&gt;Heerstrasse, Bonn, Germany&lt;/code&gt;. The next thing you know, I had spent an hour looking at pictures of this street and making a mental note to visit Germany in April (sometime in the future)!&lt;/p&gt;
57
-
58
- &lt;p&gt;&lt;img src=&quot;https://farm3.staticflickr.com/2873/33180193413_99c0691da6_k_d.jpg&quot; alt=&quot;Heerstrasse, Bonn, Germany&quot; /&gt;&lt;/p&gt;
59
-
60
- &lt;p&gt;&lt;em&gt;Image by &lt;a href=&quot;https://www.flickr.com/photos/143216492@N02/33180193413&quot;&gt;Christopher Lingstädt&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
61
-
62
- &lt;h2 id=&quot;andrew&quot;&gt;&lt;a href=&quot;https://twitter.com/andrewindc&quot;&gt;Andrew&lt;/a&gt;&lt;/h2&gt;
63
-
64
- &lt;p&gt;Lately, I’ve loaded translations in, among others, the &lt;strong&gt;Azerbaijani language&lt;/strong&gt; (sometimes called &lt;strong&gt;Azeri&lt;/strong&gt;), a Turkic language spoken as the official language in Azerbaijan, and by Azerbaijani communities in Russia, Iran, Georgia, and Turkey. As with other languages in the region, repeated conquest and annexation have exerted significant influence on it, and one consequence is that it has been written in multiple scripts over time. While not currently truly digraphic &lt;a href=&quot;https://github.com/mapbox/carmen/pull/593&quot;&gt;like Serbian is&lt;/a&gt;, Azerbaijani is fascinating in just how many times it has changed:&lt;/p&gt;
65
-
66
- &lt;ul&gt;
67
- &lt;li&gt;it was first written in the Persian version of the Arabic script&lt;/li&gt;
68
- &lt;li&gt;after Azerbaijan was incorporated into the USSR, Soviet officials first created a Turkish-inspired Latin alphabet in 1929, hoping to create cultural division between Azerbaijanis and Iran&lt;/li&gt;
69
- &lt;li&gt;under Stalin, most non-Cyrillic users were forced to switch to Cyrillic, and that included Azerbaijani, which began to be written using the Cyrillic alphabet in 1939 (and saw the introduction of a different Cyrillic scheme in 1958)&lt;/li&gt;
70
- &lt;li&gt;After the fall of the USSR, Azerbaijani switched back to a Latin system, but a different one than had been in use pre-USSR, in 1991, and it was further revised in 1992.&lt;/li&gt;
71
- &lt;/ul&gt;
72
-
73
- &lt;p&gt;&lt;img src=&quot;https://cloud.githubusercontent.com/assets/78930/24665820/767bc09c-192c-11e7-8be0-9498922b5d23.png&quot; alt=&quot;Chart of languages&quot; /&gt;&lt;/p&gt;
74
-
75
- &lt;h2 id=&quot;bob&quot;&gt;&lt;a href=&quot;https://boblannon.com&quot;&gt;Bob&lt;/a&gt;&lt;/h2&gt;
76
-
77
- &lt;p&gt;When loading geospatial data on China, it’s often difficult for a westerner to research the administrative areas because it’s not always clear how their names should be transliterated into a Latin script. So, when a new piece of data doesn’t match what we’d had in the past, it isn’t clear why. Is the new data incorrect? Has the name of the area changed? More commonly, it turns out that our old and new data really does match, but is transliterated slightly differently.&lt;/p&gt;
78
-
79
- &lt;p&gt;One good example of a discrepancy that had me baffled was an area in the province of “Xīzàng Zizhiqu,” aka the “Western Tsang Autonomous Region.” Western readers probably recognize it by a different name: “Tibet.” Around this time of year, the area is celebrating the &lt;a href=&quot;http://www.tibettravel.org/tibetan-festivals/nyingchi-peach-blossom-festival.html&quot;&gt;Nyingchi Peach Blossom Festival&lt;/a&gt;:&lt;/p&gt;
80
-
81
- &lt;p&gt;&lt;img src=&quot;https://d2mxuefqeaa7sj.cloudfront.net/s_4E200DF78FB8BCFBA4A372C97667E21AF3C34EB4E90D047DCA0084C53255E724_1494969907599_26344981775_82c25c8d81_b.jpg&quot; alt=&quot;Tree with cherry blossoms&quot; /&gt;
82
- &lt;em&gt;Image by &lt;a href=&quot;https://www.flickr.com/photos/90975693@N05/26344981775&quot;&gt;tommy@chau&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
83
-
84
- &lt;p&gt;In some newly-imported data, the county in the above photo is called “Nyingchi Xian,” but we previously had it labeled “Línzhīxian.” In both cases, “Xian” means county, but it is sometimes written as a separate word and other times written as a suffix of the name. That’s a stylistic choice, since Chinese writing doesn’t break at word boundaries. But why Nyingchi vs Linzhi? Some wikipedia research reveals that Nyingchi (ཉིང་ཁྲི་ས།) is a Tibetan name and that Línzhī (林芝) is a Chinese name for the same area.&lt;/p&gt;
85
-
86
- &lt;p&gt;&lt;img src=&quot;https://cloud.githubusercontent.com/assets/1092694/24593803/deef9c2c-17f4-11e7-97bd-63c33be68015.png&quot; alt=&quot;Chart of transalations for Nyingchi&quot; /&gt;&lt;/p&gt;
87
-
88
- &lt;p&gt;This particular case was also a good example of how China’s administrative structures have been changing rapidly in recent years. Although the data I was importing was only a couple of years old, it seemed at odds with current reality: there apparently is no Nyingchi County or Línzhī County…&lt;/p&gt;
89
-
90
- &lt;p&gt;&lt;img src=&quot;https://d2mxuefqeaa7sj.cloudfront.net/s_4E200DF78FB8BCFBA4A372C97667E21AF3C34EB4E90D047DCA0084C53255E724_1494430518950_1d170dc2-17f6-11e7-88bb-94ebfc47c259.png&quot; alt=&quot;Wikipedia map of chinese administrative areas&quot; /&gt;&lt;/p&gt;
91
-
92
- &lt;p&gt;This is where wiki edit histories can be really instructive (credit to &lt;a href=&quot;https://www.mapbox.com/about/team/minh-nguyen/&quot;&gt;Minh Nguyễn&lt;/a&gt; from our mobile team for teasing this out). Originally, Wikipedia had articles about “Bayi” (town) in “Nyingchi County” in “Nyingchi Prefecture.” Then, in 2015, these articles were &lt;a href=&quot;https://en.wikipedia.org/w/index.php?title=Bayi_District&amp;amp;type=revision&amp;amp;diff=655244134&amp;amp;oldid=654831467&quot;&gt;renamed&lt;/a&gt; to &lt;a href=&quot;https://en.wikipedia.org/wiki/Bayi_Subdistrict&quot;&gt;Bayi Subdistrict&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/Bayi_District&quot;&gt;Bayi District&lt;/a&gt;, and &lt;a href=&quot;https://en.wikipedia.org/wiki/Nyingchi&quot;&gt;Nyingchi&lt;/a&gt;, respectively. The Chinese Wikipedia &lt;a href=&quot;https://zh.wikipedia.org/w/index.php?title=巴宜区&amp;amp;type=revision&amp;amp;diff=34978124&amp;amp;oldid=30116627&quot;&gt;renamed its articles&lt;/a&gt; at about the same time, citing &lt;a href=&quot;http://news.ifeng.com/a/20150403/43480164_0.shtml&quot;&gt;this Chinese news article&lt;/a&gt; (&lt;a href=&quot;https://translate.google.com/translate?sl=zh-CN&amp;amp;tl=en&amp;amp;js=y&amp;amp;prev=_t&amp;amp;hl=en&amp;amp;ie=UTF-8&amp;amp;u=http%3A%2F%2Fnews.ifeng.com%2Fa%2F20150403%2F43480164_0.shtml&amp;amp;edit-text=&amp;amp;act=url&quot;&gt;Google Translate&lt;/a&gt;). Apparently, Nyingchi was upgraded from a county to a prefecture-level city, so its seat of government was upgraded from a town inside a county to a subdistrict inside a district.&lt;/p&gt;
93
-
94
- &lt;h2 id=&quot;kai&quot;&gt;&lt;a href=&quot;http://www.kaidalgleish.io&quot;&gt;Kai&lt;/a&gt;&lt;/h2&gt;
95
-
96
- &lt;p&gt;We separate our data into different &lt;code class=&quot;highlighter-rouge&quot;&gt;types&lt;/code&gt;, like &lt;code class=&quot;highlighter-rouge&quot;&gt;pois&lt;/code&gt; (“points of interest”, like restaurants and tourist destinations), &lt;code class=&quot;highlighter-rouge&quot;&gt;places&lt;/code&gt; (cities), and &lt;code class=&quot;highlighter-rouge&quot;&gt;regions&lt;/code&gt; (like “states” in the United States, or “departments” in France). When we’re loading new data into our geocoder, part of the challenge is figuring out what &lt;code class=&quot;highlighter-rouge&quot;&gt;type&lt;/code&gt; to give each feature. While importing new data on Malaysian cities, I came across a polygon named &lt;code class=&quot;highlighter-rouge&quot;&gt;Batu Caves&lt;/code&gt;. &lt;code class=&quot;highlighter-rouge&quot;&gt;Batu Caves&lt;/code&gt; sounds more like a POI than a city, so I did a little digging and 😻:&lt;/p&gt;
97
-
98
- &lt;p&gt;&lt;img src=&quot;https://d2mxuefqeaa7sj.cloudfront.net/s_A79E7AB31B39FB99EBBEE47C1253DB75E3D85349DC8A1F1959E0243F15505B89_1494974648752_Inside_Batu_Caves.jpg&quot; alt=&quot;Hindu temple in a cave&quot; /&gt;
99
- &lt;em&gt;Image by &lt;a href=&quot;https://commons.wikimedia.org/wiki/File:Inside_Batu_Caves.jpg&quot;&gt;Allan Jay Quesada&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
100
-
101
- &lt;p&gt;It’s the name of a town that hosts an epic temple complex built into limestone caverns. The caves feature a number of endemic animals, including tube-dwelling spiders and several species of bats. In this case it’s also a great fit for our &lt;code class=&quot;highlighter-rouge&quot;&gt;place&lt;/code&gt; layer- it’s a rapidly growing town just outside of Kuala Lumpur, and has multiple schools, parks, and neighborhoods.&lt;/p&gt;
102
-
103
- &lt;h2 id=&quot;matt&quot;&gt;&lt;a href=&quot;https://twitter.com/mattficke&quot;&gt;Matt&lt;/a&gt;&lt;/h2&gt;
104
-
105
- &lt;p&gt;An oxbow bend in the Chao Phraya river forms Bang Kachao, a 20 sq km park directly across from central Bangkok. Developers have been clamoring for access, but for the moment it remains an interesting contrast to the enormous city that surrounds it.&lt;/p&gt;
106
-
107
- &lt;p&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/e/ef/Samutprakarn_Bang_Kachao_2.jpg&quot; alt=&quot;People riding bikes&quot; /&gt;&lt;/p&gt;
108
-
109
- &lt;p&gt;&lt;em&gt;Image by &lt;a href=&quot;https://commons.wikimedia.org/wiki/File:Samutprakarn_Bang_Kachao_2.jpg&quot;&gt;Sivakrit Saravit&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
110
-
111
- &lt;p&gt;&lt;img src=&quot;https://farm5.staticflickr.com/4159/34593403591_17387c7b6c_b_d.jpg&quot; alt=&quot;Satellite image of a river through a city&quot; /&gt;&lt;/p&gt;
112
-
113
- &lt;p&gt;&lt;em&gt;Bang Kachao on Mapbox Satellite&lt;/em&gt;&lt;/p&gt;
114
-
115
- &lt;h2 id=&quot;nick&quot;&gt;&lt;a href=&quot;https://twitter.com/nickingalls&quot;&gt;Nick&lt;/a&gt;&lt;/h2&gt;
116
-
117
- &lt;p&gt;&lt;img src=&quot;https://farm4.staticflickr.com/3594/3587039559_68bec87527_b_d.jpg&quot; alt=&quot;Russian nesting dolls&quot; /&gt;&lt;/p&gt;
118
-
119
- &lt;p&gt;&lt;em&gt;Image by &lt;a href=&quot;https://www.flickr.com/photos/charlottemorrall/3587039559/&quot;&gt;Charlotte&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
120
-
121
- &lt;p&gt;I’ve been working on removing place duplicates from our API. We sometimes return duplicate place names where the place and the region share the same name. Sometimes these are legit (“New York, New York, USA”) and sometimes they are not (“London, London, England”).&lt;/p&gt;
122
-
123
- &lt;p&gt;While working with a customer enquiring about Liechtenstein address support I discovered a new class of duplicates where a locality, place, region, and country add share the same name.&lt;/p&gt;
124
-
125
- &lt;p&gt;Previously a search for “Liechtenstein” would return&lt;/p&gt;
126
-
127
- &lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Liechtenstein, Liechtenstein, Liechtenstein, Liechtenstein
128
- (locality) (place) (region) (country)
129
- &lt;/code&gt;&lt;/pre&gt;
130
- &lt;/div&gt;
131
-
132
- &lt;p&gt;We face a similar task in Singapore with&lt;/p&gt;
133
-
134
- &lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Singapore, Greater Singapore, Singapore
135
- &lt;/code&gt;&lt;/pre&gt;
136
- &lt;/div&gt;
137
-
138
- &lt;p&gt;We’re halfway through an automated fix for these so you should start seeing less and less duplication! If you notice any we missed give us a shout!&lt;/p&gt;
139
-
140
- &lt;h2 id=&quot;tom&quot;&gt;Tom:&lt;/h2&gt;
141
- &lt;p&gt;&lt;img src=&quot;https://farm5.staticflickr.com/4160/34725025155_fd2938ac88_b_d.jpg&quot; alt=&quot;Aruba and Alberta combined&quot; /&gt;&lt;/p&gt;
142
-
143
- &lt;p&gt;&lt;em&gt;Images by &lt;a href=&quot;https://www.flickr.com/photos/laszlo-photo/3185734228/&quot;&gt;LASZLO ILYES&lt;/a&gt;, &lt;a href=&quot;https://www.flickr.com/photos/thomasjhannigan/24032303429/&quot;&gt;Tom Hannigan&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
144
-
145
- &lt;p&gt;At &lt;a href=&quot;https://github.com/mapbox/carmen/issues/433&quot;&gt;one point&lt;/a&gt; we were returning the feature on the left (&lt;code class=&quot;highlighter-rouge&quot;&gt;Alberta&lt;/code&gt;) when someone searched for the feature on the right (&lt;code class=&quot;highlighter-rouge&quot;&gt;Aruba&lt;/code&gt;). Why? Well, we had added Japanese translations for our features, including &lt;code class=&quot;highlighter-rouge&quot;&gt;アルバータ州&lt;/code&gt; for Alberta. And we used an ASCII normalization library behind the scenes – mostly to simplify some operations and smooth out diacritics in Latin characters, but also for its not entirely nonexistent transliteration abilities. Alas, that library transforms &lt;code class=&quot;highlighter-rouge&quot;&gt;アルバータ州&lt;/code&gt; into &lt;code class=&quot;highlighter-rouge&quot;&gt;Arubatazhou&lt;/code&gt;. &lt;code class=&quot;highlighter-rouge&quot;&gt;Aruba&lt;/code&gt; looks like a matching query for that (when considered as a part of an autocomplete sequence).&lt;/p&gt;
146
-
147
- &lt;p&gt;We soon implemented a fix to isolate CJK character-using names from other ones, and since then have switched to an architecture that fully supports Unicode. But this is a good example of a larger class of headaches in geocoding: adding data on one side of the world can screw up queries on the other in a ways that don’t happen with other types of geo work.&lt;/p&gt;
148
-
149
- &lt;h2 id=&quot;-fin-&quot;&gt;~ fin ~&lt;/h2&gt;
150
-
151
- &lt;p&gt;We don’t have to stop with the Geocoding team; we’d love to hear about the special places you’ve come across recently, too! Hit us up on Twitter using &lt;a href=&quot;https://twitter.com/search?q=%23geobucketlist&quot;&gt;#geobucketlist&lt;/a&gt; to share your geographic bucket list. Want to explore the world as part of your day job? &lt;a href=&quot;https://www.mapbox.com/jobs/&quot;&gt;We’re hiring&lt;/a&gt;!&lt;/p&gt;
152
-
153
- &lt;iframe src=&quot;https://giphy.com/embed/ToMjGpxInCZSzD3V82s&quot; width=&quot;960&quot; height=&quot;598&quot; frameborder=&quot;0&quot; class=&quot;giphy-embed&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
154
- &lt;p&gt;&lt;a href=&quot;https://giphy.com/gifs/cheezburger-cats-ToMjGpxInCZSzD3V82s&quot;&gt;&lt;/a&gt;&lt;/p&gt;
155
- </description>
156
- <pubDate>Mon, 22 May 2017 07:00:00 -0400</pubDate>
157
- <dc:creator>Kai Dalgleish</dc:creator>
158
- <guid isPermaLink="true">https://www.mapbox.com/blog/places-youll-go/</guid>
159
- </item>
160
- <item>
161
- <title>Find your missing items with TrackR&#39;s mobile maps</title>
162
- <link>https://www.mapbox.com/blog/trackr-launches-with-mapbox/</link>
163
- <description>&lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/5/4185/34306655871_89144f535d.jpg&quot; alt=&quot;pictrackrs&quot; /&gt;&lt;/p&gt;
164
-
165
- &lt;p&gt;Tracking the things you hate to lose the most just got an upgrade. TrackR’s small and lightweight devices - including TrackR bravo, TrackR wallet, and the new TrackR pixel - now help people find over 4.5 million items thanks to connected mobile apps powered by our &lt;a href=&quot;https://www.mapbox.com/mobile/&quot;&gt;mobile SDKs&lt;/a&gt;.&lt;/p&gt;
166
-
167
- &lt;p&gt;Whereas in the past tracking services generally relied upon sound alerts, mapping is now a “must have” expectation of forgetful customers … like me. On a recent layover at the Orlando airport, I left my keys on a chair prior to boarding. When I got to my doorstep in Washington, D.C., a sound alert wouldn’t have helped me very much. Luckily, the built-in geofencing of my TrackR Bravo and the handy map I pulled up on my iPhone’s TrackR app helped me pinpoint exactly where it was.&lt;/p&gt;
168
-
169
- &lt;p&gt;Speaking of “pinpointing”, the TrackR app - built using Mapbox’s &lt;a href=&quot;https://www.mapbox.com/ios-sdk/&quot;&gt;iOS&lt;/a&gt; and &lt;a href=&quot;https://www.mapbox.com/android-sdk/&quot;&gt;Android&lt;/a&gt; SDKs - comes with a custom styled map, as seen below. The style seamlessly carries through the TrackR brand and - speaking from experience - puts you at ease by reminding you that an entire company of people is helping you locate your lost item.&lt;/p&gt;
170
-
171
- &lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/5/4172/34352463850_2e8ffb637e_c.jpg&quot; alt=&quot;TrackR maps on iPhone and Android&quot; /&gt;&lt;/p&gt;
172
-
173
- &lt;p&gt;We’re making it easier to track everything from phones and wallets to &lt;a href=&quot;https://www.mapbox.com/blog/flightradar24/&quot;&gt;planes&lt;/a&gt;, &lt;a href=&quot;https://www.mapbox.com/blog/tracking-orders-live-instacart/&quot;&gt;groceries&lt;/a&gt;, &lt;a href=&quot;https://www.mapbox.com/blog/live-earthquake-tracker/&quot;&gt;earthquakes&lt;/a&gt; and even the &lt;a href=&quot;https://www.mapbox.com/blog/tracking-mars-curiosity-rover/&quot;&gt;Mars Curiosity Rover&lt;/a&gt;. Want to explore custom styles for the things you’re tracking? &lt;a href=&quot;https://www.mapbox.com/studio/&quot;&gt;Sign up&lt;/a&gt; and build a custom map today, or &lt;a href=&quot;https://www.mapbox.com/contact/sales/?page=pricing&quot;&gt;contact our team&lt;/a&gt; to learn more.&lt;/p&gt;
174
- </description>
175
- <pubDate>Fri, 19 May 2017 07:00:00 -0400</pubDate>
176
- <dc:creator>Julie Munro</dc:creator>
177
- <guid isPermaLink="true">https://www.mapbox.com/blog/trackr-launches-with-mapbox/</guid>
178
- </item>
179
- <item>
180
- <title>OpenAddresses has 440M points. How can we tell when we&#39;re done?</title>
181
- <link>https://www.mapbox.com/blog/openaddresses-440m-coverage/</link>
182
- <description>&lt;p&gt;&lt;em&gt;&lt;a href=&quot;http://mike.teczno.com/&quot;&gt;Michal Migurski&lt;/a&gt;’s contributions to the open data community are almost too numerous to count. Most recently, Mapbox has been pleased to support his work on the &lt;a href=&quot;https://openaddresses.io&quot;&gt;OpenAddresses&lt;/a&gt; project, including more thorough evaluation of its progress, which he discusses here.&lt;/em&gt;&lt;/p&gt;
183
-
184
- &lt;p&gt;OpenAddresses, &lt;a href=&quot;https://openaddresses.io&quot;&gt;the free and open global address collection&lt;/a&gt;, &lt;a href=&quot;https://github.com/openaddresses/openaddresses/commit/ce698e99a&quot;&gt;turned three years old this year&lt;/a&gt;. Address data is critical infrastructure for basic mapping tasks, like finding a location to get driving directions or measure distances. Mapbox’s &lt;a href=&quot;https://www.mapbox.com/geocoding/&quot;&gt;geocoder&lt;/a&gt; uses address data from a number of sources, including OpenAddresses. This community open data effort to collect authoritative address points from around the world recently reached over 440 million records with substantial coverage for dozens of countries. Mapbox &lt;a href=&quot;https://www.mapbox.com/blog/tags/openaddresses/&quot;&gt;has been supporting OpenAddresses since day one&lt;/a&gt;, and this spring I’ve been lucky to get to work on detailed address coverage data here in the San Francisco office.&lt;/p&gt;
185
-
186
- &lt;p&gt;OpenAddresses (OA) is a freely-licensed data set, so unlike many proprietary datasets that come with contractual restrictions, it’s possible to talk about its data quantity and quality in great detail. Now, we’ve put together a detailed summary of how OA’s global addresses compare to population density from NASA SEDAC’s &lt;a href=&quot;http://beta.sedac.ciesin.columbia.edu/data/set/gpw-v4-population-count-adjusted-to-2015-unwpp-country-totals&quot;&gt;Gridded Population of the World (GPW) dataset&lt;/a&gt;, as well as a &lt;a href=&quot;https://results.openaddresses.io/coverage&quot;&gt;regularly-updated page with country-level coverage data&lt;/a&gt;:&lt;/p&gt;
187
-
188
- &lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/5/4180/34636845426_5d142dc602_b.jpg&quot; alt=&quot;Address vs. population density&quot; /&gt;&lt;/p&gt;
189
-
190
- &lt;p&gt;OA address density compared to worldwide population.&lt;/p&gt;
191
-
192
- &lt;table id=&quot;coverage&quot;&gt;
193
- &lt;tbody&gt;
194
- &lt;tr&gt;
195
- &lt;th colspan=&quot;2&quot;&gt;
196
- Country
197
- &lt;/th&gt;
198
- &lt;th&gt;
199
- Coverage Group
200
- &lt;/th&gt;
201
- &lt;th colspan=&quot;2&quot; class=&quot;numeric&quot;&gt;
202
- Land Area Covered
203
- &lt;/th&gt;
204
- &lt;th colspan=&quot;2&quot; class=&quot;numeric&quot;&gt;
205
- Population Covered
206
- &lt;/th&gt;
207
- &lt;th class=&quot;numeric&quot;&gt;
208
- Addresses per 1,000 People
209
- &lt;/th&gt;
210
- &lt;/tr&gt;
211
- &lt;tr&gt;
212
- &lt;td class=&quot;flag&quot;&gt;
213
- 🇦🇺
214
- &lt;/td&gt;
215
- &lt;td class=&quot;name&quot;&gt;
216
- Australia
217
- &lt;/td&gt;
218
- &lt;td class=&quot;group&quot;&gt;
219
- Complete
220
- &lt;/td&gt;
221
- &lt;td class=&quot;numeric&quot;&gt;
222
- 100%
223
- &lt;/td&gt;
224
- &lt;td class=&quot;numeric area-detail&quot;&gt;
225
- 7,741K km²
226
- &lt;/td&gt;
227
- &lt;td class=&quot;numeric&quot;&gt;
228
- 100%
229
- &lt;/td&gt;
230
- &lt;td class=&quot;numeric population-detail&quot;&gt;
231
- 23,948K people
232
- &lt;/td&gt;
233
- &lt;td class=&quot;numeric&quot;&gt;
234
- 847
235
- &lt;/td&gt;
236
- &lt;/tr&gt;
237
- &lt;tr&gt;
238
- &lt;td class=&quot;flag&quot;&gt;
239
- 🇦🇹
240
- &lt;/td&gt;
241
- &lt;td class=&quot;name&quot;&gt;
242
- Austria
243
- &lt;/td&gt;
244
- &lt;td class=&quot;group&quot;&gt;
245
- Complete
246
- &lt;/td&gt;
247
- &lt;td class=&quot;numeric&quot;&gt;
248
- 100%
249
- &lt;/td&gt;
250
- &lt;td class=&quot;numeric area-detail&quot;&gt;
251
- 83K km²
252
- &lt;/td&gt;
253
- &lt;td class=&quot;numeric&quot;&gt;
254
- 100%
255
- &lt;/td&gt;
256
- &lt;td class=&quot;numeric population-detail&quot;&gt;
257
- 8,551K people
258
- &lt;/td&gt;
259
- &lt;td class=&quot;numeric&quot;&gt;
260
- 328
261
- &lt;/td&gt;
262
- &lt;/tr&gt;
263
- &lt;tr&gt;
264
- &lt;td class=&quot;flag&quot;&gt;
265
- 🇧🇲
266
- &lt;/td&gt;
267
- &lt;td class=&quot;name&quot;&gt;
268
- Bermuda
269
- &lt;/td&gt;
270
- &lt;td class=&quot;group&quot;&gt;
271
- Complete
272
- &lt;/td&gt;
273
- &lt;td class=&quot;numeric&quot;&gt;
274
- 100%
275
- &lt;/td&gt;
276
- &lt;td class=&quot;numeric area-detail&quot;&gt;
277
- 126 km²
278
- &lt;/td&gt;
279
- &lt;td class=&quot;numeric&quot;&gt;
280
- 100%
281
- &lt;/td&gt;
282
- &lt;td class=&quot;numeric population-detail&quot;&gt;
283
- 57K people
284
- &lt;/td&gt;
285
- &lt;td class=&quot;numeric&quot;&gt;
286
- 335
287
- &lt;/td&gt;
288
- &lt;/tr&gt;
289
- &lt;tr&gt;
290
- &lt;td class=&quot;flag&quot;&gt;
291
- 🇧🇷
292
- &lt;/td&gt;
293
- &lt;td class=&quot;name&quot;&gt;
294
- Brazil
295
- &lt;/td&gt;
296
- &lt;td class=&quot;group&quot;&gt;
297
- Substantial
298
- &lt;/td&gt;
299
- &lt;td class=&quot;numeric&quot;&gt;
300
- 100%
301
- &lt;/td&gt;
302
- &lt;td class=&quot;numeric area-detail&quot;&gt;
303
- 8,500K km²
304
- &lt;/td&gt;
305
- &lt;td class=&quot;numeric&quot;&gt;
306
- 99%
307
- &lt;/td&gt;
308
- &lt;td class=&quot;numeric population-detail&quot;&gt;
309
- 206,104K people
310
- &lt;/td&gt;
311
- &lt;td class=&quot;numeric&quot;&gt;
312
- 403
313
- &lt;/td&gt;
314
- &lt;/tr&gt;
315
- &lt;tr&gt;
316
- &lt;td class=&quot;flag&quot;&gt;
317
- 🇨🇿
318
- &lt;/td&gt;
319
- &lt;td class=&quot;name&quot;&gt;
320
- Czech Rep.
321
- &lt;/td&gt;
322
- &lt;td class=&quot;group&quot;&gt;
323
- Complete
324
- &lt;/td&gt;
325
- &lt;td class=&quot;numeric&quot;&gt;
326
- 100%
327
- &lt;/td&gt;
328
- &lt;td class=&quot;numeric area-detail&quot;&gt;
329
- 79K km²
330
- &lt;/td&gt;
331
- &lt;td class=&quot;numeric&quot;&gt;
332
- 100%
333
- &lt;/td&gt;
334
- &lt;td class=&quot;numeric population-detail&quot;&gt;
335
- 10,560K people
336
- &lt;/td&gt;
337
- &lt;td class=&quot;numeric&quot;&gt;
338
- 268
339
- &lt;/td&gt;
340
- &lt;/tr&gt;
341
- &lt;tr&gt;
342
- &lt;td class=&quot;flag&quot;&gt;
343
- 🇩🇰
344
- &lt;/td&gt;
345
- &lt;td class=&quot;name&quot;&gt;
346
- Denmark
347
- &lt;/td&gt;
348
- &lt;td class=&quot;group&quot;&gt;
349
- Complete
350
- &lt;/td&gt;
351
- &lt;td class=&quot;numeric&quot;&gt;
352
- 100%
353
- &lt;/td&gt;
354
- &lt;td class=&quot;numeric area-detail&quot;&gt;
355
- 45K km²
356
- &lt;/td&gt;
357
- &lt;td class=&quot;numeric&quot;&gt;
358
- 100%
359
- &lt;/td&gt;
360
- &lt;td class=&quot;numeric population-detail&quot;&gt;
361
- 5,660K people
362
- &lt;/td&gt;
363
- &lt;td class=&quot;numeric&quot;&gt;
364
- 641
365
- &lt;/td&gt;
366
- &lt;/tr&gt;
367
- &lt;tr&gt;
368
- &lt;td colspan=&quot;8&quot;&gt;
369
-
370
- &lt;/td&gt;
371
- &lt;/tr&gt;
372
- &lt;tr&gt;
373
- &lt;td class=&quot;flag&quot;&gt;
374
- 🇨🇦
375
- &lt;/td&gt;
376
- &lt;td class=&quot;name&quot;&gt;
377
- Canada
378
- &lt;/td&gt;
379
- &lt;td class=&quot;group&quot;&gt;
380
- Substantial
381
- &lt;/td&gt;
382
- &lt;td class=&quot;numeric&quot;&gt;
383
- 16.4%
384
- &lt;/td&gt;
385
- &lt;td class=&quot;numeric area-detail&quot;&gt;
386
- 1,576K km²
387
- &lt;/td&gt;
388
- &lt;td class=&quot;numeric&quot;&gt;
389
- 31.5%
390
- &lt;/td&gt;
391
- &lt;td class=&quot;numeric population-detail&quot;&gt;
392
- 11,307K people
393
- &lt;/td&gt;
394
- &lt;td class=&quot;numeric&quot;&gt;
395
- 633
396
- &lt;/td&gt;
397
- &lt;/tr&gt;
398
- &lt;tr&gt;
399
- &lt;td class=&quot;flag&quot;&gt;
400
- 🇺🇸
401
- &lt;/td&gt;
402
- &lt;td class=&quot;name&quot;&gt;
403
- United States
404
- &lt;/td&gt;
405
- &lt;td class=&quot;group&quot;&gt;
406
- Substantial
407
- &lt;/td&gt;
408
- &lt;td class=&quot;numeric&quot;&gt;
409
- 58.2%
410
- &lt;/td&gt;
411
- &lt;td class=&quot;numeric area-detail&quot;&gt;
412
- 5,435 km²
413
- &lt;/td&gt;
414
- &lt;td class=&quot;numeric&quot;&gt;
415
- 78.9%
416
- &lt;/td&gt;
417
- &lt;td class=&quot;numeric population-detail&quot;&gt;
418
- 254,082K people
419
- &lt;/td&gt;
420
- &lt;td class=&quot;numeric&quot;&gt;
421
- 609
422
- &lt;/td&gt;
423
- &lt;/tr&gt;
424
- &lt;tr&gt;
425
- &lt;td colspan=&quot;8&quot;&gt;
426
-
427
- &lt;/td&gt;
428
- &lt;/tr&gt;
429
- &lt;/tbody&gt;
430
- &lt;/table&gt;
431
-
432
- &lt;p&gt;A sample of OA coverage data for May, 2017. &lt;a href=&quot;https://results.openaddresses.io/coverage&quot;&gt;See an updated table&lt;/a&gt;.&lt;/p&gt;
433
-
434
- &lt;p&gt;GPW is a fascinating dataset hosted at Columbia University, featuring estimates of world population consistent with United Nations counts for the past 20 years in a 1km×1km raster grid. We can use it to estimate the number of addresses per 1,000 people for countries where we have even partial coverage. For example, OpenAddresses completely covers as many as 21 countries, and almost 80% of the population of the United States.&lt;/p&gt;
435
-
436
- &lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/5/4177/33867664803_516a5ab4e4_b.jpg&quot; alt=&quot;administrative areas where OA data sources exist in Europe&quot; /&gt;&lt;/p&gt;
437
-
438
- &lt;p&gt;Yellow polygons show administrative areas where OA data sources exist in Europe.&lt;/p&gt;
439
-
440
- &lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/5/4184/33867664773_ed795f9719_b.jpg&quot; alt=&quot;dense address availability in Australia and New Zealand&quot; /&gt;&lt;/p&gt;
441
-
442
- &lt;p&gt;Dark green shows dense address availability in Australia and New Zealand, where OA has countrywide address sources from &lt;a href=&quot;https://data.linz.govt.nz&quot;&gt;LINZ&lt;/a&gt; and &lt;a href=&quot;http://data.gov.au/dataset/geocoded-national-address-file-g-naf&quot;&gt;the government of Australia&lt;/a&gt;.&lt;/p&gt;
443
-
444
- &lt;p&gt;OA provides &lt;a href=&quot;http://github.com/openaddresses&quot;&gt;a space to collaborate on Github&lt;/a&gt;, where a bustling community of participants seek out new sources of address location data from government and local authorities. If you’d like to get involved in OpenAddresses, there are plenty of ways to help:&lt;/p&gt;
445
-
446
- &lt;ul&gt;
447
- &lt;li&gt;&lt;a href=&quot;https://github.com/openaddresses/openaddresses/issues&quot;&gt;Check out open issues&lt;/a&gt; for ongoing work.&lt;/li&gt;
448
- &lt;li&gt;If an authority in your area is missing from OA, &lt;a href=&quot;https://github.com/openaddresses/openaddresses/blob/master/OUTREACH_EXAMPLE.md&quot;&gt;reach out to ask for data&lt;/a&gt;.&lt;/li&gt;
449
- &lt;li&gt;Know of other open data sources? &lt;a href=&quot;https://github.com/openaddresses/openaddresses/blob/master/CONTRIBUTING.md&quot;&gt;Submit them here&lt;/a&gt;!&lt;/li&gt;
450
- &lt;/ul&gt;
451
- </description>
452
- <pubDate>Wed, 17 May 2017 12:00:00 -0400</pubDate>
453
- <dc:creator>Michal Migurski</dc:creator>
454
- <guid isPermaLink="true">https://www.mapbox.com/blog/openaddresses-440m-coverage/</guid>
455
- </item>
456
- <item>
457
- <title>Introducing plugins for Android</title>
458
- <link>https://www.mapbox.com/blog/plugins-android/</link>
459
- <description>&lt;p&gt;You can now contribute to the Mapbox Mobile SDK with plugins. Plugins are single-purpose libraries built on top of our mobile SDK to include in your apps, like any other library dependency.&lt;/p&gt;
460
-
461
- &lt;p&gt;Splitting specific functionality into plugins makes our SDK lighter, and provides opportunities to get creative. With plugins, you can quickly contribute functional or fun ideas to the SDK, without diving into the details of &lt;code class=&quot;highlighter-rouge&quot;&gt;mapbox-gl-native&lt;/code&gt;.&lt;/p&gt;
462
-
463
- &lt;iframe src=&quot;https://player.vimeo.com/video/217727613?autoplay=1&amp;amp;loop=1&quot; width=&quot;820&quot; height=&quot;525&quot; align=&quot;middle&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;&quot; mozallowfullscreen=&quot;&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
464
- &lt;p&gt;&lt;em&gt;The Android Traffic plugin works with any map style.&lt;/em&gt;&lt;/p&gt;
465
-
466
- &lt;p&gt;&lt;a href=&quot;https://github.com/mapbox/mapbox-plugins-android/blob/master/CONTRIBUTING.md&quot;&gt;Build your own plugin today&lt;/a&gt;, or take our first Android Traffic plugin for a spin (&lt;a href=&quot;https://github.com/mapbox/mapbox-plugins-android/blob/master/plugins/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/TrafficActivity.java&quot;&gt;example&lt;/a&gt;). Keep an eye out for iOS plugins in the coming weeks, and show off what you build by &lt;a href=&quot;https://twitter.com/mapbox&quot;&gt;tweeting us&lt;/a&gt; using the hashtag #BuiltWithMapbox.&lt;/p&gt;
467
- </description>
468
- <pubDate>Tue, 16 May 2017 07:00:00 -0400</pubDate>
469
- <dc:creator>Tobrun Van Nuland</dc:creator>
470
- <guid isPermaLink="true">https://www.mapbox.com/blog/plugins-android/</guid>
471
- </item>
472
- <item>
473
- <title>Deprecating streambot: a poem</title>
474
- <link>https://www.mapbox.com/blog/streambot-deprecation-poem/</link>
475
- <description>&lt;p&gt;Today, &lt;a href=&quot;https://www.mapbox.com/about/team/#platform&quot;&gt;the Platform team&lt;/a&gt; completed the deprecation of &lt;a href=&quot;https://github.com/mapbox/streambot/&quot;&gt;streambot&lt;/a&gt;, which was our open-source, homegrown solution for providing Lambda functions with environment variables and connectors to read from Kinesis streams. We built streambot two years ago, when native AWS support for those features was missing.&lt;/p&gt;
476
-
477
- &lt;p&gt;&lt;img src=&quot;https://farm5.staticflickr.com/4176/34613482176_f2634ccebf_b.jpg&quot; alt=&quot;streambot&quot; /&gt;&lt;/p&gt;
478
-
479
- &lt;p class=&quot;center&quot;&gt;&lt;em&gt;Streambot (2015-2017)&lt;/em&gt;&lt;/p&gt;
480
-
481
- &lt;p&gt;I want to say a few words on the deprecation of streambot as we disconnect its final consumers. This little bot helped us scale in impressive ways. Early in its life, streambot gave us a &lt;a href=&quot;https://www.mapbox.com/blog/scaling-the-mapbox-infrastructure-with-dynamodb-streams/&quot;&gt;lambda-backed DynamoDB replication system&lt;/a&gt;. Since then, streambot gave hundreds of lambda functions environment variables and connections to Kinesis and DynamoDB streams, when this was otherwise impossible. Lastly, streambot did what any good piece of software should do: serve a discrete function, and when you’re no longer needed, GTFO.&lt;/p&gt;
482
-
483
- &lt;p&gt;As a final goodbye, a poem for streambot:&lt;/p&gt;
484
-
485
- &lt;h2 id=&quot;a-dear-bots-farewell&quot;&gt;A Dear Bot’s Farewell&lt;/h2&gt;
486
-
487
- &lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;oh faithful streambot
488
- supplying runtime config
489
- to stateless functions
490
-
491
- without fail you kept
492
- functions wrapped with care, and safe
493
- from context dot done
494
-
495
- a misnomer, sure
496
- your creator may chuckle
497
- but things change, you know
498
-
499
- now we bid adieu
500
- to that one point of failure
501
- the streambot table
502
-
503
- event source mappings
504
- service tokens, streambot envs
505
- farewell our dear bot
506
-
507
- no more consumers
508
- deprecation awaits you
509
- we&#39;ll see you never
510
- &lt;/code&gt;&lt;/pre&gt;
511
- &lt;/div&gt;
512
-
513
- &lt;hr /&gt;
514
-
515
- &lt;p&gt;Do you like writing poetry about software? The Platform team &lt;a href=&quot;https://www.mapbox.com/jobs/&quot;&gt;is hiring&lt;/a&gt;!&lt;/p&gt;
516
- </description>
517
- <pubDate>Tue, 16 May 2017 06:00:00 -0400</pubDate>
518
- <dc:creator>Emily McAfee</dc:creator>
519
- <guid isPermaLink="true">https://www.mapbox.com/blog/streambot-deprecation-poem/</guid>
520
- </item>
521
- <item>
522
- <title>Optimize trips using Mapbox Android Services v2.1</title>
523
- <link>https://www.mapbox.com/blog/mas-2.1-release/</link>
524
- <description>&lt;p&gt;Mapbox Android Services (MAS) provides an out of the box solution for adding &lt;a href=&quot;https://www.mapbox.com/android-sdk/examples/directions/&quot;&gt;Directions&lt;/a&gt;, &lt;a href=&quot;https://www.mapbox.com/android-sdk/examples/geocoding/&quot;&gt;Geocoding&lt;/a&gt;, &lt;a href=&quot;https://www.mapbox.com/help/map-matching-api/&quot;&gt;Map Matching&lt;/a&gt;, and more inside your Java and Android applications. The latest v2.1 release of MAS now adds the Optimization and Matrix APIs along with an abundance of other improvements to give your users an even better routing &amp;amp; navigation experience.&lt;/p&gt;
525
-
526
- &lt;h2 id=&quot;optimization-api&quot;&gt;Optimization API&lt;/h2&gt;
527
- &lt;p&gt;If you need to provide your delivery fleet with the optimal order for making several stops, the new &lt;a href=&quot;https://www.mapbox.com/api-documentation/#optimization&quot;&gt;Optimization API&lt;/a&gt; returns multi-stop itineraries based on travel time. Feeding in a list of coordinates and making a request returns a route similar to the Directions API response. You’ll also receive turn-by-turn guidance and accurate ETA predictions for each stop along an itinerary.&lt;/p&gt;
528
-
529
- &lt;div class=&quot;video&quot; style=&quot;padding-bottom:56.25%;&quot;&gt;
530
- &lt;iframe src=&quot;https://player.vimeo.com/video/213716292?autoplay=1&amp;amp;loop=1&quot; width=&quot;100%&quot; height=&quot;100%&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;&quot; mozallowfullscreen=&quot;&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
531
- &lt;/div&gt;
532
-
533
- &lt;p&gt;&lt;span class=&quot;caption&quot;&gt;Mocking a user traversing along the optimized route.&lt;/span&gt;&lt;/p&gt;
534
-
535
- &lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// Build a list of the trip stops.&lt;/span&gt;
536
- &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Position&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tripStops&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ArrayList&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
537
- &lt;span class=&quot;n&quot;&gt;tripStops&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Position&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;fromCoordinates&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;73.99322&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;40.74302&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;));&lt;/span&gt;
538
- &lt;span class=&quot;n&quot;&gt;tripStops&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Position&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;fromCoordinates&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;73.97920&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;40.74451&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;));&lt;/span&gt;
539
- &lt;span class=&quot;n&quot;&gt;tripStops&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Position&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;fromCoordinates&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;73.99179&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;40.75979&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;));&lt;/span&gt;
540
- &lt;span class=&quot;n&quot;&gt;tripStops&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Position&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;fromCoordinates&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;73.97144&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;40.76369&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;));&lt;/span&gt;
541
- &lt;span class=&quot;n&quot;&gt;tripStops&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Position&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;fromCoordinates&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;73.98812&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;40.75906&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;));&lt;/span&gt;
542
-
543
- &lt;span class=&quot;c1&quot;&gt;// Build the Optimization API request.&lt;/span&gt;
544
- &lt;span class=&quot;n&quot;&gt;MapboxOptimizedTrips&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MapboxOptimizedTrips&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;Builder&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
545
- &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setProfile&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DirectionsCriteria&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;PROFILE_DRIVING&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
546
- &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setAccessToken&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;your&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;access&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;token&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;here&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;)&lt;/span&gt;
547
- &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setCoordinates&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tripStops&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
548
- &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
549
-
550
- &lt;span class=&quot;c1&quot;&gt;// Execute the API call and handle the response.&lt;/span&gt;
551
- &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;enqueueCall&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Callback&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MapMatchingResponse&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
552
- &lt;span class=&quot;nd&quot;&gt;@Override&lt;/span&gt;
553
- &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;onResponse&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Call&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MapMatchingResponse&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Response&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MapMatchingResponse&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
554
-
555
- &lt;span class=&quot;c1&quot;&gt;// Draw the route line onto the map.&lt;/span&gt;
556
- &lt;span class=&quot;n&quot;&gt;drawLine&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getTrips&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getGeometry&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;());&lt;/span&gt;
557
-
558
- &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
559
-
560
- &lt;span class=&quot;o&quot;&gt;...&lt;/span&gt;
561
- &lt;/code&gt;&lt;/pre&gt;
562
- &lt;/div&gt;
563
-
564
- &lt;h2 id=&quot;matrix-api&quot;&gt;Matrix API&lt;/h2&gt;
565
- &lt;p&gt;Starting in MAS v2.1, we’ve deprecated the Distance API previously offered and replaced it with the improved &lt;a href=&quot;https://www.mapbox.com/api-documentation/#matrix&quot;&gt;Matrix API&lt;/a&gt;. This new API returns estimated route durations between coordinates as an array. The coordinates provided can either be a destination or a source and are automatically snapped to the road grid. Driving, cycling or walking profiles are supported and you can make up to 25 coordinates in a single request. Building a request and executing it is almost identical to other APIs offered in MAS:&lt;/p&gt;
566
-
567
- &lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Position&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;positions&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ArrayList&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
568
- &lt;span class=&quot;n&quot;&gt;positions&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Position&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;fromCoordinates&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;122.42&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;37.78&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;));&lt;/span&gt;
569
- &lt;span class=&quot;n&quot;&gt;positions&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Position&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;fromCoordinates&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;122.45&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;37.91&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;));&lt;/span&gt;
570
- &lt;span class=&quot;n&quot;&gt;positions&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Position&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;fromCoordinates&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;122.48&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;37.73&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;));&lt;/span&gt;
571
-
572
- &lt;span class=&quot;c1&quot;&gt;// Build the request&lt;/span&gt;
573
- &lt;span class=&quot;n&quot;&gt;MapboxDirectionsMatrix&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MapboxDirectionsMatrix&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;Builder&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
574
- &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setAccessToken&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;your&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;access&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;token&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;here&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;)&lt;/span&gt;
575
- &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setProfile&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DirectionsCriteria&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;PROFILE_WALKING&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
576
- &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setCoordinates&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;positions&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
577
- &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
578
-
579
- &lt;span class=&quot;o&quot;&gt;...&lt;/span&gt;
580
-
581
- &lt;/code&gt;&lt;/pre&gt;
582
- &lt;/div&gt;
583
-
584
- &lt;h2 id=&quot;navigation-sdk&quot;&gt;Navigation SDK&lt;/h2&gt;
585
- &lt;p&gt;We’ve also finalized the first generation of the &lt;a href=&quot;https://github.com/mapbox/mapbox-navigation-android&quot;&gt;Android Navigation SDK&lt;/a&gt;; this means the SDK has been moved to a separate Maven dependency and is no longer located inside MAS. This change comes with several improvements, like making the &lt;code class=&quot;highlighter-rouge&quot;&gt;RouteProgress&lt;/code&gt; class immutable and allowing us to add in new APIs. Under the hood, the SDK logic has been improved and includes an &lt;code class=&quot;highlighter-rouge&quot;&gt;OffRouteListener&lt;/code&gt; and rerouting capabilities.&lt;/p&gt;
586
-
587
- &lt;h2 id=&quot;getting-started&quot;&gt;Getting started&lt;/h2&gt;
588
- &lt;p&gt;Aside from the features listed above, MAS v2.1 also brings support for the Directions API &lt;code class=&quot;highlighter-rouge&quot;&gt;annotation&lt;/code&gt; and &lt;code class=&quot;highlighter-rouge&quot;&gt;weight&lt;/code&gt; query parameters, LocationEngine improvements allowing you to set more provider options, and significant bug fixes too. Check out the &lt;a href=&quot;https://www.mapbox.com/android-docs/mapbox-services/2.1.0/getting-started/&quot;&gt;new Android documentation&lt;/a&gt; and make sure to bump your project dependencies to 2.1 today!&lt;/p&gt;
589
- </description>
590
- <pubDate>Tue, 09 May 2017 23:00:00 -0400</pubDate>
591
- <dc:creator>Cameron Mace</dc:creator>
592
- <guid isPermaLink="true">https://www.mapbox.com/blog/mas-2.1-release/</guid>
593
- </item>
594
- <item>
595
- <title>Duda launches with Mapbox to add drag and drop maps</title>
596
- <link>https://www.mapbox.com/blog/duda-launches-with-mapbox/</link>
597
- <description>&lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/5/4177/33628427014_c8352e1d50_b.jpg&quot; alt=&quot;duda screenshot&quot; /&gt;&lt;/p&gt;
598
-
599
- &lt;p&gt;Duda has launched a new map tool in &lt;a href=&quot;https://www.dudamobile.com/&quot;&gt;its website builder&lt;/a&gt; to help web professionals, marketing agencies, and small businesses create websites that attract more customers.&lt;/p&gt;
600
-
601
- &lt;p&gt;Customers can find their business location using Mapbox’s &lt;a href=&quot;https://www.mapbox.com/geocoding/&quot;&gt;geocoding API&lt;/a&gt; and plot it on a &lt;a href=&quot;https://www.mapbox.com/maps/&quot;&gt;GL map&lt;/a&gt;. They then choose from a bank of custom map styles built in &lt;a href=&quot;https://www.mapbox.com/mapbox-studio/&quot;&gt;Mapbox Studio&lt;/a&gt;. The end users viewing the websites and maps can zoom in and out and pan around to see exactly where a business is located as well as what is nearby.&lt;/p&gt;
602
-
603
- &lt;p&gt;&lt;img src=&quot;https://i.imgur.com/xl0leFT.gif&quot; alt=&quot;Duda workflow&quot; /&gt;&lt;/p&gt;
604
-
605
- &lt;p&gt;Duda’s tools make it easy to drive more customers to a business location while still maintaining the personalized look and feel of a website.&lt;/p&gt;
606
-
607
- &lt;p&gt;Want to integrate maps with your business? &lt;a href=&quot;https://mapbox.com/signup/&quot;&gt;Sign up&lt;/a&gt; and build a custom map today. If you want to learn more about elevating your website with branded maps, &lt;a href=&quot;https://www.mapbox.com/contact/sales/?page=pricing&quot;&gt;contact our team&lt;/a&gt;.&lt;/p&gt;
608
- </description>
609
- <pubDate>Tue, 09 May 2017 07:00:00 -0400</pubDate>
610
- <dc:creator>Julie Munro</dc:creator>
611
- <guid isPermaLink="true">https://www.mapbox.com/blog/duda-launches-with-mapbox/</guid>
612
- </item>
613
- <item>
614
- <title>A whole new Earth for tracing on OpenStreetMap</title>
615
- <link>https://www.mapbox.com/blog/openstreetmap-digitalglobe/</link>
616
- <description>&lt;p&gt;Today, two new global satellite imagery layers are live for tracing on &lt;a href=&quot;https://www.openstreetmap.org/#map=5/51.468/0.000&quot;&gt;OpenStreetMap&lt;/a&gt;, courtesy of &lt;a href=&quot;http://blog.digitalglobe.com/news/digitalglobe-satellite-imagery-launch-for-openstreetmap/&quot;&gt;DigitalGlobe&lt;/a&gt;. Now, mappers have even more sources of high quality, recent imagery layers to trace, identify, and validate roads, places, and buildings to continue to expand this free and open database of the Earth’s features.&lt;/p&gt;
617
-
618
- &lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/5/4184/34377220552_df20080870_b.jpg&quot; alt=&quot;Forshaga.jpg&quot; /&gt;&lt;/p&gt;
619
-
620
- &lt;p&gt;&lt;em&gt;Now all of &lt;a href=&quot;https://github.com/openstreetmap/iD/issues/3907&quot;&gt;Forshaga, Sweden is in high definition&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
621
-
622
- &lt;p&gt;Mapbox is powering the system that keeps these new satellite imagery layers running and we’re still supporting development of &lt;a href=&quot;https://www.mapbox.com/blog/tags/id/&quot;&gt;OpenStreetMap’s iD Editor&lt;/a&gt;. You’ll notice that today, iD has new imagery that is ready for tracing!&lt;/p&gt;
623
-
624
- &lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/5/4176/34408785691_70585d04a1_b.jpg&quot; alt=&quot;Ilebo.jpg&quot; /&gt;&lt;/p&gt;
625
-
626
- &lt;p&gt;&lt;em&gt;No longer missing from the map: Ilebo, Democratic Republic of Congo&lt;/em&gt;&lt;/p&gt;
627
-
628
- &lt;p&gt;New to OpenStreetMap? Check out new imagery on iD and &lt;a href=&quot;https://openstreetmap.org/edit&quot;&gt;map the entire world&lt;/a&gt;.&lt;/p&gt;
629
- </description>
630
- <pubDate>Tue, 09 May 2017 00:00:00 -0400</pubDate>
631
- <dc:creator>Angelina Calderon</dc:creator>
632
- <guid isPermaLink="true">https://www.mapbox.com/blog/openstreetmap-digitalglobe/</guid>
633
- </item>
634
- <item>
635
- <title>Efficient multi-stop routes with the Optimization API</title>
636
- <link>https://www.mapbox.com/blog/optimization-api/</link>
637
- <description>&lt;p&gt;Today we’re launching the &lt;a href=&quot;https://www.mapbox.com/api-documentation/#optimized-trips&quot;&gt;Optimization API&lt;/a&gt;, which lets you quickly optimize multi-stop itineraries. You can pass up to 12 locations to the API and it will return the optimal order for making the stops based on travel time. You’ll also get detailed instructions for turn-by-turn guidance and accurate ETA predictions for each stop.&lt;/p&gt;
638
-
639
- &lt;p&gt;&lt;img src=&quot;https://i.imgur.com/QMdfTeh.gif&quot; alt=&quot;Find the fastest way to make deliveries around SF&quot; /&gt;
640
- &lt;em&gt;&lt;a href=&quot;https://www.mapbox.com/bites/00331/&quot;&gt;Try the demo&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
641
-
642
- &lt;p&gt;We built this API to power apps providing on-demand delivery, transportation, or logistics services. &lt;a href=&quot;https://www.saucey.com/&quot;&gt;Saucey&lt;/a&gt;, an app providing on-demand alcohol delivery in five American cities, uses the Optimization API to hit their 30-minute delivery commitment to their customers. Once a courier picks up products at a liquor store, Saucey hits the Optimization API from their servers to determine the most efficient way to drop-off the items.&lt;/p&gt;
643
-
644
- &lt;p&gt;Another app, &lt;a href=&quot;https://barklypets.com/&quot;&gt;Barkly&lt;/a&gt;, connects dog owners to safe and reliable dog walkers. Barkly uses the Optimization API to help walkers plan their daily schedule and warns walkers if they’re about to take on too much work for a single day. And because the Optimization API works on walking routes, it can be used to plan the dog walks themselves too.&lt;/p&gt;
645
-
646
- &lt;p&gt;Here’s an example request that optimizes the order of visiting three locations:&lt;/p&gt;
647
-
648
- &lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;https://api.mapbox.com/optimized-trips/v1/mapbox/driving/-122.42,37.78;-122.45,37.91;-122.48,37.73?access_token=your-access-token
649
- &lt;/code&gt;&lt;/pre&gt;
650
- &lt;/div&gt;
651
-
652
- &lt;p&gt;The Optimization API is even more powerful when combined with our mobile &lt;a href=&quot;https://www.mapbox.com/navigation-sdk/&quot;&gt;Navigation SDK&lt;/a&gt;. You can plan complex routes using the Optimization API and then help drivers execute those plans with a custom turn-by-turn guidance interface built right into the driver’s app. You can add and remove stops in response to changing customer orders and there’s no need for drivers to fumble with their phone to switch to a third-party navigation app, which leads to increased safety and efficiency. This navigation also includes real-time traffic, thereby helping drivers avoid congestion and get more deliveries done faster.&lt;/p&gt;
653
-
654
- &lt;p&gt;This API joins a growing list of Mapbox tools that support use cases for on-demand logistics. Ride-sharing platform &lt;a href=&quot;http://www.tapridemobile.com/&quot;&gt;TapRide&lt;/a&gt;, which provides mobile ride-hailing and dispatching for privately operated fleets, uses Mapbox for map display and traffic-based routing to help find the best route and accurately predict an ETA for customers.&lt;/p&gt;
655
-
656
- &lt;p&gt;&lt;a href=&quot;https://www.mapbox.com/api-documentation/#optimization&quot;&gt;Learn more about the Optimization API in the docs&lt;/a&gt; or &lt;a href=&quot;https://www.mapbox.com/industries/logistics/&quot;&gt;see how we’re helping businesses solve logistics problems&lt;/a&gt;.&lt;/p&gt;
657
- </description>
658
- <pubDate>Mon, 08 May 2017 06:00:00 -0400</pubDate>
659
- <dc:creator>Will White</dc:creator>
660
- <guid isPermaLink="true">https://www.mapbox.com/blog/optimization-api/</guid>
661
- </item>
662
- <item>
663
- <title>WGS84 precision in Unity World Space</title>
664
- <link>https://www.mapbox.com/blog/wgs84-in-unity/</link>
665
- <description>&lt;p&gt;When working in Unity, placing features on a map in the correct geographic coordinates requires accuracy and precision in order to match real world locations. This can be tricky, so we’ve created a geo coordinates data structure to match Unity World Space with the real world. Here is a preview of what is shipping in our latest Mapbox Unity SDK release.&lt;/p&gt;
666
-
667
- &lt;p&gt;Unity’s coordinate system math is based on 32 bit floats, which causes floating point precision issues when working at a global scale. For example, a longitude in San Francisco, -122.450475, can round to -122.450478 as a 32 bit float. That error might not matter in some contexts, but in terms of longitude it’s enough to put a mailbox in the middle of the street instead of on a sidewalk. The rounding problems can increase as transforms (such as rotation and motion) build on each other. To solve the problem, we implemented a &lt;code class=&quot;highlighter-rouge&quot;&gt;Vector2&lt;/code&gt; struct with 64 bit floats, called &lt;code class=&quot;highlighter-rouge&quot;&gt;Vector2d&lt;/code&gt;. This means that within the Mapbox Unity SDK, geo coordinates are stored and manipulated as 64 bit values to maintain precision.&lt;/p&gt;
668
-
669
- &lt;h2 id=&quot;relative-positioning-reduces-precision-loss&quot;&gt;Relative positioning reduces precision loss&lt;/h2&gt;
670
-
671
- &lt;p&gt;Now that we have more precise storage, we can safely convert WGS84 longitude and latitude (real-world GPS coordinates) into Unity World Space. For the conversion, we use &lt;a href=&quot;http://spatialreference.org/ref/sr-org/7483/&quot;&gt;Spherical Mercator, EPSG:3857&lt;/a&gt;. That’s the projection from longitude and latitude into planar coordinates, which can easily be positioned in Unity on a plane.&lt;/p&gt;
672
-
673
- &lt;p&gt;At this point, another problem appears. Our Spherical Mercator coordinates are safely stored as 64 bit floats, but we will lose that precision when we try to put the values into a Unity GameObject’s transform, which is a 32 bit float &lt;code class=&quot;highlighter-rouge&quot;&gt;Vector2&lt;/code&gt; class.&lt;/p&gt;
674
-
675
- &lt;p&gt;To resolve this, we use relative positioning. The center of the very first tile loaded is moved to the Unity World Space origin, then used as a reference for every other tile and object that we create to make a map. For example, if the tile containing City Hall is at &lt;code class=&quot;highlighter-rouge&quot;&gt;(4548003.18297, -13627499.15079)&lt;/code&gt;, and another point is at &lt;code class=&quot;highlighter-rouge&quot;&gt;(4549226.17542, -13630556.63193)&lt;/code&gt;, we can consider the second point as being at its distance (x and y difference) from City Hall: &lt;code class=&quot;highlighter-rouge&quot;&gt;(-1222.99245, 3057.48114)&lt;/code&gt;. That relative value converts to a 32 bit float with much less loss of precision, because standard floating point numbers are more precise at values nearer 1.&lt;/p&gt;
676
-
677
- &lt;h2 id=&quot;rendering-continent-sized-areas&quot;&gt;Rendering continent-sized areas&lt;/h2&gt;
678
-
679
- &lt;p&gt;But this raises another question: What if the initial tile itself is too big for the float range? For example, if you render the entire continent of North America in zoom level 1, your tile size will be &lt;code class=&quot;highlighter-rouge&quot;&gt;(20037508.34279, 20037508.34279)&lt;/code&gt;, and you’ll start having problems if, let’s say, you want to place a cube on each corner of this tile.&lt;/p&gt;
680
-
681
- &lt;p&gt;A solution we use in our demos is to simply scale down the entire world. Scaling by a factor of 1/1000, for example, gives you a reasonably sized world to play with. However, this will result in some loss of precision: it’s a trade-off. Use the size of the features (such as buildings or terrain) that you want to include in your project to find a good scale for it. You can alter the scale factor dynamically by using the TileSize property in the MapController in the demos.&lt;/p&gt;
682
-
683
- &lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/5/4156/34439804655_b712a8c867_b.jpg&quot; alt=&quot;results of using doubles&quot; /&gt;&lt;/p&gt;
684
- &lt;div class=&quot;caption&quot;&gt;Before and after switching to double data type.&lt;/div&gt;
685
-
686
- &lt;p&gt;Download our &lt;a href=&quot;https://www.mapbox.com/unity&quot;&gt;latest SDK&lt;/a&gt; to use these new features and let us know what you think of the code on &lt;a href=&quot;https://github.com/mapbox/mapbox-unity-sdk&quot;&gt;GitHub repo&lt;/a&gt;.&lt;/p&gt;
687
- </description>
688
- <pubDate>Fri, 05 May 2017 14:00:00 -0400</pubDate>
689
- <dc:creator>Baran Kahyaoglu</dc:creator>
690
- <guid isPermaLink="true">https://www.mapbox.com/blog/wgs84-in-unity/</guid>
691
- </item>
692
- <item>
693
- <title>Welcome, Olivia Brundage!</title>
694
- <link>https://www.mapbox.com/blog/welcome-olivia/</link>
695
- <description>&lt;p&gt;&lt;a href=&quot;https://www.mapbox.com/about/team/olivia-brundage&quot;&gt;Olivia Brundage&lt;/a&gt; has joined the &lt;a href=&quot;https://www.mapbox.com/platform/security/&quot;&gt;security&lt;/a&gt; team at Mapbox in D.C., where she’ll be focused on enhancing our auditing and monitoring tools and further developing our procedures for internal penetration testing. She will also be leading efforts in refining our security and privacy best practices. Olivia has experience in securing both startups and the government’s technological infrastructure.&lt;/p&gt;
696
-
697
- &lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/5/4180/33548020134_6bf5c36df6.jpg&quot; alt=&quot;Olivia&quot; /&gt;&lt;/p&gt;
698
-
699
- &lt;p&gt;Olivia is active in both the DC and Baltimore tech scene, where she helps co-organize events like &lt;a href=&quot;http://charmcityjs.com/&quot;&gt;CharmCityJS&lt;/a&gt;. She also helps mentors programmers from all levels at &lt;a href=&quot;https://codebuddies.org/&quot;&gt;CodeBuddies&lt;/a&gt;, an online platform dedicated to sharing knowledge.&lt;/p&gt;
700
-
701
- &lt;p&gt;Welcome, Olivia!&lt;/p&gt;
702
- </description>
703
- <pubDate>Wed, 03 May 2017 16:00:00 -0400</pubDate>
704
- <dc:creator>Ian Ward</dc:creator>
705
- <guid isPermaLink="true">https://www.mapbox.com/blog/welcome-olivia/</guid>
706
- </item>
707
- <item>
708
- <title>Designing live traffic</title>
709
- <link>https://www.mapbox.com/blog/live-traffic-maps/</link>
710
- <description>&lt;p&gt;Our new traffic maps are live in our API! Take a look at the changes we’ve made to our traffic cartography in these side by side images:&lt;/p&gt;
711
-
712
- &lt;h2 id=&quot;improved-color-classification-for-live-traffic&quot;&gt;Improved color classification for live traffic&lt;/h2&gt;
713
- &lt;p&gt;We shifted the spectrum of traffic colors from green/yellow/orange/red to green/orange/red/dark red for easier recognition, and increased color contrast for improved color-blind support. Since colors vary widely across devices (particularly between iOS and Android devices), we tested for adequate visibility on widely differing screens.&lt;/p&gt;
714
-
715
- &lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/5/4182/34296361161_34a1597f69_o.png&quot; alt=&quot;New York roadways&quot; /&gt;&lt;/p&gt;
716
- &lt;div class=&quot;caption&quot;&gt;Traffic Day, Version 2 (left), Version 1 (right)&lt;/div&gt;
717
-
718
- &lt;h2 id=&quot;road-separation-at-junctions&quot;&gt;Road separation at junctions&lt;/h2&gt;
719
- &lt;p&gt;Traffic lines are now separated into surface roads, bridges, and tunnels, with differentiated styling for tunnels. At each junction, it’s now much easier to identify which roads intersect and which overlap.&lt;/p&gt;
720
-
721
- &lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/5/4157/34042637400_7fdfb8ba76_o.png&quot; alt=&quot;Holland tunnel road separation&quot; /&gt;&lt;/p&gt;
722
- &lt;div class=&quot;caption&quot;&gt;Traffic Day, Version 2 (left), Version 1 (right)&lt;/div&gt;
723
-
724
- &lt;h2 id=&quot;improved-density-and-hierarchy-of-traffic-data&quot;&gt;Improved density and hierarchy of traffic data&lt;/h2&gt;
725
- &lt;p&gt;At each zoom level, we adjusted the density and hierarchy of traffic data for different road classes, and refined the styling – particularly line widths, offsets, and outlines – of both the traffic lines and underlying roads. This improves a variety of map contexts, including:&lt;/p&gt;
726
-
727
- &lt;ul&gt;
728
- &lt;li&gt;Highway intersections: thinner highway links no longer obscure motorways and trunks&lt;/li&gt;
729
- &lt;li&gt;Dense urban grids: major road networks are now more prominent&lt;/li&gt;
730
- &lt;li&gt;Town centers and remote areas: main roads that lead into these areas are visible at lower zoom levels&lt;/li&gt;
731
- &lt;/ul&gt;
732
-
733
- &lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/5/4162/34428323555_b06c603b5f_o.png&quot; alt=&quot;Traffic hierarchy&quot; /&gt;&lt;/p&gt;
734
- &lt;div class=&quot;caption&quot;&gt;Traffic Day, Version 2 (left), Version 1 (right)&lt;/div&gt;
735
- &lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/3/2857/33585787904_a4230d6583_o.png&quot; alt=&quot;Forest traffic&quot; /&gt;&lt;/p&gt;
736
- &lt;div class=&quot;caption&quot;&gt;Traffic Day, Version 2 (left), Version 1 (right)&lt;/div&gt;
737
-
738
- &lt;h2 id=&quot;more-focus-on-vehicular-roads&quot;&gt;More focus on vehicular roads&lt;/h2&gt;
739
- &lt;p&gt;To reduce visual noise, we removed networks that are not relevant for drivers: pedestrian roads, paths, aerial ways.&lt;/p&gt;
740
-
741
- &lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/3/2884/34268513692_c3a56b0fb1_o.png&quot; alt=&quot;Less noise on roads&quot; /&gt;&lt;/p&gt;
742
- &lt;div class=&quot;caption&quot;&gt;Traffic Day, Version 2 (left), Version 1 (right)&lt;/div&gt;
743
-
744
- &lt;h2 id=&quot;improved-legibility-of-high-zoom-level-labels&quot;&gt;Improved legibility of high zoom level labels&lt;/h2&gt;
745
- &lt;p&gt;We made high zoom level labels (particularly road labels) larger and higher contrast to be more readable against the traffic data, especially when viewed in natural light.&lt;/p&gt;
746
-
747
- &lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/5/4190/33585902454_4c1452714d_o.png&quot; alt=&quot;Zoom level labels&quot; /&gt;&lt;/p&gt;
748
- &lt;div class=&quot;caption&quot;&gt;Traffic Day, Version 2 (left), Version 1 (right)&lt;/div&gt;
749
-
750
- &lt;h2 id=&quot;relevant-secondary-map-features&quot;&gt;Relevant secondary map features&lt;/h2&gt;
751
- &lt;p&gt;In this update, we refined secondary features to complement and enhance the usability of traffic data, rather than compete with them. We added terrain and parking landuse, and removed all minor POIs unrelated to navigation.&lt;/p&gt;
752
-
753
- &lt;p&gt;We also simplified the color scheme for secondary features: most high-zoom-level features – including landuse, buildings, points-of-interest, and minor places – are on a spectrum from blue to gray, based on a consistent hue.&lt;/p&gt;
754
-
755
- &lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/5/4173/34268639272_5b2fb022fc_o.png&quot; alt=&quot;Secondary features&quot; /&gt;&lt;/p&gt;
756
- &lt;div class=&quot;caption&quot;&gt;Traffic Day, Version 2 (left), Version 1 (right)&lt;/div&gt;
757
-
758
- &lt;h2 id=&quot;more-legible-night-color-scheme-for-nighttime-use&quot;&gt;More legible ‘Night’ color scheme for nighttime use&lt;/h2&gt;
759
-
760
- &lt;p&gt;We’ve improved the color scheme of our companion ‘Night’ traffic map to be much more comfortable on your eyes and more readable in low-light contexts.&lt;/p&gt;
761
-
762
- &lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/5/4164/33617863893_4bfbaa6099_o.png&quot; alt=&quot;Improved night&quot; /&gt;&lt;/p&gt;
763
- &lt;div class=&quot;caption&quot;&gt;Traffic Day, Version 2 (left), Version 1 (right)&lt;/div&gt;
764
-
765
- &lt;p&gt;&lt;a href=&quot;https://www.mapbox.com/studio/&quot;&gt;Login to Studio&lt;/a&gt; to start building with our new traffic styles, and stayed tuned for more updates!&lt;/p&gt;
766
- </description>
767
- <pubDate>Wed, 03 May 2017 06:00:00 -0400</pubDate>
768
- <dc:creator>Nicki Dlugash</dc:creator>
769
- <guid isPermaLink="true">https://www.mapbox.com/blog/live-traffic-maps/</guid>
770
- </item>
771
- <item>
772
- <title>Say hello to the Studio Preview app</title>
773
- <link>https://www.mapbox.com/blog/studio-preview/</link>
774
- <description>&lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/5/4179/34369529636_3992606fd9_b.jpg&quot; alt=&quot;Mapbox Studio Preview on Devices&quot; /&gt;&lt;/p&gt;
775
-
776
- &lt;p&gt;We just released &lt;a href=&quot;https://itunes.apple.com/app/apple-store/id1208400007?pt=34158803&amp;amp;ct=blog-launch-20170502&amp;amp;mt=8&quot;&gt;Mapbox Studio Preview&lt;/a&gt; on the App Store. Studio Preview, a companion app to Mapbox Studio, allows you to view any map style directly from your device. Whether you’re prototyping a new feature, or getting ready to submit to the App Store, Studio Preview helps you design the right map for your iOS app.&lt;/p&gt;
777
-
778
- &lt;p&gt;&lt;a href=&quot;https://itunes.apple.com/app/apple-store/id1208400007?pt=34158803&amp;amp;ct=blog-launch-20170502&amp;amp;mt=8&quot;&gt;Try it out&lt;/a&gt; with our out-of-the-box map styles like Streets, Outdoors, and Traffic, or log in to your account and preview all of your custom Studio designs.&lt;/p&gt;
779
- </description>
780
- <pubDate>Tue, 02 May 2017 10:30:00 -0400</pubDate>
781
- <dc:creator>Eric Wolfe</dc:creator>
782
- <guid isPermaLink="true">https://www.mapbox.com/blog/studio-preview/</guid>
783
- </item>
784
- <item>
785
- <title>Redux for state management in large web apps</title>
786
- <link>https://www.mapbox.com/blog/redux-for-state-management-in-large-web-apps/</link>
787
- <description>&lt;p&gt;Building a state management system around &lt;a href=&quot;http://redux.js.org/&quot;&gt;Redux&lt;/a&gt; has allowed us to keep the complex codebase of Mapbox Studio (our version of Photoshop for maps) manageable and testable. We’ve used Redux to establish interlocking systems defined by clear, scoped responsibilities and repeatable patterns. We impose restrictions on what code we put where, which make the codebase as a whole more organized, predictable, legible, and testable. These patterns also allow us to increase the quantity of code, as the application grows, without adding complexity to the architecture. &lt;em&gt;(&lt;a href=&quot;https://css-tricks.com/learning-react-redux/&quot;&gt;For those new to Redux, this is a must-read 101&lt;/a&gt;).&lt;/em&gt;&lt;/p&gt;
788
-
789
- &lt;h2 id=&quot;overview-of-studios-redux-architecture&quot;&gt;Overview of Studio’s Redux architecture&lt;/h2&gt;
790
-
791
- &lt;p&gt;Our Redux architecture boils down to three highly patterned function types: reducers, action creators, and selectors. After establishing solid conventions and patterns for each type, we can add more functions indefinitely and each addition will fit neatly and predictably into the existing system (and each will be thoroughly testable in isolation).&lt;/p&gt;
792
-
793
- &lt;p&gt;These function types interact with a few other elements to define the unidirectional flow of information in our application.&lt;/p&gt;
794
-
795
- &lt;p&gt;&lt;img src=&quot;data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20900%20500%22%3E%0A%20%20%3Ctitle%3EOverview%3C%2Ftitle%3E%0A%20%20%3Cg%3E%0A%20%20%20%20%3Crect%20x%3D%22555%22%20y%3D%22150%22%20width%3D%22267%22%20height%3D%22216%22%20fill%3D%22%23f4f7fb%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M617.74%2C183H614.7l-3.42-4.66H609.3V183h-2.7V169.8h4.96c2.78%2C0%2C4.76%2C1.68%2C4.76%2C4.26a4.07742%2C4.07742%2C0%2C0%2C1-2.32%2C3.76Zm-8.44-10.82v3.78h2.26a1.893%2C1.893%2C0%2C1%2C0%2C0-3.78Zm17.54-2.62a6.84183%2C6.84183%2C0%2C1%2C1-7%2C6.84A6.88211%2C6.88211%2C0%2C0%2C1%2C626.84%2C169.56Zm.02%2C2.5a4.34118%2C4.34118%2C0%2C1%2C0%2C4.24%2C4.34A4.13408%2C4.13408%2C0%2C0%2C0%2C626.86%2C172.06Zm17.04-2.5a6.84183%2C6.84183%2C0%2C1%2C1-7%2C6.84A6.88207%2C6.88207%2C0%2C0%2C1%2C643.9%2C169.56Zm.02%2C2.5a4.34118%2C4.34118%2C0%2C1%2C0%2C4.24%2C4.34A4.13408%2C4.13408%2C0%2C0%2C0%2C643.92%2C172.06Zm20.42-2.26H653.18v2.44h4.22V183h2.7V172.24H664.34ZM684.86%2C183h-3.04l-3.42-4.66h-1.98V183h-2.7V169.8h4.96c2.78%2C0%2C4.76%2C1.68%2C4.76%2C4.26a4.07742%2C4.07742%2C0%2C0%2C1-2.32%2C3.76Zm-8.44-10.82v3.78h2.26a1.893%2C1.893%2C0%2C1%2C0%2C0-3.78Zm20.48-2.38h-8.88V183h9.12v-2.44h-6.42v-3.34h4.54v-2.3h-4.54v-2.68H696.9Zm8.4%2C0c4.24%2C0%2C7.2%2C2.6%2C7.2%2C6.56%2C0%2C3.9-2.96%2C6.64-7.2%2C6.64h-4.32V169.8Zm-.02%2C2.44h-1.6v8.32h1.6c2.66%2C0%2C4.43994-1.66%2C4.43994-4.2C709.72%2C173.76%2C707.94%2C172.24%2C705.28%2C172.24Zm22.08-2.44h-2.7v7.94a2.90166%2C2.90166%2C0%2C1%2C1-5.8%2C0V169.8h-2.7v7.74a5.60088%2C5.60088%2C0%2C1%2C0%2C11.2%2C0Zm10.7-.24a6.84258%2C6.84258%2C0%2C1%2C0-.02%2C13.68%2C6.5442%2C6.5442%2C0%2C0%2C0%2C5.84-3.28l-2.04-1.44a4.29836%2C4.29836%2C0%2C0%2C1-3.78%2C2.22%2C4.34075%2C4.34075%2C0%2C0%2C1%2C0-8.68%2C4.29836%2C4.29836%2C0%2C0%2C1%2C3.78%2C2.22l2.04-1.44A6.558%2C6.558%2C0%2C0%2C0%2C738.06%2C169.56Zm18.5.24h-8.88V183h9.12v-2.44h-6.42v-3.34h4.54v-2.3h-4.54v-2.68h6.18ZM771.78%2C183h-3.04l-3.42-4.66h-1.98V183h-2.7V169.8h4.96c2.78%2C0%2C4.76%2C1.68%2C4.76%2C4.26a4.07731%2C4.07731%2C0%2C0%2C1-2.32%2C3.76Zm-8.44-10.82v3.78H765.6a1.893%2C1.893%2C0%2C1%2C0%2C0-3.78Z%22%20fill%3D%22%23273d56%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M627.12%2C426l-.74-1.72h-5.4l-.74%2C1.72h-2.9l5.9-13.44h.9L630.02%2C426Zm-1.68-3.94-1.76-4.46-1.76%2C4.46Zm12.84-9.26c2.78%2C0%2C4.75995%2C1.68%2C4.75995%2C4.26%2C0%2C2.54-1.98%2C4.28-4.75995%2C4.28h-2.26V426h-2.7V412.8Zm0%2C2.38h-2.26v3.8h2.26a1.90251%2C1.90251%2C0%2C1%2C0%2C0-3.8ZM651.66%2C412.8c2.78%2C0%2C4.76%2C1.68%2C4.76%2C4.26%2C0%2C2.54-1.98%2C4.28-4.76%2C4.28H649.4V426h-2.7V412.8Zm0%2C2.38H649.4v3.8H651.66a1.90251%2C1.90251%2C0%2C1%2C0%2C0-3.8ZM662.78%2C412.8h-2.7V426h8.48v-2.44h-5.78Zm11.98%2C0h-2.7V426h2.7Zm10.8-.24a6.84257%2C6.84257%2C0%2C1%2C0-.02%2C13.68%2C6.54414%2C6.54414%2C0%2C0%2C0%2C5.84-3.28l-2.04-1.44a4.2983%2C4.2983%2C0%2C0%2C1-3.78%2C2.22%2C4.34075%2C4.34075%2C0%2C0%2C1%2C0-8.68%2C4.29836%2C4.29836%2C0%2C0%2C1%2C3.78%2C2.22l2.04-1.44A6.558%2C6.558%2C0%2C0%2C0%2C685.56%2C412.56ZM703.5%2C426l-.74-1.72h-5.4l-.74%2C1.72h-2.9l5.9-13.44h.9L706.4%2C426Zm-1.68-3.94-1.76-4.46-1.76%2C4.46Zm16.3-9.26H706.96v2.44h4.22V426h2.7V415.24h4.24Zm5.98%2C0h-2.7V426h2.7Zm10.76-.24a6.84182%2C6.84182%2C0%2C1%2C1-7%2C6.84A6.88212%2C6.88212%2C0%2C0%2C1%2C734.86%2C412.56Zm.02%2C2.5a4.34118%2C4.34118%2C0%2C1%2C0%2C4.24%2C4.34A4.134%2C4.134%2C0%2C0%2C0%2C734.88%2C415.06Zm19.34-2.26v7.88l-7.66-8.12h-.88V426h2.7v-7.92l7.64%2C8.16h.9V412.8ZM662.28%2C436.56c-2.48%2C0-4.38%2C1.46-4.38%2C3.74%2C0%2C1.86%2C1.31995%2C2.94%2C3.2%2C3.8l1.42.64c1.04.48%2C1.68.78%2C1.68%2C1.64%2C0%2C.92-.72%2C1.46-1.88%2C1.46a3.87724%2C3.87724%2C0%2C0%2C1-3.24-1.92l-1.86%2C1.4a5.6999%2C5.6999%2C0%2C0%2C0%2C5.1%2C2.92c2.62%2C0%2C4.62-1.5%2C4.62-3.96%2C0-1.88-1.18-2.94-3.26-3.86l-1.5-.66c-.96-.44-1.54-.76-1.54-1.52%2C0-.88.76-1.28%2C1.64-1.28a2.94583%2C2.94583%2C0%2C0%2C1%2C2.52%2C1.52l1.84-1.42A4.76%2C4.76%2C0%2C0%2C0%2C662.28%2C436.56Zm18.46.24H669.58v2.44h4.22V450h2.7V439.24h4.24Zm10.3%2C13.2-.74-1.72h-5.4L684.16%2C450h-2.9l5.9-13.44h.9L693.94%2C450Zm-1.68-3.94-1.76-4.46L685.84%2C446.06Zm16.3-9.26H694.5v2.44h4.22V450h2.7V439.24h4.24Zm12.16%2C0h-8.88V450h9.12v-2.44h-6.42v-3.34h4.54v-2.3h-4.54v-2.68h6.18Z%22%20fill%3D%22%23273d56%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M130.28%2C294h-3.04l-3.42-4.66h-1.98V294h-2.7V280.8h4.96c2.78%2C0%2C4.76%2C1.68%2C4.76%2C4.26a4.07737%2C4.07737%2C0%2C0%2C1-2.32%2C3.76Zm-8.44-10.82v3.78h2.26a1.893%2C1.893%2C0%2C1%2C0%2C0-3.78Zm20.48-2.38h-8.88V294h9.12v-2.44h-6.42v-3.34h4.54v-2.3h-4.54v-2.68h6.18Zm12.6%2C13.2-.74-1.72h-5.4l-.74%2C1.72h-2.9l5.9-13.44h.9L157.82%2C294Zm-1.68-3.94-1.76-4.46-1.76%2C4.46Zm13.84-9.5a6.84257%2C6.84257%2C0%2C1%2C0-.02%2C13.68%2C6.54407%2C6.54407%2C0%2C0%2C0%2C5.84-3.28l-2.04-1.44a4.29821%2C4.29821%2C0%2C0%2C1-3.78%2C2.22%2C4.34075%2C4.34075%2C0%2C0%2C1%2C0-8.68%2C4.29827%2C4.29827%2C0%2C0%2C1%2C3.78%2C2.22l2.04-1.44A6.55789%2C6.55789%2C0%2C0%2C0%2C167.08%2C280.56Zm19.54.24H175.46v2.44h4.22V294h2.7V283.24h4.24ZM85.99%2C307.56a6.84257%2C6.84257%2C0%2C1%2C0-.02%2C13.68%2C6.54407%2C6.54407%2C0%2C0%2C0%2C5.84-3.28l-2.04-1.44a4.2982%2C4.2982%2C0%2C0%2C1-3.78%2C2.22%2C4.34075%2C4.34075%2C0%2C0%2C1%2C0-8.68%2C4.29826%2C4.29826%2C0%2C0%2C1%2C3.78%2C2.22l2.04-1.44A6.5579%2C6.5579%2C0%2C0%2C0%2C85.99%2C307.56Zm15.76%2C0a6.84182%2C6.84182%2C0%2C1%2C1-7%2C6.84A6.88209%2C6.88209%2C0%2C0%2C1%2C101.75%2C307.56Zm.02%2C2.5a4.34118%2C4.34118%2C0%2C1%2C0%2C4.24%2C4.34A4.13406%2C4.13406%2C0%2C0%2C0%2C101.77%2C310.06Zm22.84-2.5-5.58%2C7.14-5.58-7.14h-.88V321h2.7v-7.04l3.32%2C4.16h.88l3.32-4.16V321h2.7V307.56Zm10.38.24c2.78%2C0%2C4.76%2C1.68%2C4.76%2C4.26%2C0%2C2.54-1.98%2C4.28-4.76%2C4.28h-2.26V321h-2.7V307.8Zm0%2C2.38h-2.26v3.8h2.26a1.90251%2C1.90251%2C0%2C1%2C0%2C0-3.8Zm14.66-2.62a6.84182%2C6.84182%2C0%2C1%2C1-7%2C6.84A6.88209%2C6.88209%2C0%2C0%2C1%2C149.65%2C307.56Zm.02%2C2.5a4.34118%2C4.34118%2C0%2C1%2C0%2C4.24%2C4.34A4.13407%2C4.13407%2C0%2C0%2C0%2C149.67%2C310.06Zm19.34-2.26v7.88l-7.66-8.12h-.88V321h2.7v-7.92l7.64%2C8.16h.9V307.8Zm16.1%2C0h-8.88V321h9.12v-2.44h-6.42v-3.34h4.54v-2.3h-4.54v-2.68h6.18Zm12.62%2C0v7.88l-7.66-8.12h-.88V321h2.7v-7.92l7.64%2C8.16h.9V307.8Zm17.14%2C0H203.71v2.44h4.22V321h2.7V310.24h4.24Zm7.42-.24c-2.48%2C0-4.38%2C1.46-4.38%2C3.74%2C0%2C1.86%2C1.32%2C2.94%2C3.2%2C3.8l1.42.64c1.04.48%2C1.68.78%2C1.68%2C1.64%2C0%2C.92-.72%2C1.46-1.88%2C1.46a3.87733%2C3.87733%2C0%2C0%2C1-3.24-1.92l-1.86%2C1.4a5.69985%2C5.69985%2C0%2C0%2C0%2C5.1%2C2.92c2.62%2C0%2C4.62-1.5%2C4.62-3.96%2C0-1.88-1.18-2.94-3.26-3.86l-1.5-.66c-.96-.44-1.54-.76-1.54-1.52%2C0-.88.76-1.28%2C1.64-1.28a2.94583%2C2.94583%2C0%2C0%2C1%2C2.52%2C1.52l1.84-1.42A4.76%2C4.76%2C0%2C0%2C0%2C222.29%2C307.56Z%22%20fill%3D%22%23273d56%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M278.27%2C170l-.74-1.72h-5.4l-.74%2C1.72h-2.9l5.9-13.44h.9L281.17%2C170Zm-1.68-3.94-1.76-4.46-1.76%2C4.46Zm13.84-9.5a6.84258%2C6.84258%2C0%2C1%2C0-.02%2C13.68%2C6.54415%2C6.54415%2C0%2C0%2C0%2C5.84-3.28l-2.04-1.44a4.29827%2C4.29827%2C0%2C0%2C1-3.78%2C2.22%2C4.34075%2C4.34075%2C0%2C0%2C1%2C0-8.68%2C4.29827%2C4.29827%2C0%2C0%2C1%2C3.78%2C2.22l2.04-1.44A6.55791%2C6.55791%2C0%2C0%2C0%2C290.43%2C156.56Zm19.54.24H298.81v2.44h4.22V170h2.7V159.24h4.24Zm5.98%2C0h-2.7V170h2.7Zm10.76-.24a6.84183%2C6.84183%2C0%2C1%2C1-7%2C6.84A6.8821%2C6.8821%2C0%2C0%2C1%2C326.71%2C156.56Zm.02%2C2.5a4.34118%2C4.34118%2C0%2C1%2C0%2C4.24%2C4.34A4.13407%2C4.13407%2C0%2C0%2C0%2C326.73%2C159.06Zm19.34-2.26v7.88l-7.66-8.12h-.88V170h2.7v-7.92l7.64%2C8.16h.9V156.8Zm-84.18%2C26.76a6.84258%2C6.84258%2C0%2C1%2C0-.02%2C13.68%2C6.54411%2C6.54411%2C0%2C0%2C0%2C5.84-3.28l-2.04-1.44a4.29831%2C4.29831%2C0%2C0%2C1-3.78%2C2.22%2C4.34075%2C4.34075%2C0%2C0%2C1%2C0-8.68%2C4.29831%2C4.29831%2C0%2C0%2C1%2C3.78%2C2.22l2.04-1.44A6.5579%2C6.5579%2C0%2C0%2C0%2C261.89%2C183.56ZM282.65%2C197h-3.04l-3.42-4.66h-1.98V197h-2.7V183.8h4.96c2.78%2C0%2C4.76%2C1.68%2C4.76%2C4.26a4.07742%2C4.07742%2C0%2C0%2C1-2.32%2C3.76Zm-8.44-10.82v3.78h2.26a1.893%2C1.893%2C0%2C1%2C0%2C0-3.78Zm20.48-2.38h-8.88V197h9.12v-2.44h-6.42v-3.34h4.54v-2.3h-4.54v-2.68h6.18Zm12.6%2C13.2-.74-1.72h-5.4l-.74%2C1.72h-2.9l5.9-13.44h.9L310.19%2C197Zm-1.68-3.94-1.76-4.46-1.76%2C4.46Zm16.3-9.26H310.75v2.44h4.22V197h2.7V186.24h4.24Zm9.22-.24a6.84183%2C6.84183%2C0%2C1%2C1-7%2C6.84A6.8821%2C6.8821%2C0%2C0%2C1%2C331.13%2C183.56Zm.02%2C2.5a4.34118%2C4.34118%2C0%2C1%2C0%2C4.24%2C4.34A4.13406%2C4.13406%2C0%2C0%2C0%2C331.15%2C186.06ZM353.09%2C197h-3.04l-3.42-4.66h-1.98V197h-2.7V183.8h4.96c2.78%2C0%2C4.76%2C1.68%2C4.76%2C4.26a4.07742%2C4.07742%2C0%2C0%2C1-2.32%2C3.76Zm-8.44-10.82v3.78h2.26a1.893%2C1.893%2C0%2C1%2C0%2C0-3.78Zm15.74-2.62c-2.48%2C0-4.38%2C1.46-4.38%2C3.74%2C0%2C1.86%2C1.32%2C2.94%2C3.2%2C3.8l1.42.64c1.04.48%2C1.68.78%2C1.68%2C1.64%2C0%2C.92-.72%2C1.46-1.88%2C1.46a3.87733%2C3.87733%2C0%2C0%2C1-3.24-1.92l-1.86%2C1.4a5.69984%2C5.69984%2C0%2C0%2C0%2C5.1%2C2.92c2.62%2C0%2C4.62-1.5%2C4.62-3.96%2C0-1.88-1.18-2.94-3.26-3.86l-1.5-.66c-.96-.44-1.54-.76-1.54-1.52%2C0-.88.76-1.28%2C1.64-1.28a2.94588%2C2.94588%2C0%2C0%2C1%2C2.52%2C1.52l1.84-1.42A4.76%2C4.76%2C0%2C0%2C0%2C360.39%2C183.56Z%22%20fill%3D%22%23273d56%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M434.38%2C163l-.74-1.72h-5.4L427.5%2C163h-2.9l5.9-13.44h.9L437.28%2C163Zm-1.68-3.94-1.76-4.46-1.76%2C4.46Zm13.84-9.5a6.84258%2C6.84258%2C0%2C1%2C0-.02%2C13.68%2C6.54411%2C6.54411%2C0%2C0%2C0%2C5.84-3.28l-2.04-1.44a4.29827%2C4.29827%2C0%2C0%2C1-3.78%2C2.22%2C4.34075%2C4.34075%2C0%2C0%2C1%2C0-8.68%2C4.29827%2C4.29827%2C0%2C0%2C1%2C3.78%2C2.22l2.04-1.44A6.55786%2C6.55786%2C0%2C0%2C0%2C446.54%2C149.56Zm19.54.24H454.92v2.44h4.22V163h2.7V152.24h4.24Zm5.98%2C0h-2.7V163h2.7Zm10.76-.24a6.84183%2C6.84183%2C0%2C1%2C1-7%2C6.84A6.88207%2C6.88207%2C0%2C0%2C1%2C482.82%2C149.56Zm.02%2C2.5a4.34118%2C4.34118%2C0%2C1%2C0%2C4.24%2C4.34A4.13406%2C4.13406%2C0%2C0%2C0%2C482.84%2C152.06Zm19.34-2.26v7.88l-7.66-8.12h-.88V163h2.7v-7.92l7.64%2C8.16h.9V149.8Zm11.42-1.58c-2.3%2C1.04-4.36%2C3.68-4.36%2C8.72%2C0%2C5%2C2.06%2C7.66%2C4.36%2C8.7l1.06-1.62c-1.6-1.06-3.06-3-3.06-7.08%2C0-4.12%2C1.46-6.04%2C3.06-7.1Zm8.74005%2C1.34c-2.48%2C0-4.38%2C1.46-4.38%2C3.74%2C0%2C1.86%2C1.32%2C2.94%2C3.2%2C3.8l1.42.64c1.04.48%2C1.68.78%2C1.68%2C1.64%2C0%2C.92-.72%2C1.46-1.88%2C1.46a3.87725%2C3.87725%2C0%2C0%2C1-3.24-1.92l-1.86%2C1.4a5.69972%2C5.69972%2C0%2C0%2C0%2C5.1%2C2.92c2.62%2C0%2C4.62-1.5%2C4.62-3.96%2C0-1.88-1.18-2.94-3.26-3.86l-1.5-.66c-.96-.44-1.54-.76-1.54-1.52%2C0-.88.76-1.28%2C1.64-1.28a2.94587%2C2.94587%2C0%2C0%2C1%2C2.52%2C1.52l1.84-1.42A4.76%2C4.76%2C0%2C0%2C0%2C522.34%2C149.56Zm8.62-1.34-1.08%2C1.62c1.6%2C1.06%2C3.08%2C2.98%2C3.08%2C7.1%2C0%2C4.08-1.48%2C6.02-3.08%2C7.08l1.08%2C1.62c2.28-1.04%2C4.34-3.7%2C4.34-8.7C535.3%2C151.9%2C533.24%2C149.26%2C530.96%2C148.22Z%22%20fill%3D%22%23c6d2e1%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M266.05%2C66l-.74-1.72h-5.4L259.17%2C66h-2.9l5.9-13.44h.9L268.95%2C66Zm-1.68-3.94-1.76-4.46-1.76%2C4.46Zm12.84-9.26c2.78%2C0%2C4.76%2C1.68%2C4.76%2C4.26%2C0%2C2.54-1.98%2C4.28-4.76%2C4.28h-2.26V66h-2.7V52.8Zm0%2C2.38h-2.26v3.8h2.26a1.9025%2C1.9025%2C0%2C1%2C0%2C0-3.8Zm11.12-2.38h-2.7V66h2.7Zm17.9-.24a6.84257%2C6.84257%2C0%2C1%2C0-.02%2C13.68%2C6.54408%2C6.54408%2C0%2C0%2C0%2C5.84-3.28l-2.04-1.44a4.29827%2C4.29827%2C0%2C0%2C1-3.78%2C2.22%2C4.34075%2C4.34075%2C0%2C0%2C1%2C0-8.68%2C4.29826%2C4.29826%2C0%2C0%2C1%2C3.78%2C2.22l2.04-1.44A6.55784%2C6.55784%2C0%2C0%2C0%2C306.23%2C52.56ZM324.17%2C66l-.74-1.72h-5.4L317.29%2C66h-2.9l5.9-13.44h.9L327.07%2C66Zm-1.68-3.94-1.76-4.46-1.76%2C4.46Zm10.58-9.26h-2.7V66h8.48V63.56h-5.78Zm11.98%2C0h-2.7V66h8.48V63.56h-5.78Zm13.42-.24c-2.48%2C0-4.38%2C1.46-4.38%2C3.74%2C0%2C1.86%2C1.32%2C2.94%2C3.2%2C3.8l1.42.64c1.04.48%2C1.68.78%2C1.68%2C1.64%2C0%2C.92-.72%2C1.46-1.88%2C1.46a3.87735%2C3.87735%2C0%2C0%2C1-3.24-1.92l-1.86%2C1.4a5.69982%2C5.69982%2C0%2C0%2C0%2C5.1%2C2.92c2.62%2C0%2C4.62-1.5%2C4.62-3.96%2C0-1.88-1.18-2.94-3.26-3.86l-1.5-.66c-.96-.44-1.54-.76-1.54-1.52%2C0-.88.76-1.28%2C1.64-1.28a2.94583%2C2.94583%2C0%2C0%2C1%2C2.52%2C1.52l1.84-1.42A4.75993%2C4.75993%2C0%2C0%2C0%2C358.47%2C52.56Z%22%20fill%3D%22%23273d56%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M254.85%2C424.56c-2.48%2C0-4.38%2C1.46-4.38%2C3.74%2C0%2C1.86%2C1.32%2C2.94%2C3.2%2C3.8l1.42.64c1.04.48%2C1.68.78%2C1.68%2C1.64%2C0%2C.92-.72%2C1.46-1.88%2C1.46a3.87733%2C3.87733%2C0%2C0%2C1-3.24-1.92l-1.86%2C1.4a5.69985%2C5.69985%2C0%2C0%2C0%2C5.1%2C2.92c2.62%2C0%2C4.62-1.5%2C4.62-3.96%2C0-1.88-1.18-2.94-3.26-3.86l-1.5-.66c-.96-.44-1.54-.76-1.54-1.52%2C0-.88.76-1.28%2C1.64-1.28a2.94581%2C2.94581%2C0%2C0%2C1%2C2.52%2C1.52l1.84-1.42A4.75993%2C4.75993%2C0%2C0%2C0%2C254.85%2C424.56Zm17.42.24h-8.88V438h9.12v-2.44h-6.42v-3.34h4.54v-2.3h-4.54v-2.68h6.18Zm6.78%2C0h-2.7V438h8.48v-2.44h-5.78Zm18.16%2C0h-8.88V438h9.12v-2.44h-6.42v-3.34h4.54v-2.3h-4.54v-2.68h6.18Zm10.06-.24a6.84257%2C6.84257%2C0%2C1%2C0-.02%2C13.68%2C6.54405%2C6.54405%2C0%2C0%2C0%2C5.84-3.28l-2.04-1.44a4.29818%2C4.29818%2C0%2C0%2C1-3.78%2C2.22%2C4.34075%2C4.34075%2C0%2C0%2C1%2C0-8.68%2C4.29824%2C4.29824%2C0%2C0%2C1%2C3.78%2C2.22l2.04-1.44A6.55791%2C6.55791%2C0%2C0%2C0%2C307.27%2C424.56Zm19.54.24H315.65v2.44h4.22V438h2.7V427.24h4.24Zm9.22-.24a6.84182%2C6.84182%2C0%2C1%2C1-7%2C6.84A6.88209%2C6.88209%2C0%2C0%2C1%2C336.03%2C424.56Zm.02%2C2.5a4.34117%2C4.34117%2C0%2C1%2C0%2C4.24%2C4.34A4.13405%2C4.13405%2C0%2C0%2C0%2C336.05%2C427.06ZM357.99%2C438h-3.04l-3.42-4.66h-1.98V438h-2.7V424.8h4.96c2.78%2C0%2C4.76%2C1.68%2C4.76%2C4.26a4.07735%2C4.07735%2C0%2C0%2C1-2.32%2C3.76Zm-8.44-10.82v3.78h2.26a1.893%2C1.893%2C0%2C1%2C0%2C0-3.78Zm15.74-2.62c-2.48%2C0-4.38%2C1.46-4.38%2C3.74%2C0%2C1.86%2C1.32%2C2.94%2C3.2%2C3.8l1.42.64c1.04.48%2C1.68.78%2C1.68%2C1.64%2C0%2C.92-.72%2C1.46-1.88%2C1.46a3.87732%2C3.87732%2C0%2C0%2C1-3.24-1.92l-1.86%2C1.4a5.69977%2C5.69977%2C0%2C0%2C0%2C5.1%2C2.92c2.62%2C0%2C4.62-1.5%2C4.62-3.96%2C0-1.88-1.18-2.94-3.26-3.86l-1.5-.66c-.96-.44-1.54-.76-1.54-1.52%2C0-.88.76-1.28%2C1.64-1.28a2.94581%2C2.94581%2C0%2C0%2C1%2C2.52%2C1.52l1.84-1.42A4.75993%2C4.75993%2C0%2C0%2C0%2C365.29%2C424.56Z%22%20fill%3D%22%23273d56%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M570%2C176H390v3H570v8l15-9.5L570%2C168Z%22%20fill%3D%22%23c6d2e1%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M405%2C432H596.50262v-3H405v-8l-15%2C9.5%2C15%2C9.5Z%22%20fill%3D%22%23c6d2e1%22%2F%3E%0A%20%20%20%20%3Ccircle%20cx%3D%22191.5%22%20cy%3D%22251.5%22%20r%3D%228.5%22%20fill%3D%22%23edf0fd%22%2F%3E%0A%20%20%20%20%3Cpolygon%20points%3D%22218.891%20263.871%20224.021%20283.759%20204%20278.018%20218.891%20263.871%22%20fill%3D%22%23edf0fd%22%2F%3E%0A%20%20%20%20%3Cpolygon%20points%3D%22101.418%20256.417%2094%20259.998%20101.418%20263.582%20104.999%20271%20108.582%20263.582%20116%20259.998%20108.582%20256.417%20104.999%20249%20101.418%20256.417%22%20fill%3D%22%23eaedfd%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M312%2C125V95h8l-9.5-15L301%2C95h8v30h-8l9.5%2C15%2C9.5-15Z%22%20fill%3D%22%23c6d2e1%22%2F%3E%0A%20%20%20%20%3Cpolygon%20points%3D%22585%20204%20624.808%20218.904%20624.808%20327.156%20585%20312.251%20585%20204%22%20fill%3D%22%23eaedfd%22%2F%3E%0A%20%20%20%20%3Cpolygon%20points%3D%22752%20211%20791.808%20225.904%20791.808%20334.156%20752%20319.251%20752%20211%22%20fill%3D%22%23eaedfd%22%2F%3E%0A%20%20%20%20%3Cpolygon%20points%3D%22641%20212%20680.808%20226.904%20680.808%20335.156%20641%20320.251%20641%20212%22%20fill%3D%22%23eaedfd%22%2F%3E%0A%20%20%20%20%3Cpolygon%20points%3D%22696%20204%20735.808%20218.904%20735.808%20327.156%20696%20312.251%20696%20204%22%20fill%3D%22%23eaedfd%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M604.04%2C264.56c-2.48%2C0-4.38%2C1.46-4.38%2C3.74%2C0%2C1.86%2C1.32%2C2.94%2C3.2%2C3.8l1.42.64c1.04.48%2C1.68.78%2C1.68%2C1.64%2C0%2C.92-.72%2C1.46-1.88%2C1.46a3.87724%2C3.87724%2C0%2C0%2C1-3.24-1.92l-1.86%2C1.4a5.6999%2C5.6999%2C0%2C0%2C0%2C5.1%2C2.92c2.62%2C0%2C4.62-1.5%2C4.62-3.96%2C0-1.88-1.18-2.94-3.26-3.86l-1.5-.66c-.96-.44-1.54-.76-1.54-1.52%2C0-.88.75995-1.28%2C1.64-1.28a2.94585%2C2.94585%2C0%2C0%2C1%2C2.52%2C1.52l1.84-1.42A4.76%2C4.76%2C0%2C0%2C0%2C604.04%2C264.56Zm11.24005.24h-2.7V278h8.48v-2.44h-5.78Zm11.98%2C0h-2.7V278h2.7Zm10.8-.24a6.84257%2C6.84257%2C0%2C1%2C0-.02%2C13.68%2C6.54414%2C6.54414%2C0%2C0%2C0%2C5.84-3.28l-2.04-1.44a4.2983%2C4.2983%2C0%2C0%2C1-3.78%2C2.22%2C4.34075%2C4.34075%2C0%2C0%2C1%2C0-8.68%2C4.29836%2C4.29836%2C0%2C0%2C1%2C3.78%2C2.22l2.04-1.44A6.558%2C6.558%2C0%2C0%2C0%2C638.06%2C264.56Zm18.5.24h-8.88V278h9.12v-2.44h-6.42v-3.34h4.54v-2.3h-4.54v-2.68h6.18ZM678.88%2C278h-3.04l-3.42-4.66h-1.98V278h-2.7V264.8h4.96c2.78%2C0%2C4.76%2C1.68%2C4.76%2C4.26a4.0774%2C4.0774%2C0%2C0%2C1-2.32%2C3.76Zm-8.44-10.82v3.78h2.26a1.893%2C1.893%2C0%2C1%2C0%2C0-3.78Zm20.48-2.38h-8.88V278h9.12v-2.44h-6.42v-3.34h4.54v-2.3h-4.54v-2.68h6.18Zm8.4%2C0c4.24%2C0%2C7.2%2C2.6%2C7.2%2C6.56%2C0%2C3.9-2.96%2C6.64-7.2%2C6.64H695V264.8Zm-.02%2C2.44h-1.6v8.32h1.6c2.66%2C0%2C4.44-1.66%2C4.44-4.2C703.74%2C268.76%2C701.96%2C267.24%2C699.3%2C267.24Zm22.08-2.44h-2.7v7.94a2.90166%2C2.90166%2C0%2C1%2C1-5.8%2C0V264.8h-2.7v7.74a5.60088%2C5.60088%2C0%2C1%2C0%2C11.2%2C0Zm10.7-.24a6.84257%2C6.84257%2C0%2C1%2C0-.02%2C13.68%2C6.54414%2C6.54414%2C0%2C0%2C0%2C5.84-3.28l-2.04-1.44a4.2982%2C4.2982%2C0%2C0%2C1-3.78%2C2.22%2C4.34075%2C4.34075%2C0%2C0%2C1%2C0-8.68%2C4.29826%2C4.29826%2C0%2C0%2C1%2C3.78%2C2.22l2.04-1.44A6.558%2C6.558%2C0%2C0%2C0%2C732.08%2C264.56Zm18.5.24H741.7V278h9.12v-2.44H744.4v-3.34h4.54v-2.3H744.4v-2.68h6.18ZM765.8%2C278h-3.04l-3.42-4.66h-1.98V278h-2.7V264.8h4.96c2.78%2C0%2C4.76%2C1.68%2C4.76%2C4.26a4.0774%2C4.0774%2C0%2C0%2C1-2.32%2C3.76Zm-8.44-10.82v3.78h2.26a1.893%2C1.893%2C0%2C1%2C0%2C0-3.78Zm15.74-2.62c-2.48%2C0-4.38%2C1.46-4.38%2C3.74%2C0%2C1.86%2C1.32%2C2.94%2C3.2%2C3.8l1.42.64c1.04.48%2C1.68.78%2C1.68%2C1.64%2C0%2C.92-.72%2C1.46-1.88%2C1.46a3.87724%2C3.87724%2C0%2C0%2C1-3.24-1.92l-1.86%2C1.4a5.6999%2C5.6999%2C0%2C0%2C0%2C5.1%2C2.92c2.62%2C0%2C4.62-1.5%2C4.62-3.96%2C0-1.88-1.18-2.94-3.26-3.86l-1.5-.66c-.96-.44-1.54-.76-1.54-1.52%2C0-.88.75995-1.28%2C1.64-1.28a2.94585%2C2.94585%2C0%2C0%2C1%2C2.52%2C1.52l1.84-1.42A4.76%2C4.76%2C0%2C0%2C0%2C773.1%2C264.56Z%22%20fill%3D%22%23273d56%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M690%2C381V350.5h-3V381h-8l9.5%2C15%2C9.5-15Z%22%20fill%3D%22%23c6d2e1%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M155.23051%2C359H163l-9.5-15-3.96378%2C6.25858-.01335.00238.00259.01462L144%2C359h8.03767c.73724%2C2.06454%2C1.60222%2C4.23694%2C2.60579%2C6.5A113.26882%2C113.26882%2C0%2C0%2C0%2C177.417%2C398.70242q.501.51274%2C1.01%2C1.02176%2C2.22205%2C2.22208%2C4.52658%2C4.30417a121.05553%2C121.05553%2C0%2C0%2C0%2C31.702%2C20.76743%2C99.35859%2C99.35859%2C0%2C0%2C0%2C10.477%2C4.031c1.11282.35318%2C2.10318.64081%2C2.96.868.52144.13831.887.22665%2C1.08569.27029l.64349-2.93018c-.15712-.03452-.48087-.11276-.96007-.23984-.811-.21512-1.75519-.48932-2.82156-.82776a96.37142%2C96.37142%2C0%2C0%2C1-10.15857-3.90964%2C118.0726%2C118.0726%2C0%2C0%2C1-30.91621-20.25479q-2.24789-2.03206-4.417-4.2-.49672-.49672-.98553-.997a110.2831%2C110.2831%2C0%2C0%2C1-22.17688-32.322Q156.17017%2C361.54234%2C155.23051%2C359Z%22%20fill%3D%22%23c6d2e1%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M221%2C184.04652V192l15-9.5L221%2C173v7.86087c-2.21288.7747-4.55347%2C1.69766-7%2C2.78259A113.26907%2C113.26907%2C0%2C0%2C0%2C180.79756%2C206.417q-.51272.501-1.02176%2C1.01-2.22205%2C2.22205-4.30417%2C4.52658a121.05585%2C121.05585%2C0%2C0%2C0-20.76741%2C31.702%2C99.35862%2C99.35862%2C0%2C0%2C0-4.031%2C10.477c-.3532%2C1.11282-.64079%2C2.10318-.868%2C2.96-.13831.52142-.22667.887-.27029%2C1.08569l2.93018.64349c.0345-.15714.11275-.48087.23985-.96008.21509-.81094.4893-1.75519.82774-2.82155a96.37109%2C96.37109%2C0%2C0%2C1%2C3.90962-10.15857%2C118.07306%2C118.07306%2C0%2C0%2C1%2C20.25481-30.91621q2.03206-2.24789%2C4.2-4.417.49672-.49672.997-.98553a110.28284%2C110.28284%2C0%2C0%2C1%2C32.322-22.17688Q218.2289%2C185.04987%2C221%2C184.04652Z%22%20fill%3D%22%23c6d2e1%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A&quot; /&gt;&lt;/p&gt;
796
-
797
- &lt;p&gt;&lt;small&gt;&lt;em&gt;Overview of Studio’s Redux architecture&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;
798
-
799
- &lt;h2 id=&quot;sub-stores-and-slice-reducers&quot;&gt;Sub-stores and slice reducers&lt;/h2&gt;
800
-
801
- &lt;p&gt;A &lt;a href=&quot;http://redux.js.org/docs/introduction/ThreePrinciples.html&quot;&gt;core principle of Redux&lt;/a&gt; is that there is a “single source of truth” — one store for the application’s state. But we’ve divided that single store, conceptually and practically, into many sub-stores with clear and distinct domains. Each sub-store is updated by its own reducer, which is scoped so it only deals with that particular segment of the total state. In the Redux documentation, such scoped sub-store reducers are called &lt;a href=&quot;http://redux.js.org/docs/recipes/reducers/SplittingReducerLogic.html&quot;&gt;“slice reducers.”&lt;/a&gt;&lt;/p&gt;
802
-
803
- &lt;p&gt;For example, we have a &lt;code class=&quot;highlighter-rouge&quot;&gt;userReducer&lt;/code&gt; managing the user sub-store, which contains information about the current user, and a &lt;code class=&quot;highlighter-rouge&quot;&gt;stylesheetReducer&lt;/code&gt; managing the stylesheet sub-store, which contains information about the active stylesheet in the map style editor. (We have more than 20 slice reducers in all.) Each of these functions receives only its sub-store’s slice of state as an argument, not the full application state; and the value it returns replaces that sub-store only.&lt;/p&gt;
804
-
805
- &lt;p&gt;&lt;img src=&quot;data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20900%20400%22%3E%0A%20%20%3Ctitle%3EReducers%3C%2Ftitle%3E%0A%20%20%3Cg%3E%0A%20%20%20%20%3Crect%20x%3D%22317%22%20y%3D%2248%22%20width%3D%22267%22%20height%3D%22216%22%20fill%3D%22%23f4f7fb%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M379.14%2C81.44H376.1l-3.42-4.66H370.7v4.66H368V68.24h4.96c2.78%2C0%2C4.76%2C1.68%2C4.76%2C4.26a4.07735%2C4.07735%2C0%2C0%2C1-2.32%2C3.76ZM370.7%2C70.62V74.4h2.26a1.893%2C1.893%2C0%2C1%2C0%2C0-3.78ZM388.24%2C68a6.84183%2C6.84183%2C0%2C1%2C1-7%2C6.84A6.88209%2C6.88209%2C0%2C0%2C1%2C388.24%2C68Zm.02%2C2.5a4.34118%2C4.34118%2C0%2C1%2C0%2C4.24%2C4.34A4.13407%2C4.13407%2C0%2C0%2C0%2C388.26%2C70.5ZM405.3%2C68a6.84183%2C6.84183%2C0%2C1%2C1-7%2C6.84A6.88209%2C6.88209%2C0%2C0%2C1%2C405.3%2C68Zm.02%2C2.5a4.34118%2C4.34118%2C0%2C1%2C0%2C4.24%2C4.34A4.13407%2C4.13407%2C0%2C0%2C0%2C405.32%2C70.5Zm20.42-2.26H414.58v2.44h4.22V81.44h2.7V70.68h4.24Zm20.52%2C13.2h-3.04l-3.42-4.66h-1.98v4.66h-2.7V68.24h4.96c2.78%2C0%2C4.76%2C1.68%2C4.76%2C4.26a4.07735%2C4.07735%2C0%2C0%2C1-2.32%2C3.76Zm-8.44-10.82V74.4h2.26a1.893%2C1.893%2C0%2C1%2C0%2C0-3.78Zm20.48-2.38h-8.88v13.2h9.12V79h-6.42V75.66h4.54v-2.3h-4.54V70.68h6.18Zm8.4%2C0c4.24%2C0%2C7.2%2C2.6%2C7.2%2C6.56%2C0%2C3.9-2.96%2C6.64-7.2%2C6.64h-4.32V68.24Zm-.02%2C2.44h-1.6V79h1.6c2.66%2C0%2C4.44-1.66%2C4.44-4.2C471.12%2C72.2%2C469.34%2C70.68%2C466.68%2C70.68Zm22.08-2.44h-2.7v7.94a2.90166%2C2.90166%2C0%2C1%2C1-5.8%2C0V68.24h-2.7v7.74a5.60088%2C5.60088%2C0%2C1%2C0%2C11.2%2C0Zm10.7-.24a6.84257%2C6.84257%2C0%2C1%2C0-.02%2C13.68%2C6.5441%2C6.5441%2C0%2C0%2C0%2C5.84-3.28l-2.04-1.44a4.29826%2C4.29826%2C0%2C0%2C1-3.78%2C2.22%2C4.34075%2C4.34075%2C0%2C0%2C1%2C0-8.68%2C4.29826%2C4.29826%2C0%2C0%2C1%2C3.78%2C2.22l2.04-1.44A6.5579%2C6.5579%2C0%2C0%2C0%2C499.46%2C68Zm18.5.24h-8.88v13.2h9.12V79h-6.42V75.66h4.54v-2.3h-4.54V70.68h6.18Zm15.22%2C13.2h-3.04l-3.42-4.66h-1.98v4.66h-2.7V68.24H527c2.78%2C0%2C4.76%2C1.68%2C4.76%2C4.26a4.0774%2C4.0774%2C0%2C0%2C1-2.32%2C3.76Zm-8.44-10.82V74.4H527a1.893%2C1.893%2C0%2C1%2C0%2C0-3.78Z%22%20fill%3D%22%23273d56%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M390.78%2C324.44l-.74-1.72h-5.4l-.74%2C1.72H381L386.9%2C311h.9l5.88%2C13.44Zm-1.68-3.94-1.76-4.46-1.76%2C4.46Zm12.84-9.26c2.78%2C0%2C4.76%2C1.68%2C4.76%2C4.26%2C0%2C2.54-1.98%2C4.28-4.76%2C4.28h-2.26v4.66h-2.7v-13.2Zm0%2C2.38h-2.26v3.8h2.26a1.90251%2C1.90251%2C0%2C1%2C0%2C0-3.8Zm13.38-2.38c2.78%2C0%2C4.76%2C1.68%2C4.76%2C4.26%2C0%2C2.54-1.98%2C4.28-4.76%2C4.28h-2.26v4.66h-2.7v-13.2Zm0%2C2.38h-2.26v3.8h2.26a1.90251%2C1.90251%2C0%2C1%2C0%2C0-3.8Zm11.12-2.38h-2.7v13.2h8.48V322h-5.78Zm11.98%2C0h-2.7v13.2h2.7Zm10.8-.24a6.84257%2C6.84257%2C0%2C1%2C0-.02%2C13.68%2C6.54409%2C6.54409%2C0%2C0%2C0%2C5.84-3.28L453%2C319.96a4.29827%2C4.29827%2C0%2C0%2C1-3.78%2C2.22%2C4.34075%2C4.34075%2C0%2C0%2C1%2C0-8.68%2C4.29827%2C4.29827%2C0%2C0%2C1%2C3.78%2C2.22l2.04-1.44A6.55791%2C6.55791%2C0%2C0%2C0%2C449.22%2C311Zm17.94%2C13.44-.74-1.72h-5.4l-.74%2C1.72h-2.9l5.9-13.44h.9l5.88%2C13.44Zm-1.68-3.94-1.76-4.46-1.76%2C4.46Zm16.3-9.26H470.62v2.44h4.22v10.76h2.7V313.68h4.24Zm5.98%2C0h-2.7v13.2h2.7Zm10.76-.24a6.84183%2C6.84183%2C0%2C1%2C1-7%2C6.84A6.88209%2C6.88209%2C0%2C0%2C1%2C498.52%2C311Zm.02%2C2.5a4.34118%2C4.34118%2C0%2C1%2C0%2C4.24%2C4.34A4.13406%2C4.13406%2C0%2C0%2C0%2C498.54%2C313.5Zm19.34-2.26v7.88L510.22%2C311h-.88v13.44h2.7v-7.92l7.64%2C8.16h.9V311.24ZM425.94%2C335c-2.48%2C0-4.38%2C1.46-4.38%2C3.74%2C0%2C1.86%2C1.32%2C2.94%2C3.2%2C3.8l1.42.64c1.04.48%2C1.68.78%2C1.68%2C1.64%2C0%2C.92-.72%2C1.46-1.88%2C1.46a3.87736%2C3.87736%2C0%2C0%2C1-3.24-1.92l-1.86%2C1.4a5.69982%2C5.69982%2C0%2C0%2C0%2C5.1%2C2.92c2.62%2C0%2C4.62-1.5%2C4.62-3.96%2C0-1.88-1.18-2.94-3.26-3.86l-1.5-.66c-.96-.44-1.54-.76-1.54-1.52%2C0-.88.76-1.28%2C1.64-1.28a2.94581%2C2.94581%2C0%2C0%2C1%2C2.52%2C1.52l1.84-1.42A4.75993%2C4.75993%2C0%2C0%2C0%2C425.94%2C335Zm18.46.24H433.24v2.44h4.22v10.76h2.7V337.68h4.24Zm10.3%2C13.2-.74-1.72h-5.4l-.74%2C1.72h-2.9l5.9-13.44h.9l5.88%2C13.44Zm-1.68-3.94-1.76-4.46-1.76%2C4.46Zm16.3-9.26H458.16v2.44h4.22v10.76h2.7V337.68h4.24Zm12.16%2C0H472.6v13.2h9.12V346H475.3v-3.34h4.54v-2.3H475.3v-2.68h6.18Z%22%20fill%3D%22%23c6d2e1%22%2F%3E%0A%20%20%20%20%3Cpolygon%20points%3D%22514%20109%20553.808%20123.904%20553.808%20232.156%20514%20217.251%20514%20109%22%20fill%3D%22%23eaedfd%22%2F%3E%0A%20%20%20%20%3Cpolygon%20points%3D%22347%20102%20386.808%20116.904%20386.808%20225.156%20347%20210.251%20347%20102%22%20fill%3D%22%23eaedfd%22%2F%3E%0A%20%20%20%20%3Cpolygon%20points%3D%22403%20110%20442.808%20124.904%20442.808%20233.156%20403%20218.251%20403%20110%22%20fill%3D%22%23eaedfd%22%2F%3E%0A%20%20%20%20%3Cpolygon%20points%3D%22458%20102%20497.808%20116.904%20497.808%20225.156%20458%20210.251%20458%20102%22%20fill%3D%22%23eaedfd%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M452%2C279V249h-3v30h-8l9.5%2C15%2C9.5-15Z%22%20fill%3D%22%23273d56%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M478%2C153a4%2C4%2C0%2C1%2C1%2C4-4A4%2C4%2C0%2C0%2C1%2C478%2C153Zm7-3v-2h3v2Zm7%2C0v-2h3v2Zm7%2C0v-2h3v2Zm7%2C0v-2h3v2Zm7%2C0v-2h3v2Zm7%2C0v-2h3v2Zm7%2C0v-2h3v2Zm7%2C0v-2h3v2Zm7%2C0v-2h3v2Zm7%2C0v-2h3v2Zm7%2C0v-2h3v2Zm7%2C0v-2h3v2Zm7%2C0v-2h3v2Zm7%2C0v-2h3v2Zm7%2C0v-2h3v2Zm7%2C0v-2h3v2Zm7%2C0v-2h3v2Z%22%20fill%3D%22%23273d56%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M367%2C173a4%2C4%2C0%2C1%2C1%2C4-4A4%2C4%2C0%2C0%2C1%2C367%2C173Zm-66-3v-2h3v2Zm7%2C0v-2h3v2Zm7%2C0v-2h3v2Zm7%2C0v-2h3v2Zm7%2C0v-2h3v2Zm7%2C0v-2h3v2Zm7%2C0v-2h3v2Zm7%2C0v-2h3v2Zm7%2C0v-2h3v2Z%22%20fill%3D%22%23273d56%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M534%2C193a4%2C4%2C0%2C1%2C1%2C4-4A4%2C4%2C0%2C0%2C1%2C534%2C193Zm7-3v-2h3v2Zm7%2C0v-2h3v2Zm7%2C0v-2h3v2Zm7%2C0v-2h3v2Zm7%2C0v-2h3v2Zm7%2C0v-2h3v2Zm7%2C0v-2h3v2Zm7%2C0v-2h3v2Zm7%2C0v-2h3v2Z%22%20fill%3D%22%23273d56%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M615.42822%2C149.89453v-5.083h1.34766v5.083a2.71135%2C2.71135%2C0%2C0%2C0%2C.39185%2C1.626%2C1.41959%2C1.41959%2C0%2C0%2C0%2C1.21216.52%2C1.7147%2C1.7147%2C0%2C0%2C0%2C1.45752-.67017%2C3.14729%2C3.14729%2C0%2C0%2C0%2C.50537-1.92261v-4.63623h1.355V153h-1.355v-1.23047a2.54611%2C2.54611%2C0%2C0%2C1-.97778%2C1.07666%2C2.78749%2C2.78749%2C0%2C0%2C1-1.44653.36621%2C2.18844%2C2.18844%2C0%2C0%2C1-1.875-.824A4.15649%2C4.15649%2C0%2C0%2C1%2C615.42822%2C149.89453Zm15.229-4.812v1.31836a5.13459%2C5.13459%2C0%2C0%2C0-1.16455-.50537%2C4.29983%2C4.29983%2C0%2C0%2C0-1.19385-.16846%2C2.51531%2C2.51531%2C0%2C0%2C0-1.366.29663%2C1.00856%2C1.00856%2C0%2C0%2C0-.45044.90454.98975.98975%2C0%2C0%2C0%2C.33691.82031%2C4.593%2C4.593%2C0%2C0%2C0%2C1.67725.52734l.542.10254a2.64116%2C2.64116%2C0%2C0%2C1%2C1.51978.76172%2C2.13232%2C2.13232%2C0%2C0%2C1%2C.51636%2C1.48682%2C2.28958%2C2.28958%2C0%2C0%2C1-.86426%2C1.90063%2C3.77564%2C3.77564%2C0%2C0%2C1-2.40234.68481%2C6.752%2C6.752%2C0%2C0%2C1-1.27441-.12817%2C11.65328%2C11.65328%2C0%2C0%2C1-1.44287-.38452v-1.3916a7.79844%2C7.79844%2C0%2C0%2C0%2C1.44287.58228%2C4.80989%2C4.80989%2C0%2C0%2C0%2C1.30371.19409%2C2.29453%2C2.29453%2C0%2C0%2C0%2C1.38428-.36255%2C1.18887%2C1.18887%2C0%2C0%2C0%2C.49072-1.0144q0-.9375-1.79443-1.29639l-.05859-.01465-.50537-.10254a3.22485%2C3.22485%2C0%2C0%2C1-1.69922-.76538%2C1.99207%2C1.99207%2C0%2C0%2C1-.53467-1.46851%2C2.1997%2C2.1997%2C0%2C0%2C1%2C.79834-1.82007%2C3.55938%2C3.55938%2C0%2C0%2C1%2C2.27783-.64087%2C6.4857%2C6.4857%2C0%2C0%2C1%2C1.26709.12085A6.394%2C6.394%2C0%2C0%2C1%2C630.65723%2C145.08252Zm10.60742%2C3.14209v.65918h-5.8374v.04395a3.24769%2C3.24769%2C0%2C0%2C0%2C.64087%2C2.40967%2C2.6%2C2.6%2C0%2C0%2C0%2C1.97388.73242%2C4.81023%2C4.81023%2C0%2C0%2C0%2C1.34766-.20508%2C8.26746%2C8.26746%2C0%2C0%2C0%2C1.50146-.62256v1.34033a9.09062%2C9.09062%2C0%2C0%2C1-1.48315.47241%2C6.40649%2C6.40649%2C0%2C0%2C1-1.38062.15747%2C3.90046%2C3.90046%2C0%2C0%2C1-2.98828-1.14624%2C4.433%2C4.433%2C0%2C0%2C1-1.07666-3.1604%2C4.50972%2C4.50972%2C0%2C0%2C1%2C1.05469-3.13477%2C3.59854%2C3.59854%2C0%2C0%2C1%2C2.8125-1.17187%2C3.07615%2C3.07615%2C0%2C0%2C1%2C2.47192%2C1.062A4.07833%2C4.07833%2C0%2C0%2C1%2C641.26465%2C148.22461Zm-1.34766-.39551a2.61193%2C2.61193%2C0%2C0%2C0-.6189-1.46851%2C1.90182%2C1.90182%2C0%2C0%2C0-1.5271-.6189%2C2.14669%2C2.14669%2C0%2C0%2C0-1.604.64453%2C2.27308%2C2.27308%2C0%2C0%2C0-.68848%2C1.4502Zm11.13477-1.34033a3.05007%2C3.05007%2C0%2C0%2C0-.87891-.49072%2C2.99817%2C2.99817%2C0%2C0%2C0-.98145-.15381%2C2.37773%2C2.37773%2C0%2C0%2C0-1.92627.791%2C3.45706%2C3.45706%2C0%2C0%2C0-.6665%2C2.28516V153h-1.355v-8.20312h1.355v1.604a2.73542%2C2.73542%2C0%2C0%2C1%2C1.03638-1.33667%2C2.92633%2C2.92633%2C0%2C0%2C1%2C1.65894-.46509%2C3.34643%2C3.34643%2C0%2C0%2C1%2C.93018.12451%2C2.96914%2C2.96914%2C0%2C0%2C1%2C.82764.38818Zm6.6377%2C1.34766a2.067%2C2.067%2C0%2C0%2C1%2C.97412.553%2C6.79478%2C6.79478%2C0%2C0%2C1%2C1.00342%2C1.62231L661.15381%2C153h-1.58936l-1.30371-2.76123a4.35358%2C4.35358%2C0%2C0%2C0-1.0144-1.51978%2C1.89792%2C1.89792%2C0%2C0%2C0-1.17554-.34058h-1.41357V153h-1.48682V142.06494h3.04688a4.15894%2C4.15894%2C0%2C0%2C1%2C2.76123.813%2C2.90988%2C2.90988%2C0%2C0%2C1%2C.95947%2C2.35107%2C2.61471%2C2.61471%2C0%2C0%2C1-.5896%2C1.7688A2.583%2C2.583%2C0%2C0%2C1%2C657.68945%2C147.83643Zm-3.03223-4.55566v3.88184h1.61865a2.27847%2C2.27847%2C0%2C0%2C0%2C1.582-.47607%2C1.88208%2C1.88208%2C0%2C0%2C0%2C.52-1.45752%2C1.85359%2C1.85359%2C0%2C0%2C0-.553-1.44653%2C2.31522%2C2.31522%2C0%2C0%2C0-1.60767-.50171Zm15.19971%2C4.94385v.65918h-5.8374v.04395a3.24769%2C3.24769%2C0%2C0%2C0%2C.64087%2C2.40967%2C2.6%2C2.6%2C0%2C0%2C0%2C1.97388.73242%2C4.81023%2C4.81023%2C0%2C0%2C0%2C1.34766-.20508%2C8.26745%2C8.26745%2C0%2C0%2C0%2C1.50146-.62256v1.34033a9.09062%2C9.09062%2C0%2C0%2C1-1.48315.47241%2C6.40649%2C6.40649%2C0%2C0%2C1-1.38062.15747%2C3.90046%2C3.90046%2C0%2C0%2C1-2.98828-1.14624%2C4.433%2C4.433%2C0%2C0%2C1-1.07666-3.1604%2C4.50972%2C4.50972%2C0%2C0%2C1%2C1.05469-3.13477%2C3.59854%2C3.59854%2C0%2C0%2C1%2C2.8125-1.17187%2C3.07615%2C3.07615%2C0%2C0%2C1%2C2.47192%2C1.062A4.07833%2C4.07833%2C0%2C0%2C1%2C669.85693%2C148.22461Zm-1.34766-.39551a2.61193%2C2.61193%2C0%2C0%2C0-.6189-1.46851%2C1.90182%2C1.90182%2C0%2C0%2C0-1.5271-.6189%2C2.14669%2C2.14669%2C0%2C0%2C0-1.604.64453%2C2.27308%2C2.27308%2C0%2C0%2C0-.68848%2C1.4502Zm8.95947-1.98486v-4.24072h1.34766V153h-1.34766v-1.03271a2.34354%2C2.34354%2C0%2C0%2C1-.89722.92651%2C2.56946%2C2.56946%2C0%2C0%2C1-1.29272.3186%2C2.75256%2C2.75256%2C0%2C0%2C1-2.34009-1.15356%2C5.25254%2C5.25254%2C0%2C0%2C1-.85327-3.18237%2C5.11452%2C5.11452%2C0%2C0%2C1%2C.85693-3.13843%2C2.76714%2C2.76714%2C0%2C0%2C1%2C2.33643-1.13892%2C2.60492%2C2.60492%2C0%2C0%2C1%2C1.30371.3186A2.24016%2C2.24016%2C0%2C0%2C1%2C677.46875%2C145.84424Zm-3.9624%2C3.06152a4.52707%2C4.52707%2C0%2C0%2C0%2C.498%2C2.36572%2C1.62584%2C1.62584%2C0%2C0%2C0%2C1.47217.79834%2C1.64788%2C1.64788%2C0%2C0%2C0%2C1.48315-.80566%2C5.72634%2C5.72634%2C0%2C0%2C0%2C0-4.72046%2C1.64968%2C1.64968%2C0%2C0%2C0-1.48315-.802%2C1.62584%2C1.62584%2C0%2C0%2C0-1.47217.79834A4.52707%2C4.52707%2C0%2C0%2C0%2C673.50635%2C148.90576Zm8.63721.98877v-5.083h1.34766v5.083a2.71135%2C2.71135%2C0%2C0%2C0%2C.39185%2C1.626%2C1.41959%2C1.41959%2C0%2C0%2C0%2C1.21216.52%2C1.7147%2C1.7147%2C0%2C0%2C0%2C1.45752-.67017%2C3.14729%2C3.14729%2C0%2C0%2C0%2C.50537-1.92261v-4.63623h1.355V153h-1.355v-1.23047a2.54611%2C2.54611%2C0%2C0%2C1-.97778%2C1.07666%2C2.78749%2C2.78749%2C0%2C0%2C1-1.44653.36621%2C2.18844%2C2.18844%2C0%2C0%2C1-1.875-.824A4.15649%2C4.15649%2C0%2C0%2C1%2C682.14355%2C149.89453Zm15.87354%2C2.688a4.677%2C4.677%2C0%2C0%2C1-1.11694.47241%2C4.43014%2C4.43014%2C0%2C0%2C1-1.17554.15747%2C3.8857%2C3.8857%2C0%2C0%2C1-2.97729-1.14258%2C5.2016%2C5.2016%2C0%2C0%2C1%2C0-6.32812%2C3.8857%2C3.8857%2C0%2C0%2C1%2C2.97729-1.14258%2C4.37837%2C4.37837%2C0%2C0%2C1%2C1.15723.15381%2C4.983%2C4.983%2C0%2C0%2C1%2C1.13525.47607v1.41357a3.647%2C3.647%2C0%2C0%2C0-1.073-.68848%2C3.30093%2C3.30093%2C0%2C0%2C0-1.21948-.2124%2C2.3893%2C2.3893%2C0%2C0%2C0-1.94824.82031%2C4.35665%2C4.35665%2C0%2C0%2C0%2C.00366%2C4.68384%2C2.38669%2C2.38669%2C0%2C0%2C0%2C1.94458.824%2C3.45992%2C3.45992%2C0%2C0%2C0%2C1.25977-.21606%2C3.14022%2C3.14022%2C0%2C0%2C0%2C1.03271-.67017Zm9.96289-4.35791v.65918h-5.8374v.04395a3.24769%2C3.24769%2C0%2C0%2C0%2C.64087%2C2.40967%2C2.6%2C2.6%2C0%2C0%2C0%2C1.97388.73242%2C4.81023%2C4.81023%2C0%2C0%2C0%2C1.34766-.20508%2C8.26745%2C8.26745%2C0%2C0%2C0%2C1.50146-.62256v1.34033a9.09062%2C9.09062%2C0%2C0%2C1-1.48315.47241%2C6.40649%2C6.40649%2C0%2C0%2C1-1.38062.15747%2C3.90046%2C3.90046%2C0%2C0%2C1-2.98828-1.14624%2C4.433%2C4.433%2C0%2C0%2C1-1.07666-3.1604%2C4.50972%2C4.50972%2C0%2C0%2C1%2C1.05469-3.13477%2C3.59854%2C3.59854%2C0%2C0%2C1%2C2.8125-1.17187%2C3.07615%2C3.07615%2C0%2C0%2C1%2C2.47192%2C1.062A4.07833%2C4.07833%2C0%2C0%2C1%2C707.98%2C148.22461Zm-1.34766-.39551a2.61193%2C2.61193%2C0%2C0%2C0-.6189-1.46851%2C1.90182%2C1.90182%2C0%2C0%2C0-1.5271-.6189%2C2.14669%2C2.14669%2C0%2C0%2C0-1.604.64453%2C2.27308%2C2.27308%2C0%2C0%2C0-.68848%2C1.4502Zm11.13477-1.34033a3.05007%2C3.05007%2C0%2C0%2C0-.87891-.49072%2C2.99817%2C2.99817%2C0%2C0%2C0-.98145-.15381%2C2.37773%2C2.37773%2C0%2C0%2C0-1.92627.791%2C3.45706%2C3.45706%2C0%2C0%2C0-.6665%2C2.28516V153h-1.355v-8.20312h1.355v1.604a2.73542%2C2.73542%2C0%2C0%2C1%2C1.03638-1.33667%2C2.92633%2C2.92633%2C0%2C0%2C1%2C1.65894-.46509%2C3.34643%2C3.34643%2C0%2C0%2C1%2C.93018.12451%2C2.96914%2C2.96914%2C0%2C0%2C1%2C.82764.38818Z%22%20fill%3D%22%23273d56%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M132.10352%2C165.08252v1.31836a5.13459%2C5.13459%2C0%2C0%2C0-1.16455-.50537%2C4.29983%2C4.29983%2C0%2C0%2C0-1.19385-.16846%2C2.51531%2C2.51531%2C0%2C0%2C0-1.366.29663%2C1.00856%2C1.00856%2C0%2C0%2C0-.45044.90454.98975.98975%2C0%2C0%2C0%2C.33691.82031%2C4.593%2C4.593%2C0%2C0%2C0%2C1.67725.52734l.542.10254a2.64116%2C2.64116%2C0%2C0%2C1%2C1.51978.76172%2C2.13232%2C2.13232%2C0%2C0%2C1%2C.51636%2C1.48682%2C2.28958%2C2.28958%2C0%2C0%2C1-.86426%2C1.90063%2C3.77564%2C3.77564%2C0%2C0%2C1-2.40234.68481%2C6.752%2C6.752%2C0%2C0%2C1-1.27441-.12817%2C11.65327%2C11.65327%2C0%2C0%2C1-1.44287-.38452v-1.3916a7.79844%2C7.79844%2C0%2C0%2C0%2C1.44287.58228%2C4.80989%2C4.80989%2C0%2C0%2C0%2C1.30371.19409%2C2.29453%2C2.29453%2C0%2C0%2C0%2C1.38428-.36255%2C1.18887%2C1.18887%2C0%2C0%2C0%2C.49072-1.0144q0-.9375-1.79443-1.29639l-.05859-.01465-.50537-.10254a3.22485%2C3.22485%2C0%2C0%2C1-1.69922-.76538%2C1.99207%2C1.99207%2C0%2C0%2C1-.53467-1.46851%2C2.1997%2C2.1997%2C0%2C0%2C1%2C.79834-1.82007%2C3.55938%2C3.55938%2C0%2C0%2C1%2C2.27783-.64087%2C6.4857%2C6.4857%2C0%2C0%2C1%2C1.26709.12085A6.394%2C6.394%2C0%2C0%2C1%2C132.10352%2C165.08252Zm6.90137-2.61475v2.3291h3.06152v1.04736h-3.06152v4.45313a1.8222%2C1.8222%2C0%2C0%2C0%2C.34424%2C1.26709%2C1.62738%2C1.62738%2C0%2C0%2C0%2C1.20117.35889h1.51611V173h-1.64795a3.01752%2C3.01752%2C0%2C0%2C1-2.13867-.60791%2C2.864%2C2.864%2C0%2C0%2C1-.62256-2.09473v-4.45312h-2.18994v-1.04736h2.18994v-2.3291Zm11.31787%2C7.89551q-.33691.85693-.85693%2C2.25586a21.6777%2C21.6777%2C0%2C0%2C1-.97412%2C2.3584%2C2.29057%2C2.29057%2C0%2C0%2C1-.84229.85693%2C2.356%2C2.356%2C0%2C0%2C1-1.1792.28564h-1.084v-1.12793h.79834a1.2418%2C1.2418%2C0%2C0%2C0%2C.93018-.34424%2C5.912%2C5.912%2C0%2C0%2C0%2C.85693-1.77979l-3.17139-8.07129h1.42822l2.43164%2C6.416%2C2.395-6.416h1.42822Zm8.5127-.32959a2.33208%2C2.33208%2C0%2C0%2C0%2C.33325%2C1.36963%2C1.13735%2C1.13735%2C0%2C0%2C0%2C.98511.46143h1.57471V173H160.022a2.3317%2C2.3317%2C0%2C0%2C1-1.87134-.77271%2C3.27075%2C3.27075%2C0%2C0%2C1-.66284-2.1936v-7.41943h-2.16064v-1.05469h3.5083Zm12.46777-1.80908v.65918h-5.8374v.04395a3.24769%2C3.24769%2C0%2C0%2C0%2C.64087%2C2.40967%2C2.6%2C2.6%2C0%2C0%2C0%2C1.97388.73242%2C4.81023%2C4.81023%2C0%2C0%2C0%2C1.34766-.20508%2C8.26745%2C8.26745%2C0%2C0%2C0%2C1.50146-.62256v1.34033a9.09062%2C9.09062%2C0%2C0%2C1-1.48315.47241%2C6.40649%2C6.40649%2C0%2C0%2C1-1.38062.15747%2C3.90046%2C3.90046%2C0%2C0%2C1-2.98828-1.14624%2C4.433%2C4.433%2C0%2C0%2C1-1.07666-3.1604%2C4.50972%2C4.50972%2C0%2C0%2C1%2C1.05469-3.13477%2C3.59854%2C3.59854%2C0%2C0%2C1%2C2.8125-1.17187%2C3.07615%2C3.07615%2C0%2C0%2C1%2C2.47192%2C1.062A4.07833%2C4.07833%2C0%2C0%2C1%2C171.30322%2C168.22461Zm-1.34766-.39551a2.61193%2C2.61193%2C0%2C0%2C0-.6189-1.46851%2C1.90182%2C1.90182%2C0%2C0%2C0-1.5271-.6189%2C2.14669%2C2.14669%2C0%2C0%2C0-1.604.64453%2C2.27308%2C2.27308%2C0%2C0%2C0-.68848%2C1.4502Zm9.80176-2.74658v1.31836a5.13459%2C5.13459%2C0%2C0%2C0-1.16455-.50537%2C4.29983%2C4.29983%2C0%2C0%2C0-1.19385-.16846%2C2.51531%2C2.51531%2C0%2C0%2C0-1.366.29663%2C1.00856%2C1.00856%2C0%2C0%2C0-.45044.90454.98975.98975%2C0%2C0%2C0%2C.33691.82031%2C4.593%2C4.593%2C0%2C0%2C0%2C1.67725.52734l.542.10254a2.64116%2C2.64116%2C0%2C0%2C1%2C1.51978.76172%2C2.13232%2C2.13232%2C0%2C0%2C1%2C.51636%2C1.48682%2C2.28958%2C2.28958%2C0%2C0%2C1-.86426%2C1.90063%2C3.77564%2C3.77564%2C0%2C0%2C1-2.40234.68481%2C6.752%2C6.752%2C0%2C0%2C1-1.27441-.12817%2C11.65327%2C11.65327%2C0%2C0%2C1-1.44287-.38452v-1.3916a7.79844%2C7.79844%2C0%2C0%2C0%2C1.44287.58228%2C4.80989%2C4.80989%2C0%2C0%2C0%2C1.30371.19409%2C2.29453%2C2.29453%2C0%2C0%2C0%2C1.38428-.36255%2C1.18887%2C1.18887%2C0%2C0%2C0%2C.49072-1.0144q0-.9375-1.79443-1.29639l-.05859-.01465-.50537-.10254a3.22485%2C3.22485%2C0%2C0%2C1-1.69922-.76538%2C1.99207%2C1.99207%2C0%2C0%2C1-.53467-1.46851%2C2.1997%2C2.1997%2C0%2C0%2C1%2C.79834-1.82007%2C3.55938%2C3.55938%2C0%2C0%2C1%2C2.27783-.64087%2C6.4857%2C6.4857%2C0%2C0%2C1%2C1.26709.12085A6.394%2C6.394%2C0%2C0%2C1%2C179.75732%2C165.08252Zm10.10205%2C2.83447V173h-1.355v-5.083a2.73112%2C2.73112%2C0%2C0%2C0-.38818-1.626%2C1.41777%2C1.41777%2C0%2C0%2C0-1.21582-.52%2C1.71691%2C1.71691%2C0%2C0%2C0-1.45386.67017%2C3.13044%2C3.13044%2C0%2C0%2C0-.509%2C1.92261V173h-1.34766V161.60352h1.34766v4.42383a2.53821%2C2.53821%2C0%2C0%2C1%2C.97412-1.06567%2C2.81935%2C2.81935%2C0%2C0%2C1%2C1.45752-.36255%2C2.19037%2C2.19037%2C0%2C0%2C1%2C1.87134.824A4.13767%2C4.13767%2C0%2C0%2C1%2C189.85938%2C167.917Zm10.03613.30762v.65918h-5.8374v.04395a3.24769%2C3.24769%2C0%2C0%2C0%2C.64087%2C2.40967%2C2.6%2C2.6%2C0%2C0%2C0%2C1.97388.73242%2C4.81023%2C4.81023%2C0%2C0%2C0%2C1.34766-.20508%2C8.26746%2C8.26746%2C0%2C0%2C0%2C1.50146-.62256v1.34033a9.09063%2C9.09063%2C0%2C0%2C1-1.48315.47241%2C6.40649%2C6.40649%2C0%2C0%2C1-1.38062.15747%2C3.90046%2C3.90046%2C0%2C0%2C1-2.98828-1.14624%2C4.433%2C4.433%2C0%2C0%2C1-1.07666-3.1604%2C4.50972%2C4.50972%2C0%2C0%2C1%2C1.05469-3.13477%2C3.59854%2C3.59854%2C0%2C0%2C1%2C2.8125-1.17187%2C3.07615%2C3.07615%2C0%2C0%2C1%2C2.47192%2C1.062A4.07833%2C4.07833%2C0%2C0%2C1%2C199.89551%2C168.22461Zm-1.34766-.39551a2.61193%2C2.61193%2C0%2C0%2C0-.6189-1.46851%2C1.90182%2C1.90182%2C0%2C0%2C0-1.5271-.6189%2C2.14669%2C2.14669%2C0%2C0%2C0-1.604.64453%2C2.27308%2C2.27308%2C0%2C0%2C0-.68848%2C1.4502Zm10.87842.39551v.65918h-5.8374v.04395a3.24769%2C3.24769%2C0%2C0%2C0%2C.64087%2C2.40967%2C2.6%2C2.6%2C0%2C0%2C0%2C1.97388.73242%2C4.81023%2C4.81023%2C0%2C0%2C0%2C1.34766-.20508%2C8.26746%2C8.26746%2C0%2C0%2C0%2C1.50146-.62256v1.34033a9.09062%2C9.09062%2C0%2C0%2C1-1.48315.47241%2C6.40649%2C6.40649%2C0%2C0%2C1-1.38062.15747%2C3.90046%2C3.90046%2C0%2C0%2C1-2.98828-1.14624%2C4.433%2C4.433%2C0%2C0%2C1-1.07666-3.1604%2C4.50972%2C4.50972%2C0%2C0%2C1%2C1.05469-3.13477%2C3.59854%2C3.59854%2C0%2C0%2C1%2C2.8125-1.17187%2C3.07615%2C3.07615%2C0%2C0%2C1%2C2.47192%2C1.062A4.07833%2C4.07833%2C0%2C0%2C1%2C209.42627%2C168.22461Zm-1.34766-.39551a2.61193%2C2.61193%2C0%2C0%2C0-.6189-1.46851%2C1.90182%2C1.90182%2C0%2C0%2C0-1.5271-.6189%2C2.14669%2C2.14669%2C0%2C0%2C0-1.604.64453%2C2.27308%2C2.27308%2C0%2C0%2C0-.68848%2C1.4502Zm7.17236-5.36133v2.3291h3.06152v1.04736H215.251v4.45313a1.8222%2C1.8222%2C0%2C0%2C0%2C.34424%2C1.26709%2C1.62738%2C1.62738%2C0%2C0%2C0%2C1.20117.35889h1.51611V173h-1.64795a3.01752%2C3.01752%2C0%2C0%2C1-2.13867-.60791%2C2.864%2C2.864%2C0%2C0%2C1-.62256-2.09473v-4.45312h-2.18994v-1.04736h2.18994v-2.3291Zm10.6001%2C5.36865a2.067%2C2.067%2C0%2C0%2C1%2C.97412.553%2C6.79478%2C6.79478%2C0%2C0%2C1%2C1.00342%2C1.62231L229.31543%2C173h-1.58936l-1.30371-2.76123a4.35358%2C4.35358%2C0%2C0%2C0-1.0144-1.51978%2C1.89792%2C1.89792%2C0%2C0%2C0-1.17554-.34058h-1.41357V173H221.332V162.06494h3.04688a4.15894%2C4.15894%2C0%2C0%2C1%2C2.76123.813%2C2.90988%2C2.90988%2C0%2C0%2C1%2C.95947%2C2.35107%2C2.61471%2C2.61471%2C0%2C0%2C1-.5896%2C1.7688A2.583%2C2.583%2C0%2C0%2C1%2C225.85107%2C167.83643Zm-3.03223-4.55566v3.88184h1.61865a2.27847%2C2.27847%2C0%2C0%2C0%2C1.582-.47607%2C1.88208%2C1.88208%2C0%2C0%2C0%2C.52-1.45752%2C1.85359%2C1.85359%2C0%2C0%2C0-.553-1.44653%2C2.31522%2C2.31522%2C0%2C0%2C0-1.60767-.50171Zm15.19971%2C4.94385v.65918h-5.8374v.04395a3.24769%2C3.24769%2C0%2C0%2C0%2C.64087%2C2.40967%2C2.6%2C2.6%2C0%2C0%2C0%2C1.97388.73242%2C4.81023%2C4.81023%2C0%2C0%2C0%2C1.34766-.20508%2C8.26745%2C8.26745%2C0%2C0%2C0%2C1.50146-.62256v1.34033a9.09062%2C9.09062%2C0%2C0%2C1-1.48315.47241%2C6.40649%2C6.40649%2C0%2C0%2C1-1.38062.15747%2C3.90046%2C3.90046%2C0%2C0%2C1-2.98828-1.14624%2C4.433%2C4.433%2C0%2C0%2C1-1.07666-3.1604A4.50972%2C4.50972%2C0%2C0%2C1%2C231.771%2C165.771a3.59854%2C3.59854%2C0%2C0%2C1%2C2.8125-1.17187%2C3.07615%2C3.07615%2C0%2C0%2C1%2C2.47192%2C1.062A4.07833%2C4.07833%2C0%2C0%2C1%2C238.01855%2C168.22461Zm-1.34766-.39551a2.61193%2C2.61193%2C0%2C0%2C0-.6189-1.46851%2C1.90182%2C1.90182%2C0%2C0%2C0-1.5271-.6189%2C2.14669%2C2.14669%2C0%2C0%2C0-1.604.64453%2C2.27308%2C2.27308%2C0%2C0%2C0-.68848%2C1.4502Zm8.95947-1.98486v-4.24072H246.978V173h-1.34766v-1.03271a2.34354%2C2.34354%2C0%2C0%2C1-.89722.92651%2C2.56946%2C2.56946%2C0%2C0%2C1-1.29272.3186%2C2.75256%2C2.75256%2C0%2C0%2C1-2.34009-1.15356%2C5.25254%2C5.25254%2C0%2C0%2C1-.85327-3.18237%2C5.11452%2C5.11452%2C0%2C0%2C1%2C.85693-3.13843%2C2.76714%2C2.76714%2C0%2C0%2C1%2C2.33643-1.13892%2C2.60492%2C2.60492%2C0%2C0%2C1%2C1.30371.3186A2.24016%2C2.24016%2C0%2C0%2C1%2C245.63037%2C165.84424Zm-3.9624%2C3.06152a4.52707%2C4.52707%2C0%2C0%2C0%2C.498%2C2.36572%2C1.62584%2C1.62584%2C0%2C0%2C0%2C1.47217.79834%2C1.64788%2C1.64788%2C0%2C0%2C0%2C1.48315-.80566%2C5.72634%2C5.72634%2C0%2C0%2C0%2C0-4.72046%2C1.64968%2C1.64968%2C0%2C0%2C0-1.48315-.802%2C1.62584%2C1.62584%2C0%2C0%2C0-1.47217.79834A4.52707%2C4.52707%2C0%2C0%2C0%2C241.668%2C168.90576Zm8.63721.98877v-5.083h1.34766v5.083a2.71135%2C2.71135%2C0%2C0%2C0%2C.39185%2C1.626%2C1.41959%2C1.41959%2C0%2C0%2C0%2C1.21216.52%2C1.7147%2C1.7147%2C0%2C0%2C0%2C1.45752-.67017%2C3.14729%2C3.14729%2C0%2C0%2C0%2C.50537-1.92261v-4.63623h1.355V173h-1.355v-1.23047a2.54611%2C2.54611%2C0%2C0%2C1-.97778%2C1.07666%2C2.78749%2C2.78749%2C0%2C0%2C1-1.44653.36621%2C2.18844%2C2.18844%2C0%2C0%2C1-1.875-.824A4.15649%2C4.15649%2C0%2C0%2C1%2C250.30518%2C169.89453Zm15.87354%2C2.688a4.677%2C4.677%2C0%2C0%2C1-1.11694.47241%2C4.43014%2C4.43014%2C0%2C0%2C1-1.17554.15747%2C3.8857%2C3.8857%2C0%2C0%2C1-2.9773-1.14258%2C5.2016%2C5.2016%2C0%2C0%2C1%2C0-6.32812%2C3.8857%2C3.8857%2C0%2C0%2C1%2C2.9773-1.14258%2C4.37837%2C4.37837%2C0%2C0%2C1%2C1.15723.15381%2C4.983%2C4.983%2C0%2C0%2C1%2C1.13525.47607v1.41357a3.647%2C3.647%2C0%2C0%2C0-1.073-.68848%2C3.30093%2C3.30093%2C0%2C0%2C0-1.21948-.2124%2C2.3893%2C2.3893%2C0%2C0%2C0-1.94824.82031%2C4.35665%2C4.35665%2C0%2C0%2C0%2C.00366%2C4.68384%2C2.38669%2C2.38669%2C0%2C0%2C0%2C1.94458.824%2C3.45992%2C3.45992%2C0%2C0%2C0%2C1.25977-.21606%2C3.14022%2C3.14022%2C0%2C0%2C0%2C1.03271-.67017Zm9.96289-4.35791v.65918h-5.8374v.04395a3.24769%2C3.24769%2C0%2C0%2C0%2C.64087%2C2.40967%2C2.6%2C2.6%2C0%2C0%2C0%2C1.97388.73242%2C4.81023%2C4.81023%2C0%2C0%2C0%2C1.34766-.20508%2C8.26745%2C8.26745%2C0%2C0%2C0%2C1.50146-.62256v1.34033a9.09062%2C9.09062%2C0%2C0%2C1-1.48315.47241%2C6.40649%2C6.40649%2C0%2C0%2C1-1.38062.15747%2C3.90046%2C3.90046%2C0%2C0%2C1-2.98828-1.14624%2C4.433%2C4.433%2C0%2C0%2C1-1.07666-3.1604A4.50972%2C4.50972%2C0%2C0%2C1%2C269.894%2C165.771a3.59854%2C3.59854%2C0%2C0%2C1%2C2.8125-1.17187%2C3.07615%2C3.07615%2C0%2C0%2C1%2C2.47192%2C1.062A4.07833%2C4.07833%2C0%2C0%2C1%2C276.1416%2C168.22461Zm-1.34766-.39551a2.61193%2C2.61193%2C0%2C0%2C0-.6189-1.46851%2C1.90182%2C1.90182%2C0%2C0%2C0-1.5271-.6189%2C2.14669%2C2.14669%2C0%2C0%2C0-1.604.64453%2C2.27308%2C2.27308%2C0%2C0%2C0-.68848%2C1.4502Zm11.13477-1.34033a3.05007%2C3.05007%2C0%2C0%2C0-.87891-.49072%2C2.99817%2C2.99817%2C0%2C0%2C0-.98145-.15381%2C2.37773%2C2.37773%2C0%2C0%2C0-1.92627.791%2C3.45706%2C3.45706%2C0%2C0%2C0-.6665%2C2.28516V173h-1.355v-8.20312h1.355v1.604a2.73542%2C2.73542%2C0%2C0%2C1%2C1.03638-1.33667%2C2.92633%2C2.92633%2C0%2C0%2C1%2C1.65894-.46509%2C3.34643%2C3.34643%2C0%2C0%2C1%2C.93018.12451%2C2.96914%2C2.96914%2C0%2C0%2C1%2C.82764.38818Z%22%20fill%3D%22%23273d56%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M620.28418%2C185.84424v-4.24072h1.34766V193h-1.34766v-1.03271a2.34354%2C2.34354%2C0%2C0%2C1-.89722.92651%2C2.56946%2C2.56946%2C0%2C0%2C1-1.29272.3186%2C2.75256%2C2.75256%2C0%2C0%2C1-2.34009-1.15356%2C5.25254%2C5.25254%2C0%2C0%2C1-.85327-3.18237%2C5.11452%2C5.11452%2C0%2C0%2C1%2C.85693-3.13843%2C2.76714%2C2.76714%2C0%2C0%2C1%2C2.33643-1.13892%2C2.60492%2C2.60492%2C0%2C0%2C1%2C1.30371.3186A2.24016%2C2.24016%2C0%2C0%2C1%2C620.28418%2C185.84424Zm-3.9624%2C3.06152a4.52707%2C4.52707%2C0%2C0%2C0%2C.498%2C2.36572%2C1.62584%2C1.62584%2C0%2C0%2C0%2C1.47217.79834%2C1.64788%2C1.64788%2C0%2C0%2C0%2C1.48315-.80566%2C5.72634%2C5.72634%2C0%2C0%2C0%2C0-4.72046%2C1.64968%2C1.64968%2C0%2C0%2C0-1.48315-.802%2C1.62584%2C1.62584%2C0%2C0%2C0-1.47217.79834A4.52707%2C4.52707%2C0%2C0%2C0%2C616.32178%2C188.90576Zm13.61035-.0293h-1.70654a3.12425%2C3.12425%2C0%2C0%2C0-1.77612.41382%2C1.403%2C1.403%2C0%2C0%2C0-.59692%2C1.23413%2C1.48266%2C1.48266%2C0%2C0%2C0%2C.44678%2C1.1499%2C1.76158%2C1.76158%2C0%2C0%2C0%2C1.23779.41016%2C2.14646%2C2.14646%2C0%2C0%2C0%2C1.75049-.77271%2C3.28989%2C3.28989%2C0%2C0%2C0%2C.64453-2.135Zm1.355-.55664V193h-1.355v-1.21582a2.78136%2C2.78136%2C0%2C0%2C1-1.08765%2C1.08032%2C3.36071%2C3.36071%2C0%2C0%2C1-1.593.3479%2C2.7901%2C2.7901%2C0%2C0%2C1-1.99951-.70679%2C2.79406%2C2.79406%2C0%2C0%2C1%2C.17212-3.97339%2C4.3559%2C4.3559%2C0%2C0%2C1%2C2.699-.71045h1.80908v-.2124a1.85347%2C1.85347%2C0%2C0%2C0-.498-1.42456%2C2.29841%2C2.29841%2C0%2C0%2C0-1.56738-.44312%2C5.12218%2C5.12218%2C0%2C0%2C0-1.3916.19775%2C6.06456%2C6.06456%2C0%2C0%2C0-1.36963.57861v-1.34766a9.39183%2C9.39183%2C0%2C0%2C1%2C1.43188-.42847%2C6.50513%2C6.50513%2C0%2C0%2C1%2C1.32935-.14282%2C4.52075%2C4.52075%2C0%2C0%2C1%2C1.7395.30029%2C2.73367%2C2.73367%2C0%2C0%2C1%2C1.16821.90088%2C2.27209%2C2.27209%2C0%2C0%2C1%2C.39551.90454A8.20878%2C8.20878%2C0%2C0%2C1%2C631.28711%2C188.31982Zm6.27148-5.85205v2.3291h3.06152v1.04736h-3.06152v4.45313a1.8222%2C1.8222%2C0%2C0%2C0%2C.34424%2C1.26709%2C1.62738%2C1.62738%2C0%2C0%2C0%2C1.20117.35889h1.51611V193h-1.64795a3.01752%2C3.01752%2C0%2C0%2C1-2.13867-.60791%2C2.864%2C2.864%2C0%2C0%2C1-.62256-2.09473v-4.45312H634.021v-1.04736h2.18994v-2.3291Zm11.43506%2C6.40869h-1.70654a3.12425%2C3.12425%2C0%2C0%2C0-1.77612.41382%2C1.403%2C1.403%2C0%2C0%2C0-.59692%2C1.23413%2C1.48266%2C1.48266%2C0%2C0%2C0%2C.44678%2C1.1499%2C1.76158%2C1.76158%2C0%2C0%2C0%2C1.23779.41016%2C2.14646%2C2.14646%2C0%2C0%2C0%2C1.75049-.77271%2C3.28989%2C3.28989%2C0%2C0%2C0%2C.64453-2.135Zm1.355-.55664V193h-1.355v-1.21582a2.78136%2C2.78136%2C0%2C0%2C1-1.08765%2C1.08032%2C3.36071%2C3.36071%2C0%2C0%2C1-1.593.3479%2C2.7901%2C2.7901%2C0%2C0%2C1-1.99951-.70679%2C2.79406%2C2.79406%2C0%2C0%2C1%2C.17212-3.97339%2C4.3559%2C4.3559%2C0%2C0%2C1%2C2.699-.71045h1.80908v-.2124a1.85347%2C1.85347%2C0%2C0%2C0-.498-1.42456%2C2.29841%2C2.29841%2C0%2C0%2C0-1.56738-.44312%2C5.12218%2C5.12218%2C0%2C0%2C0-1.3916.19775%2C6.06456%2C6.06456%2C0%2C0%2C0-1.36963.57861v-1.34766a9.39184%2C9.39184%2C0%2C0%2C1%2C1.43188-.42847%2C6.50513%2C6.50513%2C0%2C0%2C1%2C1.32935-.14282%2C4.52075%2C4.52075%2C0%2C0%2C1%2C1.7395.30029%2C2.73367%2C2.73367%2C0%2C0%2C1%2C1.16821.90088%2C2.27209%2C2.27209%2C0%2C0%2C1%2C.39551.90454A8.20878%2C8.20878%2C0%2C0%2C1%2C650.34863%2C188.31982Zm8.90088-3.2373v1.31836a5.13459%2C5.13459%2C0%2C0%2C0-1.16455-.50537%2C4.29983%2C4.29983%2C0%2C0%2C0-1.19385-.16846%2C2.51531%2C2.51531%2C0%2C0%2C0-1.366.29663%2C1.00856%2C1.00856%2C0%2C0%2C0-.45044.90454.98975.98975%2C0%2C0%2C0%2C.33691.82031%2C4.593%2C4.593%2C0%2C0%2C0%2C1.67725.52734l.542.10254a2.64116%2C2.64116%2C0%2C0%2C1%2C1.51978.76172%2C2.13232%2C2.13232%2C0%2C0%2C1%2C.51636%2C1.48682%2C2.28958%2C2.28958%2C0%2C0%2C1-.86426%2C1.90063%2C3.77564%2C3.77564%2C0%2C0%2C1-2.40234.68481%2C6.752%2C6.752%2C0%2C0%2C1-1.27441-.12817%2C11.65327%2C11.65327%2C0%2C0%2C1-1.44287-.38452v-1.3916a7.79844%2C7.79844%2C0%2C0%2C0%2C1.44287.58228%2C4.80989%2C4.80989%2C0%2C0%2C0%2C1.30371.19409%2C2.29453%2C2.29453%2C0%2C0%2C0%2C1.38428-.36255%2C1.18887%2C1.18887%2C0%2C0%2C0%2C.49072-1.0144q0-.9375-1.79443-1.29639l-.05859-.01465-.50537-.10254a3.22485%2C3.22485%2C0%2C0%2C1-1.69922-.76538%2C1.99207%2C1.99207%2C0%2C0%2C1-.53467-1.46851%2C2.1997%2C2.1997%2C0%2C0%2C1%2C.79834-1.82007%2C3.55938%2C3.55938%2C0%2C0%2C1%2C2.27783-.64087%2C6.4857%2C6.4857%2C0%2C0%2C1%2C1.26709.12085A6.394%2C6.394%2C0%2C0%2C1%2C659.24951%2C185.08252Zm10.60742%2C3.14209v.65918h-5.8374v.04395a3.24769%2C3.24769%2C0%2C0%2C0%2C.64087%2C2.40967%2C2.6%2C2.6%2C0%2C0%2C0%2C1.97388.73242%2C4.81023%2C4.81023%2C0%2C0%2C0%2C1.34766-.20508%2C8.26745%2C8.26745%2C0%2C0%2C0%2C1.50146-.62256v1.34033a9.09062%2C9.09062%2C0%2C0%2C1-1.48315.47241%2C6.40649%2C6.40649%2C0%2C0%2C1-1.38062.15747%2C3.90046%2C3.90046%2C0%2C0%2C1-2.98828-1.14624%2C4.433%2C4.433%2C0%2C0%2C1-1.07666-3.1604%2C4.50972%2C4.50972%2C0%2C0%2C1%2C1.05469-3.13477%2C3.59854%2C3.59854%2C0%2C0%2C1%2C2.8125-1.17187%2C3.07615%2C3.07615%2C0%2C0%2C1%2C2.47192%2C1.062A4.07833%2C4.07833%2C0%2C0%2C1%2C669.85693%2C188.22461Zm-1.34766-.39551a2.61193%2C2.61193%2C0%2C0%2C0-.6189-1.46851%2C1.90182%2C1.90182%2C0%2C0%2C0-1.5271-.6189%2C2.14669%2C2.14669%2C0%2C0%2C0-1.604.64453%2C2.27308%2C2.27308%2C0%2C0%2C0-.68848%2C1.4502Zm7.17236-5.36133v2.3291h3.06152v1.04736h-3.06152v4.45313a1.8222%2C1.8222%2C0%2C0%2C0%2C.34424%2C1.26709%2C1.62738%2C1.62738%2C0%2C0%2C0%2C1.20117.35889h1.51611V193h-1.64795a3.01752%2C3.01752%2C0%2C0%2C1-2.13867-.60791%2C2.864%2C2.864%2C0%2C0%2C1-.62256-2.09473v-4.45312H672.144v-1.04736H674.334v-2.3291Zm10.6001%2C5.36865a2.067%2C2.067%2C0%2C0%2C1%2C.97412.553%2C6.79478%2C6.79478%2C0%2C0%2C1%2C1.00342%2C1.62231L689.74609%2C193h-1.58936l-1.30371-2.76123a4.35358%2C4.35358%2C0%2C0%2C0-1.0144-1.51978%2C1.89792%2C1.89792%2C0%2C0%2C0-1.17554-.34058h-1.41357V193H681.7627V182.06494h3.04688a4.15894%2C4.15894%2C0%2C0%2C1%2C2.76123.813%2C2.90988%2C2.90988%2C0%2C0%2C1%2C.95947%2C2.35107%2C2.61471%2C2.61471%2C0%2C0%2C1-.5896%2C1.7688A2.583%2C2.583%2C0%2C0%2C1%2C686.28174%2C187.83643Zm-3.03223-4.55566v3.88184h1.61865a2.27847%2C2.27847%2C0%2C0%2C0%2C1.582-.47607%2C1.88208%2C1.88208%2C0%2C0%2C0%2C.52-1.45752%2C1.85359%2C1.85359%2C0%2C0%2C0-.553-1.44653%2C2.31522%2C2.31522%2C0%2C0%2C0-1.60767-.50171Zm15.19971%2C4.94385v.65918h-5.8374v.04395a3.24769%2C3.24769%2C0%2C0%2C0%2C.64087%2C2.40967%2C2.6%2C2.6%2C0%2C0%2C0%2C1.97388.73242%2C4.81023%2C4.81023%2C0%2C0%2C0%2C1.34766-.20508%2C8.26745%2C8.26745%2C0%2C0%2C0%2C1.50146-.62256v1.34033a9.09062%2C9.09062%2C0%2C0%2C1-1.48315.47241%2C6.40649%2C6.40649%2C0%2C0%2C1-1.38062.15747%2C3.90046%2C3.90046%2C0%2C0%2C1-2.98828-1.14624%2C4.433%2C4.433%2C0%2C0%2C1-1.07666-3.1604%2C4.50972%2C4.50972%2C0%2C0%2C1%2C1.05469-3.13477%2C3.59854%2C3.59854%2C0%2C0%2C1%2C2.8125-1.17187%2C3.07615%2C3.07615%2C0%2C0%2C1%2C2.47192%2C1.062A4.07833%2C4.07833%2C0%2C0%2C1%2C698.44922%2C188.22461Zm-1.34766-.39551a2.61193%2C2.61193%2C0%2C0%2C0-.6189-1.46851%2C1.90182%2C1.90182%2C0%2C0%2C0-1.5271-.6189%2C2.14669%2C2.14669%2C0%2C0%2C0-1.604.64453%2C2.27308%2C2.27308%2C0%2C0%2C0-.68848%2C1.4502Zm8.95947-1.98486v-4.24072h1.34766V193H706.061v-1.03271a2.34354%2C2.34354%2C0%2C0%2C1-.89722.92651%2C2.56946%2C2.56946%2C0%2C0%2C1-1.29272.3186%2C2.75256%2C2.75256%2C0%2C0%2C1-2.34009-1.15356%2C5.25254%2C5.25254%2C0%2C0%2C1-.85327-3.18237%2C5.11452%2C5.11452%2C0%2C0%2C1%2C.85693-3.13843%2C2.76714%2C2.76714%2C0%2C0%2C1%2C2.33643-1.13892%2C2.60492%2C2.60492%2C0%2C0%2C1%2C1.30371.3186A2.24016%2C2.24016%2C0%2C0%2C1%2C706.061%2C185.84424Zm-3.9624%2C3.06152a4.52707%2C4.52707%2C0%2C0%2C0%2C.498%2C2.36572%2C1.62584%2C1.62584%2C0%2C0%2C0%2C1.47217.79834%2C1.64788%2C1.64788%2C0%2C0%2C0%2C1.48315-.80566%2C5.72634%2C5.72634%2C0%2C0%2C0%2C0-4.72046%2C1.64968%2C1.64968%2C0%2C0%2C0-1.48315-.802%2C1.62584%2C1.62584%2C0%2C0%2C0-1.47217.79834A4.52707%2C4.52707%2C0%2C0%2C0%2C702.09863%2C188.90576Zm8.63721.98877v-5.083h1.34766v5.083a2.71135%2C2.71135%2C0%2C0%2C0%2C.39185%2C1.626%2C1.41959%2C1.41959%2C0%2C0%2C0%2C1.21216.52%2C1.7147%2C1.7147%2C0%2C0%2C0%2C1.45752-.67017%2C3.14729%2C3.14729%2C0%2C0%2C0%2C.50537-1.92261v-4.63623h1.355V193h-1.355v-1.23047a2.54611%2C2.54611%2C0%2C0%2C1-.97778%2C1.07666%2C2.78749%2C2.78749%2C0%2C0%2C1-1.44653.36621%2C2.18844%2C2.18844%2C0%2C0%2C1-1.875-.824A4.15649%2C4.15649%2C0%2C0%2C1%2C710.73584%2C189.89453Zm15.87354%2C2.688a4.677%2C4.677%2C0%2C0%2C1-1.11694.47241%2C4.43014%2C4.43014%2C0%2C0%2C1-1.17554.15747%2C3.8857%2C3.8857%2C0%2C0%2C1-2.97729-1.14258%2C5.2016%2C5.2016%2C0%2C0%2C1%2C0-6.32812%2C3.8857%2C3.8857%2C0%2C0%2C1%2C2.97729-1.14258%2C4.37837%2C4.37837%2C0%2C0%2C1%2C1.15723.15381%2C4.983%2C4.983%2C0%2C0%2C1%2C1.13525.47607v1.41357a3.647%2C3.647%2C0%2C0%2C0-1.073-.68848%2C3.30093%2C3.30093%2C0%2C0%2C0-1.21948-.2124%2C2.3893%2C2.3893%2C0%2C0%2C0-1.94824.82031%2C4.35665%2C4.35665%2C0%2C0%2C0%2C.00366%2C4.68384%2C2.38669%2C2.38669%2C0%2C0%2C0%2C1.94458.824%2C3.45992%2C3.45992%2C0%2C0%2C0%2C1.25977-.21606%2C3.14022%2C3.14022%2C0%2C0%2C0%2C1.03271-.67017Zm9.96289-4.35791v.65918h-5.8374v.04395a3.24769%2C3.24769%2C0%2C0%2C0%2C.64087%2C2.40967%2C2.6%2C2.6%2C0%2C0%2C0%2C1.97388.73242%2C4.81023%2C4.81023%2C0%2C0%2C0%2C1.34766-.20508%2C8.26746%2C8.26746%2C0%2C0%2C0%2C1.50146-.62256v1.34033a9.09062%2C9.09062%2C0%2C0%2C1-1.48315.47241%2C6.40649%2C6.40649%2C0%2C0%2C1-1.38062.15747%2C3.90046%2C3.90046%2C0%2C0%2C1-2.98828-1.14624%2C4.433%2C4.433%2C0%2C0%2C1-1.07666-3.1604%2C4.50972%2C4.50972%2C0%2C0%2C1%2C1.05469-3.13477%2C3.59854%2C3.59854%2C0%2C0%2C1%2C2.8125-1.17187%2C3.07615%2C3.07615%2C0%2C0%2C1%2C2.47192%2C1.062A4.07833%2C4.07833%2C0%2C0%2C1%2C736.57227%2C188.22461Zm-1.34766-.39551a2.61193%2C2.61193%2C0%2C0%2C0-.6189-1.46851%2C1.90182%2C1.90182%2C0%2C0%2C0-1.5271-.6189%2C2.14669%2C2.14669%2C0%2C0%2C0-1.604.64453%2C2.27308%2C2.27308%2C0%2C0%2C0-.68848%2C1.4502Zm11.13477-1.34033a3.05007%2C3.05007%2C0%2C0%2C0-.87891-.49072%2C2.99817%2C2.99817%2C0%2C0%2C0-.98145-.15381%2C2.37773%2C2.37773%2C0%2C0%2C0-1.92627.791%2C3.45706%2C3.45706%2C0%2C0%2C0-.6665%2C2.28516V193h-1.355v-8.20312h1.355v1.604a2.73542%2C2.73542%2C0%2C0%2C1%2C1.03638-1.33667%2C2.92633%2C2.92633%2C0%2C0%2C1%2C1.65894-.46509%2C3.34643%2C3.34643%2C0%2C0%2C1%2C.93018.12451%2C2.96914%2C2.96914%2C0%2C0%2C1%2C.82764.38818Z%22%20fill%3D%22%23273d56%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M180.38%2C81l-.74-1.72h-5.4L173.5%2C81h-2.9l5.9-13.44h.9L183.28%2C81Zm-1.68-3.94-1.76-4.46-1.76%2C4.46Zm13.84-9.5a6.84257%2C6.84257%2C0%2C1%2C0-.02%2C13.68%2C6.5441%2C6.5441%2C0%2C0%2C0%2C5.84-3.28l-2.04-1.44a4.29828%2C4.29828%2C0%2C0%2C1-3.78%2C2.22%2C4.34075%2C4.34075%2C0%2C0%2C1%2C0-8.68%2C4.29828%2C4.29828%2C0%2C0%2C1%2C3.78%2C2.22l2.04-1.44A6.5579%2C6.5579%2C0%2C0%2C0%2C192.54%2C67.56Zm19.54.24H200.92v2.44h4.22V81h2.7V70.24h4.24Zm5.98%2C0h-2.7V81h2.7Zm10.76-.24a6.84183%2C6.84183%2C0%2C1%2C1-7%2C6.84A6.88209%2C6.88209%2C0%2C0%2C1%2C228.82%2C67.56Zm.02%2C2.5a4.34118%2C4.34118%2C0%2C1%2C0%2C4.24%2C4.34A4.13406%2C4.13406%2C0%2C0%2C0%2C228.84%2C70.06Zm19.34-2.26v7.88l-7.66-8.12h-.88V81h2.7V73.08l7.64%2C8.16h.9V67.8Zm11.42-1.58c-2.3%2C1.04-4.36%2C3.68-4.36%2C8.72%2C0%2C5%2C2.06%2C7.66%2C4.36%2C8.7l1.06-1.62c-1.6-1.06-3.06-3-3.06-7.08%2C0-4.12%2C1.46-6.04%2C3.06-7.1Zm8.74%2C1.34c-2.48%2C0-4.38%2C1.46-4.38%2C3.74%2C0%2C1.86%2C1.32%2C2.94%2C3.2%2C3.8l1.42.64c1.04.48%2C1.68.78%2C1.68%2C1.64%2C0%2C.92-.72%2C1.46-1.88%2C1.46a3.87725%2C3.87725%2C0%2C0%2C1-3.24-1.92l-1.86%2C1.4a5.69982%2C5.69982%2C0%2C0%2C0%2C5.1%2C2.92c2.62%2C0%2C4.62-1.5%2C4.62-3.96%2C0-1.88-1.18-2.94-3.26-3.86l-1.5-.66c-.96-.44-1.54-.76-1.54-1.52%2C0-.88.76-1.28%2C1.64-1.28a2.94578%2C2.94578%2C0%2C0%2C1%2C2.52%2C1.52l1.84-1.42A4.76%2C4.76%2C0%2C0%2C0%2C268.34%2C67.56Zm8.62-1.34-1.08%2C1.62c1.6%2C1.06%2C3.08%2C2.98%2C3.08%2C7.1%2C0%2C4.08-1.48%2C6.02-3.08%2C7.08l1.08%2C1.62c2.28-1.04%2C4.34-3.7%2C4.34-8.7C281.3%2C69.9%2C279.24%2C67.26%2C276.96%2C66.22Z%22%20fill%3D%22%23c6d2e1%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M329%2C74H298.35745v3H329v8l15-9.5L329%2C66Z%22%20fill%3D%22%23c6d2e1%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A&quot; /&gt;&lt;/p&gt;
806
-
807
- &lt;p&gt;&lt;small&gt;&lt;em&gt;Slice reducers interpret actions to make changes to specific sub-stores within the single Redux store&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;
808
-
809
- &lt;p&gt;Each slice reducer ends up looking something like this (using the stylesheet sub-store as an example):&lt;/p&gt;
810
-
811
- &lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;stylesheetReducer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;stylesheetState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
812
- &lt;span class=&quot;k&quot;&gt;switch&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
813
- &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;StylesheetConstants&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;LAYERS_GROUP&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;:&lt;/span&gt;
814
- &lt;span class=&quot;c1&quot;&gt;// ... some state-updating logic that groups layers&lt;/span&gt;
815
- &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;nextStylesheetState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
816
- &lt;span class=&quot;c1&quot;&gt;// ... more cases&lt;/span&gt;
817
- &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
818
- &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
819
- &lt;/code&gt;&lt;/pre&gt;
820
- &lt;/div&gt;
821
-
822
- &lt;p&gt;This slice reducer pattern organizes both our code and our thinking. Instead of one vast, unwieldy, and all-powerful reducer function, we have separate and focused reducers, each of which is only allowed to update a specific slice of state.&lt;/p&gt;
823
-
824
- &lt;p&gt;However, at Studio’s scale even these sub-store reducers can grow pretty large; so we abstract reusable chunks of logic into independent functions outside the reducer. Often, these functions are themselves little reducers — that is, they implement the signature of a Redux reducer. In the map style editor, for example, many updates to the stylesheet sub-store involve modifications to a history object, which allows users to undo, redo, and time-travel through their changes. Our history-updating logic lives in a kind of sub-slice reducer that can be used in response to a number of actions.&lt;/p&gt;
825
-
826
- &lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;createNewHistoryEntry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;stylesheetState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
827
- &lt;span class=&quot;c1&quot;&gt;// ... some logic that creates a new history entry&lt;/span&gt;
828
- &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;nextStylesheetState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
829
- &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
830
-
831
- &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;stylesheetReducer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;stylesheetState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
832
- &lt;span class=&quot;k&quot;&gt;switch&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
833
- &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;StylesheetConstants&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;LAYERS_GROUP&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;:&lt;/span&gt;
834
- &lt;span class=&quot;c1&quot;&gt;// ... some state-updating logic that groups layers&lt;/span&gt;
835
- &lt;span class=&quot;c1&quot;&gt;// then we add a new history entry&lt;/span&gt;
836
- &lt;span class=&quot;nx&quot;&gt;nextStylesheetState&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;createNewHistoryEntry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;stylesheetState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
837
- &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;nextStylesheetState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
838
- &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;StylesheetConstants&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;LAYERS_UNGROUP&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;:&lt;/span&gt;
839
- &lt;span class=&quot;c1&quot;&gt;// ... some state-updating logic that ungroups layers&lt;/span&gt;
840
- &lt;span class=&quot;c1&quot;&gt;// then we add a new history entry&lt;/span&gt;
841
- &lt;span class=&quot;nx&quot;&gt;nextStylesheetState&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;createNewHistoryEntry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;stylesheetState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
842
- &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;nextStylesheetState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
843
- &lt;span class=&quot;c1&quot;&gt;// ... more cases&lt;/span&gt;
844
- &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
845
- &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
846
- &lt;/code&gt;&lt;/pre&gt;
847
- &lt;/div&gt;
848
-
849
- &lt;h2 id=&quot;immutable-data-structures-in-stores&quot;&gt;Immutable data structures in stores&lt;/h2&gt;
850
-
851
- &lt;p&gt;Passing state objects around like this can be risky, because it is essential in Redux that you &lt;a href=&quot;http://redux.js.org/docs/introduction/ThreePrinciples.html#state-is-read-only&quot;&gt;&lt;em&gt;never mutate state&lt;/em&gt;&lt;/a&gt;. But our Redux store is not a plain old mutable JavaScript object: it’s an &lt;a href=&quot;https://facebook.github.io/immutable-js/&quot;&gt;Immutable&lt;/a&gt; &lt;code class=&quot;highlighter-rouge&quot;&gt;Map&lt;/code&gt;. All of the data in the store, from top to bottom, lives in Immutable data structures, and each slice reducer receives and returns an Immutable &lt;code class=&quot;highlighter-rouge&quot;&gt;Map&lt;/code&gt;. So we have nothing to fear.&lt;/p&gt;
852
-
853
- &lt;p&gt;Redux, Immutable, and React fit together wonderfully. It’s important to acknowledge, though, that Immutable introduces a learning curve and some challenges when interoperating with native objects. Still, Immutable has saved us from many mistakes; and &lt;a href=&quot;https://facebook.github.io/react/docs/optimizing-performance.html#using-immutable-data-structures&quot;&gt;it makes &lt;code class=&quot;highlighter-rouge&quot;&gt;shouldComponentUpdate&lt;/code&gt; optimization in React a breeze&lt;/a&gt;, so for Studio (and probably for other applications of similar size) the added conceptual overhead of Immutable is well worth the benefits.&lt;/p&gt;
854
-
855
- &lt;h2 id=&quot;action-creators-and-api-communication&quot;&gt;Action creators and API communication&lt;/h2&gt;
856
-
857
- &lt;p&gt;&lt;img src=&quot;data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20900%20400%22%3E%0A%20%20%3Ctitle%3EAction%20Creators%3C%2Ftitle%3E%0A%20%20%3Cg%3E%0A%20%20%20%20%3Cpath%20d%3D%22M675.66%2C196h-3.04l-3.42-4.66h-1.98V196h-2.7V182.8h4.96c2.78%2C0%2C4.76%2C1.68%2C4.76%2C4.26a4.07731%2C4.07731%2C0%2C0%2C1-2.32%2C3.76Zm-8.44-10.82v3.78h2.26a1.893%2C1.893%2C0%2C1%2C0%2C0-3.78Zm20.48-2.38h-8.88V196h9.12v-2.44h-6.42v-3.34h4.54v-2.3h-4.54v-2.68h6.18Zm8.4%2C0c4.24005%2C0%2C7.2%2C2.6%2C7.2%2C6.56%2C0%2C3.9-2.96%2C6.64-7.2%2C6.64H691.78V182.8Zm-.02%2C2.44h-1.6v8.32h1.6c2.66%2C0%2C4.44-1.66%2C4.44-4.2C700.52%2C186.76%2C698.74%2C185.24%2C696.08%2C185.24Zm22.08-2.44h-2.7v7.94a2.90169%2C2.90169%2C0%2C1%2C1-5.8%2C0V182.8h-2.7v7.74a5.60085%2C5.60085%2C0%2C1%2C0%2C11.2%2C0Zm10.7-.24a6.84258%2C6.84258%2C0%2C1%2C0-.02%2C13.68%2C6.5441%2C6.5441%2C0%2C0%2C0%2C5.84-3.28l-2.04-1.44a4.29829%2C4.29829%2C0%2C0%2C1-3.78%2C2.22%2C4.34075%2C4.34075%2C0%2C0%2C1%2C0-8.68%2C4.29829%2C4.29829%2C0%2C0%2C1%2C3.78%2C2.22l2.04-1.44A6.55784%2C6.55784%2C0%2C0%2C0%2C728.86%2C182.56Zm18.5.24h-8.88V196h9.12v-2.44h-6.42v-3.34h4.54v-2.3h-4.54v-2.68h6.18ZM762.58%2C196h-3.04l-3.42-4.66h-1.98V196h-2.7V182.8h4.96c2.78%2C0%2C4.75995%2C1.68%2C4.75995%2C4.26a4.07736%2C4.07736%2C0%2C0%2C1-2.31995%2C3.76Zm-8.44-10.82v3.78h2.26a1.893%2C1.893%2C0%2C1%2C0%2C0-3.78Z%22%20fill%3D%22%23c6d2e1%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M504.38%2C176l-.74-1.72h-5.4L497.5%2C176h-2.9l5.9-13.44h.9L507.28%2C176Zm-1.68-3.94-1.76-4.46-1.76%2C4.46Zm13.84-9.5a6.84258%2C6.84258%2C0%2C1%2C0-.02%2C13.68%2C6.5441%2C6.5441%2C0%2C0%2C0%2C5.84-3.28l-2.04-1.44a4.29829%2C4.29829%2C0%2C0%2C1-3.78%2C2.22%2C4.34076%2C4.34076%2C0%2C0%2C1%2C0-8.68%2C4.29829%2C4.29829%2C0%2C0%2C1%2C3.78%2C2.22l2.04-1.44A6.55784%2C6.55784%2C0%2C0%2C0%2C516.54%2C162.56Zm19.54.24H524.92v2.44h4.22V176h2.7V165.24h4.24Zm5.98%2C0h-2.7V176h2.7Zm10.76-.24a6.84183%2C6.84183%2C0%2C1%2C1-7%2C6.84A6.88207%2C6.88207%2C0%2C0%2C1%2C552.82%2C162.56Zm.02%2C2.5a4.34118%2C4.34118%2C0%2C1%2C0%2C4.24%2C4.34A4.13409%2C4.13409%2C0%2C0%2C0%2C552.84%2C165.06Zm19.34-2.26v7.88l-7.66-8.12h-.88V176h2.7v-7.92l7.64%2C8.16h.9V162.8Zm11.42-1.58c-2.3%2C1.04-4.36%2C3.68-4.36%2C8.72%2C0%2C5%2C2.06%2C7.66%2C4.36%2C8.7l1.06-1.62c-1.6-1.06-3.06-3-3.06-7.08%2C0-4.12%2C1.46-6.04%2C3.06-7.1Zm8.74005%2C1.34c-2.48%2C0-4.38%2C1.46-4.38%2C3.74%2C0%2C1.86%2C1.32%2C2.94%2C3.2%2C3.8l1.42.64c1.04.48%2C1.68.78%2C1.68%2C1.64%2C0%2C.92-.72%2C1.46-1.88%2C1.46a3.87725%2C3.87725%2C0%2C0%2C1-3.24-1.92l-1.86%2C1.4a5.69972%2C5.69972%2C0%2C0%2C0%2C5.1%2C2.92c2.62%2C0%2C4.62-1.5%2C4.62-3.96%2C0-1.88-1.18-2.94-3.26-3.86l-1.5-.66c-.96-.44-1.54-.76-1.54-1.52%2C0-.88.76-1.28%2C1.64-1.28a2.94587%2C2.94587%2C0%2C0%2C1%2C2.52%2C1.52l1.84-1.42A4.76%2C4.76%2C0%2C0%2C0%2C592.34%2C162.56Zm8.62-1.34-1.08%2C1.62c1.6%2C1.06%2C3.08%2C2.98%2C3.08%2C7.1%2C0%2C4.08-1.48%2C6.02-3.08%2C7.08l1.08%2C1.62c2.28-1.04%2C4.34-3.7%2C4.34-8.7C605.3%2C164.9%2C603.24%2C162.26%2C600.96%2C161.22Z%22%20fill%3D%22%23c6d2e1%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M336.27%2C183l-.74-1.72h-5.4l-.74%2C1.72h-2.9l5.9-13.44h.9L339.17%2C183Zm-1.68-3.94-1.76-4.46-1.76%2C4.46Zm13.84-9.5a6.84258%2C6.84258%2C0%2C1%2C0-.02%2C13.68%2C6.54415%2C6.54415%2C0%2C0%2C0%2C5.84-3.28l-2.04-1.44a4.29827%2C4.29827%2C0%2C0%2C1-3.78%2C2.22%2C4.34075%2C4.34075%2C0%2C0%2C1%2C0-8.68%2C4.29827%2C4.29827%2C0%2C0%2C1%2C3.78%2C2.22l2.04-1.44A6.55791%2C6.55791%2C0%2C0%2C0%2C348.43%2C169.56Zm19.54.24H356.81v2.44h4.22V183h2.7V172.24h4.24Zm5.98%2C0h-2.7V183h2.7Zm10.76-.24a6.84183%2C6.84183%2C0%2C1%2C1-7%2C6.84A6.8821%2C6.8821%2C0%2C0%2C1%2C384.71%2C169.56Zm.02%2C2.5a4.34118%2C4.34118%2C0%2C1%2C0%2C4.24%2C4.34A4.13407%2C4.13407%2C0%2C0%2C0%2C384.73%2C172.06Zm19.34-2.26v7.88l-7.66-8.12h-.88V183h2.7v-7.92l7.64%2C8.16h.9V169.8Zm-84.18%2C26.76a6.84258%2C6.84258%2C0%2C1%2C0-.02%2C13.68%2C6.54411%2C6.54411%2C0%2C0%2C0%2C5.84-3.28l-2.04-1.44a4.29831%2C4.29831%2C0%2C0%2C1-3.78%2C2.22%2C4.34075%2C4.34075%2C0%2C0%2C1%2C0-8.68%2C4.29831%2C4.29831%2C0%2C0%2C1%2C3.78%2C2.22l2.04-1.44A6.5579%2C6.5579%2C0%2C0%2C0%2C319.89%2C196.56ZM340.65%2C210h-3.04l-3.42-4.66h-1.98V210h-2.7V196.8h4.96c2.78%2C0%2C4.76%2C1.68%2C4.76%2C4.26a4.07742%2C4.07742%2C0%2C0%2C1-2.32%2C3.76Zm-8.44-10.82v3.78h2.26a1.893%2C1.893%2C0%2C1%2C0%2C0-3.78Zm20.48-2.38h-8.88V210h9.12v-2.44h-6.42v-3.34h4.54v-2.3h-4.54v-2.68h6.18Zm12.6%2C13.2-.74-1.72h-5.4l-.74%2C1.72h-2.9l5.9-13.44h.9L368.19%2C210Zm-1.68-3.94-1.76-4.46-1.76%2C4.46Zm16.3-9.26H368.75v2.44h4.22V210h2.7V199.24h4.24Zm9.22-.24a6.84183%2C6.84183%2C0%2C1%2C1-7%2C6.84A6.8821%2C6.8821%2C0%2C0%2C1%2C389.13%2C196.56Zm.02%2C2.5a4.34118%2C4.34118%2C0%2C1%2C0%2C4.24%2C4.34A4.13406%2C4.13406%2C0%2C0%2C0%2C389.15%2C199.06ZM411.09%2C210h-3.04l-3.42-4.66h-1.98V210h-2.7V196.8h4.96c2.78%2C0%2C4.76%2C1.68%2C4.76%2C4.26a4.07742%2C4.07742%2C0%2C0%2C1-2.32%2C3.76Zm-8.44-10.82v3.78h2.26a1.893%2C1.893%2C0%2C1%2C0%2C0-3.78Zm15.74-2.62c-2.48%2C0-4.38%2C1.46-4.38%2C3.74%2C0%2C1.86%2C1.32%2C2.94%2C3.2%2C3.8l1.42.64c1.04.48%2C1.68.78%2C1.68%2C1.64%2C0%2C.92-.72%2C1.46-1.88%2C1.46a3.87733%2C3.87733%2C0%2C0%2C1-3.24-1.92l-1.86%2C1.4a5.69984%2C5.69984%2C0%2C0%2C0%2C5.1%2C2.92c2.62%2C0%2C4.62-1.5%2C4.62-3.96%2C0-1.88-1.18-2.94-3.26-3.86l-1.5-.66c-.96-.44-1.54-.76-1.54-1.52%2C0-.88.76-1.28%2C1.64-1.28a2.94588%2C2.94588%2C0%2C0%2C1%2C2.52%2C1.52l1.84-1.42A4.76%2C4.76%2C0%2C0%2C0%2C418.39%2C196.56Z%22%20fill%3D%22%23273d56%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M324.05%2C79l-.74-1.72h-5.4L317.17%2C79h-2.9l5.9-13.44h.9L326.95%2C79Zm-1.68-3.94-1.76-4.46-1.76%2C4.46Zm12.84-9.26c2.78%2C0%2C4.76%2C1.68%2C4.76%2C4.26%2C0%2C2.54-1.98%2C4.28-4.76%2C4.28h-2.26V79h-2.7V65.8Zm0%2C2.38h-2.26v3.8h2.26a1.90251%2C1.90251%2C0%2C1%2C0%2C0-3.8Zm11.12-2.38h-2.7V79h2.7Zm17.9-.24a6.84257%2C6.84257%2C0%2C1%2C0-.02%2C13.68%2C6.54408%2C6.54408%2C0%2C0%2C0%2C5.84-3.28l-2.04-1.44a4.29826%2C4.29826%2C0%2C0%2C1-3.78%2C2.22%2C4.34075%2C4.34075%2C0%2C0%2C1%2C0-8.68%2C4.29826%2C4.29826%2C0%2C0%2C1%2C3.78%2C2.22l2.04-1.44A6.55785%2C6.55785%2C0%2C0%2C0%2C364.23%2C65.56ZM382.17%2C79l-.74-1.72h-5.4L375.29%2C79h-2.9l5.9-13.44h.9L385.07%2C79Zm-1.68-3.94-1.76-4.46-1.76%2C4.46Zm10.58-9.26h-2.7V79h8.48V76.56h-5.78Zm11.98%2C0h-2.7V79h8.48V76.56h-5.78Zm13.42-.24c-2.48%2C0-4.38%2C1.46-4.38%2C3.74%2C0%2C1.86%2C1.32%2C2.94%2C3.2%2C3.8l1.42.64c1.04.48%2C1.68.78%2C1.68%2C1.64%2C0%2C.92-.72%2C1.46-1.88%2C1.46a3.87735%2C3.87735%2C0%2C0%2C1-3.24-1.92l-1.86%2C1.4a5.69982%2C5.69982%2C0%2C0%2C0%2C5.1%2C2.92c2.62%2C0%2C4.62-1.5%2C4.62-3.96%2C0-1.88-1.18-2.94-3.26-3.86l-1.5-.66c-.96-.44-1.54-.76-1.54-1.52%2C0-.88.76-1.28%2C1.64-1.28a2.94582%2C2.94582%2C0%2C0%2C1%2C2.52%2C1.52l1.84-1.42A4.75994%2C4.75994%2C0%2C0%2C0%2C416.47%2C65.56Z%22%20fill%3D%22%23c6d2e1%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M628%2C188.5H462v3H628V200l15-9.5L628%2C181Z%22%20fill%3D%22%23273d56%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M369.5%2C108v18.5h-3V108H359l9.5-15%2C9.5%2C15Z%22%20fill%3D%22%23273d56%22%2F%3E%0A%20%20%20%20%3Cpolygon%20points%3D%22444.932%20187.069%20442.001%20181%20439.07%20187.069%20433%20189.999%20439.07%20192.931%20442.001%20199%20444.932%20192.931%20451%20189.999%20444.932%20187.069%22%20fill%3D%22%23273d56%22%2F%3E%0A%20%20%20%20%3Cpolygon%20points%3D%22371.595%20143.406%20368.501%20137%20365.407%20143.406%20359%20146.499%20365.407%20149.594%20368.501%20156%20371.595%20149.594%20378%20146.499%20371.595%20143.406%22%20fill%3D%22%23273d56%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M312.58316%2C154.9427c-.06369-.09956-.19009-.31052-.367-.62834-.30035-.53964-.62708-1.1772-.96808-1.90814l-1.81247.84552c.36151.775.70993%2C1.45485%2C1.03305%2C2.03532.19717.35425.34451.60022.42987.73358Zm-2.80774-6.15286q-.47781-1.35093-.88666-2.79761l-1.9252.54185q.425%2C1.50993.9263%2C2.92264Zm-1.7861-6.60822q-.274-1.4285-.46207-2.90044l-1.984.25237q.19519%2C1.53465.4819%2C3.02481Zm-.79367-6.81351q-.04225-.99172-.0426-1.99443c0-.32077.00317-.63475.00946-.9483l-1.99957-.04022c-.00659.327-.00989.65437-.00989.98866q.00018%2C1.04546.04443%2C2.07947Zm.21231-6.85132q.15724-1.47941.40634-2.90591l-1.97037-.34293q-.25955%2C1.49135-.42477%2C3.03748Zm1.25229-6.72576q.39221-1.44921.86572-2.79649l-1.8876-.661q-.49539%2C1.4146-.90866%2C2.93507Zm2.34155-6.39651-1.80557-.86015a27.02762%2C27.02762%2C0%2C0%2C1%2C1.48511-2.74068l1.69254%2C1.06549A25.0685%2C25.0685%2C0%2C0%2C0%2C311.0018%2C115.39452Zm5.62021%2C49.07511L310%2C161l6.92819-4Z%22%20fill%3D%22%23273d56%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M318%2C109a8%2C8%2C0%2C1%2C1%2C8-8A8%2C8%2C0%2C0%2C1%2C318%2C109Zm0-2a6%2C6%2C0%2C1%2C0-6-6A6%2C6%2C0%2C0%2C0%2C318%2C107Z%22%20fill%3D%22%23273d56%22%2F%3E%0A%20%20%20%20%3Cpolygon%20points%3D%22319%2097%20317%2097%20317%20102.296%20320.09%20104.252%20321.159%20102.562%20319%20101.195%20319%2097%22%20fill%3D%22%23273d56%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M188.28%2C307h-3.04l-3.42-4.66h-1.98V307h-2.7V293.8h4.96c2.78%2C0%2C4.76%2C1.68%2C4.76%2C4.26a4.07735%2C4.07735%2C0%2C0%2C1-2.32%2C3.76Zm-8.44-10.82v3.78h2.26a1.893%2C1.893%2C0%2C1%2C0%2C0-3.78Zm20.48-2.38h-8.88V307h9.12v-2.44h-6.42v-3.34h4.54v-2.3h-4.54v-2.68h6.18Zm12.6%2C13.2-.74-1.72h-5.4l-.74%2C1.72h-2.9l5.9-13.44h.9L215.82%2C307Zm-1.68-3.94-1.76-4.46-1.76%2C4.46Zm13.84-9.5a6.84257%2C6.84257%2C0%2C1%2C0-.02%2C13.68%2C6.54407%2C6.54407%2C0%2C0%2C0%2C5.84-3.28l-2.04-1.44a4.29821%2C4.29821%2C0%2C0%2C1-3.78%2C2.22%2C4.34075%2C4.34075%2C0%2C0%2C1%2C0-8.68%2C4.29827%2C4.29827%2C0%2C0%2C1%2C3.78%2C2.22l2.04-1.44A6.55789%2C6.55789%2C0%2C0%2C0%2C225.08%2C293.56Zm19.54.24H233.46v2.44h4.22V307h2.7V296.24h4.24ZM143.99%2C320.56a6.84257%2C6.84257%2C0%2C1%2C0-.02%2C13.68%2C6.54407%2C6.54407%2C0%2C0%2C0%2C5.84-3.28l-2.04-1.44a4.29823%2C4.29823%2C0%2C0%2C1-3.78%2C2.22%2C4.34075%2C4.34075%2C0%2C0%2C1%2C0-8.68%2C4.29829%2C4.29829%2C0%2C0%2C1%2C3.78%2C2.22l2.04-1.44A6.5579%2C6.5579%2C0%2C0%2C0%2C143.99%2C320.56Zm15.76%2C0a6.84182%2C6.84182%2C0%2C1%2C1-7%2C6.84A6.88208%2C6.88208%2C0%2C0%2C1%2C159.75%2C320.56Zm.02%2C2.5a4.34118%2C4.34118%2C0%2C1%2C0%2C4.24%2C4.34A4.13406%2C4.13406%2C0%2C0%2C0%2C159.77%2C323.06Zm22.84-2.5-5.58%2C7.14-5.58-7.14h-.88V334h2.7v-7.04l3.32%2C4.16h.88l3.32-4.16V334h2.7V320.56Zm10.38.24c2.78%2C0%2C4.76%2C1.68%2C4.76%2C4.26%2C0%2C2.54-1.98%2C4.28-4.76%2C4.28h-2.26V334h-2.7V320.8Zm0%2C2.38h-2.26v3.8h2.26a1.90251%2C1.90251%2C0%2C1%2C0%2C0-3.8Zm14.66-2.62a6.84182%2C6.84182%2C0%2C1%2C1-7%2C6.84A6.88209%2C6.88209%2C0%2C0%2C1%2C207.65%2C320.56Zm.02%2C2.5a4.34118%2C4.34118%2C0%2C1%2C0%2C4.24%2C4.34A4.13407%2C4.13407%2C0%2C0%2C0%2C207.67%2C323.06Zm19.34-2.26v7.88l-7.66-8.12h-.88V334h2.7v-7.92l7.64%2C8.16h.9V320.8Zm16.1%2C0h-8.88V334h9.12v-2.44h-6.42v-3.34h4.54v-2.3h-4.54v-2.68h6.18Zm12.62%2C0v7.88l-7.66-8.12h-.88V334h2.7v-7.92l7.64%2C8.16h.9V320.8Zm17.14%2C0H261.71v2.44h4.22V334h2.7V323.24h4.24Zm7.42-.24c-2.48%2C0-4.38%2C1.46-4.38%2C3.74%2C0%2C1.86%2C1.32%2C2.94%2C3.2%2C3.8l1.42.64c1.04.48%2C1.68.78%2C1.68%2C1.64%2C0%2C.92-.72%2C1.46-1.88%2C1.46a3.87732%2C3.87732%2C0%2C0%2C1-3.24-1.92l-1.86%2C1.4a5.69977%2C5.69977%2C0%2C0%2C0%2C5.1%2C2.92c2.62%2C0%2C4.62-1.5%2C4.62-3.96%2C0-1.88-1.18-2.94-3.26-3.86l-1.5-.66c-.96-.44-1.54-.76-1.54-1.52%2C0-.88.76-1.28%2C1.64-1.28a2.94581%2C2.94581%2C0%2C0%2C1%2C2.52%2C1.52l1.84-1.42A4.75993%2C4.75993%2C0%2C0%2C0%2C280.29%2C320.56Z%22%20fill%3D%22%23c6d2e1%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M279%2C197.418V205l15-9.5-5.69559-3.60721-.06537-.36992c-.09625.017-.22891.04251-.39682.07721L279%2C186v8.218q-2.8716%2C1.04539-6%2C2.42551A113.26907%2C113.26907%2C0%2C0%2C0%2C239.79756%2C219.417q-.51272.501-1.02176%2C1.01-2.22205%2C2.22205-4.30417%2C4.52658a121.05585%2C121.05585%2C0%2C0%2C0-20.76741%2C31.702%2C99.35862%2C99.35862%2C0%2C0%2C0-4.031%2C10.477c-.3532%2C1.11282-.64079%2C2.10318-.868%2C2.96-.13831.52142-.22667.887-.27029%2C1.08569l2.93018.64349c.0345-.15714.11275-.48087.23985-.96008.21509-.81094.4893-1.75519.82774-2.82153a96.37267%2C96.37267%2C0%2C0%2C1%2C3.90962-10.1586%2C118.07324%2C118.07324%2C0%2C0%2C1%2C20.25481-30.9162q2.03206-2.24789%2C4.2-4.417.49672-.49672.997-.98553a110.28264%2C110.28264%2C0%2C0%2C1%2C32.322-22.17688Q276.68868%2C198.28944%2C279%2C197.418Z%22%20fill%3D%22%23c6d2e1%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A&quot; /&gt;&lt;/p&gt;
858
-
859
- &lt;p&gt;&lt;small&gt;&lt;em&gt;Action creators manage asynchronous API calls and transform developer intentions into granular state changes.&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;
860
-
861
- &lt;p&gt;Studio’s React components invoke &lt;a href=&quot;http://redux.js.org/docs/basics/Actions.html#action-creators&quot;&gt;action creators&lt;/a&gt; to trigger changes to the application state, each change represented by an &lt;a href=&quot;http://redux.js.org/docs/basics/Actions.html&quot;&gt;action&lt;/a&gt;. Our action creators are functions named with simple imperative verb phrases, e.g. &lt;code class=&quot;highlighter-rouge&quot;&gt;updateCreditCard&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;verifyEmail&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;uploadDataset&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;dismissWelcomeModal&lt;/code&gt; . Often these function names do not correspond to technical plumbing behind the scenes; instead, they describe an intention, a command. The action creator might actually dispatch &lt;em&gt;several&lt;/em&gt; actions, depending on what it must accomplish. The point is that it does what you ask it to do.&lt;/p&gt;
862
-
863
- &lt;p&gt;We encapsulate much of the complexity and business logic of our application in these action creators. They are the powerhouses where developers’ intentions are translated into granular actions that cause all the requisite changes. When invoking an action creator, then, you don’t need to know about everything it will end up doing: you can just invoke the function with the right arguments. If you want to upload a dataset, use &lt;code class=&quot;highlighter-rouge&quot;&gt;uploadDataset&lt;/code&gt;; if you want to update a credit card, use &lt;code class=&quot;highlighter-rouge&quot;&gt;updateCreditCard&lt;/code&gt;. A component delivers a command, and the action creator takes care of the details.&lt;/p&gt;
864
-
865
- &lt;p&gt;Often, these details include asynchronous communication with our APIs. In fact, action creators are the &lt;em&gt;only&lt;/em&gt; place in Studio’s codebase where we allow ourselves to call APIs! This division of labor has proven invaluable as our codebase has grown: by restricting XHR communication to action creators, we dramatically improve the clarity and testability of the entire codebase.&lt;/p&gt;
866
-
867
- &lt;p&gt;To manage asynchronous actions, we use &lt;a href=&quot;https://github.com/gaearon/redux-thunk&quot;&gt;redux-thunk&lt;/a&gt;, Redux middleware that allows your action creators to return functions, not just action objects. Within these returned functions, you can dispatch multiple action objects over a period of time — for example, one to start a loading process, a few more to indicate progress, and another to end it.&lt;/p&gt;
868
-
869
- &lt;p&gt;Action creators are always passed into components as props, via the &lt;code class=&quot;highlighter-rouge&quot;&gt;mapDispatchToProps&lt;/code&gt; argument of &lt;a href=&quot;https://github.com/reactjs/react-redux&quot;&gt;react-redux&lt;/a&gt;’s &lt;code class=&quot;highlighter-rouge&quot;&gt;connect()&lt;/code&gt;. A typical &lt;code class=&quot;highlighter-rouge&quot;&gt;mapDispatchToProps&lt;/code&gt; object simply maps action creators to props of the same name:&lt;/p&gt;
870
-
871
- &lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kr&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;mapDispatchToProps&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
872
- &lt;span class=&quot;na&quot;&gt;setFeatures&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;DatasetActionCreators&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;setFeatures&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
873
- &lt;span class=&quot;na&quot;&gt;destroyFeatures&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;DatasetActionCreators&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;destroyFeatures&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
874
- &lt;span class=&quot;na&quot;&gt;setHoveredFeatureIds&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;DatasetActionCreators&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;setHoveredFeatureIds&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
875
- &lt;span class=&quot;na&quot;&gt;saveChanges&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;DatasetActionCreators&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;saveChanges&lt;/span&gt;
876
- &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
877
- &lt;/code&gt;&lt;/pre&gt;
878
- &lt;/div&gt;
879
-
880
- &lt;p&gt;One of the most significant benefits of this pattern is that it makes the components easy to unit test. When a function is passed in as a prop (instead of, say, &lt;code class=&quot;highlighter-rouge&quot;&gt;require&lt;/code&gt;d or &lt;code class=&quot;highlighter-rouge&quot;&gt;import&lt;/code&gt;ed), a mock can be submitted for that prop in tests. The component doesn’t care if the action creators makes 10 API calls or none, or what logic must be carried out, it just cares that it works. As long as you’ve tested your action creators, you only need to ensure that each component invokes the right action creators, at the right times, with the right arguments.&lt;/p&gt;
881
-
882
- &lt;h2 id=&quot;selectors&quot;&gt;Selectors&lt;/h2&gt;
883
-
884
- &lt;p&gt;&lt;img src=&quot;data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20900%20400%22%3E%0A%20%20%3Ctitle%3ESelectors%3C%2Ftitle%3E%0A%20%20%3Cg%3E%0A%20%20%20%20%3Cpath%20d%3D%22M658.12%2C258l-.74-1.72h-5.4l-.74%2C1.72h-2.9l5.9-13.44h.9L661.02%2C258Zm-1.68-3.94-1.76-4.46-1.76%2C4.46Zm12.84-9.26c2.78%2C0%2C4.75995%2C1.68%2C4.75995%2C4.26%2C0%2C2.54-1.98%2C4.28-4.75995%2C4.28h-2.26V258h-2.7V244.8Zm0%2C2.38h-2.26v3.8h2.26a1.90251%2C1.90251%2C0%2C1%2C0%2C0-3.8ZM682.66%2C244.8c2.78%2C0%2C4.76%2C1.68%2C4.76%2C4.26%2C0%2C2.54-1.98%2C4.28-4.76%2C4.28H680.4V258h-2.7V244.8Zm0%2C2.38H680.4v3.8H682.66a1.90251%2C1.90251%2C0%2C1%2C0%2C0-3.8ZM693.78%2C244.8h-2.7V258h8.48v-2.44h-5.78Zm11.98%2C0h-2.7V258h2.7Zm10.8-.24a6.84257%2C6.84257%2C0%2C1%2C0-.02%2C13.68%2C6.54416%2C6.54416%2C0%2C0%2C0%2C5.84-3.28l-2.04-1.44a4.29836%2C4.29836%2C0%2C0%2C1-3.78%2C2.22%2C4.34075%2C4.34075%2C0%2C0%2C1%2C0-8.68%2C4.29836%2C4.29836%2C0%2C0%2C1%2C3.78%2C2.22l2.04-1.44A6.558%2C6.558%2C0%2C0%2C0%2C716.56%2C244.56ZM734.5%2C258l-.74-1.72h-5.4l-.74%2C1.72h-2.9l5.9-13.44h.9L737.4%2C258Zm-1.68-3.94-1.76-4.46-1.76%2C4.46Zm16.3-9.26H737.96v2.44h4.22V258h2.7V247.24h4.24Zm5.98%2C0h-2.7V258h2.7Zm10.76-.24a6.84182%2C6.84182%2C0%2C1%2C1-7%2C6.84A6.88213%2C6.88213%2C0%2C0%2C1%2C765.86%2C244.56Zm.02%2C2.5a4.34118%2C4.34118%2C0%2C1%2C0%2C4.24%2C4.34A4.134%2C4.134%2C0%2C0%2C0%2C765.88%2C247.06Zm19.34-2.26v7.88l-7.66-8.12h-.88V258h2.7v-7.92l7.64%2C8.16h.9V244.8ZM693.28%2C268.56c-2.48%2C0-4.38%2C1.46-4.38%2C3.74%2C0%2C1.86%2C1.31995%2C2.94%2C3.2%2C3.8l1.42.64c1.04.48%2C1.68.78%2C1.68%2C1.64%2C0%2C.92-.72%2C1.46-1.88%2C1.46a3.87724%2C3.87724%2C0%2C0%2C1-3.24-1.92l-1.86%2C1.4a5.6999%2C5.6999%2C0%2C0%2C0%2C5.1%2C2.92c2.62%2C0%2C4.62-1.5%2C4.62-3.96%2C0-1.88-1.18-2.94-3.26-3.86l-1.5-.66c-.96-.44-1.54-.76-1.54-1.52%2C0-.88.76-1.28%2C1.64-1.28a2.94583%2C2.94583%2C0%2C0%2C1%2C2.52%2C1.52l1.84-1.42A4.76%2C4.76%2C0%2C0%2C0%2C693.28%2C268.56Zm18.46.24H700.58v2.44h4.22V282h2.7V271.24h4.24Zm10.3%2C13.2-.74-1.72h-5.4L715.16%2C282h-2.9l5.9-13.44h.9L724.94%2C282Zm-1.68-3.94-1.76-4.46L716.84%2C278.06Zm16.3-9.26H725.5v2.44h4.22V282h2.7V271.24h4.24Zm12.16%2C0h-8.88V282h9.12v-2.44h-6.42v-3.34h4.54v-2.3h-4.54v-2.68h6.18Z%22%20fill%3D%22%23c6d2e1%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M285.85%2C256.56c-2.48%2C0-4.38%2C1.46-4.38%2C3.74%2C0%2C1.86%2C1.32%2C2.94%2C3.2%2C3.8l1.42.64c1.04.48%2C1.68.78%2C1.68%2C1.64%2C0%2C.92-.72%2C1.46-1.88%2C1.46a3.87733%2C3.87733%2C0%2C0%2C1-3.24-1.92l-1.86%2C1.4a5.69978%2C5.69978%2C0%2C0%2C0%2C5.1%2C2.92c2.62%2C0%2C4.62-1.5%2C4.62-3.96%2C0-1.88-1.18-2.94-3.26-3.86l-1.5-.66c-.96-.44-1.54-.76-1.54-1.52%2C0-.88.76-1.28%2C1.64-1.28a2.94581%2C2.94581%2C0%2C0%2C1%2C2.52%2C1.52l1.84-1.42A4.75993%2C4.75993%2C0%2C0%2C0%2C285.85%2C256.56Zm17.42.24h-8.88V270h9.12v-2.44h-6.42v-3.34h4.54v-2.3h-4.54v-2.68h6.18Zm6.78%2C0h-2.7V270h8.48v-2.44h-5.78Zm18.16%2C0h-8.88V270h9.12v-2.44h-6.42v-3.34h4.54v-2.3h-4.54v-2.68h6.18Zm10.06-.24a6.84257%2C6.84257%2C0%2C1%2C0-.02%2C13.68%2C6.54405%2C6.54405%2C0%2C0%2C0%2C5.84-3.28l-2.04-1.44a4.29818%2C4.29818%2C0%2C0%2C1-3.78%2C2.22%2C4.34075%2C4.34075%2C0%2C0%2C1%2C0-8.68%2C4.29824%2C4.29824%2C0%2C0%2C1%2C3.78%2C2.22l2.04-1.44A6.55791%2C6.55791%2C0%2C0%2C0%2C338.27%2C256.56Zm19.54.24H346.65v2.44h4.22V270h2.7V259.24h4.24Zm9.22-.24a6.84182%2C6.84182%2C0%2C1%2C1-7%2C6.84A6.88209%2C6.88209%2C0%2C0%2C1%2C367.03%2C256.56Zm.02%2C2.5a4.34117%2C4.34117%2C0%2C1%2C0%2C4.24%2C4.34A4.13405%2C4.13405%2C0%2C0%2C0%2C367.05%2C259.06ZM388.99%2C270h-3.04l-3.42-4.66h-1.98V270h-2.7V256.8h4.96c2.78%2C0%2C4.76%2C1.68%2C4.76%2C4.26a4.07735%2C4.07735%2C0%2C0%2C1-2.32%2C3.76Zm-8.44-10.82v3.78h2.26a1.893%2C1.893%2C0%2C1%2C0%2C0-3.78Zm15.74-2.62c-2.48%2C0-4.38%2C1.46-4.38%2C3.74%2C0%2C1.86%2C1.32%2C2.94%2C3.2%2C3.8l1.42.64c1.04.48%2C1.68.78%2C1.68%2C1.64%2C0%2C.92-.72%2C1.46-1.88%2C1.46a3.87732%2C3.87732%2C0%2C0%2C1-3.24-1.92l-1.86%2C1.4a5.69977%2C5.69977%2C0%2C0%2C0%2C5.1%2C2.92c2.62%2C0%2C4.62-1.5%2C4.62-3.96%2C0-1.88-1.18-2.94-3.26-3.86l-1.5-.66c-.96-.44-1.54-.76-1.54-1.52%2C0-.88.76-1.28%2C1.64-1.28a2.94581%2C2.94581%2C0%2C0%2C1%2C2.52%2C1.52l1.84-1.42A4.75993%2C4.75993%2C0%2C0%2C0%2C396.29%2C256.56Z%22%20fill%3D%22%23273d56%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M436%2C264H627.50262v-3H436v-8l-15%2C9.5%2C15%2C9.5Z%22%20fill%3D%22%23c6d2e1%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M161.28%2C126h-3.04l-3.42-4.66h-1.98V126h-2.7V112.8h4.96c2.78%2C0%2C4.76%2C1.68%2C4.76%2C4.26a4.07733%2C4.07733%2C0%2C0%2C1-2.32%2C3.76Zm-8.44-10.82v3.78h2.26a1.893%2C1.893%2C0%2C1%2C0%2C0-3.78Zm20.48-2.38h-8.88V126h9.12v-2.44h-6.42v-3.34h4.54v-2.3h-4.54v-2.68h6.18Zm12.6%2C13.2-.74-1.72h-5.4l-.74%2C1.72h-2.9l5.9-13.44h.9L188.82%2C126Zm-1.68-3.94-1.76-4.46-1.76%2C4.46Zm13.84-9.5a6.84258%2C6.84258%2C0%2C1%2C0-.02%2C13.68%2C6.5441%2C6.5441%2C0%2C0%2C0%2C5.84-3.28l-2.04-1.44a4.29826%2C4.29826%2C0%2C0%2C1-3.78%2C2.22%2C4.34075%2C4.34075%2C0%2C0%2C1%2C0-8.68%2C4.29826%2C4.29826%2C0%2C0%2C1%2C3.78%2C2.22l2.04-1.44A6.55787%2C6.55787%2C0%2C0%2C0%2C198.08%2C112.56Zm19.54.24H206.46v2.44h4.22V126h2.7V115.24h4.24ZM116.99%2C139.56a6.84258%2C6.84258%2C0%2C1%2C0-.02%2C13.68%2C6.54413%2C6.54413%2C0%2C0%2C0%2C5.84-3.28l-2.04-1.44a4.29826%2C4.29826%2C0%2C0%2C1-3.78%2C2.22%2C4.34075%2C4.34075%2C0%2C0%2C1%2C0-8.68%2C4.29826%2C4.29826%2C0%2C0%2C1%2C3.78%2C2.22l2.04-1.44A6.5579%2C6.5579%2C0%2C0%2C0%2C116.99%2C139.56Zm15.76%2C0a6.84183%2C6.84183%2C0%2C1%2C1-7%2C6.84A6.88209%2C6.88209%2C0%2C0%2C1%2C132.75%2C139.56Zm.02%2C2.5a4.34118%2C4.34118%2C0%2C1%2C0%2C4.24%2C4.34A4.13407%2C4.13407%2C0%2C0%2C0%2C132.77%2C142.06Zm22.84-2.5-5.58%2C7.14-5.58-7.14h-.88V153h2.7v-7.04l3.32%2C4.16h.88l3.32-4.16V153h2.7V139.56Zm10.38.24c2.78%2C0%2C4.76%2C1.68%2C4.76%2C4.26%2C0%2C2.54-1.98%2C4.28-4.76%2C4.28h-2.26V153h-2.7V139.8Zm0%2C2.38h-2.26v3.8h2.26a1.90251%2C1.90251%2C0%2C1%2C0%2C0-3.8Zm14.66-2.62a6.84183%2C6.84183%2C0%2C1%2C1-7%2C6.84A6.8821%2C6.8821%2C0%2C0%2C1%2C180.65%2C139.56Zm.02%2C2.5a4.34118%2C4.34118%2C0%2C1%2C0%2C4.24%2C4.34A4.13407%2C4.13407%2C0%2C0%2C0%2C180.67%2C142.06Zm19.34-2.26v7.88l-7.66-8.12h-.88V153h2.7v-7.92l7.64%2C8.16h.9V139.8Zm16.1%2C0h-8.88V153h9.12v-2.44h-6.42v-3.34h4.54v-2.3h-4.54v-2.68h6.18Zm12.62%2C0v7.88l-7.66-8.12h-.88V153h2.7v-7.92l7.64%2C8.16h.9V139.8Zm17.14%2C0H234.71v2.44h4.22V153h2.7V142.24h4.24Zm7.42-.24c-2.48%2C0-4.38%2C1.46-4.38%2C3.74%2C0%2C1.86%2C1.32%2C2.94%2C3.2%2C3.8l1.42.64c1.04.48%2C1.68.78%2C1.68%2C1.64%2C0%2C.92-.72%2C1.46-1.88%2C1.46a3.87734%2C3.87734%2C0%2C0%2C1-3.24-1.92l-1.86%2C1.4a5.69984%2C5.69984%2C0%2C0%2C0%2C5.1%2C2.92c2.62%2C0%2C4.62-1.5%2C4.62-3.96%2C0-1.88-1.18-2.94-3.26-3.86l-1.5-.66c-.96-.44-1.54-.76-1.54-1.52%2C0-.88.76-1.28%2C1.64-1.28a2.94586%2C2.94586%2C0%2C0%2C1%2C2.52%2C1.52l1.84-1.42A4.76%2C4.76%2C0%2C0%2C0%2C253.29%2C139.56Z%22%20fill%3D%22%23c6d2e1%22%2F%3E%0A%20%20%20%20%3Ccircle%20cx%3D%22222.5%22%20cy%3D%2283.5%22%20r%3D%228.5%22%20fill%3D%22%23edf0fd%22%2F%3E%0A%20%20%20%20%3Cpolygon%20points%3D%22249.891%2095.871%20255.021%20115.759%20235%20110.018%20249.891%2095.871%22%20fill%3D%22%23edf0fd%22%2F%3E%0A%20%20%20%20%3Cpolygon%20points%3D%22132.418%2088.417%20125%2091.998%20132.418%2095.582%20135.999%20103%20139.582%2095.582%20147%2091.998%20139.582%2088.417%20135.999%2081%20132.418%2088.417%22%20fill%3D%22%23eaedfd%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M186.23051%2C191H194l-9.5-15-3.96378%2C6.25858-.01335.00237.00259.01463L175%2C191h8.03767c.73724%2C2.06453%2C1.60222%2C4.23694%2C2.60579%2C6.5A113.26907%2C113.26907%2C0%2C0%2C0%2C208.417%2C230.70244q.501.51272%2C1.01%2C1.02176%2C2.22205%2C2.22205%2C4.52658%2C4.30417a121.05585%2C121.05585%2C0%2C0%2C0%2C31.702%2C20.76741%2C99.35859%2C99.35859%2C0%2C0%2C0%2C10.477%2C4.031c1.11282.35318%2C2.10318.64081%2C2.96.868.52142.13831.887.22665%2C1.08569.27029l.64349-2.93018c-.15714-.03452-.48087-.11276-.96008-.23984-.81094-.21512-1.75519-.48932-2.82153-.82776a96.37%2C96.37%2C0%2C0%2C1-10.15858-3.90962%2C118.07306%2C118.07306%2C0%2C0%2C1-30.91621-20.25481q-2.24789-2.03206-4.417-4.2-.49672-.49672-.98553-.997a110.28284%2C110.28284%2C0%2C0%2C1-22.17688-32.322Q187.17017%2C193.54237%2C186.23051%2C191Z%22%20fill%3D%22%23273d56%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A&quot; /&gt;&lt;/p&gt;
885
-
886
- &lt;p&gt;&lt;small&gt;&lt;em&gt;Selectors pass bits of application into React components.&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;
887
-
888
- &lt;p&gt;Data from the sub-stores is only accessed by components through selector functions. These are typically named &lt;code class=&quot;highlighter-rouge&quot;&gt;getX&lt;/code&gt;, e.g. &lt;code class=&quot;highlighter-rouge&quot;&gt;getSelectedFeatureIds&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;getDownloadPercentComplete&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;getActiveLayers&lt;/code&gt;, and are invoked within the &lt;code class=&quot;highlighter-rouge&quot;&gt;mapStateToProps&lt;/code&gt; argument of react-redux’s &lt;code class=&quot;highlighter-rouge&quot;&gt;connect()&lt;/code&gt;:&lt;/p&gt;
889
-
890
- &lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;mapStateToProps&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
891
- &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
892
- &lt;span class=&quot;na&quot;&gt;userId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;UserSelectors&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
893
- &lt;span class=&quot;na&quot;&gt;ownerId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;StylesheetSelectors&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getOwnerId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
894
- &lt;span class=&quot;na&quot;&gt;styleId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;StylesheetSelectors&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getStyleId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
895
- &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
896
- &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
897
- &lt;/code&gt;&lt;/pre&gt;
898
- &lt;/div&gt;
899
-
900
- &lt;p&gt;Sometimes the selector functions are complex, and sometimes they are trivial, especially because of all the helpers available on Immutable data structures. For example, &lt;code class=&quot;highlighter-rouge&quot;&gt;StylesheetSelectors.getOwnerId&lt;/code&gt; might be as simple as &lt;code class=&quot;highlighter-rouge&quot;&gt;state =&amp;gt; state.get(&#39;ownerId&#39;)&lt;/code&gt;. However, there are several benefits to &lt;em&gt;always&lt;/em&gt; following this pattern, even when it seems silly and you’re inclined not to create a new selector function:&lt;/p&gt;
901
-
902
- &lt;ul&gt;
903
- &lt;li&gt;You don’t have to decide when to follow it and when to bypass it. Just follow it always. (Also, the readers of your code won’t have to speculate about and second guess your reasons for bypassing the pattern.)&lt;/li&gt;
904
- &lt;li&gt;Selector functions are easy to systematically unit test, much more so than isolated snippets of logic scattered throughout component code.&lt;/li&gt;
905
- &lt;li&gt;Selector functions that include some logic (e.g. filtering, mapping, concatenating) can be memoized to avoid unnecessary React re-renders.&lt;/li&gt;
906
- &lt;/ul&gt;
907
-
908
- &lt;p&gt;Our selector pattern is heavily influenced by the excellent &lt;a href=&quot;https://github.com/reactjs/reselect&quot;&gt;reselect&lt;/a&gt; library, which you should definitely consider for your own Redux projects.&lt;/p&gt;
909
-
910
- &lt;h2 id=&quot;redux-helps-us-code-to-clear-concepts-and-scalable-patterns&quot;&gt;Redux helps us code to clear concepts and scalable patterns&lt;/h2&gt;
911
-
912
- &lt;p&gt;Our Redux architecture shows how a set of simple concepts — stores, reducers, action creators, and selectors — can effectively organize large applications. To recap, some of the lessons we‘ve learned working on Studio:&lt;/p&gt;
913
-
914
- &lt;ul&gt;
915
- &lt;li&gt;As soon as you can identify distinct domains in your state, divide your store into sub-stores by dividing your reducer into slice reducers.&lt;/li&gt;
916
- &lt;li&gt;Consider using Immutable data structures in your store. This will allow you to pass around state, from root reducers to slice reducers to sub-slice reducers &lt;em&gt;etc.,&lt;/em&gt; without accidentally mutating anything and causing bugs.&lt;/li&gt;
917
- &lt;li&gt;Try to isolate network communication in one place, making the rest of your codebase much easier to test.&lt;/li&gt;
918
- &lt;li&gt;Use redux-thunk or a similar library so you can encapsulate substantial logic and asynchronous processes in action creators, and so any given action creator can dispatch as many actions as necessary to do its job.&lt;/li&gt;
919
- &lt;li&gt;Use selector functions to pass bits of state to components, and consider using reselect (or some other memoization) to optimize their performance.&lt;/li&gt;
920
- &lt;/ul&gt;
921
-
922
- &lt;p&gt;If you’re interested in Redux, React, Immutable, and building incredible web applications, &lt;a href=&quot;https://www.mapbox.com/jobs/678782/&quot;&gt;the Studio team is hiring!&lt;/a&gt;&lt;/p&gt;
923
- </description>
924
- <pubDate>Mon, 01 May 2017 00:00:00 -0400</pubDate>
925
- <dc:creator>David Clark</dc:creator>
926
- <guid isPermaLink="true">https://www.mapbox.com/blog/redux-for-state-management-in-large-web-apps/</guid>
927
- </item>
928
- <item>
929
- <title>Going from Caches to Cash on AWS using the EC2 Spot Market</title>
930
- <link>https://www.mapbox.com/blog/caches-to-cash/</link>
931
- <description>&lt;p&gt;Caching increases map performance significantly, improving the experience for hundreds of millions of people zooming around our map. In addition to using a global edge network that brings our maps as close to the end user as possible, we’ve architected our own in-memory caching layer to sit in behind our CDN, next to the origin servers that composite raw map data. This layer lets us serve low-latency maps to users all around the globe.&lt;/p&gt;
932
-
933
- &lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/5/4178/33455636553_8413f62582_k.jpg&quot; alt=&quot;caching&quot; /&gt;&lt;/p&gt;
934
-
935
- &lt;p&gt;&lt;em&gt;How our in-memory cache in Sydney, Australia helps us avoid a round trip back to Virginia for map data.&lt;/em&gt;&lt;/p&gt;
936
-
937
- &lt;p&gt;While our raw map data lives in only a few key regions around the world, our caching layer boosts performance in each additional origin region. This prevents faraway regions like Sydney, Australia from making slow, round-trip requests back to one of our core regions (for example, the eastern United States).&lt;/p&gt;
938
-
939
- &lt;h2 id=&quot;running-on-the-aws-ec2-spot-market&quot;&gt;Running on the AWS EC2 Spot market&lt;/h2&gt;
940
-
941
- &lt;p&gt;Caching technology like this lets us not only serve maps faster to mobile phones around the world, it is also saves massive costs in operating our platform.&lt;/p&gt;
942
-
943
- &lt;p&gt;We modeled this homegrown caching service after &lt;a href=&quot;https://aws.amazon.com/elasticache/&quot;&gt;AWS ElastiCache&lt;/a&gt;, the in-memory store from AWS. We built this in-house in order to run on the &lt;a href=&quot;https://aws.amazon.com/ec2/spot/&quot;&gt;AWS EC2 Spot market&lt;/a&gt;: our entire platform runs on Spot, which &lt;a href=&quot;https://www.mapbox.com/blog/switch-to-ecs/&quot;&gt;saves us upwards of 50-90%&lt;/a&gt; on our EC2 costs. ElastiCache doesn’t support Spot, so we rolled our own service that does.&lt;/p&gt;
944
-
945
- &lt;h2 id=&quot;global-cache-replacement&quot;&gt;Global cache replacement&lt;/h2&gt;
946
-
947
- &lt;p&gt;Our growth over the last year demanded a re-architecture of our cache (specifically, how we manage sharding) in order to to support our scale. This upgrade, which we deployed last week, required complete replacement of our old caching layer in each of the 7 regions where we run our Maps API. We performed the replacement one region at a time. A cache replacement can cause a severe latency penalty for end-users, so we avoided this by re-routing all traffic around a region for the duration of the deploy. This happened at the DNS level, and once we had performed the upgrade, we pre-warmed each new cache before putting it back in service.&lt;/p&gt;
948
-
949
- &lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/3/2870/34013686602_45be24524d_h.jpg&quot; alt=&quot;reroute&quot; /&gt;&lt;/p&gt;
950
-
951
- &lt;p&gt;&lt;em&gt;Routing traffic between two of our North America regions during a cache replacement&lt;/em&gt;&lt;/p&gt;
952
-
953
- &lt;p&gt;The trick is making sure that when we reroute traffic around one region, the other regions can handle the additional traffic. If we aren’t careful, the extra traffic could look and act like a sophisticated DDOS attack to a smaller region, potentially causing our origin infrastructure there to buckle under the load. These delicate procedures are nearing full automation, with the appropriate seatbelts. We lovingly call the DNS-level traffic director our “kill-switch,” and we can control it with a few keystrokes in Slack.&lt;/p&gt;
954
-
955
- &lt;p&gt;Does building low-cost, resilient caching infrastructure &amp;amp; redirecting traffic around the world sound like fun? The Platform team &lt;a href=&quot;https://www.mapbox.com/jobs/&quot;&gt;is hiring&lt;/a&gt;!&lt;/p&gt;
956
- </description>
957
- <pubDate>Tue, 25 Apr 2017 09:00:00 -0400</pubDate>
958
- <dc:creator>Emily McAfee</dc:creator>
959
- <guid isPermaLink="true">https://www.mapbox.com/blog/caches-to-cash/</guid>
960
- </item>
961
- <item>
962
- <title>1.7 million buildings mapped to fight malaria</title>
963
- <link>https://www.mapbox.com/blog/world-malaria-day/</link>
964
- <description>&lt;p&gt;Over the &lt;a href=&quot;https://www.mapbox.com/blog/ending-malaria/&quot;&gt;past few months&lt;/a&gt;, nearly 3,000 contributors have traced almost 1.7 million buildings, in a coordinated effort to map 500,000 km² of the malaria-affected world.&lt;/p&gt;
965
-
966
- &lt;p&gt;Volunteers use satellite imagery to trace buildings and add them to &lt;a href=&quot;http://www.openstreetmap.org/&quot;&gt;OpenStreetMap&lt;/a&gt;, creating a dataset which can be used by health programs in Southern Africa, Central America, and Southeast Asia to inform prediction models, target surveillance, and deploy resources within communities.&lt;/p&gt;
967
-
968
- &lt;iframe src=&quot;https://www.mapbox.com/bites/00343/#5.04/-19.330/24.313&quot; class=&quot;col12 row11 fill-grey space-bottom1&quot;&gt;&lt;/iframe&gt;
969
-
970
- &lt;p&gt;&lt;em&gt;&lt;a href=&quot;https://www.mapbox.com/malaria-mapping/#5.04/-19.330/24.313&quot;&gt;Explore 1.7 million buildings contributed by over 3000 mappers&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
971
-
972
- &lt;p&gt;On &lt;a href=&quot;http://www.who.int/campaigns/malaria-day/2017/en/&quot;&gt;World Malaria Day&lt;/a&gt;, we recognize all of the remarkable work that’s been done so far, and gear up for the final push as our community seeks to complete this mapping initiative in full.&lt;/p&gt;
973
-
974
- &lt;p&gt;The mapping began last year with &lt;a href=&quot;http://visualizenomalaria.org/&quot;&gt;Visualize No Malaria&lt;/a&gt;, a partnership between Zambia’s Ministry of Health, &lt;a href=&quot;http://www.path.org/&quot;&gt;PATH&lt;/a&gt;, the &lt;a href=&quot;https://www.tableau.com/foundation/about&quot;&gt;Tableau Foundation&lt;/a&gt;, and a coalition of tech partners. &lt;a href=&quot;http://blog.digitalglobe.com/crowd/eliminating-malaria-with-the-power-of-the-crowd/&quot;&gt;Digital Globe&lt;/a&gt;, the &lt;a href=&quot;http://www.clintonhealthaccess.org/&quot;&gt;Clinton Health Access Initiative&lt;/a&gt; and the &lt;a href=&quot;https://www.hotosm.org/&quot;&gt;Humanitarian OpenStreetMap Team&lt;/a&gt; expanded the fight to a half million square kilometers. Groups like &lt;a href=&quot;http://www.missingmaps.org/&quot;&gt;Missing Maps&lt;/a&gt;, &lt;a href=&quot;https://www.mapbox.com/blog/youth-mappers/&quot;&gt;YouthMappers&lt;/a&gt;, and the &lt;a href=&quot;https://www.mapbox.com/blog/mapping-peace-corps/&quot;&gt;Peace Corps&lt;/a&gt; have also made significant contributions to the mapping lift. Here at Mapbox, we have been proud to support the effort with technical guidance and mapping.&lt;/p&gt;
975
-
976
- &lt;p&gt;&lt;img src=&quot;https://i.imgur.com/H05bm8m.gif&quot; alt=&quot;Livingstone&quot; /&gt;&lt;/p&gt;
977
-
978
- &lt;p&gt;&lt;em&gt;&lt;a href=&quot;https://www.mapbox.com/malaria-mapping/?minday=0&amp;amp;day=1&amp;amp;#12.8/-17.8483/25.8373&quot;&gt;Explore Livingstone, Zambia&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
979
-
980
- &lt;p&gt;&lt;a href=&quot;https://www.mapbox.com/about/team/lukas-martinelli/&quot;&gt;Lukas&lt;/a&gt; developed &lt;a href=&quot;https://www.mapbox.com/malaria-mapping/#6.55/-17.853/25.367&quot;&gt;this visualization&lt;/a&gt; to highlight the progress over the last several months. Dig into &lt;a href=&quot;https://github.com/mapbox/malaria-mapping&quot;&gt;the code&lt;/a&gt; to see how he pulled together the data using &lt;a href=&quot;https://www.mapbox.com/mapbox-gl-js/api/&quot;&gt;GL JS&lt;/a&gt; and &lt;a href=&quot;https://github.com/mapbox/tippecanoe&quot;&gt;tippecanoe&lt;/a&gt;.&lt;/p&gt;
981
-
982
- &lt;p&gt;&lt;a href=&quot;https://www.hotosm.org/projects/malaria_elimination_campaign&quot;&gt;Learn how you can help&lt;/a&gt; us finish mapping all 500,000 km²!&lt;/p&gt;
983
- </description>
984
- <pubDate>Tue, 25 Apr 2017 00:00:00 -0400</pubDate>
985
- <dc:creator>Mikel Maron</dc:creator>
986
- <guid isPermaLink="true">https://www.mapbox.com/blog/world-malaria-day/</guid>
987
- </item>
988
- <item>
989
- <title>Introducing the Navigation SDK for Android</title>
990
- <link>https://www.mapbox.com/blog/android-navigation/</link>
991
- <description>&lt;p&gt;We’ve just released the Mapbox Navigation SDK for Android, making it easy to include a complete navigation experience from within your application. With the Navigation SDK, your users stay engaged and inside your application, all while they navigate to their destination.&lt;/p&gt;
992
-
993
- &lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/3/2832/34115136341_d04254c642_c.jpg&quot; alt=&quot;Android phones showing day and night navigation sessions&quot; /&gt;&lt;/p&gt;
994
-
995
- &lt;p&gt;The Mapbox Navigation SDK for Android is powered by our traffic-aware Directions API and it lets you control the experience from origin to destination.&lt;/p&gt;
996
-
997
- &lt;h1 id=&quot;own-the-experience&quot;&gt;Own the experience&lt;/h1&gt;
998
-
999
- &lt;p&gt;The Navigation SDK comes out of the box with sensible defaults, but you can also personalize the entire experience. You can customize the timing of events, the threshold to trigger a re-route, or the way the traffic map looks like.&lt;/p&gt;
1000
-
1001
- &lt;p&gt;You can also select the location provider and its settings. The SDK uses the open source library LOST, which doesn’t depend on Google Play Services, to track the device’s GPS. However, you can swap this location provider with your own, including Play Services. This is useful to implement battery-friendly options, for devices with custom hardware, and to make sure your app can be available in any app store, in any country. It also makes testing much easier.&lt;/p&gt;
1002
-
1003
- &lt;h1 id=&quot;android-friendly&quot;&gt;Android friendly&lt;/h1&gt;
1004
-
1005
- &lt;p&gt;The API has been designed from scratch to be familiar to Android developers. For example, we use a &lt;code class=&quot;highlighter-rouge&quot;&gt;Service&lt;/code&gt; to provide notifications when the app isn’t in the foreground, we build on top of &lt;code class=&quot;highlighter-rouge&quot;&gt;AutoCompleteTextView&lt;/code&gt; to create the search widget, and we use Retrofit to power all HTTP requests (RxJava observables are supported!).&lt;/p&gt;
1006
-
1007
- &lt;p&gt;Along these lines, your app activity can simply implement a number of listeners to respond to common navigation events (&lt;code class=&quot;highlighter-rouge&quot;&gt;AlertLevelChangeListener&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;NavigationEventListener&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;OffRouteListener&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;ProgressChangeListener&lt;/code&gt;). For example, to provide notifications while the user is traversing along the route you respond to the alerts provided by &lt;code class=&quot;highlighter-rouge&quot;&gt;AlertLevelChangeListener&lt;/code&gt;:&lt;/p&gt;
1008
-
1009
- &lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;navigation.addAlertLevelChangeListener(new AlertLevelChangeListener() {
1010
- @Override
1011
- public void onAlertLevelChange(int alertLevel, RouteProgress routeProgress) {
1012
- switch (alertLevel) {
1013
- case LOW_ALERT_LEVEL:
1014
- // The user just completed the previous maneuver
1015
- break;
1016
- case HIGH_ALERT_LEVEL:
1017
- // The user’s about to do the next maneuver on the route
1018
- break;
1019
- case ARRIVE_ALERT_LEVEL:
1020
- // The user has arrived
1021
- break;
1022
- ...
1023
- }
1024
- }
1025
- });
1026
- &lt;/code&gt;&lt;/pre&gt;
1027
- &lt;/div&gt;
1028
-
1029
- &lt;h1 id=&quot;getting-started&quot;&gt;Getting started&lt;/h1&gt;
1030
-
1031
- &lt;p&gt;To help you integrate the Navigation SDK into your app, we’ve published a &lt;a href=&quot;https://www.mapbox.com/android-docs/mapbox-navigation/0.1/navigation/&quot;&gt;new documentation section&lt;/a&gt; together &lt;a href=&quot;https://github.com/mapbox/mapbox-navigation-android&quot;&gt;with code samples&lt;/a&gt;.&lt;/p&gt;
1032
-
1033
- &lt;p&gt;Don’t forget to share what you are building and report back any bugs and feature request you might have through the &lt;a href=&quot;https://github.com/mapbox/mapbox-navigation-android&quot;&gt;GitHub repository&lt;/a&gt;. Be sure to checkout &lt;a href=&quot;https://www.mapbox.com/blog/navigation-ios-0.2/&quot;&gt;the latest updates&lt;/a&gt; to the iOS Navigation SDK (feature parity is one of our priorities). Show us on &lt;a href=&quot;https://twitter.com/mapbox&quot;&gt;Twitter&lt;/a&gt; what you’re building when you embed the new Navigation SDK. We can’t wait to see it!&lt;/p&gt;
1034
- </description>
1035
- <pubDate>Mon, 24 Apr 2017 12:00:00 -0400</pubDate>
1036
- <dc:creator>Cameron Mace</dc:creator>
1037
- <guid isPermaLink="true">https://www.mapbox.com/blog/android-navigation/</guid>
1038
- </item>
1039
- <item>
1040
- <title>Showcase your business on GoDaddy with custom location tools</title>
1041
- <link>https://www.mapbox.com/blog/godaddy-gocentral/</link>
1042
- <description>&lt;p&gt;GoDaddy has launched &lt;a href=&quot;https://www.godaddy.com/gocentral&quot;&gt;GoCentral&lt;/a&gt; to help businesses everywhere
1043
- build better websites. We’re thrilled to help power GoDaddy with effective location tools that combine the &lt;a href=&quot;https://www.mapbox.com/maps/streets/&quot;&gt;Mapbox Streets style&lt;/a&gt;, &lt;a href=&quot;https://www.mapbox.com/maps/&quot;&gt;GL JS&lt;/a&gt;, and the &lt;a href=&quot;https://www.mapbox.com/geocoding/&quot;&gt;geocoding API&lt;/a&gt;.&lt;/p&gt;
1044
-
1045
- &lt;p&gt;With GoCentral you can create a website in minutes: sign in, select a template, enter your business location, then preview your site, and publish.&lt;/p&gt;
1046
-
1047
- &lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/3/2829/34106142806_e88440132b_b.jpg&quot; alt=&quot;image of contact page&quot; /&gt;&lt;/p&gt;
1048
-
1049
- &lt;p&gt;When you enter your address, GoDaddy’s GoCentral workflow searches our temporary geocoding API, places the address as a point on a map, and saves your business location using the permanent geocoding API.&lt;/p&gt;
1050
-
1051
- &lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/3/2934/34015681361_b196a33b34_b.jpg&quot; alt=&quot;image of godaddy map&quot; /&gt;&lt;/p&gt;
1052
-
1053
- &lt;p&gt;We’re excited to power location services so GoDaddy can help their customers be 100% original.&lt;/p&gt;
1054
-
1055
- &lt;p&gt;Want to add maps to your CMS? &lt;a href=&quot;https://www.mapbox.com/install/&quot;&gt;Get started&lt;/a&gt; and customize your maps in Studio today.
1056
- If you’d like to learn more about storing location data, &lt;a href=&quot;https://www.mapbox.com/contact/sales/?page=pricing&quot;&gt;contact our team&lt;/a&gt; and we will be happy to chat.&lt;/p&gt;
1057
- </description>
1058
- <pubDate>Fri, 21 Apr 2017 09:00:00 -0400</pubDate>
1059
- <dc:creator>Angelina Calderon</dc:creator>
1060
- <guid isPermaLink="true">https://www.mapbox.com/blog/godaddy-gocentral/</guid>
1061
- </item>
1062
- <item>
1063
- <title>Hello, Explorer: The new Mapbox logo</title>
1064
- <link>https://www.mapbox.com/blog/new-mapbox-logo/</link>
1065
- <description>&lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/3/2863/33742461420_90c7cd525f_o.png&quot; alt=&quot;Logo&quot; /&gt;&lt;/p&gt;
1066
-
1067
- &lt;p&gt;As the astronaut looks up at the stars, she’s ready to explore. Our team is driven by curiosity. An astronaut’s helmet, reflecting a star in the distance, embodies our ambitions to build the platform that unlocks new ways of exploring streets, cities, and our planet.&lt;/p&gt;
1068
-
1069
- &lt;div class=&quot;col12 pad2y&quot;&gt;&lt;/div&gt;
1070
-
1071
- &lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/3/2905/33284852904_49008d0641_o.png&quot; alt=&quot;Astronaut illustration&quot; /&gt;&lt;/p&gt;
1072
-
1073
- &lt;div class=&quot;col12 pad2y&quot;&gt;&lt;/div&gt;
1074
-
1075
- &lt;p&gt;An astronaut helmet now marks every Mapbox map, wherever our maps are used.&lt;/p&gt;
1076
-
1077
- &lt;h2 id=&quot;designed-by-will-dove&quot;&gt;Designed by Will Dove&lt;/h2&gt;
1078
-
1079
- &lt;p&gt;&lt;img src=&quot;https://c2.staticflickr.com/4/3956/33970244412_ae7e639383_o.png&quot; alt=&quot;Logo diagram&quot; /&gt;&lt;/p&gt;
1080
-
1081
- &lt;p&gt;I’ve admired &lt;a href=&quot;http://willdove.com/&quot;&gt;Will Dove&lt;/a&gt; for years, so it was a pleasure to work with him on this project. My goals and guidance were simple, and he exceeded expectations. Here’s the direction I gave Will:&lt;/p&gt;
1082
-
1083
- &lt;ol&gt;
1084
- &lt;li&gt;
1085
- &lt;p&gt;Most importantly, I explained that we need a logo that our customers will display alongside our maps as a &lt;em&gt;badge of pride&lt;/em&gt;, not just as a watermark. The logo should have a unique, simple silhouette that works well at small sizes, especially for mobile screens, and does not distract from the beautiful maps designed with our platform.&lt;/p&gt;
1086
- &lt;/li&gt;
1087
- &lt;li&gt;
1088
- &lt;p&gt;This logo is a 100% fresh start of a larger internal rebrand. I told Will to not overthink the name “Mapbox” or the existing brand. Maps are cool, but boxes are boring. We’re not waiting for a comprehensive brand system with principles, styleguides, and animated advertisements, etc. - we’re shipping now. Working iteratively is central to the culture at Mapbox, on every team. Now that the logo is complete, we’ll start using it, see what works, and keep refining.&lt;/p&gt;
1089
- &lt;/li&gt;
1090
- &lt;li&gt;
1091
- &lt;p&gt;Midway through the design process, I had a dream that I unwrapped a Tootsie Pop, looking for the &lt;a href=&quot;http://tootsie.com/legend-of-the-shooting-star/&quot;&gt;lucky shooting star&lt;/a&gt;. Growing up, I was obsessed with finding the star to get free Tootsie Pops. On the wrapper, I saw an astronaut pointing up at the star. I told Will about this dream, and it inspired the final design.&lt;/p&gt;
1092
- &lt;/li&gt;
1093
- &lt;/ol&gt;
1094
-
1095
- &lt;p&gt;Download the logo and read the usage guidelines &lt;a href=&quot;https://www.mapbox.com/about/press/brand-guidelines/&quot;&gt;on our press page&lt;/a&gt;.&lt;/p&gt;
1096
- </description>
1097
- <pubDate>Wed, 19 Apr 2017 00:00:00 -0400</pubDate>
1098
- <dc:creator>Saman Bemel Benrud</dc:creator>
1099
- <guid isPermaLink="true">https://www.mapbox.com/blog/new-mapbox-logo/</guid>
1100
- </item>
1101
- <item>
1102
- <title>Welcome, Mugdha Bhattacharya!</title>
1103
- <link>https://www.mapbox.com/blog/welcome-mugdha/</link>
1104
- <description>&lt;p&gt;&lt;a href=&quot;https://www.mapbox.com/about/team/mugdha-bhattacharya/&quot;&gt;Mugdha&lt;/a&gt; just joined the Operations team at Mapbox Bangalore, where she’ll focus on building systems and processes around recruiting and onboarding. She’ll also work on creating strong people support systems to help our growing data team in India scale globally.&lt;/p&gt;
1105
-
1106
- &lt;p&gt;&lt;img src=&quot;https://c2.staticflickr.com/4/3952/33982850511_5ca9d213ec_b.jpg&quot; alt=&quot;Mugdha&quot; /&gt;&lt;/p&gt;
1107
-
1108
- &lt;p&gt;Before Mapbox, she’s held diverse roles such as managing the Accelerated Leadership Programs at Gyanodaya - Aditya Birla Global Centre for Leadership Learning, teaching French and Psychology to school kids, and providing counseling to the officers in the Indian Navy. She enjoys reading fiction, listening to music, watching horror movies, traveling, the Tango, and mountaineering.&lt;/p&gt;
1109
- </description>
1110
- <pubDate>Tue, 18 Apr 2017 16:00:00 -0400</pubDate>
1111
- <dc:creator>Shiv Ramachandran</dc:creator>
1112
- <guid isPermaLink="true">https://www.mapbox.com/blog/welcome-mugdha/</guid>
1113
- </item>
1114
- <item>
1115
- <title>We switched to Amazon ECS and you won&#39;t believe what happened next</title>
1116
- <link>https://www.mapbox.com/blog/switch-to-ecs/</link>
1117
- <description>&lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/3/2887/33313874563_5d0a1c563e_o.png&quot; alt=&quot;listicle reactions stickers&quot; /&gt;&lt;/p&gt;
1118
-
1119
- &lt;p&gt;The Mapbox platform is powered by Amazon Web Services — specifically, most of our computing workloads run on AWS &lt;a href=&quot;https://aws.amazon.com/ec2/&quot;&gt;EC2&lt;/a&gt;. We’re in the process of wrapping up a company-wide migration (led by &lt;a href=&quot;https://www.mapbox.com/about/team/#platform&quot;&gt;the Platform team&lt;/a&gt;) onto &lt;a href=&quot;https://www.docker.com/&quot;&gt;Docker&lt;/a&gt;, hosted on AWS &lt;a href=&quot;https://aws.amazon.com/ecs/&quot;&gt;ECS&lt;/a&gt; (EC2 container service). Here’s what we’ve achieved by containerizing any and all of our computing needs:&lt;/p&gt;
1120
-
1121
- &lt;ol&gt;
1122
- &lt;li&gt;&lt;strong&gt;Lower AWS bills.&lt;/strong&gt; By switching to ECS we cut our EC2 bill in half - here’s how:
1123
- &lt;ul&gt;
1124
- &lt;li&gt;&lt;em&gt;Better resource utilization:&lt;/em&gt; Docker allows us to improve the resource utilization on our EC2s by using them to run more than a single service. For example, on an instance type where we used to run a single occurrence of our Maps API, we can now run both our Maps API and Geocoding API. 2 for the price of 1!&lt;/li&gt;
1125
- &lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://aws.amazon.com/ec2/spot/&quot;&gt;Spot&lt;/a&gt; by default:&lt;/em&gt; All of our clusters (EC2s where containers are hosted) are powered by &lt;a href=&quot;http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-fleet.html&quot;&gt;Spot fleets&lt;/a&gt;, which are groups of different-instance-type Spot EC2s optimized for diversity. Diversity = stability on the spot market, which means lower cost and lower risk of instance turnover. Docker allows us to take advantage of that diversity, because containers don’t care about the size of the machine they run on, as long as there’s room. Containers are also wicked fast to start up and shut down, which allows us to dodge spot price outs gracefully.&lt;/li&gt;
1126
- &lt;li&gt;&lt;em&gt;Centralized EC2 cost management:&lt;/em&gt; Using ECS will centralize EC2 cost optimization work in the hands of the Platform team. For most teams, running ECS services with accurate reservations on our clusters will mean their work is EC2 cost-optimized by default. Centralizing control of our EC2 bill will make it much easier to manage.&lt;/li&gt;
1127
- &lt;/ul&gt;
1128
- &lt;/li&gt;
1129
- &lt;li&gt;
1130
- &lt;p&gt;&lt;strong&gt;Better security and credentials management.&lt;/strong&gt;&lt;/p&gt;
1131
-
1132
- &lt;p&gt;We run logging, metrics, and security infrastructure on every EC2. With ECS, the oversight of these systems is consolidated to the team that manages ECS cluster provisioning, the Platform team. This means that if our logging credentials are ever compromised, we only have to rotate credentials in a single place and everyone benefits.&lt;/p&gt;
1133
- &lt;/li&gt;
1134
- &lt;li&gt;
1135
- &lt;p&gt;&lt;strong&gt;Consistency across teams and services.&lt;/strong&gt;&lt;/p&gt;
1136
-
1137
- &lt;p&gt;The number of different things you need to know to work on a given service will shrink drastically with Docker, ECS, and the frameworks and tools we’ve built for using them. More consistency across services means we can more effectively work and share knowledge and resources across teams. This process streamlines our workflows as a company, leading to better collaboration and higher throughput.&lt;/p&gt;
1138
- &lt;/li&gt;
1139
- &lt;li&gt;
1140
- &lt;p&gt;&lt;strong&gt;Separating private infrastructure from otherwise sharable code.&lt;/strong&gt;&lt;/p&gt;
1141
-
1142
- &lt;p&gt;We have to consider logging, metrics, and security infrastructure when we run EC2s, and we need to keep these parts of our systems private. If Mapbox-specific EC2 bootstrapping is no longer part of the application’s code base, it is suddenly much easier to open-source that application. Once we switched, we were able to move Watchbot, the library we use to power our data processing stacks, from private to public. Check out &lt;a href=&quot;https://github.com/mapbox/ecs-watchbot&quot;&gt;watchbot&lt;/a&gt; on GitHub if you’re interested!&lt;/p&gt;
1143
- &lt;/li&gt;
1144
- &lt;li&gt;
1145
- &lt;p&gt;&lt;strong&gt;Less environment confusion.&lt;/strong&gt;&lt;/p&gt;
1146
-
1147
- &lt;p&gt;Understanding the EC2 environment can be confusing and obscure if you don’t know where to look. Using Docker asks the application developer to be more explicit about their required runtime environment and less dependent on convention or other systems. Since we can run Docker locally, we can run our code in an environment that is that much closer to production. This can help spot issues that currently can take several iterations of stage, fail, debug, repeat.&lt;/p&gt;
1148
- &lt;/li&gt;
1149
- &lt;/ol&gt;
1150
-
1151
- &lt;p&gt;Do you love listicles about AWS infrastructure and scale? The Platform team &lt;a href=&quot;https://www.mapbox.com/jobs/&quot;&gt;is hiring&lt;/a&gt;!&lt;/p&gt;
1152
- </description>
1153
- <pubDate>Tue, 18 Apr 2017 09:00:00 -0400</pubDate>
1154
- <dc:creator>Emily McAfee</dc:creator>
1155
- <guid isPermaLink="true">https://www.mapbox.com/blog/switch-to-ecs/</guid>
1156
- </item>
1157
- <item>
1158
- <title>3D building data for San Francisco</title>
1159
- <link>https://www.mapbox.com/blog/importing-sf-building-heights/</link>
1160
- <description>&lt;p&gt;You’ll find now height data for &lt;strong&gt;140,484&lt;/strong&gt; San Francisco buildings in our maps. We have &lt;a href=&quot;https://www.mapbox.com/events/sf-mapathon/&quot;&gt;partnered with the San Francisco OpenStreetMap community&lt;/a&gt; to add this data directly into OpenStreetMap from where we’re making it available in Mapbox Streets. You can now use these &lt;a href=&quot;https://www.mapbox.com/mapbox-gl-js/example/3d-buildings/&quot;&gt;3D buildings in Mapbox GL&lt;/a&gt; or &lt;a href=&quot;https://www.mapbox.com/blog/drive-your-map/&quot;&gt;for games, AR and VR applications in Unity&lt;/a&gt;.&lt;/p&gt;
1161
-
1162
- &lt;div class=&quot;video space-bottom4&quot; style=&quot;padding-bottom:56%;&quot;&gt;
1163
- &lt;iframe src=&quot;https://player.vimeo.com/video/212894892?autoplay=1&amp;amp;loop=1&quot; width=&quot;100%&quot; height=&quot;100%&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; allowfullscreen=&quot;true&quot;&gt;
1164
- &lt;/iframe&gt;
1165
- &lt;/div&gt;
1166
-
1167
- &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
1168
-
1169
- &lt;p&gt;&lt;a href=&quot;https://wiki.openstreetmap.org/wiki/San_Francisco_Building_Height_Import&quot;&gt;Learn more about this work&lt;/a&gt; over on OpenStreetMap.org and check out this tutorial to discover how to &lt;a href=&quot;https://www.mapbox.com/blog/mapping-3d-buildings/&quot;&gt;map 3D building data&lt;/a&gt; yourself.&lt;/p&gt;
1170
- </description>
1171
- <pubDate>Fri, 14 Apr 2017 08:30:00 -0400</pubDate>
1172
- <dc:creator>Chethan Gowda</dc:creator>
1173
- <guid isPermaLink="true">https://www.mapbox.com/blog/importing-sf-building-heights/</guid>
1174
- </item>
1175
- <item>
1176
- <title>Mapbox in Portlandia</title>
1177
- <link>https://www.mapbox.com/blog/pdx-april-confs/</link>
1178
- <description>&lt;p&gt;&lt;img alt=&quot;pdx_carpet___mapbox&quot; src=&quot;https://c1.staticflickr.com/3/2939/33614553090_6a2f3f387c_b.jpg&quot; /&gt;&lt;/p&gt;
1179
-
1180
- &lt;p&gt;While Portland is best known for its bikes, donuts, and DIY culture, it’s also a city that’s pushed boundaries through thoughtful urban planning and celebration of art and design. This month, Mapbox will be a part of this celebration at two conferences - &lt;a href=&quot;http://www.gisinaction.org/&quot;&gt;GIS in Action&lt;/a&gt; and &lt;a href=&quot;https://www.designweekportland.com/&quot;&gt;Design Week Portland&lt;/a&gt;. Both conferences look at cities and other environments through the lens of the map and we’re thrilled to be a part of this by hosting two workshops as well as conducting user interviews to learn more about how &lt;em&gt;you&lt;/em&gt; use maps.&lt;/p&gt;
1181
-
1182
- &lt;p&gt;The 25th Annual &lt;a href=&quot;http://www.gisinaction.org/&quot;&gt;GIS In Action Conference&lt;/a&gt;, hosted by the Columbia River Region of the American Society of Photogrammetry and Remote Sensing (ASPRS) and the Oregon-Southwest Washington Chapter of the Urban and Regional Information Systems Association (URISA) will be held at Portland State University. Mapbox will be presenting a Mapbox Studio workshop that covers the tools and workflows needed to supplement the GIS technologies integral in urban planning, spatial analysis, and data management. The workshop will be held on &lt;strong&gt;Tuesday, April 18, from 1 pm to 4 pm&lt;/strong&gt; and is open to all attendees of GIS in Action.&lt;/p&gt;
1183
-
1184
- &lt;p&gt;Design Week Portland is a week-long, city-wide series of programs exploring the process, craft, and practice of design across all disciplines. We’ll be hosting a three-hour workshop focused on cartographic design with Mapbox Studio. The workshop will be held on &lt;strong&gt;Sunday, April 23, from 1 pm to 4 pm&lt;/strong&gt; at &lt;a href=&quot;https://www.wework.com/l/portland--OR&quot;&gt;WeWork&lt;/a&gt; in downtown Portland. Registration is &lt;a href=&quot;https://www.designweekportland.com/events/design-for-cities-with-mapbox-studio&quot;&gt;still open&lt;/a&gt;.&lt;/p&gt;
1185
-
1186
- &lt;p&gt;Have ideas or mapping challenges you want to share with our team? We’re conducting user interviews both weeks to learn how you use maps and the challenges you face. If you’re interested, fill out &lt;a href=&quot;https://mapbox.typeform.com/to/rN3aZP&quot;&gt;this survey&lt;/a&gt; to meet and chat with our team!&lt;/p&gt;
1187
- </description>
1188
- <pubDate>Thu, 13 Apr 2017 09:00:00 -0400</pubDate>
1189
- <dc:creator>Rafa Gutierrez</dc:creator>
1190
- <guid isPermaLink="true">https://www.mapbox.com/blog/pdx-april-confs/</guid>
1191
- </item>
1192
- <item>
1193
- <title>A complete turn-by-turn navigation UI in your iOS application</title>
1194
- <link>https://www.mapbox.com/blog/navigation-ios-0.2/</link>
1195
- <description>&lt;p&gt;The new &lt;a href=&quot;https://github.com/mapbox/mapbox-navigation-ios/&quot;&gt;Mapbox Navigation SDK for iOS&lt;/a&gt; makes it easy to add a complete turn-by-turn navigation experience to your iOS application. The navigation SDK builds upon our January releases of &lt;a href=&quot;https://www.mapbox.com/blog/open-source-mapbox-navigation-swift/&quot;&gt;core navigation components&lt;/a&gt; (previously known as MapboxNavigation.swift), &lt;a href=&quot;https://www.mapbox.com/blog/runtime-styling-release/&quot;&gt;runtime styling for maps&lt;/a&gt;, and &lt;a href=&quot;https://www.mapbox.com/directions/&quot;&gt;real-time, traffic-aware directions&lt;/a&gt;. We’ve added some important features that give your users more reasons to stay within your application:&lt;/p&gt;
1196
-
1197
- &lt;ul&gt;
1198
- &lt;li&gt;A ready-to-go, drop-in navigation UI&lt;/li&gt;
1199
- &lt;li&gt;Smoother location updates&lt;/li&gt;
1200
- &lt;li&gt;Voice instructions powered by &lt;a href=&quot;https://aws.amazon.com/polly/&quot;&gt;Amazon Polly&lt;/a&gt;&lt;/li&gt;
1201
- &lt;/ul&gt;
1202
-
1203
- &lt;h2 id=&quot;a-ready-to-go-drop-in-navigation-ui&quot;&gt;A ready-to-go, drop-in navigation UI&lt;/h2&gt;
1204
-
1205
- &lt;p&gt;With just a few lines of Swift or Objective-C code, your application can take advantage of the Mapbox Navigation SDK’s ready-made route view controller:&lt;/p&gt;
1206
-
1207
- &lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-swift&quot; data-lang=&quot;swift&quot;&gt;&lt;span class=&quot;c1&quot;&gt;// Obtain a route from MapboxDirections.swift and create a route view controller to follow it.&lt;/span&gt;
1208
- &lt;span class=&quot;k&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;viewController&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;NavigationUI&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;routeViewController&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;selectedRoute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
1209
-
1210
- &lt;span class=&quot;c1&quot;&gt;// Optionally configure Amazon Polly with a pool ID. Without a pool ID, the SDK will use AVSpeechSynthesizer instead.&lt;/span&gt;
1211
- &lt;span class=&quot;n&quot;&gt;viewController&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;voiceController&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;identityPoolId&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;&amp;lt;#Your AWS Pool Id#&amp;gt;&quot;&lt;/span&gt;
1212
-
1213
- &lt;span class=&quot;c1&quot;&gt;// Smooth out user location updates to more closely match the route line.&lt;/span&gt;
1214
- &lt;span class=&quot;n&quot;&gt;viewController&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;routeController&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;snapsUserLocationAnnotationToRoute&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;
1215
-
1216
- &lt;span class=&quot;c1&quot;&gt;// Present the route view controller.&lt;/span&gt;
1217
- &lt;span class=&quot;nf&quot;&gt;present&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;viewController&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;animated&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
1218
-
1219
- &lt;span class=&quot;c1&quot;&gt;// That’s it! The SDK takes care of rerouting, voice announcements, and UI updates.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
1220
-
1221
- &lt;p&gt;&lt;img src=&quot;https://c2.staticflickr.com/4/3951/33051169173_93f4a10e22_b.jpg&quot; alt=&quot;Mapbox Navigation iOS SDK&quot; /&gt;&lt;/p&gt;
1222
-
1223
- &lt;p&gt;The Mapbox Navigation SDK provides several options for customizing colors and other details. It also supports storyboard integration. If you need more advanced customization, or if you want the spatial and timing logic without the full UI, you can build your own navigation experience around the Mapbox Core Navigation library that’s included in the SDK.&lt;/p&gt;
1224
-
1225
- &lt;h2 id=&quot;smoother-location-updates&quot;&gt;Smoother location updates&lt;/h2&gt;
1226
-
1227
- &lt;p&gt;Even in normal driving conditions, an iPhone may report an occasional inaccurate location update. The Mapbox Navigation SDK now corrects these location updates to more closely conform to the route line, resulting in a more consistent view of the road ahead, smoother transitions from step to step, and fewer rerouting attempts.&lt;/p&gt;
1228
-
1229
- &lt;div class=&quot;video&quot; style=&quot;padding-bottom:56.25%;&quot;&gt;
1230
- &lt;iframe src=&quot;https://player.vimeo.com/video/211357626?autoplay=1&amp;amp;loop=1&quot; width=&quot;100%&quot; height=&quot;100%&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
1231
- &lt;/div&gt;
1232
-
1233
- &lt;h2 id=&quot;voice-instructions-powered-by-amazon-polly&quot;&gt;Voice instructions powered by Amazon Polly&lt;/h2&gt;
1234
-
1235
- &lt;p&gt;The Mapbox Navigation SDK incorporates turn instructions in several languages, reading them aloud using &lt;a href=&quot;https://aws.amazon.com/polly/&quot;&gt;Amazon Polly&lt;/a&gt;. Unlike the AVSpeechSynthesizer API built into iOS, Amazon Polly delivers more natural-sounding pronunciation of road names and numbers. For example, the following turn instruction contains a street name with a relatively unusual spelling pattern:&lt;/p&gt;
1236
-
1237
- &lt;blockquote&gt;
1238
- &lt;p&gt;In 400 feet turn left onto East Coeur D’Alene Avenue then merge left onto I-280&lt;/p&gt;
1239
- &lt;/blockquote&gt;
1240
-
1241
- &lt;p&gt;AVSpeechSynthesizer not only mangles the street name but also reads the route number as “eye two hundred and eighty”:&lt;/p&gt;
1242
-
1243
- &lt;audio controls=&quot;&quot;&gt;
1244
- &lt;source src=&quot;https://cldup.com/EaFunPR9o8.mp3&quot; type=&quot;audio/mpeg&quot; /&gt;
1245
- Your browser does not support the audio element.
1246
- &lt;/audio&gt;
1247
-
1248
- &lt;p&gt;With Amazon Polly, the Mapbox Navigation SDK correctly pronounces both the street name and the route number (as “eye two-eighty”):&lt;/p&gt;
1249
-
1250
- &lt;audio controls=&quot;&quot;&gt;
1251
- &lt;source src=&quot;https://cldup.com/ZqQHpidqZL.mp3&quot; type=&quot;audio/mpeg&quot; /&gt;
1252
- Your browser does not support the audio element.
1253
- &lt;/audio&gt;
1254
-
1255
- &lt;p&gt;Natural-sounding pronunciation helps your users comprehend the turn instructions being read aloud by your application, reducing the chances of misunderstanding and missed turns.&lt;/p&gt;
1256
-
1257
- &lt;p&gt;Add a complete navigation experience to your application today with the &lt;a href=&quot;https://github.com/mapbox/mapbox-navigation-ios/&quot;&gt;Mapbox Navigation SDK for iOS&lt;/a&gt;, and stay tuned for our Navigation SDK for Android.&lt;/p&gt;
1258
- </description>
1259
- <pubDate>Thu, 13 Apr 2017 05:00:00 -0400</pubDate>
1260
- <dc:creator>Bobby Sudekum</dc:creator>
1261
- <guid isPermaLink="true">https://www.mapbox.com/blog/navigation-ios-0.2/</guid>
1262
- </item>
1263
- <item>
1264
- <title>¡Hola, México! Fresh satellite photos for Mexican cities</title>
1265
- <link>https://www.mapbox.com/blog/new-imagery-for-mexico/</link>
1266
- <description>&lt;p&gt;We’ve just refreshed our satellite imagery for Mexico, with nearly half a million square kilometers of new imagery for cities and countryside across the nation. Our updates reach from Jalisco in the west to Tabasco in the east, including the central metropolises of Mexico City and the Bajío. Enjoy fresh views of the country’s landscapes and cityscapes:&lt;/p&gt;
1267
-
1268
- &lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/3/2864/33150785023_04998e4bcd_b.jpg&quot; alt=&quot;An intricate street pattern in Guadalajara&quot; /&gt;&lt;/p&gt;
1269
-
1270
- &lt;p&gt;Guadalajara’s streets are a mix of gridded and radial. The banana-yellow &lt;em&gt;Arcos del tercer milenio&lt;/em&gt; is at bottom right.&lt;/p&gt;
1271
-
1272
- &lt;p&gt;&lt;img src=&quot;https://farm3.staticflickr.com/2939/33579019830_fed20a7b0e_b.jpg&quot; alt=&quot;A colorful mining town set between steep hills&quot; /&gt;&lt;/p&gt;
1273
-
1274
- &lt;p&gt;The small town of Mineral de Angangueo sits in the hills about three hours’ drive west of Mexico City. It used to be a mining town, but now it’s a tourist attraction because the surrounding park is where tens of millions of monarch butterflies spend the winter. Some butterflies come from as far away as Canada, and scientists still don’t know exactly how such tiny animals can navigate across North America to converge on this particular forest.&lt;/p&gt;
1275
-
1276
- &lt;p&gt;&lt;img src=&quot;https://farm3.staticflickr.com/2834/33150784813_1b8064e8e3_b.jpg&quot; alt=&quot;A beach with resorts&quot; /&gt;&lt;/p&gt;
1277
-
1278
- &lt;p&gt;Hotels crowd the beach at Puerto Vallarta, a resort town popular with domestic as well as international tourists.&lt;/p&gt;
1279
-
1280
- &lt;p&gt;&lt;img src=&quot;https://farm4.staticflickr.com/3938/33579019690_debc8c25b4_b.jpg&quot; alt=&quot;Gridded fields lie on tableland-like ridges bordered by steep cañons&quot; /&gt;&lt;/p&gt;
1281
-
1282
- &lt;p&gt;Farms and villages fit between steep drainages in Puebla, on the flank of Iztaccíhuatl, a dormant volcano.&lt;/p&gt;
1283
-
1284
- &lt;p&gt;&lt;img src=&quot;https://farm3.staticflickr.com/2883/33922643766_ca7bdea2b7_b.jpg&quot; alt=&quot;An urban center, full of historic and commercial attractions&quot; /&gt;&lt;/p&gt;
1285
-
1286
- &lt;p&gt;Downtown Oaxaca shows how the new imagery looks in the Satellite Streets style. The OpenStreetMap labels add context to the satellite layer without overwhelming it. OpenStreetMap has an excellent contributor community in Mexico, and we hope this updated imagery will help them map even more.&lt;/p&gt;
1287
-
1288
- &lt;p&gt;Today’s new satellite mosaics follow on updates for &lt;a href=&quot;https://www.mapbox.com/blog/shanghai-imagery-update/&quot;&gt;Shanghai and its suburbs&lt;/a&gt;, &lt;a href=&quot;https://www.mapbox.com/blog/yyz-and-yvr-satellite-update/&quot;&gt;Canadian cities&lt;/a&gt;, and &lt;a href=&quot;https://www.mapbox.com/blog/new-india-imagery/&quot;&gt;large parts of India&lt;/a&gt;. There’s more to come, so check back soon – and if you have questions, &lt;a href=&quot;https://twitter.com/vruba&quot;&gt;say hello on Twitter&lt;/a&gt;.&lt;/p&gt;
1289
- </description>
1290
- <pubDate>Tue, 11 Apr 2017 08:00:00 -0400</pubDate>
1291
- <dc:creator>Charlie Loyd</dc:creator>
1292
- <guid isPermaLink="true">https://www.mapbox.com/blog/new-imagery-for-mexico/</guid>
1293
- </item>
1294
- <item>
1295
- <title>Create your own cognitive spatial app</title>
1296
- <link>https://www.mapbox.com/blog/cognitive-event-finder-webinar/</link>
1297
- <description>&lt;p&gt;Remember the &lt;a href=&quot;https://www.mapbox.com/blog/discover-sxsw-with-ibm/&quot;&gt;app we built with IBM&lt;/a&gt; to help SXSW participants discover a personalized event feed? &lt;a href=&quot;http://resources.sdtimes.com/webinar-ibm-042017?hs_preview=xHnGLxiM-4871757980&amp;amp;cm_mc_uid=92355736388114732654392&amp;amp;cm_mc_sid_50200000=1491447656&quot;&gt;Register now&lt;/a&gt; for tomorrow’s webinar &lt;em&gt;How IBM and Mapbox Put Open Data and Real-Time Recommendations On the Map&lt;/em&gt; to learn how you can make a cognitive spatial app yourself.&lt;/p&gt;
1298
-
1299
- &lt;p&gt;Our SXSW Cognitive Event Finder app enables users to quickly sift through thousands of events on their mobile phone, pairing what a user wants to do with great activities nearby. Using the power of the IBM platform with Mapbox, we built this app with only three part-time developers in the week leading up to SXSW. You can &lt;a href=&quot;https://github.com/ibm-cds-labs/cognitive-event-finder/?cm_mc_uid=92355736388114732654392&amp;amp;cm_mc_sid_50200000=1491447656&quot;&gt;check out the code here&lt;/a&gt;.&lt;/p&gt;
1300
-
1301
- &lt;p&gt;On Tuesday, April 11 at 10am PT, I’ll join &lt;a href=&quot;https://medium.com/@rajrsingh?cm_mc_uid=92355736388114732654392&amp;amp;cm_mc_sid_50200000=1491447656&quot;&gt;Raj Singh from IBM&lt;/a&gt; to show how you can combine IBM Cloudant, Watson Analytics, and Mapbox tools to build an interactive chat-bot app complete with context-aware maps and navigation.&lt;/p&gt;
1302
-
1303
- &lt;p&gt;&lt;img src=&quot;https://i.imgur.com/sIdK0Zs.gif&quot; alt=&quot;App Gif&quot; /&gt;&lt;/p&gt;
1304
-
1305
- &lt;p&gt;What ideas do you have for a cognitive location app with Watson and Mapbox? Drop us a line at enterprise@mapbox.com.&lt;/p&gt;
1306
- </description>
1307
- <pubDate>Mon, 10 Apr 2017 14:00:00 -0400</pubDate>
1308
- <dc:creator>Ryan Baumann</dc:creator>
1309
- <guid isPermaLink="true">https://www.mapbox.com/blog/cognitive-event-finder-webinar/</guid>
1310
- </item>
1311
- <item>
1312
- <title>Welcome, Anand Thakker!</title>
1313
- <link>https://www.mapbox.com/blog/welcome-anand/</link>
1314
- <description>&lt;p&gt;&lt;a href=&quot;https://www.mapbox.com/about/team/anand-thakker&quot;&gt;Anand Thakker&lt;/a&gt; just joined Mapbox!
1315
- Anand comes to us from our good friends at &lt;a href=&quot;https://developmentseed.org/&quot;&gt;Development Seed&lt;/a&gt;, where he frequently used and contributed to Mapbox GL JS while working on projects ranging from &lt;a href=&quot;https://developmentseed.org/projects/nightlights/&quot;&gt;rural electrification&lt;/a&gt; to &lt;a href=&quot;https://www.mapbox.com/blog/washpo-election-2016/&quot;&gt;live election maps&lt;/a&gt;. At Mapbox, he’ll continue to focus on pushing Mapbox GL’s features, flexibility, and performance to the next level.&lt;/p&gt;
1316
-
1317
- &lt;p&gt;Welcome, Anand!&lt;/p&gt;
1318
-
1319
- &lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/3/2886/33881473115_34da895bc6.jpg&quot; alt=&quot;Anand&quot; /&gt;&lt;/p&gt;
1320
- </description>
1321
- <pubDate>Fri, 07 Apr 2017 10:00:00 -0400</pubDate>
1322
- <dc:creator>John Firebaugh</dc:creator>
1323
- <guid isPermaLink="true">https://www.mapbox.com/blog/welcome-anand/</guid>
1324
- </item>
1325
- <item>
1326
- <title>Healthy community patterns of contribution in OpenStreetMap</title>
1327
- <link>https://www.mapbox.com/blog/aagmapathon-contribution/</link>
1328
- <description>&lt;p&gt;&lt;em&gt;The Association of American Geographers will host the &lt;a href=&quot;http://aagmapathon.org/index.html#home&quot;&gt;second annual AAG Mapathon&lt;/a&gt; this week in Boston, and &lt;a href=&quot;http://www.townsendjennings.com/&quot;&gt;Jennings Anderson&lt;/a&gt;, a PhD student at the University of Colorado Boulder, will be there to share his work undertaken last year as a Mapbox Research Fellow on &lt;a href=&quot;http://meridian.aag.org/callforpapers/program/AbstractDetail.cfm?AbstractID=84671&quot;&gt;OpenStreetMap contributors and quality&lt;/a&gt;. I’ve asked Jennings to share some results from his research below.&lt;/em&gt;&lt;/p&gt;
1329
-
1330
- &lt;p&gt;&lt;em&gt;Join him and the mappers for mapping talk and tacos on us at the &lt;a href=&quot;https://www.eventbrite.com/e/mit-mapathon-tickets-31941662372&quot;&gt;Mapathon after party&lt;/a&gt;!&lt;/em&gt;&lt;/p&gt;
1331
-
1332
- &lt;p&gt;OpenStreetMap is unique in that the geospatial data includes metadata about the contributor and time of each and every feature. How can we perform quality analysis for areas of the globe where OpenStreetMap is already certainly the best available data set? While researching at Mapbox, I set out to find &lt;em&gt;intrinsic&lt;/em&gt; measures of quality in OpenStreetMap based on this additional user and community information. I have found a strong relationship between healthy community patterns of contribution in OpenStreetMap and the resulting quality of data on the map.&lt;/p&gt;
1333
-
1334
- &lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/3/2865/33500936460_171c6c0d1f_b.jpg&quot; alt=&quot;image of european contributor density&quot; /&gt;&lt;/p&gt;
1335
-
1336
- &lt;p&gt;Taking a &lt;strong&gt;contributor-centric&lt;/strong&gt; approach to quality allows us to ask questions like: Compared to all of the areas a user has edited, what percentage of their edits occur in a particular area? Does this user primarily edit roads, buildings, or other types of objects? How does this compare to others in the same region? The answer to these questions should give us some indication of the data quality across different regions of the map.&lt;/p&gt;
1337
-
1338
- &lt;p&gt;To perform this analysis, I used &lt;a href=&quot;https://www.mapbox.com/blog/osm-qa-tiles/&quot;&gt;OSM QA Tiles&lt;/a&gt; as the basic unit of analysis, and &lt;a href=&quot;http://osmlab.github.io/osm-qa-tiles/historic.html&quot;&gt;historical snapshots&lt;/a&gt; to investigate annual trends. OpenStreetMap data and metadata is preprocessed into a global, zoom level 12 data set, with &lt;a href=&quot;https://www.mapbox.com/blog/tile-reduce-3/&quot;&gt;Tile Reduce&lt;/a&gt; simplifying and speeding up the processing of our contributor-centric analysis. The entire planet for any given year can be processed in under an hour with a large Amazon EC2 instance!&lt;/p&gt;
1339
-
1340
- &lt;p&gt;&lt;img src=&quot;https://i.imgur.com/aA2yHVR.gif&quot; alt=&quot;gif of user summary&quot; /&gt;&lt;/p&gt;
1341
-
1342
- &lt;p&gt;To explore individual editing characteristics, I export annual user contribution summaries at per tile granularity. These files are then visualized with mapbox-gl-js in the browser to explore contribution patterns at the user level. &lt;a href=&quot;http://mapbox.github.io/osm-analysis-collab/user-summary&quot;&gt;Explore you and your community’s annual contributions&lt;/a&gt; since the start of OpenStreetMap.&lt;/p&gt;
1343
-
1344
- &lt;p&gt;Once these user-level statistics are extracted at a per-tile level, we import these user summaries into a PostgreSQL database to interact with the data in other analysis tools like Python or R to do more exploration of these data. This can drive investigation of &lt;a href=&quot;http://mapbox.github.io/osm-analysis-collab/users-by-country&quot;&gt;national level trends&lt;/a&gt; and &lt;a href=&quot;http://mapbox.github.io/osm-analysis-collab/user-interaction-networks&quot;&gt;social network analysis of editors in the same region&lt;/a&gt;.&lt;/p&gt;
1345
-
1346
- &lt;p&gt;&lt;img src=&quot;https://i.imgur.com/4j1e4OI.gif&quot; alt=&quot;gif of social network analysis&quot; /&gt;&lt;/p&gt;
1347
-
1348
- &lt;p&gt;&lt;a href=&quot;http://mapbox.github.io/osm-analysis-collab/&quot;&gt;Explore all the analysis tools and more detailed explanations&lt;/a&gt; of this contributor-centric approach. Assessing data quality in OpenStreetMap remains an open research question with many different approaches. I hope that by better understanding individual contribution patterns and their implications for data quality, we may continue to support a healthy, vibrant OpenStreetMap.&lt;/p&gt;
1349
-
1350
- &lt;p&gt;Want to know more? Come &lt;a href=&quot;https://twitter.com/JenningsatCU&quot;&gt;find me&lt;/a&gt; at my &lt;a href=&quot;http://meridian.aag.org/callforpapers/program/AbstractDetail.cfm?AbstractID=84671&quot;&gt;AAG session&lt;/a&gt; or at the &lt;a href=&quot;http://aagmapathon.org/index.html#home&quot;&gt;AAG Mapathon&lt;/a&gt;. If you can’t make it to Boston, you can watch &lt;a href=&quot;http://stateofthemap.us/2016/osm-us-by-the-numbers-for-the-community/&quot;&gt;this video of Mikel and I presenting at State of the Map US 2016&lt;/a&gt;. Would love to talk more about OpenStreetMap analysis in person or online!&lt;/p&gt;
1351
- </description>
1352
- <pubDate>Fri, 07 Apr 2017 08:00:00 -0400</pubDate>
1353
- <dc:creator>Mikel Maron</dc:creator>
1354
- <guid isPermaLink="true">https://www.mapbox.com/blog/aagmapathon-contribution/</guid>
1355
- </item>
1356
- <item>
1357
- <title>One year public on HackerOne</title>
1358
- <link>https://www.mapbox.com/blog/hackerone-one-year-public/</link>
1359
- <description>&lt;p&gt;Last month was our one year anniversary of &lt;a href=&quot;https://www.mapbox.com/blog/security-bug-bounty-program/&quot;&gt;launching publicly on HackerOne&lt;/a&gt; and our two year anniversary of running a bug bounty program. In that time, we’ve learned a lot about running a bug bounty program and thought we’d share some best practices we’ve discovered, as well as a recap of the past year.&lt;/p&gt;
1360
-
1361
- &lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/3/2839/33343768590_3de4668b21_b.jpg&quot; alt=&quot;A security researcher hard at work&quot; /&gt;&lt;/p&gt;
1362
-
1363
- &lt;h2 id=&quot;history-of-the-mapbox-bug-bounty-program&quot;&gt;History of the Mapbox bug bounty program&lt;/h2&gt;
1364
-
1365
- &lt;p&gt;We first launched our bug bounty program with a single &lt;a href=&quot;mailto:security@mapbox.com&quot;&gt;security@mapbox.com&lt;/a&gt; inbox in March 2015. That same week we also unveiled &lt;a href=&quot;https://www.mapbox.com/platform/security/&quot;&gt;www.mapbox.com/security&lt;/a&gt;. At first, we managed and triaged reports via email then awarded bounties manually via Paypal. We quickly found this process burdensome and signed up for a private program on &lt;a href=&quot;https://www.hackerone.com&quot;&gt;HackerOne&lt;/a&gt;, a hosted bug bounty service, in March 2015.&lt;/p&gt;
1366
-
1367
- &lt;p&gt;We chose &lt;a href=&quot;https://www.hackerone.com&quot;&gt;HackerOne&lt;/a&gt; as it not only connected us to an existing community of seasoned security researchers but also offered productivity features that automated aspects of the bug bounty triage process. By allowing us to start off with a private program and slowly invite more researchers, HackerOne also made it possible to scale our bug bounty program as we ramped up our security team. After a year as a private program, we reached 100 invited security researchers and decided to go public on March 1st, 2016.&lt;/p&gt;
1368
-
1369
- &lt;h2 id=&quot;the-years-in-numbers&quot;&gt;The years in numbers&lt;/h2&gt;
1370
-
1371
- &lt;p&gt;Last year we &lt;a href=&quot;https://www.mapbox.com/blog/security-bug-bounty-program/&quot;&gt;blogged some metrics&lt;/a&gt; from our first year as a private program. Here’s an update with this year’s (March 1st, 2016-March 1st, 2017) numbers compared to last year’s.&lt;/p&gt;
1372
-
1373
- &lt;table&gt;
1374
- &lt;thead&gt;
1375
- &lt;tr&gt;
1376
- &lt;th&gt;Metric&lt;/th&gt;
1377
- &lt;th&gt;First year (private)&lt;/th&gt;
1378
- &lt;th&gt;Second year (public)&lt;/th&gt;
1379
- &lt;/tr&gt;
1380
- &lt;/thead&gt;
1381
- &lt;tbody&gt;
1382
- &lt;tr&gt;
1383
- &lt;td&gt;Total reports&lt;/td&gt;
1384
- &lt;td&gt;408&lt;/td&gt;
1385
- &lt;td&gt;311&lt;/td&gt;
1386
- &lt;/tr&gt;
1387
- &lt;tr&gt;
1388
- &lt;td&gt;Valid reports&lt;/td&gt;
1389
- &lt;td&gt;46&lt;/td&gt;
1390
- &lt;td&gt;48&lt;/td&gt;
1391
- &lt;/tr&gt;
1392
- &lt;tr&gt;
1393
- &lt;td&gt;Percentage of valid reports&lt;/td&gt;
1394
- &lt;td&gt;11.27%&lt;/td&gt;
1395
- &lt;td&gt;15.43%&lt;/td&gt;
1396
- &lt;/tr&gt;
1397
- &lt;tr&gt;
1398
- &lt;td&gt;Money awarded&lt;/td&gt;
1399
- &lt;td&gt;$22,091&lt;/td&gt;
1400
- &lt;td&gt;$19,800&lt;/td&gt;
1401
- &lt;/tr&gt;
1402
- &lt;tr&gt;
1403
- &lt;td&gt;Average bounty&lt;/td&gt;
1404
- &lt;td&gt;$458&lt;/td&gt;
1405
- &lt;td&gt;$521&lt;/td&gt;
1406
- &lt;/tr&gt;
1407
- &lt;tr&gt;
1408
- &lt;td&gt;Largest bounty&lt;/td&gt;
1409
- &lt;td&gt;$2,000&lt;/td&gt;
1410
- &lt;td&gt;$1,500&lt;/td&gt;
1411
- &lt;/tr&gt;
1412
- &lt;tr&gt;
1413
- &lt;td&gt;Average response time&lt;/td&gt;
1414
- &lt;td&gt;5 days&lt;/td&gt;
1415
- &lt;td&gt;2 days&lt;/td&gt;
1416
- &lt;/tr&gt;
1417
- &lt;tr&gt;
1418
- &lt;td&gt;Average resolution time&lt;/td&gt;
1419
- &lt;td&gt;16 days&lt;/td&gt;
1420
- &lt;td&gt;2 months&lt;/td&gt;
1421
- &lt;/tr&gt;
1422
- &lt;/tbody&gt;
1423
- &lt;/table&gt;
1424
-
1425
- &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
1426
-
1427
- &lt;p&gt;Looking at our numbers over the past two years, we found three trends - reduction in noise, increase in average bounty amount, and decrease in average response time.&lt;/p&gt;
1428
-
1429
- &lt;h2 id=&quot;reducing-noise&quot;&gt;Reducing noise&lt;/h2&gt;
1430
-
1431
- &lt;p&gt;Though we received 97 fewer reports our second year, the proportion of valid reports rose slightly from 11% to 15%. Invalid reports are considered noise, and we have three primary methods of decreasing them:&lt;/p&gt;
1432
-
1433
- &lt;ul&gt;
1434
- &lt;li&gt;a strict minimum &lt;a href=&quot;https://www.hackerone.com/blog/signal-requirements&quot;&gt;signal requirement&lt;/a&gt;&lt;/li&gt;
1435
- &lt;li&gt;our &lt;a href=&quot;https://hackerone.com/mapbox&quot;&gt;HackerOne program page&lt;/a&gt;&lt;/li&gt;
1436
- &lt;li&gt;&lt;a href=&quot;https://support.hackerone.com/hc/en-us/articles/205625015-How-do-I-set-up-a-Common-Response-&quot;&gt;common responses&lt;/a&gt; linked to &lt;a href=&quot;https://support.hackerone.com/hc/en-us/articles/205625005-How-do-I-set-up-a-trigger-&quot;&gt;triggers&lt;/a&gt; with warning dialogues&lt;/li&gt;
1437
- &lt;/ul&gt;
1438
-
1439
- &lt;h3 id=&quot;strict-signal-requirement&quot;&gt;Strict signal requirement&lt;/h3&gt;
1440
-
1441
- &lt;p&gt;Our first line of defense is a &lt;a href=&quot;https://www.hackerone.com/blog/signal-requirements&quot;&gt;strict minimum signal requirement&lt;/a&gt;, a new feature that HackerOne shipped shortly after we first went public. The strict &lt;a href=&quot;https://support.hackerone.com/hc/en-us/articles/207377903-What-are-Signal-and-Impact-&quot;&gt;signal requirement&lt;/a&gt; means that researchers must have 1.0 or greater signal points to submit reports to our program. Researchers who just signed up for HackerOne and haven’t yet built up their reputation and signal are still allowed a few trial reports.&lt;/p&gt;
1442
-
1443
- &lt;p&gt;A strict signal requirement was invaluable in the first month after we went public. It allowed us to spend less time responding to noise and more time triaging and fixing valid reports. Now that our program has matured, we’re considering lowering our signal requirement this year to take advantage of the work of less experienced researchers.&lt;/p&gt;
1444
-
1445
- &lt;h3 id=&quot;detailed-program-page&quot;&gt;Detailed program page&lt;/h3&gt;
1446
-
1447
- &lt;p&gt;In addition to stating our program rules and expectations, we maintain detailed lists of what’s ineligible or out of scope on our &lt;a href=&quot;https://hackerone.com/mapbox&quot;&gt;HackerOne program page&lt;/a&gt;. These lists deter noisy reports and steer researchers towards high-quality eligible reports. We frequently update these lists whenever we receive new issues that are ineligible but not listed. We also don’t penalize researchers who submit ineligible reports that are not already listed on our program page.&lt;/p&gt;
1448
-
1449
- &lt;p&gt;What should go on your list of ineligible issues? Anything that researchers think is a security issue but is actually a feature. You should also add any low priority security issues that generate a lot of duplicate reports and noise but may not be immediately actionable, such as missing security headers. You should &lt;strong&gt;not&lt;/strong&gt; list any known and unresolved security issues that could be actively exploited - instead, a member of your security team should submit a HackerOne report to your own program. If a security researcher reports the same issue, you can then mark it as a duplicate and invite them as a participant to the original report.&lt;/p&gt;
1450
-
1451
- &lt;p&gt;For example, we used to get a lot of reports about HTML and CSS in map markers in &lt;a href=&quot;https://www.mapbox.com/mapbox.js/api/v3.0.1/&quot;&gt;mapbox.js&lt;/a&gt;. &lt;strong&gt;This is actually a feature of mapbox.js!&lt;/strong&gt; We want people to be able to add rich HTML content to their map markers. We don’t want them to be able to add JavaScript to their map markers though, and we use &lt;a href=&quot;https://github.com/mapbox/sanitize-caja&quot;&gt;sanitize-caja&lt;/a&gt; to mitigate this. Reports about the ability to execute JavaScript in mapbox.js map markers &lt;strong&gt;are eligible&lt;/strong&gt; and encouraged (though reports about the newer &lt;a href=&quot;https://www.mapbox.com/mapbox-gl-js/api/&quot;&gt;Mapbox GL JS&lt;/a&gt; library are even more encouraged)! To reduce noise, we added this issue and a brief explanation to our list of ineligible reports and known issues on our &lt;a href=&quot;https://hackerone.com/mapbox&quot;&gt;HackerOne program page&lt;/a&gt;.&lt;/p&gt;
1452
-
1453
- &lt;h3 id=&quot;common-responses-and-triggers&quot;&gt;Common responses and triggers&lt;/h3&gt;
1454
-
1455
- &lt;p&gt;Our final defense against noise - if someone slips through the signal requirement and does not closely read our program page - are numerous &lt;a href=&quot;https://support.hackerone.com/hc/en-us/articles/205625015-How-do-I-set-up-a-Common-Response-&quot;&gt;common responses&lt;/a&gt; linked to &lt;a href=&quot;https://support.hackerone.com/hc/en-us/articles/205625005-How-do-I-set-up-a-trigger-&quot;&gt;triggers&lt;/a&gt;. We have created common responses with triggers for most of the ineligible issues on our program page as well as phrases from common automated reports.&lt;/p&gt;
1456
-
1457
- &lt;p&gt;For example, we have a response that status.mapbox.com is out of scope and that researchers should report those issues to &lt;a href=&quot;https://bugcrowd.com/statuspage&quot;&gt;StatusPage.io’s bug bounty program&lt;/a&gt; instead. We then assign this saved response to a trigger that fires whenever a report contains the text “status.mapbox.com.” This trigger shows a warning dialogue - HackerOne uses the term interstitial - if any researcher tries to submit a report about &lt;a href=&quot;http://status.mapbox.com/&quot;&gt;status.mapbox.com&lt;/a&gt;. Warning the researcher before they submit the report not only saves both parties time and frustration, but also helps the researcher protect their HackerOne reputation, as ineligible reports are marked as N/A after submission and result in a loss of five reputation points.&lt;/p&gt;
1458
-
1459
- &lt;h2 id=&quot;higher-average-bounties&quot;&gt;Higher average bounties&lt;/h2&gt;
1460
-
1461
- &lt;p&gt;Though we paid $2,291 less in total bounties this year, our average bounty increased slightly from $458 to $521. This could be due to a higher quality or severity of reports, or it could be an indication that our security team is feeling more generous.&lt;/p&gt;
1462
-
1463
- &lt;p&gt;HackerOne released a &lt;a href=&quot;https://www.hackerone.com/blog/introducing-severity-cvss&quot;&gt;new severity level feature last October&lt;/a&gt; that uses the CVSS (Common Vulnerability Scoring System) standard. As a result, we don’t have complete data on severity levels for the past year. We also found that researchers tend to overestimate the severity levels of the reports they submit. We’re hoping to adjust or assign severity levels for all 2017 HackerOne reports so that we’ll have a complete data set for March 2017 through March 2018.&lt;/p&gt;
1464
-
1465
- &lt;p&gt;During our first year and for most of our second year, we awarded bounties after issue resolution and confirmation of the fix. Depending on the complexity of the report, this sometimes meant security researchers had to wait a long time between reporting the issue and receiving a bounty. This year we are moving towards awarding a bounty on issue triage. While this means we can accidentally under or over estimate the bounty amount (sometimes you don’t know the true impact of a security report until it’s 100% fixed), we believe the benefits in awarding bounties earlier outweigh the risks. Paying a bounty on triage rather than on fix leads to better researcher engagement and satisfaction within bug bounty programs.&lt;/p&gt;
1466
-
1467
- &lt;h2 id=&quot;improvements-to-response-time&quot;&gt;Improvements to response time&lt;/h2&gt;
1468
-
1469
- &lt;p&gt;We improved our average first response time for reports from 5 days to 2 days in the past year. In the past three months, we’ve been able to decrease our first response time even further down to 19 hours! This decrease is the direct result of the Mapbox security team overhauling our Incident Response Framework (IRF) for how we triage and handle security issues, including HackerOne reports. What we did to improve and overhaul our IRF process is worthy of its own dedicated blog post - expect another blog post about it next month!&lt;/p&gt;
1470
-
1471
- &lt;p&gt;Over the last year, our average resolution time has increased for various reasons, including greater average report complexity and higher average report impact. Our current 2 month resolution time puts us on par with other HackerOne programs like &lt;a href=&quot;https://hackerone.com/github&quot;&gt;GitHub&lt;/a&gt; and &lt;a href=&quot;https://hackerone.com/yelp&quot;&gt;Yelp&lt;/a&gt;. We’re excited to work on improving our average resolution time in the coming months, and we have a few strategies in mind to achieve this. Our switch to rewarding on triage is an immediate way we can strengthen researcher engagement and satisfaction while we work to decrease average resolution time.&lt;/p&gt;
1472
-
1473
- &lt;h2 id=&quot;new-security-bulletins-page&quot;&gt;New security bulletins page&lt;/h2&gt;
1474
-
1475
- &lt;p&gt;We’re also excited to announce our new &lt;a href=&quot;https://www.mapbox.com/security-bulletins/&quot;&gt;Mapbox Security Bulletins&lt;/a&gt; page. We launched this page earlier in March 2017 as part of our security IRF overhaul. We’ll be posting security announcements related to Mapbox software and our platform, including updates on the impact of future third party security incidents like Cloudbleed or Heartbleed.&lt;/p&gt;
1476
-
1477
- &lt;h2 id=&quot;whats-next&quot;&gt;What’s next?&lt;/h2&gt;
1478
-
1479
- &lt;p&gt;Are you a security researcher? Sign up on &lt;a href=&quot;https://hackerone.com/mapbox&quot;&gt;HackerOne&lt;/a&gt; today and start hacking &lt;a href=&quot;https://www.mapbox.com/studio/&quot;&gt;Mapbox Studio&lt;/a&gt;, our &lt;a href=&quot;https://www.mapbox.com/developers/&quot;&gt;SDKs&lt;/a&gt;, our &lt;a href=&quot;https://www.mapbox.com/developers/&quot;&gt;APIs&lt;/a&gt;, and our &lt;a href=&quot;https://www.mapbox.com/&quot;&gt;public website&lt;/a&gt;. We’re particularly interested in security reports related to our SDKs and our APIs.&lt;/p&gt;
1480
-
1481
- &lt;p&gt;Do you run a bug bounty program or are interested in starting one? Connect with me on Twitter at &lt;a href=&quot;https://twitter.com/AlexUlsh&quot;&gt;@AlexUlsh&lt;/a&gt; and I’ll be happy to chat bug bounty programs with you.&lt;/p&gt;
1482
-
1483
- &lt;p&gt;Have more questions about Mapbox security? Read more about &lt;a href=&quot;https://www.mapbox.com/platform/security/&quot;&gt;security at Mapbox&lt;/a&gt;, our &lt;a href=&quot;https://www.mapbox.com/platform/disclosure/&quot;&gt;security vulnerability disclosure process&lt;/a&gt;, and our past &lt;a href=&quot;https://www.mapbox.com/security-bulletins/&quot;&gt;security bulletins&lt;/a&gt;. We’re also &lt;a href=&quot;https://www.mapbox.com/jobs/256538/&quot;&gt;hiring for security positions&lt;/a&gt;!&lt;/p&gt;
1484
- </description>
1485
- <pubDate>Tue, 04 Apr 2017 10:00:00 -0400</pubDate>
1486
- <dc:creator>Alex Ulsh</dc:creator>
1487
- <guid isPermaLink="true">https://www.mapbox.com/blog/hackerone-one-year-public/</guid>
1488
- </item>
1489
- <item>
1490
- <title>Engage your customers on Twitter using location sharing</title>
1491
- <link>https://www.mapbox.com/blog/direct-message-location-with-twitter/</link>
1492
- <description>&lt;p&gt;Today, Twitter launched location sharing in Direct Messages, making it easier for businesses to engage with their customers and provide personalized customer service. Now, businesses on Twitter can privately share and request locations from their customers.&lt;/p&gt;
1493
-
1494
- &lt;p&gt;This means you can lead customers to your closest open store, enable ordering on the go, or quickly resolve customer complaints by identifying the appropriate store.&lt;/p&gt;
1495
-
1496
- &lt;p&gt;On the web, these solutions are all provided on an in-app Mapbox map, enabling seamless conversation with your customer. Twitter’s &lt;a href=&quot;https://www.mapbox.com/studio&quot;&gt;custom maps&lt;/a&gt; leverage &lt;a href=&quot;https://www.mapbox.com/maps/&quot;&gt;Mapbox GL-JS&lt;/a&gt; and &lt;a href=&quot;https://www.mapbox.com/blog/static-styles-with-overlays/&quot;&gt;static overlays&lt;/a&gt;.&lt;/p&gt;
1497
-
1498
- &lt;p&gt;&lt;img src=&quot;https://c2.staticflickr.com/4/3845/32976051004_b9b18e9ebc_o.png&quot; alt=&quot;Direct Message map&quot; /&gt;&lt;/p&gt;
1499
-
1500
- &lt;p&gt;Try out the &lt;a href=&quot;https://blog.twitter.com/2017/businesses-can-now-share-and-request-locations-in-direct-messages&quot;&gt;new beta feature&lt;/a&gt;, and let us know what you think on &lt;a href=&quot;https://twitter.com/mapbox&quot;&gt;Twitter&lt;/a&gt;.&lt;/p&gt;
1501
- </description>
1502
- <pubDate>Mon, 03 Apr 2017 09:00:00 -0400</pubDate>
1503
- <dc:creator>Hannah Judge</dc:creator>
1504
- <guid isPermaLink="true">https://www.mapbox.com/blog/direct-message-location-with-twitter/</guid>
1505
- </item>
1506
- <item>
1507
- <title>Introducing mobile data-driven styling</title>
1508
- <link>https://www.mapbox.com/blog/mobile-data-driven-styling/</link>
1509
- <description>&lt;p&gt;The latest SDKs for &lt;a href=&quot;https://www.mapbox.com/ios-sdk/&quot;&gt;iOS (3.5.0)&lt;/a&gt; and &lt;a href=&quot;https://www.mapbox.com/android-sdk/&quot;&gt;Android (5.0)&lt;/a&gt; introduce data-driven styling, allowing you to style any map feature based on properties in your data.&lt;/p&gt;
1510
-
1511
- &lt;p&gt;Map visualizations on mobile have traditionally required writing custom overlay layers and manually drawing shapes. Now with data-driven styling in Mapbox, you can create extremely powerful and responsive data visualizations with just a few lines of code.&lt;/p&gt;
1512
-
1513
- &lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/3/2949/33558810331_3bf20ee101_h.jpg&quot; alt=&quot;Examples of data driven styling&quot; /&gt;&lt;/p&gt;
1514
-
1515
- &lt;p&gt;Colorize ski trails or cycling workouts based on difficulty or speed. Visualize real estate listings prices or days on the market with circles of varying color and radius. &lt;a href=&quot;https://www.mapbox.com/blog/runtime-styling-release/&quot;&gt;Runtime styling&lt;/a&gt; previously unlocked the ability to customize your maps like never before; data-driven styling takes these dynamic maps one step further, giving you simple ways to create powerful data visualizations.&lt;/p&gt;
1516
-
1517
- &lt;p&gt;Check out this &lt;a href=&quot;https://www.mapbox.com/ios-sdk/api/3.5.0/data-driven-styling.html&quot;&gt;guide to using data-driven styling on iOS&lt;/a&gt; or head over and explore our SDKs for &lt;a href=&quot;https://www.mapbox.com/ios-sdk/&quot;&gt;iOS&lt;/a&gt; and &lt;a href=&quot;https://www.mapbox.com/android-sdk/&quot;&gt;Android&lt;/a&gt;.&lt;/p&gt;
1518
- </description>
1519
- <pubDate>Mon, 03 Apr 2017 05:00:00 -0400</pubDate>
1520
- <dc:creator>Eric Wolfe</dc:creator>
1521
- <guid isPermaLink="true">https://www.mapbox.com/blog/mobile-data-driven-styling/</guid>
1522
- </item>
1523
- <item>
1524
- <title>What&#39;s your favorite place in the world?</title>
1525
- <link>https://www.mapbox.com/blog/mica-map-narratives/</link>
1526
- <description>&lt;p&gt;The space that encircles the planet, through which biological life moves, is often more meaningful than just air, land, and water… &lt;!--more--&gt;&lt;/p&gt;
1527
-
1528
- &lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/3/2874/33301873790_8e635ca1db_c.jpg&quot; /&gt;
1529
- &lt;span class=&quot;caption&quot;&gt;&lt;a href=&quot;https://bl.ocks.org/alcermi/raw/6886fb470c4337ccb638ad9153d023fd/&quot;&gt;Alec Cerminaro&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
1530
-
1531
- &lt;!-- The space that encircles the planet, through which biological life moves, is often more meaningful than just air, land, and water. --&gt;
1532
- &lt;p&gt;Cultural geographers, anthropologists, sociologists, and urban planners study why certain places hold special meaning to particular people or animals. That “sense of place” can be felt in spaces that exude a strong identity and character, which is often experienced deeply by local inhabitants and visitors.&lt;/p&gt;
1533
-
1534
- &lt;p&gt;“Sense of place” is a social phenomenon that exists independently of any one individual’s perceptions or experiences. Yet, it depends on human engagement for its existence. Such a feeling could be derived from the natural environment, but it often consists of a mix of natural and cultural features within the landscape and includes the people and memories that occupy that space.&lt;/p&gt;
1535
-
1536
- &lt;h3 id=&quot;mapping-narratives&quot;&gt;Mapping Narratives&lt;/h3&gt;
1537
-
1538
- &lt;p&gt;Earlier this month, I charged &lt;a href=&quot;https://twitter.com/amyleew/status/839264861796331520&quot;&gt;graphic design students&lt;/a&gt; at the &lt;a href=&quot;https://www.mica.edu/&quot;&gt;Maryland Institute College of Art (MICA)&lt;/a&gt; to think of such a place and then take me there. Their task was simple: in 2 weeks, design a map that exhibits this “sense of place” and tell its unique story through narration and navigation.&lt;/p&gt;
1539
-
1540
- &lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/3/2928/32842989424_6b840ef213_c.jpg&quot; /&gt;&lt;/p&gt;
1541
-
1542
- &lt;p&gt;They moved quickly through the entire process; shifting fluidly through sketches, color choices, and patterns to the design of their maps in &lt;a href=&quot;https://www.mapbox.com/studio/&quot;&gt;Mapbox Studio&lt;/a&gt;.&lt;/p&gt;
1543
-
1544
- &lt;p&gt;&lt;img src=&quot;https://c2.staticflickr.com/4/3767/33685843595_812df5a074_c.jpg&quot; /&gt;&lt;/p&gt;
1545
-
1546
- &lt;p&gt;Alongside the design came the narrative; the story they wanted to tell played a significant role in the map’s aesthetic.&lt;/p&gt;
1547
-
1548
- &lt;div class=&quot;video&quot; style=&quot;padding-bottom:52%;&quot;&gt;
1549
- &lt;iframe src=&quot;https://player.vimeo.com/video/210306629?autoplay=1&amp;amp;loop=1&amp;amp;byline=0&amp;amp;portrait=0&amp;amp;color=ff9933&quot; width=&quot;100%&quot; height=&quot;100%&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; allowfullscreen=&quot;true&quot;&gt;
1550
- &lt;/iframe&gt;
1551
- &lt;/div&gt;
1552
- &lt;p&gt;&lt;span class=&quot;caption&quot; style=&quot;padding-top:20px;&quot;&gt;&lt;a href=&quot;http://bl.ocks.org/tesshavas/raw/da30dfbcd175ccd2791d0fbca8fd2e81/&quot;&gt;Tess Havas&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
1553
-
1554
- &lt;p&gt;Simplicity was key, as they added custom data with the Mapbox dataset editor while concurrently limiting and filtering the &lt;a href=&quot;https://www.mapbox.com/maps/streets/&quot;&gt;Mapbox Streets&lt;/a&gt; data that comes pre-packaged in Studio.&lt;/p&gt;
1555
-
1556
- &lt;div class=&quot;video&quot; style=&quot;padding-bottom:64%;&quot;&gt;
1557
- &lt;iframe src=&quot;https://player.vimeo.com/video/210315649?autoplay=1&amp;amp;loop=1&amp;amp;byline=0&amp;amp;portrait=0&amp;amp;color=ff9933&quot; width=&quot;100%&quot; height=&quot;100%&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; allowfullscreen=&quot;true&quot;&gt;
1558
- &lt;/iframe&gt;
1559
- &lt;/div&gt;
1560
- &lt;p&gt;&lt;span class=&quot;caption&quot; style=&quot;padding-top:20px;&quot;&gt;&lt;a href=&quot;https://bl.ocks.org/cjnielander/raw/2479620041996c1d5adcd13581d86584/&quot;&gt;Conner Nielander&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
1561
-
1562
- &lt;p&gt;In the final project presentations, the students were required to align browser scrolling to the map locations using the &lt;a href=&quot;https://www.mapbox.com/mapbox-gl-js/api/#map#flyto&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;flyTo&lt;/code&gt; function&lt;/a&gt; in Mapbox GL JS. As a basis, they began building their pages with our &lt;a href=&quot;https://www.mapbox.com/mapbox-gl-js/example/scroll-fly-to/&quot;&gt;fly to a location based on scroll position&lt;/a&gt; GL JS example code.&lt;/p&gt;
1563
-
1564
- &lt;div class=&quot;video&quot; style=&quot;padding-bottom:52%;&quot;&gt;
1565
- &lt;iframe src=&quot;https://player.vimeo.com/video/210315636?autoplay=1&amp;amp;loop=1&amp;amp;byline=0&amp;amp;portrait=0&amp;amp;color=ff9933&quot; width=&quot;100%&quot; height=&quot;100%&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; allowfullscreen=&quot;true&quot;&gt;
1566
- &lt;/iframe&gt;
1567
- &lt;/div&gt;
1568
- &lt;p&gt;&lt;span class=&quot;caption&quot; style=&quot;padding-top:20px;&quot;&gt;&lt;a href=&quot;https://bl.ocks.org/ajoslyn1/raw/251f06b6158c7707d3d5cf819e2f46a9/&quot;&gt;Addison Joslyn&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
1569
-
1570
- &lt;p&gt;This allowed students to use JavaScript to illustrate landmarks, locations, and memories by controlling the map’s destinations and specifying the &lt;code class=&quot;highlighter-rouge&quot;&gt;bearing&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;pitch&lt;/code&gt;, and &lt;code class=&quot;highlighter-rouge&quot;&gt;zoom&lt;/code&gt; to alter &lt;a href=&quot;https://www.mapbox.com/mapbox-gl-js/api/#cameraoptions&quot;&gt;camera options&lt;/a&gt; alongside the narrative with Mapbox GL JS.&lt;/p&gt;
1571
-
1572
- &lt;div class=&quot;video&quot; style=&quot;padding-bottom:51%;&quot;&gt;
1573
- &lt;iframe src=&quot;https://player.vimeo.com/video/210315611?autoplay=1&amp;amp;loop=1&amp;amp;byline=0&amp;amp;portrait=0&amp;amp;color=ff9933&quot; width=&quot;100%&quot; height=&quot;100%&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; allowfullscreen=&quot;true&quot;&gt;
1574
- &lt;/iframe&gt;
1575
- &lt;/div&gt;
1576
- &lt;p&gt;&lt;span class=&quot;caption&quot; style=&quot;padding-top:20px;&quot;&gt;&lt;a href=&quot;https://bl.ocks.org/injungchoi/raw/a17130915fa2a1c8746ff228e8b0fc53/&quot;&gt;Injung Choi&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
1577
-
1578
- &lt;h4 id=&quot;now-its-your-turn&quot;&gt;Now it’s your turn!&lt;/h4&gt;
1579
-
1580
- &lt;p&gt;Think of a place you love and tell us the story using the map’s design and Mapbox GL JS. Tag &lt;a href=&quot;https://twitter.com/mapbox&quot;&gt;@mapbox&lt;/a&gt; and use the hashtag #BuiltWithMapbox and we’ll be sure to spotlight our favorites on Twitter!&lt;/p&gt;
1581
- </description>
1582
- <pubDate>Thu, 30 Mar 2017 07:00:00 -0400</pubDate>
1583
- <dc:creator>Amy Lee Walton</dc:creator>
1584
- <guid isPermaLink="true">https://www.mapbox.com/blog/mica-map-narratives/</guid>
1585
- </item>
1586
- <item>
1587
- <title>How we hire at Mapbox</title>
1588
- <link>https://www.mapbox.com/blog/how-we-hire/</link>
1589
- <description>&lt;p&gt;We put a lot of time and energy into recruiting because we think that no aspect of work is more important than the people who surround you. At Mapbox, we look for people who are kind, people who are surprising, people who enjoy their work, and people who are strong in written communications. We don’t focus on diplomas, and we love applicants from non-traditional backgrounds—we have many engineers who didn’t go to college or didn’t get a STEM degree. Prior to Mapbox, &lt;a href=&quot;https://www.mapbox.com/about/team/jordan-kiley/&quot;&gt;Jordan&lt;/a&gt; worked in a theater, &lt;a href=&quot;https://www.mapbox.com/about/team/erin-quinn/&quot;&gt;Erin&lt;/a&gt; ran rafting and climbing trips for a nonprofit’s social enterprise, and &lt;a href=&quot;https://www.mapbox.com/about/team/camilla-mahon/&quot;&gt;Camilla&lt;/a&gt; delivered handcrafted wooden furniture.&lt;/p&gt;
1590
-
1591
- &lt;p&gt;We believe strongly in the value of &lt;a href=&quot;https://www.mapbox.com/jobs/#diversity&quot;&gt;diversity&lt;/a&gt; and have worked hard to build a hiring process we believe gives applicants of all backgrounds an equal chance to succeed. Our process does &lt;strong&gt;not&lt;/strong&gt; revolve around whiteboarding, giving timed coding tests, or asking questions designed to stump applicants—since our daily work doesn’t include these. &lt;strong&gt;We do&lt;/strong&gt; work hard to provide a unique view into what it’s really like to work here.&lt;/p&gt;
1592
-
1593
- &lt;p&gt;While each team customizes the exact hiring process to fit their needs and personality (some prefer video calls instead of phone calls, for example), the following is a good illustration of what you can expect from us as an applicant, using our security engineering team as an example. Once you’ve read through our process, we hope you &lt;a href=&quot;https://www.mapbox.com/jobs/#all-jobs&quot;&gt;apply today&lt;/a&gt;.&lt;/p&gt;
1594
-
1595
- &lt;h3 id=&quot;getting-ready-internally&quot;&gt;Getting ready internally&lt;/h3&gt;
1596
-
1597
- &lt;p&gt;Before starting to hire, the security team identifies a 3-person &lt;code class=&quot;highlighter-rouge&quot;&gt;hiring team&lt;/code&gt; to evaluate candidates and keep their larger team updated. This is not necessarily the most senior three people, but rather a cross-section of the team, and people who enjoy recruiting. At least two members of this hiring team review every application before any decisions are made, and the hiring team is supported throughout by the recruiting team (&lt;em&gt;Hi!&lt;/em&gt;).&lt;/p&gt;
1598
-
1599
- &lt;p&gt;The security team also writes and shares within Mapbox their &lt;code class=&quot;highlighter-rouge&quot;&gt;Growth Strategy&lt;/code&gt;—this includes the rationale for hiring, names the hiring team, and lays out the onboarding plan. We find that asking hiring teams to think about this early helps everyone focus on finding the right candidate to fill the right role. It’s also great transparency for everyone at Mapbox to see what kind of recruiting is happening and why.&lt;/p&gt;
1600
-
1601
- &lt;p&gt;Lastly, we work with each hiring team to scope out outreach we’ll do for each position. We post jobs to our website, of course, but also share our openings on big sites like &lt;a href=&quot;https://www.glassdoor.com/Jobs/Mapbox-Jobs-E870890.htm&quot;&gt;Glassdoor&lt;/a&gt; and reach out to diverse communities via channels like Women Who Code, Lesbians Who Tech, and specific professional communities in our areas.&lt;/p&gt;
1602
-
1603
- &lt;h3 id=&quot;the-application&quot;&gt;The application&lt;/h3&gt;
1604
-
1605
- &lt;p&gt;Job openings for the security team—and most teams here—require applicants to Mapbox to submit both a cover letter and a resume. We &lt;em&gt;really&lt;/em&gt; care about cover letters. We have multiple people read each and every one. We relish reading Mapbox-specific thoughts and value the opportunity to get to know our applicants better. We care about &lt;em&gt;why&lt;/em&gt; you want to work at Mapbox and &lt;em&gt;what&lt;/em&gt; you think you would bring to our team. We rarely choose to interview candidates who submit template cover letters or resumes-in-prose, no matter how much experience they have (and no former employer exempts anyone from this approach). Writing is vital to us because it is so deeply ingrained in how Mapbox functions—we have team members in almost a dozen time zones around the world and communicate much more on &lt;a href=&quot;https://github.com/mapbox&quot;&gt;GitHub&lt;/a&gt; and Slack than by voice.&lt;/p&gt;
1606
-
1607
- &lt;p&gt;You’ll see some variations in our job postings across teams: for engineering job openings, for example, we may request code samples, but please don’t hesitate to apply if you cannot share your code. Because we don’t believe in evaluating engineers’ skills by putting them on the spot, it’s necessary for some positions that we have a chance to see examples of your work. Usually, this means your Github profile. We will do our best to dig through profiles filled with forks, piles of undocumented code, and framework boilerplate. We get most excited about candidates who have taken the time to clearly highlight their best projects, written good documentation and tests for them, checked that installation works, and (when appropriate) included links to working demos. At the same time, we know not everyone can share their work on Github. That’s not a problem, and we are happy to receive any examples of your work, whether that means an uploaded portion of a project you’ve finished, a link to your website, or non-public samples sent directly to us.&lt;/p&gt;
1608
-
1609
- &lt;p&gt;A posting for a sales job might ask for a product pitch or a communications job for a draft e-mail to our users. Our infrastructure engineering team recently posted a job with the following&lt;/p&gt;
1610
-
1611
- &lt;blockquote&gt;
1612
- &lt;p&gt;Extra Points: We’d love to hear a bit about how you built something, whether it’s a node library, a website, or an elaborately engineered birthday cake. Why did you create it the way you did? More importantly, how would you build it differently now based on what you learned?&lt;/p&gt;
1613
- &lt;/blockquote&gt;
1614
-
1615
- &lt;p&gt;Our point is that we’re trying to better understand how you think and how you write, and to give you a wide open canvas to demonstrate this. We don’t want you to do any of these things in the same way that we’re already doing it, either; we’re looking to add people to the team who are thinking differently and who will stretch our collective identity in new directions.&lt;/p&gt;
1616
-
1617
- &lt;h3 id=&quot;the-phone-interview&quot;&gt;The phone interview&lt;/h3&gt;
1618
-
1619
- &lt;p&gt;When the security team determines that an application is strong, they’ll set up a phone call. This first interview is usually about 30 minutes and focuses on why the applicant is interested in Mapbox and what makes the open role exciting to them, as well as some more in-depth conversation about their background, skills, and what they’re looking for in their next job. We always encourage questions and are happy to share what working here is really like. We think this is an appropriate time to ask about benefits, learning and development, and whatever else is on your mind. We know that things like health insurance, maternity and paternity leave, and growth opportunities are very important to you, because they’re very important to us.&lt;/p&gt;
1620
-
1621
- &lt;h3 id=&quot;the-face-to-face-interview&quot;&gt;The face-to-face interview&lt;/h3&gt;
1622
-
1623
- &lt;p&gt;After conducting phone interviews, the security hiring team meets and discusses how the interviews went and which applicant(s) are the best fit for the position. They then set up a longer interview—if the applicant lives near one of our offices, we’ll invite them in—if not, we’ll typically set up a video call. This interview is used to dive deeper into the same topics as the phone interview and to talk about the specific details of the work we’re looking for help with.&lt;/p&gt;
1624
-
1625
- &lt;p&gt;This interview usually takes 1-2 hours depending on the hiring team and specific opening. And to reiterate, our daily work doesn’t entail whiteboarding code, taking time tests, or answering far-fetched theoreticals. Those types of evaluations can be biased against a variety of applicants, and are quite frankly poor indicators of success at Mapbox.&lt;/p&gt;
1626
-
1627
- &lt;h3 id=&quot;the-sprint&quot;&gt;The sprint&lt;/h3&gt;
1628
-
1629
- &lt;p&gt;While many companies would now be ready to make an offer, the final step in our recruiting process for nearly all positions—including those on our security team—is to bring our top candidate into one of our offices to work side-by-side with the team they would join sprinting on a project similar to one they would take on if they were hired. We only &lt;code class=&quot;highlighter-rouge&quot;&gt;sprint&lt;/code&gt; with one candidate at a time, and sprints are designed to confirm that we want to work together, not to choose between candidates.&lt;/p&gt;
1630
-
1631
- &lt;p&gt;This unique recruiting sprint process has proven successful because it gives both our team and the applicant the opportunity to see what it’s &lt;em&gt;really&lt;/em&gt; like to work here. Starting a new job is a huge life change, and we want each candidate to have a crystal-clear view of Mapbox and to be able to determine for themselves if we are or are not a good fit for them, their work style, or their priorities. While we think recruiting sprints are a reason for our success, &lt;strong&gt;we know that asking for full days from an applicant is a lot&lt;/strong&gt;. We balance this by striving to be as flexible as possible, paying a stipend, and only inviting candidates in to sprint who we’re truly excited about working with.&lt;/p&gt;
1632
-
1633
- &lt;p&gt;If you’re invited in to sprint with us during the recruiting process, you should expect:&lt;/p&gt;
1634
-
1635
- &lt;ol&gt;
1636
- &lt;li&gt;To have any travel and lodging booked and paid for by Mapbox, and to receive a stipend for your valuable time.&lt;/li&gt;
1637
- &lt;li&gt;To sign a non-disclosure agreement, so we can be as candid with you as possible.&lt;/li&gt;
1638
- &lt;li&gt;To be given the option to work on Mapbox-provided equipment.&lt;/li&gt;
1639
- &lt;li&gt;To be sent information before your sprint with details of what you will be working on, your schedule, and logistics.&lt;/li&gt;
1640
- &lt;li&gt;To work closely with the hiring manager and members of what would be your team.&lt;/li&gt;
1641
- &lt;li&gt;To be exposed to other parts of Mapbox through conversations with members of other teams, GitHub tickets, Slack, and more.&lt;/li&gt;
1642
- &lt;li&gt;To write up your takeaways (we call this a &lt;code class=&quot;highlighter-rouge&quot;&gt;devlog&lt;/code&gt;) from your sprint, capturing what went well, documenting your thought processes, and sharing what we can do to improve future sprints.&lt;/li&gt;
1643
- &lt;li&gt;To receive a final decision from us within 48 hours after you submit your &lt;code class=&quot;highlighter-rouge&quot;&gt;devlog&lt;/code&gt;.&lt;/li&gt;
1644
- &lt;/ol&gt;
1645
-
1646
- &lt;h3 id=&quot;when-it-doesnt-work-out&quot;&gt;When it doesn’t work out&lt;/h3&gt;
1647
-
1648
- &lt;p&gt;We work hard to get back to all applicants in a timely manner. To us, that means within a few days of an interview or within 3 weeks of receiving an application. Our data currently shows we reply to 84% of applicants, and we’re working to increase that rate.&lt;/p&gt;
1649
-
1650
- &lt;h3 id=&quot;open-to-iteration&quot;&gt;Open to iteration&lt;/h3&gt;
1651
-
1652
- &lt;p&gt;This process has evolved as we’ve learned lots of lessons about recruiting. We want to keep learning and improving—please reach out to &lt;a href=&quot;mailto:nate.perkins@mapbox.com&quot;&gt;Nate&lt;/a&gt; or &lt;a href=&quot;mailto:cathryn@mapbox.com&quot;&gt;Cathryn&lt;/a&gt; with anything you’d like to share or feedback you have. We’ll always link to our latest process-overview blog post from &lt;a href=&quot;https://www.mapbox.com/jobs&quot;&gt;our jobs page&lt;/a&gt;.&lt;/p&gt;
1653
- </description>
1654
- <pubDate>Wed, 22 Mar 2017 06:00:00 -0400</pubDate>
1655
- <dc:creator>Nate Perkins</dc:creator>
1656
- <guid isPermaLink="true">https://www.mapbox.com/blog/how-we-hire/</guid>
1657
- </item>
1658
- <item>
1659
- <title>Helping cities scale with open source</title>
1660
- <link>https://www.mapbox.com/blog/cities-opensource/</link>
1661
- <description>&lt;p&gt;According to &lt;a href=&quot;https://www.uclg.org/sites/default/files/gold_iv_executive_sumary.pdf&quot;&gt;UCLG&lt;/a&gt;, the Global Network of Cities, Local and Regional Governments, there were 503 metropolises and 8923 intermediary cities (above a population of 50,000) globally as of 2015. They expect 70% of the world’s population will be living in urban settlements by 2050, so local governments need to act now to make their cities resilient and more efficient to meet this level of growth.&lt;/p&gt;
1662
-
1663
- &lt;p&gt;&lt;a href=&quot;http://www.mapbox.com/cities&quot;&gt;Mapbox Cities&lt;/a&gt; works with cities to identify today’s urban challenges and build data-driven open source solutions.&lt;/p&gt;
1664
-
1665
- &lt;p&gt;Open source is an important tool to help city governments scale and share learnings and solutions with other cities. Open source offers a platform not only to share between cities, but also for civic innovators and engaged citizens to contribute to their city’s efforts. Local governments can adapt an open source tool to match their needs on a project, such as varying data sources or performance metrics. Collaborating with other cities on open source reduces the overhead cost on the initial development costs for cities each time the tool is replicated.&lt;/p&gt;
1666
-
1667
- &lt;p&gt;Our Mapbox Cities partner &lt;a href=&quot;https://www.mapbox.com/blog/cities-bloomington/&quot;&gt;Bloomington&lt;/a&gt;, Indiana, is a great case study. With just two developers on the IT Services team, they built and continue to maintain several &lt;a href=&quot;https://github.com/City-of-Bloomington&quot;&gt;open source tools&lt;/a&gt;.
1668
- As Rick Dietz, Bloomington’s Director Information &amp;amp; Technology Services explains:&lt;/p&gt;
1669
-
1670
- &lt;blockquote&gt;
1671
- &lt;p&gt;Tens of thousands of government units shouldn’t be paying tens of thousands of times over for the very same software systems doing the very same tasks. City governments aren’t competing with one another. We should be collaborating more through software to meet the collective needs we all share.&lt;/p&gt;
1672
- &lt;/blockquote&gt;
1673
-
1674
- &lt;p&gt;As a result, Bloomington’s 311 tools for civic issue reporting and publishing incident data have been picked up and reused by municipalities across North America and Europe.&lt;/p&gt;
1675
-
1676
- &lt;p&gt;Are you working for local government? Keep an eye out for updates on Mapbox Cities to see what we’re building with our three partner cities, Melbourne, West Midlands Combined Authority in the UK, and Bloomington, Indiana.&lt;/p&gt;
1677
-
1678
- &lt;p&gt;We have more content on open source for the public sector in the first part of our Mapbox Cities handbook. Sign up for &lt;a href=&quot;http://www.mapbox.com/cities&quot;&gt;Mapbox Cities news&lt;/a&gt; to receive it by email later this week.&lt;/p&gt;
1679
- </description>
1680
- <pubDate>Wed, 22 Mar 2017 00:00:00 -0400</pubDate>
1681
- <dc:creator>Christina Franken</dc:creator>
1682
- <guid isPermaLink="true">https://www.mapbox.com/blog/cities-opensource/</guid>
1683
- </item>
1684
- <item>
1685
- <title>New satellite imagery for cities across India</title>
1686
- <link>https://www.mapbox.com/blog/new-india-imagery/</link>
1687
- <description>&lt;p&gt;Cities across India have new imagery on our satellite map today. We’ve updated more than half a dozen major urban areas, with suburbs and highways as well as city centers. Here are a few highlights from more than 100,000 km² (38,000 mi²) of imagery that we’ve just rolled out in India.&lt;/p&gt;
1688
-
1689
- &lt;p&gt;Chennai’s core has green parks, bright blue train stations, several sports stadiums, a busy port, and a beach – all among neighborhoods from several distinct phases of growth:&lt;/p&gt;
1690
-
1691
- &lt;p&gt;&lt;img src=&quot;https://farm3.staticflickr.com/2870/33401360242_b40cab5a7f_b.jpg&quot; alt=&quot;Central Chennai&quot; /&gt;&lt;/p&gt;
1692
-
1693
- &lt;p&gt;There are just as many colors when you zoom in, for example around the historic Zam Bazaar market:&lt;/p&gt;
1694
-
1695
- &lt;p&gt;&lt;img src=&quot;https://farm3.staticflickr.com/2830/33401360572_af1c77150c_b.jpg&quot; alt=&quot;Dense buildings&quot; /&gt;&lt;/p&gt;
1696
-
1697
- &lt;p&gt;On the other side of the country, old cargo ships come from around the world to the town of Alang, where they will be scrapped for steel and parts:&lt;/p&gt;
1698
-
1699
- &lt;p&gt;&lt;img src=&quot;https://farm3.staticflickr.com/2840/33429200441_5bf21ba9e5_b.jpg&quot; alt=&quot;Ships on the beach&quot; /&gt;&lt;/p&gt;
1700
-
1701
- &lt;p&gt;In the interior, near Jaipur, family farms make a semi-regular patchwork:&lt;/p&gt;
1702
-
1703
- &lt;p&gt;&lt;img src=&quot;https://farm4.staticflickr.com/3942/33174771880_07cecf4164_b.jpg&quot; alt=&quot;Patchwork farms&quot; /&gt;&lt;/p&gt;
1704
-
1705
- &lt;p&gt;And far to the south, at the expanding periphery of the Kochi metropolis, we noticed traditional net-fishing boats in the estuary next to a brand new hospital:&lt;/p&gt;
1706
-
1707
- &lt;p&gt;&lt;img src=&quot;https://farm3.staticflickr.com/2807/33429200501_8499575263_b.jpg&quot; alt=&quot;Boats and greenery&quot; /&gt;&lt;/p&gt;
1708
-
1709
- &lt;p&gt;These are a small sample of today’s updates for India, which cover some of the world’s largest and fastest-growing cities. They’re part of a continuing refresh of densely populated areas around the globe, including in &lt;a href=&quot;https://www.mapbox.com/blog/yyz-and-yvr-satellite-update/&quot;&gt;Canada&lt;/a&gt; and &lt;a href=&quot;https://www.mapbox.com/blog/shanghai-imagery-update/&quot;&gt;China&lt;/a&gt;. Follow along to see more (including more in India), and if you have questions, &lt;a href=&quot;https://twitter.com/vruba&quot;&gt;just ask&lt;/a&gt;.&lt;/p&gt;
1710
- </description>
1711
- <pubDate>Mon, 20 Mar 2017 14:00:00 -0400</pubDate>
1712
- <dc:creator>Charlie Loyd</dc:creator>
1713
- <guid isPermaLink="true">https://www.mapbox.com/blog/new-india-imagery/</guid>
1714
- </item>
1715
- <item>
1716
- <title>154 printed maps for the villages of Surabaya, Indonesia</title>
1717
- <link>https://www.mapbox.com/blog/sharing-printed-maps/</link>
1718
- <description>&lt;p&gt;When an emergency strikes, responders need maps in every form available: on the web, mobile, and especially pinned to their walls.&lt;/p&gt;
1719
-
1720
- &lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/1/608/32662352763_6a36d076a4_b.jpg&quot; alt=&quot;Three people holding printed maps&quot; /&gt;&lt;/p&gt;
1721
-
1722
- &lt;p&gt;&lt;em&gt;Images courtesy Humanitarian OpenStreetMap Team&lt;/em&gt;&lt;/p&gt;
1723
-
1724
- &lt;p&gt;We recently shared &lt;a href=&quot;https://www.mapbox.com/blog/jakarta-flooding-map/&quot;&gt;PetaBencana.id&lt;/a&gt;, a sophisticated tool that aggregates and analyzes social media to produce real-time flood conditions for disaster managers in Indonesia. That system depends on data collected by the Humanitarian OpenStreetMap Team (HOT). HOT worked closely with the local government and community to collect comprehensive geospatial base data for disaster risk including administrative boundaries, building footprints, road networks, and disaster vulnerability characteristics.&lt;/p&gt;
1725
-
1726
- &lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/3/2852/32662352503_c286412ef8_b.jpg&quot; alt=&quot;Two men holding map&quot; /&gt;&lt;/p&gt;
1727
-
1728
- &lt;p&gt;Over the last month, HOT presented &lt;a href=&quot;https://www.mapbox.com/help/print-policy/&quot;&gt;printed posters using Mapbox&lt;/a&gt; with the newly mapped villages to 154 leaders of Surabaya as a thank you for their support. For much of the world, a printed map is still “a real map,” and the most useful way to access data.&lt;/p&gt;
1729
-
1730
- &lt;p&gt;&lt;img src=&quot;https://c2.staticflickr.com/4/3752/32662352413_d71052fc9b_b.jpg&quot; alt=&quot;Group holding maps and smiling&quot; /&gt;&lt;/p&gt;
1731
-
1732
- &lt;p&gt;Interested in getting printed Mapbox maps into the hands of responders and development workers? Get in touch with through &lt;a href=&quot;https://www.mapbox.com/humanitarian/&quot;&gt;our Humanitarian programs&lt;/a&gt; for more details.&lt;/p&gt;
1733
- </description>
1734
- <pubDate>Fri, 17 Mar 2017 06:00:00 -0400</pubDate>
1735
- <dc:creator>Mikel Maron</dc:creator>
1736
- <guid isPermaLink="true">https://www.mapbox.com/blog/sharing-printed-maps/</guid>
1737
- </item>
1738
- <item>
1739
- <title>Testing directions with ASCII art</title>
1740
- <link>https://www.mapbox.com/blog/testing-directions-with-ascii-art/</link>
1741
- <description>&lt;p&gt;Classifying maneuvers is one of the most important things that our &lt;a href=&quot;https://www.mapbox.com/directions/&quot;&gt;Directions API&lt;/a&gt; does for developers &lt;a href=&quot;https://www.mapbox.com/blog/open-source-mapbox-navigation-swift/&quot;&gt;building apps with turn-by-turn navigation&lt;/a&gt;. When you’re driving, it’s what determines the difference between a &lt;code class=&quot;highlighter-rouge&quot;&gt;turn right&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;turn slightly right&lt;/code&gt;, and &lt;code class=&quot;highlighter-rouge&quot;&gt;keep right&lt;/code&gt;, for example. Classifying maneuvers is complex because there are virtually endless possibilities for each intersection we must handle - the world is full of very odd intersections. When we encounter a problematic intersection, we capture its characteristics in an automated test to make sure the way we handle the intersection doesn’t break in the future.&lt;/p&gt;
1742
-
1743
- &lt;p&gt;But, here’s the next challenge - how do we quickly create test data for all of these special cases? &lt;a href=&quot;http://project-osrm.org/&quot;&gt;OSRM&lt;/a&gt; (the software that powers our Directions API behind the scenes) reads data in OpenStreetMap format, so we use a tool that translates ASCII art of an intersection to a valid OpenStreetMap extract, then push the data for that scenario through the entire engine to make sure it behaves correctly.&lt;/p&gt;
1744
-
1745
- &lt;p&gt;&lt;img src=&quot;https://i.imgur.com/ml67rQJ.gif&quot; alt=&quot;ASCII art in tests!&quot; /&gt;&lt;/p&gt;
1746
-
1747
- &lt;p&gt;In our ASCII test definitions, letters &lt;code class=&quot;highlighter-rouge&quot;&gt;a-z&lt;/code&gt; identify OSM nodes to be generated and all other characters provide a visual aide to help developers understand the scenario being tested.&lt;/p&gt;
1748
-
1749
- &lt;p&gt;Our scenarios range from simple intersections:&lt;/p&gt;
1750
-
1751
- &lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; l m
1752
- | |
1753
- | |
1754
- _ _ g---h_
1755
- f&#39; | | &#39;_
1756
- | | i
1757
- | |
1758
- _ _b---c__
1759
- a&#39; | | &#39;d
1760
- | |
1761
- j k
1762
- &lt;/code&gt;&lt;/pre&gt;
1763
- &lt;/div&gt;
1764
-
1765
- &lt;p&gt;to more complex ones:&lt;/p&gt;
1766
-
1767
- &lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; e
1768
- a - b - - c - d
1769
- &#39;f|l&#39;
1770
- m
1771
- g
1772
- |
1773
- .h-_
1774
- k - i |
1775
- &#39;.j.&#39;
1776
- &lt;/code&gt;&lt;/pre&gt;
1777
- &lt;/div&gt;
1778
-
1779
- &lt;p&gt;and even extremely complex situations like &lt;a href=&quot;http://www.openstreetmap.org/#map=19/52.48778/13.30024&quot;&gt;this bridge in Berlin&lt;/a&gt;:&lt;/p&gt;
1780
-
1781
- &lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; q s
1782
- p o
1783
- .. ..
1784
- . . . .
1785
- j - i - - - h - - - g - f
1786
- &amp;gt; k &amp;lt; &amp;gt; l &amp;lt;
1787
- a - b - - - c - - - d - e
1788
- . . . .
1789
- .. ..
1790
- m n
1791
- t r
1792
- &lt;/code&gt;&lt;/pre&gt;
1793
- &lt;/div&gt;
1794
-
1795
- &lt;p&gt;This must be what it’s like playing hopscotch in The Simpsons.&lt;/p&gt;
1796
-
1797
- &lt;p&gt;&lt;img src=&quot;https://i.imgur.com/TpolAPf.gif&quot; alt=&quot;Simpsons hopscotch&quot; /&gt;&lt;/p&gt;
1798
-
1799
- &lt;p&gt;The tools in their current form were made possible by OSRM contributor &lt;a href=&quot;https://github.com/emiltin&quot;&gt;@emiltin&lt;/a&gt;, creator of &lt;a href=&quot;http://www.ibikecph.dk/&quot;&gt;I Bike CPH&lt;/a&gt;.&lt;/p&gt;
1800
-
1801
- &lt;p&gt;Our guidance test suite already covers 458 scenarios and spans 13,139 lines of ASCII definitions. This growing set of scenarios ensures that our turn-by-turn instructions improve as we discover more special cases.&lt;/p&gt;
1802
-
1803
- &lt;p&gt;Sometimes you can nearly feel the waves:&lt;/p&gt;
1804
-
1805
- &lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;j----a---c---b----k
1806
- ~ ~ ~
1807
- ~ ~ ~
1808
- ~~~
1809
- d
1810
- ~
1811
- ~
1812
- ~
1813
- e --- f
1814
- &lt;/code&gt;&lt;/pre&gt;
1815
- &lt;/div&gt;
1816
- &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
1817
-
1818
- &lt;p&gt;&lt;img src=&quot;https://i.imgur.com/mbhplWz.gif&quot; alt=&quot;Pizza floating on a wave&quot; /&gt;&lt;/p&gt;
1819
- </description>
1820
- <pubDate>Tue, 14 Mar 2017 08:00:00 -0400</pubDate>
1821
- <dc:creator>Moritz Kobitzsch</dc:creator>
1822
- <guid isPermaLink="true">https://www.mapbox.com/blog/testing-directions-with-ascii-art/</guid>
1823
- </item>
1824
- <item>
1825
- <title>Say hello to our new team members!</title>
1826
- <link>https://www.mapbox.com/blog/welcome-031017/</link>
1827
- <description>&lt;p&gt;We’re happy to introduce four new team members here at Mapbox! Read on to meet Theresa, Bob, Andy, and Baran, and discover what they’ll be working on.&lt;/p&gt;
1828
-
1829
- &lt;h2 id=&quot;theresa-bower---accounting&quot;&gt;Theresa Bower - Accounting&lt;/h2&gt;
1830
-
1831
- &lt;p&gt;&lt;img src=&quot;https://c2.staticflickr.com/4/3823/32549079823_ef3849dc44.jpg&quot; alt=&quot;Theresa&quot; /&gt;&lt;/p&gt;
1832
-
1833
- &lt;p&gt;&lt;a href=&quot;https://www.mapbox.com/about/team/theresa-bower/&quot;&gt;Theresa&lt;/a&gt; is responsible for all things accounting at Mapbox. From revenue to COGS to technical accounting memos, she makes sure our global financial statements are accurate and auditable.&lt;/p&gt;
1834
-
1835
- &lt;p&gt;Theresa joins our DC office from Matchbox Food Group, where she was the Vice President &amp;amp; Controller responsible for overseeing the accounting and financial reporting teams. She graduated from Elmira College with a bachelor’s degree in Accounting and is a Certified Public Accountant.&lt;/p&gt;
1836
-
1837
- &lt;h2 id=&quot;bob-lannon---geocoding&quot;&gt;Bob Lannon - Geocoding&lt;/h2&gt;
1838
-
1839
- &lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/3/2910/33307178206_a5b1431d4f.jpg&quot; alt=&quot;Bob&quot; /&gt;&lt;/p&gt;
1840
-
1841
- &lt;p&gt;&lt;a href=&quot;https://www.mapbox.com/about/team/bob-lannon/&quot;&gt;Bob&lt;/a&gt; is joining the Geocoding team, working from Philadelphia. With a background in Natural Language Processing, he’s looking forward to improving our multilingual capabilities.&lt;/p&gt;
1842
-
1843
- &lt;p&gt;Prior to joining Mapbox, Bob worked at the Philly startup Picwell where he helped build a recommendation engine for personal health insurance plans. He also worked for the Sunlight Foundation, where he tracked data related to political influence. He has a master’s degree in Linguistics from the University of Pennsylvania. In his spare time, Bob likes hanging out with his family, pursuing hare-brained personal projects, and listening to every podcast.&lt;/p&gt;
1844
-
1845
- &lt;h2 id=&quot;andy-mcgavern---operations&quot;&gt;Andy McGavern - Operations&lt;/h2&gt;
1846
- &lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/1/645/33324888426_21ea8ba3ce.jpg&quot; alt=&quot;Andy&quot; /&gt;&lt;/p&gt;
1847
-
1848
- &lt;p&gt;&lt;a href=&quot;https://www.mapbox.com/about/team/andy-mcgavern/#operations&quot;&gt;Andy&lt;/a&gt; will be managing logistics and special projects for our CEO Eric, touching all parts of Mapbox and helping the company move at full speed. He also supports operations in the San Francisco office.&lt;/p&gt;
1849
-
1850
- &lt;p&gt;Andy spent the last three years serving in the Obama White House, most recently as the Associate Director of the White House Fellows Program. He’s also worked at the Clinton Global Initiative, the Office of Governor Deval Patrick, and the Massachusetts Nonprofit Network. In his spare time he enjoys eating out, making new friends, and gallivanting in the Castro.&lt;/p&gt;
1851
-
1852
- &lt;h2 id=&quot;baran-kahyaoglu---games&quot;&gt;Baran Kahyaoglu - Games&lt;/h2&gt;
1853
-
1854
- &lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/1/611/32549080063_ae1a29feed.jpg&quot; alt=&quot;Baran&quot; /&gt;&lt;/p&gt;
1855
-
1856
- &lt;p&gt;&lt;a href=&quot;https://www.mapbox.com/about/team/baran-kahyaoglu/&quot;&gt;Baran&lt;/a&gt; is on our Games team, working from Ankara, Turkey. He’s helping us build the foundation of our Mapbox Unity SDK.&lt;/p&gt;
1857
-
1858
- &lt;p&gt;Prior to joining Mapbox, Baran developed training simulations for the military, air rescue, and firefighting teams with Unity3D. Baran has a bachelor’s degree in Computer Science.&lt;/p&gt;
1859
- </description>
1860
- <pubDate>Fri, 10 Mar 2017 11:00:00 -0500</pubDate>
1861
- <dc:creator>Cathryn Stickel</dc:creator>
1862
- <guid isPermaLink="true">https://www.mapbox.com/blog/welcome-031017/</guid>
1863
- </item>
1864
- <item>
1865
- <title>Discover events at SXSW with IBM</title>
1866
- <link>https://www.mapbox.com/blog/discover-sxsw-with-ibm/</link>
1867
- <description>&lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/1/759/32551787793_ceea2fc644_b.jpg&quot; alt=&quot;IBM Mapbox Booth&quot; /&gt;&lt;/p&gt;
1868
-
1869
- &lt;p&gt;This week at &lt;a href=&quot;https://www.sxsw.com/schedule/&quot;&gt;SXSW in Austin, Texas&lt;/a&gt;, use IBM’s cognitive event finder to discover cool events tailored to your interests and location.&lt;/p&gt;
1870
-
1871
- &lt;p&gt;The application combines the power of multiple IBM Cloud services including &lt;a href=&quot;https://www.ibm.com/watson/developercloud/conversation.html&quot;&gt;Watson Conversation&lt;/a&gt;, &lt;a href=&quot;https://docs.cloudant.com/search.html&quot;&gt;Cloudant search&lt;/a&gt;, and &lt;a href=&quot;https://www.mapbox.com/maps/&quot;&gt;Mapbox Maps&lt;/a&gt; to help you discover events that are happening soon, near your location, and matching your interests.&lt;/p&gt;
1872
-
1873
- &lt;p&gt;&lt;img src=&quot;https://i.imgur.com/sIdK0Zs.gif&quot; alt=&quot;App Gif&quot; /&gt;&lt;/p&gt;
1874
-
1875
- &lt;p&gt;Say hi to &lt;a href=&quot;http://www.ibm.com/design/sxsw/&quot;&gt;IBM at SXSW&lt;/a&gt; this week in Brazos Hall, and try out the &lt;a href=&quot;https://cognitive-event-finder.mybluemix.net&quot;&gt;IBM Cognitive Event Finder&lt;/a&gt; app! Let us know what new events you discover at SXSW on &lt;a href=&quot;https://twitter.com/mapbox&quot;&gt;Twitter&lt;/a&gt;.&lt;/p&gt;
1876
- </description>
1877
- <pubDate>Fri, 10 Mar 2017 10:00:00 -0500</pubDate>
1878
- <dc:creator>Ryan Baumann</dc:creator>
1879
- <guid isPermaLink="true">https://www.mapbox.com/blog/discover-sxsw-with-ibm/</guid>
1880
- </item>
1881
-
1882
- </channel>
1883
- </rss>