v Markdown Comes Alive! Part 1, Basic Editor By feedproxy.google.com Published On :: Wed, 26 Feb 2020 08:00:00 -0500 In my last post, I covered what LiveView is at a high level. In this series, we’re going to dive deeper and implement a LiveView powered Markdown editor called Frampton. This series assumes you have some familiarity with Phoenix and Elixir, including having them set up locally. Check out Elizabeth’s three-part series on getting started with Phoenix for a refresher. This series has a companion repository published on GitHub. Get started by cloning it down and switching to the starter branch. You can see the completed application on master. Our goal today is to make a Markdown editor, which allows a user to enter Markdown text on a page and see it rendered as HTML next to it in real-time. We’ll make use of LiveView for the interaction and the Earmark package for rendering Markdown. The starter branch provides some styles and installs LiveView. Rendering Markdown Let’s set aside the LiveView portion and start with our data structures and the functions that operate on them. To begin, a Post will have a body, which holds the rendered HTML string, and title. A string of markdown can be turned into HTML by calling Post.render(post, markdown). I think that just about covers it! First, let’s define our struct in lib/frampton/post.ex: defmodule Frampton.Post do defstruct body: "", title: "" def render(%__MODULE{} = post, markdown) do # Fill me in! end end Now the failing test (in test/frampton/post_test.exs): describe "render/2" do test "returns our post with the body set" do markdown = "# Hello world!" assert Post.render(%Post{}, markdown) == {:ok, %Post{body: "<h1>Hello World</h1> "}} end end Our render method will just be a wrapper around Earmark.as_html!/2 that puts the result into the body of the post. Add {:earmark, "~> 1.4.3"} to your deps in mix.exs, run mix deps.get and fill out render function: def render(%__MODULE{} = post, markdown) do html = Earmark.as_html!(markdown) {:ok, Map.put(post, :body, html)} end Our test should now pass, and we can render posts! [Note: we’re using the as_html! method, which prints error messages instead of passing them back to the user. A smarter version of this would handle any errors and show them to the user. I leave that as an exercise for the reader…] Time to play around with this in an IEx prompt (run iex -S mix in your terminal): iex(1)> alias Frampton.Post Frampton.Post iex(2)> post = %Post{} %Frampton.Post{body: "", title: ""} iex(3)> {:ok, updated_post} = Post.render(post, "# Hello world!") {:ok, %Frampton.Post{body: "<h1>Hello world!</h1> ", title: ""}} iex(4)> updated_post %Frampton.Post{body: "<h1>Hello world!</h1> ", title: ""} Great! That’s exactly what we’d expect. You can find the final code for this in the render_post branch. LiveView Editor Now for the fun part: Editing this live! First, we’ll need a route for the editor to live at: /editor sounds good to me. LiveViews can be rendered from a controller, or directly in the router. We don’t have any initial state, so let's go straight from a router. First, let's put up a minimal test. In test/frampton_web/live/editor_live_test.exs: defmodule FramptonWeb.EditorLiveTest do use FramptonWeb.ConnCase import Phoenix.LiveViewTest test "the editor renders" do conn = get(build_conn(), "/editor") assert html_response(conn, 200) =~ "data-test="editor"" end end This test doesn’t do much yet, but notice that it isn’t live view specific. Our first render is just the same as any other controller test we’d write. The page’s content is there right from the beginning, without the need to parse JavaScript or make API calls back to the server. Nice. To make that test pass, add a route to lib/frampton_web/router.ex. First, we import the LiveView code, then we render our Editor: import Phoenix.LiveView.Router # … Code skipped ... # Inside of `scope "/"`: live "/editor", EditorLive Now place a minimal EditorLive module, in lib/frampton_web/live/editor_live.ex: defmodule FramptonWeb.EditorLive do use Phoenix.LiveView def render(assigns) do ~L""" <div data-test=”editor”> <h1>Hello world!</h1> </div> """ end def mount(_params, _session, socket) do {:ok, socket} end end And we have a passing test suite! The ~L sigil designates that LiveView should track changes to the content inside. We could keep all of our markup in this render/1 method, but let’s break it out into its own template for demonstration purposes. Move the contents of render into lib/frampton_web/templates/editor/show.html.leex, and replace EditorLive.render/1 with this one liner: def render(assigns), do: FramptonWeb.EditorView.render("show.html", assigns). And finally, make an EditorView module in lib/frampton_web/views/editor_view.ex: defmodule FramptonWeb.EditorView do use FramptonWeb, :view import Phoenix.LiveView end Our test should now be passing, and we’ve got a nicely separated out template, view and “live” server. We can keep markup in the template, helper functions in the view, and reactive code on the server. Now let’s move forward to actually render some posts! Handling User Input We’ve got four tasks to accomplish before we are done: Take markdown input from the textarea Send that input to the LiveServer Turn that raw markdown into HTML Return the rendered HTML to the page. Event binding To start with, we need to annotate our textarea with an event binding. This tells the liveview.js framework to forward DOM events to the server, using our liveview channel. Open up lib/frampton_web/templates/editor/show.html.leex and annotate our textarea: <textarea phx-keyup="render_post"></textarea> This names the event (render_post) and sends it on each keyup. Let’s crack open our web inspector and look at the web socket traffic. Using Chrome, open the developer tools, navigate to the network tab and click WS. In development you’ll see two socket connections: one is Phoenix LiveReload, which polls your filesystem and reloads pages appropriately. The second one is our LiveView connection. If you let it sit for a while, you’ll see that it's emitting a “heartbeat” call. If your server is running, you’ll see that it responds with an “ok” message. This lets LiveView clients know when they've lost connection to the server and respond appropriately. Now, type some text and watch as it sends down each keystroke. However, you’ll also notice that the server responds with a “phx_error” message and wipes out our entered text. That's because our server doesn’t know how to handle the event yet and is throwing an error. Let's fix that next. Event handling We’ll catch the event in our EditorLive module. The LiveView behavior defines a handle_event/3 callback that we need to implement. Open up lib/frampton_web/live/editor_live.ex and key in a basic implementation that lets us catch events: def handle_event("render_post", params, socket) do IO.inspect(params) {:noreply, socket} end The first argument is the name we gave to our event in the template, the second is the data from that event, and finally the socket we’re currently talking through. Give it a try, typing in a few characters. Look at your running server and you should see a stream of events that look something like this: There’s our keystrokes! Next, let’s pull out that value and use it to render HTML. Rendering Markdown Lets adjust our handle_event to pattern match out the value of the textarea: def handle_event("render_post", %{"value" => raw}, socket) do Now that we’ve got the raw markdown string, turning it into HTML is easy thanks to the work we did earlier in our Post module. Fill out the body of the function like this: {:ok, post} = Post.render(%Post{}, raw) IO.inspect(post) If you type into the textarea you should see output that looks something like this: Perfect! Lastly, it’s time to send that rendered html back to the page. Returning HTML to the page In a LiveView template, we can identify bits of dynamic data that will change over time. When they change, LiveView will compare what has changed and send over a diff. In our case, the dynamic content is the post body. Open up show.html.leex again and modify it like so: <div class="rendered-output"> <%= @post.body %> </div> Refresh the page and see: Whoops! The @post variable will only be available after we put it into the socket’s assigns. Let’s initialize it with a blank post. Open editor_live.ex and modify our mount/3 function: def mount(_params, _session, socket) do post = %Post{} {:ok, assign(socket, post: post)} end In the future, we could retrieve this from some kind of storage, but for now, let's just create a new one each time the page refreshes. Finally, we need to update the Post struct with user input. Update our event handler like this: def handle_event("render_post", %{"value" => raw}, %{assigns: %{post: post}} = socket) do {:ok, post} = Post.render(post, raw) {:noreply, assign(socket, post: post) end Let's load up http://localhost:4000/editor and see it in action. Nope, that's not quite right! Phoenix won’t render this as HTML because it’s unsafe user input. We can get around this (very good and useful) security feature by wrapping our content in a raw/1 call. We don’t have a database and user processes are isolated from each other by Elixir. The worst thing a malicious user could do would be crash their own session, which doesn’t bother me one bit. Check the edit_posts branch for the final version. Conclusion That’s a good place to stop for today. We’ve accomplished a lot! We’ve got a dynamically rendering editor that takes user input, processes it and updates the page. And we haven’t written any JavaScript, which means we don’t have to maintain or update any JavaScript. Our server code is built on the rock-solid foundation of the BEAM virtual machine, giving us a great deal of confidence in its reliability and resilience. In the next post, we’ll tackle making a shared editor, allowing multiple users to edit the same post. This project will highlight Elixir’s concurrency capabilities and demonstrate how LiveView builds on them to enable some incredible user experiences. Full Article Code Back-end Engineering
v Why's it so hard to get the cool stuff approved? By feedproxy.google.com Published On :: Thu, 27 Feb 2020 00:00:00 -0500 The classic adage is “good design speaks for itself.” Which would mean that if something’s as good of an idea as you think it is, a client will instantly see that it’s good too, right? Here at Viget, we’re always working with new and different clients. Each with their own challenges and sensibilities. But after ten years of client work, I can’t help but notice a pattern emerge when we’re trying to get approval on especially cool, unconventional parts of a design. So let’s break down some of those patterns to hopefully better understand why clients hesitate, and what strategies we’ve been using lately to help get the work we’re excited about approved.Imagine this: the parallax homepage with elements that move around in surprising ways or a unique navigation menu that conceptually reinforces a site’s message. The way the content cards on a page will, like, be literal cards that will shuffle and move around. Basically, any design that feels like an exciting, novel challenge, will need the client to “get it.” And that often turns out to be the biggest challenge of all. There are plenty of practical reasons cool designs get shot down. A client is usually more than one stakeholder, and more than the team of people you’re working with directly. On any project, there’s an amount of telephone you end up playing. Or, there’s always the classic foes: budgets and deadlines. Any idea should fit in those predetermined constraints. But as a project goes along, budgets and deadlines find a way to get tighter than you planned. But innovative designs and interactions can seem especially scary for clients to approve. There’s three fears that often pop up on projects:The fear of change. Maybe the client expected something simple, a light refresh. Something that doesn’t challenge their design expectations or require more time and effort to understand. And on our side, maybe we didn’t sufficiently ease them into our way of thinking and open them up to why we think something bigger and bolder is the right solution for them. Baby steps, y’all. The fear of the unknown. Or, less dramatically, a lack of understanding of the medium. In the past, we have struggled with how to present an interactive, animated design to a client before it’s actually built. Looking at a site that does something conceptually similar as an example can be tough. It’s asking a lot of a client’s imagination to show them a site about boots that has a cool spinning animation and get meaningful feedback about how a spinning animation would work on their site about after-school tutoring. Or maybe we’ve created static designs, then talked around what we envision happening. Again, what seems so clear in our minds as professionals entrenched in this stuff every day can be tough for someone outside the tech world to clearly understand. The fear of losing control. We’re all about learning from past mistakes. So lets say, after dealing with that fear of the unknown on a project, next time you go in the opposite direction. You invest time up front creating something polished. Maybe you even get the developer to build a prototype that moves and looks like the real thing. You’ve taken all the vague mystery out of the process, so a client will be thrilled, right? Surprise, probably not! Most clients are working with you because they want to conquer the noble quest that is their redesign together. When we jump straight to showing something that looks polished, even if it’s not really, it can feel like we jumped ahead without keeping them involved. Like we took away their input. They can also feel demotivated to give good, meaningful feedback on a polished prototype because it looks “done.”So what to do? Lately we have found low-fidelity prototypes to be a great tool for combating these fears and better communicating our ideas. What are low-fidelity prototypes?Low fidelity prototypes are a tool that designers can create quickly to illustrate an idea, without sinking time into making it pixel-perfect. Some recent examples of prototypes we've created include a clickable Figma or Invision prototype put together with Whimsical wireframes: A rough animation created in Principle illustrating less programatic animation: And even creating an animated storyboard in Photoshop: They’re rough enough that there’s no way they could be confused for a final product. But customized so that a client can immediately understand what they’re looking at and what they need to respond to. Low-fidelity prototypes hit a sweet spot that addresses those client fears head on. That fear of change? A lo-fi prototype starts rough and small, so it can ease a client into a dramatic change without overwhelming them. It’s just a first step. It gives them time to react and warm up to something that’ll ultimately be a big change.It also cuts out the fear of the unknown. Seeing something moving around, even if it’s rough, can be so much more clear than talking ourselves in circles about how we think it will move, and hoping the client can imagine it. The feature is no longer an enigma cloaked in mystery and big talk, but something tangible they can point at and ask concrete questions about.And finally, a lo-fi prototype doesn’t threaten a client’s sense of control. Low-fidelity means it’s clearly still a work in progress! It’s just an early step in the creative process, and therefore communicates that we’re still in the middle of that process together. There’s still plenty of room for their ideas and feedback. Lo-fi prototypes: client-tested, internal team-approvedThere are a lot of reasons to love lo-fi prototypes internally, too! They’re quick and easy. We can whip up multiple ideas within a few hours, without sinking the time into getting our hearts set on any one thing. In an agency setting especially, time is limited, so the faster we can get an idea out of our own heads, the better.They’re great to share with developers. Ideally, the whole team is working together simultaneously, collaborating every step of the way. Realistically, a developer often doesn’t have time during a project’s early design phase. Lo-fi prototypes are concrete enough that a developer can quickly tell if building an idea will be within scope. It helps us catch impractical ideas early and helps us all collaborate to create something that’s both cool and feasible. Stay tuned for posts in the near future diving into some of our favorite processes for creating lo-fi prototypes! Full Article Design & Content
v TrailBuddy: Using AI to Create a Predictive Trail Conditions App By feedproxy.google.com Published On :: Thu, 19 Mar 2020 08:00:00 -0400 Viget is full of outdoor enthusiasts and, of course, technologists. For this year's Pointless Weekend, we brought these passions together to build TrailBuddy. This app aims to solve that eternal question: Is my favorite trail dry so I can go hike/run/ride? While getting muddy might rekindle fond childhood memories for some, exposing your gear to the elements isn’t great – it’s bad for your equipment and can cause long-term, and potentially expensive, damage to the trail. There are some trail apps out there but we wanted one that would focus on current conditions. Currently, our favorites trail apps, like mtbproject.com, trailrunproject.com, and hikingproject.com -- all owned by REI, rely on user-reported conditions. While this can be effective, the reports are frequently unreliable, as condition reports can become outdated in just a few days. Our goal was to solve this problem by building an app that brought together location, soil type, and weather history data to create on-demand condition predictions for any trail in the US. We built an initial version of TrailBuddy by tapping into several readily-available APIs, then running the combined data through a machine learning algorithm. (Oh, and also by bringing together a bunch of smart and motivated people and combining them with pizza and some of the magic that is our Pointless Weekends. We'll share the other Pointless Project, Scurry, with you soon.) Learn More We're hiring Front-End Developers in our Boulder, Chattanooga, Durham, Falls Church and Remote (U.S. Only) offices. Learn more and introduce yourself. The quest for data. We knew from the start this app would require data from a number of sources. As previously mentioned, we used REI’s APIs (i.e. https://www.hikingproject.com/data) as the source for basic trail information. We used the trails’ latitude and longitude coordinates as well as its elevation to query weather and soil type. We also found data points such as a trail’s total distance to be relevant to our app users and decided to include that on the front-end, too. Since we wanted to go beyond relying solely on user-reported metrics, which is how REI’s current MTB project works, we came up with a list of factors that could affect the trail for that day. First on that list was weather. We not only considered the impacts of the current forecast, but we also looked at the previous day’s forecast. For example, it’s safe to assume that if it’s currently raining or had been raining over the last several days, it would likely lead to muddy and unfavorable conditions for that trail. We utilized the DarkSky API (https://darksky.net/dev) to get the weather forecasts for that day, as well as the records for previous days. This included expected information, like temperature and precipitation chance. It also included some interesting data points that we realized may be factors, like precipitation intensity, cloud cover, and UV index. But weather alone can’t predict how muddy or dry a trail will be. To determine that for sure, we also wanted to use soil data to help predict how well a trail’s unique soil composition recovers after precipitation. Similar amounts of rain on trails of very different soil types could lead to vastly different trail conditions. A more clay-based soil would hold water much longer, and therefore be much more unfavorable, than loamy soil. Finding a reliable source for soil type and soil drainage proved incredibly difficult. After many hours, we finally found a source through the USDA that we could use. As a side note—the USDA keeps track of lots of data points on soil information that’s actually pretty interesting! We can’t say we’re soil experts but, we felt like we got pretty close. We used Whimsical to build our initial wireframes. Putting our design hats on. From the very first pitch for this app, TrailBuddy’s main differentiator to peer trail resources is its ability to surface real-time information, reliably, and simply. For as complicated as the technology needed to collect and interpret information, the front-end app design needed to be clean and unencumbered. We thought about how users would naturally look for information when setting out to find a trail and what factors they’d think about when doing so. We posed questions like: How easy or difficult of a trail are they looking for?How long is this trail?What does the trail look like?How far away is the trail in relation to my location?For what activity am I needing a trail for? Is this a trail I’d want to come back to in the future? By putting ourselves in our users’ shoes we quickly identified key features TrailBuddy needed to have to be relevant and useful. First, we needed filtering, so users could filter between difficulty and distance to narrow down their results to fit the activity level. Next, we needed a way to look up trails by activity type—mountain biking, hiking, and running are all types of activities REI’s MTB API tracks already so those made sense as a starting point. And lastly, we needed a way for the app to find trails based on your location; or at the very least the ability to find a trail within a certain distance of your current location. We used Figma to design, prototype, and gather feedback on TrailBuddy. Using machine learning to predict trail conditions. As stated earlier, none of us are actual soil or data scientists. So, in order to achieve the real-time conditions reporting TrailBuddy promised, we’d decided to leverage machine learning to make predictions for us. Digging into the utility of machine learning was a first for all of us on this team. Luckily, there was an excellent tutorial that laid out the basics of building an ML model in Python. Provided a CSV file with inputs in the left columns, and the desired output on the right, the script we generated was able to test out multiple different model strategies, and output the effectiveness of each in predicting results, shown below. We assembled all of the historical weather and soil data we could find for a given latitude/longitude coordinate, compiled a 1000 * 100 sized CSV, ran it through the Python evaluator, and found that the CART and SVM models consistently outranked the others in terms of predicting trail status. In other words, we found a working model for which to run our data through and get (hopefully) reliable predictions from. The next step was to figure out which data fields were actually critical in predicting the trail status. The more we could refine our data set, the faster and smarter our predictive model could become. We pulled in some Ruby code to take the original (and quite massive) CSV, and output smaller versions to test with. Now again, we’re no data scientists here but, we were able to cull out a good majority of the data and still get a model that performed at 95% accuracy. With our trained model in hand, we could serialize that to into a model.pkl file (pkl stands for “pickle”, as in we’ve “pickled” the model), move that file into our Rails app along with it a python script to deserialize it, pass in a dynamic set of data, and generate real-time predictions. At the end of the day, our model has a propensity to predict fantastic trail conditions (about 99% of the time in fact…). Just one of those optimistic machine learning models we guess. Where we go from here. It was clear that after two days, our team still wanted to do more. As a first refinement, we’d love to work more with our data set and ML model. Something that was quite surprising during the weekend was that we found we could remove all but two days worth of weather data, and all of the soil data we worked so hard to dig up, and still hit 95% accuracy. Which … doesn’t make a ton of sense. Perhaps the data we chose to predict trail conditions just isn’t a great empirical predictor of trail status. While these are questions too big to solve in just a single weekend, we'd love to spend more time digging into this in a future iteration. Full Article News & Culture
v A Viget Exploration: How Tech Can Help in a Pandemic By feedproxy.google.com Published On :: Wed, 25 Mar 2020 16:49:00 -0400 Viget Explorations have always been the result of our shared curiosities. They’re usually a spontaneous outcome of team downtime and a shared problem we’ve experienced. We use our Explorations to pursue our diverse interests and contribute to the conversations about building a better digital world. As the COVID-19 crisis emerged, we were certainly experiencing a shared problem. As a way to keep busy and manage our anxieties, a small team came together to dive into how technology has helped, and, unfortunately, hindered the community response to the current pandemic. Privia Medical Group Telehealth Native Apps We started by researching the challenges we saw: information overload, a lack of clarity, individual responsibility, and change. Then we brainstormed possible technical solutions that could further improve how communities respond to a pandemic. Click here to see our Exploration on some possible ways to take the panic out of pandemics. While we aren’t currently pursuing the solutions outlined in the Exploration, we’d love to hear what you think about these approaches, as well as any ideas you have for how technology can help address the outlined challenges. Please note, this Exploration doesn’t provide medical information. Visit the Center for Disease Control’s website for current information and COVID-19, its symptoms, and treatments. At Viget, we’re adjusting to this crisis for the safety of our clients, our staff, and our communities. If you’d like to hear from Viget's co-founder, Brian Williams, you can read his article on our response to the situation. Full Article News & Culture
v CLI Equivalents for Common MAMP PRO and Sequel Pro Tasks By feedproxy.google.com Published On :: Thu, 26 Mar 2020 00:00:00 -0400 Working on website front ends I sometimes use MAMP PRO to manage local hosts and Sequel Pro to manage databases. Living primarily in my text editor, a terminal, and a browser window, moving to these click-heavy dedicated apps can feel clunky. Happily, the tasks I have most frequently turned to those apps for —starting and stopping servers, creating new hosts, and importing, exporting, deleting, and creating databases— can be done from the command line. I still pull up MAMP PRO if I need to change a host's PHP version or work with its other more specialized settings, or Sequel Pro to quickly inspect a database, but for the most part I can stay on the keyboard and in my terminal. Here's how: Command Line MAMP PRO You can start and stop MAMP PRO's servers from the command line. You can even do this when the MAMP PRO desktop app isn't open. Note: MAMP PRO's menu icon will not change color to reflect the running/stopped status when the status is changed via the command line. Start the MAMP PRO servers: /Applications/MAMP PRO.app/Contents/MacOS/MAMP PRO cmd startServers Stop the MAMP PRO servers: /Applications/MAMP PRO.app/Contents/MacOS/MAMP PRO cmd stopServers Create a host (replace host_name and root_path): /Applications/MAMP PRO.app/Contents/MacOS/MAMP PRO cmd createHost host_name root_path MAMP PRO-friendly Command Line Sequel Pro Note: if you don't use MAMP PRO, just replace the /Applications/MAMP/Library/bin/mysql with mysql. In all of the following commands, replace username with your user name (locally this is likely root) and database_name with your database name. The -p (password) flag with no argument will trigger an interactive password prompt. This is more secure than including your password in the command itself (like -pYourPasswordHere). Of course, if you're using the default password root is not particular secure to begin with so you might just do -pYourPasswordHere. Setting the -h (host) flag to localhost or 127.0.0.1 tells mysql to look at what's on localhost. With the MAMP PRO servers running, that will be the MAMP PRO databases. # with the MAMP PRO servers running, these are equivalent: # /Applications/MAMP/Library/bin/mysql -h 127.0.0.1 other_options # and # /Applications/MAMP/Library/bin/mysql -h localhost other_options /Applications/MAMP/Library/bin/mysql mysql_options # enter. opens an interactive mysql session mysql> some command; # don't forget the semicolon mysql> exit; Create a local database # with the MAMP PRO servers running # replace `username` with your username, which is `root` by default /Applications/MAMP/Library/bin/mysql -h localhost -u username -p -e "create database database_name" or # with the MAMP PRO servers running # replace `username` (`root` by default) and `database_name` /Applications/MAMP/Library/bin/mysql -h localhost -u username -p # and then enter mysql> create database database_name; # don't forget the semicolon mysql> exit MAMP PRO's databases are stored in /Library/Application Support/appsolute/MAMP PRO/db so to confirm that it worked you can ls /Library/Application Support/appsolute/MAMP PRO/db # will output the available mysql versions. For example I have mysql56_2018-11-05_16-25-13 mysql57 # If it isn't clear which one you're after, open the main MAMP PRO and click # on the MySQL "servers and services" item. In my case it shows "Version: 5.7.26" # Now look in the relevant MySQL directory ls /Library/Application Support/appsolute/MAMP PRO/db/mysql57 # the newly created database should be in the list Delete a local database # with the MAMP PRO servers running # replace `username` (`root` by default) and `database_name` /Applications/MAMP/Library/bin/mysql -h localhost -u username -p -e "drop database database_name" Export a dump of a local database. Note that this uses mysqldump not mysql. # to export an uncompressed file # replace `username` (`root` by default) and `database_name` /Applications/MAMP/Library/bin/mysqldump -h localhost -u username -p database_name > the/output/path.sql # to export a compressed file # replace `username` (`root` by default) and `database_name` /Applications/MAMP/Library/bin/mysqldump -h localhost -u username -p database_name | gzip -c > the/output/path.gz Export a local dump from an external database over SSH. Note that this uses mysqldump not mysql. # replace `ssh-user`, `ssh_host`, `mysql_user`, `database_name`, and the output path # to end up with an uncompressed file ssh ssh_user@ssh_host "mysqldump -u mysql_user -p database_name | gzip -c" | gunzip > the/output/path.sql # to end up with a compressed file ssh ssh_user@ssh_host "mysqldump -u mysql_user -p database_name | gzip -c" > the/output/path.gz Import a local database dump into a local database # with the MAMP PRO servers running # replace `username` (`root` by default) and `database_name` /Applications/MAMP/Library/bin/mysql -h localhost -u username -p database_name < the/dump/path.sql Import a local database dump into a remote database over SSH. Use care with this one. But if you are doing it with Sequel Pro —maybe you are copying a Craft site's database from a production server to a QA server— you might as well be able to do it on the command line. ssh ssh_user@ssh_host "mysql -u username -p remote_database_name" < the/local/dump/path.sql For me, using the command line instead of the MAMP PRO and Sequel Pro GUI means less switching between keyboard and mouse, less opening up GUI features that aren't typically visible on my screen, and generally better DX. Give it a try! And while MAMP Pro's CLI is limited to the essentials, command line mysql of course knows no limits. If there's something else you use Sequel Pro for, you may be able to come up with a mysql CLI equivalent you like even better. Full Article Code Front-end Engineering Back-end Engineering
v Scurry: A Race-To-Finish Scavenger Hunt App By feedproxy.google.com Published On :: Thu, 26 Mar 2020 13:58:00 -0400 We have a lot of traditions here at Viget, many of which you may have read about - TTT, FLF, Pointless Weekend. There are others, but you have to be an insider for more information on those. Pointless Weekend is one of our favorite traditions, though. It’s been around over a decade and some pretty fun work has come out of it over the years, like Storyboard, Baby Bookie, and Short Order. At a high level, we take 48 hours to build a tool, experiment, or stunt as a team, across all four of our offices. These projects are entirely separate from our client work and we use them to try out new technologies, explore roles on the team, and stress-test our processes. The first step for a Pointless Weekend is assembling the teams. We had two teams this year, with a record number of participants. You can read about TrailBuddy, what the other team built, here. The Scurry team was split between the DC and Durham offices, so all meetings were held via Hangout. Once we were assembled, we set out to understand the constraints and the goals of our Pointless Project. We went into this weekend with an extra pep in our step, as we were determined to build something for the upcoming Viget 20th anniversary TTT this summer. Here’s what we knew we wanted: An activity all Vigets could do together, where they could create memories, and share broadly on socialSomething that we could use in a spotty network at C Lazy U Ranch in ColoradoA product we can share with others: corporate groups, families and friends, schools, bachelor/ette parties We landed on a scavenger hunt native app, which we named Scurry (Scavenger + Hurry = Scurry. Brilliant, right?). There are already a few scavenger apps available, so we set out to create something that was Quick and easy to set up huntsFree and intuitive for usersA nice combination of trivia and activitiesSocial! We wanted to enable teams to share photos and progress One of the main reasons we have Pointless Weekends is to test out new technologies and processes. In that vein, we tried out Notion as our central organizing tool - we used it for user journeys, data modeling, and even writing tickets, which we typically use Github for. We tested out Notion as our primary tool, writing tickets and tracking progress. When we built the app, we needed to prepare for spotty network service, as internet connectivity isn’t guaranteed at C Lazy U Ranch – where our Viget20 celebration will be. A Progressive Web Application (PWA) didn't make sense for our tech requirements, so we chose the route of creating a native application. There are a number of options available to build native applications. But, as we were looking to make as much progress as possible in 48-hours, we chose one of our favorite frameworks: React Native. React Native allows developers to build true, cross-platform native applications, using some of our favorite technologies: javascript, the React framework, and a native-specific variant of CSS. We decided on the turn-key solution Expo. Expo has extra tooling allowing for easy development, deployment, and debugging. This is a snap shot of our app and Expo. Our frontend developers were able to immediately dive in making screens and styling components, and quickly made the mockups in Whimsical a reality. On the backend, we used the supported library to connect to the backend datastore, Firebase. Firebase is a hosted solution for data storage, with key features built-in like authentication, realtime updates, and offline support. Our backend developer worked behind the frontend developers hooking those views up to live data. Both of these tools, Expo and Firebase, were easy to use and allowed us to focus on building a working application quickly, rather than being mired in setup or bespoke solutions to common problems. Whimsical is one of our favorite tools for building out mockups of an app. We made impressive progress in our 48-hour sprint, but there’s still some work to do. We have some additional features we hope to add before TTT, which will require additional testing and refining. For now, stay tuned and sign up for our newsletter. We’ll be sure to share when Scurry is ready for the world! Full Article News & Culture
v A Viget Glossary: What We Mean and Why it Matters - Part 1 By feedproxy.google.com Published On :: Tue, 21 Apr 2020 08:00:00 -0400 Viget has helped organizations design and develop award-winning websites and digital products for 20 years. In that time, we’ve been lucky to create long-term relationships with clients like Puma, the World Wildlife Fund, and Privia Health, and, throughout our time working together, we’ve come to understand each others’ unique terminology. But that isn’t always the case when we begin work with new clients, and in a constantly-evolving industry, we know that new terminology appears almost daily and organizations have unique definitions for deliverables and processes. Kicking off a project always initiates a flurry of activity. There are contracts to sign, team members to introduce, and new platforms to learn. It’s an exciting time, and we know clients are anxious to get underway. Amidst all the activity, though, there is a need to define and create a shared lexicon to ensure both teams understand the project deliverables and process that will take us from kickoff to launch. Below, we’ve rounded up a few terms for each of our disciplines that often require additional explanation. Note: our definitions of these terms may differ slightly from the industry standard, but highlight our interpretation and use of them on a daily basis. User ExperienceResearchIn UX, there is a proliferation of terms that are often used interchangeably and mean almost-but-subtly-not the same thing. Viget uses the term research to specifically mean user research — learning more about the users of our products, particularly how they think and behave — in order to make stronger recommendations and better designs. This can be accomplished through different methodologies, depending on the needs of the project, and can include moderated usability testing, stakeholder interviews, audience research, surveys, and more. Learn more about the subtleties of UX research vocabulary in our post on “Speaking the Same Language About Research”.WireframesWe use wireframes to show the priority and organization of content on the screen, to give a sense of what elements will get a stronger visual treatment, and to detail how users will get to other parts of the site. Wireframes are a key component of website design — think of them as the skeleton or blueprint of a page — but we know that clients often feel uninspired after reviewing pages built with gray boxes. In fact, we’ve even written about how to improve wireframe presentations. We remind clients that visual designers will step in later to add polish through color, graphics, and typography, but agreeing on the foundation of the page is an important and necessary first step. PrototypesDuring the design process, it’s helpful for us to show clients how certain pieces of functionality or animations will work once the site is developed. We can mimic interactivity or test a technical proof of concept by using a clickable prototype, relying on tools like Figma, Invision, or Principle. Our prototypes can be used to illustrate a concept to internal stakeholders, but shouldn’t be seen as a final approach. Often, these concepts will require additional work to prepare them for developer handoff, which means that prototypes quickly become outdated. Read more about how and when we use prototypes. Navigation Testing (Treejack Testing)Following an information architecture presentation, we will sometimes recommend that clients conduct navigation testing. When testing, we present a participant with the proposed navigation and ask them to perform specific tasks in order to see if they will be able to locate the information specified within the site’s new organization. These tests generally focus on two aspects of the navigation: the structure of the navigation system itself, and the language used within the system. Treejack is an online navigation testing tool that we like to employ when conducting navigation tests, so we’ll often interchange the terms “navigation testing” with “treejack testing”.Learn more about Viget’s approach to user experience and research. Full Article Strategy Process
v A Viget Glossary: What We Mean and Why It Matters - Part 2 By feedproxy.google.com Published On :: Tue, 28 Apr 2020 10:09:00 -0400 In my last post, I defined terms used by our UX team that are often confused or have multiple meanings across the industry. Today, I’ll share our definitions for processes and deliverables used by our design and strategy teams. Creative Brand Strategy In our experience, we’ve found that the term brand strategy is used to cover a myriad of processes, documents, and deliverables. To us, a brand strategy defines how an organization communicates who they are, what they do and why in a clear and compelling way. Over the years, we’ve developed an approach to brand strategy work that emphasizes rigorous research, hands-on collaboration, and the definition of problems and goals. We work with clients to align on a brand strategy concept and, depending on the client and their goals, our final deliverables can range to include strategy definition, audience-specific messaging, identity details, brand elements, applications, and more. Take a look at the brand strategy work we’ve done for Fiscalnote, Swiftdine, and Armstrong Tire. Content Strategy A content strategy goes far beyond the words on a website or in an app. A strong content strategy dictates the substance, structure, and governance of the information an organization uses to communicate to its audience. It guides creating, organizing, and maintaining content so that companies can communicate who they are, what they do, and why efficiently and effectively. We’ve worked with organizations like the Washington Speakers Bureau, The Nature Conservancy, the NFL Players Association, and the Wildlife Conservation Society to refine and enhance their content strategies. Still confused about the difference between brand and content strategy? Check out our flowchart. Style Guide vs. Brand Guidelines We often find the depth or fidelity of brand guidelines and style guides can vary greatly, and the terms can often be confused. When we create brand guidelines, they tend to be large documents that include in-depth recommendations about how a company should communicate their brand. Sections like “promise”, “vision”, “mission”, “values”, “tone”, etc. accompany details about how the brand’s logo, colors and fonts should be used in a variety of scenarios. Style guides, on the other hand, are typically pared down documents that contain specific guidance for organizations’ logos, colors and fonts, and don’t always include usage examples. Design System One question we get from clients often during a redesign or rebrand is, “How can I make sure people across my organization are adhering to our new designs?” This is where a design system comes into play. Design systems can range from the basic — e.g., a systematic approach to creating shared components for a single website — all the way to the complex —e.g., architecting a cross-product design system that can scale to accommodate hundreds of different products within a company. By assembling elements like color, typography, imagery, messaging, voice and tone, and interaction patterns in a central repository, organizations are able to scale products and marketing confidently and efficiently. When a design system is translated into code, we refer to that as a parts kit, which helps enforce consistency and improve workflow. Comps or Mocks When reviewing RFPs or going through the nitty-gritty of contracts with clients, we often see the terms mocks or comps used interchangeably to refer to the static design of pages or screens. Internally, we think of a mock-up as a static image file that illustrates proof-of-concept, just a step beyond a wireframe. A comp represents a design that is “high fidelity” and closer to what the final website will look like, though importantly, is not an exact replica. This is likely what clients will share with internal stakeholders to get approval on the website direction and what our front-end developers will use to begin building-out the site (in other words, converting the static design files into dynamic HTML, CSS, and JavaScript code). If you're interested in joining our team of creative thinkers and visual storytellers who bring these concepts to life for our clients, we’re hiring in Washington, D.C. Durham, Boulder and Chattanooga. Tune in next week as we decipher the terms we use most often when talking about development. Full Article Strategy Process
v Unsolved Zoom Mysteries: Why We Have to Say “You’re Muted” So Much By feedproxy.google.com Published On :: Wed, 29 Apr 2020 09:36:00 -0400 Video conference tools are an indispensable part of the Plague Times. Google Meet, Microsoft Teams, Zoom, and their compatriots are keeping us close and connected in a physically distanced world. As tech-savvy folks with years of cross-office collaboration, we’ve laughed at the sketches and memes about vidconf mishaps. We practice good Zoomiquette, including muting ourselves when we’re not talking. Yet even we can’t escape one vidconf pitfall. (There but for the grace of Zoom go I.) On nearly every vidconf, someone starts to talk, and then someone else says: “Oop, you’re muted.” And, inevitably: “Oop, you’re still muted.” That’s right: we’re trying to follow Zoomiquette by muting, but then we forget or struggle to unmute when we do want to talk. In this post, I’ll share my theories for why the You’re Muted Problems are so pervasive, using Google Meet, Microsoft Teams, and Zoom as examples. Spoiler alert: While I hope this will help you be more mindful of the problem, I can’t offer a good solution. It still happens to me. All. The. Time. Skip the why and go straight to the vidconf app keyboard shortcuts you should memorize right now. Why we don't realize we’re muted before talking Why does this keep happening?!? Simply put: UX and design decisions make it harder to remember that you’re muted before you start to talk. Here’s a common scenario: You haven’t talked for a bit, so you haven’t interacted with the Zoom screen for a few seconds. Then you start to talk — and that’s when someone tells you, “You’re muted.” We forget so easily in these scenarios because when our mouse has been idle for a few seconds, the apps hide or downplay the UI elements that tell us we’re muted. Zoom and Teams are the worst offenders: Zoom hides both the toolbar with the main in-app controls (the big mute button) and the mute status indicator on your video pane thumbnail.Teams hides the toolbar, and doesn't show a mute status indicator on your video thumbnail in the first place. Meet is only slightly better: Meet hides the toolbar, and shows only a small mute status icon in your video thumbnail. Even when our mouse is active, the apps’ subtle approach to muted state UI can make it easy to forget that we’re muted: Teams is the worst offender: The mute button is an icon rather than words.The muted-state icon's styling could be confused with unmuted state: Teams does not follow the common pattern of using red to denote muted state.The mute button is not differentiated in visual hierarchy from all the other controls.As mentioned above, Teams never shows a secondary mute status indicator. Zoom is a bit better, but still makes it pretty easy to forget that you’re muted: Pros:Zoom is the only app to use words on the mute button, in this case to denote the button action (rather than the muted state).The muted-state icon’s styling (red line) is less likely to be confused with the unmuted-state icon.Cons:The mute button’s placement (bottom left corner of the page) is easy to overlook.The mute button is not differentiated in visual hierarchy from the other toolbar buttons — and Zoom has a lot of toolbar buttons, especially when logged in as host.The secondary mute status indicator is a small icon.The mute button’s muted-state icon is styled slightly differently from the secondary mute status indicator. Potential Cons:While words denote the button action, only an icon denotes the muted state. Meet is probably the clearest of the three apps, but still has pitfalls: Pros:The mute button is visually prominent in the UI: It’s clearly differentiated in the visual hierarchy relative to other controls (styled as a primary button); is a large button; and is placed closer to the center of the controls bar.The muted-state icon’s styling (red fill) is less likely to be confused with the unmuted-state icon.Cons:Uses only an icon rather than words to denote the muted state.Unrelated Con:While the mute button is visually prominent, it’s also placed next to the hang-up button. So in Meet’s active state you might be less likely to forget you’re muted … but more likely to accidentally hang up when trying to unmute. 😬 I know modern app design leans toward minimalism. There’s often good rationale to use icons rather than words, or to de-emphasize controls and indicators when not in use. But again: This happens on basically every call! Often multiple times per call!! And we’re supposed to be tech-savvy!!! Imagine what it’s like for the tens of millions of vidconf newbs. I would argue that “knowing your muted state” has turned out to be a major vidconf user need. At this point, it’s certainly worth rethinking UX patterns for. Why we keep unsuccessfully unmuting once we realize we’re muted So we can blame the You’re Muted Problem on UX and design. But what causes the You’re Still Muted Problem? Once we know we’re muted, why do we sometimes fail to unmute before talking again? This one is more complicated — and definitely more speculative. To start making sense of this scenario, here’s the sequence I’m guessing most commonly plays out (I did this a couple times before I became aware of it): The crucial part is when the person tries to unmute by pressing the keyboard Volume On/Off key. If that’s in fact what’s happening (again, this is just a hypothesis), I’m guessing they did that because when someone says “You’re muted” or “I can’t hear you,” our subconscious thought process is: “Oh, Audio is Off. Press the keyboard key that I usually press when I want to change Audio Off to Audio On.” There are two traps in this reflexive thought process: First, the keyboard volume keys control the speaker volume, not the microphone volume. (More specifically, they control the system sound output settings, rather than the system sound input settings or the vidconf app’s sound input settings.)In fact, there isn’t a keyboard key to control the microphone volume. You can’t unmute your mic via a dedicated keyboard key, the way that you can turn the speaker volume on/off via a keyboard key while watching a movie or listening to music. Second, I think we reflexively press the keyboard key anyway because our mental model of the keyboard audio keys is just: Audio. Not microphone vs. speaker. This fuzzy mental model makes sense: There’s only one set of keyboard keys related to audio, so why would I think to distinguish between microphone and speaker? So my best guess is hardware design causes the You’re Still Muted Problem. After all, keyboard designs are from a pre-Zoom era, when the average person rarely used the computer’s microphone.If that is the cause, one potential solution is for hardware manufacturers to start including dedicated keys to control microphone volume: Video conference keyboard shortcuts you should memorize right now Let me know if you have other theories for the You’re Still Muted Problem! In the meantime, the best alternative is to learn all of the vidconf app keyboard shortcuts for muting/unmuting: MeetMac: Command(⌘) + DWindows: Control + DTeamsMac: Command(⌘) + Shift + MWindows: Ctrl + Shift + MZoomMac: Command(⌘) + Shift + AWindows: Alt + AHold Spacebar: Temporarily unmute Other vidconf apps not included in my analysis: Cisco Webex MeetingsMac: Ctrl + Alt + MWindows: Ctrl + Shift + M GoToMeeting Mac: No keyboard shortcut? Windows: Ctrl + Alt + A Bonus protip from Jackson Fox: If you use multiple vidconf apps, pick a keyboard shortcut that you like and manually change each app’s mute/unmute shortcut to that. Then you only have to remember one shortcut! Full Article Process User Experience
v So You've Written a Bad Design Take By feedproxy.google.com Published On :: Tue, 05 May 2020 08:00:00 -0400 So you’ve just written a blog post or tweet about why wireframes are becoming obsolete, the dangers of “too accessible” design, or how a certain style of icon creates “cognitive fatigue.” Your post went viral, but now you’re getting ratioed by rude people on the Internet. That sucks! You were just trying to start a conversation and you probably didn’t deserve all that negativity (except for you, “too accessible” guy). Most likely, you made one of these common mistakes: 1. You made generalizations about “design” You, a good user-centered designer, know that you are not your user. Nor are you every designer. First of all, let's acknowledge that there is no universal definition of design. Even if we narrow it down to software design, it’s still hard to make generalizations. Agency, in-house, product, startup, enterprise, non-profit, website, app, connected hardware, etc. – there are a lot of different work contexts and cultures for people with “designer” in their titles. "The Design Industry" is not a thing, but even if it were, you don't speak for it. Don’t assume that the kind of design work you do is the universal default. 2. You didn’t share enough context There are many great design books and few great design blog posts. (There are, to my knowledge, no great design tweets, but I am open to your suggestions.) Writing about design is not well suited to short formats, because context plays such an important role and there’s always a lot of it to cover. Writing about your work should include as much context as you would include if you were presenting your portfolio for a job interview. What kind of organization did you work for? Who was your client and/or your stakeholders? What was the goal of the project? Your timeline? What was the makeup of your team? What were the notable business rules and constraints? How are you defining effectiveness and success? Without these kinds of details, it’s not possible for other designers to know if what you’ve written is credible or applicable to them. 3. You were too certain A blog post doesn’t need to be a dissertation. It’s okay to share hunches and anecdotes, but give the necessary caveats. And if you're making claims about science, bruh, you gotta cite your sources. Be humble in your takes. Your account of what worked for you and why is more valuable to your peers than making sweeping claims and reheating the same old arguments. Be prepared to be told you’re wrong, and have the humility to realize that your perspective is just your perspective. Real conversations, like good design, are built on feedback and diverse viewpoints. — Together, we can improve the discourse in our information ecosystems. Don't generalize. Give context. Be humble. Full Article Design & Content User Experience
v Freebie: 264 Vector Audio DJ Pack Icons By feedproxy.google.com Published On :: Thu, 28 Dec 2017 16:58:29 +0000 Icons packs are among the most desirable freebies around. There are several out there, going from a wide array of topics from user interfaces to personal finance. But sometimes you can find some rather unusual but clever additions to the icons universe. This Vector Audio DJ Pack is a nice example, brought to you exclusively … Freebie: 264 Vector Audio DJ Pack Icons Read More » Full Article Freebies
v 240 Basic Icons Vector Freebie By feedproxy.google.com Published On :: Sat, 30 Dec 2017 19:53:50 +0000 Flat design is everywhere. Nowadays aesthetics is a lot more simple. No more glossy buttons or gradients background, or what a about the shiny table effect every client asked for?.It is all gone now. In favor of a more “undesigned” look a back to basics trend. Following that idea the guys at your favorite resources … 240 Basic Icons Vector Freebie Read More » Full Article Freebies
v Wix Video — a great marketing tool for any website. By feedproxy.google.com Published On :: Wed, 17 Jan 2018 19:40:09 +0000 Increases time on page and boosts engagement with your site Thanks to the ever-increasing internet speeds, videos are in high demand. Right now, video is everywhere on social media, websites, and apps. We are watching them on all our screens, desktops, tablets, phones and smart TVs. It is expected a growth in video content up … Wix Video — a great marketing tool for any website. Read More » Full Article Reference
v Five Aspects of a Successful Blog Post By feedproxy.google.com Published On :: Tue, 06 Feb 2018 14:34:13 +0000 It’s 2018, and traditional marketing concept has shifted. We often hear that content marketing is taking the top and is the future of marketing. While content marketing doesn’t only mean blogging, blog posts on a product, service or about your business, should be a big part of your content marketing strategy. There are vast amounts … Five Aspects of a Successful Blog Post Read More » Full Article Reference
v Leaving Lightroom behind By feedproxy.google.com Published On :: Thu, 28 Dec 2017 13:08:27 +0000 As I stated in my Best of 2017 post, I didn’t get to take many photos this year – which also multiple times throughout the year made me think: why am I paying so much money for Lightroom for how […] Full Article Processing Software Thoughts
v Why Collaborative Coding Is The Ultimate Career Hack By feedproxy.google.com Published On :: Fri, 24 Apr 2020 10:30:00 +0000 Taking your first steps in programming is like picking up a foreign language. At first, the syntax makes no sense, the vocabulary is unfamiliar, and everything looks and sounds unintelligible. If you’re anything like me when I started, fluency feels impossible. I promise it isn’t. When I began coding, the learning curve hit me — hard. I spent ten months teaching myself the basics while trying to stave off feelings of self-doubt that I now recognize as imposter syndrome. Full Article
v Mirage JS Deep Dive: Understanding Mirage JS Models And Associations (Part 1) By feedproxy.google.com Published On :: Thu, 30 Apr 2020 09:30:00 +0000 Mirage JS is helping simplify modern front-end development by providing the ability for front-end engineers to craft applications without relying on an actual back-end service. In this article, I’ll be taking a framework-agnostic approach to show you Mirage JS models and associations. If you haven’t heard of Mirage JS, you can read my previous article in which I introduce it and also integrate it with the progressive framework Vue.js. Full Article
v Meet SmashingConf Live: Our New Interactive Online Conference By feedproxy.google.com Published On :: Tue, 05 May 2020 12:50:00 +0000 In these strange times when everything is connected, it’s too easy to feel lonely and detached. Yes, everybody is just one message away, but there is always something in the way — deadlines to meet, Slack messages to reply, or urgent PRs to review. Connections need time and space to grow, just like learning, and conferences are a great way to find that time and that space. In fact, with SmashingConfs, we’ve always been trying to create such friendly and inclusive spaces. Full Article
v How To Build A Vue Survey App Using Firebase Authentication And Database By feedproxy.google.com Published On :: Fri, 08 May 2020 11:00:00 +0000 In this tutorial, you’ll be building a Survey App, where we’ll learn to validate our users form data, implement Authentication in Vue, and be able to receive survey data using Vue and Firebase (a BaaS platform). As we build this app, we’ll be learning how to handle form validation for different kinds of data, including reaching out to the backend to check if an email is already taken, even before the user submits the form during sign up. Full Article
v #COVIDwear: a hilarious photo series showing quarantine fashion of remote workers By feedproxy.google.com Published On :: Fri, 08 May 2020 12:04:34 +0000 With the coronavirus pandemic, many folks switched to working online. Things like teaching, business meetings and other face-to-face activities have been replaced with video calls. Home has become both home and workplace, and admit it: your wardrobe totally reflects this. Creative duo The Workmans shows this “fashion crossover” in their latest photo series #COVIDwear. The […] The post #COVIDwear: a hilarious photo series showing quarantine fashion of remote workers appeared first on DIY Photography. Full Article Inspiration Alex Workman Chelsea Workman Coronavirus COVID-19 funny portraits quarantine self-isolation The Workmans
v Quand la moitié du centre-ville disparaît dans la brume By feedproxy.google.com Published On :: Wed, 04 Mar 2020 04:05:48 +0000 Rimouski, Bas-St-Laurent, Québec Full Article Hiver Paysage Rimouski brume hiver rimouski
v C’était le calme avant la tempête… By feedproxy.google.com Published On :: Fri, 13 Mar 2020 20:44:36 +0000 St-Donat, Bas-St-Laurent, Québec Full Article aérienne Hiver Paysage St-Donat hiver rural village
v Ça va bien aller! By feedproxy.google.com Published On :: Tue, 24 Mar 2020 23:40:30 +0000 St-Donat, Bas-St-Laurent, Québec Full Article aérienne Paysage Printemps St-Donat printemps rural village
v Le village de St-Donat au coucher de soleil By feedproxy.google.com Published On :: Sun, 05 Apr 2020 22:47:50 +0000 St-Donat, Bas-St-Laurent, Québec Full Article aérienne Paysage Printemps St-Donat printemps riviere village
v Après les nuages, on retrouve toujours la lumière By feedproxy.google.com Published On :: Tue, 07 Apr 2020 22:39:57 +0000 St-Donat, Bas-St-Laurent, Québec Full Article aérienne Paysage St-Donat campagne lumière rural
v Un lac éphémère au village By feedproxy.google.com Published On :: Tue, 14 Apr 2020 14:08:44 +0000 St-Donat, Bas-St-Laurent, Québec Full Article aérienne Paysage Printemps St-Donat fonte printemps village
v En route vers St-Donat By feedproxy.google.com Published On :: Tue, 21 Apr 2020 22:42:23 +0000 St-Donat, Bas-St-Laurent, Québec Full Article aérienne Paysage Printemps St-Donat printemps route rural
v La vallée de la Neigette By feedproxy.google.com Published On :: Mon, 27 Apr 2020 22:00:06 +0000 St-Donat, Bas-St-Laurent, Québec Full Article aérienne Paysage Printemps St-Donat calme printemps vallée
v eagereyesTV Episode 2: Unit Charts, Dot Plots, ISOTYPE, and What Makes Them Special By eagereyes.org Published On :: Wed, 09 Oct 2019 07:17:21 +0000 Charts usually show values as visual properties, like the length in a bar chart, the location in a scatterplot, the area in a bubble chart, etc. Unit charts show values as multiples instead. One famous example of these charts is called ISOTYPE, and you may have seen them in information graphics as well. They’re an […] Full Article Blog 2019 eagereyesTV
v Paper: Evidence for Area as the Primary Visual Cue in Pie Charts By eagereyes.org Published On :: Thu, 17 Oct 2019 15:52:12 +0000 How we read pie charts is still an open question: is it angle? Is it area? Is it arc length? In a study I'm presenting as a short paper at the IEEE VIS conference in Vancouver next week, I tried to tease the visual cues apart – using modeling and 3D pie charts. The big […] Full Article Blog 2019 paper pie charts
v eagereyesTV Episode 3: 3D Pie Charts For Science! By eagereyes.org Published On :: Mon, 21 Oct 2019 06:00:03 +0000 How do we read pie charts? This seems like a straightforward question to answer, but it turns out that most of what you’ve probably heard is wrong. We don’t actually know whether we use angle, area, or arc length. In a short paper at the VIS conference this week I’m presenting a study I ran […] Full Article Blog 2019 eagereyesTV pie charts
v Prolific, the (Much Better) Mechnical Turk Alternative By eagereyes.org Published On :: Tue, 05 Nov 2019 07:17:08 +0000 Prolific is a crowd-sourcing platform for running studies. In contrast to the widely-used Mechanical Turk, it’s specific to studies, has a much better interface, pricing that’s fair to participants, and useful filters to find the right people for your study. Amazon's Mechanical Turk is used for many empirical studies published in the visualization literature, but […] Full Article Blog 2019
v eagereyesTV: What is Data? Part 1, File Formats and Intent By eagereyes.org Published On :: Wed, 06 Nov 2019 16:07:40 +0000 We all use data all the time, but what exactly is data? How do different programs know what to do with our data? How is visualizing data different from other uses of data? And isn’t everything inside a computer data in the end? The latest episode of eagereyesTV looks at what data is and what […] Full Article Blog 2019 data eagereyesTV
v Review: Alberto Cairo, How Charts Lie By eagereyes.org Published On :: Tue, 12 Nov 2019 05:07:05 +0000 Alberto Cairo’s new book, How Charts Lie, takes readers on a tour of how charts are used and misused, and teaches them how to not be misled. It’s a useful book for both makers and consumers of charts, in the news, business, and pretty much anywhere else. When Alberto started talking about the title on […] Full Article Blog 2019 Book Reviews
v eagereyesTV: What Is Data? Part 2, Are Images Data? By eagereyes.org Published On :: Mon, 16 Dec 2019 13:01:25 +0000 Visualization turns data into images, but are images themselves data? There are often claims that they are, but then you mostly see the images themselves without much additional data. In this video, I look at image browsers, a project classifying selfies along a number of criteria, and the additional information stored in HEIC that makes […] Full Article eagereyesTV
v The Visual Evolution of the “Flattening the Curve” Information Graphic By eagereyes.org Published On :: Mon, 16 Mar 2020 04:10:24 +0000 Communication has been quite a challenge during the COVID-19 pandemic, and data visualization hasn't been the most helpful given the low quality of the data – see Amanda Makulec's plea to think harder about making another coronavirus chart. A great example of how to do things right is the widely-circulated Flatten the Curve information graphic/cartoon. […] Full Article Blog 2020 COVID-19 Visual Communication
v Non-associative Frobenius algebras for simply laced Chevalley groups. (arXiv:2005.02625v1 [math.RA] CROSS LISTED) By arxiv.org Published On :: We provide an explicit construction for a class of commutative, non-associative algebras for each of the simple Chevalley groups of simply laced type. Moreover, we equip these algebras with an associating bilinear form, which turns them into Frobenius algebras. This class includes a 3876-dimensional algebra on which the Chevalley group of type E8 acts by automorphisms. We also prove that these algebras admit the structure of (axial) decomposition algebras. Full Article
v The entropy of holomorphic correspondences: exact computations and rational semigroups. (arXiv:2004.13691v1 [math.DS] CROSS LISTED) By arxiv.org Published On :: We study two notions of topological entropy of correspondences introduced by Friedland and Dinh-Sibony. Upper bounds are known for both. We identify a class of holomorphic correspondences whose entropy in the sense of Dinh-Sibony equals the known upper bound. This provides an exact computation of the entropy for rational semigroups. We also explore a connection between these two notions of entropy. Full Article
v Regular Tur'an numbers of complete bipartite graphs. (arXiv:2005.02907v2 [math.CO] UPDATED) By arxiv.org Published On :: Let $mathrm{rex}(n, F)$ denote the maximum number of edges in an $n$-vertex graph that is regular and does not contain $F$ as a subgraph. We give lower bounds on $mathrm{rex}(n, F)$, that are best possible up to a constant factor, when $F$ is one of $C_4$, $K_{2,t}$, $K_{3,3}$ or $K_{s,t}$ when $t>s!$. Full Article
v A Marstrand type slicing theorem for subsets of $mathbb{Z}^2 subset mathbb{R}^2$ with the mass dimension. (arXiv:2005.02813v2 [math.CO] UPDATED) By arxiv.org Published On :: We prove a Marstrand type slicing theorem for the subsets of the integer square lattice. This problem is the dual of the corresponding projection theorem, which was considered by Glasscock, and Lima and Moreira, with the mass and counting dimensions applied to subsets of $mathbb{Z}^{d}$. In this paper, more generally we deal with a subset of the plane that is $1$ separated, and the result for subsets of the integer lattice follow as a special case. We show that the natural slicing question in this setting is true with the mass dimension. Full Article
v On the affine Hecke category. (arXiv:2005.02647v2 [math.RT] UPDATED) By arxiv.org Published On :: We give a complete (and surprisingly simple) description of the affine Hecke category for $ ilde{A}_2$ in characteristic zero. More precisely, we calculate the Kazhdan-Lusztig polynomials, give a recursive formula for the projectors defining indecomposable objects and, for each coefficient of a Kazhdan-Lusztig polynomial, we produce a set of morphisms with such a cardinality. Full Article
v On the finiteness of ample models. (arXiv:2005.02613v2 [math.AG] UPDATED) By arxiv.org Published On :: In this paper, we generalize the finiteness of models theorem in [BCHM06] to Kawamata log terminal pairs with fixed Kodaira dimension. As a consequence, we prove that a Kawamata log terminal pair with $mathbb{R}-$boundary has a canonical model, and can be approximated by log pairs with $mathbb{Q}-$boundary and the same canonical model. Full Article
v Arthur packets for $G_2$ and perverse sheaves on cubics. (arXiv:2005.02438v2 [math.RT] UPDATED) By arxiv.org Published On :: This paper begins the project of defining Arthur packets of all unipotent representations for the $p$-adic exceptional group $G_2$. Here we treat the most interesting case by defining and computing Arthur packets with component group $S_3$. We also show that the distributions attached to these packets are stable, subject to a hypothesis. This is done using a self-contained microlocal analysis of simple equivariant perverse sheaves on the moduli space of homogeneous cubics in two variables. In forthcoming work we will treat the remaining unipotent representations and their endoscopic classification and strengthen our result on stability. Full Article
v Solutions for nonlinear Fokker-Planck equations with measures as initial data and McKean-Vlasov equations. (arXiv:2005.02311v2 [math.AP] UPDATED) By arxiv.org Published On :: One proves the existence and uniqueness of a generalized (mild) solution for the nonlinear Fokker--Planck equation (FPE) egin{align*} &u_t-Delta (eta(u))+{mathrm{ div}}(D(x)b(u)u)=0, quad tgeq0, xinmathbb{R}^d, d e2, \ &u(0,cdot)=u_0,mbox{in }mathbb{R}^d, end{align*} where $u_0in L^1(mathbb{R}^d)$, $etain C^2(mathbb{R})$ is a nondecreasing function, $bin C^1$, bounded, $bgeq 0$, $Din(L^2cap L^infty)(mathbb{R}^d;mathbb{R}^d)$ with ${ m div}, Din L^infty(mathbb{R}^d)$, and ${ m div},Dgeq0$, $eta$ strictly increasing, if $b$ is not constant. Moreover, $t o u(t,u_0)$ is a semigroup of contractions in $L^1(mathbb{R}^d)$, which leaves invariant the set of probability density functions in $mathbb{R}^d$. If ${ m div},Dgeq0$, $eta'(r)geq a|r|^{alpha-1}$, and $|eta(r)|leq C r^alpha$, $alphageq1,$ $alpha>frac{d-2}d$, $dgeq3$, then $|u(t)|_{L^infty}le Ct^{-frac d{d+(alpha-1)d}} |u_0|^{frac2{2+(m-1)d}},$ $t>0$, and the existence extends to initial data $u_0$ in the space $mathcal{M}_b$ of bounded measures in $mathbb{R}^d$. The solution map $mumapsto S(t)mu$, $tgeq0$, is a Lipschitz contractions on $mathcal{M}_b$ and weakly continuous in $tin[0,infty)$. As a consequence for arbitrary initial laws, we obtain weak solutions to a class of McKean-Vlasov SDEs with coefficients which have singular dependence on the time marginal laws. Full Article
v Almost invariant subspaces of the shift operator on vector-valued Hardy spaces. (arXiv:2005.02243v2 [math.FA] UPDATED) By arxiv.org Published On :: In this article, we characterize nearly invariant subspaces of finite defect for the backward shift operator acting on the vector-valued Hardy space which is a vectorial generalization of a result of Chalendar-Gallardo-Partington (C-G-P). Using this characterization of nearly invariant subspace under the backward shift we completely describe the almost invariant subspaces for the shift and its adjoint acting on the vector valued Hardy space. Full Article
v Cameron-Liebler sets in Hamming graphs. (arXiv:2005.02227v2 [math.CO] UPDATED) By arxiv.org Published On :: In this paper, we discuss Cameron-Liebler sets in Hamming graphs, obtain several equivalent definitions and present all classification results. Full Article
v Some Quot schemes in tilted hearts and moduli spaces of stable pairs. (arXiv:2005.02202v2 [math.AG] UPDATED) By arxiv.org Published On :: For a smooth projective variety $X$, we study analogs of Quot functors in hearts of non-standard $t$-structures of $D^b(mathrm{Coh}(X))$. The technical framework is that of families of $t$-structures, as studied in arXiv:1902.08184. We provide several examples and suggest possible directions of further investigation, as we reinterpret moduli spaces of stable pairs, in the sense of Thaddeus (arXiv:alg-geom/9210007) and Huybrechts-Lehn (arXiv:alg-geom/9211001), as instances of Quot schemes. Full Article
v Nonlinear singular problems with indefinite potential term. (arXiv:2005.01789v3 [math.AP] UPDATED) By arxiv.org Published On :: We consider a nonlinear Dirichlet problem driven by a nonhomogeneous differential operator plus an indefinite potential. In the reaction we have the competing effects of a singular term and of concave and convex nonlinearities. In this paper the concave term is parametric. We prove a bifurcation-type theorem describing the changes in the set of positive solutions as the positive parameter $lambda$ varies. This work continues our research published in arXiv:2004.12583, where $xi equiv 0 $ and in the reaction the parametric term is the singular one. Full Article
v Entropy and Emergence of Topological Dynamical Systems. (arXiv:2005.01548v2 [math.DS] UPDATED) By arxiv.org Published On :: A topological dynamical system $(X,f)$ induces two natural systems, one is on the probability measure spaces and other one is on the hyperspace. We introduce a concept for these two spaces, which is called entropy order, and prove that it coincides with topological entropy of $(X,f)$. We also consider the entropy order of an invariant measure and a variational principle is established. Full Article
v Resonances as Viscosity Limits for Exponentially Decaying Potentials. (arXiv:2005.01257v2 [math.SP] UPDATED) By arxiv.org Published On :: We show that the complex absorbing potential (CAP) method for computing scattering resonances applies to the case of exponentially decaying potentials. That means that the eigenvalues of $-Delta + V - iepsilon x^2$, $|V(x)|leq e^{-2gamma |x|}$ converge, as $ epsilon o 0+ $, to the poles of the meromorphic continuation of $ ( -Delta + V -lambda^2 )^{-1} $ uniformly on compact subsets of $ extrm{Re},lambda>0$, $ extrm{Im},lambda>-gamma$, $arglambda > pi/8$. Full Article